@decaf-ts/ui-decorators 0.20.7 → 0.20.9
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/ui-decorators.cjs +2 -1059
- package/dist/ui-decorators.cjs.map +1 -0
- package/dist/ui-decorators.js +2 -1090
- package/dist/ui-decorators.js.map +1 -0
- package/lib/cjs/dashboard/constants.cjs +2 -2
- package/lib/cjs/dashboard/constants.cjs.map +1 -0
- package/lib/cjs/dashboard/decorators.cjs +2 -2
- package/lib/cjs/dashboard/decorators.cjs.map +1 -0
- package/lib/cjs/dashboard/index.cjs +2 -2
- package/lib/cjs/dashboard/index.cjs.map +1 -0
- package/lib/cjs/dashboard/reader.cjs +2 -2
- package/lib/cjs/dashboard/reader.cjs.map +1 -0
- package/lib/cjs/dashboard/registry.cjs +2 -2
- package/lib/cjs/dashboard/registry.cjs.map +1 -0
- package/lib/cjs/dashboard/types.cjs +2 -2
- package/lib/cjs/dashboard/types.cjs.map +1 -0
- package/lib/cjs/graph/GraphExecutionStateMapper.cjs +2 -2
- package/lib/cjs/graph/GraphExecutionStateMapper.cjs.map +1 -0
- package/lib/cjs/graph/GraphResolution.cjs +2 -2
- package/lib/cjs/graph/GraphResolution.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphConnectionPolicy.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphConnectionPolicy.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphCredentialReference.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphCredentialReference.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphCredentialRequirement.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphCredentialRequirement.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphDynamicPortRule.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphDynamicPortRule.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphIconReference.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphIconReference.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphManifestCompiler.cjs +11 -2
- package/lib/cjs/graph/catalog/GraphManifestCompiler.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeCapability.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeCapability.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeDisplayManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeDisplayManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeManifestSerialization.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeManifestSerialization.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodeMethodManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodeMethodManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphNodePolicyManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphNodePolicyManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphParameterBase.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphParameterBase.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphParameterDefinition.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphParameterDefinition.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphParameterOption.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphParameterOption.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphParameterValidation.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphParameterValidation.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphPortManifest.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphPortManifest.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphResourceLocatorMode.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphResourceLocatorMode.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphValueSchema.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphValueSchema.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphValueSchemaDerivation.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphValueSchemaDerivation.cjs.map +1 -0
- package/lib/cjs/graph/catalog/GraphVisibilityExpression.cjs +2 -2
- package/lib/cjs/graph/catalog/GraphVisibilityExpression.cjs.map +1 -0
- package/lib/cjs/graph/catalog/index.cjs +2 -2
- package/lib/cjs/graph/catalog/index.cjs.map +1 -0
- package/lib/cjs/graph/constants.cjs +76 -11
- package/lib/cjs/graph/constants.cjs.map +1 -0
- package/lib/cjs/graph/decorators.cjs +2 -2
- package/lib/cjs/graph/decorators.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphDecoratedWorkflowCompiler.cjs +2 -2
- package/lib/cjs/graph/document/GraphDecoratedWorkflowCompiler.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphEdgeInstance.cjs +2 -2
- package/lib/cjs/graph/document/GraphEdgeInstance.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphEndpoint.cjs +2 -2
- package/lib/cjs/graph/document/GraphEndpoint.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphJsonValue.cjs +2 -2
- package/lib/cjs/graph/document/GraphJsonValue.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphLoopConfiguration.cjs +2 -2
- package/lib/cjs/graph/document/GraphLoopConfiguration.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphNodeBinding.cjs +2 -2
- package/lib/cjs/graph/document/GraphNodeBinding.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphNodeInstance.cjs +2 -2
- package/lib/cjs/graph/document/GraphNodeInstance.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowDocument.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowDocument.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowDocumentBuilder.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowDocumentBuilder.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowDocumentReader.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowDocumentReader.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowDocumentSerializer.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowDocumentSerializer.cjs.map +1 -0
- package/lib/cjs/graph/document/GraphWorkflowUiState.cjs +2 -2
- package/lib/cjs/graph/document/GraphWorkflowUiState.cjs.map +1 -0
- package/lib/cjs/graph/document/index.cjs +2 -2
- package/lib/cjs/graph/document/index.cjs.map +1 -0
- package/lib/cjs/graph/index.cjs +2 -2
- package/lib/cjs/graph/index.cjs.map +1 -0
- package/lib/cjs/graph/nodes/agents/agent.cjs +2 -2
- package/lib/cjs/graph/nodes/agents/agent.cjs.map +1 -0
- package/lib/cjs/graph/nodes/base.cjs +2 -2
- package/lib/cjs/graph/nodes/base.cjs.map +1 -0
- package/lib/cjs/graph/nodes/boundary/input-value.cjs +2 -2
- package/lib/cjs/graph/nodes/boundary/input-value.cjs.map +1 -0
- package/lib/cjs/graph/nodes/category-styles.cjs +2 -2
- package/lib/cjs/graph/nodes/category-styles.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/break.cjs +3 -3
- package/lib/cjs/graph/nodes/flow-control/break.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/error-boundary.cjs +3 -3
- package/lib/cjs/graph/nodes/flow-control/error-boundary.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/human-approval.cjs +3 -3
- package/lib/cjs/graph/nodes/flow-control/human-approval.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/if.cjs +2 -2
- package/lib/cjs/graph/nodes/flow-control/if.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/parallel.cjs +3 -3
- package/lib/cjs/graph/nodes/flow-control/parallel.cjs.map +1 -0
- package/lib/cjs/graph/nodes/flow-control/switch.cjs +12 -7
- package/lib/cjs/graph/nodes/flow-control/switch.cjs.map +1 -0
- package/lib/cjs/graph/nodes/index.cjs +2 -2
- package/lib/cjs/graph/nodes/index.cjs.map +1 -0
- package/lib/cjs/graph/nodes/loops/foreach.cjs +2 -2
- package/lib/cjs/graph/nodes/loops/foreach.cjs.map +1 -0
- package/lib/cjs/graph/nodes/loops/until.cjs +3 -3
- package/lib/cjs/graph/nodes/loops/until.cjs.map +1 -0
- package/lib/cjs/graph/nodes/loops/while.cjs +3 -3
- package/lib/cjs/graph/nodes/loops/while.cjs.map +1 -0
- package/lib/cjs/graph/nodes/manifests.cjs +17 -13
- package/lib/cjs/graph/nodes/manifests.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/chat.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/chat.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/event.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/event.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/form.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/form.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/manual.cjs +2 -2
- package/lib/cjs/graph/nodes/triggers/manual.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/schedule.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/schedule.cjs.map +1 -0
- package/lib/cjs/graph/nodes/triggers/webhook.cjs +3 -3
- package/lib/cjs/graph/nodes/triggers/webhook.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/code.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/code.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/delay.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/delay.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/log.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/log.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/map.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/map.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/merge.cjs +2 -2
- package/lib/cjs/graph/nodes/utility/merge.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/return.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/return.cjs.map +1 -0
- package/lib/cjs/graph/nodes/utility/utility-log.cjs +3 -3
- package/lib/cjs/graph/nodes/utility/utility-log.cjs.map +1 -0
- package/lib/cjs/graph/overrides/Metadata.cjs +2 -2
- package/lib/cjs/graph/overrides/Metadata.cjs.map +1 -0
- package/lib/cjs/graph/overrides/Rendering.cjs +2 -2
- package/lib/cjs/graph/overrides/Rendering.cjs.map +1 -0
- package/lib/cjs/graph/overrides/index.cjs +2 -2
- package/lib/cjs/graph/overrides/index.cjs.map +1 -0
- package/lib/cjs/graph/overrides/overrides.cjs +2 -2
- package/lib/cjs/graph/overrides/overrides.cjs.map +1 -0
- package/lib/cjs/graph/reader.cjs +5 -2
- package/lib/cjs/graph/reader.cjs.map +1 -0
- package/lib/cjs/graph/registry.cjs +2 -2
- package/lib/cjs/graph/registry.cjs.map +1 -0
- package/lib/cjs/graph/snapshot.cjs +2 -2
- package/lib/cjs/graph/snapshot.cjs.map +1 -0
- package/lib/cjs/graph/types.cjs +2 -2
- package/lib/cjs/graph/types.cjs.map +1 -0
- package/lib/cjs/index.cjs +5 -5
- package/lib/cjs/index.cjs.map +1 -0
- package/lib/cjs/model/Renderable.cjs +2 -2
- package/lib/cjs/model/Renderable.cjs.map +1 -0
- package/lib/cjs/model/decorators.cjs +2 -2
- package/lib/cjs/model/decorators.cjs.map +1 -0
- package/lib/cjs/model/index.cjs +2 -2
- package/lib/cjs/model/index.cjs.map +1 -0
- package/lib/cjs/model/model.cjs +2 -2
- package/lib/cjs/model/model.cjs.map +1 -0
- package/lib/cjs/model/overrides.cjs +2 -2
- package/lib/cjs/model/overrides.cjs.map +1 -0
- package/lib/cjs/overrides/ModelBuilderExtensions.cjs +2 -2
- package/lib/cjs/overrides/ModelBuilderExtensions.cjs.map +1 -0
- package/lib/cjs/overrides/index.cjs +2 -2
- package/lib/cjs/overrides/index.cjs.map +1 -0
- package/lib/cjs/ui/DecafComponent.cjs +2 -2
- package/lib/cjs/ui/DecafComponent.cjs.map +1 -0
- package/lib/cjs/ui/DecafEventHandler.cjs +2 -2
- package/lib/cjs/ui/DecafEventHandler.cjs.map +1 -0
- package/lib/cjs/ui/DecafTranslateService.cjs +2 -2
- package/lib/cjs/ui/DecafTranslateService.cjs.map +1 -0
- package/lib/cjs/ui/Rendering.cjs +2 -2
- package/lib/cjs/ui/Rendering.cjs.map +1 -0
- package/lib/cjs/ui/UIValidator.cjs +2 -2
- package/lib/cjs/ui/UIValidator.cjs.map +1 -0
- package/lib/cjs/ui/constants.cjs +2 -2
- package/lib/cjs/ui/constants.cjs.map +1 -0
- package/lib/cjs/ui/decorators.cjs +2 -2
- package/lib/cjs/ui/decorators.cjs.map +1 -0
- package/lib/cjs/ui/errors.cjs +2 -2
- package/lib/cjs/ui/errors.cjs.map +1 -0
- package/lib/cjs/ui/index.cjs +2 -2
- package/lib/cjs/ui/index.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/IDecafModal.cjs +2 -2
- package/lib/cjs/ui/interfaces/IDecafModal.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/IDecafRouter.cjs +2 -2
- package/lib/cjs/ui/interfaces/IDecafRouter.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/IDecafSpinner.cjs +2 -2
- package/lib/cjs/ui/interfaces/IDecafSpinner.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/IDecafToast.cjs +2 -2
- package/lib/cjs/ui/interfaces/IDecafToast.cjs.map +1 -0
- package/lib/cjs/ui/interfaces/index.cjs +2 -2
- package/lib/cjs/ui/interfaces/index.cjs.map +1 -0
- package/lib/cjs/ui/overrides.cjs +2 -2
- package/lib/cjs/ui/overrides.cjs.map +1 -0
- package/lib/cjs/ui/types.cjs +2 -2
- package/lib/cjs/ui/types.cjs.map +1 -0
- package/lib/cjs/ui/utils.cjs +2 -2
- package/lib/cjs/ui/utils.cjs.map +1 -0
- package/lib/cjs/ui/validator.cjs +2 -2
- package/lib/cjs/ui/validator.cjs.map +1 -0
- package/lib/cjs/user-requests/UserRequestHandler.cjs +2 -2
- package/lib/cjs/user-requests/UserRequestHandler.cjs.map +1 -0
- package/lib/cjs/user-requests/constants.cjs +2 -2
- package/lib/cjs/user-requests/constants.cjs.map +1 -0
- package/lib/cjs/user-requests/decorators.cjs +2 -2
- package/lib/cjs/user-requests/decorators.cjs.map +1 -0
- package/lib/cjs/user-requests/errors.cjs +2 -2
- package/lib/cjs/user-requests/errors.cjs.map +1 -0
- package/lib/cjs/user-requests/index.cjs +2 -2
- package/lib/cjs/user-requests/index.cjs.map +1 -0
- package/lib/cjs/user-requests/types.cjs +2 -2
- package/lib/cjs/user-requests/types.cjs.map +1 -0
- package/lib/esm/dashboard/constants.js +1 -1
- package/lib/esm/dashboard/constants.js.map +1 -0
- package/lib/esm/dashboard/decorators.js +1 -1
- package/lib/esm/dashboard/decorators.js.map +1 -0
- package/lib/esm/dashboard/index.js +1 -1
- package/lib/esm/dashboard/index.js.map +1 -0
- package/lib/esm/dashboard/reader.js +1 -1
- package/lib/esm/dashboard/reader.js.map +1 -0
- package/lib/esm/dashboard/registry.js +1 -1
- package/lib/esm/dashboard/registry.js.map +1 -0
- package/lib/esm/dashboard/types.js +1 -1
- package/lib/esm/dashboard/types.js.map +1 -0
- package/lib/esm/graph/GraphExecutionStateMapper.js +1 -1
- package/lib/esm/graph/GraphExecutionStateMapper.js.map +1 -0
- package/lib/esm/graph/GraphResolution.js +1 -1
- package/lib/esm/graph/GraphResolution.js.map +1 -0
- package/lib/esm/graph/catalog/GraphConnectionPolicy.js +1 -1
- package/lib/esm/graph/catalog/GraphConnectionPolicy.js.map +1 -0
- package/lib/esm/graph/catalog/GraphCredentialReference.js +1 -1
- package/lib/esm/graph/catalog/GraphCredentialReference.js.map +1 -0
- package/lib/esm/graph/catalog/GraphCredentialRequirement.js +1 -1
- package/lib/esm/graph/catalog/GraphCredentialRequirement.js.map +1 -0
- package/lib/esm/graph/catalog/GraphDynamicPortRule.js +1 -1
- package/lib/esm/graph/catalog/GraphDynamicPortRule.js.map +1 -0
- package/lib/esm/graph/catalog/GraphIconReference.js +1 -1
- package/lib/esm/graph/catalog/GraphIconReference.js.map +1 -0
- package/lib/esm/graph/catalog/GraphManifestCompiler.js +10 -1
- package/lib/esm/graph/catalog/GraphManifestCompiler.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeCapability.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeCapability.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeDisplayManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeDisplayManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeManifestSerialization.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeManifestSerialization.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodeMethodManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphNodeMethodManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphNodePolicyManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphNodePolicyManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphParameterBase.js +1 -1
- package/lib/esm/graph/catalog/GraphParameterBase.js.map +1 -0
- package/lib/esm/graph/catalog/GraphParameterDefinition.js +1 -1
- package/lib/esm/graph/catalog/GraphParameterDefinition.js.map +1 -0
- package/lib/esm/graph/catalog/GraphParameterOption.js +1 -1
- package/lib/esm/graph/catalog/GraphParameterOption.js.map +1 -0
- package/lib/esm/graph/catalog/GraphParameterValidation.js +1 -1
- package/lib/esm/graph/catalog/GraphParameterValidation.js.map +1 -0
- package/lib/esm/graph/catalog/GraphPortManifest.js +1 -1
- package/lib/esm/graph/catalog/GraphPortManifest.js.map +1 -0
- package/lib/esm/graph/catalog/GraphResourceLocatorMode.js +1 -1
- package/lib/esm/graph/catalog/GraphResourceLocatorMode.js.map +1 -0
- package/lib/esm/graph/catalog/GraphValueSchema.js +1 -1
- package/lib/esm/graph/catalog/GraphValueSchema.js.map +1 -0
- package/lib/esm/graph/catalog/GraphValueSchemaDerivation.js +1 -1
- package/lib/esm/graph/catalog/GraphValueSchemaDerivation.js.map +1 -0
- package/lib/esm/graph/catalog/GraphVisibilityExpression.js +1 -1
- package/lib/esm/graph/catalog/GraphVisibilityExpression.js.map +1 -0
- package/lib/esm/graph/catalog/index.js +1 -1
- package/lib/esm/graph/catalog/index.js.map +1 -0
- package/lib/esm/graph/constants.js +73 -9
- package/lib/esm/graph/constants.js.map +1 -0
- package/lib/esm/graph/decorators.js +1 -1
- package/lib/esm/graph/decorators.js.map +1 -0
- package/lib/esm/graph/document/GraphDecoratedWorkflowCompiler.js +1 -1
- package/lib/esm/graph/document/GraphDecoratedWorkflowCompiler.js.map +1 -0
- package/lib/esm/graph/document/GraphEdgeInstance.js +1 -1
- package/lib/esm/graph/document/GraphEdgeInstance.js.map +1 -0
- package/lib/esm/graph/document/GraphEndpoint.js +1 -1
- package/lib/esm/graph/document/GraphEndpoint.js.map +1 -0
- package/lib/esm/graph/document/GraphJsonValue.js +1 -1
- package/lib/esm/graph/document/GraphJsonValue.js.map +1 -0
- package/lib/esm/graph/document/GraphLoopConfiguration.js +1 -1
- package/lib/esm/graph/document/GraphLoopConfiguration.js.map +1 -0
- package/lib/esm/graph/document/GraphNodeBinding.js +1 -1
- package/lib/esm/graph/document/GraphNodeBinding.js.map +1 -0
- package/lib/esm/graph/document/GraphNodeInstance.js +1 -1
- package/lib/esm/graph/document/GraphNodeInstance.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowDocument.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowDocument.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowDocumentBuilder.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowDocumentBuilder.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowDocumentReader.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowDocumentReader.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowDocumentSerializer.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowDocumentSerializer.js.map +1 -0
- package/lib/esm/graph/document/GraphWorkflowUiState.js +1 -1
- package/lib/esm/graph/document/GraphWorkflowUiState.js.map +1 -0
- package/lib/esm/graph/document/index.js +1 -1
- package/lib/esm/graph/document/index.js.map +1 -0
- package/lib/esm/graph/index.js +1 -1
- package/lib/esm/graph/index.js.map +1 -0
- package/lib/esm/graph/nodes/agents/agent.js +1 -1
- package/lib/esm/graph/nodes/agents/agent.js.map +1 -0
- package/lib/esm/graph/nodes/base.js +1 -1
- package/lib/esm/graph/nodes/base.js.map +1 -0
- package/lib/esm/graph/nodes/boundary/input-value.js +1 -1
- package/lib/esm/graph/nodes/boundary/input-value.js.map +1 -0
- package/lib/esm/graph/nodes/category-styles.js +1 -1
- package/lib/esm/graph/nodes/category-styles.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/break.js +2 -2
- package/lib/esm/graph/nodes/flow-control/break.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/error-boundary.js +2 -2
- package/lib/esm/graph/nodes/flow-control/error-boundary.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/human-approval.js +2 -2
- package/lib/esm/graph/nodes/flow-control/human-approval.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/if.js +1 -1
- package/lib/esm/graph/nodes/flow-control/if.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/parallel.js +2 -2
- package/lib/esm/graph/nodes/flow-control/parallel.js.map +1 -0
- package/lib/esm/graph/nodes/flow-control/switch.js +12 -7
- package/lib/esm/graph/nodes/flow-control/switch.js.map +1 -0
- package/lib/esm/graph/nodes/index.js +1 -1
- package/lib/esm/graph/nodes/index.js.map +1 -0
- package/lib/esm/graph/nodes/loops/foreach.js +1 -1
- package/lib/esm/graph/nodes/loops/foreach.js.map +1 -0
- package/lib/esm/graph/nodes/loops/until.js +2 -2
- package/lib/esm/graph/nodes/loops/until.js.map +1 -0
- package/lib/esm/graph/nodes/loops/while.js +2 -2
- package/lib/esm/graph/nodes/loops/while.js.map +1 -0
- package/lib/esm/graph/nodes/manifests.js +16 -12
- package/lib/esm/graph/nodes/manifests.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/chat.js +2 -2
- package/lib/esm/graph/nodes/triggers/chat.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/event.js +2 -2
- package/lib/esm/graph/nodes/triggers/event.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/form.js +2 -2
- package/lib/esm/graph/nodes/triggers/form.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/manual.js +1 -1
- package/lib/esm/graph/nodes/triggers/manual.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/schedule.js +2 -2
- package/lib/esm/graph/nodes/triggers/schedule.js.map +1 -0
- package/lib/esm/graph/nodes/triggers/webhook.js +2 -2
- package/lib/esm/graph/nodes/triggers/webhook.js.map +1 -0
- package/lib/esm/graph/nodes/utility/code.js +2 -2
- package/lib/esm/graph/nodes/utility/code.js.map +1 -0
- package/lib/esm/graph/nodes/utility/delay.js +2 -2
- package/lib/esm/graph/nodes/utility/delay.js.map +1 -0
- package/lib/esm/graph/nodes/utility/log.js +2 -2
- package/lib/esm/graph/nodes/utility/log.js.map +1 -0
- package/lib/esm/graph/nodes/utility/map.js +2 -2
- package/lib/esm/graph/nodes/utility/map.js.map +1 -0
- package/lib/esm/graph/nodes/utility/merge.js +1 -1
- package/lib/esm/graph/nodes/utility/merge.js.map +1 -0
- package/lib/esm/graph/nodes/utility/return.js +2 -2
- package/lib/esm/graph/nodes/utility/return.js.map +1 -0
- package/lib/esm/graph/nodes/utility/utility-log.js +2 -2
- package/lib/esm/graph/nodes/utility/utility-log.js.map +1 -0
- package/lib/esm/graph/overrides/Metadata.js +1 -1
- package/lib/esm/graph/overrides/Metadata.js.map +1 -0
- package/lib/esm/graph/overrides/Rendering.js +1 -1
- package/lib/esm/graph/overrides/Rendering.js.map +1 -0
- package/lib/esm/graph/overrides/index.js +1 -1
- package/lib/esm/graph/overrides/index.js.map +1 -0
- package/lib/esm/graph/overrides/overrides.js +1 -1
- package/lib/esm/graph/overrides/overrides.js.map +1 -0
- package/lib/esm/graph/reader.js +4 -1
- package/lib/esm/graph/reader.js.map +1 -0
- package/lib/esm/graph/registry.js +1 -1
- package/lib/esm/graph/registry.js.map +1 -0
- package/lib/esm/graph/snapshot.js +1 -1
- package/lib/esm/graph/snapshot.js.map +1 -0
- package/lib/esm/graph/types.js +1 -1
- package/lib/esm/graph/types.js.map +1 -0
- package/lib/esm/index.js +4 -4
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/model/Renderable.js +1 -1
- package/lib/esm/model/Renderable.js.map +1 -0
- package/lib/esm/model/decorators.js +1 -1
- package/lib/esm/model/decorators.js.map +1 -0
- package/lib/esm/model/index.js +1 -1
- package/lib/esm/model/index.js.map +1 -0
- package/lib/esm/model/model.js +1 -1
- package/lib/esm/model/model.js.map +1 -0
- package/lib/esm/model/overrides.js +1 -1
- package/lib/esm/model/overrides.js.map +1 -0
- package/lib/esm/overrides/ModelBuilderExtensions.js +1 -1
- package/lib/esm/overrides/ModelBuilderExtensions.js.map +1 -0
- package/lib/esm/overrides/index.js +1 -1
- package/lib/esm/overrides/index.js.map +1 -0
- package/lib/esm/ui/DecafComponent.js +1 -1
- package/lib/esm/ui/DecafComponent.js.map +1 -0
- package/lib/esm/ui/DecafEventHandler.js +1 -1
- package/lib/esm/ui/DecafEventHandler.js.map +1 -0
- package/lib/esm/ui/DecafTranslateService.js +1 -1
- package/lib/esm/ui/DecafTranslateService.js.map +1 -0
- package/lib/esm/ui/Rendering.js +1 -1
- package/lib/esm/ui/Rendering.js.map +1 -0
- package/lib/esm/ui/UIValidator.js +1 -1
- package/lib/esm/ui/UIValidator.js.map +1 -0
- package/lib/esm/ui/constants.js +1 -1
- package/lib/esm/ui/constants.js.map +1 -0
- package/lib/esm/ui/decorators.js +1 -1
- package/lib/esm/ui/decorators.js.map +1 -0
- package/lib/esm/ui/errors.js +1 -1
- package/lib/esm/ui/errors.js.map +1 -0
- package/lib/esm/ui/index.js +1 -1
- package/lib/esm/ui/index.js.map +1 -0
- package/lib/esm/ui/interfaces/IDecafModal.js +1 -1
- package/lib/esm/ui/interfaces/IDecafModal.js.map +1 -0
- package/lib/esm/ui/interfaces/IDecafRouter.js +1 -1
- package/lib/esm/ui/interfaces/IDecafRouter.js.map +1 -0
- package/lib/esm/ui/interfaces/IDecafSpinner.js +1 -1
- package/lib/esm/ui/interfaces/IDecafSpinner.js.map +1 -0
- package/lib/esm/ui/interfaces/IDecafToast.js +1 -1
- package/lib/esm/ui/interfaces/IDecafToast.js.map +1 -0
- package/lib/esm/ui/interfaces/index.js +1 -1
- package/lib/esm/ui/interfaces/index.js.map +1 -0
- package/lib/esm/ui/overrides.js +1 -1
- package/lib/esm/ui/overrides.js.map +1 -0
- package/lib/esm/ui/types.js +1 -1
- package/lib/esm/ui/types.js.map +1 -0
- package/lib/esm/ui/utils.js +1 -1
- package/lib/esm/ui/utils.js.map +1 -0
- package/lib/esm/ui/validator.js +1 -1
- package/lib/esm/ui/validator.js.map +1 -0
- package/lib/esm/user-requests/UserRequestHandler.js +1 -1
- package/lib/esm/user-requests/UserRequestHandler.js.map +1 -0
- package/lib/esm/user-requests/constants.js +1 -1
- package/lib/esm/user-requests/constants.js.map +1 -0
- package/lib/esm/user-requests/decorators.js +1 -1
- package/lib/esm/user-requests/decorators.js.map +1 -0
- package/lib/esm/user-requests/errors.js +1 -1
- package/lib/esm/user-requests/errors.js.map +1 -0
- package/lib/esm/user-requests/index.js +1 -1
- package/lib/esm/user-requests/index.js.map +1 -0
- package/lib/esm/user-requests/types.js +1 -1
- package/lib/esm/user-requests/types.js.map +1 -0
- package/lib/types/graph/catalog/GraphNodeDisplayManifest.d.cts +17 -0
- package/lib/types/graph/catalog/GraphNodeDisplayManifest.d.mts +17 -0
- package/lib/types/graph/constants.d.cts +101 -6
- package/lib/types/graph/constants.d.mts +101 -6
- package/lib/types/graph/document/GraphNodeInstance.d.cts +20 -0
- package/lib/types/graph/document/GraphNodeInstance.d.mts +20 -0
- package/lib/types/graph/document/GraphWorkflowUiState.d.cts +8 -0
- package/lib/types/graph/document/GraphWorkflowUiState.d.mts +8 -0
- package/lib/types/index.d.cts +3 -3
- package/lib/types/index.d.mts +3 -3
- package/package.json +3 -1
package/dist/ui-decorators.cjs
CHANGED
|
@@ -1,1059 +1,2 @@
|
|
|
1
|
-
(function(global, factory) {
|
|
2
|
-
|
|
3
|
-
factory(global["ui-decorators"] = {}, global.decafTsDecoratorValidation, global.decafTsDbDecorators, global.decafTsDecoration, global.decafTsLogging));
|
|
4
|
-
})(this, function(exports, decoratorValidation, dbDecorators, decoration, logging) {
|
|
5
|
-
"use strict";
|
|
6
|
-
exports.UIMediaBreakPoints = void 0;
|
|
7
|
-
(function(UIMediaBreakPoints) {
|
|
8
|
-
UIMediaBreakPoints["SMALL"] = "small";
|
|
9
|
-
UIMediaBreakPoints["MEDIUM"] = "medium";
|
|
10
|
-
UIMediaBreakPoints["LARGE"] = "large";
|
|
11
|
-
UIMediaBreakPoints["XLARGE"] = "xlarge";
|
|
12
|
-
})(exports.UIMediaBreakPoints || (exports.UIMediaBreakPoints = {}));
|
|
13
|
-
const UIKeys = {
|
|
14
|
-
REFLECT: `ui`,
|
|
15
|
-
UIMODEL: "uimodel",
|
|
16
|
-
RENDERED_BY: "rendered-by",
|
|
17
|
-
ELEMENT: "uielement",
|
|
18
|
-
PROP: "uiprop",
|
|
19
|
-
CHILD: "uichild",
|
|
20
|
-
NAME: "name",
|
|
21
|
-
NAME_PREFIX: "input-",
|
|
22
|
-
VALIDATION_MESSAGE: "validationMessage",
|
|
23
|
-
UILISTMODEL: "uilistmodel",
|
|
24
|
-
UILISTPROP: "uilistprop",
|
|
25
|
-
UILAYOUT: "uilayout",
|
|
26
|
-
UILAYOUTPROP: "uilayoutprop",
|
|
27
|
-
HANDLERS: "handlers",
|
|
28
|
-
TYPE: "type",
|
|
29
|
-
SUB_TYPE: "subType",
|
|
30
|
-
HIDDEN: "hidden",
|
|
31
|
-
HIDE_FOR: "hide-for",
|
|
32
|
-
SHOW_FOR: "show-for",
|
|
33
|
-
RENDER_IF: "render-if",
|
|
34
|
-
FORMAT: "format",
|
|
35
|
-
ORDER: "order",
|
|
36
|
-
PAGE: "page",
|
|
37
|
-
EVENTS: "events",
|
|
38
|
-
FIRST: "first",
|
|
39
|
-
LAST: "last",
|
|
40
|
-
READ_ONLY: "readonly",
|
|
41
|
-
SEQUENCE: "sequence",
|
|
42
|
-
REQUIRED: decoratorValidation.ValidationKeys.REQUIRED,
|
|
43
|
-
MIN: decoratorValidation.ValidationKeys.MIN,
|
|
44
|
-
MIN_LENGTH: decoratorValidation.ValidationKeys.MIN_LENGTH,
|
|
45
|
-
MAX: decoratorValidation.ValidationKeys.MAX,
|
|
46
|
-
MAX_LENGTH: decoratorValidation.ValidationKeys.MAX_LENGTH,
|
|
47
|
-
PATTERN: decoratorValidation.ValidationKeys.PATTERN,
|
|
48
|
-
URL: decoratorValidation.ValidationKeys.URL,
|
|
49
|
-
STEP: decoratorValidation.ValidationKeys.STEP,
|
|
50
|
-
DATE: decoratorValidation.ValidationKeys.DATE,
|
|
51
|
-
EMAIL: decoratorValidation.ValidationKeys.EMAIL,
|
|
52
|
-
PASSWORD: decoratorValidation.ValidationKeys.PASSWORD,
|
|
53
|
-
EQUALS: decoratorValidation.ValidationKeys.EQUALS,
|
|
54
|
-
DIFF: decoratorValidation.ValidationKeys.DIFF,
|
|
55
|
-
LESS_THAN: decoratorValidation.ValidationKeys.LESS_THAN,
|
|
56
|
-
LESS_THAN_OR_EQUAL: decoratorValidation.ValidationKeys.LESS_THAN_OR_EQUAL,
|
|
57
|
-
GREATER_THAN: decoratorValidation.ValidationKeys.GREATER_THAN,
|
|
58
|
-
GREATER_THAN_OR_EQUAL: decoratorValidation.ValidationKeys.GREATER_THAN_OR_EQUAL
|
|
59
|
-
};
|
|
60
|
-
const ValidatableByType = {
|
|
61
|
-
[UIKeys.EMAIL]: decoratorValidation.EmailValidator,
|
|
62
|
-
[UIKeys.URL]: decoratorValidation.URLValidator,
|
|
63
|
-
[UIKeys.DATE]: decoratorValidation.DateValidator,
|
|
64
|
-
[UIKeys.PASSWORD]: decoratorValidation.PasswordValidator
|
|
65
|
-
};
|
|
66
|
-
const ValidatableByAttribute = {
|
|
67
|
-
[UIKeys.REQUIRED]: decoratorValidation.RequiredValidator,
|
|
68
|
-
[UIKeys.MIN]: decoratorValidation.MinValidator,
|
|
69
|
-
[UIKeys.MAX]: decoratorValidation.MaxValidator,
|
|
70
|
-
[UIKeys.STEP]: decoratorValidation.StepValidator,
|
|
71
|
-
[UIKeys.MIN_LENGTH]: decoratorValidation.MinLengthValidator,
|
|
72
|
-
[UIKeys.MAX_LENGTH]: decoratorValidation.MaxLengthValidator,
|
|
73
|
-
[UIKeys.PATTERN]: decoratorValidation.PatternValidator,
|
|
74
|
-
[UIKeys.EQUALS]: decoratorValidation.EqualsValidator,
|
|
75
|
-
[UIKeys.DIFF]: decoratorValidation.DiffValidator,
|
|
76
|
-
[UIKeys.LESS_THAN]: decoratorValidation.LessThanValidator,
|
|
77
|
-
[UIKeys.LESS_THAN_OR_EQUAL]: decoratorValidation.LessThanOrEqualValidator,
|
|
78
|
-
[UIKeys.GREATER_THAN]: decoratorValidation.GreaterThanValidator,
|
|
79
|
-
[UIKeys.GREATER_THAN_OR_EQUAL]: decoratorValidation.GreaterThanOrEqualValidator
|
|
80
|
-
};
|
|
81
|
-
const HTML5DateFormat = "yyyy-MM-dd";
|
|
82
|
-
const HTML5InputTypes = {
|
|
83
|
-
BUTTON: "button",
|
|
84
|
-
CHECKBOX: "checkbox",
|
|
85
|
-
COLOR: "color",
|
|
86
|
-
DATE: UIKeys.DATE,
|
|
87
|
-
DATETIME_LOCAL: "datetime-local",
|
|
88
|
-
EMAIL: UIKeys.EMAIL,
|
|
89
|
-
FILE: "file",
|
|
90
|
-
HIDDEN: "hidden",
|
|
91
|
-
IMAGE: "image",
|
|
92
|
-
MONTH: "month",
|
|
93
|
-
NUMBER: "number",
|
|
94
|
-
PASSWORD: UIKeys.PASSWORD,
|
|
95
|
-
RADIO: "radio",
|
|
96
|
-
RANGE: "range",
|
|
97
|
-
RESET: "reset",
|
|
98
|
-
SEARCH: "search",
|
|
99
|
-
SUBMIT: "submit",
|
|
100
|
-
TEL: "tel",
|
|
101
|
-
TEXT: "text",
|
|
102
|
-
TEXTAREA: "textarea",
|
|
103
|
-
SELECT: "select",
|
|
104
|
-
TIME: "time",
|
|
105
|
-
URL: UIKeys.URL,
|
|
106
|
-
WEEK: "week"
|
|
107
|
-
};
|
|
108
|
-
const HTML5CheckTypes = [ HTML5InputTypes.CHECKBOX, HTML5InputTypes.RADIO ];
|
|
109
|
-
const ComponentEventNames = {
|
|
110
|
-
Render: "render",
|
|
111
|
-
BackButtonClickEvent: "backButtonNavigationEndEvent",
|
|
112
|
-
Refresh: "RefreshEvent",
|
|
113
|
-
Click: "ClickEvent",
|
|
114
|
-
Change: "ChangeEvent",
|
|
115
|
-
Submit: "SubmitEvent",
|
|
116
|
-
ValidationError: "validationErrorEvent",
|
|
117
|
-
ThemeChange: "themeChangeEvent",
|
|
118
|
-
FormGroupLoaded: "formGroupLoadedEvent"
|
|
119
|
-
};
|
|
120
|
-
const TransactionHooks = {
|
|
121
|
-
BeforeRead: "beforeRead",
|
|
122
|
-
AfterRead: "afterRead",
|
|
123
|
-
BeforeCreate: "beforeCreate",
|
|
124
|
-
AfterCreate: "afterCreate",
|
|
125
|
-
BeforeUpdate: "beforeUpdate",
|
|
126
|
-
AfterUpdate: "afterUpdate",
|
|
127
|
-
BeforeDelete: "beforeDelete",
|
|
128
|
-
AfterDelete: "afterDelete"
|
|
129
|
-
};
|
|
130
|
-
const ElementSizes = {
|
|
131
|
-
xsmall: "xsmall",
|
|
132
|
-
small: "small",
|
|
133
|
-
medium: "medium",
|
|
134
|
-
default: "default",
|
|
135
|
-
large: "large",
|
|
136
|
-
xLarge: "xlarge",
|
|
137
|
-
"2xLarge": "2xlarge",
|
|
138
|
-
auto: "auto",
|
|
139
|
-
expand: "expand",
|
|
140
|
-
block: "block",
|
|
141
|
-
half: "half",
|
|
142
|
-
full: "full"
|
|
143
|
-
};
|
|
144
|
-
const ElementPositions = {
|
|
145
|
-
left: "left",
|
|
146
|
-
center: "center",
|
|
147
|
-
right: "right",
|
|
148
|
-
top: "top",
|
|
149
|
-
bottom: "bottom"
|
|
150
|
-
};
|
|
151
|
-
const LayoutGridGaps = {
|
|
152
|
-
small: "small",
|
|
153
|
-
medium: "medium",
|
|
154
|
-
large: "large",
|
|
155
|
-
collapse: "collapse",
|
|
156
|
-
none: ""
|
|
157
|
-
};
|
|
158
|
-
const ActionRoles = {
|
|
159
|
-
cancel: "cancel",
|
|
160
|
-
confirm: "confirm",
|
|
161
|
-
submit: "submit",
|
|
162
|
-
clear: "clear",
|
|
163
|
-
back: "back",
|
|
164
|
-
[dbDecorators.OperationKeys.CREATE]: dbDecorators.OperationKeys.CREATE,
|
|
165
|
-
[dbDecorators.OperationKeys.READ]: dbDecorators.OperationKeys.READ,
|
|
166
|
-
[dbDecorators.OperationKeys.UPDATE]: dbDecorators.OperationKeys.UPDATE,
|
|
167
|
-
[dbDecorators.OperationKeys.DELETE]: dbDecorators.OperationKeys.DELETE
|
|
168
|
-
};
|
|
169
|
-
const WindowColorSchemes = {
|
|
170
|
-
light: "light",
|
|
171
|
-
dark: "dark",
|
|
172
|
-
undefined: "undefined"
|
|
173
|
-
};
|
|
174
|
-
class RenderingError extends dbDecorators.InternalError {
|
|
175
|
-
constructor(msg) {
|
|
176
|
-
super(msg, RenderingError.name);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
const isClassConstructor = fn => typeof fn === "function" && /^class\s/.test(String(fn));
|
|
180
|
-
function getUIAttributeKey(prop, key) {
|
|
181
|
-
return decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES, prop, key);
|
|
182
|
-
}
|
|
183
|
-
function formatByType(type, value, ...args) {
|
|
184
|
-
if (type === UIKeys.DATE) {
|
|
185
|
-
if (!value) return "";
|
|
186
|
-
const format = args.shift() || HTML5DateFormat;
|
|
187
|
-
return decoratorValidation.formatDate(new Date(value), format);
|
|
188
|
-
}
|
|
189
|
-
return value;
|
|
190
|
-
}
|
|
191
|
-
function parseValueByType(type, value, fieldProps) {
|
|
192
|
-
let result = undefined;
|
|
193
|
-
switch (type) {
|
|
194
|
-
case Array.name:
|
|
195
|
-
{
|
|
196
|
-
const parsed = Array.isArray(value) ? value.map(v => parseValueByType(decoratorValidation.ReservedModels.STRING.name.toLowerCase(), v, fieldProps)) : [ value ];
|
|
197
|
-
result = parsed.join(",");
|
|
198
|
-
break;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
case HTML5InputTypes.NUMBER:
|
|
202
|
-
result = parseToNumber(value);
|
|
203
|
-
break;
|
|
204
|
-
|
|
205
|
-
case HTML5InputTypes.DATE:
|
|
206
|
-
{
|
|
207
|
-
const format = fieldProps.format;
|
|
208
|
-
if (value && `${value}`.trim().length) {
|
|
209
|
-
result = typeof value === decoratorValidation.ReservedModels.NUMBER.name.toLowerCase() ? new Date(value) : value ? format ? decoratorValidation.parseDate(format, value) : new Date(value) : undefined;
|
|
210
|
-
}
|
|
211
|
-
break;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
default:
|
|
215
|
-
result = typeof value === decoratorValidation.ReservedModels.OBJECT.name.toLowerCase() ? Array.isArray(value) ? value.join(",") : JSON.stringify(value) : typeof value === decoratorValidation.ReservedModels.BOOLEAN.name.toLowerCase() ? value : typeof value === decoratorValidation.ReservedModels.STRING.name.toLowerCase() ? escapeHtml(value) : result;
|
|
216
|
-
}
|
|
217
|
-
if (typeof result === "undefined") {
|
|
218
|
-
throw new dbDecorators.InternalError(`Failed to parse value of type ${type} from ${typeof value} - ${value}`);
|
|
219
|
-
}
|
|
220
|
-
return result;
|
|
221
|
-
}
|
|
222
|
-
function parseToNumber(value) {
|
|
223
|
-
if (typeof value === "number" && !isNaN(value)) return value;
|
|
224
|
-
const parsed = Number(value);
|
|
225
|
-
if (!isNaN(parsed)) return parsed;
|
|
226
|
-
return undefined;
|
|
227
|
-
}
|
|
228
|
-
function escapeHtml(value) {
|
|
229
|
-
if (!value) return value;
|
|
230
|
-
const tagsToReplace = {
|
|
231
|
-
"&": "&",
|
|
232
|
-
"<": "<",
|
|
233
|
-
">": ">"
|
|
234
|
-
};
|
|
235
|
-
return `${value}`.replace(/[&<>]/g, tag => tagsToReplace[tag] || tag);
|
|
236
|
-
}
|
|
237
|
-
function revertHtml(value) {
|
|
238
|
-
const tagsToReplace = {
|
|
239
|
-
"&": "&",
|
|
240
|
-
"<": "<",
|
|
241
|
-
">": ">"
|
|
242
|
-
};
|
|
243
|
-
return `${value}`.replace(/<|>|&/g, tag => tagsToReplace[tag] || tag);
|
|
244
|
-
}
|
|
245
|
-
function generateUIModelID(model) {
|
|
246
|
-
let id = Date.now();
|
|
247
|
-
try {
|
|
248
|
-
const pk = decoratorValidation.Model.pk(model.constructor);
|
|
249
|
-
if (pk) id = model[decoratorValidation.Model.pk(model.constructor)];
|
|
250
|
-
} catch (e) {}
|
|
251
|
-
const name = model.constructor.name;
|
|
252
|
-
return `${name}-${id}`;
|
|
253
|
-
}
|
|
254
|
-
class RenderingEngine {
|
|
255
|
-
static {
|
|
256
|
-
this.cache = {};
|
|
257
|
-
}
|
|
258
|
-
constructor(flavour) {
|
|
259
|
-
this.flavour = flavour;
|
|
260
|
-
this.initialized = false;
|
|
261
|
-
RenderingEngine.register(this);
|
|
262
|
-
console.log(`decaf's ${flavour} rendering engine loaded`);
|
|
263
|
-
}
|
|
264
|
-
translate(key, toView = true) {
|
|
265
|
-
if (toView) {
|
|
266
|
-
switch (key) {
|
|
267
|
-
case decoratorValidation.ReservedModels.STRING.name.toLowerCase():
|
|
268
|
-
return HTML5InputTypes.TEXT;
|
|
269
|
-
|
|
270
|
-
case decoratorValidation.ReservedModels.NUMBER.name.toLowerCase():
|
|
271
|
-
case decoratorValidation.ReservedModels.BIGINT.name.toLowerCase():
|
|
272
|
-
return HTML5InputTypes.NUMBER;
|
|
273
|
-
|
|
274
|
-
case decoratorValidation.ReservedModels.BOOLEAN.name.toLowerCase():
|
|
275
|
-
return HTML5InputTypes.CHECKBOX;
|
|
276
|
-
|
|
277
|
-
case decoratorValidation.ReservedModels.DATE.name.toLowerCase():
|
|
278
|
-
return HTML5InputTypes.DATE;
|
|
279
|
-
}
|
|
280
|
-
} else {
|
|
281
|
-
switch (key) {
|
|
282
|
-
case HTML5InputTypes.SELECT:
|
|
283
|
-
case HTML5InputTypes.TEXT:
|
|
284
|
-
case HTML5InputTypes.EMAIL:
|
|
285
|
-
case HTML5InputTypes.COLOR:
|
|
286
|
-
case HTML5InputTypes.PASSWORD:
|
|
287
|
-
case HTML5InputTypes.TEL:
|
|
288
|
-
case HTML5InputTypes.URL:
|
|
289
|
-
case HTML5InputTypes.SEARCH:
|
|
290
|
-
case HTML5InputTypes.HIDDEN:
|
|
291
|
-
case HTML5InputTypes.TEXTAREA:
|
|
292
|
-
case HTML5InputTypes.RADIO:
|
|
293
|
-
return decoratorValidation.ReservedModels.STRING.name.toLowerCase();
|
|
294
|
-
|
|
295
|
-
case HTML5InputTypes.NUMBER:
|
|
296
|
-
return decoratorValidation.ReservedModels.NUMBER.name.toLowerCase();
|
|
297
|
-
|
|
298
|
-
case HTML5InputTypes.CHECKBOX:
|
|
299
|
-
return decoratorValidation.ReservedModels.BOOLEAN.name.toLowerCase();
|
|
300
|
-
|
|
301
|
-
case HTML5InputTypes.DATE:
|
|
302
|
-
case HTML5InputTypes.DATETIME_LOCAL:
|
|
303
|
-
case HTML5InputTypes.TIME:
|
|
304
|
-
return decoratorValidation.ReservedModels.DATE.name.toLowerCase();
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
return key;
|
|
308
|
-
}
|
|
309
|
-
getClassDecoratorsMetadata(model) {
|
|
310
|
-
return [ decoratorValidation.Model.uiModelOf(model.constructor), decoratorValidation.Model.uiListModelOf(model.constructor), decoratorValidation.Model.uiHandlersFor(model.constructor), decoratorValidation.Model.uiLayoutOf(model.constructor) ].filter(Boolean);
|
|
311
|
-
}
|
|
312
|
-
sortChildrenByOrder(children = []) {
|
|
313
|
-
return children.sort((a, b) => {
|
|
314
|
-
const aOrder = a.props?.order ?? 0;
|
|
315
|
-
const bOrder = b.props?.order ?? 0;
|
|
316
|
-
const weight = v => v === UIKeys.FIRST ? 0 : typeof v === decoratorValidation.Primitives.NUMBER ? 1 : v === UIKeys.LAST ? children.length + children.indexOf(b) : 1;
|
|
317
|
-
const aWeight = weight(aOrder);
|
|
318
|
-
const bWeight = weight(bOrder);
|
|
319
|
-
if (aWeight !== bWeight) {
|
|
320
|
-
return aWeight - bWeight;
|
|
321
|
-
}
|
|
322
|
-
if (aWeight === 1 && typeof aOrder === decoratorValidation.Primitives.NUMBER && typeof bOrder === decoratorValidation.Primitives.NUMBER) {
|
|
323
|
-
return aOrder - bOrder;
|
|
324
|
-
}
|
|
325
|
-
return 0;
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
isCustomValidator(key) {
|
|
329
|
-
return !Object.values(decoratorValidation.ValidationKeys).includes(key) && !Object.values(UIKeys).includes(key);
|
|
330
|
-
}
|
|
331
|
-
isValidatableByType(key) {
|
|
332
|
-
return Object.keys(ValidatableByType).includes(key);
|
|
333
|
-
}
|
|
334
|
-
isValidatableByAttribute(key) {
|
|
335
|
-
return Object.keys(ValidatableByAttribute).includes(key);
|
|
336
|
-
}
|
|
337
|
-
toAttributeValue(key, value) {
|
|
338
|
-
if (!Object.keys(ValidatableByAttribute).includes(key)) throw new Error(`Invalid attribute key "${key}". Expected one of: ${Object.keys(ValidatableByAttribute).join(", ")}.`);
|
|
339
|
-
return key === UIKeys.REQUIRED ? true : value[key];
|
|
340
|
-
}
|
|
341
|
-
toFieldDefinition(model, globalProps = {}, generateId = true) {
|
|
342
|
-
const {inheritProps: inheritProps, ...globalPropsWithoutInherits} = globalProps;
|
|
343
|
-
globalProps = globalPropsWithoutInherits;
|
|
344
|
-
const classDecorators = this.getClassDecoratorsMetadata(model);
|
|
345
|
-
if (!classDecorators.length) throw new RenderingError(`No ui definitions set for model ${model.constructor.name}. Did you use @uimodel?`);
|
|
346
|
-
const classDecorator = Object.assign({}, ...classDecorators, inheritProps ? inheritProps : {});
|
|
347
|
-
const {tag: tag, props: props, item: item, handlers: handlers} = classDecorator;
|
|
348
|
-
const uiDecorators = decoratorValidation.Model.uiPropertiesOf(model.constructor);
|
|
349
|
-
let children;
|
|
350
|
-
let childProps = item?.props || {};
|
|
351
|
-
let mapper = {};
|
|
352
|
-
const getPath = (parent, prop) => parent ? [ parent, prop ].join(".") : prop;
|
|
353
|
-
if (uiDecorators) {
|
|
354
|
-
const validationDecorators = decoration.Metadata.get(model.constructor, decoratorValidation.ValidationKeys.REFLECT) || {};
|
|
355
|
-
for (const key of uiDecorators) {
|
|
356
|
-
const decs = decoratorValidation.Model.uiDecorationOf(model.constructor, key);
|
|
357
|
-
let type;
|
|
358
|
-
try {
|
|
359
|
-
type = decoratorValidation.Model.uiTypeOf(model.constructor, key);
|
|
360
|
-
} catch (e) {
|
|
361
|
-
if (!(e instanceof dbDecorators.NotFoundError)) throw e;
|
|
362
|
-
}
|
|
363
|
-
const hasHideOnDecorator = decoratorValidation.Model.uiIsHidden(model.constructor, key);
|
|
364
|
-
if (hasHideOnDecorator) {
|
|
365
|
-
const hasUiElementDecorator = decoratorValidation.Model.uiElementOf(model.constructor, key);
|
|
366
|
-
if (!hasUiElementDecorator) throw new RenderingError(`@uielement no found in "${key}". It is required to use hiddenOn decorator.`);
|
|
367
|
-
}
|
|
368
|
-
const sorted = Object.entries(decs).map(([k, v]) => ({
|
|
369
|
-
key: k,
|
|
370
|
-
props: v
|
|
371
|
-
})).sort(a => [ UIKeys.ELEMENT, UIKeys.CHILD ].includes(a.key) ? -1 : 1);
|
|
372
|
-
sorted.forEach(dec => {
|
|
373
|
-
if (!dec) throw new RenderingError(`No decorator found`);
|
|
374
|
-
switch (dec.key) {
|
|
375
|
-
case UIKeys.PROP:
|
|
376
|
-
{
|
|
377
|
-
childProps[key] = dec.props;
|
|
378
|
-
break;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
case UIKeys.CHILD:
|
|
382
|
-
{
|
|
383
|
-
const modelName = dec.props?.props?.name || key;
|
|
384
|
-
try {
|
|
385
|
-
const isPropertyModel = decoratorValidation.Model.isModel(decoratorValidation.Model.build({}, modelName)) || decoratorValidation.Model.isPropertyModel(model, modelName);
|
|
386
|
-
if (!isPropertyModel) throw new RenderingError(`Child "${modelName}" must be a model.`);
|
|
387
|
-
} catch (e) {
|
|
388
|
-
throw new RenderingError(`Child "${modelName}" must be a model.`);
|
|
389
|
-
}
|
|
390
|
-
let Clazz;
|
|
391
|
-
const submodel = model[key];
|
|
392
|
-
const constructable = typeof submodel === "object" && submodel !== null && !Array.isArray(submodel);
|
|
393
|
-
if (!constructable) {
|
|
394
|
-
const clazzName = dec.props.props?.name;
|
|
395
|
-
Clazz = new (decoratorValidation.Model.get(clazzName));
|
|
396
|
-
}
|
|
397
|
-
children = children || [];
|
|
398
|
-
const childrenGlobalProps = Object.assign({}, globalProps || {}, {
|
|
399
|
-
model: Clazz
|
|
400
|
-
}, {
|
|
401
|
-
inheritProps: dec.props,
|
|
402
|
-
childOf: getPath(globalProps?.childOf, key)
|
|
403
|
-
});
|
|
404
|
-
const childDefinition = this.toFieldDefinition(submodel || Clazz, childrenGlobalProps, false);
|
|
405
|
-
const {inheritProps: inheritProps} = childrenGlobalProps;
|
|
406
|
-
if (inheritProps) childDefinition.props = Object.assign({}, childDefinition.props, inheritProps.props || {});
|
|
407
|
-
children.push(childDefinition);
|
|
408
|
-
break;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
case UIKeys.UILISTPROP:
|
|
412
|
-
{
|
|
413
|
-
mapper = mapper || {};
|
|
414
|
-
const decProps = dec.props;
|
|
415
|
-
if (decProps.name) mapper[decProps.name] = typeof decProps?.props === "object" && UIKeys.SEQUENCE in decProps.props ? decProps.props : key;
|
|
416
|
-
const props = Object.assign({}, classDecorator.props?.item || {}, item?.props || {}, decProps?.props || {}, globalProps);
|
|
417
|
-
childProps = {
|
|
418
|
-
tag: item?.tag || props.render || "",
|
|
419
|
-
props: Object.assign({}, childProps?.props, {
|
|
420
|
-
mapper: mapper
|
|
421
|
-
}, props)
|
|
422
|
-
};
|
|
423
|
-
break;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
case UIKeys.EVENTS:
|
|
427
|
-
case UIKeys.HIDDEN:
|
|
428
|
-
case UIKeys.HIDE_FOR:
|
|
429
|
-
case UIKeys.SHOW_FOR:
|
|
430
|
-
case UIKeys.PAGE:
|
|
431
|
-
case UIKeys.ORDER:
|
|
432
|
-
case UIKeys.UILAYOUTPROP:
|
|
433
|
-
case UIKeys.ELEMENT:
|
|
434
|
-
{
|
|
435
|
-
children = children || [];
|
|
436
|
-
const uiProps = dec.props;
|
|
437
|
-
const visibilityProps = dec.key === UIKeys.HIDE_FOR ? {
|
|
438
|
-
hideFor: dec.props
|
|
439
|
-
} : dec.key === UIKeys.SHOW_FOR ? {
|
|
440
|
-
showFor: dec.props
|
|
441
|
-
} : {};
|
|
442
|
-
const props = Object.assign({}, childProps?.props, uiProps.props || {}, visibilityProps, uiProps?.props?.name ? {
|
|
443
|
-
path: getPath(globalProps?.childOf, uiProps.props.name),
|
|
444
|
-
childOf: undefined
|
|
445
|
-
} : {}, globalProps, {
|
|
446
|
-
name: uiProps.props?.name || key
|
|
447
|
-
});
|
|
448
|
-
if (dec.key === UIKeys.ELEMENT) {
|
|
449
|
-
const childDefinition = {
|
|
450
|
-
tag: uiProps.tag || childProps?.tag || tag || "",
|
|
451
|
-
props: props
|
|
452
|
-
};
|
|
453
|
-
const validationDecs = validationDecorators[key];
|
|
454
|
-
if (validationDecs) {
|
|
455
|
-
for (const dec of Object.entries(validationDecs).map(([k, v]) => ({
|
|
456
|
-
key: k,
|
|
457
|
-
props: v
|
|
458
|
-
}))) {
|
|
459
|
-
if (this.isValidatableByAttribute(dec.key)) {
|
|
460
|
-
childDefinition.props[this.translate(dec.key)] = this.toAttributeValue(dec.key, dec.props);
|
|
461
|
-
continue;
|
|
462
|
-
}
|
|
463
|
-
if (this.isValidatableByType(dec.key)) {
|
|
464
|
-
if (dec.key === HTML5InputTypes.DATE) {
|
|
465
|
-
childDefinition.props[UIKeys.FORMAT] = dec.props.format || HTML5DateFormat;
|
|
466
|
-
}
|
|
467
|
-
childDefinition.props[UIKeys.TYPE] = dec.key;
|
|
468
|
-
continue;
|
|
469
|
-
}
|
|
470
|
-
if (this.isCustomValidator(dec.key)) {
|
|
471
|
-
props[UIKeys.SUB_TYPE] = dec.key;
|
|
472
|
-
if (dec.props?.message) {
|
|
473
|
-
props[UIKeys.VALIDATION_MESSAGE] = dec.props.message;
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
if (!childDefinition.props[UIKeys.TYPE]) {
|
|
479
|
-
const basicType = decoration.Metadata.type(model.constructor, key).name;
|
|
480
|
-
childDefinition.props[UIKeys.TYPE] = this.translate(basicType.toLowerCase(), true);
|
|
481
|
-
}
|
|
482
|
-
childDefinition.props.value = formatByType(childDefinition.props[UIKeys.TYPE], model[key], childDefinition.props[UIKeys.FORMAT]);
|
|
483
|
-
children.push(childDefinition);
|
|
484
|
-
} else {
|
|
485
|
-
const child = children.find(c => c.props?.name === key || [ UIKeys.UILAYOUTPROP, UIKeys.PAGE, UIKeys.EVENTS ].includes(dec.key) && (c.props?.childOf === key || c.props?.childOf?.endsWith(`.${key}`)));
|
|
486
|
-
if (child) {
|
|
487
|
-
if (dec.key === UIKeys.HIDE_FOR || dec.key === UIKeys.SHOW_FOR) {
|
|
488
|
-
child.props = Object.assign({}, child.props, visibilityProps);
|
|
489
|
-
} else if (dec.key !== UIKeys.UILAYOUTPROP) {
|
|
490
|
-
child.props = Object.assign({}, child.props, {
|
|
491
|
-
[dec.key]: uiProps
|
|
492
|
-
});
|
|
493
|
-
} else {
|
|
494
|
-
const {row: row, col: col, props: props} = dec.props;
|
|
495
|
-
child.props = Object.assign({}, props || {}, child.props, row, col);
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
break;
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
default:
|
|
503
|
-
throw new RenderingError(`Invalid key: ${dec.key}`);
|
|
504
|
-
}
|
|
505
|
-
});
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
globalProps = Object.assign({}, props, globalProps, {
|
|
509
|
-
handlers: handlers || {}
|
|
510
|
-
});
|
|
511
|
-
const currentNamespaces = new Set([ ...Array.isArray(globalProps?.namespaces) ? globalProps.namespaces : [], ...typeof globalProps?.namespace === "string" ? [ globalProps.namespace ] : [] ].filter(Boolean));
|
|
512
|
-
const operation = globalProps?.operation;
|
|
513
|
-
children = this.sortChildrenByOrder(children).filter(item => {
|
|
514
|
-
const hiddenOn = item?.props?.hidden || [];
|
|
515
|
-
if (hiddenOn.length > 0 && hiddenOn.includes(operation)) {
|
|
516
|
-
return false;
|
|
517
|
-
}
|
|
518
|
-
const hideFor = item?.props?.hideFor || [];
|
|
519
|
-
const showFor = item?.props?.showFor || [];
|
|
520
|
-
if (hideFor.length > 0 && [ ...currentNamespaces ].some(namespace => hideFor.includes(namespace))) {
|
|
521
|
-
return false;
|
|
522
|
-
}
|
|
523
|
-
if (showFor.length > 0 && ![ ...currentNamespaces ].some(namespace => showFor.includes(namespace))) {
|
|
524
|
-
return false;
|
|
525
|
-
}
|
|
526
|
-
return true;
|
|
527
|
-
});
|
|
528
|
-
const result = {
|
|
529
|
-
tag: tag,
|
|
530
|
-
item: childProps,
|
|
531
|
-
props: globalProps,
|
|
532
|
-
children: children?.length ? children : undefined
|
|
533
|
-
};
|
|
534
|
-
if (generateId) result.rendererId = generateUIModelID(model);
|
|
535
|
-
return result;
|
|
536
|
-
}
|
|
537
|
-
static register(engine) {
|
|
538
|
-
if (engine.flavour in this.cache) throw new dbDecorators.InternalError(`Rendering engine under ${engine.flavour} already exists`);
|
|
539
|
-
this.cache[engine.flavour] = engine;
|
|
540
|
-
this.current = engine;
|
|
541
|
-
}
|
|
542
|
-
static getOrBoot(obj) {
|
|
543
|
-
if (obj instanceof RenderingEngine) return obj;
|
|
544
|
-
const engine = new obj;
|
|
545
|
-
engine.initialize();
|
|
546
|
-
return engine;
|
|
547
|
-
}
|
|
548
|
-
static get(flavour) {
|
|
549
|
-
if (!flavour) return this.getOrBoot(this.current);
|
|
550
|
-
if (!(flavour in this.cache)) throw new dbDecorators.InternalError(`Rendering engine under ${flavour} does not exist`);
|
|
551
|
-
return this.getOrBoot(this.cache[flavour]);
|
|
552
|
-
}
|
|
553
|
-
static render(model, ...args) {
|
|
554
|
-
const constructor = decoratorValidation.Model.get(model.constructor.name) || decoratorValidation.Model.fromObject(model);
|
|
555
|
-
if (!constructor) throw new dbDecorators.InternalError("No model registered found");
|
|
556
|
-
const flavour = decoratorValidation.Model.renderedBy(model.constructor);
|
|
557
|
-
return RenderingEngine.get(flavour).render(model, ...args);
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
function hideOn(...operations) {
|
|
561
|
-
return function hideOn(object, propertyKey) {
|
|
562
|
-
return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.HIDDEN), operations)(object, propertyKey);
|
|
563
|
-
};
|
|
564
|
-
}
|
|
565
|
-
function hideFor(...namespaces) {
|
|
566
|
-
return function hideFor(object, propertyKey) {
|
|
567
|
-
return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.HIDE_FOR), namespaces)(object, propertyKey);
|
|
568
|
-
};
|
|
569
|
-
}
|
|
570
|
-
function showFor(...namespaces) {
|
|
571
|
-
return function showFor(object, propertyKey) {
|
|
572
|
-
return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.SHOW_FOR), namespaces)(object, propertyKey);
|
|
573
|
-
};
|
|
574
|
-
}
|
|
575
|
-
function renderIf(...namespaces) {
|
|
576
|
-
return showFor(...namespaces);
|
|
577
|
-
}
|
|
578
|
-
function uiorder(order = UIKeys.FIRST) {
|
|
579
|
-
return function uiorder(object, propertyKey) {
|
|
580
|
-
return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.ORDER), order)(object, propertyKey);
|
|
581
|
-
};
|
|
582
|
-
}
|
|
583
|
-
function hidden() {
|
|
584
|
-
return hideOn(dbDecorators.OperationKeys.CREATE, dbDecorators.OperationKeys.READ, dbDecorators.OperationKeys.UPDATE, dbDecorators.OperationKeys.DELETE);
|
|
585
|
-
}
|
|
586
|
-
function uielement(tag, props, serialize = false) {
|
|
587
|
-
return (original, propertyKey) => {
|
|
588
|
-
if (typeof tag === "object") {
|
|
589
|
-
props = tag;
|
|
590
|
-
tag = "";
|
|
591
|
-
}
|
|
592
|
-
const metadata = {
|
|
593
|
-
tag: tag,
|
|
594
|
-
serialize: serialize,
|
|
595
|
-
props: Object.assign({}, props || {}, {
|
|
596
|
-
name: propertyKey
|
|
597
|
-
})
|
|
598
|
-
};
|
|
599
|
-
return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.ELEMENT), metadata)(original, propertyKey);
|
|
600
|
-
};
|
|
601
|
-
}
|
|
602
|
-
function uiprop(propName = undefined, stringify = false) {
|
|
603
|
-
return (target, propertyKey) => {
|
|
604
|
-
const metadata = {
|
|
605
|
-
name: propName || propertyKey,
|
|
606
|
-
stringify: stringify
|
|
607
|
-
};
|
|
608
|
-
decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.PROP), metadata)(target, propertyKey);
|
|
609
|
-
};
|
|
610
|
-
}
|
|
611
|
-
function uichild(clazz, tag, props = {}, isArray = false, serialize = false) {
|
|
612
|
-
return (target, propertyKey) => {
|
|
613
|
-
const metadata = {
|
|
614
|
-
tag: tag,
|
|
615
|
-
serialize: serialize,
|
|
616
|
-
props: Object.assign({}, props || {}, {
|
|
617
|
-
name: clazz || propertyKey
|
|
618
|
-
}, isArray ? {
|
|
619
|
-
customTypes: [ Array.name ],
|
|
620
|
-
multiple: true
|
|
621
|
-
} : {
|
|
622
|
-
multiple: props?.multiple || false
|
|
623
|
-
})
|
|
624
|
-
};
|
|
625
|
-
decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.CHILD), metadata)(target, propertyKey);
|
|
626
|
-
};
|
|
627
|
-
}
|
|
628
|
-
function uilistprop(propName = undefined, props) {
|
|
629
|
-
return (target, propertyKey) => {
|
|
630
|
-
const metadata = {
|
|
631
|
-
name: propName || propertyKey,
|
|
632
|
-
props: props || {}
|
|
633
|
-
};
|
|
634
|
-
decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.UILISTPROP), metadata)(target, propertyKey);
|
|
635
|
-
};
|
|
636
|
-
}
|
|
637
|
-
function uilayoutprop(col = 1, row = 1) {
|
|
638
|
-
return (target, propertyKey) => {
|
|
639
|
-
const metadata = {
|
|
640
|
-
name: propertyKey,
|
|
641
|
-
props: Object.assign({}, {
|
|
642
|
-
row: row,
|
|
643
|
-
col: col
|
|
644
|
-
})
|
|
645
|
-
};
|
|
646
|
-
decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.UILAYOUTPROP), metadata)(target, propertyKey);
|
|
647
|
-
};
|
|
648
|
-
}
|
|
649
|
-
function uipageprop(page = 1) {
|
|
650
|
-
return function uipageprop(original, propertyKey) {
|
|
651
|
-
return decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.PAGE), page)(original, propertyKey);
|
|
652
|
-
};
|
|
653
|
-
}
|
|
654
|
-
function uion(event, handler) {
|
|
655
|
-
return function uion(original, propertyKey) {
|
|
656
|
-
decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.EVENTS), {
|
|
657
|
-
...typeof event === "object" ? event : {
|
|
658
|
-
[event]: handler
|
|
659
|
-
}
|
|
660
|
-
})(original, propertyKey);
|
|
661
|
-
};
|
|
662
|
-
}
|
|
663
|
-
function uionclick(handler) {
|
|
664
|
-
return uion("handleClick", handler);
|
|
665
|
-
}
|
|
666
|
-
function uionrender(handler) {
|
|
667
|
-
return uion("render", handler);
|
|
668
|
-
}
|
|
669
|
-
function uitablecol(sequence = UIKeys.LAST, valueParserFn) {
|
|
670
|
-
return (target, propertyKey) => {
|
|
671
|
-
const metadata = {
|
|
672
|
-
name: propertyKey,
|
|
673
|
-
props: {
|
|
674
|
-
sequence: sequence,
|
|
675
|
-
...!valueParserFn ? {} : {
|
|
676
|
-
valueParserFn: valueParserFn
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
};
|
|
680
|
-
decoration.propMetadata(getUIAttributeKey(propertyKey, UIKeys.UILISTPROP), metadata)(target, propertyKey);
|
|
681
|
-
};
|
|
682
|
-
}
|
|
683
|
-
class UIValidator extends decoratorValidation.Validator {
|
|
684
|
-
getMessage(message, ...args) {
|
|
685
|
-
if (UIValidator.translateService) return UIValidator.translateService.translate(message, ...args);
|
|
686
|
-
return super.getMessage(message, ...args);
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
class DecafComponent extends logging.LoggedClass {
|
|
690
|
-
constructor() {
|
|
691
|
-
super();
|
|
692
|
-
this.enableDarkMode = true;
|
|
693
|
-
this.isDarkMode = false;
|
|
694
|
-
this.item = {
|
|
695
|
-
tag: ""
|
|
696
|
-
};
|
|
697
|
-
this.props = {};
|
|
698
|
-
this.route = "";
|
|
699
|
-
this.borders = false;
|
|
700
|
-
this.OperationKeys = dbDecorators.OperationKeys;
|
|
701
|
-
this.initialized = false;
|
|
702
|
-
this.events = {};
|
|
703
|
-
this.handlers = {};
|
|
704
|
-
}
|
|
705
|
-
get repository() {
|
|
706
|
-
return this._repository;
|
|
707
|
-
}
|
|
708
|
-
set repository(repository) {
|
|
709
|
-
this._repository = repository;
|
|
710
|
-
}
|
|
711
|
-
async render(...args) {
|
|
712
|
-
this.log.for(this.render).info(`render for ${this.componentName} with ${JSON.stringify(args)}`);
|
|
713
|
-
}
|
|
714
|
-
async refresh(...args) {
|
|
715
|
-
this.log.for(this.refresh).info(`Refresh called with args: ${args}`);
|
|
716
|
-
}
|
|
717
|
-
async initialize(...args) {
|
|
718
|
-
this.initialized = true;
|
|
719
|
-
}
|
|
720
|
-
async translate(...args) {
|
|
721
|
-
this.log.for(this.translate).info(`translate for ${this.componentName} with ${JSON.stringify(args)}`);
|
|
722
|
-
}
|
|
723
|
-
async preview(...args) {
|
|
724
|
-
this.log.for(this.preview).debug(`Preview called with args: ${args}`);
|
|
725
|
-
}
|
|
726
|
-
async submit(...args) {
|
|
727
|
-
this.log.for(this.submit).info(`submit for ${this.componentName} with ${JSON.stringify(args)}`);
|
|
728
|
-
}
|
|
729
|
-
parseHandlers(handlers, instance) {
|
|
730
|
-
const result = {};
|
|
731
|
-
Object.entries(handlers).forEach(([key, fn]) => {
|
|
732
|
-
if (isClassConstructor(fn)) {
|
|
733
|
-
const clazz = new fn;
|
|
734
|
-
const event = key in clazz ? clazz[key] : clazz.handle;
|
|
735
|
-
result[key] = event;
|
|
736
|
-
instance.handlers[key] = event;
|
|
737
|
-
} else {
|
|
738
|
-
result[key] = fn;
|
|
739
|
-
instance.handlers[key] = fn;
|
|
740
|
-
}
|
|
741
|
-
});
|
|
742
|
-
return result;
|
|
743
|
-
}
|
|
744
|
-
parseEvents(events, instance) {
|
|
745
|
-
const result = {};
|
|
746
|
-
Object.entries(events).forEach(([key, fn]) => {
|
|
747
|
-
const name = key;
|
|
748
|
-
const evt = fn();
|
|
749
|
-
if (isClassConstructor(evt)) {
|
|
750
|
-
const fn = (new evt)[key];
|
|
751
|
-
if (fn) {
|
|
752
|
-
result[name] = fn;
|
|
753
|
-
instance.events[name] = fn;
|
|
754
|
-
}
|
|
755
|
-
} else {
|
|
756
|
-
result[name] = fn;
|
|
757
|
-
instance.events[name] = fn;
|
|
758
|
-
}
|
|
759
|
-
});
|
|
760
|
-
return result;
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
class DecafEventHandler extends DecafComponent {
|
|
764
|
-
constructor() {
|
|
765
|
-
super();
|
|
766
|
-
}
|
|
767
|
-
handle(...args) {
|
|
768
|
-
this.log.for(this.handle).info(`component ${this.componentName} handling ${JSON.stringify(args)}`);
|
|
769
|
-
}
|
|
770
|
-
handleClick(...args) {
|
|
771
|
-
this.log.for(this.handleClick).info(`component ${this.componentName} handling click ${JSON.stringify(args)}`);
|
|
772
|
-
}
|
|
773
|
-
handleAction(...args) {
|
|
774
|
-
this.log.for(this.handleAction).info(`component ${this.componentName} handling action ${JSON.stringify(args)}`);
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
class DecafTranslateService extends logging.LoggedClass {
|
|
778
|
-
translate(key, params) {
|
|
779
|
-
this.log.for(this.translate).info(`Must translate ${key} with params ${JSON.stringify(params || {})}`);
|
|
780
|
-
}
|
|
781
|
-
instant(key, params) {
|
|
782
|
-
this.log.for(this.instant).info(`Must translate ${key} with params ${JSON.stringify(params || {})}`);
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
decoratorValidation.Model.prototype.render = function(...args) {
|
|
786
|
-
return RenderingEngine.render(this, ...args);
|
|
787
|
-
};
|
|
788
|
-
decoratorValidation.Model.renderedBy = function(model) {
|
|
789
|
-
return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.RENDERED_BY));
|
|
790
|
-
}.bind(decoratorValidation.Model);
|
|
791
|
-
decoratorValidation.Model.uiPropertiesOf = function(model) {
|
|
792
|
-
const meta = decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES));
|
|
793
|
-
if (!meta) return undefined;
|
|
794
|
-
return Object.keys(meta);
|
|
795
|
-
}.bind(decoratorValidation.Model);
|
|
796
|
-
decoratorValidation.Model.uiDecorationOf = function(model, prop, key) {
|
|
797
|
-
const meta = decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES, prop));
|
|
798
|
-
if (!meta) return undefined;
|
|
799
|
-
if (!key) return meta;
|
|
800
|
-
return meta[key];
|
|
801
|
-
};
|
|
802
|
-
decoratorValidation.Model.uiModelOf = function(model) {
|
|
803
|
-
return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UIMODEL));
|
|
804
|
-
};
|
|
805
|
-
decoratorValidation.Model.uiElementOf = function(model, prop) {
|
|
806
|
-
return decoration.Metadata.get(model, getUIAttributeKey(prop, UIKeys.ELEMENT));
|
|
807
|
-
};
|
|
808
|
-
decoratorValidation.Model.uiListModelOf = function(model) {
|
|
809
|
-
return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UILISTMODEL));
|
|
810
|
-
};
|
|
811
|
-
decoratorValidation.Model.uiHandlersFor = function(model) {
|
|
812
|
-
return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.HANDLERS));
|
|
813
|
-
};
|
|
814
|
-
decoratorValidation.Model.uiLayoutOf = function(model) {
|
|
815
|
-
return decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UILAYOUT));
|
|
816
|
-
};
|
|
817
|
-
decoratorValidation.Model.uiIsHidden = function(model, prop) {
|
|
818
|
-
return !!decoration.Metadata.get(model, getUIAttributeKey(prop, UIKeys.HIDDEN));
|
|
819
|
-
};
|
|
820
|
-
decoratorValidation.Model.uiIsHiddenOn = function(model, prop, op) {
|
|
821
|
-
const meta = decoration.Metadata.get(model, getUIAttributeKey(prop, UIKeys.HIDDEN));
|
|
822
|
-
if (!meta) return false;
|
|
823
|
-
if (!op) return meta;
|
|
824
|
-
return meta.includes(op);
|
|
825
|
-
};
|
|
826
|
-
decoratorValidation.Model.uiTypeOf = function(model, prop) {
|
|
827
|
-
const meta = decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES, prop));
|
|
828
|
-
if (!meta) throw new dbDecorators.NotFoundError(`No metadata found for property '${prop}' on model '${model.name}'`);
|
|
829
|
-
const keys = Object.keys(meta).filter(k => [ UIKeys.PROP, UIKeys.ELEMENT, UIKeys.CHILD ].includes(k));
|
|
830
|
-
if (keys.length === 0) throw new dbDecorators.NotFoundError(`No UI type metadata found for property '${prop}' on model '${model.name}'`);
|
|
831
|
-
if (keys.length > 1) throw new RenderingError(`Only one type of decoration is allowed. Please choose between @uiprop, @uichild or @uielement`);
|
|
832
|
-
return meta[keys[0]];
|
|
833
|
-
};
|
|
834
|
-
decoratorValidation.Model.uiListItems = function(model) {
|
|
835
|
-
const meta = decoration.Metadata.get(model, decoration.Metadata.key(UIKeys.REFLECT, decoration.DecorationKeys.PROPERTIES));
|
|
836
|
-
if (!meta) return undefined;
|
|
837
|
-
return Object.keys(meta);
|
|
838
|
-
}.bind(decoratorValidation.Model);
|
|
839
|
-
function uimodel(tag, props) {
|
|
840
|
-
return (original, propertyKey) => {
|
|
841
|
-
const meta = {
|
|
842
|
-
tag: tag || original.name,
|
|
843
|
-
props: props
|
|
844
|
-
};
|
|
845
|
-
return decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UIMODEL), meta)(original);
|
|
846
|
-
};
|
|
847
|
-
}
|
|
848
|
-
function renderedBy(engine) {
|
|
849
|
-
return decoration.apply(decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.RENDERED_BY), engine));
|
|
850
|
-
}
|
|
851
|
-
function uilistmodel(name, props) {
|
|
852
|
-
return (original, propertyKey) => {
|
|
853
|
-
const meta = {
|
|
854
|
-
item: {
|
|
855
|
-
tag: name || original.name,
|
|
856
|
-
props: props
|
|
857
|
-
}
|
|
858
|
-
};
|
|
859
|
-
return decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UILISTMODEL), meta)(original);
|
|
860
|
-
};
|
|
861
|
-
}
|
|
862
|
-
function uihandlers(props) {
|
|
863
|
-
return original => {
|
|
864
|
-
const meta = {
|
|
865
|
-
handlers: props
|
|
866
|
-
};
|
|
867
|
-
return decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.HANDLERS), meta)(original);
|
|
868
|
-
};
|
|
869
|
-
}
|
|
870
|
-
function uilayout(tag, colsMode = 1, rows = 1, props = {}) {
|
|
871
|
-
const config = Object.assign({
|
|
872
|
-
...typeof colsMode === "boolean" ? {
|
|
873
|
-
flexMode: colsMode,
|
|
874
|
-
cols: 1
|
|
875
|
-
} : {
|
|
876
|
-
flexMode: false,
|
|
877
|
-
cols: colsMode
|
|
878
|
-
},
|
|
879
|
-
rows: rows,
|
|
880
|
-
...Object.assign({
|
|
881
|
-
breakpoint: exports.UIMediaBreakPoints.LARGE
|
|
882
|
-
}, props)
|
|
883
|
-
});
|
|
884
|
-
return (original, propertyKey) => {
|
|
885
|
-
decoration.metadata(decoration.Metadata.key(UIKeys.REFLECT, UIKeys.UILAYOUT), config)(original);
|
|
886
|
-
return uimodel(tag, config)(original, propertyKey);
|
|
887
|
-
};
|
|
888
|
-
}
|
|
889
|
-
function uisteppedmodel(tag, pages = 1, paginated = false, props = {}) {
|
|
890
|
-
let pageTitles = [];
|
|
891
|
-
if (typeof pages === "object") {
|
|
892
|
-
pageTitles = pages;
|
|
893
|
-
pages = pageTitles.length;
|
|
894
|
-
}
|
|
895
|
-
return uimodel(tag, {
|
|
896
|
-
pages: pages,
|
|
897
|
-
paginated: paginated,
|
|
898
|
-
pageTitles: pageTitles,
|
|
899
|
-
props: props
|
|
900
|
-
});
|
|
901
|
-
}
|
|
902
|
-
const prototype = decoratorValidation.ModelBuilder.prototype;
|
|
903
|
-
if (!prototype.decorateClass) {
|
|
904
|
-
prototype.decorateClass = function(decorator) {
|
|
905
|
-
if (!this._classDecorators) {
|
|
906
|
-
this._classDecorators = [];
|
|
907
|
-
}
|
|
908
|
-
this._classDecorators.push(decorator);
|
|
909
|
-
return this;
|
|
910
|
-
};
|
|
911
|
-
}
|
|
912
|
-
prototype.uimodel = function(tag, props) {
|
|
913
|
-
return this.decorateClass(uimodel(tag, props));
|
|
914
|
-
};
|
|
915
|
-
prototype.renderedBy = function(engine) {
|
|
916
|
-
return this.decorateClass(renderedBy(engine));
|
|
917
|
-
};
|
|
918
|
-
prototype.uilistmodel = function(name, props) {
|
|
919
|
-
return this.decorateClass(uilistmodel(name, props));
|
|
920
|
-
};
|
|
921
|
-
prototype.uihandlers = function(props) {
|
|
922
|
-
return this.decorateClass(uihandlers(props));
|
|
923
|
-
};
|
|
924
|
-
prototype.uilayout = function(tag, colsMode, rows, props) {
|
|
925
|
-
return this.decorateClass(uilayout(tag, colsMode, rows, props));
|
|
926
|
-
};
|
|
927
|
-
prototype.uisteppedmodel = function(tag, pages, paginated, props) {
|
|
928
|
-
return this.decorateClass(uisteppedmodel(tag, pages, paginated, props));
|
|
929
|
-
};
|
|
930
|
-
exports.DashKeys = void 0;
|
|
931
|
-
(function(DashKeys) {
|
|
932
|
-
DashKeys["ROOT"] = "dashboard";
|
|
933
|
-
DashKeys["COMPONENT"] = "dashboard.component";
|
|
934
|
-
})(exports.DashKeys || (exports.DashKeys = {}));
|
|
935
|
-
const DASH_COMPONENT_REGISTRY = new Set;
|
|
936
|
-
function registerDashComponent(ctor) {
|
|
937
|
-
DASH_COMPONENT_REGISTRY.add(ctor);
|
|
938
|
-
}
|
|
939
|
-
function dashComponents() {
|
|
940
|
-
return [ ...DASH_COMPONENT_REGISTRY ];
|
|
941
|
-
}
|
|
942
|
-
function resetDashComponentRegistry() {
|
|
943
|
-
DASH_COMPONENT_REGISTRY.clear();
|
|
944
|
-
}
|
|
945
|
-
function dashcomponent(tag, dash, props) {
|
|
946
|
-
function dashcomponent(tag, dash, props) {
|
|
947
|
-
const meta = {
|
|
948
|
-
tag: dash?.tag || tag,
|
|
949
|
-
...dash,
|
|
950
|
-
defaultSize: dash?.defaultSize ?? {
|
|
951
|
-
cols: 1,
|
|
952
|
-
rows: 1
|
|
953
|
-
}
|
|
954
|
-
};
|
|
955
|
-
return function innerDashComponent(target) {
|
|
956
|
-
const result = decoration.apply(uimodel(tag, props), decoration.metadata(exports.DashKeys.COMPONENT, meta))(target);
|
|
957
|
-
registerDashComponent(target);
|
|
958
|
-
return result;
|
|
959
|
-
};
|
|
960
|
-
}
|
|
961
|
-
return decoration.Decoration.for(exports.DashKeys.COMPONENT).define({
|
|
962
|
-
decorator: dashcomponent,
|
|
963
|
-
args: [ tag, dash, props ]
|
|
964
|
-
}).apply();
|
|
965
|
-
}
|
|
966
|
-
function resolveModel(model) {
|
|
967
|
-
const resolved = decoration.Metadata.constr(model);
|
|
968
|
-
if (typeof resolved === "function") return resolved;
|
|
969
|
-
const fallback = model.constructor;
|
|
970
|
-
if (typeof fallback === "function") return fallback;
|
|
971
|
-
return model;
|
|
972
|
-
}
|
|
973
|
-
function dashComponentMetadataOf(model) {
|
|
974
|
-
const resolved = resolveModel(model);
|
|
975
|
-
return decoration.Metadata.get(resolved, exports.DashKeys.COMPONENT);
|
|
976
|
-
}
|
|
977
|
-
function dashComponentDefinitionOf(model) {
|
|
978
|
-
const resolved = resolveModel(model);
|
|
979
|
-
const meta = dashComponentMetadataOf(resolved) || {};
|
|
980
|
-
const tag = meta.tag || resolved.name;
|
|
981
|
-
return {
|
|
982
|
-
name: resolved.name,
|
|
983
|
-
tag: tag,
|
|
984
|
-
label: meta.label,
|
|
985
|
-
defaultSize: meta.defaultSize ?? {
|
|
986
|
-
cols: 1,
|
|
987
|
-
rows: 1
|
|
988
|
-
},
|
|
989
|
-
model: meta.model,
|
|
990
|
-
props: meta.props,
|
|
991
|
-
metadata: meta.metadata
|
|
992
|
-
};
|
|
993
|
-
}
|
|
994
|
-
const VERSION = "0.20.7";
|
|
995
|
-
const COMMIT = "f92e8d1";
|
|
996
|
-
const FULL_VERSION = "0.20.7-f92e8d1";
|
|
997
|
-
const PACKAGE_NAME = "@decaf-ts/ui-decorators";
|
|
998
|
-
decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
999
|
-
exports.ActionRoles = ActionRoles;
|
|
1000
|
-
exports.COMMIT = COMMIT;
|
|
1001
|
-
exports.ComponentEventNames = ComponentEventNames;
|
|
1002
|
-
exports.DecafComponent = DecafComponent;
|
|
1003
|
-
exports.DecafEventHandler = DecafEventHandler;
|
|
1004
|
-
exports.DecafTranslateService = DecafTranslateService;
|
|
1005
|
-
exports.ElementPositions = ElementPositions;
|
|
1006
|
-
exports.ElementSizes = ElementSizes;
|
|
1007
|
-
exports.FULL_VERSION = FULL_VERSION;
|
|
1008
|
-
exports.HTML5CheckTypes = HTML5CheckTypes;
|
|
1009
|
-
exports.HTML5DateFormat = HTML5DateFormat;
|
|
1010
|
-
exports.HTML5InputTypes = HTML5InputTypes;
|
|
1011
|
-
exports.LayoutGridGaps = LayoutGridGaps;
|
|
1012
|
-
exports.PACKAGE_NAME = PACKAGE_NAME;
|
|
1013
|
-
exports.RenderingEngine = RenderingEngine;
|
|
1014
|
-
exports.RenderingError = RenderingError;
|
|
1015
|
-
exports.TransactionHooks = TransactionHooks;
|
|
1016
|
-
exports.UIKeys = UIKeys;
|
|
1017
|
-
exports.UIValidator = UIValidator;
|
|
1018
|
-
exports.VERSION = VERSION;
|
|
1019
|
-
exports.ValidatableByAttribute = ValidatableByAttribute;
|
|
1020
|
-
exports.ValidatableByType = ValidatableByType;
|
|
1021
|
-
exports.WindowColorSchemes = WindowColorSchemes;
|
|
1022
|
-
exports.dashComponentDefinitionOf = dashComponentDefinitionOf;
|
|
1023
|
-
exports.dashComponentMetadataOf = dashComponentMetadataOf;
|
|
1024
|
-
exports.dashComponents = dashComponents;
|
|
1025
|
-
exports.dashcomponent = dashcomponent;
|
|
1026
|
-
exports.escapeHtml = escapeHtml;
|
|
1027
|
-
exports.formatByType = formatByType;
|
|
1028
|
-
exports.generateUIModelID = generateUIModelID;
|
|
1029
|
-
exports.getUIAttributeKey = getUIAttributeKey;
|
|
1030
|
-
exports.hidden = hidden;
|
|
1031
|
-
exports.hideFor = hideFor;
|
|
1032
|
-
exports.hideOn = hideOn;
|
|
1033
|
-
exports.isClassConstructor = isClassConstructor;
|
|
1034
|
-
exports.parseToNumber = parseToNumber;
|
|
1035
|
-
exports.parseValueByType = parseValueByType;
|
|
1036
|
-
exports.registerDashComponent = registerDashComponent;
|
|
1037
|
-
exports.renderIf = renderIf;
|
|
1038
|
-
exports.renderedBy = renderedBy;
|
|
1039
|
-
exports.resetDashComponentRegistry = resetDashComponentRegistry;
|
|
1040
|
-
exports.revertHtml = revertHtml;
|
|
1041
|
-
exports.showFor = showFor;
|
|
1042
|
-
exports.uichild = uichild;
|
|
1043
|
-
exports.uielement = uielement;
|
|
1044
|
-
exports.uihandlers = uihandlers;
|
|
1045
|
-
exports.uilayout = uilayout;
|
|
1046
|
-
exports.uilayoutprop = uilayoutprop;
|
|
1047
|
-
exports.uilistmodel = uilistmodel;
|
|
1048
|
-
exports.uilistprop = uilistprop;
|
|
1049
|
-
exports.uimodel = uimodel;
|
|
1050
|
-
exports.uion = uion;
|
|
1051
|
-
exports.uionclick = uionclick;
|
|
1052
|
-
exports.uionrender = uionrender;
|
|
1053
|
-
exports.uiorder = uiorder;
|
|
1054
|
-
exports.uipageprop = uipageprop;
|
|
1055
|
-
exports.uiprop = uiprop;
|
|
1056
|
-
exports.uisteppedmodel = uisteppedmodel;
|
|
1057
|
-
exports.uitablecol = uitablecol;
|
|
1058
|
-
});
|
|
1059
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZGVjb3JhdG9ycy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy91aS9jb25zdGFudHMudHMiLCIuLi9zcmMvdWkvZXJyb3JzLnRzIiwiLi4vc3JjL3VpL3V0aWxzLnRzIiwiLi4vc3JjL3VpL1JlbmRlcmluZy50cyIsIi4uL3NyYy91aS9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL3VpL1VJVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3VpL0RlY2FmQ29tcG9uZW50LnRzIiwiLi4vc3JjL3VpL0RlY2FmRXZlbnRIYW5kbGVyLnRzIiwiLi4vc3JjL3VpL0RlY2FmVHJhbnNsYXRlU2VydmljZS50cyIsIi4uL3NyYy9tb2RlbC9vdmVycmlkZXMudHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9vdmVycmlkZXMvTW9kZWxCdWlsZGVyRXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9kYXNoYm9hcmQvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Rhc2hib2FyZC9yZWdpc3RyeS50cyIsIi4uL3NyYy9kYXNoYm9hcmQvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9kYXNoYm9hcmQvcmVhZGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyBhbmQgZW51bXMgZm9yIFVJIHJlbmRlcmluZyBhbmQgdmFsaWRhdGlvblxuICogQHN1bW1hcnkgRGVmaW5lcyBrZXlzLCBtYXBwaW5ncywgYW5kIEhUTUw1IGlucHV0IHR5cGVzIGZvciBVSSBjb21wb25lbnRzXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjb25zdGFudHMgdXNlZCB0aHJvdWdob3V0IHRoZSBVSSBkZWNvcmF0b3JzIGxpYnJhcnkgZm9yXG4gKiByZW5kZXJpbmcsIHZhbGlkYXRpb24sIGFuZCBIVE1MIGVsZW1lbnQgZ2VuZXJhdGlvbi5cbiAqIEBtb2R1bGUgdWkvY29uc3RhbnRzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuXG5pbXBvcnQge1xuICBEYXRlVmFsaWRhdG9yLFxuICBEaWZmVmFsaWRhdG9yLFxuICBFbWFpbFZhbGlkYXRvcixcbiAgRXF1YWxzVmFsaWRhdG9yLFxuICBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IsXG4gIEdyZWF0ZXJUaGFuVmFsaWRhdG9yLFxuICBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3IsXG4gIExlc3NUaGFuVmFsaWRhdG9yLFxuICBNYXhMZW5ndGhWYWxpZGF0b3IsXG4gIE1heFZhbGlkYXRvcixcbiAgTWluTGVuZ3RoVmFsaWRhdG9yLFxuICBNaW5WYWxpZGF0b3IsXG4gIFBhc3N3b3JkVmFsaWRhdG9yLFxuICBQYXR0ZXJuVmFsaWRhdG9yLFxuICBSZXF1aXJlZFZhbGlkYXRvcixcbiAgU3RlcFZhbGlkYXRvcixcbiAgVVJMVmFsaWRhdG9yLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgZW51bSBVSU1lZGlhQnJlYWtQb2ludHMge1xuICBTTUFMTCA9IFwic21hbGxcIixcbiAgTUVESVVNID0gXCJtZWRpdW1cIixcbiAgTEFSR0UgPSBcImxhcmdlXCIsXG4gIFhMQVJHRSA9IFwieGxhcmdlXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleSBjb25zdGFudHMgdXNlZCBmb3IgVUkgbWV0YWRhdGEgYW5kIHJlbmRlcmluZ1xuICogQHN1bW1hcnkgQ29sbGVjdGlvbiBvZiBzdHJpbmcgY29uc3RhbnRzIHVzZWQgYXMga2V5cyBmb3IgVUktcmVsYXRlZCBtZXRhZGF0YVxuICogVGhlc2Uga2V5cyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSByZWxhdGVkIHRvXG4gKiBVSSBtb2RlbHMsIGVsZW1lbnRzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsaWRhdGlvbiBydWxlcy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVSUtleXNUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCAtIEJhc2UgcmVmbGVjdGlvbiBrZXkgZm9yIFVJIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlNT0RFTCAtIEtleSBmb3IgVUkgbW9kZWwgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRU5ERVJFRF9CWSAtIEtleSBmb3Igc3BlY2lmeWluZyByZW5kZXJpbmcgZW5naW5lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRUxFTUVOVCAtIEtleSBmb3IgZWxlbWVudCBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBST1AgLSBLZXkgZm9yIHByb3BlcnR5IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTkFNRSAtIEtleSBmb3IgbmFtZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOQU1FX1BSRUZJWCAtIFByZWZpeCBmb3IgaW5wdXQgbmFtZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDVVNUT01fUFJPUFMgLSBLZXkgZm9yIGN1c3RvbSB2YWxpZGF0aW9uIHByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVSUxJU1RNT0RFTCAtIEtleSBmb3IgbGlzdCBpdGVtIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlMSVNUUFJPUCAtIEtleSBmb3IgbGlzdCBwcm9wZXJ0eSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgLSBLZXkgZm9yIHR5cGUgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVUJfVFlQRSAtIEtleSBmb3Igc3VidHlwZSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhJRERFTiAtIEtleSBmb3IgaGlkZGVuIGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZPUk1BVCAtIEtleSBmb3IgZm9ybWF0IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRF9PTkxZIC0gS2V5IGZvciByZWFkb25seSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCAtIEtleSBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTiAtIEtleSBmb3IgbWluaW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOX0xFTkdUSCAtIEtleSBmb3IgbWluaW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWCAtIEtleSBmb3IgbWF4aW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCAtIEtleSBmb3IgbWF4aW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBVFRFUk4gLSBLZXkgZm9yIHBhdHRlcm4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCAtIEtleSBmb3IgVVJMIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIC0gS2V5IGZvciBzdGVwIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIC0gS2V5IGZvciBkYXRlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCAtIEtleSBmb3IgZW1haWwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIC0gS2V5IGZvciBwYXNzd29yZCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUxTIC0gS2V5IGZvciBlcXVhbGl0eSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRiAtIEtleSBmb3IgZGlmZmVyZW5jZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOIC0gS2V5IGZvciBsZXNzIHRoYW4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IExFU1NfVEhBTl9PUl9FUVVBTCAtIEtleSBmb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU4gLSBLZXkgZm9yIGdyZWF0ZXIgdGhhbiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gR1JFQVRFUl9USEFOX09SX0VRVUFMIC0gS2V5IGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvblxuICpcbiAqIEBjb25zdCBVSUtleXNcbiAqIEB0eXBlIHtVSUtleXNUeXBlfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFVJS2V5cyA9IHtcbiAgUkVGTEVDVDogYHVpYCxcbiAgVUlNT0RFTDogXCJ1aW1vZGVsXCIsXG4gIFJFTkRFUkVEX0JZOiBcInJlbmRlcmVkLWJ5XCIsXG4gIEVMRU1FTlQ6IFwidWllbGVtZW50XCIsXG4gIFBST1A6IFwidWlwcm9wXCIsXG4gIENISUxEOiBcInVpY2hpbGRcIixcbiAgTkFNRTogXCJuYW1lXCIsXG4gIE5BTUVfUFJFRklYOiBcImlucHV0LVwiLFxuICBWQUxJREFUSU9OX01FU1NBR0U6IFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcblxuICBVSUxJU1RNT0RFTDogXCJ1aWxpc3Rtb2RlbFwiLFxuICBVSUxJU1RQUk9QOiBcInVpbGlzdHByb3BcIixcbiAgVUlMQVlPVVQ6IFwidWlsYXlvdXRcIixcbiAgVUlMQVlPVVRQUk9QOiBcInVpbGF5b3V0cHJvcFwiLFxuICBIQU5ETEVSUzogXCJoYW5kbGVyc1wiLFxuXG4gIFRZUEU6IFwidHlwZVwiLFxuICBTVUJfVFlQRTogXCJzdWJUeXBlXCIsXG5cbiAgSElEREVOOiBcImhpZGRlblwiLFxuICBISURFX0ZPUjogXCJoaWRlLWZvclwiLFxuICBTSE9XX0ZPUjogXCJzaG93LWZvclwiLFxuICBSRU5ERVJfSUY6IFwicmVuZGVyLWlmXCIsXG4gIEZPUk1BVDogXCJmb3JtYXRcIixcbiAgT1JERVI6IFwib3JkZXJcIixcbiAgUEFHRTogXCJwYWdlXCIsXG4gIEVWRU5UUzogXCJldmVudHNcIixcblxuICBGSVJTVDogXCJmaXJzdFwiLFxuICBMQVNUOiBcImxhc3RcIixcblxuICBSRUFEX09OTFk6IFwicmVhZG9ubHlcIixcbiAgU0VRVUVOQ0U6IFwic2VxdWVuY2VcIixcbiAgUkVRVUlSRUQ6IFZhbGlkYXRpb25LZXlzLlJFUVVJUkVELFxuICBNSU46IFZhbGlkYXRpb25LZXlzLk1JTixcbiAgTUlOX0xFTkdUSDogVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSCxcbiAgTUFYOiBWYWxpZGF0aW9uS2V5cy5NQVgsXG4gIE1BWF9MRU5HVEg6IFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gIFBBVFRFUk46IFZhbGlkYXRpb25LZXlzLlBBVFRFUk4sXG4gIFVSTDogVmFsaWRhdGlvbktleXMuVVJMLFxuICBTVEVQOiBWYWxpZGF0aW9uS2V5cy5TVEVQLFxuICBEQVRFOiBWYWxpZGF0aW9uS2V5cy5EQVRFLFxuICBFTUFJTDogVmFsaWRhdGlvbktleXMuRU1BSUwsXG4gIFBBU1NXT1JEOiBWYWxpZGF0aW9uS2V5cy5QQVNTV09SRCxcbiAgRVFVQUxTOiBWYWxpZGF0aW9uS2V5cy5FUVVBTFMsXG4gIERJRkY6IFZhbGlkYXRpb25LZXlzLkRJRkYsXG4gIExFU1NfVEhBTjogVmFsaWRhdGlvbktleXMuTEVTU19USEFOLFxuICBMRVNTX1RIQU5fT1JfRVFVQUw6IFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTCxcbiAgR1JFQVRFUl9USEFOOiBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU4sXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTDogVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBpbnB1dCB0eXBlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhbGlkYXRvcnNcbiAqIEBzdW1tYXJ5IE1hcHMgc3BlY2lhbCBpbnB1dCB0eXBlcyB0byB0aGVpciB2YWxpZGF0b3IgY2xhc3Nlc1xuICogVGhpcyBjb25zdGFudCBtYXBzIGlucHV0IHR5cGVzIGxpa2UgZW1haWwsIFVSTCwgZGF0ZSwgYW5kIHBhc3N3b3JkIHRvIHRoZWlyXG4gKiBjb3JyZXNwb25kaW5nIHZhbGlkYXRvciBjbGFzc2VzIGZyb20gdGhlIGRlY29yYXRvci12YWxpZGF0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYge09iamVjdC48c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+Pn0gVmFsaWRhdGFibGVCeVR5cGVNYXBcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RW1haWxWYWxpZGF0b3I+fSBlbWFpbCAtIFZhbGlkYXRvciBmb3IgZW1haWwgaW5wdXRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFVSTFZhbGlkYXRvcj59IHVybCAtIFZhbGlkYXRvciBmb3IgVVJMIGlucHV0c1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxEYXRlVmFsaWRhdG9yPn0gZGF0ZSAtIFZhbGlkYXRvciBmb3IgZGF0ZSBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8UGFzc3dvcmRWYWxpZGF0b3I+fSBwYXNzd29yZCAtIFZhbGlkYXRvciBmb3IgcGFzc3dvcmQgaW5wdXRzXG4gKlxuICogQGNvbnN0IFZhbGlkYXRhYmxlQnlUeXBlXG4gKiBAdHlwZSB7VmFsaWRhdGFibGVCeVR5cGVNYXB9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVmFsaWRhdGFibGVCeVR5cGU6IFJlY29yZDxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+ID0ge1xuICBbVUlLZXlzLkVNQUlMXTogRW1haWxWYWxpZGF0b3IsXG4gIFtVSUtleXMuVVJMXTogVVJMVmFsaWRhdG9yLFxuICBbVUlLZXlzLkRBVEVdOiBEYXRlVmFsaWRhdG9yLFxuICBbVUlLZXlzLlBBU1NXT1JEXTogUGFzc3dvcmRWYWxpZGF0b3IsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIHZhbGlkYXRpb24gYXR0cmlidXRlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhbGlkYXRvcnNcbiAqIEBzdW1tYXJ5IE1hcHMgSFRNTCB2YWxpZGF0aW9uIGF0dHJpYnV0ZXMgdG8gdGhlaXIgdmFsaWRhdG9yIGNsYXNzZXNcbiAqIFRoaXMgY29uc3RhbnQgbWFwcyBIVE1MIHZhbGlkYXRpb24gYXR0cmlidXRlcyBsaWtlIHJlcXVpcmVkLCBtaW4sIG1heCwgcGF0dGVybiwgZXRjLlxuICogdG8gdGhlaXIgY29ycmVzcG9uZGluZyB2YWxpZGF0b3IgY2xhc3NlcyBmcm9tIHRoZSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3QuPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj59IFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGVNYXBcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8UmVxdWlyZWRWYWxpZGF0b3I+fSByZXF1aXJlZCAtIFZhbGlkYXRvciBmb3IgcmVxdWlyZWQgZmllbGRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1pblZhbGlkYXRvcj59IG1pbiAtIFZhbGlkYXRvciBmb3IgbWluaW11bSB2YWx1ZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNYXhWYWxpZGF0b3I+fSBtYXggLSBWYWxpZGF0b3IgZm9yIG1heGltdW0gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8U3RlcFZhbGlkYXRvcj59IHN0ZXAgLSBWYWxpZGF0b3IgZm9yIHN0ZXAgdmFsdWVcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWluTGVuZ3RoVmFsaWRhdG9yPn0gbWlubGVuZ3RoIC0gVmFsaWRhdG9yIGZvciBtaW5pbXVtIGxlbmd0aFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNYXhMZW5ndGhWYWxpZGF0b3I+fSBtYXhsZW5ndGggLSBWYWxpZGF0b3IgZm9yIG1heGltdW0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFBhdHRlcm5WYWxpZGF0b3I+fSBwYXR0ZXJuIC0gVmFsaWRhdG9yIGZvciByZWdleCBwYXR0ZXJuXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEVxdWFsc1ZhbGlkYXRvcj59IGVxdWFscyAtIFZhbGlkYXRvciBmb3IgZXF1YWxpdHlcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RGlmZlZhbGlkYXRvcj59IGRpZmYgLSBWYWxpZGF0b3IgZm9yIGRpZmZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TGVzc1RoYW5WYWxpZGF0b3I+fSBsZXNzdGhhbiAtIFZhbGlkYXRvciBmb3IgbGVzcyB0aGFuIGNvbXBhcmlzb25cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yPn0gbGVzc3RoYW5vcmVxdWFsIC0gVmFsaWRhdG9yIGZvciBsZXNzIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxHcmVhdGVyVGhhblZhbGlkYXRvcj59IGdyZWF0ZXJ0aGFuIC0gVmFsaWRhdG9yIGZvciBncmVhdGVyIHRoYW4gY29tcGFyaXNvblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3I+fSBncmVhdGVydGhhbm9yZXF1YWwgLSBWYWxpZGF0b3IgZm9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uXG4gKlxuICogQGNvbnN0IFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGVcbiAqIEB0eXBlIHtWYWxpZGF0YWJsZUJ5QXR0cmlidXRlTWFwfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGU6IFJlY29yZDxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+ID0ge1xuICBbVUlLZXlzLlJFUVVJUkVEXTogUmVxdWlyZWRWYWxpZGF0b3IsXG4gIFtVSUtleXMuTUlOXTogTWluVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1BWF06IE1heFZhbGlkYXRvcixcbiAgW1VJS2V5cy5TVEVQXTogU3RlcFZhbGlkYXRvcixcbiAgW1VJS2V5cy5NSU5fTEVOR1RIXTogTWluTGVuZ3RoVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1BWF9MRU5HVEhdOiBNYXhMZW5ndGhWYWxpZGF0b3IsXG4gIFtVSUtleXMuUEFUVEVSTl06IFBhdHRlcm5WYWxpZGF0b3IsXG4gIFtVSUtleXMuRVFVQUxTXTogRXF1YWxzVmFsaWRhdG9yLFxuICBbVUlLZXlzLkRJRkZdOiBEaWZmVmFsaWRhdG9yLFxuICBbVUlLZXlzLkxFU1NfVEhBTl06IExlc3NUaGFuVmFsaWRhdG9yLFxuICBbVUlLZXlzLkxFU1NfVEhBTl9PUl9FUVVBTF06IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgW1VJS2V5cy5HUkVBVEVSX1RIQU5dOiBHcmVhdGVyVGhhblZhbGlkYXRvcixcbiAgW1VJS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdOiBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGFuZGFyZCBkYXRlIGZvcm1hdCBzdHJpbmcgZm9yIEhUTUw1IGRhdGUgaW5wdXRzXG4gKiBAc3VtbWFyeSBGb3JtYXQgc3RyaW5nIGZvciBIVE1MNSBkYXRlIGlucHV0cyAoeXl5eS1NTS1kZClcbiAqIFRoaXMgY29uc3RhbnQgZGVmaW5lcyB0aGUgc3RhbmRhcmQgZGF0ZSBmb3JtYXQgc3RyaW5nIHVzZWQgZm9yIEhUTUw1IGRhdGUgaW5wdXRzLlxuICpcbiAqIEBjb25zdCBIVE1MNURhdGVGb3JtYXRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVEYXRlRm9ybWF0ID0gXCJ5eXl5LU1NLWRkXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbGxlY3Rpb24gb2YgSFRNTDUgaW5wdXQgdHlwZSB2YWx1ZXNcbiAqIEBzdW1tYXJ5IE1hcHMgaW5wdXQgdHlwZSBjb25zdGFudHMgdG8gdGhlaXIgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzXG4gKiBUaGlzIGNvbnN0YW50IHByb3ZpZGVzIGEgbWFwcGluZyBvZiBpbnB1dCB0eXBlIGNvbnN0YW50cyB0byB0aGVpciBjb3JyZXNwb25kaW5nXG4gKiBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIHVzZSBpbiBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEhUTUw1SW5wdXRUeXBlc01hcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJVVFRPTiAtIEJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ0hFQ0tCT1ggLSBDaGVja2JveCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ09MT1IgLSBDb2xvciBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEUgLSBEYXRlIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURVRJTUVfTE9DQUwgLSBMb2NhbCBkYXRldGltZSBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIC0gRW1haWwgaW5wdXQgdHlwZSB3aXRoIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBGSUxFIC0gRmlsZSB1cGxvYWQgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhJRERFTiAtIEhpZGRlbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU1BR0UgLSBJbWFnZSBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9OVEggLSBNb250aCBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTUJFUiAtIE51bWVyaWMgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIC0gUGFzc3dvcmQgaW5wdXQgdHlwZSB3aXRoIG1hc2tlZCB0ZXh0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkFESU8gLSBSYWRpbyBidXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJBTkdFIC0gUmFuZ2Ugc2xpZGVyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVNFVCAtIEZvcm0gcmVzZXQgYnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRUFSQ0ggLSBTZWFyY2ggaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNVQk1JVCAtIEZvcm0gc3VibWl0IGJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVEVMIC0gVGVsZXBob25lIG51bWJlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVEVYVCAtIEJhc2ljIHRleHQgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRJTUUgLSBUaW1lIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVVJMIC0gVVJMIGlucHV0IHR5cGUgd2l0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gV0VFSyAtIFdlZWsgcGlja2VyIGlucHV0IHR5cGVcbiAqXG4gKiBAY29uc3QgSFRNTDVJbnB1dFR5cGVzXG4gKiBAdHlwZSB7SFRNTDVJbnB1dFR5cGVzTWFwfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEhUTUw1SW5wdXRUeXBlcyA9IHtcbiAgQlVUVE9OOiBcImJ1dHRvblwiLFxuICBDSEVDS0JPWDogXCJjaGVja2JveFwiLFxuICBDT0xPUjogXCJjb2xvclwiLFxuICBEQVRFOiBVSUtleXMuREFURSxcbiAgREFURVRJTUVfTE9DQUw6IFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgRU1BSUw6IFVJS2V5cy5FTUFJTCxcbiAgRklMRTogXCJmaWxlXCIsXG4gIEhJRERFTjogXCJoaWRkZW5cIixcbiAgSU1BR0U6IFwiaW1hZ2VcIixcbiAgTU9OVEg6IFwibW9udGhcIixcbiAgTlVNQkVSOiBcIm51bWJlclwiLFxuICBQQVNTV09SRDogVUlLZXlzLlBBU1NXT1JELFxuICBSQURJTzogXCJyYWRpb1wiLFxuICBSQU5HRTogXCJyYW5nZVwiLFxuICBSRVNFVDogXCJyZXNldFwiLFxuICBTRUFSQ0g6IFwic2VhcmNoXCIsXG4gIFNVQk1JVDogXCJzdWJtaXRcIixcbiAgVEVMOiBcInRlbFwiLFxuICBURVhUOiBcInRleHRcIixcbiAgVEVYVEFSRUE6IFwidGV4dGFyZWFcIixcbiAgU0VMRUNUOiBcInNlbGVjdFwiLFxuICBUSU1FOiBcInRpbWVcIixcbiAgVVJMOiBVSUtleXMuVVJMLFxuICBXRUVLOiBcIndlZWtcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIEhUTUw1IGlucHV0IHR5cGVzIHRoYXQgdXNlIGNoZWNrYm94ZXNcbiAqIEBzdW1tYXJ5IExpc3Qgb2YgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnQgY2hlY2thYmxlIGNvbnRyb2xzXG4gKiBUaGlzIGNvbnN0YW50IGRlZmluZXMgYW4gYXJyYXkgb2YgSFRNTDUgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnRcbiAqIGNoZWNrYWJsZSBjb250cm9scyAoY2hlY2tib3ggYW5kIHJhZGlvKS5cbiAqXG4gKiBAY29uc3QgSFRNTDVDaGVja1R5cGVzXG4gKiBAdHlwZSB7c3RyaW5nW119XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVDaGVja1R5cGVzOiBzdHJpbmdbXSA9IFtcbiAgSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YLFxuICBIVE1MNUlucHV0VHlwZXMuUkFESU8sXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFdmVudCBuYW1lIGNvbnN0YW50cy5cbiAqIEBzdW1tYXJ5IENvbnRhaW5zIGNvbnN0YW50cyBmb3Igc3RhbmRhcmRpemVkIGV2ZW50IG5hbWVzIHVzZWQgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKiBUaGVzZSBjb25zdGFudHMgZW5zdXJlIGNvbnNpc3RlbnQgZXZlbnQgbmFtaW5nIGFjcm9zcyBjb21wb25lbnRzIGFuZCBtYWtlIGl0IGVhc2llciB0b1xuICogdHJhY2sgYW5kIGhhbmRsZSBldmVudHMuIEVhY2ggY29uc3RhbnQgcmVwcmVzZW50cyBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIGV2ZW50IHR5cGUuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb21wb25lbnRFdmVudE5hbWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQmFja0J1dHRvbkNsaWNrRXZlbnQgLSBFdmVudCBmaXJlZCB3aGVuIGJhY2sgYnV0dG9uIG5hdmlnYXRpb24gZW5kc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFJlbmRlciAtIEV2ZW50IGFmdGVyIGNvbXBvbmVudCBpbml0aWFsaXplIGFjdGlvbiBvY2N1cnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSZWZyZXNoIC0gRXZlbnQgZmlyZWQgd2hlbiBhIHJlZnJlc2ggYWN0aW9uIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IENsaWNrIC0gRXZlbnQgZmlyZWQgd2hlbiBhIGNsaWNrIGFjdGlvbiBvY2N1cnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDaGFuZ2UgLSBFdmVudCBmaXJlZCB3aGVuIGEgY2hhbmdlIGFjdGlvbiBvY2N1cnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTdWJtaXQgLSBFdmVudCBmaXJlZCB3aGVuIGEgZm9ybSBzdWJtaXNzaW9uIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFZhbGlkYXRpb25FcnJvciAtIEV2ZW50IGZpcmVkIHdoZW4gYSB2YWxpZGF0aW9uIGVycm9yIG9jY3Vyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFRoZW1lQ2hhbmdlIC0gRXZlbnQgZmlyZWQgd2hlbiBhIHRoZW1lIGNoYW5nZSBvY2N1cnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBGb3JtR3JvdXBMb2FkZWQgLSBFdmVudCBmaXJlZCB3aGVuIGEgcmVhY3R2ZSBmb3JtIGdyb3VwIGlzIGxvYWRlZFxuICogQGNvbnN0IENvbXBvbmVudEV2ZW50TmFtZXNcbiAqL1xuZXhwb3J0IGNvbnN0IENvbXBvbmVudEV2ZW50TmFtZXMgPSB7XG4gIFJlbmRlcjogXCJyZW5kZXJcIixcbiAgQmFja0J1dHRvbkNsaWNrRXZlbnQ6IFwiYmFja0J1dHRvbk5hdmlnYXRpb25FbmRFdmVudFwiLFxuICBSZWZyZXNoOiBcIlJlZnJlc2hFdmVudFwiLFxuICBDbGljazogXCJDbGlja0V2ZW50XCIsXG4gIENoYW5nZTogXCJDaGFuZ2VFdmVudFwiLFxuICBTdWJtaXQ6IFwiU3VibWl0RXZlbnRcIixcbiAgVmFsaWRhdGlvbkVycm9yOiBcInZhbGlkYXRpb25FcnJvckV2ZW50XCIsXG4gIFRoZW1lQ2hhbmdlOiBcInRoZW1lQ2hhbmdlRXZlbnRcIixcbiAgRm9ybUdyb3VwTG9hZGVkOiBcImZvcm1Hcm91cExvYWRlZEV2ZW50XCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMaWZlY3ljbGUgaG9vayBsYWJlbHMgZm9yIHJlcG9zaXRvcnkgdHJhbnNhY3Rpb25zLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgY2Fub25pY2FsIG5hbWVzIGZvciBDUlVEIGxpZmVjeWNsZSBjYWxsYmFja3Mgc28gZGVjb3JhdG9ycyBhbmRcbiAqIGNvbXBvbmVudHMgY2FuIHJlZ2lzdGVyIHdvcmsgYmVmb3JlIG9yIGFmdGVyIHJlcG9zaXRvcnkgb3BlcmF0aW9ucyBpbiBhIGNvbnNpc3RlbnQgd2F5LlxuICogRWFjaCBrZXkgbWFwcyB0byB0aGUgc3RyaW5nIHVzZWQgd2hlbiB3aXJpbmcgdHJhbnNhY3Rpb24gbWlkZGxld2FyZS5cbiAqIEBjb25zdCBUcmFuc2FjdGlvbkhvb2tzXG4gKi9cbmV4cG9ydCBjb25zdCBUcmFuc2FjdGlvbkhvb2tzID0ge1xuICBCZWZvcmVSZWFkOiBcImJlZm9yZVJlYWRcIixcbiAgQWZ0ZXJSZWFkOiBcImFmdGVyUmVhZFwiLFxuICBCZWZvcmVDcmVhdGU6IFwiYmVmb3JlQ3JlYXRlXCIsXG4gIEFmdGVyQ3JlYXRlOiBcImFmdGVyQ3JlYXRlXCIsXG4gIEJlZm9yZVVwZGF0ZTogXCJiZWZvcmVVcGRhdGVcIixcbiAgQWZ0ZXJVcGRhdGU6IFwiYWZ0ZXJVcGRhdGVcIixcbiAgQmVmb3JlRGVsZXRlOiBcImJlZm9yZURlbGV0ZVwiLFxuICBBZnRlckRlbGV0ZTogXCJhZnRlckRlbGV0ZVwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhbmRhcmRpemVkIHNpemUgdG9rZW5zIGZvciBVSSBlbGVtZW50cy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHNlbWFudGljIHNpemUga2V5d29yZHMgc3VwcG9ydGVkIGJ5IGxheW91dCBhbmQgZm9ybSBkZWNvcmF0b3JzLlxuICogVGhlc2UgdmFsdWVzIGZlZWQgcmVuZGVyaW5nIGVuZ2luZXMgc28gY29tcG9uZW50cyBjYW4gZXhwcmVzcyBzaXppbmcgaW4gYSB1bmlmb3JtIHZvY2FidWxhcnkuXG4gKiBAY29uc3QgRWxlbWVudFNpemVzXG4gKi9cbmV4cG9ydCBjb25zdCBFbGVtZW50U2l6ZXMgPSB7XG4gIHhzbWFsbDogXCJ4c21hbGxcIixcbiAgc21hbGw6IFwic21hbGxcIixcbiAgbWVkaXVtOiBcIm1lZGl1bVwiLFxuICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgbGFyZ2U6IFwibGFyZ2VcIixcbiAgeExhcmdlOiBcInhsYXJnZVwiLFxuICBcIjJ4TGFyZ2VcIjogXCIyeGxhcmdlXCIsXG4gIGF1dG86IFwiYXV0b1wiLFxuICBleHBhbmQ6IFwiZXhwYW5kXCIsXG4gIGJsb2NrOiBcImJsb2NrXCIsXG4gIGhhbGY6IFwiaGFsZlwiLFxuICBmdWxsOiBcImZ1bGxcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFsaWdubWVudCBrZXl3b3JkcyBmb3IgZWxlbWVudCBwb3NpdGlvbmluZy5cbiAqIEBzdW1tYXJ5IFN1cHBsaWVzIGNhbm9uaWNhbCBwb3NpdGlvbiB2YWx1ZXMgKGhvcml6b250YWwgYW5kIHZlcnRpY2FsKSB0aGF0IGRlY29yYXRvcnMgY2FuXG4gKiB1c2Ugd2hlbiBhbGlnbmluZyBsYWJlbHMsIGNvbnRyb2xzLCBvciBoZWxwZXIgdGV4dCBhY3Jvc3MgY29tcG9uZW50cy5cbiAqIEBjb25zdCBFbGVtZW50UG9zaXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBFbGVtZW50UG9zaXRpb25zID0ge1xuICBsZWZ0OiBcImxlZnRcIixcbiAgY2VudGVyOiBcImNlbnRlclwiLFxuICByaWdodDogXCJyaWdodFwiLFxuICB0b3A6IFwidG9wXCIsXG4gIGJvdHRvbTogXCJib3R0b21cIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdyaWQgc3BhY2luZyBwcmVzZXRzIGZvciBsYXlvdXQgZGVjb3JhdG9ycy5cbiAqIEBzdW1tYXJ5IE1hcHMgaHVtYW4tcmVhZGFibGUgZ2FwIHNpemVzIHRvIHRoZSB0b2tlbnMgaW50ZXJwcmV0ZWQgYnkgdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAqIHdoZW4gYnVpbGRpbmcgQ1NTIGdyaWQgbGF5b3V0cywgZW5hYmxpbmcgcHJlZGljdGFibGUgc3BhY2luZyBhY3Jvc3MgY29tcG9uZW50cy5cbiAqIEBjb25zdCBMYXlvdXRHcmlkR2Fwc1xuICovXG5leHBvcnQgY29uc3QgTGF5b3V0R3JpZEdhcHMgPSB7XG4gIHNtYWxsOiBcInNtYWxsXCIsXG4gIG1lZGl1bTogXCJtZWRpdW1cIixcbiAgbGFyZ2U6IFwibGFyZ2VcIixcbiAgY29sbGFwc2U6IFwiY29sbGFwc2VcIixcbiAgbm9uZTogXCJcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhbm9uaWNhbCBhY3Rpb24gcm9sZSBpZGVudGlmaWVycyBmb3IgVUkgY29udHJvbHMuXG4gKiBAc3VtbWFyeSBFbnVtZXJhdGVzIHRoZSBzZW1hbnRpYyByb2xlcyBhIGJ1dHRvbiBvciBhY3Rpb24gbWF5IHJlcHJlc2VudCBzbyBkZWNvcmF0b3JzIGFuZFxuICogcmVuZGVyZXJzIGNhbiBhdHRhY2ggY29uc2lzdGVudCBiZWhhdmlvcnMgYW5kIHN0eWxpbmcgKGluY2x1ZGluZyBDUlVEIHZlcmJzIHRpZWQgdG9cbiAqIGBPcGVyYXRpb25LZXlzYCkuXG4gKiBAY29uc3QgQWN0aW9uUm9sZXNcbiAqL1xuZXhwb3J0IGNvbnN0IEFjdGlvblJvbGVzID0ge1xuICBjYW5jZWw6IFwiY2FuY2VsXCIsXG4gIGNvbmZpcm06IFwiY29uZmlybVwiLFxuICBzdWJtaXQ6IFwic3VibWl0XCIsXG4gIGNsZWFyOiBcImNsZWFyXCIsXG4gIGJhY2s6IFwiYmFja1wiLFxuICBbT3BlcmF0aW9uS2V5cy5DUkVBVEVdOiBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgW09wZXJhdGlvbktleXMuUkVBRF06IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgW09wZXJhdGlvbktleXMuVVBEQVRFXTogT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gIFtPcGVyYXRpb25LZXlzLkRFTEVURV06IE9wZXJhdGlvbktleXMuREVMRVRFLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWxsb3dlZCBjb2xvciBzY2hlbWUgdG9rZW5zIGZvciB3aW5kb3dlZCBzdXJmYWNlcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBzdXBwb3J0ZWQgdGhlbWUgaWRlbnRpZmllcnMgZXhwb3NlZCB0byBjb25zdW1pbmcgYXBwcyBzbyB0aGV5XG4gKiBjYW4gdGFyZ2V0IGxpZ2h0LCBkYXJrLCBvciB1bnNldCB3aW5kb3cgY29sb3Igc2NoZW1lcyBpbiBhIHByZWRpY3RhYmxlIHdheS5cbiAqIEBjb25zdCBXaW5kb3dDb2xvclNjaGVtZXNcbiAqL1xuZXhwb3J0IGNvbnN0IFdpbmRvd0NvbG9yU2NoZW1lcyA9IHtcbiAgbGlnaHQ6IFwibGlnaHRcIixcbiAgZGFyazogXCJkYXJrXCIsXG4gIHVuZGVmaW5lZDogXCJ1bmRlZmluZWRcIixcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgcmVuZGVyaW5nIG9wZXJhdGlvbiBmYWlsc1xuICogQHN1bW1hcnkgU3BlY2lhbGl6ZWQgZXJyb3IgZm9yIHJlbmRlcmluZyBmYWlsdXJlcyBpbiBVSSBjb21wb25lbnRzXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSByZW5kZXJpbmcgZW5naW5lIGVuY291bnRlcnMgYW4gZXJyb3Igd2hpbGVcbiAqIGF0dGVtcHRpbmcgdG8gcmVuZGVyIGEgVUkgY29tcG9uZW50IG9yIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3Igb3JpZ2luYWwgZXJyb3JcbiAqXG4gKiBAY2xhc3MgUmVuZGVyaW5nRXJyb3JcbiAqIEBleHRlbmRzIEJhc2VFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvd2luZyBhIHJlbmRlcmluZyBlcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUmVuZGVyaW5nIGNvZGUgdGhhdCBtaWdodCBmYWlsXG4gKiAgIGlmICghY29tcG9uZW50LmNhblJlbmRlcigpKSB7XG4gKiAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKCdDb21wb25lbnQgY2Fubm90IGJlIHJlbmRlcmVkJyk7XG4gKiAgIH1cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoJ1JlbmRlcmluZyBmYWlsZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJpbmdFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgUmVuZGVyaW5nRXJyb3IgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGVycm9yIHdpdGggYSBtZXNzYWdlIG9yIG9yaWdpbmFsIGVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3Igb3JpZ2luYWwgZXJyb3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFJlbmRlcmluZ0Vycm9yLm5hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBmb3JtYXREYXRlLFxuICBNb2RlbCxcbiAgcGFyc2VEYXRlLFxuICBSZXNlcnZlZE1vZGVscyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSFRNTDVEYXRlRm9ybWF0LCBIVE1MNUlucHV0VHlwZXMsIFVJS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRmllbGRQcm9wZXJ0aWVzLCBVSUZ1bmN0aW9uTGlrZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgRGVjb3JhdGlvbktleXMsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICpcbiAqIFR5cGUgZ3VhcmQgdGhhdCB2ZXJpZmllcyBpZiBhIHByb3ZpZGVkIFVJIGZ1bmN0aW9uLWxpa2UgdmFsdWUgaXMgYSBjbGFzcyBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ2xhc3NDb25zdHJ1Y3RvciA9IDxDPihcbiAgZm46IFVJRnVuY3Rpb25MaWtlIHwgQ29uc3RydWN0b3I8Qz5cbik6IGZuIGlzIENvbnN0cnVjdG9yPEM+ID0+IHtcbiAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiICYmIC9eY2xhc3NcXHMvLnRlc3QoU3RyaW5nKGZuKSk7XG59O1xuXG4vKipcbiAqIERlcml2ZXMgdGhlIG1ldGFkYXRhIGtleSBmb3IgYSBVSSBhdHRyaWJ1dGUgb24gYSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHByb3AgLSBQcm9wZXJ0eSBuYW1lIGRlY29yYXRlZCBvbiB0aGUgVUkgbW9kZWwuXG4gKiBAcGFyYW0ga2V5IC0gQXR0cmlidXRlIGlkZW50aWZpZXIgc3RvcmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIEZ1bGx5IHF1YWxpZmllZCBtZXRhZGF0YSBrZXkgc2NvcGVkIHRvIGBVSUtleXMuUkVGTEVDVGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVSUF0dHJpYnV0ZUtleShwcm9wOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gIHJldHVybiBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMsIHByb3AsIGtleSk7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uIGZvcm1hdEJ5VHlwZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QnlUeXBlKFxuICB0eXBlOiBhbnksXG4gIHZhbHVlOiBhbnksXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgaWYgKHR5cGUgPT09IFVJS2V5cy5EQVRFKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgZm9ybWF0OiBzdHJpbmcgPSAoYXJncy5zaGlmdCgpIGFzIHN0cmluZykgfHwgSFRNTDVEYXRlRm9ybWF0O1xuICAgIHJldHVybiBmb3JtYXREYXRlKG5ldyBEYXRlKHZhbHVlKSwgZm9ybWF0KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhbHVlQnlUeXBlKFxuICB0eXBlOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gIGZpZWxkUHJvcHM6IEZpZWxkUHJvcGVydGllc1xuKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XG4gIGxldCByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgQXJyYXkubmFtZToge1xuICAgICAgY29uc3QgcGFyc2VkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS5tYXAoKHYpID0+XG4gICAgICAgICAgICBwYXJzZVZhbHVlQnlUeXBlKFxuICAgICAgICAgICAgICBSZXNlcnZlZE1vZGVscy5TVFJJTkcubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICB2LFxuICAgICAgICAgICAgICBmaWVsZFByb3BzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICA6IFt2YWx1ZV07XG4gICAgICByZXN1bHQgPSBwYXJzZWQuam9pbihcIixcIik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgcmVzdWx0ID0gcGFyc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFOiB7XG4gICAgICBjb25zdCBmb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGZpZWxkUHJvcHMuZm9ybWF0O1xuICAgICAgaWYgKHZhbHVlICYmIGAke3ZhbHVlfWAudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gUmVzZXJ2ZWRNb2RlbHMuTlVNQkVSLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgPyBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgICAgPyBmb3JtYXRcbiAgICAgICAgICAgICAgICA/IHBhcnNlRGF0ZShmb3JtYXQsIHZhbHVlKVxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXN1bHQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFJlc2VydmVkTW9kZWxzLk9CSkVDVC5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA/IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLmpvaW4oXCIsXCIpXG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5CT09MRUFOLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09IFJlc2VydmVkTW9kZWxzLlNUUklORy5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgPyBlc2NhcGVIdG1sKHZhbHVlIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgOiByZXN1bHQ7XG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgdmFsdWUgb2YgdHlwZSAke3R5cGV9IGZyb20gJHt0eXBlb2YgdmFsdWV9IC0gJHt2YWx1ZX1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb051bWJlcih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gIGlmICghaXNOYU4ocGFyc2VkKSkgcmV0dXJuIHBhcnNlZDtcblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJlwiOiBcIiZhbXA7XCIsXG4gICAgXCI8XCI6IFwiJmx0O1wiLFxuICAgIFwiPlwiOiBcIiZndDtcIixcbiAgfTtcbiAgcmV0dXJuIGAke3ZhbHVlfWAucmVwbGFjZSgvWyY8Pl0vZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldmVydEh0bWwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJmFtcDtcIjogXCImXCIsXG4gICAgXCImbHQ7XCI6IFwiPFwiLFxuICAgIFwiJmd0O1wiOiBcIj5cIixcbiAgfTtcblxuICByZXR1cm4gYCR7dmFsdWV9YC5yZXBsYWNlKC8mbHQ7fCZndDt8JmFtcDsvZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVUlNb2RlbElEPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgbGV0IGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pO1xuICAgIGlmIChwaylcbiAgICAgIGlkID0gbW9kZWxbXG4gICAgICAgIE1vZGVsLnBrKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSBhcyBrZXlvZiB0eXBlb2YgbW9kZWxcbiAgICAgIF0gYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIGRvIG5vdGhpbmc7XG4gIH1cbiAgY29uc3QgbmFtZSA9IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG4gIHJldHVybiBgJHtuYW1lfS0ke2lkfWA7XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBIVE1MNURhdGVGb3JtYXQsXG4gIEhUTUw1SW5wdXRUeXBlcyxcbiAgVUlLZXlzLFxuICBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlLFxuICBWYWxpZGF0YWJsZUJ5VHlwZSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9uS2V5cyxcbiAgRGVjYWZTcGlubmVyT3B0aW9ucyxcbiAgRGVjYWZUb2FzdE9wdGlvbnMsXG4gIEZpZWxkRGVmaW5pdGlvbixcbiAgRmllbGRQcm9wZXJ0aWVzLFxuICBVSUNsYXNzTWV0YWRhdGEsXG4gIFVJRWxlbWVudE1ldGFkYXRhLFxuICBVSUxpc3RJdGVtRWxlbWVudE1ldGFkYXRhLFxuICBVSUxpc3RQcm9wTWV0YWRhdGEsXG4gIFVJTW9kZWxNZXRhZGF0YSxcbiAgVUlQcm9wTWV0YWRhdGEsXG4gIElQYWdlZENvbXBvbmVudFByb3BlcnRpZXMsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgZm9ybWF0QnlUeXBlLCBnZW5lcmF0ZVVJTW9kZWxJRCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBQcmltaXRpdmVzLFxuICBSZXNlcnZlZE1vZGVscyxcbiAgVmFsaWRhdGlvbktleXMsXG4gIFZhbGlkYXRpb25NZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSURlY2FmTW9kYWwgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0lEZWNhZk1vZGFsXCI7XG5pbXBvcnQgeyBEZWNhZkNvbXBvbmVudCB9IGZyb20gXCIuL0RlY2FmQ29tcG9uZW50XCI7XG5cbmltcG9ydCB7IElEZWNhZlNwaW5uZXIgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0lEZWNhZlNwaW5uZXJcIjtcbmltcG9ydCB7IElEZWNhZlJvdXRlciB9IGZyb20gXCIuL2ludGVyZmFjZXMvSURlY2FmUm91dGVyXCI7XG5pbXBvcnQgeyBJRGVjYWZUb2FzdCB9IGZyb20gXCIuL2ludGVyZmFjZXMvSURlY2FmVG9hc3RcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgY2xhc3MgZm9yIHJlbmRlcmluZyBVSSBjb21wb25lbnRzIGJhc2VkIG9uIG1vZGVsIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgVGhlIFJlbmRlcmluZ0VuZ2luZSBjbGFzcyBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgY29udmVydGluZyBtb2RlbCBtZXRhZGF0YSBpbnRvIFVJIGZpZWxkIGRlZmluaXRpb25zLlxuICogSXQgaGFuZGxlcyB0aGUgdHJhbnNsYXRpb24gb2YgbW9kZWwgcHJvcGVydGllcyB0byBVSSBlbGVtZW50cywgYXBwbGllcyB2YWxpZGF0aW9uIHJ1bGVzLCBhbmQgbWFuYWdlcyBkaWZmZXJlbnQgcmVuZGVyaW5nIGZsYXZvcnMuXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkIGJ5IHNwZWNpZmljIHJlbmRlcmluZyBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmluZyByZXN1bHQsIGRlZmF1bHRzIHRvIHZvaWRcbiAqIEB0ZW1wbGF0ZSBSIFRoZSB0eXBlIG9mIHRoZSBmaWVsZCBkZWZpbml0aW9uLCBkZWZhdWx0cyB0byBGaWVsZERlZmluaXRpb248VD5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3Igb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gKlxuICogQGNsYXNzIFJlbmRlcmluZ0VuZ2luZVxuICovXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGJhc2UgYWJzdHJhY3Rpb24gZm9yIGRlY2FmIHJlbmRlcmluZyBlbmdpbmVzLCBoYW5kbGluZyBlbmdpbmUgcmVnaXN0cmF0aW9uLFxuICogaW5pdGlhbGl6YXRpb24sIG1vZGVsLXRvLWZpZWxkIHRyYW5zbGF0aW9uLCBhbmQgcnVudGltZSByZW5kZXJpbmcgb3JjaGVzdHJhdGlvbi5cbiAqIEltcGxlbWVudGF0aW9ucyBtdXN0IHByb3ZpZGUgaW5pdGlhbGl6YXRpb24gYW5kIHJlbmRlcmluZyBsb2dpYyB3aGlsZSBsZXZlcmFnaW5nIHRoZSBzaGFyZWRcbiAqIG1ldGFkYXRhLWRyaXZlbiBjb252ZXJzaW9uIHV0aWxpdGllcyBzdXBwbGllZCBoZXJlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVuZGVyaW5nRW5naW5lPFQgPSB2b2lkLCBSID0gRmllbGREZWZpbml0aW9uPFQ+PiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2FjaGUgZm9yIHN0b3JpbmcgcmVuZGVyaW5nIGVuZ2luZSBpbnN0YW5jZXMgb3IgY29uc3RydWN0b3JzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPj5cbiAgICB8IFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPlxuICA+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudGx5IGFjdGl2ZSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50OlxuICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+PlxuICAgIHwgUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVuZGVyaW5nIGVuZ2luZSBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICovXG4gIHByb3RlY3RlZCBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihyZWFkb25seSBmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICBSZW5kZXJpbmdFbmdpbmUucmVnaXN0ZXIodGhpcyk7XG4gICAgY29uc29sZS5sb2coYGRlY2FmJ3MgJHtmbGF2b3VyfSByZW5kZXJpbmcgZW5naW5lIGxvYWRlZGApO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0TW9kYWw8QyBleHRlbmRzIERlY2FmQ29tcG9uZW50PE1vZGVsPj4oXG4gICAgY29tcG9uZW50OiBQYXJ0aWFsPEM+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8SURlY2FmTW9kYWw+O1xuXG4gIGFic3RyYWN0IGdldFRvYXN0KG9wdGlvbnM6IERlY2FmVG9hc3RPcHRpb25zKTogUHJvbWlzZTxJRGVjYWZUb2FzdD47XG5cbiAgYWJzdHJhY3QgZ2V0U3Bpbm5lcihvcHRpb25zOiBEZWNhZlNwaW5uZXJPcHRpb25zKTogUHJvbWlzZTxJRGVjYWZTcGlubmVyPjtcblxuICBhYnN0cmFjdCByb3V0ZXIoKTogSURlY2FmUm91dGVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIGZvciBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBuZWVkZWQgZm9yIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0ZXMgYmV0d2VlbiBtb2RlbCB0eXBlcyBhbmQgSFRNTCBpbnB1dCB0eXBlcy5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgbW9kZWwgZGF0YSB0eXBlcyB0byBhcHByb3ByaWF0ZSBIVE1MIGlucHV0IHR5cGVzIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byB0cmFuc2xhdGUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvVmlldz10cnVlXSAtIERpcmVjdGlvbiBvZiB0cmFuc2xhdGlvbiAodHJ1ZSBmb3IgbW9kZWwgdG8gdmlldywgZmFsc2UgZm9yIHZpZXcgdG8gbW9kZWwpLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdHJhbnNsYXRlZCB0eXBlLlxuICAgKi9cbiAgdHJhbnNsYXRlKGtleTogc3RyaW5nLCB0b1ZpZXc6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBpZiAodG9WaWV3KSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLlNUUklORy5uYW1lLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5URVhUO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLk5VTUJFUi5uYW1lLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuQklHSU5ULm5hbWUudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLk5VTUJFUjtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5CT09MRUFOLm5hbWUudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkRBVEUubmFtZS50b0xvd2VyQ2FzZSgpOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuREFURTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuU0VMRUNUOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URVhUOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5FTUFJTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuQ09MT1I6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlBBU1NXT1JEOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlVSTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuU0VBUkNIOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5ISURERU46XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlRFWFRBUkVBOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5SQURJTzpcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5OVU1CRVIubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5DSEVDS0JPWDpcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuQk9PTEVBTi5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEU6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEVUSU1FX0xPQ0FMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5USU1FOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5EQVRFLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGNsYXNzIGRlY29yYXRvciBtZXRhZGF0YSBmb3IgYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyBVSS1yZWxhdGVkIGNsYXNzIGRlY29yYXRvcnMgZnJvbSBhIG1vZGVsIGFuZCByZXR1cm5zIHRoZW0gYXMgYW4gYXJyYXlcbiAgICogVGhpcyBtZXRob2QgY29sbGVjdHMgbWV0YWRhdGEgZnJvbSB2YXJpb3VzIFVJIGNsYXNzIGRlY29yYXRvcnMgaW5jbHVkaW5nIEB1aW1vZGVsLFxuICAgKiBAdWlsaXN0bW9kZWwsIEB1aWhhbmRsZXJzLCBhbmQgQHVpbGF5b3V0IGFwcGxpZWQgdG8gdGhlIG1vZGVsIGNsYXNzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGV4dHJhY3QgbWV0YWRhdGEgZnJvbVxuICAgKiBAcmV0dXJucyB7VUlDbGFzc01ldGFkYXRhW119IEFycmF5IG9mIFVJIGNsYXNzIG1ldGFkYXRhIG9iamVjdHNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0Q2xhc3NEZWNvcmF0b3JzTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTVxuICApOiBVSUNsYXNzTWV0YWRhdGFbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIE1vZGVsLnVpTW9kZWxPZihtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPiksXG4gICAgICBNb2RlbC51aUxpc3RNb2RlbE9mKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KSxcbiAgICAgIE1vZGVsLnVpSGFuZGxlcnNGb3IobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pLFxuICAgICAgTW9kZWwudWlMYXlvdXRPZihtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPiksXG4gICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgVUlDbGFzc01ldGFkYXRhW107XG4gIH1cblxuICBwcml2YXRlIHNvcnRDaGlsZHJlbkJ5T3JkZXIoY2hpbGRyZW46IEZpZWxkRGVmaW5pdGlvbjxhbnk+W10gPSBbXSkge1xuICAgIHJldHVybiBjaGlsZHJlbi5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhT3JkZXIgPSBhLnByb3BzPy5vcmRlciA/PyAwO1xuICAgICAgY29uc3QgYk9yZGVyID0gYi5wcm9wcz8ub3JkZXIgPz8gMDtcbiAgICAgIGNvbnN0IHdlaWdodCA9ICh2OiBudW1iZXIgfCBzdHJpbmcpID0+XG4gICAgICAgIHYgPT09IFVJS2V5cy5GSVJTVFxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogdHlwZW9mIHYgPT09IFByaW1pdGl2ZXMuTlVNQkVSXG4gICAgICAgICAgICA/IDFcbiAgICAgICAgICAgIDogdiA9PT0gVUlLZXlzLkxBU1RcbiAgICAgICAgICAgICAgPyAvL1RPRE86IHJldmlldyB0aGlzXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ubGVuZ3RoICsgY2hpbGRyZW4uaW5kZXhPZihiKVxuICAgICAgICAgICAgICA6IDE7XG5cbiAgICAgIGNvbnN0IGFXZWlnaHQgPSB3ZWlnaHQoYU9yZGVyKTtcbiAgICAgIGNvbnN0IGJXZWlnaHQgPSB3ZWlnaHQoYk9yZGVyKTtcbiAgICAgIGlmIChhV2VpZ2h0ICE9PSBiV2VpZ2h0KSB7XG4gICAgICAgIHJldHVybiBhV2VpZ2h0IC0gYldlaWdodDtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBhV2VpZ2h0ID09PSAxICYmXG4gICAgICAgIHR5cGVvZiBhT3JkZXIgPT09IFByaW1pdGl2ZXMuTlVNQkVSICYmXG4gICAgICAgIHR5cGVvZiBiT3JkZXIgPT09IFByaW1pdGl2ZXMuTlVNQkVSXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWxpZGF0aW9uIGtleSByZXByZXNlbnRzIGEgY3VzdG9tIHZhbGlkYXRvciAoaS5lLiwgbm90IGEgYnVpbHQtaW4gdmFsaWRhdGlvbiBvciBVSSBrZXkpLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGtleSBjb3JyZXNwb25kcyB0byBhIHVzZXItZGVmaW5lZCB2YWxpZGF0b3IgYnkgZXhjbHVkaW5nIGFsbCBidWlsdC1pbiBWYWxpZGF0aW9uS2V5cyBhbmQgVUlLZXlzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHZhbGlkYXRpb24ga2V5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUga2V5IGlzIGEgY3VzdG9tIHZhbGlkYXRvciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUga2V5IGlzIG5vdCBhIGJ1aWx0LWluIHZhbGlkYXRpb24ga2V5IG9yIFVJIGtleSAoaS5lLiBpcyBjdXN0b20pLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNDdXN0b21WYWxpZGF0b3Ioa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIU9iamVjdC52YWx1ZXMoVmFsaWRhdGlvbktleXMpLmluY2x1ZGVzKFxuICAgICAgICBrZXkgYXMgKHR5cGVvZiBWYWxpZGF0aW9uS2V5cylba2V5b2YgdHlwZW9mIFZhbGlkYXRpb25LZXlzXVxuICAgICAgKSAmJiAhT2JqZWN0LnZhbHVlcyhVSUtleXMpLmluY2x1ZGVzKGtleSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGl0cyBuYXR1cmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBVSSBrZXkgcmVwcmVzZW50cyBhIHR5cGUgdGhhdCBpcyBpbmhlcmVudGx5IHZhbGlkYXRhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFVJIGtleSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR5cGUgaXMgdmFsaWRhdGFibGUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkYXRhYmxlQnlUeXBlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlUeXBlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIFVJIGtleSByZXByZXNlbnRzIGEgdmFsaWRhdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIGFzIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBVSSBrZXkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB2YWxpZGF0aW9uIG1ldGFkYXRhIHRvIGFuIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHN1bW1hcnkgVHJhbnNmb3JtcyB2YWxpZGF0aW9uIG1ldGFkYXRhIGludG8gYSB2YWx1ZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIEhUTUwgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHZhbGlkYXRpb24ga2V5LlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25NZXRhZGF0YX0gdmFsdWUgLSBUaGUgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW59IFRoZSBjb252ZXJ0ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIGtleSBpcyBub3QgdmFsaWRhdGFibGUgYnkgYXR0cmlidXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvQXR0cmlidXRlVmFsdWUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFZhbGlkYXRpb25NZXRhZGF0YVxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmluY2x1ZGVzKGtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGF0dHJpYnV0ZSBrZXkgXCIke2tleX1cIi4gRXhwZWN0ZWQgb25lIG9mOiAke09iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmpvaW4oXCIsIFwiKX0uYFxuICAgICAgKTtcblxuICAgIHJldHVybiBrZXkgPT09IFVJS2V5cy5SRVFVSVJFRCA/IHRydWUgOiB2YWx1ZVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIG1vZGVsIHRvIGEgZmllbGQgZGVmaW5pdGlvbi5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgbW9kZWwgaW5zdGFuY2UsIGV4dHJhY3RpbmcgVUktcmVsYXRlZCBtZXRhZGF0YSBhbmQgdmFsaWRhdGlvbiBydWxlcyB0byBjcmVhdGUgYSBmaWVsZCBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIHJlZmVyZW5jaW5nIHRoZSBzcGVjaWZpYyBSZW5kZXJpbmcgZW5naW5lIGZpZWxkIHByb3BlcnRpZXMvaW5wdXRzXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY29udmVydC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2dsb2JhbFByb3BzPXt9XSAtIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCBlbGVtZW50cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZ2VuZXJhdGVJZD10cnVlXSAtIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHBvcHVsYXRlIHRoZSByZW5kZXJlcklkIHByb3BlcnR5LlxuICAgKiBAcmV0dXJucyB7RmllbGREZWZpbml0aW9uPFQ+fSBBIGZpZWxkIGRlZmluaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgVUkgc3RydWN0dXJlIG9mIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7UmVuZGVyaW5nRXJyb3J9IElmIG5vIFVJIGRlZmluaXRpb25zIGFyZSBzZXQgZm9yIHRoZSBtb2RlbCBvciBpZiB0aGVyZSBhcmUgaW52YWxpZCBkZWNvcmF0b3JzLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gICAqICBwYXJ0aWNpcGFudCBSRSBhcyBSZW5kZXJpbmdFbmdpbmVcbiAgICogIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdGlvblxuICAgKiAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICAgKiAgQy0+PlJFOiB0b0ZpZWxkRGVmaW5pdGlvbihtb2RlbCwgZ2xvYmFsUHJvcHMpXG4gICAqICBSRS0+PlI6IGdldE1ldGFkYXRhKFVJS2V5cy5VSU1PREVMLCBtb2RlbC5jb25zdHJ1Y3RvcilcbiAgICogIFItLT4+UkU6IFVJTW9kZWxNZXRhZGF0YVxuICAgKiAgUkUtPj5SOiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFVJS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT5cbiAgICogIFJFLT4+UjogZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdPlxuICAgKiAgbG9vcCBGb3IgZWFjaCBwcm9wZXJ0eVxuICAgKiAgICBSRS0+PlJFOiBQcm9jZXNzIFVJIGRlY29yYXRvcnNcbiAgICogICAgUkUtPj5SRTogQXBwbHkgdmFsaWRhdGlvbiBydWxlc1xuICAgKiAgZW5kXG4gICAqICBSRS0tPj5DOiBGaWVsZERlZmluaXRpb248VD5cbiAgICovXG4gIHByb3RlY3RlZCB0b0ZpZWxkRGVmaW5pdGlvbjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIGdsb2JhbFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGdlbmVyYXRlSWQ6IGJvb2xlYW4gPSB0cnVlXG4gICk6IEZpZWxkRGVmaW5pdGlvbjxUPiB7XG4gICAgY29uc3QgeyBpbmhlcml0UHJvcHMsIC4uLmdsb2JhbFByb3BzV2l0aG91dEluaGVyaXRzIH0gPSBnbG9iYWxQcm9wcztcbiAgICBnbG9iYWxQcm9wcyA9IGdsb2JhbFByb3BzV2l0aG91dEluaGVyaXRzO1xuXG4gICAgY29uc3QgY2xhc3NEZWNvcmF0b3JzID0gdGhpcy5nZXRDbGFzc0RlY29yYXRvcnNNZXRhZGF0YTxNPihtb2RlbCk7XG5cbiAgICBpZiAoIWNsYXNzRGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoXG4gICAgICAgIGBObyB1aSBkZWZpbml0aW9ucyBzZXQgZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0uIERpZCB5b3UgdXNlIEB1aW1vZGVsP2BcbiAgICAgICk7XG5cbiAgICBjb25zdCBjbGFzc0RlY29yYXRvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIC4uLmNsYXNzRGVjb3JhdG9ycyxcbiAgICAgIGluaGVyaXRQcm9wcyA/IGluaGVyaXRQcm9wcyA6IHt9IC8vIG92ZXJyaWRlIHRhZyBhbmQgcHJvcGVydGllcyB3aGVuIGl0IGlzIGEgY29tcG9uZW50IHRoYXQgc2hvdWxkIGluaGVyaXQgcHJvcGVydGllcyBmcm9tIGl0cyBwYXJlbnQuXG4gICAgKTtcbiAgICBjb25zdCB7IHRhZywgcHJvcHMsIGl0ZW0sIGhhbmRsZXJzIH0gPSBjbGFzc0RlY29yYXRvcjtcblxuICAgIGNvbnN0IHVpRGVjb3JhdG9ycyA9IE1vZGVsLnVpUHJvcGVydGllc09mKFxuICAgICAgbW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT5cbiAgICApIGFzIChrZXlvZiBNKVtdO1xuXG4gICAgLy8gY29uc3QgdWlEZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiA9XG4gICAgLy8gICBSZWZsZWN0aW9uLmdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhtb2RlbCwgVUlLZXlzLlJFRkxFQ1QpIGFzIFJlY29yZDxcbiAgICAvLyAgICAgc3RyaW5nLFxuICAgIC8vICAgICBEZWNvcmF0b3JNZXRhZGF0YVtdXG4gICAgLy8gICA+O1xuICAgIGxldCBjaGlsZHJlbjogRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+W10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNoaWxkUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBpdGVtPy5wcm9wcyB8fCB7fTtcbiAgICBsZXQgbWFwcGVyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgZ2V0UGF0aCA9IChwYXJlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gcGFyZW50ID8gW3BhcmVudCwgcHJvcF0uam9pbihcIi5cIikgOiBwcm9wO1xuICAgIH07XG5cbiAgICBpZiAodWlEZWNvcmF0b3JzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4gICAgICAgICkgfHwge307XG4gICAgICAvLyBjb25zdCB2YWxpZGF0aW9uRGVjb3JhdG9yczogUmVjb3JkPFxuICAgICAgLy8gICBzdHJpbmcsXG4gICAgICAvLyAgIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXVxuICAgICAgLy8gPiA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgLy8gICBtb2RlbCxcbiAgICAgIC8vICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVFxuICAgICAgLy8gKSBhcyBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W10+O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgdWlEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSBNb2RlbC51aURlY29yYXRpb25PZihcbiAgICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPixcbiAgICAgICAgICBrZXlcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHR5cGU6IGFueTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgdHlwZSA9IE1vZGVsLnVpVHlwZU9mKG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+LCBrZXkpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyhkZWNzKS5maWx0ZXIoKHsga2V5IH0pID0+XG4gICAgICAgIC8vICAgW1VJS2V5cy5QUk9QLCBVSUtleXMuRUxFTUVOVCwgVUlLZXlzLkNISUxEXS5pbmNsdWRlcyhrZXkpXG4gICAgICAgIC8vICk7XG4gICAgICAgIC8vIGlmICghdHlwZSlcbiAgICAgICAgLy8gICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoXG4gICAgICAgIC8vICAgICBgT25seSBvbmUgdHlwZSBvZiBkZWNvcmF0aW9uIGlzIGFsbG93ZWQuIFBsZWFzZSBjaG9vc2UgYmV0d2VlbiBAdWlwcm9wLCBAdWljaGlsZCBvciBAdWllbGVtZW50YFxuICAgICAgICAvLyAgICk7XG4gICAgICAgIGNvbnN0IGhhc0hpZGVPbkRlY29yYXRvciA9IE1vZGVsLnVpSXNIaWRkZW4oXG4gICAgICAgICAgbW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4sXG4gICAgICAgICAga2V5XG4gICAgICAgICk7XG4gICAgICAgIGlmIChoYXNIaWRlT25EZWNvcmF0b3IpIHtcbiAgICAgICAgICBjb25zdCBoYXNVaUVsZW1lbnREZWNvcmF0b3IgPSBNb2RlbC51aUVsZW1lbnRPZihcbiAgICAgICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+LFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWhhc1VpRWxlbWVudERlY29yYXRvcilcbiAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgICAgICAgYEB1aWVsZW1lbnQgbm8gZm91bmQgaW4gXCIke2tleSBhcyBzdHJpbmd9XCIuIEl0IGlzIHJlcXVpcmVkIHRvIHVzZSBoaWRkZW5PbiBkZWNvcmF0b3IuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0ZWQgPSBPYmplY3QuZW50cmllcyhkZWNzKVxuICAgICAgICAgIC5tYXAoKFtrLCB2XSkgPT4gKHtcbiAgICAgICAgICAgIGtleTogayxcbiAgICAgICAgICAgIHByb3BzOiB2LFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIC5zb3J0KChhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW1VJS2V5cy5FTEVNRU5ULCBVSUtleXMuQ0hJTERdLmluY2x1ZGVzKGEua2V5KSA/IC0xIDogMTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgc29ydGVkLmZvckVhY2goKGRlYykgPT4ge1xuICAgICAgICAgIGlmICghZGVjKSB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoYE5vIGRlY29yYXRvciBmb3VuZGApO1xuXG4gICAgICAgICAgc3dpdGNoIChkZWMua2V5KSB7XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5QUk9QOiB7XG4gICAgICAgICAgICAgIGNoaWxkUHJvcHNba2V5IGFzIGFueV0gPSBkZWMucHJvcHMgYXMgVUlQcm9wTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBVSUtleXMuQ0hJTEQ6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW9kZWxOYW1lID1cbiAgICAgICAgICAgICAgICAoZGVjLnByb3BzIGFzIFVJTW9kZWxNZXRhZGF0YSk/LnByb3BzPy5uYW1lIHx8IChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1Byb3BlcnR5TW9kZWwgPVxuICAgICAgICAgICAgICAgICAgTW9kZWwuaXNNb2RlbChNb2RlbC5idWlsZCh7fSwgbW9kZWxOYW1lKSkgfHxcbiAgICAgICAgICAgICAgICAgIE1vZGVsLmlzUHJvcGVydHlNb2RlbChtb2RlbCwgbW9kZWxOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzUHJvcGVydHlNb2RlbClcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENoaWxkIFwiJHttb2RlbE5hbWUgYXMgc3RyaW5nfVwiIG11c3QgYmUgYSBtb2RlbC5gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBDaGlsZCBcIiR7bW9kZWxOYW1lIGFzIHN0cmluZ31cIiBtdXN0IGJlIGEgbW9kZWwuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgQ2xheno7XG4gICAgICAgICAgICAgIGNvbnN0IHN1Ym1vZGVsID0gKG1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW1xuICAgICAgICAgICAgICAgIGtleSBhcyBhbnlcbiAgICAgICAgICAgICAgXSBhcyBNb2RlbDtcbiAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0YWJsZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHN1Ym1vZGVsID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShzdWJtb2RlbCk7XG4gICAgICAgICAgICAgIC8vIGNyZWF0ZSBpbnN0YW5jZSBpZiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhenpOYW1lID0gKFxuICAgICAgICAgICAgICAgICAgKGRlYy5wcm9wcyBhcyBhbnkpLnByb3BzIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICAgICAgICApPy5uYW1lIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBDbGF6eiA9IG5ldyAoTW9kZWwuZ2V0KGNsYXp6TmFtZSkgYXMgTW9kZWxDb25zdHJ1Y3RvcjxNb2RlbD4pKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbkdsb2JhbFByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICBnbG9iYWxQcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICB7IG1vZGVsOiBDbGF6eiB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRQcm9wczogZGVjLnByb3BzIGFzIFVJTW9kZWxNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgIGNoaWxkT2Y6IGdldFBhdGgoXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzPy5jaGlsZE9mIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAga2V5IGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IHRoaXMudG9GaWVsZERlZmluaXRpb24oXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgfHwgQ2xhenosIC8vIE11c3QgYXZvaWQgdW5kZWZpbmVkIHZhbHVlcyDigJQgYW4gaW5zdGFuY2UgaXMgcmVxdWlyZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgICBjaGlsZHJlbkdsb2JhbFByb3BzLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaW5oZXJpdFByb3BzIH0gPSBjaGlsZHJlbkdsb2JhbFByb3BzO1xuICAgICAgICAgICAgICBpZiAoaW5oZXJpdFByb3BzKVxuICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wcyxcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRQcm9wcy5wcm9wcyB8fCB7fVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uIGFzIEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlVJTElTVFBST1A6IHtcbiAgICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyIHx8IHt9O1xuICAgICAgICAgICAgICBjb25zdCBkZWNQcm9wcyA9IGRlYy5wcm9wcyBhcyBVSUxpc3RQcm9wTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGlmIChkZWNQcm9wcy5uYW1lKVxuICAgICAgICAgICAgICAgIG1hcHBlcltkZWNQcm9wcy5uYW1lXSA9XG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZGVjUHJvcHM/LnByb3BzID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgICBVSUtleXMuU0VRVUVOQ0UgaW4gZGVjUHJvcHMucHJvcHNcbiAgICAgICAgICAgICAgICAgICAgPyBkZWNQcm9wcy5wcm9wc1xuICAgICAgICAgICAgICAgICAgICA6IGtleTtcblxuICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgY2xhc3NEZWNvcmF0b3IucHJvcHM/Lml0ZW0gfHwge30sXG4gICAgICAgICAgICAgICAgaXRlbT8ucHJvcHMgfHwge30sXG4gICAgICAgICAgICAgICAgZGVjUHJvcHM/LnByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkUHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgdGFnOiBpdGVtPy50YWcgfHwgcHJvcHMucmVuZGVyIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkUHJvcHM/LnByb3BzLCB7IG1hcHBlciB9LCBwcm9wcyksXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5FVkVOVFM6XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5ISURERU46XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5ISURFX0ZPUjpcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlNIT1dfRk9SOlxuICAgICAgICAgICAgY2FzZSBVSUtleXMuUEFHRTpcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLk9SREVSOlxuICAgICAgICAgICAgY2FzZSBVSUtleXMuVUlMQVlPVVRQUk9QOlxuICAgICAgICAgICAgY2FzZSBVSUtleXMuRUxFTUVOVDoge1xuICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuICAgICAgICAgICAgICBjb25zdCB1aVByb3BzOiBVSUVsZW1lbnRNZXRhZGF0YSA9IGRlYy5wcm9wcyBhcyBVSUVsZW1lbnRNZXRhZGF0YTtcbiAgICAgICAgICAgICAgY29uc3QgdmlzaWJpbGl0eVByb3BzID1cbiAgICAgICAgICAgICAgICBkZWMua2V5ID09PSBVSUtleXMuSElERV9GT1JcbiAgICAgICAgICAgICAgICAgID8geyBoaWRlRm9yOiBkZWMucHJvcHMgYXMgc3RyaW5nW10gfVxuICAgICAgICAgICAgICAgICAgOiBkZWMua2V5ID09PSBVSUtleXMuU0hPV19GT1JcbiAgICAgICAgICAgICAgICAgICAgPyB7IHNob3dGb3I6IGRlYy5wcm9wcyBhcyBzdHJpbmdbXSB9XG4gICAgICAgICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICBjaGlsZFByb3BzPy5wcm9wcyxcbiAgICAgICAgICAgICAgICB1aVByb3BzLnByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlQcm9wcyxcbiAgICAgICAgICAgICAgICB1aVByb3BzPy5wcm9wcz8ubmFtZVxuICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgcGF0aDogZ2V0UGF0aChcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzPy5jaGlsZE9mIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMhLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIGNoaWxkT2Y6IHVuZGVmaW5lZCwgLy8gVGhlIGNoaWxkT2YgcHJvcCBpcyBwYXNzZWQgYnkgZ2xvYmFsUHJvcHMgd2hlbiBpdCBpcyBhIG5lc3RlZCBwcm9wXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDoge30sXG4gICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHMsXG4gICAgICAgICAgICAgICAgeyBuYW1lOiB1aVByb3BzLnByb3BzPy5uYW1lIHx8IGtleSB9XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKGRlYy5rZXkgPT09IFVJS2V5cy5FTEVNRU5UKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGREZWZpbml0aW9uOiBGaWVsZERlZmluaXRpb248UmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gICAgICAgICAgICAgICAgICB0YWc6IHVpUHJvcHMudGFnIHx8IGNoaWxkUHJvcHM/LnRhZyB8fCB0YWcgfHwgXCJcIixcbiAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbkRlY3MgPSB2YWxpZGF0aW9uRGVjb3JhdG9yc1tcbiAgICAgICAgICAgICAgICAgIGtleSBhcyBhbnlcbiAgICAgICAgICAgICAgICBdIGFzIFZhbGlkYXRpb25NZXRhZGF0YVtdO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRGVjcykge1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgT2JqZWN0LmVudHJpZXModmFsaWRhdGlvbkRlY3MpLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKFtrLCB2XSkgPT4gKHsga2V5OiBrLCBwcm9wczogdiB9KVxuICAgICAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUoZGVjLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbdGhpcy50cmFuc2xhdGUoZGVjLmtleSldID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9BdHRyaWJ1dGVWYWx1ZShkZWMua2V5LCBkZWMucHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGVCeVR5cGUoZGVjLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjLmtleSA9PT0gSFRNTDVJbnB1dFR5cGVzLkRBVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuRk9STUFUXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlYy5wcm9wcy5mb3JtYXQgfHwgSFRNTDVEYXRlRm9ybWF0O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdID0gZGVjLmtleTtcbiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0N1c3RvbVZhbGlkYXRvcihkZWMua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIHByb3BzW1VJS2V5cy5TVUJfVFlQRV0gPSBkZWMua2V5O1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWMucHJvcHM/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzW1VJS2V5cy5WQUxJREFUSU9OX01FU1NBR0VdID0gZGVjLnByb3BzLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBiYXNpY1R5cGUgPSBNZXRhZGF0YS50eXBlKFxuICAgICAgICAgICAgICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAga2V5IGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgKS5uYW1lO1xuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSA9IHRoaXMudHJhbnNsYXRlKFxuICAgICAgICAgICAgICAgICAgICBiYXNpY1R5cGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHMudmFsdWUgPSBmb3JtYXRCeVR5cGUoXG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdLFxuICAgICAgICAgICAgICAgICAgbW9kZWxba2V5IGFzIGtleW9mIE1dLFxuICAgICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5GT1JNQVRdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkRGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW4uZmluZChcbiAgICAgICAgICAgICAgICAoYykgPT5cbiAgICAgICAgICAgICAgICAgIGMucHJvcHM/Lm5hbWUgPT09IGtleSB8fFxuICAgICAgICAgICAgICAgICAgKFtVSUtleXMuVUlMQVlPVVRQUk9QLCBVSUtleXMuUEFHRSwgVUlLZXlzLkVWRU5UU10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgIGRlYy5rZXlcbiAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGMucHJvcHM/LmNoaWxkT2YgPT09IGtleSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGMucHJvcHM/LmNoaWxkT2Y/LmVuZHNXaXRoKGAuJHtrZXkgYXMgc3RyaW5nfWApKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRlYy5rZXkgPT09IFVJS2V5cy5ISURFX0ZPUiB8fFxuICAgICAgICAgICAgICAgICAgICBkZWMua2V5ID09PSBVSUtleXMuU0hPV19GT1JcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkLnByb3BzLCB2aXNpYmlsaXR5UHJvcHMpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWMua2V5ICE9PSBVSUtleXMuVUlMQVlPVVRQUk9QKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgY2hpbGQucHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICBbZGVjLmtleV06IHVpUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByb3csIGNvbCwgcHJvcHMgfSA9IGRlYy5wcm9wcyBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgICAgICAgY29sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKGBJbnZhbGlkIGtleTogJHtkZWMua2V5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgZ2xvYmFsUHJvcHMsIHtcbiAgICAgIGhhbmRsZXJzOiBoYW5kbGVycyB8fCB7fSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGN1cnJlbnROYW1lc3BhY2VzID0gbmV3IFNldChcbiAgICAgIFtcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZ2xvYmFsUHJvcHM/Lm5hbWVzcGFjZXMpXG4gICAgICAgICAgPyAoZ2xvYmFsUHJvcHMubmFtZXNwYWNlcyBhcyBzdHJpbmdbXSlcbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHR5cGVvZiBnbG9iYWxQcm9wcz8ubmFtZXNwYWNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBbZ2xvYmFsUHJvcHMubmFtZXNwYWNlIGFzIHN0cmluZ11cbiAgICAgICAgICA6IFtdKSxcbiAgICAgIF0uZmlsdGVyKEJvb2xlYW4pXG4gICAgKTtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBnbG9iYWxQcm9wcz8ub3BlcmF0aW9uO1xuICAgIGNoaWxkcmVuID0gdGhpcy5zb3J0Q2hpbGRyZW5CeU9yZGVyKGNoaWxkcmVuKS5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGhpZGRlbk9uID0gKGl0ZW0/LnByb3BzPy5oaWRkZW4gYXMgQ3J1ZE9wZXJhdGlvbktleXNbXSkgfHwgW107XG4gICAgICBpZiAoXG4gICAgICAgIGhpZGRlbk9uLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgaGlkZGVuT24uaW5jbHVkZXMob3BlcmF0aW9uIGFzIENydWRPcGVyYXRpb25LZXlzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGlkZUZvciA9IChpdGVtPy5wcm9wcz8uaGlkZUZvciBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgICBjb25zdCBzaG93Rm9yID0gKGl0ZW0/LnByb3BzPy5zaG93Rm9yIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgaGlkZUZvci5sZW5ndGggPiAwICYmXG4gICAgICAgIFsuLi5jdXJyZW50TmFtZXNwYWNlc10uc29tZSgobmFtZXNwYWNlKSA9PiBoaWRlRm9yLmluY2x1ZGVzKG5hbWVzcGFjZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBzaG93Rm9yLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgIVsuLi5jdXJyZW50TmFtZXNwYWNlc10uc29tZSgobmFtZXNwYWNlKSA9PiBzaG93Rm9yLmluY2x1ZGVzKG5hbWVzcGFjZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0OiBGaWVsZERlZmluaXRpb248VD4gPSB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIGl0ZW06IGNoaWxkUHJvcHMgYXMgVUlMaXN0SXRlbUVsZW1lbnRNZXRhZGF0YSxcbiAgICAgIHByb3BzOiBnbG9iYWxQcm9wcyBhcyBUICYgRmllbGRQcm9wZXJ0aWVzICYgSVBhZ2VkQ29tcG9uZW50UHJvcGVydGllcyxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbj8ubGVuZ3RoXG4gICAgICAgID8gKGNoaWxkcmVuIGFzIEZpZWxkRGVmaW5pdGlvbjxhbnk+W10pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBpZiAoZ2VuZXJhdGVJZCkgcmVzdWx0LnJlbmRlcmVySWQgPSBnZW5lcmF0ZVVJTW9kZWxJRChtb2RlbCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVuZGVycyBhIG1vZGVsIHdpdGggZ2xvYmFsIHByb3BlcnRpZXMgYW5kIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBkZWZpbmUgc3BlY2lmaWMgcmVuZGVyaW5nIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgUiBSZW5kZXJpbmcgZW5naW5lIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIG91dHB1dCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGdsb2JhbFByb3BzIC0gR2xvYmFsIHByb3BlcnRpZXMgdG8gYmUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMgZHVyaW5nIHJlbmRlcmluZy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgbWF5IGJlIHJlcXVpcmVkIGZvciBzcGVjaWZpYyByZW5kZXJpbmcgaW1wbGVtZW50YXRpb25zLlxuICAgKiBAcmV0dXJucyB7Un0gVGhlIHJlbmRlcmVkIHJlc3VsdCwgdHlwZSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCByZW5kZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBnbG9iYWxQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEFkZHMgYSByZW5kZXJpbmcgZW5naW5lIHRvIHRoZSBzdGF0aWMgY2FjaGUgYW5kIHNldHMgaXQgYXMgdGhlIGN1cnJlbnQgZW5naW5lLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPn0gZW5naW5lIC0gVGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gcmVnaXN0ZXIuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFuIGVuZ2luZSB3aXRoIHRoZSBzYW1lIGZsYXZvciBhbHJlYWR5IGV4aXN0cy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyKGVuZ2luZTogUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+KSB7XG4gICAgaWYgKGVuZ2luZS5mbGF2b3VyIGluIHRoaXMuY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtlbmdpbmUuZmxhdm91cn0gYWxyZWFkeSBleGlzdHNgXG4gICAgICApO1xuICAgIHRoaXMuY2FjaGVbZW5naW5lLmZsYXZvdXJdID0gZW5naW5lO1xuICAgIHRoaXMuY3VycmVudCA9IGVuZ2luZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGluaXRpYWxpemVzIGEgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgR2V0cyBhbiBleGlzdGluZyBlbmdpbmUgaW5zdGFuY2Ugb3IgY3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBuZXcgb25lIGlmIGdpdmVuIGEgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz59IG9iaiAtIFRoZSBlbmdpbmUgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm5zIHtSZW5kZXJpbmdFbmdpbmU8Tz59IFRoZSBpbml0aWFsaXplZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRPckJvb3Q8Tz4oXG4gICAgb2JqOiBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICk6IFJlbmRlcmluZ0VuZ2luZTxPPiB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlbmRlcmluZ0VuZ2luZSkgcmV0dXJuIG9iaiBhcyBSZW5kZXJpbmdFbmdpbmU8Tz47XG4gICAgY29uc3QgZW5naW5lOiBSZW5kZXJpbmdFbmdpbmU8Tz4gPSBuZXcgb2JqKCk7XG4gICAgZW5naW5lLmluaXRpYWxpemUoKTsgLy8gbWFrZSB0aGUgYm9vdGluZyBhc3luYy4gdXNlIHRoZSBpbml0aWFsaXplZCBmbGFnIHRvIGNvbnRyb2wgaXRcbiAgICByZXR1cm4gZW5naW5lIGFzIFJlbmRlcmluZ0VuZ2luZTxPPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVuZGVyaW5nIGVuZ2luZSBieSBmbGF2b3IuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGVuZ2luZSBvciBhIHNwZWNpZmljIG9uZSBieSBmbGF2b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIC0gVGhlIGZsYXZvciBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMge1JlbmRlcmluZ0VuZ2luZTxPPn0gVGhlIHJlcXVlc3RlZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGZsYXZvciBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldDxPPihmbGF2b3VyPzogc3RyaW5nKTogUmVuZGVyaW5nRW5naW5lPE8+IHtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRPckJvb3Q8Tz4oXG4gICAgICAgIHRoaXMuY3VycmVudCBhcyBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICAgICApO1xuICAgIGlmICghKGZsYXZvdXIgaW4gdGhpcy5jYWNoZSkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtmbGF2b3VyfSBkb2VzIG5vdCBleGlzdGBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JCb290PE8+KFxuICAgICAgdGhpcy5jYWNoZVtmbGF2b3VyXSBhc1xuICAgICAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj5cbiAgICAgICAgfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIGEgbW9kZWwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGNvcnJlY3QgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbCBhbmQgaW52b2tlcyBpdHMgcmVuZGVyIG1ldGhvZC5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZW5kZXIgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgcmVzdWx0IG9mIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gcmVnaXN0ZXJlZCBtb2RlbCBpcyBmb3VuZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlbmRlcjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPVxuICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIHx8IE1vZGVsLmZyb21PYmplY3QobW9kZWwpO1xuICAgIGlmICghY29uc3RydWN0b3IpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gbW9kZWwgcmVnaXN0ZXJlZCBmb3VuZFwiKTtcbiAgICBjb25zdCBmbGF2b3VyID0gTW9kZWwucmVuZGVyZWRCeShtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZvciB0aGUgdmFyIGFyZ3MgdHlwZSBjaGVja1xuICAgIHJldHVybiBSZW5kZXJpbmdFbmdpbmUuZ2V0KGZsYXZvdXIpLnJlbmRlcihtb2RlbCwgLi4uYXJncyk7XG4gIH1cbn1cbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihEQktleXMuSUQpXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gcGsob3B0aW9uczogeyBnZW5lcmF0ZWQ6IGJvb2xlYW4gfSkge1xuLy8gICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyUGsodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5PzogYW55KSB7XG4vLyAgICAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZClcbi8vICAgICAgICAgICBoaWRlT24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFKShcbi8vICAgICAgICAgICAgIHRhcmdldCxcbi8vICAgICAgICAgICAgIHByb3BlcnR5S2V5XG4vLyAgICAgICAgICAgKTtcbi8vICAgICAgIH07XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoREJLZXlzLlRJTUVTVEFNUClcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0aW1lc3RhbXAob3BzOiBPcGVyYXRpb25LZXlzW10pIHtcbi8vICAgICAgIHJldHVybiBoaWRlT24oLi4uKG9wcyBhcyBhbnlbXSkpO1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy9cbi8vIERlY29yYXRpb24uZm9yKERCS2V5cy5DT01QT1NFRClcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb21wb3NlZCgpIHtcbi8vICAgICAgIHJldHVybiBoaWRlT24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFKTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihcImNyZWF0ZWRCeVwiKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbi8vICAgICAgIHJldHVybiBoaWRlT24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFKTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihcInVwZGF0ZWRCeVwiKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNyZWF0ZWRCeSgpIHtcbi8vICAgICAgIHJldHVybiBoaWRlT24oT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE9wZXJhdGlvbktleXMuVVBEQVRFKTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbiIsImltcG9ydCB7IFVJS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcHJvcE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9uS2V5cyxcbiAgVUlFbGVtZW50TWV0YWRhdGEsXG4gIFVJRXZlbnRIYW5kbGVyLFxuICBVSUV2ZW50TmFtZSxcbiAgVUlGdW5jdGlvbkxpa2UsXG4gIFVJTGF5b3V0Q29sLFxuICBVSUxheW91dFByb3BNZXRhZGF0YSxcbiAgVUlMaXN0UHJvcE1ldGFkYXRhLFxuICBVSVByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IGdldFVJQXR0cmlidXRlS2V5IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgaGlkZXMgYSBwcm9wZXJ0eSBkdXJpbmcgc3BlY2lmaWMgQ1JVRCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBDb250cm9scyBwcm9wZXJ0eSB2aXNpYmlsaXR5IGJhc2VkIG9uIG9wZXJhdGlvbiB0eXBlXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIHNwZWNpZnkgd2hpY2ggQ1JVRCBvcGVyYXRpb25zIHNob3VsZCBoaWRlIGEgcHJvcGVydHlcbiAqIGluIHRoZSBVSS4gVGhlIHByb3BlcnR5IHdpbGwgb25seSBiZSB2aXNpYmxlIGR1cmluZyBvcGVyYXRpb25zIG5vdCBzcGVjaWZpZWQuXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbnMgLSBUaGUgQ1JVRCBvcGVyYXRpb25zIGR1cmluZyB3aGljaCB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIGhpZGVPblxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSGlkZSB0aGUgcGFzc3dvcmQgZmllbGQgZHVyaW5nIFJFQUQgb3BlcmF0aW9uc1xuICogY2xhc3MgVXNlciB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEBoaWRlT24oT3BlcmF0aW9uS2V5cy5SRUFEKVxuICogICBwYXNzd29yZDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgaGlkZU9uXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBNb2RlbC0+PmhpZGVPbjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgaGlkZU9uLT4+TW9kZWw6IEFkZCBoaWRkZW4gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IENoZWNrIGlmIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBoaWRkZW4gb3BlcmF0aW9uc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogUmVuZGVyIG9yIGhpZGUgYmFzZWQgb24gY3VycmVudCBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGVPbiguLi5vcGVyYXRpb25zOiBDcnVkT3BlcmF0aW9uS2V5c1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoaWRlT24ob2JqZWN0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuSElEREVOKSxcbiAgICAgIG9wZXJhdGlvbnNcbiAgICApKG9iamVjdCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBoaWRlcyBhIHByb3BlcnR5IGZvciBzcGVjaWZpYyBuYW1lc3BhY2VzLlxuICogQHN1bW1hcnkgQ29udHJvbHMgcHJvcGVydHkgdmlzaWJpbGl0eSBiYXNlZCBvbiBuYW1lc3BhY2UgbWVtYmVyc2hpcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGVGb3IoLi4ubmFtZXNwYWNlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhpZGVGb3Iob2JqZWN0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuSElERV9GT1IpLFxuICAgICAgbmFtZXNwYWNlc1xuICAgICkob2JqZWN0LCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHNob3dzIGEgcHJvcGVydHkgb25seSBmb3Igc3BlY2lmaWMgbmFtZXNwYWNlcy5cbiAqIEBzdW1tYXJ5IE5hbWVzcGFjZS1hd2FyZSBjb3VudGVycGFydCB0byBgaGlkZUZvcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG93Rm9yKC4uLm5hbWVzcGFjZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaG93Rm9yKG9iamVjdDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgIHJldHVybiBwcm9wTWV0YWRhdGEoXG4gICAgICBnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLlNIT1dfRk9SKSxcbiAgICAgIG5hbWVzcGFjZXNcbiAgICApKG9iamVjdCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCByZW5kZXJzIGEgcHJvcGVydHkgb25seSB3aGVuIHRoZSBuYW1lc3BhY2UgbWF0Y2hlcy5cbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIGFsaWFzIGZvciBuYW1lc3BhY2Utc2NvcGVkIHZpc2liaWxpdHkgY29udHJvbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcklmKC4uLm5hbWVzcGFjZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBzaG93Rm9yKC4uLm5hbWVzcGFjZXMpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSBvcmRlciBvZiBhIFVJIGVsZW1lbnRcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgcmVuZGVyaW5nIG9yZGVyIGZvciBVSSBjb21wb25lbnRzXG4gKiBUaGlzIGRlY29yYXRvciBhcHBsaWVzIG1ldGFkYXRhIHRvIHRoZSBwcm9wZXJ0eSBvciBjbGFzcywgaW5kaWNhdGluZyBpdHMgb3JkZXIgaW4gdGhlIFVJIHJlbmRlcmluZyBzZXF1ZW5jZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW29yZGVyPTFdIFRoZSBvcmRlciB2YWx1ZSBmb3IgdGhlIFVJIGVsZW1lbnQgKGRlZmF1bHQgaXMgMSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IG9yIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aW9yZGVyXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgb3JkZXIgZm9yIGEgZmllbGRcbiAqIEB1aW9yZGVyKDIpXG4gKiBmaWVsZE5hbWU6IHN0cmluZztcbiAqXG4gKiAvLyBTZXQgb3JkZXIgZm9yIGEgY2xhc3NcbiAqIEB1aW9yZGVyKDEpXG4gKiBjbGFzcyBVc2VyUHJvZmlsZSB7IC4uLiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlvcmRlclxuICogICBwYXJ0aWNpcGFudCBwcm9wZXJ0eVxuICogICBTeXN0ZW0tPj51aW9yZGVyOmRvKHByb3BlcnR5KVxuICogICB1aW9yZGVyLT4+cHJvcGVydHk6IHNldHMgb3JkZXIgbWV0YWRhdGFcbiAqICAgdWlvcmRlci0+PlN5c3RlbTogcmV0dXJucyBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpb3JkZXIoXG4gIG9yZGVyOiBudW1iZXIgfCB0eXBlb2YgVUlLZXlzLkZJUlNUIHwgdHlwZW9mIFVJS2V5cy5MQVNUID0gVUlLZXlzLkZJUlNUXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVpb3JkZXIob2JqZWN0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLk9SREVSKSwgb3JkZXIpKFxuICAgICAgb2JqZWN0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBjb21wbGV0ZWx5IGhpZGVzIGEgcHJvcGVydHkgaW4gYWxsIFVJIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IE1ha2VzIGEgcHJvcGVydHkgaW52aXNpYmxlIGluIGFsbCBDUlVEIG9wZXJhdGlvbnNcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgaGlkZU9uIHRoYXQgaGlkZXMgYSBwcm9wZXJ0eVxuICogZHVyaW5nIGFsbCBDUlVEIG9wZXJhdGlvbnMgKENSRUFURSwgUkVBRCwgVVBEQVRFLCBERUxFVEUpLlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBoaWRkZW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbXBsZXRlbHkgaGlkZSB0aGUgaW50ZXJuYWxJZCBmaWVsZCBpbiB0aGUgVUlcbiAqIGNsYXNzIFByb2R1Y3Qge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEBoaWRkZW4oKVxuICogICBpbnRlcm5hbElkOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBoaWRkZW5cbiAqICAgcGFydGljaXBhbnQgaGlkZU9uXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBNb2RlbC0+PmhpZGRlbjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgaGlkZGVuLT4+aGlkZU9uOiBDYWxsIHdpdGggYWxsIG9wZXJhdGlvbnNcbiAqICAgaGlkZU9uLT4+TW9kZWw6IEFkZCBoaWRkZW4gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IENoZWNrIGlmIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBhbGwgb3BlcmF0aW9uc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogQWx3YXlzIGhpZGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGRlbigpIHtcbiAgcmV0dXJuIGhpZGVPbihcbiAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgT3BlcmF0aW9uS2V5cy5ERUxFVEVcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSByZW5kZXJlZCBhcyBhIFVJIGVsZW1lbnRcbiAqIEBzdW1tYXJ5IE1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIHNwZWNpZmljIFVJIGVsZW1lbnQgd2l0aCBjdXN0b20gcHJvcGVydGllc1xuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgd2hpY2ggSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCBzaG91bGQgYmUgdXNlZFxuICogdG8gcmVuZGVyIGEgc3BlY2lmaWMgcHJvcGVydHksIGFsb25nIHdpdGggYW55IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoYXQgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHRhZyBuYW1lIHRvIHVzZSBmb3IgcmVuZGVyaW5nXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NlcmlhbGl6ZT1mYWxzZV0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHNlcmlhbGl6ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWVsZW1lbnRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlbmRlciBhIHByb3BlcnR5IGFzIGEgdGV4dCBpbnB1dFxuICogY2xhc3MgTG9naW5Gb3JtIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2lucHV0JywgeyB0eXBlOiAndGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgdXNlcm5hbWUnIH0pXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnaW5wdXQnLCB7IHR5cGU6ICdwYXNzd29yZCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgcGFzc3dvcmQnIH0pXG4gKiAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnYnV0dG9uJywgeyBjbGFzczogJ2J0bi1wcmltYXJ5JyB9KVxuICogICBzdWJtaXQ6IHN0cmluZyA9ICdMb2dpbic7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWVsZW1lbnRcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIE1vZGVsLT4+dWllbGVtZW50OiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWVsZW1lbnQtPj5Nb2RlbDogQWRkIGVsZW1lbnQgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBlbGVtZW50IG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gdGFnIGFuZCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogUmVuZGVyIHdpdGggc3BlY2lmaWVkIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpZWxlbWVudChcbiAgdGFnOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdGFnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBwcm9wcyA9IHRhZztcbiAgICAgIHRhZyA9IFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IG1ldGFkYXRhOiBVSUVsZW1lbnRNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnIGFzIHN0cmluZyxcbiAgICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzIHx8IHt9LCB7XG4gICAgICAgIG5hbWU6IHByb3BlcnR5S2V5LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIHJldHVybiBwcm9wTWV0YWRhdGEoXG4gICAgICBnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLkVMRU1FTlQpLFxuICAgICAgbWV0YWRhdGFcbiAgICApKG9yaWdpbmFsLCBwcm9wZXJ0eUtleSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIFVJIGNvbXBvbmVudCBwcm9wZXJ0eVxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSBwYXNzZWQgdG8gYSBVSSBjb21wb25lbnRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGhvdyBhIG1vZGVsIHByb3BlcnR5IHNob3VsZCBiZSBtYXBwZWQgdG9cbiAqIGEgcHJvcGVydHkgb2YgdGhlIFVJIGNvbXBvbmVudCB3aGVuIHJlbmRlcmluZy4gSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlXG4gKiBkZWNvcmF0ZWQgd2l0aCBAdWltb2RlbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BOYW1lXSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGFzcyB0byB0aGUgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KVxuICogQHBhcmFtIHtib29sZWFufSBbc3RyaW5naWZ5PWZhbHNlXSBXaGV0aGVyIHRvIHN0cmluZ2lmeSB0aGUgcHJvcGVydHkgdmFsdWVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE1hcCBtb2RlbCBwcm9wZXJ0aWVzIHRvIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgndXNlci1wcm9maWxlJylcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAnZnVsbE5hbWUnIHRvIHRoZSBjb21wb25lbnRcbiAqICAgZnVsbE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCd1c2VyRW1haWwnKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAndXNlckVtYWlsJyB0byB0aGUgY29tcG9uZW50XG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgndXNlckRhdGEnLCB0cnVlKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyBzdHJpbmdpZmllZCBKU09OXG4gKiAgIHVzZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWlwcm9wXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBDb21wb25lbnRcbiAqICAgTW9kZWwtPj51aXByb3A6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpcHJvcC0+Pk1vZGVsOiBBZGQgcHJvcCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IHByb3AgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUgYW5kIHN0cmluZ2lmeSBmbGFnXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PkNvbXBvbmVudDogUGFzcyBwcm9wZXJ0eSB3aXRoIHNwZWNpZmllZCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aXByb3AoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHN0cmluZ2lmeTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlQcm9wTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBwcm9wTmFtZSB8fCBwcm9wZXJ0eUtleSxcbiAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5LFxuICAgIH07XG4gICAgcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG5lc3RlZCBtb2RlbCBwcm9wZXJ0eSB0byBhIFVJIGNvbXBvbmVudCBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IERlZmluZXMgaG93IGEgcGFyZW50IGNvbXBvbmVudCBzaG91bGQgcmVuZGVyIHRoZSBjaGlsZCBtb2RlbCB3aGVuIG5lc3RlZC5cbiAqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIGRlY29yYXRlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmVzdGVkIG1vZGVscy5cbiAqIFdoZW4gYXBwbGllZCwgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgdGFnIG9mIHRoZSBjaGlsZCBtb2RlbCB3aXRoIHRoZSBwcm92aWRlZCBvbmUsXG4gKiBlbmFibGluZyBkaWZmZXJlbnQgcmVuZGVyaW5nIGJlaGF2aW9yIHdoZW4gdGhlIG1vZGVsIGFjdHMgYXMgYSBjaGlsZCAobmVzdGVkKVxuICogY29tcGFyZWQgdG8gd2hlbiBpdCBpcyByZW5kZXJlZCBhcyB0aGUgcGFyZW50IG1vZGVsLlxuICpcbiAqIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZSBkZWNvcmF0ZWQgd2l0aCBgQHVpbW9kZWxgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiBUaGUgbW9kZWwgY2xhc3MgbmFtZSB0byBwYXNzIHRvIHRoZSBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCB0YWcgbmFtZSB0byBvdmVycmlkZSB0aGUgVUkgdGFnIG9mIHRoZSBuZXN0ZWQgbW9kZWxcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtib29sZWFufSBbc2VyaWFsaXplPWZhbHNlXSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgc2VyaWFsaXplZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiB1aWNoaWxkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNYXAgYSBuZXN0ZWQgbW9kZWwgdG8gYSBjb21wb25lbnQgcHJvcGVydHkgd2l0aCBhIGRpZmZlcmVudCB0YWcgd2hlbiBuZXN0ZWRcbiAqIEB1aW1vZGVsKCdhZGRyZXNzLWNvbXBvbmVudCcpXG4gKiBjbGFzcyBBZGRyZXNzIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHN0cmVldDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNpdHk6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAdWltb2RlbCgndXNlci1wcm9maWxlJylcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWNoaWxkKEFkZHJlc3MubmFtZSwgJ2FkZHJlc3MtY2hpbGQtY29tcG9uZW50JylcbiAqICAgYWRkcmVzczogQWRkcmVzcztcbiAqIH1cbiAqXG4gKiAvLyBJbiB0aGlzIGV4YW1wbGUsIHRoZSBBZGRyZXNzIG1vZGVsIGhhcyB0aGUgZGVmYXVsdCB0YWcgJ2FkZHJlc3MtY29tcG9uZW50JyB3aGVuIHJlbmRlcmVkIGFzIGEgcm9vdCBjb21wb25lbnQsXG4gKiAvLyBidXQgd2hlbiB1c2VkIGluc2lkZSBVc2VyUHJvZmlsZSwgaXQgaXMgcmVuZGVyZWQgd2l0aCB0aGUgb3ZlcnJpZGRlbiB0YWcgJ2FkZHJlc3MtY2hpbGQtY29tcG9uZW50J1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWljaGlsZFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgQ29tcG9uZW50XG4gKiAgIE1vZGVsLT4+dWljaGlsZDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWljaGlsZC0+Pk1vZGVsOiBBZGQgY2hpbGQgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBjaGlsZCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSwgc3RyaW5naWZ5IGZsYWcsIGFuZCBjaGlsZCB0YWcgb3ZlcnJpZGVcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+Q29tcG9uZW50OiBQYXNzIHByb3BlcnR5IHdpdGggc3BlY2lmaWVkIG5hbWUgYW5kIHJlbmRlciB3aXRoIG92ZXJyaWRkZW4gdGFnIGlmIG5lc3RlZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1aWNoaWxkKFxuICBjbGF6ejogc3RyaW5nLFxuICB0YWc6IHN0cmluZyxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgaXNBcnJheTogYm9vbGVhbiA9IGZhbHNlLFxuICBzZXJpYWxpemU6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJRWxlbWVudE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiB0YWcsXG4gICAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZSxcbiAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgcHJvcHMgfHwge30sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBjbGF6eiB8fCBwcm9wZXJ0eUtleSxcbiAgICAgICAgfSxcbiAgICAgICAgaXNBcnJheVxuICAgICAgICAgID8geyBjdXN0b21UeXBlczogW0FycmF5Lm5hbWVdLCBtdWx0aXBsZTogdHJ1ZSB9XG4gICAgICAgICAgOiB7IG11bHRpcGxlOiBwcm9wcz8ubXVsdGlwbGUgfHwgZmFsc2UgfVxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuQ0hJTEQpLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIGxpc3QgaXRlbSBjb21wb25lbnRcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYSBsaXN0IGNvbnRleHRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGhvdyBhIG1vZGVsIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBsaXN0XG4gKiBzaG91bGQgYmUgcmVuZGVyZWQuIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZSBkZWNvcmF0ZWQgd2l0aCBAdWlsaXN0bW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wTmFtZV0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHBhc3MgdG8gdGhlIGxpc3QgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBsaXN0IGNvbnRhaW5lclxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbGlzdHByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhIGxpc3QgcHJvcGVydHkgd2l0aCBjdXN0b20gcmVuZGVyaW5nXG4gKiBAdWltb2RlbCgndG9kby1saXN0JylcbiAqIGNsYXNzIFRvZG9MaXN0IHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRpdGxlOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGlzdHByb3AoJ2l0ZW1zJywgeyBjbGFzczogJ3RvZG8taXRlbXMtY29udGFpbmVyJyB9KVxuICogICBpdGVtczogVG9kb0l0ZW1bXTtcbiAqIH1cbiAqXG4gKiBAdWlsaXN0bW9kZWwoJ2xpJywgeyBjbGFzczogJ3RvZG8taXRlbScgfSlcbiAqIGNsYXNzIFRvZG9JdGVtIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGV4dDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpbGlzdHByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IExpc3RDb250YWluZXJcbiAqICAgcGFydGljaXBhbnQgTGlzdEl0ZW1zXG4gKiAgIE1vZGVsLT4+dWlsaXN0cHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlsaXN0cHJvcC0+Pk1vZGVsOiBBZGQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lIGFuZCBjb250YWluZXIgcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TGlzdENvbnRhaW5lcjogQ3JlYXRlIGNvbnRhaW5lciB3aXRoIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pkxpc3RJdGVtczogUmVuZGVyIGVhY2ggaXRlbSB1c2luZyBAdWlsaXN0bW9kZWxcbiAqICAgTGlzdENvbnRhaW5lci0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHJlbmRlcmVkIGxpc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGlzdHByb3AoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFBhcnRpYWw8VUlMaXN0UHJvcE1ldGFkYXRhPiA9IHtcbiAgICAgIG5hbWU6IHByb3BOYW1lIHx8IHByb3BlcnR5S2V5LFxuICAgICAgcHJvcHM6IHByb3BzIHx8IHt9LFxuICAgIH07XG4gICAgcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5LCBVSUtleXMuVUlMSVNUUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgcG9zaXRpb25zIGEgcHJvcGVydHkgaW4gYSBzcGVjaWZpYyBncmlkIGxheW91dCBwb3NpdGlvblxuICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2x1bW4gYW5kIHJvdyBwb3NpdGlvbiBmb3IgYSBwcm9wZXJ0eSBpbiBhIFVJIGxheW91dCBncmlkXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSB0aGUgc3BlY2lmaWMgcG9zaXRpb24gb2YgYSBwcm9wZXJ0eSB3aXRoaW5cbiAqIGEgZ3JpZC1iYXNlZCBsYXlvdXQgc3lzdGVtLiBJdCBzcGVjaWZpZXMgd2hpY2ggY29sdW1uIGFuZCByb3cgdGhlIHByb3BlcnR5XG4gKiBzaG91bGQgb2NjdXB5IHdoZW4gcmVuZGVyZWQgaW4gdGhlIFVJLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2wgVGhlIGNvbHVtbiBwb3NpdGlvbiBpbiB0aGUgZ3JpZCBsYXlvdXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcm93PTFdIFRoZSByb3cgcG9zaXRpb24gaW4gdGhlIGdyaWQgbGF5b3V0IChkZWZhdWx0cyB0byAxKVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHM9e31dIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBsYXlvdXQgaXRlbVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbGF5b3V0cHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUG9zaXRpb24gcHJvcGVydGllcyBpbiBhIGdyaWQgbGF5b3V0XG4gKiBAdWlsYXlvdXQoJ3VzZXItZm9ybScsIDIsIDMpIC8vIDIgY29sdW1ucywgMyByb3dzXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgVXNlckZvcm0ge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0cHJvcCgxLCAxKSAvLyBPbmUgY29sdW1uLCBmaXJzdCByb3dcbiAqICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0cHJvcCgyLCAxKSAvLyBPbmUgY29sdW1uLCBmaXJzdCByb3dcbiAqICAgbGFzdE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRwcm9wKDEsIDIpIC8vIE9uZSBjb2x1bW4sIHNlY29uZCByb3dcbiAqICAgZW1haWw6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRwcm9wKDIsIDMpIC8vIEFsbCBjb2x1bW5zLCB0aGlyZCByb3dcbiAqICAgYmlvOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWxheW91dHByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IExheW91dENvbnRhaW5lclxuICogICBNb2RlbC0+PnVpbGF5b3V0cHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlsYXlvdXRwcm9wLT4+TW9kZWw6IEFkZCBsYXlvdXQgaXRlbSBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGxheW91dCBpdGVtIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gY29sdW1uLCByb3csIGFuZCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5MYXlvdXRDb250YWluZXI6IFBvc2l0aW9uIGVsZW1lbnQgYXQgZ3JpZCBjb29yZGluYXRlc1xuICogICBMYXlvdXRDb250YWluZXItPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwb3NpdGlvbmVkIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGF5b3V0cHJvcChjb2w6IFVJTGF5b3V0Q29sID0gMSwgcm93OiBudW1iZXIgPSAxKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJTGF5b3V0UHJvcE1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogcHJvcGVydHlLZXksXG4gICAgICAvLyBjb2wsXG4gICAgICAvLyByb3csXG4gICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgeyByb3csIGNvbCB9KSxcbiAgICB9O1xuICAgIHByb3BNZXRhZGF0YShnZXRVSUF0dHJpYnV0ZUtleShwcm9wZXJ0eUtleSwgVUlLZXlzLlVJTEFZT1VUUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgYXNzaWducyBhIHByb3BlcnR5IHRvIGEgc3BlY2lmaWMgcGFnZSBpbiBtdWx0aS1wYWdlIGZvcm1zXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hpY2ggcGFnZSBhIHByb3BlcnR5IHNob3VsZCBhcHBlYXIgb24gaW4gcGFnaW5hdGVkIFVJIGxheW91dHNcbiAqIFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gdGhlIHByb3BlcnR5LCBpbmRpY2F0aW5nIHdoaWNoIHBhZ2UgbnVtYmVyIGl0IGJlbG9uZ3MgdG9cbiAqIGluIGEgbXVsdGktcGFnZSBmb3JtIG9yIHdpemFyZC4gUHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIHBhZ2UgbnVtYmVyIGFyZSBncm91cGVkIHRvZ2V0aGVyXG4gKiBhbmQgcmVuZGVyZWQgb24gdGhlIHNhbWUgcGFnZS4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEB1aXN0ZXBwZWRtb2RlbCB0b1xuICogb3JnYW5pemUgbGFyZ2UgZm9ybXMgaW50byBtYW5hZ2VhYmxlIHNlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgd2hlcmUgdGhlIHByb3BlcnR5IHNob3VsZCBhcHBlYXIgKGRlZmF1bHQgaXMgMSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXBhZ2Vwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBtdWx0aS1zdGVwIHJlZ2lzdHJhdGlvbiBmb3JtIHdpdGggcGFnZS1iYXNlZCBsYXlvdXRcbiAqIEB1aXN0ZXBwZWRtb2RlbCgncmVnaXN0cmF0aW9uLWZvcm0nLCAyLCB0cnVlKVxuICogQG1vZGVsKClcbiAqIGNsYXNzIFJlZ2lzdHJhdGlvbkZvcm0ge1xuICogICAvLyBQYWdlIDE6IFBlcnNvbmFsIEluZm9ybWF0aW9uXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgxKVxuICogICBmaXJzdE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgxKVxuICogICBsYXN0TmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDEpXG4gKiAgIGRhdGVPZkJpcnRoOiBEYXRlO1xuICpcbiAqICAgLy8gUGFnZSAyOiBDb250YWN0IEluZm9ybWF0aW9uXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgyKVxuICogICBlbWFpbDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDIpXG4gKiAgIHBob25lOiBzdHJpbmc7XG4gKlxuICogICAvLyBQYWdlIDM6IENvbmZpcm1hdGlvblxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMylcbiAqICAgYWNjZXB0VGVybXM6IGJvb2xlYW47XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aXBhZ2Vwcm9wXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBQYWdpbmF0aW9uQ29udHJvbGxlclxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBNb2RlbC0+PnVpcGFnZXByb3A6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpcGFnZXByb3AtPj5Nb2RlbDogQWRkIHBhZ2UgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBwYWdlIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcGFnZSBudW1iZXJcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+UGFnaW5hdGlvbkNvbnRyb2xsZXI6IEdyb3VwIHByb3BlcnRpZXMgYnkgcGFnZVxuICogICBQYWdpbmF0aW9uQ29udHJvbGxlci0+PlVJOiBSZW5kZXIgY3VycmVudCBwYWdlIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpcGFnZXByb3AocGFnZTogbnVtYmVyID0gMSkge1xuICByZXR1cm4gZnVuY3Rpb24gdWlwYWdlcHJvcChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgIHJldHVybiBwcm9wTWV0YWRhdGEoZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXksIFVJS2V5cy5QQUdFKSwgcGFnZSkoXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgYmluZHMgYSBVSSBldmVudCB0byBhIHNwZWNpZmllZCBoYW5kbGVyIGZ1bmN0aW9uLlxuICogVGhpcyBpcyB1c2VkIHRvIGF0dGFjaCBldmVudCBoYW5kbGVycyB0byBzcGVjaWZpYyBsaWZlY3ljbGUgZXZlbnRzIG9mIGEgYERlY2FmQ29tcG9uZW50YCxcbiAqIHN1Y2ggYXMgYHJlbmRlcmAgfCBgaW5pdGlhbGl6ZWAgfCBgaGFuZGxlQ2xpY2tgIHwgYHJlZnJlc2hgXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGxpZmVjeWNsZSBldmVudCB0byBiaW5kIHRoZSBoYW5kbGVyIHRvLlxuICogICAgICAgICAgICAgICAgTXVzdCBiZSBvbmUgb2YgdGhlIGtleXMgaW4gYFBpY2s8RGVjYWZDb21wb25lbnQsICdyZW5kZXInIHwgJ2luaXRpYWxpemUnPmAuXG4gKiBAcGFyYW0gaGFuZGxlciAtIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgb2NjdXJzLlxuICpcbiAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyB0aGUgZXZlbnQtaGFuZGxlciBiaW5kaW5nIHRvIHRoZSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIEB1aW9uKCdyZW5kZXInLCAoKSA9PiBjb25zb2xlLmxvZygnUmVuZGVyaW5nLi4uJykpXG4gKiAgIHNvbWVQcm9wZXJ0eTogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aW9uKFxuICBldmVudDogVUlFdmVudE5hbWUsXG4gIGhhbmRsZXI6IFVJRXZlbnRIYW5kbGVyXG4pOiAob3JpZ2luYWw6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBzdHJpbmcpID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gdWlvbihcbiAgZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCBVSUV2ZW50SGFuZGxlcj5cbik6IChvcmlnaW5hbDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IHN0cmluZykgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiB1aW9uKFxuICBldmVudDogVUlFdmVudE5hbWUgfCBSZWNvcmQ8c3RyaW5nLCBVSUV2ZW50SGFuZGxlcj4sXG4gIGhhbmRsZXI/OiBVSUV2ZW50SGFuZGxlclxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiB1aW9uKG9yaWdpbmFsOiBvYmplY3QsIHByb3BlcnR5S2V5Pzogc3RyaW5nKSB7XG4gICAgcHJvcE1ldGFkYXRhKGdldFVJQXR0cmlidXRlS2V5KHByb3BlcnR5S2V5IGFzIHN0cmluZywgVUlLZXlzLkVWRU5UUyksIHtcbiAgICAgIC4uLih0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgPyBldmVudCA6IHsgW2V2ZW50XTogaGFuZGxlciB9KSxcbiAgICB9KShvcmlnaW5hbCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXNzb2NpYXRlcyBhIFVJIGNsaWNrIGhhbmRsZXIgd2l0aCB0aGUgJ2hhbmRsZUNsaWNrJyBldmVudC5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciAtIEEgZnVuY3Rpb24gdGhhdCBjb25mb3JtcyB0byB0aGUgYFVJRXZlbnRIYW5kbGVyYCB0eXBlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkXG4gKiAgICAgICAgICAgICAgICAgIHdoZW4gdGhlICdoYW5kbGVDbGljaycgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSBkZWNvcmF0ZWQgZnVuY3Rpb24gdGhhdCBiaW5kcyB0aGUgaGFuZGxlciB0byB0aGUgJ2hhbmRsZUNsaWNrJyBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpb25jbGljayhoYW5kbGVyOiBVSUV2ZW50SGFuZGxlcikge1xuICByZXR1cm4gdWlvbihcImhhbmRsZUNsaWNrXCIsIGhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXNzb2NpYXRlcyBhIFVJIHJlbmRlcmluZyBoYW5kbGVyIHdpdGggdGhlICdyZW5kZXInIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIC0gQSBmdW5jdGlvbiB0aGF0IGNvbmZvcm1zIHRvIHRoZSBgVUlFdmVudEhhbmRsZXIgYCB0eXBlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkXG4gKiAgICAgICAgICAgICAgICAgIHdoZW4gdGhlICdyZW5kZXInIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEByZXR1cm5zIEEgZGVjb3JhdGVkIGZ1bmN0aW9uIHRoYXQgYmluZHMgdGhlIGhhbmRsZXIgdG8gdGhlICdyZW5kZXInIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlvbnJlbmRlcihoYW5kbGVyOiBVSUV2ZW50SGFuZGxlcikge1xuICByZXR1cm4gdWlvbihcInJlbmRlclwiLCBoYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSBhcyBhIGNvbHVtbiBpbiBhIFVJIHRhYmxlXG4gKiBAc3VtbWFyeSBDb250cm9scyBjb2x1bW4gb3JkZXJpbmcgYW5kIG9wdGlvbmFsIHZhbHVlIHBhcnNpbmcgZm9yIHRhYmxlIHByb3BzXG4gKiBVc2UgdGhpcyBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgbGlzdCBwcm9wZXJ0aWVzIGFzIHRhYmxlIGNvbHVtbnMsIGRlZmluZSB0aGVcbiAqIHNlcXVlbmNlIGluIHdoaWNoIHRoZXkgYXBwZWFyLCBhbmQgb3B0aW9uYWxseSBwcm92aWRlIGEgcGFyc2VyIHRoYXQgZm9ybWF0c1xuICogdGhlIHZhbHVlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlIFRoZSBkaXNwbGF5IG9yZGVyIGZvciB0aGUgY29sdW1uIChsb3dlciBtZWFucyBmaXJzdClcbiAqIEBwYXJhbSB7VUlGdW5jdGlvbkxpa2V9IFt2YWx1ZVBhcnNlckZuXSBPcHRpb25hbCBmb3JtYXR0ZXIgZXhlY3V0ZWQgcGVyIGNlbGxcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXRhYmxlY29sXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBPcmRlciB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWl0YWJsZWNvbCgxKVxuICogICBvcmRlck51bWJlcjogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXRhYmxlY29sKDIsICh2YWx1ZSkgPT4gYCQke3ZhbHVlPy50b0ZpeGVkKDIpfWApXG4gKiAgIHRvdGFsOiBudW1iZXI7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aXRhYmxlY29sXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBUYWJsZVxuICogICBNb2RlbC0+PnVpdGFibGVjb2w6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpdGFibGVjb2wtPj5Nb2RlbDogU3RvcmUgY29sdW1uIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBSZXRyaWV2ZSBjb2x1bW4gcHJvcHNcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBvcmRlciBhbmQgcGFyc2VyXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlRhYmxlOiBSZW5kZXIgY29sdW1uIGluIHNlcXVlbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aXRhYmxlY29sKFxuICBzZXF1ZW5jZTogbnVtYmVyIHwgdHlwZW9mIFVJS2V5cy5GSVJTVCB8IHR5cGVvZiBVSUtleXMuTEFTVCA9IFVJS2V5cy5MQVNULFxuICB2YWx1ZVBhcnNlckZuPzogVUlGdW5jdGlvbkxpa2Vcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBQYXJ0aWFsPFVJTGlzdFByb3BNZXRhZGF0YT4gPSB7XG4gICAgICBuYW1lOiBwcm9wZXJ0eUtleSxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHNlcXVlbmNlLFxuICAgICAgICAuLi4oIXZhbHVlUGFyc2VyRm4gPyB7fSA6IHsgdmFsdWVQYXJzZXJGbiB9KSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBwcm9wTWV0YWRhdGEoZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcGVydHlLZXksIFVJS2V5cy5VSUxJU1RQUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRGVjYWZUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIi4vRGVjYWZUcmFuc2xhdGVTZXJ2aWNlXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBVSVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIHN0YXRpYyB0cmFuc2xhdGVTZXJ2aWNlOiBEZWNhZlRyYW5zbGF0ZVNlcnZpY2U7XG5cbiAgb3ZlcnJpZGUgZ2V0TWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICBpZiAoVUlWYWxpZGF0b3IudHJhbnNsYXRlU2VydmljZSlcbiAgICAgIHJldHVybiBVSVZhbGlkYXRvci50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZShtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZShtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25LZXlzLFxuICBVSUV2ZW50SGFuZGxlcixcbiAgVUlFdmVudFByb3BlcnR5LFxuICBVSUZ1bmN0aW9uTGlrZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnksIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IERlY2FmRXZlbnRIYW5kbGVyIH0gZnJvbSBcIi4vRGVjYWZFdmVudEhhbmRsZXJcIjtcbmltcG9ydCB7IERlY2FmVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCIuL0RlY2FmVHJhbnNsYXRlU2VydmljZVwiO1xuaW1wb3J0IHsgaXNDbGFzc0NvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxudHlwZSBQcmltYXJ5S2V5VHlwZSA9IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjbGFzcyBmb3IgYWxsIERlY2FmIFVJIGNvbXBvbmVudHNcbiAqIEBzdW1tYXJ5IEJhc2UgY2xhc3MgZm9yIGFsbCBEZWNhZiBVSSBjb21wb25lbnRzLCBwcm92aWRpbmcgY29tbW9uIHN0YXRlIG1hbmFnZW1lbnQsXG4gKiBsb2dnaW5nLCBsb2NhbGl6YXRpb24sIG5hdmlnYXRpb24gaG9va3MsIENSVUQgY29udGV4dCBtZXRhZGF0YSwgYW5kXG4gKiByZXBvc2l0b3J5IGludGVncmF0aW9uIHVzZWQgYnkgaGlnaGVyLWxldmVsIGRlY29yYXRvcnMgYW5kIHJlbmRlcmVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlY2FmQ29tcG9uZW50PE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGF0YSBtb2RlbCBvciBtb2RlbCBuYW1lIGZvciBjb21wb25lbnQgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgVGhlIGRhdGEgbW9kZWwgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHVzZSBmb3IgQ1JVRCBvcGVyYXRpb25zLiBUaGlzIGNhbiBiZSBwcm92aWRlZFxuICAgKiBhcyBhIE1vZGVsIGluc3RhbmNlLCBhIG1vZGVsIGNvbnN0cnVjdG9yLCBvciBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG1vZGVsJ3MgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKiBXaGVuIHNldCwgdGhpcyBwcm9wZXJ0eSBwcm92aWRlcyB0aGUgY29tcG9uZW50IHdpdGggYWNjZXNzIHRvIHRoZSBtb2RlbCdzIHNjaGVtYSwgdmFsaWRhdGlvbiBydWxlcyxcbiAgICogYW5kIG1ldGFkYXRhIG5lZWRlZCBmb3IgcmVuZGVyaW5nIGFuZCBkYXRhIG9wZXJhdGlvbnMuXG4gICAqL1xuICBtb2RlbCE6IE0gfCBNb2RlbCB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaW1hcnkga2V5IHZhbHVlIG9mIHRoZSBjdXJyZW50IG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHByaW1hcnkga2V5IHZhbHVlIGZvciB0aGUgY3VycmVudCBtb2RlbCByZWNvcmQgYmVpbmcgZGlzcGxheWVkIG9yXG4gICAqIG1hbmlwdWxhdGVkIGJ5IHRoZSBjb21wb25lbnQuIFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIGZvciBDUlVEIG9wZXJhdGlvbnMgdGhhdCB0YXJnZXRcbiAgICogc3BlY2lmaWMgcmVjb3Jkcywgc3VjaCBhcyByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucy4gVGhlIHZhbHVlIGNvcnJlc3BvbmRzIHRvXG4gICAqIHRoZSBmaWVsZCBkZXNpZ25hdGVkIGFzIHRoZSBwcmltYXJ5IGtleSBpbiB0aGUgbW9kZWwgZGVmaW5pdGlvbi5cbiAgICovXG4gIG1vZGVsSWQ/OiBQcmltYXJ5S2V5VHlwZSB8IFByaW1hcnlLZXlUeXBlW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmUtYnVpbHQgZmlsdGVyaW5nIGV4cHJlc3Npb24gYXBwbGllZCB0byByZXBvc2l0b3J5IHF1ZXJpZXMuXG4gICAqIEBzdW1tYXJ5IFN1cHBseSBhIGN1c3RvbSBgQXR0cmlidXRlT3B0aW9uYCB0byBjb250cm9sIGhvdyByZWNvcmRzIGFyZSBjb25zdHJhaW5lZC4gV2hlbiBvbWl0dGVkLFxuICAgKiB0aGUgZGlyZWN0aXZlIGRlcml2ZXMgYSBjb25kaXRpb24gZnJvbSBgZmlsdGVyQnlgIG9yIGBwa2AsIGNvbXBhcmluZyBpdCBhZ2FpbnN0IGBtb2RlbElkYC5cbiAgICovXG4gIGZpbHRlciE6IGFueTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1vZGVsIGZpZWxkIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBkZWZhdWx0IGNvbmRpdGlvbi5cbiAgICogQHN1bW1hcnkgSW5kaWNhdGVzIHdoaWNoIGtleSBzaG91bGQgYmUgY29tcGFyZWQgdG8gYG1vZGVsSWRgIHdoZW4gYGZpbHRlcmAgaXMgbm90IHByb3ZpZGVkLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBwcmltYXJ5IGtleSBzbyBvdmVycmlkZXMgYXJlIG9ubHkgbmVlZGVkIGZvciBjdXN0b20gbG9va3Vwcy5cbiAgICovXG4gIGZpbHRlckJ5ITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIENSVUQgb3BlcmF0aW9uIHR5cGUgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBtb2RlbC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIG9wZXJhdGlvbiAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgdGhpcyBjb21wb25lbnQgaW5zdGFuY2VcbiAgICogc2hvdWxkIHBlcmZvcm0uIFRoaXMgZGV0ZXJtaW5lcyB0aGUgVUkgYmVoYXZpb3IsIGZvcm0gY29uZmlndXJhdGlvbiwgYW5kIGF2YWlsYWJsZSBhY3Rpb25zLlxuICAgKiBUaGUgb3BlcmF0aW9uIGFmZmVjdHMgZm9ybSB2YWxpZGF0aW9uLCBmaWVsZCBhdmFpbGFiaWxpdHksIGFuZCB0aGUgc3BlY2lmaWMgcmVwb3NpdG9yeVxuICAgKiBtZXRob2QgY2FsbGVkIGR1cmluZyBkYXRhIHN1Ym1pc3Npb24uXG4gICAqXG4gICAqIEB0eXBlIHtPcGVyYXRpb25LZXlzfVxuICAgKi9cbiAgb3BlcmF0aW9uPzogT3BlcmF0aW9uS2V5cztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJvdXRlciBpbnN0YW5jZSBmb3IgcHJvZ3JhbW1hdGljIG5hdmlnYXRpb24uXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIFJvdXRlciBzZXJ2aWNlIHVzZWQgZm9yIHByb2dyYW1tYXRpYyBuYXZpZ2F0aW9uIGJldHdlZW4gcm91dGVzXG4gICAqIGluIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBzZXJ2aWNlIGVuYWJsZXMgbmF2aWdhdGlvbiB0byBkaWZmZXJlbnQgdmlld3MgYW5kIG9wZXJhdGlvbnMsXG4gICAqIGhhbmRsZXMgcm91dGUgcGFyYW1ldGVycywgYW5kIG1hbmFnZXMgdGhlIGJyb3dzZXIncyBuYXZpZ2F0aW9uIGhpc3RvcnkuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHJvdXRlcj86IGFueTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5hbWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdHJpbmcgaWRlbnRpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIG5hbWUgb3IgbGFiZWwgdGhlIGNvbXBvbmVudFxuICAgKiBpbnN0YW5jZS4gVGhpcyBuYW1lIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGxvZ2dpbmcsIG9yIHRvIGlkZW50aWZ5IHNwZWNpZmljXG4gICAqIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aGluIGEgbGFyZ2VyIGFwcGxpY2F0aW9uIHN0cnVjdHVyZS4gSXQgc2VydmVzIGFzIGEgaHVtYW4tcmVhZGFibGVcbiAgICogaWRlbnRpZmllciB0aGF0IGhlbHBzIGRpc3Rpbmd1aXNoIGJldHdlZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNvbXBvbmVudCB0eXBlLlxuICAgKi9cbiAgbmFtZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcmVudCBjb21wb25lbnQgaWRlbnRpZmllciBmb3IgaGllcmFyY2hpY2FsIGNvbXBvbmVudCByZWxhdGlvbnNoaXBzLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCBjb21wb25lbnQgaW4gYSBoaWVyYXJjaGljYWwgY29tcG9uZW50IHN0cnVjdHVyZS5cbiAgICogVGhpcyBwcm9wZXJ0eSBlc3RhYmxpc2hlcyBhIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb21wb25lbnRzLCBhbGxvd2luZyBmb3JcbiAgICogcHJvcGVyIG5lc3RpbmcgYW5kIG9yZ2FuaXphdGlvbiBvZiBjb21wb25lbnRzIHdpdGhpbiBhIGxheW91dC4gSXQgY2FuIGJlIHVzZWQgdG8gdHJhY2tcbiAgICogY29tcG9uZW50IGRlcGVuZGVuY2llcyBhbmQgZXN0YWJsaXNoIGNvbXBvbmVudCBoaWVyYXJjaGllcyBmb3IgcmVuZGVyaW5nIGFuZCBldmVudCBwcm9wYWdhdGlvbi5cbiAgICovXG4gIGNoaWxkT2YhOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgaWRlbnRpZmllciBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmb3IgZWFjaCBjb21wb25lbnQgaW5zdGFuY2UuXG4gICAqIFRoaXMgVUlEIGlzIHVzZWQgZm9yIERPTSBlbGVtZW50IGlkZW50aWZpY2F0aW9uLCBjb21wb25lbnQgdHJhY2tpbmcsIGFuZCBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAqIEJ5IGRlZmF1bHQsIGl0IGdlbmVyYXRlcyBhIHJhbmRvbSAxNi1jaGFyYWN0ZXIgdmFsdWUsIGJ1dCBpdCBjYW4gYmUgZXhwbGljaXRseSBzZXQgdmlhIGlucHV0LlxuICAgKi9cbiAgdWlkPzogUHJpbWFyeUtleVR5cGU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBmaWVsZCBuYW1lIGZvciB0aGUgZGF0YSBtb2RlbC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIGZpZWxkIGluIHRoZSBtb2RlbCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgcHJpbWFyeSBrZXkuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGlkZW50aWZ5aW5nIHVuaXF1ZSByZWNvcmRzIGluIG9wZXJhdGlvbnMgbGlrZSB1cGRhdGUgYW5kIGRlbGV0ZS5cbiAgICogSWYgbm90IGV4cGxpY2l0bHkgc2V0LCBpdCBkZWZhdWx0cyB0byB0aGUgcmVwb3NpdG9yeSdzIGNvbmZpZ3VyZWQgcHJpbWFyeSBrZXkgb3IgJ2lkJy5cbjEgICAqL1xuICBwayE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0aW9uIHNlcnZpY2UgZm9yIGFwcGxpY2F0aW9uIGludGVybmF0aW9uYWxpemF0aW9uLlxuICAgKiBAc3VtbWFyeSBJbmplY3RlZCBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgdHJhbnNsYXRpb24gY2FwYWJpbGl0aWVzIGZvciBVSSB0ZXh0LlxuICAgKiBVc2VkIHRvIHRyYW5zbGF0ZSBidXR0b24gbGFiZWxzLCB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBhbmQgb3RoZXIgdGV4dCBjb250ZW50IGJhc2VkXG4gICAqIG9uIHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nLCBlbmFibGluZyBtdWx0aWxpbmd1YWwgc3VwcG9ydCB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgdHJhbnNsYXRlU2VydmljZSE6IERlY2FmVHJhbnNsYXRlU2VydmljZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBzZXJ2aWNlIGZvciBtYW51YWwgY2hhbmdlIGRldGVjdGlvbiBjb250cm9sLlxuICAgKiBAc3VtbWFyeSBJbmplY3RlZCBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgbWFudWFsIGNvbnRyb2wgb3ZlciBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlcy5cbiAgICogVGhpcyBpcyBlc3NlbnRpYWwgZm9yIGVuc3VyaW5nIHRoYXQgcHJvZ3JhbW1hdGljIERPTSBjaGFuZ2VzIChsaWtlIHNldHRpbmcgYWNjb3JkaW9uXG4gICAqIGF0dHJpYnV0ZXMpIGFyZSBwcm9wZXJseSByZWZsZWN0ZWQgaW4gdGhlIGNvbXBvbmVudCdzIHN0YXRlIGFuZCB0cmlnZ2VyIGFwcHJvcHJpYXRlXG4gICAqIHZpZXcgdXBkYXRlcyB3aGVuIG1vZGlmaWNhdGlvbnMgb2NjdXIgb3V0c2lkZSB0aGUgbm9ybWFsIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBmbG93LlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyBmaWVsZCB2aXNpYmlsaXR5IGJhc2VkIG9uIENSVUQgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgQ2FuIGJlIGEgYm9vbGVhbiBvciBhbiBhcnJheSBvZiBvcGVyYXRpb24ga2V5cyB3aGVyZSB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICovXG4gIGhpZGRlbj86IGJvb2xlYW4gfCBDcnVkT3BlcmF0aW9uS2V5c1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGFiZWwgZm9yIHRoZSBmaWxlIHVwbG9hZCBmaWVsZC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSB1c2VyLWZyaWVuZGx5IGxhYmVsIGZvciB0aGUgZmlsZSB1cGxvYWQgaW5wdXQuXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlYWQtb25seS5cbiAgICovXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGFyayBtb2RlIHN1cHBvcnQgZm9yIHRoZSBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gZW5hYmxlZCwgdGhlIGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSBzeXN0ZW0ncyBkYXJrIG1vZGVcbiAgICogcHJlZmVyZW5jZSB1c2luZyB0aGUgbWVkaWEgc2VydmljZSBhbmQgYXBwbHkgYXBwcm9wcmlhdGUgc3R5bGluZyBjbGFzc2VzLiBUaGlzIGZsYWdcbiAgICogY29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50IHNob3VsZCByZXNwb25kIHRvIGRhcmsgbW9kZSBjaGFuZ2VzIGFuZCBhcHBseSB0aGVcbiAgICogZGFyayBwYWxldHRlIGNsYXNzIHRvIGl0cyBET00gZWxlbWVudC4gQnkgZGVmYXVsdCwgZGFyayBtb2RlIHN1cHBvcnQgaXMgZGlzYWJsZWQuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBlbmFibGVEYXJrTW9kZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIGRhcmsgbW9kZSBzdXBwb3J0IGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBXaGVuIGVuYWJsZWQsIHRoZSBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgc3lzdGVtJ3MgZGFyayBtb2RlXG4gICAqIHByZWZlcmVuY2UgdXNpbmcgdGhlIG1lZGlhIHNlcnZpY2UgYW5kIGFwcGx5IGFwcHJvcHJpYXRlIHN0eWxpbmcgY2xhc3Nlcy4gVGhpcyBmbGFnXG4gICAqIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBzaG91bGQgcmVzcG9uZCB0byBkYXJrIG1vZGUgY2hhbmdlcyBhbmQgYXBwbHkgdGhlXG4gICAqIGRhcmsgcGFsZXR0ZSBjbGFzcyB0byBpdHMgRE9NIGVsZW1lbnQuIEJ5IGRlZmF1bHQsIGRhcmsgbW9kZSBzdXBwb3J0IGlzIGRpc2FibGVkLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNEYXJrTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBsb2NhbGUgaWRlbnRpZmllciBmb3IgY29tcG9uZW50IGludGVybmF0aW9uYWxpemF0aW9uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGxvY2FsZSBjb2RlIChlLmcuLCAnZW4tVVMnLCAncHQtQlInKSB1c2VkIGZvciB0cmFuc2xhdGluZyBVSSB0ZXh0XG4gICAqIGFuZCBmb3JtYXR0aW5nIGRhdGEgYWNjb3JkaW5nIHRvIHJlZ2lvbmFsIGNvbnZlbnRpb25zLiBUaGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gb3ZlcnJpZGVcbiAgICogdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gbG9jYWxlIGZvciB0aGlzIHNwZWNpZmljIGNvbXBvbmVudCBpbnN0YW5jZSwgZW5hYmxpbmcgcGVyLWNvbXBvbmVudFxuICAgKiBsb2NhbGl6YXRpb24gd2hlbiBuZWVkZWQuXG4gICAqL1xuICBsb2NhbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciBsaXN0IGl0ZW0gcmVuZGVyaW5nIGJlaGF2aW9yLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBsaXN0IGl0ZW1zIHNob3VsZCBiZSByZW5kZXJlZCBpbiB0aGUgY29tcG9uZW50LlxuICAgKiBUaGlzIHByb3BlcnR5IGhvbGRzIGEgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIHRhZyBuYW1lXG4gICAqIGFuZCBvdGhlciBwcm9wZXJ0aWVzIG5lZWRlZCB0byByZW5kZXIgbGlzdCBpdGVtcyBjb3JyZWN0bHkuIFRoZSB0YWcgcHJvcGVydHlcbiAgICogaWRlbnRpZmllcyB3aGljaCBjb21wb25lbnQgc2hvdWxkIGJlIHVzZWQgdG8gcmVuZGVyIGVhY2ggaXRlbSBpbiBhIGxpc3QuXG4gICAqIEFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgaW5jbHVkZWQgdG8gY3VzdG9taXplIHRoZSByZW5kZXJpbmcgYmVoYXZpb3IuXG4gICAqL1xuICBpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgdGFnOiBcIlwiIH07XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEeW5hbWljIHByb3BlcnRpZXMgY29uZmlndXJhdGlvbiBmb3IgcnVudGltZSBjdXN0b21pemF0aW9uLlxuICAgKiBAc3VtbWFyeSBDb250YWlucyBrZXktdmFsdWUgcGFpcnMgb2YgZHluYW1pYyBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBhdCBydW50aW1lLiBUaGlzIGZsZXhpYmxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFsbG93cyBmb3IgZHluYW1pYyBwcm9wZXJ0eSBhc3NpZ25tZW50IHdpdGhvdXRcbiAgICogcmVxdWlyaW5nIGV4cGxpY2l0IGlucHV0IGJpbmRpbmdzIGZvciBldmVyeSBwb3NzaWJsZSBjb25maWd1cmF0aW9uIG9wdGlvbi4gUHJvcGVydGllcyBmcm9tXG4gICAqIHRoaXMgb2JqZWN0IGFyZSBwYXJzZWQgYW5kIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0aHJvdWdoIHRoZSBwYXJzZVByb3BzIG1ldGhvZCxcbiAgICogZW5hYmxpbmcgY3VzdG9taXphYmxlIGNvbXBvbmVudCBiZWhhdmlvciBiYXNlZCBvbiBleHRlcm5hbCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCYXNlIHJvdXRlIHBhdGggZm9yIGNvbXBvbmVudCBuYXZpZ2F0aW9uLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBiYXNlIHJvdXRlIHBhdGggdXNlZCBmb3IgbmF2aWdhdGlvbiBhY3Rpb25zIHJlbGF0ZWQgdG8gdGhpcyBjb21wb25lbnQuXG4gICAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBhcyBhIHByZWZpeCBmb3IgY29uc3RydWN0aW5nIG5hdmlnYXRpb24gVVJMcyB3aGVuIHRyYW5zaXRpb25pbmcgYmV0d2VlblxuICAgKiBkaWZmZXJlbnQgb3BlcmF0aW9ucyBvciB2aWV3cy4gVGhlIHJvdXRlIGhlbHBzIGVzdGFibGlzaCB0aGUgY29tcG9uZW50J3MgcG9zaXRpb24gaW4gdGhlXG4gICAqIGFwcGxpY2F0aW9uJ3Mgcm91dGluZyBoaWVyYXJjaHkuXG4gICAqL1xuICByb3V0ZT86IHN0cmluZyA9IFwiXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIGJvcmRlcnMgYXJlIGRpc3BsYXllZCBhcm91bmQgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB2aXN1YWxseSBvdXRsaW5lZCB3aXRoIGJvcmRlcnMuXG4gICAqIFdoZW4gdHJ1ZSwgYm9yZGVycyBhcmUgc2hvd24gdG8gdmlzdWFsbHkgc2VwYXJhdGUgdGhlIGNvbXBvbmVudCBmcm9tIHN1cnJvdW5kaW5nIGNvbnRlbnQuXG4gICAqL1xuICBib3JkZXJzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgbmFtZSBpZGVudGlmaWVyIGZvciBsb2dnaW5nIGFuZCBsb2NhbGl6YXRpb24gY29udGV4dHMuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY29tcG9uZW50J3MgbmFtZSB3aGljaCBpcyB1c2VkIGFzIGEga2V5IGZvciBsb2dnaW5nIGNvbnRleHRzXG4gICAqIGFuZCBhcyBhIGJhc2UgZm9yIGxvY2FsZSByZXNvbHV0aW9uLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJvb3Qga2V5IGZvciBjb21wb25lbnQgbG9jYWxlIGNvbnRleHQgcmVzb2x1dGlvbi5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgYmFzZSBrZXkgdXNlZCB0byByZXNvbHZlIGxvY2FsaXphdGlvbiBjb250ZXh0cyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqIElmIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkLCBpdCBkZWZhdWx0cyB0byB0aGUgY29tcG9uZW50J3MgbmFtZS4gVGhpcyBrZXkgaXMgdXNlZCB0b1xuICAgKiBsb2FkIGFwcHJvcHJpYXRlIHRyYW5zbGF0aW9uIHJlc291cmNlcyBhbmQgbG9jYWxlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgbG9jYWxlUm9vdD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgQ2FuIGJlIGEgc3RyaW5nLCBudW1iZXIsIGRhdGUsIG9yIGFycmF5IG9mIHN0cmluZyBvciBvYmplY3RzLlxuICAgKi9cbiAgdmFsdWU/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gQ1JVRCBvcGVyYXRpb24gY29uc3RhbnRzIGZvciB0ZW1wbGF0ZSB1c2FnZS5cbiAgICogQHN1bW1hcnkgRXhwb3NlcyB0aGUgT3BlcmF0aW9uS2V5cyBlbnVtIHRvIHRoZSBjb21wb25lbnQgdGVtcGxhdGUsIGVuYWJsaW5nXG4gICAqIGNvbmRpdGlvbmFsIHJlbmRlcmluZyBhbmQgYmVoYXZpb3IgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVzLiBUaGlzIHByb3RlY3RlZFxuICAgKiByZWFkb25seSBwcm9wZXJ0eSBlbnN1cmVzIHRoYXQgdGVtcGxhdGUgbG9naWMgY2FuIGFjY2VzcyBvcGVyYXRpb24gY29uc3RhbnRzXG4gICAqIHdoaWxlIG1haW50YWluaW5nIGVuY2Fwc3VsYXRpb24gYW5kIHByZXZlbnRpbmcgYWNjaWRlbnRhbCBtb2RpZmljYXRpb24uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgT3BlcmF0aW9uS2V5cyA9IE9wZXJhdGlvbktleXM7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIExvY2F0aW9uIHNlcnZpY2UuXG4gICAqIEBzdW1tYXJ5IEluamVjdGVkIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBicm93c2VyJ3MgVVJMIGFuZCBoaXN0b3J5LlxuICAgKiBVbmxpa2UgdGhlIFJvdXRlciwgTG9jYXRpb24gYWxsb3dzIGZvciBsb3ctbGV2ZWwgbWFuaXB1bGF0aW9uIG9mIHRoZSBicm93c2VyJ3MgaGlzdG9yeSBzdGFja1xuICAgKiBhbmQgVVJMIHBhdGgsIHN1Y2ggYXMgcHJvZ3JhbW1hdGljYWxseSBuYXZpZ2F0aW5nIGJhY2sgb3IgZm9yd2FyZCwgb3IgdXBkYXRpbmcgdGhlIFVSTCB3aXRob3V0XG4gICAqIHRyaWdnZXJpbmcgYSByb3V0ZSBjaGFuZ2UuIFRoaXMgaXMgdXNlZnVsIGZvciBzY2VuYXJpb3Mgd2hlcmUgeW91IG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGVcbiAgICogYnJvd3NlciBoaXN0b3J5IG9yIFVSTCBvdXRzaWRlIG9mIEFuZ3VsYXIncyByb3V0aW5nIHN5c3RlbSwgc3VjaCBhcyBjbG9zaW5nIG1vZGFscywgaGFuZGxpbmdcbiAgICogcG9wc3RhdGUgZXZlbnRzLCBvciBzdXBwb3J0aW5nIGN1c3RvbSBuYXZpZ2F0aW9uIGxvZ2ljLlxuICAgKlxuICAgKi9cbiAgbG9jYXRpb24hOiBhbnk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGluc3RhbmNlIGZvciBkYXRhIGxheWVyIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIERlY2FmUmVwb3NpdG9yeSBjbGFzcywgaW5pdGlhbGl6ZWQgbGF6aWx5IGluIHRoZSByZXBvc2l0b3J5IGdldHRlci5cbiAgICogVGhlIHJlcG9zaXRvcnkgaXMgdXNlZCB0byBwZXJmb3JtIENSVUQgKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUpIG9wZXJhdGlvbnMgb24gdGhlXG4gICAqIGRhdGEgbW9kZWwgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcgZGF0YSBiYXNlZCBvbiBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIF9yZXBvc2l0b3J5PzogSVJlcG9zaXRvcnk8TT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXphdGlvbiBzdGF0dXMgZmxhZyBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVHJhY2tzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkIGl0cyBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBpbml0aWFsaXphdGlvbiBhbmQgdG8gZGV0ZXJtaW5lIGlmXG4gICAqIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb24gY2FuIGJlIHBlcmZvcm1lZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHByb3RlY3RlZCBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBldmVudHM6IFVJRXZlbnRQcm9wZXJ0eSA9IHt9O1xuXG4gIHByb3RlY3RlZCBoYW5kbGVyczogVUlFdmVudFByb3BlcnR5ID0ge307XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgcmVwb3NpdG9yeSgpOiBJUmVwb3NpdG9yeTxNPiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9zaXRvcnkgYXMgSVJlcG9zaXRvcnk8TT47XG4gIH1cblxuICBzZXQgcmVwb3NpdG9yeShyZXBvc2l0b3J5OiBJUmVwb3NpdG9yeTxNPikge1xuICAgIHRoaXMuX3JlcG9zaXRvcnkgPSByZXBvc2l0b3J5O1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5yZW5kZXIpXG4gICAgICAuaW5mbyhgcmVuZGVyIGZvciAke3RoaXMuY29tcG9uZW50TmFtZX0gd2l0aCAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaCguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMubG9nLmZvcih0aGlzLnJlZnJlc2gpLmluZm8oYFJlZnJlc2ggY2FsbGVkIHdpdGggYXJnczogJHthcmdzfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IGluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBgaW5pdGlhbGl6ZWRgIHByb3BlcnR5IHRvIGB0cnVlYCBvbmNlIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBBIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgb2YgdW5rbm93biB0eXBlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbml0aWFsaXphdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluaXRpYWxpemUoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2xhdGVzIGNvbnRlbnQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogTG9ncyB0aGUgdHJhbnNsYXRpb24gcmVxdWVzdCB3aXRoIHRoZSBjb21wb25lbnQgbmFtZSBhbmQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyAtIEEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB1c2VkIGZvciB0cmFuc2xhdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdHJhbnNsYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgdHJhbnNsYXRlKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy50cmFuc2xhdGUpXG4gICAgICAuaW5mbyhgdHJhbnNsYXRlIGZvciAke3RoaXMuY29tcG9uZW50TmFtZX0gd2l0aCAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICB9XG5cbiAgYXN5bmMgcHJldmlldyguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZy5mb3IodGhpcy5wcmV2aWV3KS5kZWJ1ZyhgUHJldmlldyBjYWxsZWQgd2l0aCBhcmdzOiAke2FyZ3N9YCk7XG4gIH1cblxuICAvLyBhc3luYyBwcm9jZXNzKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8YW55PiB7XG4gIC8vICAgdGhpcy5sb2cuZm9yKHRoaXMucHJvY2VzcykuZGVidWcoYFByb2Nlc3MgY2FsbGVkIHdpdGggYXJnczogJHthcmdzfWApO1xuICAvLyB9XG5cbiAgLy8gYXN5bmMgYmF0Y2hPcGVyYXRpb24oLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTxhbnk+IHtcbiAgLy8gICB0aGlzLmxvZ1xuICAvLyAgICAgLmZvcih0aGlzLmJhdGNoT3BlcmF0aW9uKVxuICAvLyAgICAgLmRlYnVnKGBCYXRjaE9wZXJhdGlvbiBjYWxsZWQgd2l0aCBhcmdzOiAke2FyZ3N9YCk7XG4gIC8vIH1cblxuICAvKipcbiAgICogU3VibWl0cyBkYXRhIG9yIHBlcmZvcm1zIGFuIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBBIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgb2YgYW55IHR5cGUgdG8gYmUgcGFzc2VkIHRvIHRoZSBzdWJtaXQgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIHN1Ym1pdCBvcGVyYXRpb24uXG4gICAqL1xuICBhc3luYyBzdWJtaXQoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnN1Ym1pdClcbiAgICAgIC5pbmZvKGBzdWJtaXQgZm9yICR7dGhpcy5jb21wb25lbnROYW1lfSB3aXRoICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vcm1hbGl6ZXMgaGFuZGxlciBkZWZpbml0aW9ucyBpbnRvIGV4ZWN1dGFibGUgZnVuY3Rpb25zLlxuICAgKiBAc3VtbWFyeSBJdGVyYXRlcyB0aHJvdWdoIGEgaGFuZGxlcnMgbWFwIGFuZCBlbnN1cmVzIGVhY2ggZW50cnkgaXMgc3RvcmVkIGFzIGEgY2FsbGFibGVcbiAgICogZnVuY3Rpb24gb24gdGhlIGNvbXBvbmVudC4gUGxhaW4gZnVuY3Rpb25zIGFyZSBzdG9yZWQgZGlyZWN0bHksIHdoaWxlIGhhbmRsZXIgY2xhc3NlcyBhcmVcbiAgICogaW5zdGFudGlhdGVkIHNvIHRoZWlyIGBoYW5kbGVgIG1ldGhvZCAob3IgYSBrZXllZCBvdmVycmlkZSkgYmVjb21lcyB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVyLlxuICAgKiBUaGlzIGFsbG93cyBkZWNvcmF0b3JzIHRvIGFjY2VwdCBlaXRoZXIgaW5saW5lIGZ1bmN0aW9ucyBvciBoYW5kbGVyIGNsYXNzZXMgdHJhbnNwYXJlbnRseS5cbiAgICogQHRlbXBsYXRlIFQgRXh0ZW5kcyBgRGVjYWZFdmVudEhhbmRsZXJgIHRvIGNvbnN0cmFpbiBoYW5kbGVyIGNsYXNzIHR5cGVzLlxuICAgKiBAcGFyYW0gaGFuZGxlcnMgLSBEaWN0aW9uYXJ5IG9mIGhhbmRsZXIgbmFtZXMgbWFwcGVkIHRvIGZ1bmN0aW9ucyBvciBoYW5kbGVyIGNvbnN0cnVjdG9ycy5cbiAgICogQHBhcmFtIGluc3RhbmNlIC0gT3B0aW9uYWwgdGFyZ2V0IGhhbmRsZXIgaW5zdGFuY2U7IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUhhbmRsZXJzPFQgZXh0ZW5kcyBEZWNhZkV2ZW50SGFuZGxlcj4oXG4gICAgaGFuZGxlcnM6IFVJRXZlbnRQcm9wZXJ0eSxcbiAgICBpbnN0YW5jZTogVFxuICApOiBVSUV2ZW50UHJvcGVydHkge1xuICAgIGNvbnN0IHJlc3VsdDogVUlFdmVudFByb3BlcnR5ID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlcnMpLmZvckVhY2goKFtrZXksIGZuXSkgPT4ge1xuICAgICAgaWYgKGlzQ2xhc3NDb25zdHJ1Y3RvcjxEZWNhZkV2ZW50SGFuZGxlcj4oZm4pKSB7XG4gICAgICAgIGNvbnN0IGNsYXp6ID0gbmV3IGZuKCkgYXMgRGVjYWZFdmVudEhhbmRsZXI7XG4gICAgICAgIGNvbnN0IGV2ZW50ID1cbiAgICAgICAgICBrZXkgaW4gY2xhenogPyBjbGF6eltrZXkgYXMga2V5b2YgRGVjYWZFdmVudEhhbmRsZXJdIDogY2xhenouaGFuZGxlO1xuICAgICAgICByZXN1bHRba2V5XSA9IGV2ZW50O1xuICAgICAgICBpbnN0YW5jZS5oYW5kbGVyc1trZXldID0gZXZlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IGZuO1xuICAgICAgICBpbnN0YW5jZS5oYW5kbGVyc1trZXldID0gZm47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGV2ZW50IGNhbGxiYWNrcyBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYW4gZXZlbnRzIG1hcCBwcm9kdWNlZCBieSBkZWNvcmF0b3JzIHdoZXJlIGVhY2ggdmFsdWUgY2FuIGJlIGEgZmFjdG9yeVxuICAgKiByZXR1cm5pbmcgYSBmdW5jdGlvbiBvciBhIGNvbXBvbmVudCBjb25zdHJ1Y3Rvci4gV2hlbiBhIGNvbnN0cnVjdG9yIGlzIHJldHVybmVkLCB0aGUgbWV0aG9kXG4gICAqIG1hdGNoaW5nIHRoZSBldmVudCBrZXkgaXMgaW5zdGFudGlhdGVkIGFuZCBzdG9yZWQ7IG90aGVyd2lzZSB0aGUgcHJvZHVjZWQgZnVuY3Rpb24gaXNcbiAgICogYXNzaWduZWQgZGlyZWN0bHkuIFRoaXMgZW5hYmxlcyBmbGV4aWJsZSBldmVudCBiaW5kaW5nIGRlZmluaXRpb25zIGZvciBkZXJpdmVkIGNvbXBvbmVudHMuXG4gICAqIEB0ZW1wbGF0ZSBUIEV4dGVuZHMgYERlY2FmQ29tcG9uZW50PE1vZGVsPmAgdG8gc2NvcGUgYWNjZXB0YWJsZSBldmVudCBvd25lcnMuXG4gICAqIEBwYXJhbSBldmVudHMgLSBEaWN0aW9uYXJ5IG9mIGV2ZW50IG5hbWVzIG1hcHBlZCB0byBmdW5jdGlvbiBmYWN0b3JpZXMgb3IgY29tcG9uZW50IGNvbnN0cnVjdG9ycy5cbiAgICogQHBhcmFtIGluc3RhbmNlIC0gT3B0aW9uYWwgY29tcG9uZW50IGluc3RhbmNlIHRvIHJlY2VpdmUgdGhlIGV2ZW50czsgZGVmYXVsdHMgdG8gYHRoaXNgLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlRXZlbnRzPFQgZXh0ZW5kcyBEZWNhZkNvbXBvbmVudDxNb2RlbD4+KFxuICAgIGV2ZW50czogVUlFdmVudFByb3BlcnR5LFxuICAgIGluc3RhbmNlOiBUXG4gICk6IFVJRXZlbnRQcm9wZXJ0eSB7XG4gICAgY29uc3QgcmVzdWx0OiBVSUV2ZW50UHJvcGVydHkgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhldmVudHMpLmZvckVhY2goKFtrZXksIGZuXSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGtleSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBldnQgPSAoZm4gYXMgVUlGdW5jdGlvbkxpa2UpKCk7XG4gICAgICBpZiAoaXNDbGFzc0NvbnN0cnVjdG9yPFQ+KGV2dCkpIHtcbiAgICAgICAgY29uc3QgZm4gPSBuZXcgZXZ0KClba2V5IGFzIGtleW9mIFRdIGFzIFVJRXZlbnRIYW5kbGVyO1xuICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICByZXN1bHRbbmFtZV0gPSBmbjtcbiAgICAgICAgICBpbnN0YW5jZS5ldmVudHNbbmFtZV0gPSBmbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W25hbWVdID0gZm47XG4gICAgICAgIGluc3RhbmNlLmV2ZW50c1tuYW1lXSA9IGZuO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRGVjYWZDb21wb25lbnQgfSBmcm9tIFwiLi9EZWNhZkNvbXBvbmVudFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZXZlbnQgaGFuZGxlclxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc3RydWN0dXJlIGZvciBoYW5kbGluZyBldmVudHMgaW4gdGhlIFVJIGRlY29yYXRvcnMgc3lzdGVtXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZm91bmRhdGlvbiBmb3IgbWFuYWdpbmcgYW5kIHByb2Nlc3NpbmcgZXZlbnRzIHRoYXQgb2NjdXJcbiAqIHdpdGhpbiB0aGUgVUkgY29tcG9uZW50cyBnZW5lcmF0ZWQgYnkgdGhlIGRlY29yYXRvcnMuXG4gKiBAY2xhc3MgRXZlbnRIYW5kbGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvdWlcbiAqL1xuZXhwb3J0IGNsYXNzIERlY2FmRXZlbnRIYW5kbGVyIGV4dGVuZHMgRGVjYWZDb21wb25lbnQ8TW9kZWw+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERlY2FmRXZlbnRIYW5kbGVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IEV2ZW50SGFuZGxlciBvYmplY3RcbiAgICogVGhpcyBjb25zdHJ1Y3RvciBjdXJyZW50bHkgZG9lc24ndCB0YWtlIGFueSBwYXJhbWV0ZXJzLCBidXQgaXQgY2FuIGJlXG4gICAqIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUgdG8gYWNjZXB0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpZiBuZWVkZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gZXZlbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBMb2dzIHRoZSBldmVudCBoYW5kbGluZyBwcm9jZXNzLCBpbmNsdWRpbmcgdGhlIGNvbXBvbmVudCBuYW1lIGFuZCB0aGUgYXJndW1lbnRzIHBhc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIGZvciB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgaGFuZGxlKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMuaGFuZGxlKVxuICAgICAgLmluZm8oYGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50TmFtZX0gaGFuZGxpbmcgJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIGNsaWNrIGV2ZW50IHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogTG9ncyB0aGUgZXZlbnQgaGFuZGxpbmcgcHJvY2VzcywgaW5jbHVkaW5nIHRoZSBjb21wb25lbnQgbmFtZSBhbmQgdGhlIGFyZ3VtZW50cyBwYXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGV2ZW50IGhhbmRsZXIuXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGhhbmRsZUNsaWNrKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMuaGFuZGxlQ2xpY2spXG4gICAgICAuaW5mbyhcbiAgICAgICAgYGNvbXBvbmVudCAke3RoaXMuY29tcG9uZW50TmFtZX0gaGFuZGxpbmcgY2xpY2sgJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gY2xpY2sgZXZlbnQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBMb2dzIHRoZSBldmVudCBoYW5kbGluZyBwcm9jZXNzLCBpbmNsdWRpbmcgdGhlIGNvbXBvbmVudCBuYW1lIGFuZCB0aGUgYXJndW1lbnRzIHBhc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIGZvciB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgaGFuZGxlQWN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMuaGFuZGxlQWN0aW9uKVxuICAgICAgLmluZm8oXG4gICAgICAgIGBjb21wb25lbnQgJHt0aGlzLmNvbXBvbmVudE5hbWV9IGhhbmRsaW5nIGFjdGlvbiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWBcbiAgICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWNhZlRyYW5zbGF0ZVNlcnZpY2UgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIHRyYW5zbGF0ZShrZXk6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pik6IGFueSB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy50cmFuc2xhdGUpXG4gICAgICAuaW5mbyhcbiAgICAgICAgYE11c3QgdHJhbnNsYXRlICR7a2V5fSB3aXRoIHBhcmFtcyAke0pTT04uc3RyaW5naWZ5KHBhcmFtcyB8fCB7fSl9YFxuICAgICAgKTtcbiAgfVxuXG4gIGluc3RhbnQoa2V5OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnkge1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMuaW5zdGFudClcbiAgICAgIC5pbmZvKFxuICAgICAgICBgTXVzdCB0cmFuc2xhdGUgJHtrZXl9IHdpdGggcGFyYW1zICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zIHx8IHt9KX1gXG4gICAgICApO1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgdGhhdCBleHRlbmRzIHRoZSBNb2RlbCBwcm90b3R5cGUgd2l0aCByZW5kZXJpbmcgY2FwYWJpbGl0aWVzXG4gKiBAc3VtbWFyeSBBZGRzIHRoZSByZW5kZXIgbWV0aG9kIHRvIGFsbCBNb2RlbCBpbnN0YW5jZXMgZnJvbSBkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUmVuZGVyYWJsZSBpbnRlcmZhY2UgZm9yIHRoZSBNb2RlbCBjbGFzcyBieSBhZGRpbmcgYSByZW5kZXIgbWV0aG9kXG4gKiB0byBpdHMgcHJvdG90eXBlLiBUaGlzIGFsbG93cyBhbnkgTW9kZWwgaW5zdGFuY2UgdG8gYmUgcmVuZGVyZWQgdXNpbmcgdGhlIFJlbmRlcmluZ0VuZ2luZS5cbiAqIEBtb2R1bGUgbW9kZWwvb3ZlcnJpZGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvbW9kZWxcbiAqL1xuXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlbmRlcmluZ0VuZ2luZSB9IGZyb20gXCIuLi91aS9SZW5kZXJpbmdcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uS2V5cywgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25LZXlzLFxuICBnZXRVSUF0dHJpYnV0ZUtleSxcbiAgUmVuZGVyaW5nRXJyb3IsXG4gIFVJRWxlbWVudE1ldGFkYXRhLFxuICBVSUtleXMsXG4gIFVJTW9kZWxNZXRhZGF0YSxcbn0gZnJvbSBcIi4uL3VpL2luZGV4XCI7XG5pbXBvcnQgXCIuL21vZGVsXCI7XG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlbmRlcnMgdGhlIG1vZGVsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSByZW5kZXJpbmcgZW5naW5lXG4gKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgcmVuZGVyaW5nIHRvIHRoZSBSZW5kZXJpbmdFbmdpbmUgYmFzZWQgb24gbW9kZWwgbWV0YWRhdGFcbiAqIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIHJlbmRlciBtZXRob2QgZnJvbSB0aGUgUmVuZGVyYWJsZSBpbnRlcmZhY2UgZm9yIGFsbCBNb2RlbCBpbnN0YW5jZXMuXG4gKiBJdCB1c2VzIHRoZSBSZW5kZXJpbmdFbmdpbmUgdG8gZGV0ZXJtaW5lIGhvdyB0byByZW5kZXIgdGhlIG1vZGVsIGJhc2VkIG9uIGl0cyBtZXRhZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgTSBUeXBlIG9mIHRoZSBtb2RlbCBiZWluZyByZW5kZXJlZFxuICogQHBhcmFtIHthbnlbXX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZW5kZXJpbmcgZW5naW5lXG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZW5kZXJlZCBvdXRwdXQgaW4gdGhlIGZvcm1hdCBkZXRlcm1pbmVkIGJ5IHRoZSByZW5kZXJpbmcgZW5naW5lXG4gKi9cbk1vZGVsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPih0aGlzOiBNLCAuLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gUmVuZGVyaW5nRW5naW5lLnJlbmRlcih0aGlzLCAuLi5hcmdzKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnJlbmRlcmVkQnkgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KG1vZGVsLCBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5SRU5ERVJFRF9CWSkpO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkudWlQcm9wZXJ0aWVzT2YgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwsXG4gICAgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBEZWNvcmF0aW9uS2V5cy5QUk9QRVJUSUVTKVxuICApO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXRhKTtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLnVpRGVjb3JhdGlvbk9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgcHJvcDogc3RyaW5nLFxuICBrZXk/OiBzdHJpbmdcbik6IGFueSB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgbW9kZWwsXG4gICAgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBEZWNvcmF0aW9uS2V5cy5QUk9QRVJUSUVTLCBwcm9wKVxuICApO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICgha2V5KSByZXR1cm4gbWV0YTtcbiAgcmV0dXJuIG1ldGFba2V5XTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpTW9kZWxPZiA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbik6IFVJTW9kZWxNZXRhZGF0YSB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLlVJTU9ERUwpKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpRWxlbWVudE9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgcHJvcDogc3RyaW5nXG4pOiBVSUVsZW1lbnRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQobW9kZWwsIGdldFVJQXR0cmlidXRlS2V5KHByb3AsIFVJS2V5cy5FTEVNRU5UKSk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS51aUxpc3RNb2RlbE9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuKTogVUlNb2RlbE1ldGFkYXRhIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChtb2RlbCwgTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBVSUtleXMuVUlMSVNUTU9ERUwpKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpSGFuZGxlcnNGb3IgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4pOiBVSU1vZGVsTWV0YWRhdGEge1xuICByZXR1cm4gTWV0YWRhdGEuZ2V0KG1vZGVsLCBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5IQU5ETEVSUykpO1xufTtcblxuKE1vZGVsIGFzIGFueSkudWlMYXlvdXRPZiA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbik6IFVJTW9kZWxNZXRhZGF0YSB7XG4gIHJldHVybiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLlVJTEFZT1VUKSk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS51aUlzSGlkZGVuID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgcHJvcDogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuICEhTWV0YWRhdGEuZ2V0KG1vZGVsLCBnZXRVSUF0dHJpYnV0ZUtleShwcm9wLCBVSUtleXMuSElEREVOKSk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS51aUlzSGlkZGVuT24gPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBwcm9wOiBzdHJpbmcsXG4gIG9wPzogQ3J1ZE9wZXJhdGlvbktleXNcbik6IENydWRPcGVyYXRpb25LZXlzW10gfCBib29sZWFuIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChtb2RlbCwgZ2V0VUlBdHRyaWJ1dGVLZXkocHJvcCwgVUlLZXlzLkhJRERFTikpO1xuICBpZiAoIW1ldGEpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFvcCkgcmV0dXJuIG1ldGEgYXMgQ3J1ZE9wZXJhdGlvbktleXNbXTtcbiAgcmV0dXJuIChtZXRhIGFzIENydWRPcGVyYXRpb25LZXlzW10pLmluY2x1ZGVzKG9wKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLnVpVHlwZU9mID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgcHJvcDogc3RyaW5nXG4pOiBVSU1vZGVsTWV0YWRhdGEge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsLFxuICAgIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUywgcHJvcClcbiAgKTtcbiAgaWYgKCFtZXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgYE5vIG1ldGFkYXRhIGZvdW5kIGZvciBwcm9wZXJ0eSAnJHtwcm9wfScgb24gbW9kZWwgJyR7bW9kZWwubmFtZX0nYFxuICAgICk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtZXRhKS5maWx0ZXIoKGspID0+XG4gICAgW1VJS2V5cy5QUk9QLCBVSUtleXMuRUxFTUVOVCwgVUlLZXlzLkNISUxEXS5pbmNsdWRlcyhrKVxuICApO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApXG4gICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICBgTm8gVUkgdHlwZSBtZXRhZGF0YSBmb3VuZCBmb3IgcHJvcGVydHkgJyR7cHJvcH0nIG9uIG1vZGVsICcke21vZGVsLm5hbWV9J2BcbiAgICApO1xuICBpZiAoa2V5cy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgIGBPbmx5IG9uZSB0eXBlIG9mIGRlY29yYXRpb24gaXMgYWxsb3dlZC4gUGxlYXNlIGNob29zZSBiZXR3ZWVuIEB1aXByb3AsIEB1aWNoaWxkIG9yIEB1aWVsZW1lbnRgXG4gICAgKTtcbiAgcmV0dXJuIG1ldGFba2V5c1swXV07XG59O1xuLy9cbi8vIChNZXRhZGF0YSBhcyBhbnkpLnVpRWxlbWVudHMgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbi8vICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4vLyApOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4vLyAgIGNvbnN0IHByb3BzID0gTWV0YWRhdGEudWlQcm9wZXJ0aWVzT2YobW9kZWwpO1xuLy8gICBpZiAoIXByb3BzKSByZXR1cm4gdW5kZWZpbmVkO1xuLy8gICByZXR1cm4gcHJvcHNcbi8vICAgICAubWFwKChwcm9wKSA9PiBNZXRhZGF0YS5nZXQobW9kZWwsIGdldFVJQXR0cmlidXRlS2V5KHByb3AsIFVJS2V5cy5FTEVNRU5UKSkpXG4vLyAgICAgLmZpbHRlcihCb29sZWFuKTtcbi8vIH0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLnVpTGlzdEl0ZW1zID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IE1ldGFkYXRhLFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCxcbiAgICBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMpXG4gICk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xufS5iaW5kKE1vZGVsKTtcbiIsImltcG9ydCB7IFVJS2V5cyB9IGZyb20gXCIuLi91aS9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIFVJSGFuZGxlck1ldGFkYXRhLFxuICBVSUxpc3RNb2RlbE1ldGFkYXRhLFxuICBVSU1vZGVsTWV0YWRhdGEsXG4gIFVJTGF5b3V0TWV0YWRhdGEsXG4gIElQYWdlZENvbXBvbmVudFByb3BlcnRpZXMsXG59IGZyb20gXCIuLi91aS90eXBlc1wiO1xuaW1wb3J0IHsgVUlNZWRpYUJyZWFrUG9pbnRzIH0gZnJvbSBcIi4uL3VpL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYXBwbHksIE1ldGFkYXRhLCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCB0YWdzIGEgY2xhc3MgYXMgYSBVSSBtb2RlbFxuICogQHN1bW1hcnkgQWRkcyByZW5kZXJpbmcgY2FwYWJpbGl0aWVzIHRvIGEgbW9kZWwgY2xhc3MgYnkgcHJvdmlkaW5nIGEgcmVuZGVyIG1ldGhvZFxuICogVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byB0aGUgY2xhc3MgdGhhdCBlbmFibGVzIGl0IHRvIGJlIHJlbmRlcmVkIGJ5IHRoZSBVSSByZW5kZXJpbmcgZW5naW5lLlxuICogVGhlIG1vZGVsIHdpbGwgYmUgcmVuZGVyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZyBhbmQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gVGhlIEhUTUwgdGFnIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGlzIG1vZGVsIChkZWZhdWx0cyB0byBjbGFzcyBuYW1lKVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSByZW5kZXJlZCBlbGVtZW50XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWltb2RlbFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2Ugd2l0aCBkZWZhdWx0IHRhZyAoY2xhc3MgbmFtZSlcbiAqIEB1aW1vZGVsKClcbiAqIGNsYXNzIFVzZXJQcm9maWxlIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gVXNhZ2Ugd2l0aCBjdXN0b20gdGFnIGFuZCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgnZGl2JywgeyBjbGFzczogJ3VzZXItY2FyZCcgfSlcbiAqIGNsYXNzIFVzZXJDYXJkIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aW1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGNvbnN0cnVjdG9yXG4gKiAgIHBhcnRpY2lwYW50IGluc3RhbmNlXG4gKiAgIFN5c3RlbS0+PnVpbW9kZWw6ZG8oY29uc3RydWN0b3IpXG4gKiAgIHVpbW9kZWwtPj5jb25zdHJ1Y3RvcjogRXhlY3V0ZXMgdGhlIGNvbnN0cnVjdG9yXG4gKiAgIGNvbnN0cnVjdG9yLT4+dWltb2RlbDogcmV0dXJucyBpbnN0YW5jZVxuICogICB1aW1vZGVsLT4+aW5zdGFuY2U6IGFkZHMgdGhlIHJlbmRlciBtZXRob2RcbiAqICAgdWltb2RlbC0+PlN5c3RlbTogcmV0dXJucyBVSU1vZGVsIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aW1vZGVsKHRhZz86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGE6IFVJTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnIHx8IG9yaWdpbmFsLm5hbWUsXG4gICAgICBwcm9wczogcHJvcHMsXG4gICAgfTtcbiAgICByZXR1cm4gbWV0YWRhdGEoXG4gICAgICBNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5VSU1PREVMKSxcbiAgICAgIG1ldGFcbiAgICApKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc3BlY2lmaWVzIHdoaWNoIHJlbmRlcmluZyBlbmdpbmUgdG8gdXNlIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBBc3NvY2lhdGVzIGEgbW9kZWwgd2l0aCBhIHNwZWNpZmljIHJlbmRlcmluZyBlbmdpbmUgaW1wbGVtZW50YXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjbGFzcyxcbiAqIGVuYWJsaW5nIGRpZmZlcmVudCByZW5kZXJpbmcgc3RyYXRlZ2llcyBmb3IgZGlmZmVyZW50IG1vZGVscy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5naW5lIFRoZSBuYW1lIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHVzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHJlbmRlcmVkQnlcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNwZWNpZnkgYSBjdXN0b20gcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbFxuICogQHVpbW9kZWwoKVxuICogQHJlbmRlcmVkQnkoJ3JlYWN0JylcbiAqIGNsYXNzIFJlYWN0Q29tcG9uZW50IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCByZW5kZXJlZEJ5XG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj5yZW5kZXJlZEJ5OiBhcHBseSB0byBNb2RlbFxuICogICByZW5kZXJlZEJ5LT4+TW9kZWw6IGFkZHMgZW5naW5lIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiB1c2VzIHNwZWNpZmllZCBlbmdpbmVcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+U3lzdGVtOiByZW5kZXJzIHdpdGggY3VzdG9tIGVuZ2luZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyZWRCeShlbmdpbmU6IHN0cmluZykge1xuICByZXR1cm4gYXBwbHkoXG4gICAgbWV0YWRhdGEoTWV0YWRhdGEua2V5KFVJS2V5cy5SRUZMRUNULCBVSUtleXMuUkVOREVSRURfQlkpLCBlbmdpbmUpXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHRhZ3MgYSBtb2RlbCBhcyBhIGxpc3QgaXRlbSBmb3IgVUkgcmVuZGVyaW5nXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGEgbW9kZWwgc2hvdWxkIGJlIHJlbmRlcmVkIHdoZW4gZGlzcGxheWVkIGluIGEgbGlzdCBjb250ZXh0XG4gKiBUaGlzIGRlY29yYXRvciBhcHBsaWVzIG1ldGFkYXRhIHRvIHRoZSBjbGFzcyB0aGF0IGVuYWJsZXMgaXQgdG8gYmUgcmVuZGVyZWQgYXMgYSBsaXN0IGl0ZW1cbiAqIGJ5IHRoZSBVSSByZW5kZXJpbmcgZW5naW5lLiBUaGUgbW9kZWwgd2lsbCBiZSByZW5kZXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnIGFuZCBwcm9wZXJ0aWVzXG4gKiB3aGVuIGl0IGFwcGVhcnMgaW4gYSBsaXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSBUaGUgSFRNTCB0YWcgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoaXMgbW9kZWwgYXMgYSBsaXN0IGl0ZW0gKGRlZmF1bHRzIHRvIGNsYXNzIG5hbWUpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIHJlbmRlcmVkIGxpc3QgaXRlbSBlbGVtZW50XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsaXN0bW9kZWxcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCB0YWcgKGNsYXNzIG5hbWUpXG4gKiBAdWltb2RlbCgpXG4gKiBAdWlsaXN0bW9kZWwoKVxuICogY2xhc3MgVG9kb0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiAvLyBVc2FnZSB3aXRoIGN1c3RvbSB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKClcbiAqIEB1aWxpc3Rtb2RlbCgnbGknLCB7IGNsYXNzOiAnbGlzdC1ncm91cC1pdGVtJyB9KVxuICogY2xhc3MgTGlzdEl0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0ZXh0OiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlsaXN0bW9kZWxcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIFN5c3RlbS0+PnVpbGlzdG1vZGVsOiBhcHBseSB0byBNb2RlbFxuICogICB1aWxpc3Rtb2RlbC0+Pk1vZGVsOiBhZGRzIGxpc3QgaXRlbSBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogdXNlcyBsaXN0IGl0ZW0gbWV0YWRhdGEgd2hlbiBpbiBsaXN0IGNvbnRleHRcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+U3lzdGVtOiByZW5kZXJzIHdpdGggbGlzdCBpdGVtIHN0eWxpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGlzdG1vZGVsKG5hbWU/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhOiBVSUxpc3RNb2RlbE1ldGFkYXRhID0ge1xuICAgICAgaXRlbToge1xuICAgICAgICB0YWc6IG5hbWUgfHwgb3JpZ2luYWwubmFtZSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShcbiAgICAgIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLlVJTElTVE1PREVMKSxcbiAgICAgIG1ldGFcbiAgICApKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgYWRkcyBldmVudCBoYW5kbGVycyB0byBhIFVJIG1vZGVsXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgZXZlbnQgaGFuZGxlcnMgdGhhdCBzaG91bGQgYmUgYXR0YWNoZWQgdG8gdGhlIHJlbmRlcmVkIG1vZGVsXG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSBldmVudCBoYW5kbGVycyB0aGF0IHdpbGwgYmUgYXV0b21hdGljYWxseVxuICogYXR0YWNoZWQgdG8gdGhlIHJlbmRlcmVkIFVJIGVsZW1lbnQuIFRoZSBoYW5kbGVycyBhcmUgcGFzc2VkIGFzIHByb3BlcnRpZXNcbiAqIHRvIHRoZSByZW5kZXJpbmcgZW5naW5lLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBPYmplY3QgY29udGFpbmluZyBldmVudCBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgb3RoZXIgcHJvcGVydGllc1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpaGFuZGxlcnNcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCBldmVudCBoYW5kbGVycyB0byBhIG1vZGVsXG4gKiBAdWltb2RlbCgnYnV0dG9uJylcbiAqIEB1aWhhbmRsZXJzKHtcbiAqICAgb25DbGljazogKGV2ZW50KSA9PiBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQnKSxcbiAqICAgb25Nb3VzZU92ZXI6IChldmVudCkgPT4gY29uc29sZS5sb2coJ01vdXNlIG92ZXIgYnV0dG9uJyksXG4gKiAgIGRpc2FibGVkOiBmYWxzZVxuICogfSlcbiAqIGNsYXNzIENsaWNrYWJsZUJ1dHRvbiBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGxhYmVsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gQWRkIGZvcm0gc3VibWlzc2lvbiBoYW5kbGVyc1xuICogQHVpbW9kZWwoJ2Zvcm0nKVxuICogQHVpaGFuZGxlcnMoe1xuICogICBvblN1Ym1pdDogKGV2ZW50KSA9PiB7XG4gKiAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAqICAgICBjb25zb2xlLmxvZygnRm9ybSBzdWJtaXR0ZWQnKTtcbiAqICAgfSxcbiAqICAgb25SZXNldDogKGV2ZW50KSA9PiBjb25zb2xlLmxvZygnRm9ybSByZXNldCcpXG4gKiB9KVxuICogY2xhc3MgQ29udGFjdEZvcm0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBlbWFpbDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgU3lzdGVtXG4gKiAgIHBhcnRpY2lwYW50IHVpaGFuZGxlcnNcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIFN5c3RlbS0+PnVpaGFuZGxlcnM6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpaGFuZGxlcnMtPj5Nb2RlbDogYWRkcyBoYW5kbGVyIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiByZXF1ZXN0cyByZW5kZXJpbmcgd2l0aCBoYW5kbGVyc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogcmVuZGVycyBlbGVtZW50IHdpdGggZXZlbnQgaGFuZGxlcnMgYXR0YWNoZWRcbiAqICAgVUktPj5Nb2RlbDogdHJpZ2dlcnMgaGFuZGxlcnMgb24gZXZlbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWhhbmRsZXJzKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhOiBVSUhhbmRsZXJNZXRhZGF0YSA9IHtcbiAgICAgIGhhbmRsZXJzOiBwcm9wcyxcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShcbiAgICAgIE1ldGFkYXRhLmtleShVSUtleXMuUkVGTEVDVCwgVUlLZXlzLkhBTkRMRVJTKSxcbiAgICAgIG1ldGFcbiAgICApKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgY3JlYXRlcyBhIGxheW91dCBjb250YWluZXIgd2l0aCBncmlkIHNwZWNpZmljYXRpb25zXG4gKiBAc3VtbWFyeSBDb21iaW5lcyBVSSBtb2RlbCBmdW5jdGlvbmFsaXR5IHdpdGggbGF5b3V0IGdyaWQgY29uZmlndXJhdGlvblxuICogVGhpcyBkZWNvcmF0b3IgY3JlYXRlcyBhIFVJIG1vZGVsIHRoYXQgYWN0cyBhcyBhIGxheW91dCBjb250YWluZXIgd2l0aCBzcGVjaWZpZWRcbiAqIGNvbHVtbiBhbmQgcm93IGNvbmZpZ3VyYXRpb25zLiBJdCdzIGEgY29udmVuaWVuY2UgZGVjb3JhdG9yIHRoYXQgY29tYmluZXMuXG4gKiBAdWltb2RlbCB3aXRoIGxheW91dC1zcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciByZXNwb25zaXZlIGdyaWQgbGF5b3V0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIHRhZyB0byB1c2UgZm9yIHRoZSBsYXlvdXQgY29udGFpbmVyXG4gKiBAcGFyYW0ge251bWJlcnxib29sZWFufSBbY29sc01vZGU9MV0gTnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQgbGF5b3V0IG9yIGEgYm9vbGVhbiBmb3IgZmxleCBtb2RlXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmdbXX0gW3Jvd3M9MV0gTnVtYmVyIG9mIHJvd3Mgb3IgYXJyYXkgb2Ygcm93IGRlZmluaXRpb25zXG4gKiBAcGFyYW0ge1VJTWVkaWFCcmVha1BvaW50c30gW2JyZWFrcG9pbnQ9J20nXSBNZWRpYSBicmVha3BvaW50IGZvciByZXNwb25zaXZlIGJlaGF2aW9yXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsYXlvdXRcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHNpbXBsZSAyLWNvbHVtbiBsYXlvdXRcbiAqIEB1aWxheW91dCgnZGl2JywgMiwgMylcbiAqIGNsYXNzIFR3b0NvbHVtbkxheW91dCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dHByb3AoMSwgMSlcbiAqICAgaGVhZGVyOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0cHJvcCgxLCAyKVxuICogICBsZWZ0Q29udGVudDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dHByb3AoMiwgMilcbiAqICAgcmlnaHRDb250ZW50OiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gQ3JlYXRlIGEgcmVzcG9uc2l2ZSBsYXlvdXQgd2l0aCBjdXN0b20gYnJlYWtwb2ludFxuICogQHVpbGF5b3V0KCdzZWN0aW9uJywgdHJ1ZSwgMiwgJ2wnKVxuICogY2xhc3MgUmVzcG9uc2l2ZUxheW91dCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dHByb3AoMSwgMSlcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRwcm9wKDIsIDEpXG4gKiAgIHN1YnRpdGxlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlsYXlvdXRcbiAqICAgcGFydGljaXBhbnQgdWltb2RlbFxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgU3lzdGVtLT4+dWlsYXlvdXQ6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpbGF5b3V0LT4+dWltb2RlbDogY2FsbCB3aXRoIGxheW91dCBwcm9wc1xuICogICB1aW1vZGVsLT4+TW9kZWw6IGFkZHMgbW9kZWwgbWV0YWRhdGEgd2l0aCBsYXlvdXQgY29uZmlnXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiByZXF1ZXN0cyByZW5kZXJpbmcgYXMgbGF5b3V0IGNvbnRhaW5lclxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5TeXN0ZW06IHJlbmRlcnMgZ3JpZCBsYXlvdXQgd2l0aCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsYXlvdXQoXG4gIHRhZzogc3RyaW5nLFxuICBjb2xzTW9kZTogbnVtYmVyIHwgYm9vbGVhbiA9IDEsXG4gIHJvd3M6IG51bWJlciB8IHN0cmluZ1tdID0gMSxcbiAgcHJvcHM6IGFueSA9IHt9XG4pIHtcbiAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7XG4gICAgLi4uKHR5cGVvZiBjb2xzTW9kZSA9PT0gXCJib29sZWFuXCJcbiAgICAgID8ge1xuICAgICAgICAgIGZsZXhNb2RlOiBjb2xzTW9kZSxcbiAgICAgICAgICBjb2xzOiAxLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICBmbGV4TW9kZTogZmFsc2UsXG4gICAgICAgICAgY29sczogY29sc01vZGUsXG4gICAgICAgIH0pLFxuICAgIHJvd3MsXG4gICAgLi4uT2JqZWN0LmFzc2lnbih7IGJyZWFrcG9pbnQ6IFVJTWVkaWFCcmVha1BvaW50cy5MQVJHRSB9LCBwcm9wcyksXG4gIH0gYXMgVUlMYXlvdXRNZXRhZGF0YSk7XG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBtZXRhZGF0YShNZXRhZGF0YS5rZXkoVUlLZXlzLlJFRkxFQ1QsIFVJS2V5cy5VSUxBWU9VVCksIGNvbmZpZykob3JpZ2luYWwpO1xuICAgIHJldHVybiB1aW1vZGVsKHRhZywgY29uZmlnKShvcmlnaW5hbCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBjcmVhdGVzIGEgbXVsdGktc3RlcCBmb3JtIG1vZGVsIHdpdGggcGFnZSBuYXZpZ2F0aW9uXG4gKiBAc3VtbWFyeSBDb21iaW5lcyBVSSBtb2RlbCBmdW5jdGlvbmFsaXR5IHdpdGggc3RlcHBlZC93aXphcmQgZm9ybSBjb25maWd1cmF0aW9uXG4gKiBUaGlzIGRlY29yYXRvciBjcmVhdGVzIGEgVUkgbW9kZWwgdGhhdCBhY3RzIGFzIGEgbXVsdGktc3RlcCBjb250YWluZXIgd2l0aCBwYWdlIG5hdmlnYXRpb25cbiAqIGNhcGFiaWxpdGllcy4gSXQgaXMgZGVzaWduZWQgZm9yIHdpemFyZC1zdHlsZSBmb3JtcyBvciBtdWx0aS1wYWdlIHdvcmtmbG93cyB3aGVyZSB1c2Vyc1xuICogcHJvZ3Jlc3MgdGhyb3VnaCBzZXF1ZW50aWFsIHN0ZXBzLiBUaGUgZGVjb3JhdG9yIGNvbWJpbmVzIEB1aW1vZGVsIHdpdGggcGFnZS1zcGVjaWZpY1xuICogcHJvcGVydGllcyBhbmQgb3B0aW9uYWwgcGFnaW5hdGlvbiBjb250cm9scy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIC0gVGhlIEhUTUwgdGFnIHRvIHVzZSBmb3IgdGhlIHN0ZXBwZWQgZm9ybSBjb250YWluZXJcbiAqIEBwYXJhbSB7bnVtYmVyIHwgSVBhZ2VkQ29tcG9uZW50UHJvcGVydGllc1tdfSBbcGFnZXM9MV0gLSBOdW1iZXIgb2YgcGFnZXMgb3IgYW4gYXJyYXkgb2YgcGFnZSBkZWZpbml0aW9ucyB3aXRoIG1ldGFkYXRhXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYWdpbmF0ZWQ9ZmFsc2VdIC0gV2hldGhlciB0byBzaG93IHBhZ2luYXRpb24gY29udHJvbHMgKGUuZy4sIHByZXYvbmV4dCBidXR0b25zKVxuICogQHBhcmFtIHthbnl9IFtwcm9wcz17fV0gLSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgY29udGFpbmVyIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXN0ZXBwZWRtb2RlbFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgc2ltcGxlIDMtc3RlcCB3aXphcmQgZm9ybVxuICogQHVpc3RlcHBlZG1vZGVsKCdkaXYnLCAzLCB0cnVlKVxuICogY2xhc3MgUmVnaXN0cmF0aW9uV2l6YXJkIGV4dGVuZHMgTW9kZWwge1xuICogICAvLyBQYWdlIDE6IFBlcnNvbmFsIEluZm9cbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDEpXG4gKiAgIGZpcnN0TmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDEpXG4gKiAgIGxhc3ROYW1lOiBzdHJpbmc7XG4gKlxuICogICAvLyBQYWdlIDI6IENvbnRhY3QgSW5mb1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMilcbiAqICAgZW1haWw6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgyKVxuICogICBwaG9uZTogc3RyaW5nO1xuICpcbiAqICAgLy8gUGFnZSAzOiBDb25maXJtYXRpb25cbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDMpXG4gKiAgIGFjY2VwdFRlcm1zOiBib29sZWFuO1xuICogfVxuICpcbiAqIC8vIENyZWF0ZSBhIHdpemFyZCB3aXRoIGN1c3RvbSBwYWdlIGRlZmluaXRpb25zXG4gKiBAdWlzdGVwcGVkbW9kZWwoJ3NlY3Rpb24nLCBbXG4gKiAgIHsgdGl0bGU6ICdQZXJzb25hbCcsIGljb246ICd1c2VyJyB9LFxuICogICB7IHRpdGxlOiAnQ29udGFjdCcsIGljb246ICdlbWFpbCcgfSxcbiAqICAgeyB0aXRsZTogJ1JldmlldycsIGljb246ICdjaGVjaycgfVxuICogXSwgdHJ1ZSwgeyBjbGFzczogJ3dpemFyZC1jb250YWluZXInIH0pXG4gKiBjbGFzcyBPbmJvYXJkaW5nV2l6YXJkIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcGFnZXByb3AoMSlcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwYWdlcHJvcCgyKVxuICogICBlbWFpbDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXBhZ2Vwcm9wKDMpXG4gKiAgIHByZWZlcmVuY2VzOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWlzdGVwcGVkbW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWltb2RlbFxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgUGFnaW5hdGlvbkNvbnRyb2xsZXJcbiAqICAgU3lzdGVtLT4+dWlzdGVwcGVkbW9kZWw6IGFwcGx5IHRvIE1vZGVsXG4gKiAgIHVpc3RlcHBlZG1vZGVsLT4+dWltb2RlbDogY2FsbCB3aXRoIHBhZ2UgY29uZmlnXG4gKiAgIHVpbW9kZWwtPj5Nb2RlbDogYWRkcyBtb2RlbCBtZXRhZGF0YSB3aXRoIHBhZ2VzIGFuZCBwYWdpbmF0aW9uXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiByZXF1ZXN0cyByZW5kZXJpbmcgYXMgc3RlcHBlZCBmb3JtXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlBhZ2luYXRpb25Db250cm9sbGVyOiBpbml0aWFsaXplIHBhZ2UgbmF2aWdhdGlvblxuICogICBQYWdpbmF0aW9uQ29udHJvbGxlci0+PlN5c3RlbTogcmVuZGVycyBjdXJyZW50IHBhZ2Ugd2l0aCBuYXZpZ2F0aW9uIGNvbnRyb2xzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aXN0ZXBwZWRtb2RlbChcbiAgdGFnOiBzdHJpbmcsXG4gIHBhZ2VzOiBudW1iZXIgfCBJUGFnZWRDb21wb25lbnRQcm9wZXJ0aWVzW10gPSAxLFxuICBwYWdpbmF0ZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgcHJvcHM6IGFueSA9IHt9XG4pIHtcbiAgbGV0IHBhZ2VUaXRsZXM6IElQYWdlZENvbXBvbmVudFByb3BlcnRpZXNbXSA9IFtdO1xuICBpZiAodHlwZW9mIHBhZ2VzID09PSBcIm9iamVjdFwiKSB7XG4gICAgcGFnZVRpdGxlcyA9IHBhZ2VzIGFzIElQYWdlZENvbXBvbmVudFByb3BlcnRpZXNbXTtcbiAgICBwYWdlcyA9IHBhZ2VUaXRsZXMubGVuZ3RoO1xuICB9XG4gIHJldHVybiB1aW1vZGVsKHRhZywge1xuICAgIHBhZ2VzLFxuICAgIHBhZ2luYXRlZCxcbiAgICBwYWdlVGl0bGVzLFxuICAgIHByb3BzLFxuICB9KTtcbn1cbiIsImltcG9ydCBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxCdWlsZGVyIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgdWloYW5kbGVycyxcbiAgdWlsYXlvdXQsXG4gIHVpbGlzdG1vZGVsLFxuICB1aW1vZGVsLFxuICB1aXN0ZXBwZWRtb2RlbCxcbiAgcmVuZGVyZWRCeSxcbn0gZnJvbSBcIi4uL21vZGVsL2RlY29yYXRvcnNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIGludGVyZmFjZSBNb2RlbEJ1aWxkZXI8TT4ge1xuICAgIGRlY29yYXRlQ2xhc3MoZGVjb3JhdG9yOiBDbGFzc0RlY29yYXRvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNb2RlbEJ1aWxkZXI8TT4ge1xuICAgIHVpbW9kZWwodGFnPzogc3RyaW5nLCBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgcmVuZGVyZWRCeShlbmdpbmU6IHN0cmluZyk6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICB1aWxpc3Rtb2RlbChuYW1lPzogc3RyaW5nLCBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgdWloYW5kbGVycyhwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgdWlsYXlvdXQoXG4gICAgICB0YWc6IHN0cmluZyxcbiAgICAgIGNvbHNNb2RlPzogbnVtYmVyIHwgYm9vbGVhbixcbiAgICAgIHJvd3M/OiBudW1iZXIgfCBzdHJpbmdbXSxcbiAgICAgIHByb3BzPzogYW55XG4gICAgKTogTW9kZWxCdWlsZGVyPE0+O1xuICAgIHVpc3RlcHBlZG1vZGVsKFxuICAgICAgdGFnOiBzdHJpbmcsXG4gICAgICBwYWdlcz86IG51bWJlciB8IGFueVtdLFxuICAgICAgcGFnaW5hdGVkPzogYm9vbGVhbixcbiAgICAgIHByb3BzPzogYW55XG4gICAgKTogTW9kZWxCdWlsZGVyPE0+O1xuICB9XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IE1vZGVsQnVpbGRlci5wcm90b3R5cGUgYXMgTW9kZWxCdWlsZGVyPGFueT4gJiB7XG4gIHVpbW9kZWw6ICh0YWc/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG4gIHJlbmRlcmVkQnk6IChlbmdpbmU6IHN0cmluZykgPT4gTW9kZWxCdWlsZGVyPGFueT47XG4gIHVpbGlzdG1vZGVsOiAobmFtZT86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBNb2RlbEJ1aWxkZXI8YW55PjtcbiAgdWloYW5kbGVyczogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG4gIHVpbGF5b3V0OiAoXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgY29sc01vZGU/OiBudW1iZXIgfCBib29sZWFuLFxuICAgIHJvd3M/OiBudW1iZXIgfCBzdHJpbmdbXSxcbiAgICBwcm9wcz86IGFueVxuICApID0+IE1vZGVsQnVpbGRlcjxhbnk+O1xuICB1aXN0ZXBwZWRtb2RlbDogKFxuICAgIHRhZzogc3RyaW5nLFxuICAgIHBhZ2VzPzogbnVtYmVyIHwgYW55W10sXG4gICAgcGFnaW5hdGVkPzogYm9vbGVhbixcbiAgICBwcm9wcz86IGFueVxuICApID0+IE1vZGVsQnVpbGRlcjxhbnk+O1xufTtcblxuaWYgKCFwcm90b3R5cGUuZGVjb3JhdGVDbGFzcykge1xuICBwcm90b3R5cGUuZGVjb3JhdGVDbGFzcyA9IGZ1bmN0aW9uIChkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKSB7XG4gICAgaWYgKCEodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMpIHtcbiAgICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycyA9IFtdO1xuICAgIH1cbiAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5wcm90b3R5cGUudWltb2RlbCA9IGZ1bmN0aW9uICh0YWc/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKHVpbW9kZWwodGFnLCBwcm9wcykpO1xufTtcblxucHJvdG90eXBlLnJlbmRlcmVkQnkgPSBmdW5jdGlvbiAoZW5naW5lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHRoaXMuZGVjb3JhdGVDbGFzcyhyZW5kZXJlZEJ5KGVuZ2luZSkpO1xufTtcblxucHJvdG90eXBlLnVpbGlzdG1vZGVsID0gZnVuY3Rpb24gKG5hbWU/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKHVpbGlzdG1vZGVsKG5hbWUsIHByb3BzKSk7XG59O1xuXG5wcm90b3R5cGUudWloYW5kbGVycyA9IGZ1bmN0aW9uIChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgcmV0dXJuIHRoaXMuZGVjb3JhdGVDbGFzcyh1aWhhbmRsZXJzKHByb3BzKSk7XG59O1xuXG5wcm90b3R5cGUudWlsYXlvdXQgPSBmdW5jdGlvbiAoXG4gIHRhZzogc3RyaW5nLFxuICBjb2xzTW9kZT86IG51bWJlciB8IGJvb2xlYW4sXG4gIHJvd3M/OiBudW1iZXIgfCBzdHJpbmdbXSxcbiAgcHJvcHM/OiBhbnlcbikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKHVpbGF5b3V0KHRhZywgY29sc01vZGUsIHJvd3MsIHByb3BzKSk7XG59O1xuXG5wcm90b3R5cGUudWlzdGVwcGVkbW9kZWwgPSBmdW5jdGlvbiAoXG4gIHRhZzogc3RyaW5nLFxuICBwYWdlcz86IG51bWJlciB8IGFueVtdLFxuICBwYWdpbmF0ZWQ/OiBib29sZWFuLFxuICBwcm9wcz86IGFueVxuKSB7XG4gIHJldHVybiB0aGlzLmRlY29yYXRlQ2xhc3ModWlzdGVwcGVkbW9kZWwodGFnLCBwYWdlcywgcGFnaW5hdGVkLCBwcm9wcykpO1xufTtcbiIsIi8qKlxuICogQG1vZHVsZSB1aS1kZWNvcmF0b3JzL2Rhc2hib2FyZC9jb25zdGFudHNcbiAqIEBzdW1tYXJ5IE1ldGFkYXRhIGtleXMgZm9yIHRoZSBkYXNoYm9hcmQtc2VsZWN0YWJsZS1jb21wb25lbnQgZGVjb3JhdG9yLlxuICogQGRlc2NyaXB0aW9uIE5hbWVzcGFjZWQga2V5cyB1c2VkIHRvIHN0b3JlIHBhbGV0dGUgbWV0YWRhdGEgb24gYVxuICogYEBkYXNoY29tcG9uZW50YC1kZWNvcmF0ZWQgY2xhc3MuIE1pcnJvcnMgdGhlIGBncmFwaGAgc3VibW9kdWxlJ3NcbiAqIGBHcmFwaEtleXNgIGNvbnZlbnRpb24gc28gdGhlIGRhc2hib2FyZCBtZXRhZGF0YSBmYW1pbHkgaXMgaXNvbGF0ZWQgZnJvbVxuICogdGhlIFVJIG1vZGVsIG1ldGFkYXRhIGtleXMuXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0YWRhdGEga2V5IGNvbnN0YW50cyBmb3IgZGFzaGJvYXJkIGNvbXBvbmVudHMuXG4gKiBAc3VtbWFyeSBDb2xsZWN0aW9uIG9mIHN0cmluZyBrZXlzIHVzZWQgYXMgbWV0YWRhdGEgbmFtZXNwYWNlcyBmb3JcbiAqIGRhc2hib2FyZC1zZWxlY3RhYmxlIGNvbXBvbmVudHMuIFRoZSBgQ09NUE9ORU5UYCBrZXkgY2FycmllcyB0aGUgcGFsZXR0ZVxuICogbWV0YWRhdGEgb2JqZWN0IGF0dGFjaGVkIGJ5IGBAZGFzaGNvbXBvbmVudCgpYC5cbiAqIEBlbnVtIERhc2hLZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL2NvbnN0YW50c1xuICovXG5leHBvcnQgZW51bSBEYXNoS2V5cyB7XG4gIC8qKiBOYW1lc3BhY2Ugcm9vdCBmb3IgYWxsIGRhc2hib2FyZCBtZXRhZGF0YS4gKi9cbiAgUk9PVCA9IFwiZGFzaGJvYXJkXCIsXG4gIC8qKiBLZXkgdW5kZXIgd2hpY2ggYEBkYXNoY29tcG9uZW50KClgIHBhbGV0dGUgbWV0YWRhdGEgaXMgc3RvcmVkLiAqL1xuICBDT01QT05FTlQgPSBgJHtEYXNoS2V5cy5ST09UfS5jb21wb25lbnRgLFxufVxuIiwiLyoqXG4gKiBAbW9kdWxlIHVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL3JlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBEYXNoYm9hcmQtc2VsZWN0YWJsZSBjb21wb25lbnQgcmVnaXN0cnkuXG4gKiBAZGVzY3JpcHRpb24gTW9kdWxlLWxldmVsIHJlZ2lzdHJ5IHRoYXQgdHJhY2tzIGV2ZXJ5IGBAZGFzaGNvbXBvbmVudGAtXG4gKiBkZWNvcmF0ZWQgY29uc3RydWN0b3IuIFRoZSBgQGRhc2hjb21wb25lbnRgIGRlY29yYXRvciBjYWxsc1xuICoge0BsaW5rIHJlZ2lzdGVyRGFzaENvbXBvbmVudH0gYXMgYSBzaWRlLWVmZmVjdDsgY29uc3VtZXJzIGRpc2NvdmVyIGFsbFxuICogZGVjb3JhdGVkIGNsYXNzZXMgdmlhIHtAbGluayBkYXNoQ29tcG9uZW50c30uXG4gKlxuICogVGhpcyBmb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgdGhlIGBncmFwaGAgc3VibW9kdWxlJ3Mgbm9kZSByZWdpc3RyeSBhbmRcbiAqIHRoZSBgSW5qZWN0YWJsZXNSZWdpc3RyeWAgaW4gYGluamVjdGFibGUtZGVjb3JhdG9yc2Ag4oCUIGEgcHJpdmF0ZSBgU2V0YFxuICogcmF0aGVyIHRoYW4gdGhlIGBNZXRhZGF0YWAgaW50ZXJuYWwgaGVscGVycy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogSW50ZXJuYWwgcmVnaXN0cnkgb2YgYWxsIGBAZGFzaGNvbXBvbmVudGAtZGVjb3JhdGVkIGNvbnN0cnVjdG9ycy5cbiAqL1xuY29uc3QgREFTSF9DT01QT05FTlRfUkVHSVNUUlkgPSBuZXcgU2V0PENvbnN0cnVjdG9yPigpO1xuXG4vKipcbiAqIEFwcGVuZHMgYSBjb25zdHJ1Y3RvciB0byB0aGUgZGFzaGJvYXJkIGNvbXBvbmVudCByZWdpc3RyeS4gQ2FsbGVkIGJ5IHRoZVxuICogYEBkYXNoY29tcG9uZW50YCBkZWNvcmF0b3IuIElkZW1wb3RlbnQg4oCUIHJlLWRlY29yYXRpbmcgdGhlIHNhbWUgY2xhc3MgZG9lc1xuICogbm90IGR1cGxpY2F0ZSB0aGUgZW50cnkuXG4gKiBAcGFyYW0gY3RvciBUaGUgYEBkYXNoY29tcG9uZW50YC1kZWNvcmF0ZWQgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRhc2hDb21wb25lbnQoY3RvcjogQ29uc3RydWN0b3IpOiB2b2lkIHtcbiAgREFTSF9DT01QT05FTlRfUkVHSVNUUlkuYWRkKGN0b3IpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYWxsIGBAZGFzaGNvbXBvbmVudGAtZGVjb3JhdGVkIGNvbnN0cnVjdG9ycy5cbiAqIEByZXR1cm5zIEEgZnJlc2ggYXJyYXkgb2YgY29uc3RydWN0b3JzIChtdXRhYmxlOyBkb2VzIG5vdCBleHBvc2UgdGhlIGludGVybmFsIHNldCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXNoQ29tcG9uZW50cygpOiBDb25zdHJ1Y3RvcltdIHtcbiAgcmV0dXJuIFsuLi5EQVNIX0NPTVBPTkVOVF9SRUdJU1RSWV07XG59XG5cbi8qKlxuICogQ2xlYXJzIHRoZSBkYXNoYm9hcmQgY29tcG9uZW50IHJlZ2lzdHJ5LiBJbnRlbmRlZCBmb3IgdGVzdHMgb25seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0RGFzaENvbXBvbmVudFJlZ2lzdHJ5KCk6IHZvaWQge1xuICBEQVNIX0NPTVBPTkVOVF9SRUdJU1RSWS5jbGVhcigpO1xufVxuIiwiLyoqXG4gKiBAbW9kdWxlIHVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL2RlY29yYXRvcnNcbiAqIEBzdW1tYXJ5IFRoZSBgQGRhc2hjb21wb25lbnQoKWAgY2xhc3MgZGVjb3JhdG9yLlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBtb2R1bGUgdGhhdCBtYXJrcyBkZWNhZiBtb2RlbCBjbGFzc2VzIGFzXG4gKiBkYXNoYm9hcmQtc2VsZWN0YWJsZSBwYWxldHRlIGVudHJpZXMuIEF0dGFjaGVzIHRoZSB7QGxpbmsgRGFzaENvbXBvbmVudE1ldGFkYXRhfVxuICogcGF5bG9hZCB1bmRlciB7QGxpbmsgRGFzaEtleXMuQ09NUE9ORU5UfSBhbmQgcmVnaXN0ZXJzIHRoZSBjbGFzcyBpbiB0aGVcbiAqIGRhc2hib2FyZCByZWdpc3RyeSBhcyBhIHNpZGUtZWZmZWN0LlxuICovXG5cbmltcG9ydCB7XG4gIGFwcGx5LFxuICBEZWNvcmF0aW9uLFxuICBtZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyB1aW1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IERhc2hLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IERhc2hDb21wb25lbnRNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyByZWdpc3RlckRhc2hDb21wb25lbnQgfSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDbGFzcyBkZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGRhc2hib2FyZC1zZWxlY3RhYmxlLlxuICogQHN1bW1hcnkgQXR0YWNoZXMgcGFsZXR0ZSBtZXRhZGF0YSAodHJhbnNsYXRpb24gbGFiZWwga2V5LCBkZWZhdWx0IGdyaWRcbiAqIHNpemUsIGNvbmZpZ3VyYXRpb24gbW9kZWwgcmVmZXJlbmNlKSBhbmQgcmVnaXN0ZXJzIHRoZSBjb25zdHJ1Y3RvciBpbiB0aGVcbiAqIGRhc2hib2FyZCBjb21wb25lbnQgcmVnaXN0cnksIG1pcnJvcmluZyB0aGUgZ3JhcGggYEBub2RlKClgIGRlY29yYXRvci5cbiAqXG4gKiBVc2FnZTpcbiAqIGBgYHRzXG4gKiBAZGFzaGNvbXBvbmVudChcIm15LndpZGdldFwiLCB7XG4gKiAgIGxhYmVsOiBcIm15LndpZGdldC5sYWJlbFwiLFxuICogICBkZWZhdWx0U2l6ZTogeyBjb2xzOiAyLCByb3dzOiAxIH0sXG4gKiAgIG1vZGVsOiBNeVdpZGdldENvbmZpZ01vZGVsLFxuICogfSlcbiAqIEBtb2RlbCgpXG4gKiBleHBvcnQgY2xhc3MgTXlXaWRnZXQgZXh0ZW5kcyBNb2RlbCB7IC4uLiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gVGhlIGNvbXBvbmVudCB0YWcgKGRlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lKS5cbiAqIEBwYXJhbSB7RGFzaENvbXBvbmVudE1ldGFkYXRhfSBbZGFzaF0gUGFsZXR0ZSBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZC1ob2MgcHJvcHMgZm9yIHRoZSBjb21wb25lbnQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKiBAZnVuY3Rpb24gZGFzaGNvbXBvbmVudFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhc2hjb21wb25lbnQoXG4gIHRhZz86IHN0cmluZyxcbiAgZGFzaD86IERhc2hDb21wb25lbnRNZXRhZGF0YSxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgZnVuY3Rpb24gZGFzaGNvbXBvbmVudChcbiAgICB0YWc/OiBzdHJpbmcsXG4gICAgZGFzaD86IERhc2hDb21wb25lbnRNZXRhZGF0YSxcbiAgICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKSB7XG4gICAgY29uc3QgbWV0YTogRGFzaENvbXBvbmVudE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiBkYXNoPy50YWcgfHwgdGFnLFxuICAgICAgLi4uZGFzaCxcbiAgICAgIGRlZmF1bHRTaXplOiBkYXNoPy5kZWZhdWx0U2l6ZSA/PyB7IGNvbHM6IDEsIHJvd3M6IDEgfSxcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiBpbm5lckRhc2hDb21wb25lbnQodGFyZ2V0OiBvYmplY3QpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5KFxuICAgICAgICB1aW1vZGVsKHRhZywgcHJvcHMpLFxuICAgICAgICBtZXRhZGF0YShEYXNoS2V5cy5DT01QT05FTlQsIG1ldGEpXG4gICAgICApKHRhcmdldCk7XG4gICAgICByZWdpc3RlckRhc2hDb21wb25lbnQodGFyZ2V0IGFzIENvbnN0cnVjdG9yKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihEYXNoS2V5cy5DT01QT05FTlQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGRhc2hjb21wb25lbnQsXG4gICAgICBhcmdzOiBbdGFnLCBkYXNoLCBwcm9wc10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsIi8qKlxuICogQG1vZHVsZSB1aS1kZWNvcmF0b3JzL2Rhc2hib2FyZC9yZWFkZXJcbiAqIEBzdW1tYXJ5IE1ldGFkYXRhIHJlYWRlcnMgZm9yIGBAZGFzaGNvbXBvbmVudCgpYC1kZWNvcmF0ZWQgY2xhc3Nlcy5cbiAqIEBkZXNjcmlwdGlvbiBSZWFkLXNpZGUgaGVscGVycyB0aGF0IHJlc29sdmUgdGhlIHBhbGV0dGUgbWV0YWRhdGEgYW5kIHRoZVxuICogbm9ybWFsaXplZCB7QGxpbmsgRGFzaENvbXBvbmVudERlZmluaXRpb259IGF0dGFjaGVkIGJ5IGBAZGFzaGNvbXBvbmVudCgpYC5cbiAqIEFjY2VwdCBlaXRoZXIgYSBjb25zdHJ1Y3RvciBvciBhbiBpbnN0YW5jZSwgYW5kIGFwcGx5IGRlZmF1bHRzIHNvIGNvbnN1bWVyc1xuICogbmV2ZXIgcmVzb2x2ZSB1bmRlZmluZWQgZm9vdHByaW50IHZhbHVlcy5cbiAqL1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IERhc2hLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIERhc2hDb21wb25lbnREZWZpbml0aW9uLFxuICBEYXNoQ29tcG9uZW50TWV0YWRhdGEsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGNvbnN0cnVjdG9yLW9yLWluc3RhbmNlIGlucHV0IHRvIGEgY29uc3RydWN0b3IuXG4gKiBGYWxscyBiYWNrIHRvIHRoZSBpbnN0YW5jZSdzIG93biBjb25zdHJ1Y3RvciBhbmQgZmluYWxseSB0byB0aGUgcmF3IHZhbHVlXG4gKiB3aGVuIHtAbGluayBNZXRhZGF0YS5jb25zdHJ9IGNhbm5vdCByZXNvbHZlIGEgdXNhYmxlIGNvbnN0cnVjdG9yLlxuICogQHBhcmFtIG1vZGVsIFRoZSBkZWNvcmF0ZWQgY2xhc3Mgb3IgYW4gaW5zdGFuY2Ugb2YgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlbDxNPihtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBNKTogQ29uc3RydWN0b3I8TT4ge1xuICBjb25zdCByZXNvbHZlZCA9IE1ldGFkYXRhLmNvbnN0cihtb2RlbCBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPE0+O1xuICBjb25zdCBmYWxsYmFjayA9IChtb2RlbCBhcyB7IGNvbnN0cnVjdG9yPzogQ29uc3RydWN0b3I8TT4gfSkuY29uc3RydWN0b3I7XG4gIGlmICh0eXBlb2YgZmFsbGJhY2sgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbGxiYWNrIGFzIENvbnN0cnVjdG9yPE0+O1xuICByZXR1cm4gbW9kZWwgYXMgQ29uc3RydWN0b3I8TT47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIHBhbGV0dGUgbWV0YWRhdGEgYXR0YWNoZWQgYnkgYEBkYXNoY29tcG9uZW50KClgLlxuICogQHN1bW1hcnkgUmVzb2x2ZXMgdGhlIG1ldGFkYXRhIG9iamVjdCBzdG9yZWQgb24gdGhlIGNsYXNzLCBhY2NlcHRpbmcgZWl0aGVyXG4gKiB0aGUgY29uc3RydWN0b3Igb3IgYW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yIHwgb2JqZWN0fSBtb2RlbCBUaGUgZGVjb3JhdGVkIGNsYXNzIG9yIGFuIGluc3RhbmNlIG9mIGl0LlxuICogQHJldHVybnMgVGhlIHBhbGV0dGUgbWV0YWRhdGEsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW4tZGVjb3JhdGVkLlxuICogQGZ1bmN0aW9uIGRhc2hDb21wb25lbnRNZXRhZGF0YU9mXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnMvZGFzaGJvYXJkL3JlYWRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZGFzaENvbXBvbmVudE1ldGFkYXRhT2Y8TT4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IE1cbik6IERhc2hDb21wb25lbnRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKG1vZGVsKTtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldChyZXNvbHZlZCwgRGFzaEtleXMuQ09NUE9ORU5UKSBhc1xuICAgIHwgRGFzaENvbXBvbmVudE1ldGFkYXRhXG4gICAgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIGEgbm9ybWFsaXplZCBkZWZpbml0aW9uIGZvciBhIGRhc2hib2FyZCBjb21wb25lbnQuXG4gKiBAc3VtbWFyeSBBcHBsaWVzIGRlZmF1bHRzICh0YWcgZnJvbSBjbGFzcyBuYW1lLCBzaXplIGB7Y29sczoxLCByb3dzOjF9YClcbiAqIHNvIGNvbnN1bWVycyBuZXZlciByZXNvbHZlIHVuZGVmaW5lZCBmb290cHJpbnQgdmFsdWVzLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvciB8IG9iamVjdH0gbW9kZWwgVGhlIGRlY29yYXRlZCBjbGFzcyBvciBhbiBpbnN0YW5jZSBvZiBpdC5cbiAqIEByZXR1cm5zIEEgbm9ybWFsaXplZCB7QGxpbmsgRGFzaENvbXBvbmVudERlZmluaXRpb259LlxuICogQGZ1bmN0aW9uIGRhc2hDb21wb25lbnREZWZpbml0aW9uT2ZcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy9kYXNoYm9hcmQvcmVhZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXNoQ29tcG9uZW50RGVmaW5pdGlvbk9mPE0+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBNXG4pOiBEYXNoQ29tcG9uZW50RGVmaW5pdGlvbiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKG1vZGVsKTtcbiAgY29uc3QgbWV0YSA9IGRhc2hDb21wb25lbnRNZXRhZGF0YU9mKHJlc29sdmVkKSB8fCB7fTtcbiAgY29uc3QgdGFnID0gbWV0YS50YWcgfHwgcmVzb2x2ZWQubmFtZTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiByZXNvbHZlZC5uYW1lLFxuICAgIHRhZyxcbiAgICBsYWJlbDogbWV0YS5sYWJlbCxcbiAgICBkZWZhdWx0U2l6ZTogbWV0YS5kZWZhdWx0U2l6ZSA/PyB7IGNvbHM6IDEsIHJvd3M6IDEgfSxcbiAgICBtb2RlbDogbWV0YS5tb2RlbCxcbiAgICBwcm9wczogbWV0YS5wcm9wcyxcbiAgICBtZXRhZGF0YTogbWV0YS5tZXRhZGF0YSxcbiAgfTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFVJIGRlY29yYXRvcnMgbW9kdWxlIGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9uc1xuICogQHN1bW1hcnkgQSBjb2xsZWN0aW9uIG9mIGRlY29yYXRvcnMgYW5kIHV0aWxpdGllcyBmb3IgYnVpbGRpbmcgVUkgY29tcG9uZW50cyBpbiBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIGJvdGggdGhlIG1vZGVsIGFuZCBVSSBzdWJtb2R1bGVzLCBwcm92aWRpbmcgZGVjb3JhdG9ycyBmb3JcbiAqIHJlbmRlcmluZywgY29tcG9uZW50IGRlZmluaXRpb24sIGFuZCBVSSBzdGF0ZSBtYW5hZ2VtZW50LlxuICogQG1vZHVsZSB1aS1kZWNvcmF0b3JzXG4gKi9cblxuaW1wb3J0IFwiLi9vdmVycmlkZXNcIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdmVycmlkZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91aVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGFzaGJvYXJkXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uIHN0cmluZ1xuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbiBmb3IgcmVmZXJlbmNlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbW1pdCBoYXNoIG9mIHRoZSBtb2R1bGUgYnVpbGQuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgZ2l0IGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS4gVGhlIGJ1aWxkIHJlcGxhY2VzXG4gKiB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGNvbW1pdCBoYXNoIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBDT01NSVRcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbXZlciB2ZXJzaW9uIGFuZCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuXG4gKiBUaGUgYnVpbGQgcmVwbGFjZXMgdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBgPHZlcnNpb24+LTxjb21taXQ+YCB2YWx1ZSBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgRlVMTF9WRVJTSU9OXG4gKi9cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsiVUlNZWRpYUJyZWFrUG9pbnRzIiwiVUlLZXlzIiwiUkVGTEVDVCIsIlVJTU9ERUwiLCJSRU5ERVJFRF9CWSIsIkVMRU1FTlQiLCJQUk9QIiwiQ0hJTEQiLCJOQU1FIiwiTkFNRV9QUkVGSVgiLCJWQUxJREFUSU9OX01FU1NBR0UiLCJVSUxJU1RNT0RFTCIsIlVJTElTVFBST1AiLCJVSUxBWU9VVCIsIlVJTEFZT1VUUFJPUCIsIkhBTkRMRVJTIiwiVFlQRSIsIlNVQl9UWVBFIiwiSElEREVOIiwiSElERV9GT1IiLCJTSE9XX0ZPUiIsIlJFTkRFUl9JRiIsIkZPUk1BVCIsIk9SREVSIiwiUEFHRSIsIkVWRU5UUyIsIkZJUlNUIiwiTEFTVCIsIlJFQURfT05MWSIsIlNFUVVFTkNFIiwiUkVRVUlSRUQiLCJWYWxpZGF0aW9uS2V5cyIsIk1JTiIsIk1JTl9MRU5HVEgiLCJNQVgiLCJNQVhfTEVOR1RIIiwiUEFUVEVSTiIsIlVSTCIsIlNURVAiLCJEQVRFIiwiRU1BSUwiLCJQQVNTV09SRCIsIkVRVUFMUyIsIkRJRkYiLCJMRVNTX1RIQU4iLCJMRVNTX1RIQU5fT1JfRVFVQUwiLCJHUkVBVEVSX1RIQU4iLCJHUkVBVEVSX1RIQU5fT1JfRVFVQUwiLCJWYWxpZGF0YWJsZUJ5VHlwZSIsIkVtYWlsVmFsaWRhdG9yIiwiVVJMVmFsaWRhdG9yIiwiRGF0ZVZhbGlkYXRvciIsIlBhc3N3b3JkVmFsaWRhdG9yIiwiVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSIsIlJlcXVpcmVkVmFsaWRhdG9yIiwiTWluVmFsaWRhdG9yIiwiTWF4VmFsaWRhdG9yIiwiU3RlcFZhbGlkYXRvciIsIk1pbkxlbmd0aFZhbGlkYXRvciIsIk1heExlbmd0aFZhbGlkYXRvciIsIlBhdHRlcm5WYWxpZGF0b3IiLCJFcXVhbHNWYWxpZGF0b3IiLCJEaWZmVmFsaWRhdG9yIiwiTGVzc1RoYW5WYWxpZGF0b3IiLCJMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3IiLCJHcmVhdGVyVGhhblZhbGlkYXRvciIsIkdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvciIsIkhUTUw1RGF0ZUZvcm1hdCIsIkhUTUw1SW5wdXRUeXBlcyIsIkJVVFRPTiIsIkNIRUNLQk9YIiwiQ09MT1IiLCJEQVRFVElNRV9MT0NBTCIsIkZJTEUiLCJJTUFHRSIsIk1PTlRIIiwiTlVNQkVSIiwiUkFESU8iLCJSQU5HRSIsIlJFU0VUIiwiU0VBUkNIIiwiU1VCTUlUIiwiVEVMIiwiVEVYVCIsIlRFWFRBUkVBIiwiU0VMRUNUIiwiVElNRSIsIldFRUsiLCJIVE1MNUNoZWNrVHlwZXMiLCJDb21wb25lbnRFdmVudE5hbWVzIiwiUmVuZGVyIiwiQmFja0J1dHRvbkNsaWNrRXZlbnQiLCJSZWZyZXNoIiwiQ2xpY2siLCJDaGFuZ2UiLCJTdWJtaXQiLCJWYWxpZGF0aW9uRXJyb3IiLCJUaGVtZUNoYW5nZSIsIkZvcm1Hcm91cExvYWRlZCIsIlRyYW5zYWN0aW9uSG9va3MiLCJCZWZvcmVSZWFkIiwiQWZ0ZXJSZWFkIiwiQmVmb3JlQ3JlYXRlIiwiQWZ0ZXJDcmVhdGUiLCJCZWZvcmVVcGRhdGUiLCJBZnRlclVwZGF0ZSIsIkJlZm9yZURlbGV0ZSIsIkFmdGVyRGVsZXRlIiwiRWxlbWVudFNpemVzIiwieHNtYWxsIiwic21hbGwiLCJtZWRpdW0iLCJkZWZhdWx0IiwibGFyZ2UiLCJ4TGFyZ2UiLCJhdXRvIiwiZXhwYW5kIiwiYmxvY2siLCJoYWxmIiwiZnVsbCIsIkVsZW1lbnRQb3NpdGlvbnMiLCJsZWZ0IiwiY2VudGVyIiwicmlnaHQiLCJ0b3AiLCJib3R0b20iLCJMYXlvdXRHcmlkR2FwcyIsImNvbGxhcHNlIiwibm9uZSIsIkFjdGlvblJvbGVzIiwiY2FuY2VsIiwiY29uZmlybSIsInN1Ym1pdCIsImNsZWFyIiwiYmFjayIsIk9wZXJhdGlvbktleXMiLCJDUkVBVEUiLCJSRUFEIiwiVVBEQVRFIiwiREVMRVRFIiwiV2luZG93Q29sb3JTY2hlbWVzIiwibGlnaHQiLCJkYXJrIiwidW5kZWZpbmVkIiwiUmVuZGVyaW5nRXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiY29uc3RydWN0b3IiLCJtc2ciLCJzdXBlciIsIm5hbWUiLCJpc0NsYXNzQ29uc3RydWN0b3IiLCJmbiIsInRlc3QiLCJTdHJpbmciLCJnZXRVSUF0dHJpYnV0ZUtleSIsInByb3AiLCJrZXkiLCJNZXRhZGF0YSIsIkRlY29yYXRpb25LZXlzIiwiUFJPUEVSVElFUyIsImZvcm1hdEJ5VHlwZSIsInR5cGUiLCJ2YWx1ZSIsImFyZ3MiLCJmb3JtYXQiLCJzaGlmdCIsImZvcm1hdERhdGUiLCJEYXRlIiwicGFyc2VWYWx1ZUJ5VHlwZSIsImZpZWxkUHJvcHMiLCJyZXN1bHQiLCJBcnJheSIsInBhcnNlZCIsImlzQXJyYXkiLCJtYXAiLCJ2IiwiUmVzZXJ2ZWRNb2RlbHMiLCJTVFJJTkciLCJ0b0xvd2VyQ2FzZSIsImpvaW4iLCJwYXJzZVRvTnVtYmVyIiwidHJpbSIsImxlbmd0aCIsInBhcnNlRGF0ZSIsIk9CSkVDVCIsIkpTT04iLCJzdHJpbmdpZnkiLCJCT09MRUFOIiwiZXNjYXBlSHRtbCIsImlzTmFOIiwiTnVtYmVyIiwidGFnc1RvUmVwbGFjZSIsInJlcGxhY2UiLCJ0YWciLCJyZXZlcnRIdG1sIiwiZ2VuZXJhdGVVSU1vZGVsSUQiLCJtb2RlbCIsImlkIiwibm93IiwicGsiLCJNb2RlbCIsImUiLCJSZW5kZXJpbmdFbmdpbmUiLCJ0aGlzIiwiY2FjaGUiLCJmbGF2b3VyIiwiaW5pdGlhbGl6ZWQiLCJyZWdpc3RlciIsImNvbnNvbGUiLCJsb2ciLCJ0cmFuc2xhdGUiLCJ0b1ZpZXciLCJCSUdJTlQiLCJnZXRDbGFzc0RlY29yYXRvcnNNZXRhZGF0YSIsInVpTW9kZWxPZiIsInVpTGlzdE1vZGVsT2YiLCJ1aUhhbmRsZXJzRm9yIiwidWlMYXlvdXRPZiIsImZpbHRlciIsIkJvb2xlYW4iLCJzb3J0Q2hpbGRyZW5CeU9yZGVyIiwiY2hpbGRyZW4iLCJzb3J0IiwiYSIsImIiLCJhT3JkZXIiLCJwcm9wcyIsIm9yZGVyIiwiYk9yZGVyIiwid2VpZ2h0IiwiUHJpbWl0aXZlcyIsImluZGV4T2YiLCJhV2VpZ2h0IiwiYldlaWdodCIsImlzQ3VzdG9tVmFsaWRhdG9yIiwiT2JqZWN0IiwidmFsdWVzIiwiaW5jbHVkZXMiLCJpc1ZhbGlkYXRhYmxlQnlUeXBlIiwia2V5cyIsImlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSIsInRvQXR0cmlidXRlVmFsdWUiLCJFcnJvciIsInRvRmllbGREZWZpbml0aW9uIiwiZ2xvYmFsUHJvcHMiLCJnZW5lcmF0ZUlkIiwiaW5oZXJpdFByb3BzIiwiZ2xvYmFsUHJvcHNXaXRob3V0SW5oZXJpdHMiLCJjbGFzc0RlY29yYXRvcnMiLCJjbGFzc0RlY29yYXRvciIsImFzc2lnbiIsIml0ZW0iLCJoYW5kbGVycyIsInVpRGVjb3JhdG9ycyIsInVpUHJvcGVydGllc09mIiwiY2hpbGRQcm9wcyIsIm1hcHBlciIsImdldFBhdGgiLCJwYXJlbnQiLCJ2YWxpZGF0aW9uRGVjb3JhdG9ycyIsImdldCIsImRlY3MiLCJ1aURlY29yYXRpb25PZiIsInVpVHlwZU9mIiwiTm90Rm91bmRFcnJvciIsImhhc0hpZGVPbkRlY29yYXRvciIsInVpSXNIaWRkZW4iLCJoYXNVaUVsZW1lbnREZWNvcmF0b3IiLCJ1aUVsZW1lbnRPZiIsInNvcnRlZCIsImVudHJpZXMiLCJrIiwiZm9yRWFjaCIsImRlYyIsIm1vZGVsTmFtZSIsImlzUHJvcGVydHlNb2RlbCIsImlzTW9kZWwiLCJidWlsZCIsIkNsYXp6Iiwic3VibW9kZWwiLCJjb25zdHJ1Y3RhYmxlIiwiY2xhenpOYW1lIiwiY2hpbGRyZW5HbG9iYWxQcm9wcyIsImNoaWxkT2YiLCJjaGlsZERlZmluaXRpb24iLCJwdXNoIiwiZGVjUHJvcHMiLCJyZW5kZXIiLCJ1aVByb3BzIiwidmlzaWJpbGl0eVByb3BzIiwiaGlkZUZvciIsInNob3dGb3IiLCJwYXRoIiwidmFsaWRhdGlvbkRlY3MiLCJtZXNzYWdlIiwiYmFzaWNUeXBlIiwiY2hpbGQiLCJmaW5kIiwiYyIsImVuZHNXaXRoIiwicm93IiwiY29sIiwiY3VycmVudE5hbWVzcGFjZXMiLCJTZXQiLCJuYW1lc3BhY2VzIiwibmFtZXNwYWNlIiwib3BlcmF0aW9uIiwiaGlkZGVuT24iLCJoaWRkZW4iLCJzb21lIiwicmVuZGVyZXJJZCIsImVuZ2luZSIsImN1cnJlbnQiLCJnZXRPckJvb3QiLCJvYmoiLCJpbml0aWFsaXplIiwiZnJvbU9iamVjdCIsInJlbmRlcmVkQnkiLCJoaWRlT24iLCJvcGVyYXRpb25zIiwib2JqZWN0IiwicHJvcGVydHlLZXkiLCJwcm9wTWV0YWRhdGEiLCJyZW5kZXJJZiIsInVpb3JkZXIiLCJ1aWVsZW1lbnQiLCJzZXJpYWxpemUiLCJvcmlnaW5hbCIsIm1ldGFkYXRhIiwidWlwcm9wIiwicHJvcE5hbWUiLCJ0YXJnZXQiLCJ1aWNoaWxkIiwiY2xhenoiLCJjdXN0b21UeXBlcyIsIm11bHRpcGxlIiwidWlsaXN0cHJvcCIsInVpbGF5b3V0cHJvcCIsInVpcGFnZXByb3AiLCJwYWdlIiwidWlvbiIsImV2ZW50IiwiaGFuZGxlciIsInVpb25jbGljayIsInVpb25yZW5kZXIiLCJ1aXRhYmxlY29sIiwic2VxdWVuY2UiLCJ2YWx1ZVBhcnNlckZuIiwiVUlWYWxpZGF0b3IiLCJWYWxpZGF0b3IiLCJnZXRNZXNzYWdlIiwidHJhbnNsYXRlU2VydmljZSIsIkRlY2FmQ29tcG9uZW50IiwiTG9nZ2VkQ2xhc3MiLCJlbmFibGVEYXJrTW9kZSIsImlzRGFya01vZGUiLCJyb3V0ZSIsImJvcmRlcnMiLCJldmVudHMiLCJyZXBvc2l0b3J5IiwiX3JlcG9zaXRvcnkiLCJmb3IiLCJpbmZvIiwiY29tcG9uZW50TmFtZSIsInJlZnJlc2giLCJwcmV2aWV3IiwiZGVidWciLCJwYXJzZUhhbmRsZXJzIiwiaW5zdGFuY2UiLCJoYW5kbGUiLCJwYXJzZUV2ZW50cyIsImV2dCIsIkRlY2FmRXZlbnRIYW5kbGVyIiwiaGFuZGxlQ2xpY2siLCJoYW5kbGVBY3Rpb24iLCJEZWNhZlRyYW5zbGF0ZVNlcnZpY2UiLCJwYXJhbXMiLCJpbnN0YW50IiwicHJvdG90eXBlIiwiYmluZCIsIm1ldGEiLCJ1aUlzSGlkZGVuT24iLCJvcCIsInVpTGlzdEl0ZW1zIiwidWltb2RlbCIsImFwcGx5IiwidWlsaXN0bW9kZWwiLCJ1aWhhbmRsZXJzIiwidWlsYXlvdXQiLCJjb2xzTW9kZSIsInJvd3MiLCJjb25maWciLCJmbGV4TW9kZSIsImNvbHMiLCJicmVha3BvaW50IiwiTEFSR0UiLCJ1aXN0ZXBwZWRtb2RlbCIsInBhZ2VzIiwicGFnaW5hdGVkIiwicGFnZVRpdGxlcyIsIk1vZGVsQnVpbGRlciIsImRlY29yYXRlQ2xhc3MiLCJkZWNvcmF0b3IiLCJfY2xhc3NEZWNvcmF0b3JzIiwiRGFzaEtleXMiLCJEQVNIX0NPTVBPTkVOVF9SRUdJU1RSWSIsInJlZ2lzdGVyRGFzaENvbXBvbmVudCIsImN0b3IiLCJhZGQiLCJkYXNoQ29tcG9uZW50cyIsInJlc2V0RGFzaENvbXBvbmVudFJlZ2lzdHJ5IiwiZGFzaGNvbXBvbmVudCIsImRhc2giLCJkZWZhdWx0U2l6ZSIsImlubmVyRGFzaENvbXBvbmVudCIsIkNPTVBPTkVOVCIsIkRlY29yYXRpb24iLCJkZWZpbmUiLCJyZXNvbHZlTW9kZWwiLCJyZXNvbHZlZCIsImNvbnN0ciIsImZhbGxiYWNrIiwiZGFzaENvbXBvbmVudE1ldGFkYXRhT2YiLCJkYXNoQ29tcG9uZW50RGVmaW5pdGlvbk9mIiwibGFiZWwiLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7OztJQWlDWUEsUUFBQUEsMEJBQUFBO0tBQVosU0FBWUE7UUFDVkEsbUJBQUEsV0FBQTtRQUNBQSxtQkFBQSxZQUFBO1FBQ0FBLG1CQUFBLFdBQUE7UUFDQUEsbUJBQUEsWUFBQTtBQUNELE1BTEQsQ0FBWUEsUUFBQUEsdUJBQUFBLDZCQUFrQixDQUFBO0lBb0R2QixNQUFNQyxTQUFTO1FBQ3BCQyxTQUFTO1FBQ1RDLFNBQVM7UUFDVEMsYUFBYTtRQUNiQyxTQUFTO1FBQ1RDLE1BQU07UUFDTkMsT0FBTztRQUNQQyxNQUFNO1FBQ05DLGFBQWE7UUFDYkMsb0JBQW9CO1FBRXBCQyxhQUFhO1FBQ2JDLFlBQVk7UUFDWkMsVUFBVTtRQUNWQyxjQUFjO1FBQ2RDLFVBQVU7UUFFVkMsTUFBTTtRQUNOQyxVQUFVO1FBRVZDLFFBQVE7UUFDUkMsVUFBVTtRQUNWQyxVQUFVO1FBQ1ZDLFdBQVc7UUFDWEMsUUFBUTtRQUNSQyxPQUFPO1FBQ1BDLE1BQU07UUFDTkMsUUFBUTtRQUVSQyxPQUFPO1FBQ1BDLE1BQU07UUFFTkMsV0FBVztRQUNYQyxVQUFVO1FBQ1ZDLFVBQVVDLG9CQUFBQSxlQUFlRDtRQUN6QkUsS0FBS0Qsb0JBQUFBLGVBQWVDO1FBQ3BCQyxZQUFZRixvQkFBQUEsZUFBZUU7UUFDM0JDLEtBQUtILG9CQUFBQSxlQUFlRztRQUNwQkMsWUFBWUosb0JBQUFBLGVBQWVJO1FBQzNCQyxTQUFTTCxvQkFBQUEsZUFBZUs7UUFDeEJDLEtBQUtOLG9CQUFBQSxlQUFlTTtRQUNwQkMsTUFBTVAsb0JBQUFBLGVBQWVPO1FBQ3JCQyxNQUFNUixvQkFBQUEsZUFBZVE7UUFDckJDLE9BQU9ULG9CQUFBQSxlQUFlUztRQUN0QkMsVUFBVVYsb0JBQUFBLGVBQWVVO1FBQ3pCQyxRQUFR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
|
|
1
|
+
var e,t;e=this,t=function(e,t,a,r,o){"use strict";var s;e.UIMediaBreakPoints=void 0,(s=e.UIMediaBreakPoints||(e.UIMediaBreakPoints={})).SMALL="small",s.MEDIUM="medium",s.LARGE="large",s.XLARGE="xlarge";const n={REFLECT:"ui",UIMODEL:"uimodel",RENDERED_BY:"rendered-by",ELEMENT:"uielement",PROP:"uiprop",CHILD:"uichild",NAME:"name",NAME_PREFIX:"input-",VALIDATION_MESSAGE:"validationMessage",UILISTMODEL:"uilistmodel",UILISTPROP:"uilistprop",UILAYOUT:"uilayout",UILAYOUTPROP:"uilayoutprop",HANDLERS:"handlers",TYPE:"type",SUB_TYPE:"subType",HIDDEN:"hidden",HIDE_FOR:"hide-for",SHOW_FOR:"show-for",RENDER_IF:"render-if",FORMAT:"format",ORDER:"order",PAGE:"page",EVENTS:"events",FIRST:"first",LAST:"last",READ_ONLY:"readonly",SEQUENCE:"sequence",REQUIRED:t.ValidationKeys.REQUIRED,MIN:t.ValidationKeys.MIN,MIN_LENGTH:t.ValidationKeys.MIN_LENGTH,MAX:t.ValidationKeys.MAX,MAX_LENGTH:t.ValidationKeys.MAX_LENGTH,PATTERN:t.ValidationKeys.PATTERN,URL:t.ValidationKeys.URL,STEP:t.ValidationKeys.STEP,DATE:t.ValidationKeys.DATE,EMAIL:t.ValidationKeys.EMAIL,PASSWORD:t.ValidationKeys.PASSWORD,EQUALS:t.ValidationKeys.EQUALS,DIFF:t.ValidationKeys.DIFF,LESS_THAN:t.ValidationKeys.LESS_THAN,LESS_THAN_OR_EQUAL:t.ValidationKeys.LESS_THAN_OR_EQUAL,GREATER_THAN:t.ValidationKeys.GREATER_THAN,GREATER_THAN_OR_EQUAL:t.ValidationKeys.GREATER_THAN_OR_EQUAL},i={[n.EMAIL]:t.EmailValidator,[n.URL]:t.URLValidator,[n.DATE]:t.DateValidator,[n.PASSWORD]:t.PasswordValidator},d={[n.REQUIRED]:t.RequiredValidator,[n.MIN]:t.MinValidator,[n.MAX]:t.MaxValidator,[n.STEP]:t.StepValidator,[n.MIN_LENGTH]:t.MinLengthValidator,[n.MAX_LENGTH]:t.MaxLengthValidator,[n.PATTERN]:t.PatternValidator,[n.EQUALS]:t.EqualsValidator,[n.DIFF]:t.DiffValidator,[n.LESS_THAN]:t.LessThanValidator,[n.LESS_THAN_OR_EQUAL]:t.LessThanOrEqualValidator,[n.GREATER_THAN]:t.GreaterThanValidator,[n.GREATER_THAN_OR_EQUAL]:t.GreaterThanOrEqualValidator},l="yyyy-MM-dd",c={BUTTON:"button",CHECKBOX:"checkbox",COLOR:"color",DATE:n.DATE,DATETIME_LOCAL:"datetime-local",EMAIL:n.EMAIL,FILE:"file",HIDDEN:"hidden",IMAGE:"image",MONTH:"month",NUMBER:"number",PASSWORD:n.PASSWORD,RADIO:"radio",RANGE:"range",RESET:"reset",SEARCH:"search",SUBMIT:"submit",TEL:"tel",TEXT:"text",TEXTAREA:"textarea",SELECT:"select",TIME:"time",URL:n.URL,WEEK:"week"},p=[c.CHECKBOX,c.RADIO],E={cancel:"cancel",confirm:"confirm",submit:"submit",clear:"clear",back:"back",[a.OperationKeys.CREATE]:a.OperationKeys.CREATE,[a.OperationKeys.READ]:a.OperationKeys.READ,[a.OperationKeys.UPDATE]:a.OperationKeys.UPDATE,[a.OperationKeys.DELETE]:a.OperationKeys.DELETE};class u extends a.InternalError{constructor(e){super(e,u.name)}}const f=e=>"function"==typeof e&&/^class\s/.test(e+"");function h(e,t){return r.Metadata.key(n.REFLECT,r.DecorationKeys.PROPERTIES,e,t)}function y(e,a,...r){if(e===n.DATE){if(!a)return"";const e=r.shift()||l;return t.formatDate(new Date(a),e)}return a}function m(e){if("number"==typeof e&&!isNaN(e))return e;const t=Number(e);return isNaN(t)?void 0:t}function M(e){if(!e)return e;const t={"&":"&","<":"<",">":">"};return(""+e).replace(/[&<>]/g,e=>t[e]||e)}function O(e){let a=Date.now();try{t.Model.pk(e.constructor)&&(a=e[t.Model.pk(e.constructor)])}catch(e){}return`${e.constructor.name}-${a}`}class T{static{this.cache={}}constructor(e){this.flavour=e,this.initialized=!1,T.register(this)}translate(e,a=!0){if(a)switch(e){case t.ReservedModels.STRING.name.toLowerCase():return c.TEXT;case t.ReservedModels.NUMBER.name.toLowerCase():case t.ReservedModels.BIGINT.name.toLowerCase():return c.NUMBER;case t.ReservedModels.BOOLEAN.name.toLowerCase():return c.CHECKBOX;case t.ReservedModels.DATE.name.toLowerCase():return c.DATE}else switch(e){case c.SELECT:case c.TEXT:case c.EMAIL:case c.COLOR:case c.PASSWORD:case c.TEL:case c.URL:case c.SEARCH:case c.HIDDEN:case c.TEXTAREA:case c.RADIO:return t.ReservedModels.STRING.name.toLowerCase();case c.NUMBER:return t.ReservedModels.NUMBER.name.toLowerCase();case c.CHECKBOX:return t.ReservedModels.BOOLEAN.name.toLowerCase();case c.DATE:case c.DATETIME_LOCAL:case c.TIME:return t.ReservedModels.DATE.name.toLowerCase()}return e}getClassDecoratorsMetadata(e){return[t.Model.uiModelOf(e.constructor),t.Model.uiListModelOf(e.constructor),t.Model.uiHandlersFor(e.constructor),t.Model.uiLayoutOf(e.constructor)].filter(Boolean)}sortChildrenByOrder(e=[]){return e.sort((a,r)=>{const o=a.props?.order??0,s=r.props?.order??0,i=a=>a===n.FIRST?0:typeof a===t.Primitives.NUMBER?1:a===n.LAST?e.length+e.indexOf(r):1,d=i(o),l=i(s);return d!==l?d-l:1===d&&typeof o===t.Primitives.NUMBER&&typeof s===t.Primitives.NUMBER?o-s:0})}isCustomValidator(e){return!Object.values(t.ValidationKeys).includes(e)&&!Object.values(n).includes(e)}isValidatableByType(e){return Object.keys(i).includes(e)}isValidatableByAttribute(e){return Object.keys(d).includes(e)}toAttributeValue(e,t){if(!Object.keys(d).includes(e))throw Error(`Invalid attribute key "${e}". Expected one of: ${Object.keys(d).join(", ")}.`);return e===n.REQUIRED||t[e]}toFieldDefinition(e,o={},s=!0){const{inheritProps:i,...d}=o;o=d;const p=this.getClassDecoratorsMetadata(e);if(!p.length)throw new u(`No ui definitions set for model ${e.constructor.name}. Did you use @uimodel?`);const E=Object.assign({},...p,i||{}),{tag:f,props:h,item:m,handlers:M}=E,T=t.Model.uiPropertiesOf(e.constructor);let R,g=m?.props||{},L={};const A=(e,t)=>e?[e,t].join("."):t;if(T){const s=r.Metadata.get(e.constructor,t.ValidationKeys.REFLECT)||{};for(const i of T){const d=t.Model.uiDecorationOf(e.constructor,i);let p;try{p=t.Model.uiTypeOf(e.constructor,i)}catch(e){if(!(e instanceof a.NotFoundError))throw e}if(t.Model.uiIsHidden(e.constructor,i)&&!t.Model.uiElementOf(e.constructor,i))throw new u(`@uielement no found in "${i}". It is required to use hiddenOn decorator.`);Object.entries(d).map(([e,t])=>({key:e,props:t})).sort(e=>[n.ELEMENT,n.CHILD].includes(e.key)?-1:1).forEach(a=>{if(!a)throw new u("No decorator found");switch(a.key){case n.PROP:g[i]=a.props;break;case n.CHILD:{const r=a.props?.props?.name||i;try{if(!t.Model.isModel(t.Model.build({},r))&&!t.Model.isPropertyModel(e,r))throw new u(`Child "${r}" must be a model.`)}catch(e){throw new u(`Child "${r}" must be a model.`)}let s;const n=e[i];if("object"!=typeof n||null===n||Array.isArray(n)){const e=a.props.props?.name;s=new(t.Model.get(e))}R=R||[];const d=Object.assign({},o||{},{model:s},{inheritProps:a.props,childOf:A(o?.childOf,i)}),l=this.toFieldDefinition(n||s,d,!1),{inheritProps:c}=d;c&&(l.props=Object.assign({},l.props,c.props||{})),R.push(l);break}case n.UILISTPROP:{L=L||{};const e=a.props;e.name&&(L[e.name]="object"==typeof e?.props&&n.SEQUENCE in e.props?e.props:i);const t=Object.assign({},E.props?.item||{},m?.props||{},e?.props||{},o);g={tag:m?.tag||t.render||"",props:Object.assign({},g?.props,{mapper:L},t)};break}case n.EVENTS:case n.HIDDEN:case n.HIDE_FOR:case n.SHOW_FOR:case n.PAGE:case n.ORDER:case n.UILAYOUTPROP:case n.ELEMENT:{R=R||[];const t=a.props,d=a.key===n.HIDE_FOR?{hideFor:a.props}:a.key===n.SHOW_FOR?{showFor:a.props}:{},p=Object.assign({},g?.props,t.props||{},d,t?.props?.name?{path:A(o?.childOf,t.props.name),childOf:void 0}:{},o,{name:t.props?.name||i});if(a.key===n.ELEMENT){const a={tag:t.tag||g?.tag||f||"",props:p},o=s[i];if(o)for(const e of Object.entries(o).map(([e,t])=>({key:e,props:t})))this.isValidatableByAttribute(e.key)?a.props[this.translate(e.key)]=this.toAttributeValue(e.key,e.props):this.isValidatableByType(e.key)?(e.key===c.DATE&&(a.props[n.FORMAT]=e.props.format||l),a.props[n.TYPE]=e.key):this.isCustomValidator(e.key)&&(p[n.SUB_TYPE]=e.key,e.props?.message&&(p[n.VALIDATION_MESSAGE]=e.props.message));if(!a.props[n.TYPE]){const t=r.Metadata.type(e.constructor,i).name;a.props[n.TYPE]=this.translate(t.toLowerCase(),!0)}a.props.value=y(a.props[n.TYPE],e[i],a.props[n.FORMAT]),R.push(a)}else{const e=R.find(e=>e.props?.name===i||[n.UILAYOUTPROP,n.PAGE,n.EVENTS].includes(a.key)&&(e.props?.childOf===i||e.props?.childOf?.endsWith("."+i)));if(e)if(a.key===n.HIDE_FOR||a.key===n.SHOW_FOR)e.props=Object.assign({},e.props,d);else if(a.key!==n.UILAYOUTPROP)e.props=Object.assign({},e.props,{[a.key]:t});else{const{row:t,col:r,props:o}=a.props;e.props=Object.assign({},o||{},e.props,t,r)}}break}default:throw new u("Invalid key: "+a.key)}})}}o=Object.assign({},h,o,{handlers:M||{}});const D=new Set([...Array.isArray(o?.namespaces)?o.namespaces:[],..."string"==typeof o?.namespace?[o.namespace]:[]].filter(Boolean)),N=o?.operation;R=this.sortChildrenByOrder(R).filter(e=>{const t=e?.props?.hidden||[];if(t.length>0&&t.includes(N))return!1;const a=e?.props?.hideFor||[],r=e?.props?.showFor||[];return!(a.length>0&&[...D].some(e=>a.includes(e))||r.length>0&&![...D].some(e=>r.includes(e)))});const I={tag:f,item:g,props:o,children:R?.length?R:void 0};return s&&(I.rendererId=O(e)),I}static register(e){if(e.flavour in this.cache)throw new a.InternalError(`Rendering engine under ${e.flavour} already exists`);this.cache[e.flavour]=e,this.current=e}static getOrBoot(e){if(e instanceof T)return e;const t=new e;return t.initialize(),t}static get(e){if(!e)return this.getOrBoot(this.current);if(!(e in this.cache))throw new a.InternalError(`Rendering engine under ${e} does not exist`);return this.getOrBoot(this.cache[e])}static render(e,...r){if(!t.Model.get(e.constructor.name)&&!t.Model.fromObject(e))throw new a.InternalError("No model registered found");const o=t.Model.renderedBy(e.constructor);return T.get(o).render(e,...r)}}function R(...e){return(t,a)=>r.propMetadata(h(a,n.HIDDEN),e)(t,a)}function g(...e){return(t,a)=>r.propMetadata(h(a,n.SHOW_FOR),e)(t,a)}function L(e,t){return(a,o)=>{r.propMetadata(h(o,n.EVENTS),{..."object"==typeof e?e:{[e]:t}})(a,o)}}class A extends t.Validator{getMessage(e,...t){return A.translateService?A.translateService.translate(e,...t):super.getMessage(e,...t)}}class D extends o.LoggedClass{constructor(){super(),this.enableDarkMode=!0,this.isDarkMode=!1,this.item={tag:""},this.props={},this.route="",this.borders=!1,this.OperationKeys=a.OperationKeys,this.initialized=!1,this.events={},this.handlers={}}get repository(){return this._repository}set repository(e){this._repository=e}async render(...e){this.log.for(this.render).info(`render for ${this.componentName} with ${JSON.stringify(e)}`)}async refresh(...e){this.log.for(this.refresh).info("Refresh called with args: "+e)}async initialize(...e){this.initialized=!0}async translate(...e){this.log.for(this.translate).info(`translate for ${this.componentName} with ${JSON.stringify(e)}`)}async preview(...e){this.log.for(this.preview).debug("Preview called with args: "+e)}async submit(...e){this.log.for(this.submit).info(`submit for ${this.componentName} with ${JSON.stringify(e)}`)}parseHandlers(e,t){const a={};return Object.entries(e).forEach(([e,r])=>{if(f(r)){const o=new r,s=e in o?o[e]:o.handle;a[e]=s,t.handlers[e]=s}else a[e]=r,t.handlers[e]=r}),a}parseEvents(e,t){const a={};return Object.entries(e).forEach(([e,r])=>{const o=e,s=r();if(f(s)){const r=(new s)[e];r&&(a[o]=r,t.events[o]=r)}else a[o]=r,t.events[o]=r}),a}}class N extends o.LoggedClass{translate(e,t){this.log.for(this.translate).info(`Must translate ${e} with params ${JSON.stringify(t||{})}`)}instant(e,t){this.log.for(this.instant).info(`Must translate ${e} with params ${JSON.stringify(t||{})}`)}}function I(e,t){return(a,o)=>{const s={tag:e||a.name,props:t};return r.metadata(r.Metadata.key(n.REFLECT,n.UIMODEL),s)(a)}}function C(e){return r.apply(r.metadata(r.Metadata.key(n.REFLECT,n.RENDERED_BY),e))}function S(e,t){return(a,o)=>{const s={item:{tag:e||a.name,props:t}};return r.metadata(r.Metadata.key(n.REFLECT,n.UILISTMODEL),s)(a)}}function b(e){return t=>{const a={handlers:e};return r.metadata(r.Metadata.key(n.REFLECT,n.HANDLERS),a)(t)}}function P(t,a=1,o=1,s={}){const i=Object.assign({..."boolean"==typeof a?{flexMode:a,cols:1}:{flexMode:!1,cols:a},rows:o,...Object.assign({breakpoint:e.UIMediaBreakPoints.LARGE},s)});return(e,a)=>(r.metadata(r.Metadata.key(n.REFLECT,n.UILAYOUT),i)(e),I(t,i)(e,a))}function k(e,t=1,a=!1,r={}){let o=[];return"object"==typeof t&&(o=t,t=o.length),I(e,{pages:t,paginated:a,pageTitles:o,props:r})}t.Model.prototype.render=function(...e){return T.render(this,...e)},t.Model.renderedBy=(e=>r.Metadata.get(e,r.Metadata.key(n.REFLECT,n.RENDERED_BY))).bind(t.Model),t.Model.uiPropertiesOf=(e=>{const t=r.Metadata.get(e,r.Metadata.key(n.REFLECT,r.DecorationKeys.PROPERTIES));if(t)return Object.keys(t)}).bind(t.Model),t.Model.uiDecorationOf=(e,t,a)=>{const o=r.Metadata.get(e,r.Metadata.key(n.REFLECT,r.DecorationKeys.PROPERTIES,t));if(o)return a?o[a]:o},t.Model.uiModelOf=e=>r.Metadata.get(e,r.Metadata.key(n.REFLECT,n.UIMODEL)),t.Model.uiElementOf=(e,t)=>r.Metadata.get(e,h(t,n.ELEMENT)),t.Model.uiListModelOf=e=>r.Metadata.get(e,r.Metadata.key(n.REFLECT,n.UILISTMODEL)),t.Model.uiHandlersFor=e=>r.Metadata.get(e,r.Metadata.key(n.REFLECT,n.HANDLERS)),t.Model.uiLayoutOf=e=>r.Metadata.get(e,r.Metadata.key(n.REFLECT,n.UILAYOUT)),t.Model.uiIsHidden=(e,t)=>!!r.Metadata.get(e,h(t,n.HIDDEN)),t.Model.uiIsHiddenOn=(e,t,a)=>{const o=r.Metadata.get(e,h(t,n.HIDDEN));return!!o&&(a?o.includes(a):o)},t.Model.uiTypeOf=(e,t)=>{const o=r.Metadata.get(e,r.Metadata.key(n.REFLECT,r.DecorationKeys.PROPERTIES,t));if(!o)throw new a.NotFoundError(`No metadata found for property '${t}' on model '${e.name}'`);const s=Object.keys(o).filter(e=>[n.PROP,n.ELEMENT,n.CHILD].includes(e));if(0===s.length)throw new a.NotFoundError(`No UI type metadata found for property '${t}' on model '${e.name}'`);if(s.length>1)throw new u("Only one type of decoration is allowed. Please choose between @uiprop, @uichild or @uielement");return o[s[0]]},t.Model.uiListItems=(e=>{const t=r.Metadata.get(e,r.Metadata.key(n.REFLECT,r.DecorationKeys.PROPERTIES));if(t)return Object.keys(t)}).bind(t.Model);const w=t.ModelBuilder.prototype;var U;w.decorateClass||(w.decorateClass=function(e){return this._classDecorators||(this._classDecorators=[]),this._classDecorators.push(e),this}),w.uimodel=function(e,t){return this.decorateClass(I(e,t))},w.renderedBy=function(e){return this.decorateClass(C(e))},w.uilistmodel=function(e,t){return this.decorateClass(S(e,t))},w.uihandlers=function(e){return this.decorateClass(b(e))},w.uilayout=function(e,t,a,r){return this.decorateClass(P(e,t,a,r))},w.uisteppedmodel=function(e,t,a,r){return this.decorateClass(k(e,t,a,r))},e.DashKeys=void 0,(U=e.DashKeys||(e.DashKeys={})).ROOT="dashboard",U.COMPONENT="dashboard.component";const v=new Set;function H(e){v.add(e)}function F(e){const t=r.Metadata.constr(e);if("function"==typeof t)return t;const a=e.constructor;return"function"==typeof a?a:e}function V(t){const a=F(t);return r.Metadata.get(a,e.DashKeys.COMPONENT)}const _="##VERSION##",B="##PACKAGE##";r.Metadata.registerLibrary(B,_),e.ActionRoles=E,e.COMMIT="0285f65",e.ComponentEventNames={Render:"render",BackButtonClickEvent:"backButtonNavigationEndEvent",Refresh:"RefreshEvent",Click:"ClickEvent",Change:"ChangeEvent",Submit:"SubmitEvent",ValidationError:"validationErrorEvent",ThemeChange:"themeChangeEvent",FormGroupLoaded:"formGroupLoadedEvent"},e.DecafComponent=D,e.DecafEventHandler=class extends D{constructor(){super()}handle(...e){this.log.for(this.handle).info(`component ${this.componentName} handling ${JSON.stringify(e)}`)}handleClick(...e){this.log.for(this.handleClick).info(`component ${this.componentName} handling click ${JSON.stringify(e)}`)}handleAction(...e){this.log.for(this.handleAction).info(`component ${this.componentName} handling action ${JSON.stringify(e)}`)}},e.DecafTranslateService=N,e.ElementPositions={left:"left",center:"center",right:"right",top:"top",bottom:"bottom"},e.ElementSizes={xsmall:"xsmall",small:"small",medium:"medium",default:"default",large:"large",xLarge:"xlarge","2xLarge":"2xlarge",auto:"auto",expand:"expand",block:"block",half:"half",full:"full"},e.FULL_VERSION="0.20.8-0285f65",e.HTML5CheckTypes=p,e.HTML5DateFormat=l,e.HTML5InputTypes=c,e.LayoutGridGaps={small:"small",medium:"medium",large:"large",collapse:"collapse",none:""},e.PACKAGE_NAME=B,e.RenderingEngine=T,e.RenderingError=u,e.TransactionHooks={BeforeRead:"beforeRead",AfterRead:"afterRead",BeforeCreate:"beforeCreate",AfterCreate:"afterCreate",BeforeUpdate:"beforeUpdate",AfterUpdate:"afterUpdate",BeforeDelete:"beforeDelete",AfterDelete:"afterDelete"},e.UIKeys=n,e.UIValidator=A,e.VERSION=_,e.ValidatableByAttribute=d,e.ValidatableByType=i,e.WindowColorSchemes={light:"light",dark:"dark",undefined:"undefined"},e.dashComponentDefinitionOf=e=>{const t=F(e),a=V(t)||{},r=a.tag||t.name;return{name:t.name,tag:r,label:a.label,defaultSize:a.defaultSize??{cols:1,rows:1},model:a.model,props:a.props,metadata:a.metadata}},e.dashComponentMetadataOf=V,e.dashComponents=()=>[...v],e.dashcomponent=(t,a,o)=>r.Decoration.for(e.DashKeys.COMPONENT).define({decorator:(t,a,o)=>{const s={tag:a?.tag||t,...a,defaultSize:a?.defaultSize??{cols:1,rows:1}};return a=>{const n=r.apply(I(t,o),r.metadata(e.DashKeys.COMPONENT,s))(a);return H(a),n}},args:[t,a,o]}).apply(),e.escapeHtml=M,e.formatByType=y,e.generateUIModelID=O,e.getUIAttributeKey=h,e.hidden=()=>R(a.OperationKeys.CREATE,a.OperationKeys.READ,a.OperationKeys.UPDATE,a.OperationKeys.DELETE),e.hideFor=(...e)=>(t,a)=>r.propMetadata(h(a,n.HIDE_FOR),e)(t,a),e.hideOn=R,e.isClassConstructor=f,e.parseToNumber=m,e.parseValueByType=function e(r,o,s){let n;switch(r){case Array.name:n=(Array.isArray(o)?o.map(a=>e(t.ReservedModels.STRING.name.toLowerCase(),a,s)):[o]).join(",");break;case c.NUMBER:n=m(o);break;case c.DATE:{const e=s.format;o&&(""+o).trim().length&&(n=typeof o===t.ReservedModels.NUMBER.name.toLowerCase()?new Date(o):o?e?t.parseDate(e,o):new Date(o):void 0);break}default:n=typeof o===t.ReservedModels.OBJECT.name.toLowerCase()?Array.isArray(o)?o.join(","):JSON.stringify(o):typeof o===t.ReservedModels.BOOLEAN.name.toLowerCase()?o:typeof o===t.ReservedModels.STRING.name.toLowerCase()?M(o):n}if(void 0===n)throw new a.InternalError(`Failed to parse value of type ${r} from ${typeof o} - ${o}`);return n},e.registerDashComponent=H,e.renderIf=(...e)=>g(...e),e.renderedBy=C,e.resetDashComponentRegistry=()=>{v.clear()},e.revertHtml=e=>{const t={"&":"&","<":"<",">":">"};return(""+e).replace(/<|>|&/g,e=>t[e]||e)},e.showFor=g,e.uichild=(e,t,a={},o=!1,s=!1)=>(i,d)=>{const l={tag:t,serialize:s,props:Object.assign({},a||{},{name:e||d},o?{customTypes:[Array.name],multiple:!0}:{multiple:a?.multiple||!1})};r.propMetadata(h(d,n.CHILD),l)(i,d)},e.uielement=(e,t,a=!1)=>(o,s)=>{"object"==typeof e&&(t=e,e="");const i={tag:e,serialize:a,props:Object.assign({},t||{},{name:s})};return r.propMetadata(h(s,n.ELEMENT),i)(o,s)},e.uihandlers=b,e.uilayout=P,e.uilayoutprop=(e=1,t=1)=>(a,o)=>{const s={name:o,props:Object.assign({},{row:t,col:e})};r.propMetadata(h(o,n.UILAYOUTPROP),s)(a,o)},e.uilistmodel=S,e.uilistprop=(e=void 0,t)=>(a,o)=>{const s={name:e||o,props:t||{}};r.propMetadata(h(o,n.UILISTPROP),s)(a,o)},e.uimodel=I,e.uion=L,e.uionclick=e=>L("handleClick",e),e.uionrender=e=>L("render",e),e.uiorder=(e=n.FIRST)=>(t,a)=>r.propMetadata(h(a,n.ORDER),e)(t,a),e.uipageprop=(e=1)=>(t,a)=>r.propMetadata(h(a,n.PAGE),e)(t,a),e.uiprop=(e=void 0,t=!1)=>(a,o)=>{const s={name:e||o,stringify:t};r.propMetadata(h(o,n.PROP),s)(a,o)},e.uisteppedmodel=k,e.uitablecol=(e=n.LAST,t)=>(a,o)=>{const s={name:o,props:{sequence:e,...t?{valueParserFn:t}:{}}};r.propMetadata(h(o,n.UILISTPROP),s)(a,o)}},"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@decaf-ts/decorator-validation"),require("@decaf-ts/db-decorators"),require("@decaf-ts/decoration"),require("@decaf-ts/logging")):"function"==typeof define&&define.amd?define(["exports","@decaf-ts/decorator-validation","@decaf-ts/db-decorators","@decaf-ts/decoration","@decaf-ts/logging"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["ui-decorators"]={},e.decafTsDecoratorValidation,e.decafTsDbDecorators,e.decafTsDecoration,e.decafTsLogging);
|
|
2
|
+
//# sourceMappingURL=ui-decorators.cjs.map
|