@decaf-ts/for-fabric 0.12.7 → 0.12.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +177 -146
- package/dist/for-fabric.cjs +3804 -2
- package/dist/for-fabric.js +3908 -2
- package/lib/cjs/bin/cli.cjs +2 -2
- package/lib/cjs/cli-module.cjs +215 -6
- package/lib/cjs/cli-utils.cjs +2 -2
- package/lib/cjs/client/FabricClientAdapter.cjs +2 -2
- package/lib/cjs/client/FabricClientDispatch.cjs +3 -3
- package/lib/cjs/client/FabricClientPaginator.cjs +2 -2
- package/lib/cjs/client/FabricClientRepository.cjs +2 -2
- package/lib/cjs/client/FabricClientStatement.cjs +2 -2
- package/lib/cjs/client/collections/generation.cjs +2 -2
- package/lib/cjs/client/collections/index.cjs +2 -2
- package/lib/cjs/client/constants.cjs +2 -2
- package/lib/cjs/client/crypto.cjs +2 -2
- package/lib/cjs/client/erc20/FabricERC20ClientRepository.cjs +2 -2
- package/lib/cjs/client/erc20/index.cjs +2 -2
- package/lib/cjs/client/fabric-fs.cjs +2 -2
- package/lib/cjs/client/fabric-hsm.cjs +2 -2
- package/lib/cjs/client/ids/id-extraction.cjs +2 -2
- package/lib/cjs/client/ids/index.cjs +2 -2
- package/lib/cjs/client/index.cjs +2 -2
- package/lib/cjs/client/indexes/generation.cjs +9 -4
- package/lib/cjs/client/indexes/index.cjs +2 -2
- package/lib/cjs/client/logging.cjs +2 -2
- package/lib/cjs/client/services/FabricEnrollmentService.cjs +2 -2
- package/lib/cjs/client/services/FabricIdentityService.cjs +2 -2
- package/lib/cjs/client/services/RegistrationRequestBuilder.cjs +2 -2
- package/lib/cjs/client/services/constants.cjs +2 -2
- package/lib/cjs/client/services/index.cjs +2 -2
- package/lib/cjs/client/types.cjs +2 -2
- package/lib/cjs/client/utils.cjs +2 -2
- package/lib/cjs/contract/Address.cjs +2 -2
- package/lib/cjs/contract/AddressContract.cjs +2 -2
- package/lib/cjs/contract/AuditContract.cjs +2 -2
- package/lib/cjs/contract/BatchContract.cjs +2 -2
- package/lib/cjs/contract/MarketContract.cjs +2 -2
- package/lib/cjs/contract/OtherAuditContract.cjs +2 -2
- package/lib/cjs/contract/OtherBatchContract.cjs +2 -2
- package/lib/cjs/contract/OtherLeafletContract.cjs +72 -0
- package/lib/cjs/contract/OtherLeafletFileContract.cjs +76 -0
- package/lib/cjs/contract/OtherMarketContract.cjs +2 -2
- package/lib/cjs/contract/OtherProductContract.cjs +2 -2
- package/lib/cjs/contract/OtherProductImageContract.cjs +2 -2
- package/lib/cjs/contract/OtherProductSharedContract.cjs +2 -2
- package/lib/cjs/contract/OtherProductStrengthContract.cjs +2 -2
- package/lib/cjs/contract/Product.cjs +2 -2
- package/lib/cjs/contract/ProductContract.cjs +2 -2
- package/lib/cjs/contract/ProductStrengthContract.cjs +2 -2
- package/lib/cjs/contract/SegregatedPrivateDocumentContract.cjs +2 -2
- package/lib/cjs/contract/SegregatedSharedDocumentContract.cjs +2 -2
- package/lib/cjs/contract/User.cjs +2 -2
- package/lib/cjs/contract/UserContract.cjs +2 -2
- package/lib/cjs/contract/index.cjs +19 -20
- package/lib/cjs/contract/logging-context.cjs +2 -2
- package/lib/cjs/contract/models/Audit.cjs +2 -2
- package/lib/cjs/contract/models/BaseIdentifiedModel.cjs +2 -2
- package/lib/cjs/contract/models/BaseModel.cjs +2 -2
- package/lib/cjs/contract/models/Batch.cjs +2 -2
- package/lib/cjs/contract/models/GtinOwner.cjs +2 -2
- package/lib/cjs/contract/models/History.cjs +2 -2
- package/lib/cjs/contract/models/Leaflet.cjs +2 -2
- package/lib/cjs/contract/models/LeafletFile.cjs +2 -2
- package/lib/cjs/contract/models/Market.cjs +2 -2
- package/lib/cjs/contract/models/OtherAudit.cjs +3 -3
- package/lib/cjs/contract/models/OtherBatchShared.cjs +137 -28
- package/lib/cjs/contract/models/OtherLeaflet.cjs +3 -3
- package/lib/cjs/contract/models/OtherLeafletFile.cjs +3 -3
- package/lib/cjs/contract/models/OtherMarket.cjs +3 -3
- package/lib/cjs/contract/models/OtherProduct.cjs +4 -4
- package/lib/cjs/contract/models/OtherProductImage.cjs +3 -3
- package/lib/cjs/contract/models/OtherProductShared.cjs +3 -3
- package/lib/cjs/contract/models/OtherProductStrength.cjs +3 -5
- package/lib/cjs/contract/models/Product.cjs +2 -2
- package/lib/cjs/contract/models/ProductStrength.cjs +2 -2
- package/lib/cjs/contract/models/SegregatedDocument.cjs +8 -6
- package/lib/cjs/contract/models/constants.cjs +2 -2
- package/lib/cjs/contract/models/decorators-private.cjs +2 -2
- package/lib/cjs/contract/models/decorators.cjs +2 -2
- package/lib/cjs/contract/models/gtin.cjs +2 -2
- package/lib/cjs/contract/models/history-dec.cjs +2 -2
- package/lib/cjs/contract/trackedModels/History.cjs +81 -0
- package/lib/cjs/contract/trackedModels/OtherAudit.cjs +124 -0
- package/lib/cjs/contract/trackedModels/OtherLeaflet.cjs +121 -0
- package/lib/cjs/contract/trackedModels/OtherLeafletFile.cjs +71 -0
- package/lib/cjs/contract/trackedModels/OtherMarket.cjs +90 -0
- package/lib/cjs/contract/trackedModels/OtherProduct.cjs +83 -0
- package/lib/cjs/contract/trackedModels/OtherProductImage.cjs +65 -0
- package/lib/cjs/contract/trackedModels/OtherProductShared.cjs +105 -0
- package/lib/cjs/contract/trackedModels/OtherProductStrength.cjs +91 -0
- package/lib/cjs/contracts/ContractAdapter.cjs +2 -2
- package/lib/cjs/contracts/ContractContext.cjs +2 -2
- package/lib/cjs/contracts/FabricContractDispatch.cjs +2 -2
- package/lib/cjs/contracts/FabricContractPaginator.cjs +2 -2
- package/lib/cjs/contracts/FabricContractRepository.cjs +2 -2
- package/lib/cjs/contracts/FabricContractRepositoryObservableHandler.cjs +2 -2
- package/lib/cjs/contracts/FabricContractSequence.cjs +2 -2
- package/lib/cjs/contracts/FabricContractStatement.cjs +2 -2
- package/lib/cjs/contracts/MigrationContract.cjs +2 -2
- package/lib/cjs/contracts/PrivateSequence.cjs +2 -2
- package/lib/cjs/contracts/auth/decorators.cjs +2 -2
- package/lib/cjs/contracts/auth/index.cjs +2 -2
- package/lib/cjs/contracts/bootstrap.cjs +2 -2
- package/lib/cjs/contracts/crud/crud-contract.cjs +2 -2
- package/lib/cjs/contracts/crud/index.cjs +2 -2
- package/lib/cjs/contracts/crud/serialized-crud-contract.cjs +2 -2
- package/lib/cjs/contracts/erc20/erc20contract.cjs +2 -2
- package/lib/cjs/contracts/erc20/index.cjs +2 -2
- package/lib/cjs/contracts/erc20/models.cjs +2 -2
- package/lib/cjs/contracts/fabric-overrides.cjs +2 -2
- package/lib/cjs/contracts/index.cjs +2 -2
- package/lib/cjs/contracts/logging.cjs +2 -2
- package/lib/cjs/contracts/overrides.cjs +2 -2
- package/lib/cjs/contracts/types.cjs +2 -2
- package/lib/cjs/contracts/uuid.cjs +2 -2
- package/lib/cjs/index.cjs +2 -2
- package/lib/cjs/shared/ClientSerializer.cjs +2 -2
- package/lib/cjs/shared/DeterministicSerializer.cjs +2 -2
- package/lib/cjs/shared/SimpleDeterministicSerializer.cjs +2 -2
- package/lib/cjs/shared/constants.cjs +2 -2
- package/lib/cjs/shared/decorators.cjs +2 -2
- package/lib/cjs/shared/erc20/erc20-constants.cjs +2 -2
- package/lib/cjs/shared/erc20/index.cjs +2 -2
- package/lib/cjs/shared/errors.cjs +2 -2
- package/lib/cjs/shared/events.cjs +2 -2
- package/lib/cjs/shared/fabric-types.cjs +2 -2
- package/lib/cjs/shared/index.cjs +2 -2
- package/lib/cjs/shared/interfaces/Checkable.cjs +2 -2
- package/lib/cjs/shared/interfaces/index.cjs +2 -2
- package/lib/cjs/shared/math.cjs +2 -2
- package/lib/cjs/shared/model/FabricBaseModel.cjs +2 -2
- package/lib/cjs/shared/model/FabricIdentifiedBaseModel.cjs +2 -2
- package/lib/cjs/shared/model/Identity.cjs +2 -2
- package/lib/cjs/shared/model/IdentityCredentials.cjs +2 -2
- package/lib/cjs/shared/model/index.cjs +2 -2
- package/lib/cjs/shared/overrides/Model.cjs +2 -2
- package/lib/cjs/shared/overrides/index.cjs +2 -2
- package/lib/cjs/shared/overrides/overrides.cjs +2 -2
- package/lib/cjs/shared/types.cjs +2 -2
- package/lib/cjs/version.cjs +18 -4
- package/lib/esm/bin/cli.js +1 -1
- package/lib/esm/cli-module.js +214 -5
- package/lib/esm/cli-utils.js +1 -1
- package/lib/esm/client/FabricClientAdapter.js +1 -1
- package/lib/esm/client/FabricClientDispatch.js +2 -2
- package/lib/esm/client/FabricClientPaginator.js +1 -1
- package/lib/esm/client/FabricClientRepository.js +1 -1
- package/lib/esm/client/FabricClientStatement.js +1 -1
- package/lib/esm/client/collections/generation.js +1 -1
- package/lib/esm/client/collections/index.js +1 -1
- package/lib/esm/client/constants.js +1 -1
- package/lib/esm/client/crypto.js +1 -1
- package/lib/esm/client/erc20/FabricERC20ClientRepository.js +1 -1
- package/lib/esm/client/erc20/index.js +1 -1
- package/lib/esm/client/fabric-fs.js +1 -1
- package/lib/esm/client/fabric-hsm.js +1 -1
- package/lib/esm/client/ids/id-extraction.js +1 -1
- package/lib/esm/client/ids/index.js +1 -1
- package/lib/esm/client/index.js +1 -1
- package/lib/esm/client/indexes/generation.js +8 -3
- package/lib/esm/client/indexes/index.js +1 -1
- package/lib/esm/client/logging.js +1 -1
- package/lib/esm/client/services/FabricEnrollmentService.js +1 -1
- package/lib/esm/client/services/FabricIdentityService.js +1 -1
- package/lib/esm/client/services/RegistrationRequestBuilder.js +1 -1
- package/lib/esm/client/services/constants.js +1 -1
- package/lib/esm/client/services/index.js +1 -1
- package/lib/esm/client/types.js +1 -1
- package/lib/esm/client/utils.js +1 -1
- package/lib/esm/contract/Address.js +1 -1
- package/lib/esm/contract/AddressContract.js +1 -1
- package/lib/esm/contract/AuditContract.js +1 -1
- package/lib/esm/contract/BatchContract.js +1 -1
- package/lib/esm/contract/MarketContract.js +1 -1
- package/lib/esm/contract/OtherAuditContract.js +1 -1
- package/lib/esm/contract/OtherBatchContract.js +1 -1
- package/lib/esm/contract/OtherLeafletContract.js +63 -0
- package/lib/esm/contract/OtherLeafletFileContract.js +67 -0
- package/lib/esm/contract/OtherMarketContract.js +1 -1
- package/lib/esm/contract/OtherProductContract.js +1 -1
- package/lib/esm/contract/OtherProductImageContract.js +1 -1
- package/lib/esm/contract/OtherProductSharedContract.js +1 -1
- package/lib/esm/contract/OtherProductStrengthContract.js +1 -1
- package/lib/esm/contract/Product.js +1 -1
- package/lib/esm/contract/ProductContract.js +1 -1
- package/lib/esm/contract/ProductStrengthContract.js +1 -1
- package/lib/esm/contract/SegregatedPrivateDocumentContract.js +1 -1
- package/lib/esm/contract/SegregatedSharedDocumentContract.js +1 -1
- package/lib/esm/contract/User.js +1 -1
- package/lib/esm/contract/UserContract.js +1 -1
- package/lib/esm/contract/index.js +18 -19
- package/lib/esm/contract/logging-context.js +1 -1
- package/lib/esm/contract/models/Audit.js +1 -1
- package/lib/esm/contract/models/BaseIdentifiedModel.js +1 -1
- package/lib/esm/contract/models/BaseModel.js +1 -1
- package/lib/esm/contract/models/Batch.js +1 -1
- package/lib/esm/contract/models/GtinOwner.js +1 -1
- package/lib/esm/contract/models/History.js +1 -1
- package/lib/esm/contract/models/Leaflet.js +1 -1
- package/lib/esm/contract/models/LeafletFile.js +1 -1
- package/lib/esm/contract/models/Market.js +1 -1
- package/lib/esm/contract/models/OtherAudit.js +2 -2
- package/lib/esm/contract/models/OtherBatchShared.js +139 -31
- package/lib/esm/contract/models/OtherLeaflet.js +2 -2
- package/lib/esm/contract/models/OtherLeafletFile.js +2 -2
- package/lib/esm/contract/models/OtherMarket.js +2 -2
- package/lib/esm/contract/models/OtherProduct.js +4 -4
- package/lib/esm/contract/models/OtherProductImage.js +2 -2
- package/lib/esm/contract/models/OtherProductShared.js +2 -2
- package/lib/esm/contract/models/OtherProductStrength.js +2 -4
- package/lib/esm/contract/models/Product.js +1 -1
- package/lib/esm/contract/models/ProductStrength.js +1 -1
- package/lib/esm/contract/models/SegregatedDocument.js +8 -6
- package/lib/esm/contract/models/constants.js +1 -1
- package/lib/esm/contract/models/decorators-private.js +1 -1
- package/lib/esm/contract/models/decorators.js +1 -1
- package/lib/esm/contract/models/gtin.js +1 -1
- package/lib/esm/contract/models/history-dec.js +1 -1
- package/lib/esm/contract/trackedModels/History.js +72 -0
- package/lib/esm/contract/trackedModels/OtherAudit.js +115 -0
- package/lib/esm/contract/trackedModels/OtherLeaflet.js +112 -0
- package/lib/esm/contract/trackedModels/OtherLeafletFile.js +62 -0
- package/lib/esm/contract/trackedModels/OtherMarket.js +81 -0
- package/lib/esm/contract/trackedModels/OtherProduct.js +74 -0
- package/lib/esm/contract/trackedModels/OtherProductImage.js +56 -0
- package/lib/esm/contract/trackedModels/OtherProductShared.js +96 -0
- package/lib/esm/contract/trackedModels/OtherProductStrength.js +82 -0
- package/lib/esm/contracts/ContractAdapter.js +1 -1
- package/lib/esm/contracts/ContractContext.js +1 -1
- package/lib/esm/contracts/FabricContractDispatch.js +1 -1
- package/lib/esm/contracts/FabricContractPaginator.js +1 -1
- package/lib/esm/contracts/FabricContractRepository.js +1 -1
- package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js +1 -1
- package/lib/esm/contracts/FabricContractSequence.js +1 -1
- package/lib/esm/contracts/FabricContractStatement.js +1 -1
- package/lib/esm/contracts/MigrationContract.js +1 -1
- package/lib/esm/contracts/PrivateSequence.js +1 -1
- package/lib/esm/contracts/auth/decorators.js +1 -1
- package/lib/esm/contracts/auth/index.js +1 -1
- package/lib/esm/contracts/bootstrap.js +1 -1
- package/lib/esm/contracts/crud/crud-contract.js +1 -1
- package/lib/esm/contracts/crud/index.js +1 -1
- package/lib/esm/contracts/crud/serialized-crud-contract.js +1 -1
- package/lib/esm/contracts/erc20/erc20contract.js +1 -1
- package/lib/esm/contracts/erc20/index.js +1 -1
- package/lib/esm/contracts/erc20/models.js +1 -1
- package/lib/esm/contracts/fabric-overrides.js +3 -3
- package/lib/esm/contracts/index.js +1 -1
- package/lib/esm/contracts/logging.js +1 -1
- package/lib/esm/contracts/overrides.js +1 -1
- package/lib/esm/contracts/types.js +1 -1
- package/lib/esm/contracts/uuid.js +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/shared/ClientSerializer.js +1 -1
- package/lib/esm/shared/DeterministicSerializer.js +1 -1
- package/lib/esm/shared/SimpleDeterministicSerializer.js +1 -1
- package/lib/esm/shared/constants.js +1 -1
- package/lib/esm/shared/decorators.js +1 -1
- package/lib/esm/shared/erc20/erc20-constants.js +1 -1
- package/lib/esm/shared/erc20/index.js +1 -1
- package/lib/esm/shared/errors.js +1 -1
- package/lib/esm/shared/events.js +1 -1
- package/lib/esm/shared/fabric-types.js +1 -1
- package/lib/esm/shared/index.js +1 -1
- package/lib/esm/shared/interfaces/Checkable.js +1 -1
- package/lib/esm/shared/interfaces/index.js +1 -1
- package/lib/esm/shared/math.js +1 -1
- package/lib/esm/shared/model/FabricBaseModel.js +1 -1
- package/lib/esm/shared/model/FabricIdentifiedBaseModel.js +1 -1
- package/lib/esm/shared/model/Identity.js +1 -1
- package/lib/esm/shared/model/IdentityCredentials.js +1 -1
- package/lib/esm/shared/model/index.js +1 -1
- package/lib/esm/shared/overrides/Model.js +1 -1
- package/lib/esm/shared/overrides/index.js +1 -1
- package/lib/esm/shared/overrides/overrides.js +1 -1
- package/lib/esm/shared/types.js +1 -1
- package/lib/esm/version.js +16 -2
- package/lib/types/contract/OtherLeafletContract.d.cts +18 -0
- package/lib/types/contract/OtherLeafletContract.d.mts +18 -0
- package/lib/types/contract/OtherLeafletFileContract.d.cts +17 -0
- package/lib/types/contract/OtherLeafletFileContract.d.mts +17 -0
- package/lib/types/contract/models/OtherBatchShared.d.cts +43 -6
- package/lib/types/contract/models/OtherBatchShared.d.mts +43 -6
- package/lib/types/contract/trackedModels/History.d.cts +9 -0
- package/lib/types/contract/trackedModels/History.d.mts +9 -0
- package/lib/types/contract/trackedModels/OtherAudit.d.cts +15 -0
- package/lib/types/contract/trackedModels/OtherAudit.d.mts +15 -0
- package/lib/types/contract/trackedModels/OtherLeaflet.d.cts +16 -0
- package/lib/types/contract/trackedModels/OtherLeaflet.d.mts +16 -0
- package/lib/types/contract/trackedModels/OtherLeafletFile.d.cts +10 -0
- package/lib/types/contract/trackedModels/OtherLeafletFile.d.mts +10 -0
- package/lib/types/contract/trackedModels/OtherMarket.d.cts +13 -0
- package/lib/types/contract/trackedModels/OtherMarket.d.mts +13 -0
- package/lib/types/contract/trackedModels/OtherProduct.d.cts +12 -0
- package/lib/types/contract/trackedModels/OtherProduct.d.mts +12 -0
- package/lib/types/contract/trackedModels/OtherProductImage.d.cts +9 -0
- package/lib/types/contract/trackedModels/OtherProductImage.d.mts +9 -0
- package/lib/types/contract/trackedModels/OtherProductShared.d.cts +18 -0
- package/lib/types/contract/trackedModels/OtherProductShared.d.mts +18 -0
- package/lib/types/contract/trackedModels/OtherProductStrength.d.cts +12 -0
- package/lib/types/contract/trackedModels/OtherProductStrength.d.mts +12 -0
- package/lib/types/contracts/FabricContractStatement.d.cts +2 -2
- package/lib/types/contracts/FabricContractStatement.d.mts +2 -2
- package/lib/types/version.d.cts +15 -1
- package/lib/types/version.d.mts +15 -1
- package/package.json +19 -6
- package/dist/for-fabric.cjs.map +0 -1
- package/dist/for-fabric.js.map +0 -1
- package/lib/cjs/bin/cli.cjs.map +0 -1
- package/lib/cjs/cli-module.cjs.map +0 -1
- package/lib/cjs/cli-utils.cjs.map +0 -1
- package/lib/cjs/client/FabricClientAdapter.cjs.map +0 -1
- package/lib/cjs/client/FabricClientDispatch.cjs.map +0 -1
- package/lib/cjs/client/FabricClientPaginator.cjs.map +0 -1
- package/lib/cjs/client/FabricClientRepository.cjs.map +0 -1
- package/lib/cjs/client/FabricClientStatement.cjs.map +0 -1
- package/lib/cjs/client/collections/generation.cjs.map +0 -1
- package/lib/cjs/client/collections/index.cjs.map +0 -1
- package/lib/cjs/client/constants.cjs.map +0 -1
- package/lib/cjs/client/crypto.cjs.map +0 -1
- package/lib/cjs/client/erc20/FabricERC20ClientRepository.cjs.map +0 -1
- package/lib/cjs/client/erc20/index.cjs.map +0 -1
- package/lib/cjs/client/fabric-fs.cjs.map +0 -1
- package/lib/cjs/client/fabric-hsm.cjs.map +0 -1
- package/lib/cjs/client/ids/id-extraction.cjs.map +0 -1
- package/lib/cjs/client/ids/index.cjs.map +0 -1
- package/lib/cjs/client/index.cjs.map +0 -1
- package/lib/cjs/client/indexes/generation.cjs.map +0 -1
- package/lib/cjs/client/indexes/index.cjs.map +0 -1
- package/lib/cjs/client/logging.cjs.map +0 -1
- package/lib/cjs/client/services/FabricEnrollmentService.cjs.map +0 -1
- package/lib/cjs/client/services/FabricIdentityService.cjs.map +0 -1
- package/lib/cjs/client/services/RegistrationRequestBuilder.cjs.map +0 -1
- package/lib/cjs/client/services/constants.cjs.map +0 -1
- package/lib/cjs/client/services/index.cjs.map +0 -1
- package/lib/cjs/client/types.cjs.map +0 -1
- package/lib/cjs/client/utils.cjs.map +0 -1
- package/lib/cjs/contract/Address.cjs.map +0 -1
- package/lib/cjs/contract/AddressContract.cjs.map +0 -1
- package/lib/cjs/contract/AuditContract.cjs.map +0 -1
- package/lib/cjs/contract/BatchContract.cjs.map +0 -1
- package/lib/cjs/contract/MarketContract.cjs.map +0 -1
- package/lib/cjs/contract/OtherAuditContract.cjs.map +0 -1
- package/lib/cjs/contract/OtherBatchContract.cjs.map +0 -1
- package/lib/cjs/contract/OtherMarketContract.cjs.map +0 -1
- package/lib/cjs/contract/OtherProductContract.cjs.map +0 -1
- package/lib/cjs/contract/OtherProductImageContract.cjs.map +0 -1
- package/lib/cjs/contract/OtherProductSharedContract.cjs.map +0 -1
- package/lib/cjs/contract/OtherProductStrengthContract.cjs.map +0 -1
- package/lib/cjs/contract/Product.cjs.map +0 -1
- package/lib/cjs/contract/ProductContract.cjs.map +0 -1
- package/lib/cjs/contract/ProductStrengthContract.cjs.map +0 -1
- package/lib/cjs/contract/SegregatedPrivateDocumentContract.cjs.map +0 -1
- package/lib/cjs/contract/SegregatedSharedDocumentContract.cjs.map +0 -1
- package/lib/cjs/contract/User.cjs.map +0 -1
- package/lib/cjs/contract/UserContract.cjs.map +0 -1
- package/lib/cjs/contract/index.cjs.map +0 -1
- package/lib/cjs/contract/logging-context.cjs.map +0 -1
- package/lib/cjs/contract/models/Audit.cjs.map +0 -1
- package/lib/cjs/contract/models/BaseIdentifiedModel.cjs.map +0 -1
- package/lib/cjs/contract/models/BaseModel.cjs.map +0 -1
- package/lib/cjs/contract/models/Batch.cjs.map +0 -1
- package/lib/cjs/contract/models/GtinOwner.cjs.map +0 -1
- package/lib/cjs/contract/models/History.cjs.map +0 -1
- package/lib/cjs/contract/models/Leaflet.cjs.map +0 -1
- package/lib/cjs/contract/models/LeafletFile.cjs.map +0 -1
- package/lib/cjs/contract/models/Market.cjs.map +0 -1
- package/lib/cjs/contract/models/OtherAudit.cjs.map +0 -1
- package/lib/cjs/contract/models/OtherBatchShared.cjs.map +0 -1
- package/lib/cjs/contract/models/OtherLeaflet.cjs.map +0 -1
- package/lib/cjs/contract/models/OtherLeafletFile.cjs.map +0 -1
- package/lib/cjs/contract/models/OtherMarket.cjs.map +0 -1
- package/lib/cjs/contract/models/OtherProduct.cjs.map +0 -1
- package/lib/cjs/contract/models/OtherProductImage.cjs.map +0 -1
- package/lib/cjs/contract/models/OtherProductShared.cjs.map +0 -1
- package/lib/cjs/contract/models/OtherProductStrength.cjs.map +0 -1
- package/lib/cjs/contract/models/Product.cjs.map +0 -1
- package/lib/cjs/contract/models/ProductStrength.cjs.map +0 -1
- package/lib/cjs/contract/models/SegregatedDocument.cjs.map +0 -1
- package/lib/cjs/contract/models/constants.cjs.map +0 -1
- package/lib/cjs/contract/models/decorators-private.cjs.map +0 -1
- package/lib/cjs/contract/models/decorators.cjs.map +0 -1
- package/lib/cjs/contract/models/gtin.cjs.map +0 -1
- package/lib/cjs/contract/models/history-dec.cjs.map +0 -1
- package/lib/cjs/contracts/ContractAdapter.cjs.map +0 -1
- package/lib/cjs/contracts/ContractContext.cjs.map +0 -1
- package/lib/cjs/contracts/FabricContractDispatch.cjs.map +0 -1
- package/lib/cjs/contracts/FabricContractPaginator.cjs.map +0 -1
- package/lib/cjs/contracts/FabricContractRepository.cjs.map +0 -1
- package/lib/cjs/contracts/FabricContractRepositoryObservableHandler.cjs.map +0 -1
- package/lib/cjs/contracts/FabricContractSequence.cjs.map +0 -1
- package/lib/cjs/contracts/FabricContractStatement.cjs.map +0 -1
- package/lib/cjs/contracts/MigrationContract.cjs.map +0 -1
- package/lib/cjs/contracts/PrivateSequence.cjs.map +0 -1
- package/lib/cjs/contracts/auth/decorators.cjs.map +0 -1
- package/lib/cjs/contracts/auth/index.cjs.map +0 -1
- package/lib/cjs/contracts/bootstrap.cjs.map +0 -1
- package/lib/cjs/contracts/crud/crud-contract.cjs.map +0 -1
- package/lib/cjs/contracts/crud/index.cjs.map +0 -1
- package/lib/cjs/contracts/crud/serialized-crud-contract.cjs.map +0 -1
- package/lib/cjs/contracts/erc20/erc20contract.cjs.map +0 -1
- package/lib/cjs/contracts/erc20/index.cjs.map +0 -1
- package/lib/cjs/contracts/erc20/models.cjs.map +0 -1
- package/lib/cjs/contracts/fabric-overrides.cjs.map +0 -1
- package/lib/cjs/contracts/index.cjs.map +0 -1
- package/lib/cjs/contracts/logging.cjs.map +0 -1
- package/lib/cjs/contracts/overrides.cjs.map +0 -1
- package/lib/cjs/contracts/types.cjs.map +0 -1
- package/lib/cjs/contracts/uuid.cjs.map +0 -1
- package/lib/cjs/index.cjs.map +0 -1
- package/lib/cjs/shared/ClientSerializer.cjs.map +0 -1
- package/lib/cjs/shared/DeterministicSerializer.cjs.map +0 -1
- package/lib/cjs/shared/SimpleDeterministicSerializer.cjs.map +0 -1
- package/lib/cjs/shared/constants.cjs.map +0 -1
- package/lib/cjs/shared/decorators.cjs.map +0 -1
- package/lib/cjs/shared/erc20/erc20-constants.cjs.map +0 -1
- package/lib/cjs/shared/erc20/index.cjs.map +0 -1
- package/lib/cjs/shared/errors.cjs.map +0 -1
- package/lib/cjs/shared/events.cjs.map +0 -1
- package/lib/cjs/shared/fabric-types.cjs.map +0 -1
- package/lib/cjs/shared/index.cjs.map +0 -1
- package/lib/cjs/shared/interfaces/Checkable.cjs.map +0 -1
- package/lib/cjs/shared/interfaces/index.cjs.map +0 -1
- package/lib/cjs/shared/math.cjs.map +0 -1
- package/lib/cjs/shared/model/FabricBaseModel.cjs.map +0 -1
- package/lib/cjs/shared/model/FabricIdentifiedBaseModel.cjs.map +0 -1
- package/lib/cjs/shared/model/Identity.cjs.map +0 -1
- package/lib/cjs/shared/model/IdentityCredentials.cjs.map +0 -1
- package/lib/cjs/shared/model/index.cjs.map +0 -1
- package/lib/cjs/shared/overrides/Model.cjs.map +0 -1
- package/lib/cjs/shared/overrides/index.cjs.map +0 -1
- package/lib/cjs/shared/overrides/overrides.cjs.map +0 -1
- package/lib/cjs/shared/types.cjs.map +0 -1
- package/lib/cjs/version.cjs.map +0 -1
- package/lib/esm/bin/cli.js.map +0 -1
- package/lib/esm/cli-module.js.map +0 -1
- package/lib/esm/cli-utils.js.map +0 -1
- package/lib/esm/client/FabricClientAdapter.js.map +0 -1
- package/lib/esm/client/FabricClientDispatch.js.map +0 -1
- package/lib/esm/client/FabricClientPaginator.js.map +0 -1
- package/lib/esm/client/FabricClientRepository.js.map +0 -1
- package/lib/esm/client/FabricClientStatement.js.map +0 -1
- package/lib/esm/client/collections/generation.js.map +0 -1
- package/lib/esm/client/collections/index.js.map +0 -1
- package/lib/esm/client/constants.js.map +0 -1
- package/lib/esm/client/crypto.js.map +0 -1
- package/lib/esm/client/erc20/FabricERC20ClientRepository.js.map +0 -1
- package/lib/esm/client/erc20/index.js.map +0 -1
- package/lib/esm/client/fabric-fs.js.map +0 -1
- package/lib/esm/client/fabric-hsm.js.map +0 -1
- package/lib/esm/client/ids/id-extraction.js.map +0 -1
- package/lib/esm/client/ids/index.js.map +0 -1
- package/lib/esm/client/index.js.map +0 -1
- package/lib/esm/client/indexes/generation.js.map +0 -1
- package/lib/esm/client/indexes/index.js.map +0 -1
- package/lib/esm/client/logging.js.map +0 -1
- package/lib/esm/client/services/FabricEnrollmentService.js.map +0 -1
- package/lib/esm/client/services/FabricIdentityService.js.map +0 -1
- package/lib/esm/client/services/RegistrationRequestBuilder.js.map +0 -1
- package/lib/esm/client/services/constants.js.map +0 -1
- package/lib/esm/client/services/index.js.map +0 -1
- package/lib/esm/client/types.js.map +0 -1
- package/lib/esm/client/utils.js.map +0 -1
- package/lib/esm/contract/Address.js.map +0 -1
- package/lib/esm/contract/AddressContract.js.map +0 -1
- package/lib/esm/contract/AuditContract.js.map +0 -1
- package/lib/esm/contract/BatchContract.js.map +0 -1
- package/lib/esm/contract/MarketContract.js.map +0 -1
- package/lib/esm/contract/OtherAuditContract.js.map +0 -1
- package/lib/esm/contract/OtherBatchContract.js.map +0 -1
- package/lib/esm/contract/OtherMarketContract.js.map +0 -1
- package/lib/esm/contract/OtherProductContract.js.map +0 -1
- package/lib/esm/contract/OtherProductImageContract.js.map +0 -1
- package/lib/esm/contract/OtherProductSharedContract.js.map +0 -1
- package/lib/esm/contract/OtherProductStrengthContract.js.map +0 -1
- package/lib/esm/contract/Product.js.map +0 -1
- package/lib/esm/contract/ProductContract.js.map +0 -1
- package/lib/esm/contract/ProductStrengthContract.js.map +0 -1
- package/lib/esm/contract/SegregatedPrivateDocumentContract.js.map +0 -1
- package/lib/esm/contract/SegregatedSharedDocumentContract.js.map +0 -1
- package/lib/esm/contract/User.js.map +0 -1
- package/lib/esm/contract/UserContract.js.map +0 -1
- package/lib/esm/contract/index.js.map +0 -1
- package/lib/esm/contract/logging-context.js.map +0 -1
- package/lib/esm/contract/models/Audit.js.map +0 -1
- package/lib/esm/contract/models/BaseIdentifiedModel.js.map +0 -1
- package/lib/esm/contract/models/BaseModel.js.map +0 -1
- package/lib/esm/contract/models/Batch.js.map +0 -1
- package/lib/esm/contract/models/GtinOwner.js.map +0 -1
- package/lib/esm/contract/models/History.js.map +0 -1
- package/lib/esm/contract/models/Leaflet.js.map +0 -1
- package/lib/esm/contract/models/LeafletFile.js.map +0 -1
- package/lib/esm/contract/models/Market.js.map +0 -1
- package/lib/esm/contract/models/OtherAudit.js.map +0 -1
- package/lib/esm/contract/models/OtherBatchShared.js.map +0 -1
- package/lib/esm/contract/models/OtherLeaflet.js.map +0 -1
- package/lib/esm/contract/models/OtherLeafletFile.js.map +0 -1
- package/lib/esm/contract/models/OtherMarket.js.map +0 -1
- package/lib/esm/contract/models/OtherProduct.js.map +0 -1
- package/lib/esm/contract/models/OtherProductImage.js.map +0 -1
- package/lib/esm/contract/models/OtherProductShared.js.map +0 -1
- package/lib/esm/contract/models/OtherProductStrength.js.map +0 -1
- package/lib/esm/contract/models/Product.js.map +0 -1
- package/lib/esm/contract/models/ProductStrength.js.map +0 -1
- package/lib/esm/contract/models/SegregatedDocument.js.map +0 -1
- package/lib/esm/contract/models/constants.js.map +0 -1
- package/lib/esm/contract/models/decorators-private.js.map +0 -1
- package/lib/esm/contract/models/decorators.js.map +0 -1
- package/lib/esm/contract/models/gtin.js.map +0 -1
- package/lib/esm/contract/models/history-dec.js.map +0 -1
- package/lib/esm/contracts/ContractAdapter.js.map +0 -1
- package/lib/esm/contracts/ContractContext.js.map +0 -1
- package/lib/esm/contracts/FabricContractDispatch.js.map +0 -1
- package/lib/esm/contracts/FabricContractPaginator.js.map +0 -1
- package/lib/esm/contracts/FabricContractRepository.js.map +0 -1
- package/lib/esm/contracts/FabricContractRepositoryObservableHandler.js.map +0 -1
- package/lib/esm/contracts/FabricContractSequence.js.map +0 -1
- package/lib/esm/contracts/FabricContractStatement.js.map +0 -1
- package/lib/esm/contracts/MigrationContract.js.map +0 -1
- package/lib/esm/contracts/PrivateSequence.js.map +0 -1
- package/lib/esm/contracts/auth/decorators.js.map +0 -1
- package/lib/esm/contracts/auth/index.js.map +0 -1
- package/lib/esm/contracts/bootstrap.js.map +0 -1
- package/lib/esm/contracts/crud/crud-contract.js.map +0 -1
- package/lib/esm/contracts/crud/index.js.map +0 -1
- package/lib/esm/contracts/crud/serialized-crud-contract.js.map +0 -1
- package/lib/esm/contracts/erc20/erc20contract.js.map +0 -1
- package/lib/esm/contracts/erc20/index.js.map +0 -1
- package/lib/esm/contracts/erc20/models.js.map +0 -1
- package/lib/esm/contracts/fabric-overrides.js.map +0 -1
- package/lib/esm/contracts/index.js.map +0 -1
- package/lib/esm/contracts/logging.js.map +0 -1
- package/lib/esm/contracts/overrides.js.map +0 -1
- package/lib/esm/contracts/types.js.map +0 -1
- package/lib/esm/contracts/uuid.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/shared/ClientSerializer.js.map +0 -1
- package/lib/esm/shared/DeterministicSerializer.js.map +0 -1
- package/lib/esm/shared/SimpleDeterministicSerializer.js.map +0 -1
- package/lib/esm/shared/constants.js.map +0 -1
- package/lib/esm/shared/decorators.js.map +0 -1
- package/lib/esm/shared/erc20/erc20-constants.js.map +0 -1
- package/lib/esm/shared/erc20/index.js.map +0 -1
- package/lib/esm/shared/errors.js.map +0 -1
- package/lib/esm/shared/events.js.map +0 -1
- package/lib/esm/shared/fabric-types.js.map +0 -1
- package/lib/esm/shared/index.js.map +0 -1
- package/lib/esm/shared/interfaces/Checkable.js.map +0 -1
- package/lib/esm/shared/interfaces/index.js.map +0 -1
- package/lib/esm/shared/math.js.map +0 -1
- package/lib/esm/shared/model/FabricBaseModel.js.map +0 -1
- package/lib/esm/shared/model/FabricIdentifiedBaseModel.js.map +0 -1
- package/lib/esm/shared/model/Identity.js.map +0 -1
- package/lib/esm/shared/model/IdentityCredentials.js.map +0 -1
- package/lib/esm/shared/model/index.js.map +0 -1
- package/lib/esm/shared/overrides/Model.js.map +0 -1
- package/lib/esm/shared/overrides/index.js.map +0 -1
- package/lib/esm/shared/overrides/overrides.js.map +0 -1
- package/lib/esm/shared/types.js.map +0 -1
- package/lib/esm/version.js.map +0 -1
package/lib/cjs/version.cjs
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PACKAGE_NAME = exports.VERSION = void 0;
|
|
3
|
+
exports.PACKAGE_NAME = exports.FULL_VERSION = exports.COMMIT = exports.VERSION = void 0;
|
|
4
4
|
const decoration_1 = require("@decaf-ts/decoration");
|
|
5
|
-
exports.VERSION = "0.12.
|
|
5
|
+
exports.VERSION = "0.12.10";
|
|
6
|
+
/**
|
|
7
|
+
* @description Represents the current commit hash of the module build.
|
|
8
|
+
* @summary Stores the current git commit hash for the package. The build replaces
|
|
9
|
+
* the placeholder with the actual commit hash at publish time.
|
|
10
|
+
* @const COMMIT
|
|
11
|
+
*/
|
|
12
|
+
exports.COMMIT = "f2d8170";
|
|
13
|
+
/**
|
|
14
|
+
* @description Represents the full version string of the module.
|
|
15
|
+
* @summary Stores the semver version and commit hash for the package.
|
|
16
|
+
* The build replaces the placeholder with the actual `<version>-<commit>` value at publish time.
|
|
17
|
+
* @const FULL_VERSION
|
|
18
|
+
*/
|
|
19
|
+
exports.FULL_VERSION = "0.12.10-f2d8170";
|
|
6
20
|
exports.PACKAGE_NAME = "@decaf-ts/for-fabric";
|
|
7
21
|
decoration_1.Metadata.registerLibrary(exports.PACKAGE_NAME, exports.VERSION);
|
|
8
|
-
//# sourceMappingURL=
|
|
9
|
-
//# sourceMappingURL=
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDO0FBRXJDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQztBQUVuQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBRTFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdfQ==
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZlcnNpb24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWdEO0FBQ25DLFFBQUEsT0FBTyxHQUFHLGFBQWEsQ0FBQztBQUNyQzs7Ozs7R0FLRztBQUNVLFFBQUEsTUFBTSxHQUFHLFlBQVksQ0FBQztBQUNuQzs7Ozs7R0FLRztBQUNVLFFBQUEsWUFBWSxHQUFHLGtCQUFrQixDQUFDO0FBQ2xDLFFBQUEsWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUMxQyxxQkFBUSxDQUFDLGVBQWUsQ0FBQyxvQkFBWSxFQUFFLGVBQU8sQ0FBQyxDQUFDO0FBQ2hELDBwREFBMHBEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCBjb21taXQgaGFzaCBvZiB0aGUgbW9kdWxlIGJ1aWxkLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IGdpdCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuIFRoZSBidWlsZCByZXBsYWNlc1xuICogdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb21taXQgaGFzaCBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgQ09NTUlUXG4gKi9cbmV4cG9ydCBjb25zdCBDT01NSVQgPSBcIiMjQ09NTUlUIyNcIjtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZG1WeWMybHZiaTVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OTJaWEp6YVc5dUxuUnpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEU5QlFVOHNSVUZCUlN4UlFVRlJMRVZCUVVVc1RVRkJUU3h6UWtGQmMwSXNRMEZCUXp0QlFVVm9SQ3hOUVVGTkxFTkJRVU1zVFVGQlRTeFBRVUZQTEVkQlFVY3NZVUZCWVN4RFFVRkRPMEZCUlhKRE96czdPenRIUVV0SE8wRkJRMGdzVFVGQlRTeERRVUZETEUxQlFVMHNUVUZCVFN4SFFVRkhMRmxCUVZrc1EwRkJRenRCUVVWdVF6czdPenM3UjBGTFJ6dEJRVU5JTEUxQlFVMHNRMEZCUXl4TlFVRk5MRmxCUVZrc1IwRkJSeXhyUWtGQmEwSXNRMEZCUXp0QlFVVXZReXhOUVVGTkxFTkJRVU1zVFVGQlRTeFpRVUZaTEVkQlFVY3NZVUZCWVN4RFFVRkRPMEZCUlRGRExGRkJRVkVzUTBGQlF5eGxRVUZsTEVOQlFVTXNXVUZCV1N4RlFVRkZMRTlCUVU4c1EwRkJReXhEUVVGRElpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIc2dUV1YwWVdSaGRHRWdmU0JtY205dElGd2lRR1JsWTJGbUxYUnpMMlJsWTI5eVlYUnBiMjVjSWp0Y2JseHVaWGh3YjNKMElHTnZibk4wSUZaRlVsTkpUMDRnUFNCY0lpTWpWa1ZTVTBsUFRpTWpYQ0k3WEc1Y2JpOHFLbHh1SUNvZ1FHUmxjMk55YVhCMGFXOXVJRkpsY0hKbGMyVnVkSE1nZEdobElHTjFjbkpsYm5RZ1kyOXRiV2wwSUdoaGMyZ2diMllnZEdobElHMXZaSFZzWlNCaWRXbHNaQzVjYmlBcUlFQnpkVzF0WVhKNUlGTjBiM0psY3lCMGFHVWdZM1Z5Y21WdWRDQm5hWFFnWTI5dGJXbDBJR2hoYzJnZ1ptOXlJSFJvWlNCd1lXTnJZV2RsTGlCVWFHVWdZblZwYkdRZ2NtVndiR0ZqWlhOY2JpQXFJSFJvWlNCd2JHRmpaV2h2YkdSbGNpQjNhWFJvSUhSb1pTQmhZM1IxWVd3Z1kyOXRiV2wwSUdoaGMyZ2dZWFFnY0hWaWJHbHphQ0IwYVcxbExseHVJQ29nUUdOdmJuTjBJRU5QVFUxSlZGeHVJQ292WEc1bGVIQnZjblFnWTI5dWMzUWdRMDlOVFVsVUlEMGdYQ0lqSTBOUFRVMUpWQ01qWENJN1hHNWNiaThxS2x4dUlDb2dRR1JsYzJOeWFYQjBhVzl1SUZKbGNISmxjMlZ1ZEhNZ2RHaGxJR1oxYkd3Z2RtVnljMmx2YmlCemRISnBibWNnYjJZZ2RHaGxJRzF2WkhWc1pTNWNiaUFxSUVCemRXMXRZWEo1SUZOMGIzSmxjeUIwYUdVZ2MyVnRkbVZ5SUhabGNuTnBiMjRnWVc1a0lHTnZiVzFwZENCb1lYTm9JR1p2Y2lCMGFHVWdjR0ZqYTJGblpTNWNiaUFxSUZSb1pTQmlkV2xzWkNCeVpYQnNZV05sY3lCMGFHVWdjR3hoWTJWb2IyeGtaWElnZDJsMGFDQjBhR1VnWVdOMGRXRnNJR0E4ZG1WeWMybHZiajR0UEdOdmJXMXBkRDVnSUhaaGJIVmxJR0YwSUhCMVlteHBjMmdnZEdsdFpTNWNiaUFxSUVCamIyNXpkQ0JHVlV4TVgxWkZVbE5KVDA1Y2JpQXFMMXh1Wlhod2IzSjBJR052Ym5OMElFWlZURXhmVmtWU1UwbFBUaUE5SUZ3aUl5TkdWVXhNWDFaRlVsTkpUMDRqSTF3aU8xeHVYRzVsZUhCdmNuUWdZMjl1YzNRZ1VFRkRTMEZIUlY5T1FVMUZJRDBnWENJakkxQkJRMHRCUjBVakkxd2lPMXh1WEc1TlpYUmhaR0YwWVM1eVpXZHBjM1JsY2t4cFluSmhjbmtvVUVGRFMwRkhSVjlPUVUxRkxDQldSVkpUU1U5T0tUdGNiaUpkZlE9PSJdfQ==
|
package/lib/esm/bin/cli.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import fabric from "./../cli-module.js";
|
|
2
2
|
fabric().parse(process.argv);
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Jpbi9jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLDJCQUFzQjtBQUVuQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZhYnJpYyBmcm9tIFwiLi4vY2xpLW1vZHVsZVwiO1xuXG5mYWJyaWMoKS5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuIl19
|
package/lib/esm/cli-module.js
CHANGED
|
@@ -3,7 +3,10 @@ import { Logging, toPascalCase } from "@decaf-ts/logging";
|
|
|
3
3
|
import { execSync } from "child_process";
|
|
4
4
|
import fs from "fs";
|
|
5
5
|
import path from "path";
|
|
6
|
+
import { builtinModules, createRequire } from "node:module";
|
|
6
7
|
import { rollup } from "rollup";
|
|
8
|
+
import commonjs from "@rollup/plugin-commonjs";
|
|
9
|
+
import { nodeResolve } from "@rollup/plugin-node-resolve";
|
|
7
10
|
import replace from "@rollup/plugin-replace";
|
|
8
11
|
import { InternalError, SerializationError } from "@decaf-ts/db-decorators";
|
|
9
12
|
import { generateModelDesignDocs, generateModelIndexes, readModelFile, readModelFolders, writeDesignDocs, writeIndexes, } from "./client/indexes/index.js";
|
|
@@ -35,6 +38,108 @@ function resolveBundledJsImports() {
|
|
|
35
38
|
},
|
|
36
39
|
};
|
|
37
40
|
}
|
|
41
|
+
function resolveDecafPackageImports() {
|
|
42
|
+
const contractRequire = createRequire(path.join(process.cwd(), "package.json"));
|
|
43
|
+
return {
|
|
44
|
+
name: "resolve-decaf-package-imports",
|
|
45
|
+
resolveId(source) {
|
|
46
|
+
if (!source.startsWith("@decaf-ts/")) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
return contractRequire.resolve(source);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const fabricPeerDependencies = new Set([
|
|
59
|
+
"@grpc/grpc-js",
|
|
60
|
+
"@hyperledger/fabric-gateway",
|
|
61
|
+
"@peculiar/webcrypto",
|
|
62
|
+
"fabric-ca-client",
|
|
63
|
+
"fabric-common",
|
|
64
|
+
"fabric-contract-api",
|
|
65
|
+
"fabric-network",
|
|
66
|
+
"fabric-shim",
|
|
67
|
+
"fabric-shim-api",
|
|
68
|
+
]);
|
|
69
|
+
function isNodeBuiltin(id) {
|
|
70
|
+
const normalized = id.startsWith("node:") ? id.slice(5) : id;
|
|
71
|
+
return builtinModules.includes(normalized);
|
|
72
|
+
}
|
|
73
|
+
function shouldBundleContractModule(id) {
|
|
74
|
+
if (id.startsWith(".") || path.isAbsolute(id))
|
|
75
|
+
return true;
|
|
76
|
+
if (id.startsWith("@decaf-ts/"))
|
|
77
|
+
return true;
|
|
78
|
+
if (fabricPeerDependencies.has(id))
|
|
79
|
+
return false;
|
|
80
|
+
if (isNodeBuiltin(id))
|
|
81
|
+
return false;
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
function normalizeSideEffectPath(input) {
|
|
85
|
+
return input.split(path.sep).join("/");
|
|
86
|
+
}
|
|
87
|
+
function buildSideEffectMatcher(extraPaths) {
|
|
88
|
+
const normalizedExtras = extraPaths.map((extraPath) => {
|
|
89
|
+
const normalized = normalizeSideEffectPath(extraPath.trim());
|
|
90
|
+
return {
|
|
91
|
+
raw: normalized,
|
|
92
|
+
resolved: path.isAbsolute(extraPath)
|
|
93
|
+
? normalizeSideEffectPath(path.resolve(extraPath))
|
|
94
|
+
: normalizeSideEffectPath(path.resolve(process.cwd(), extraPath)),
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
return (id) => {
|
|
98
|
+
const normalized = normalizeSideEffectPath(id);
|
|
99
|
+
const builtIns = [
|
|
100
|
+
"/src/contracts/bootstrap",
|
|
101
|
+
"/src/contracts/overrides",
|
|
102
|
+
"/src/contracts/fabric-overrides",
|
|
103
|
+
"/src/shared/overrides",
|
|
104
|
+
"/node_modules/@decaf-ts/",
|
|
105
|
+
];
|
|
106
|
+
if (builtIns.some((needle) => normalized.includes(needle))) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
return normalizedExtras.some(({ raw, resolved }) => {
|
|
110
|
+
return (normalized.includes(raw) ||
|
|
111
|
+
normalized.includes(resolved) ||
|
|
112
|
+
normalized.endsWith(`${raw}.js`) ||
|
|
113
|
+
normalized.endsWith(`${raw}.cjs`) ||
|
|
114
|
+
normalized.endsWith(`${raw}/index.js`) ||
|
|
115
|
+
normalized.endsWith(`${raw}/index.cjs`) ||
|
|
116
|
+
normalized.endsWith(`${resolved}.js`) ||
|
|
117
|
+
normalized.endsWith(`${resolved}.cjs`) ||
|
|
118
|
+
normalized.endsWith(`${resolved}/index.js`) ||
|
|
119
|
+
normalized.endsWith(`${resolved}/index.cjs`));
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function removeSrcFromPath(path) {
|
|
124
|
+
return path.replace(/^\.\/src\//, "./");
|
|
125
|
+
}
|
|
126
|
+
function copyFolderContents(sourceDir, targetDir) {
|
|
127
|
+
if (!fs.existsSync(sourceDir)) {
|
|
128
|
+
throw new Error(`Source directory does not exist: ${sourceDir}`);
|
|
129
|
+
}
|
|
130
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
131
|
+
for (const item of fs.readdirSync(sourceDir)) {
|
|
132
|
+
const sourcePath = path.join(sourceDir, item);
|
|
133
|
+
const targetPath = path.join(targetDir, item);
|
|
134
|
+
const stat = fs.statSync(sourcePath);
|
|
135
|
+
if (stat.isDirectory()) {
|
|
136
|
+
copyFolderContents(sourcePath, targetPath);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
38
143
|
const compileCommand = new Command()
|
|
39
144
|
.name("compile-contract")
|
|
40
145
|
.description("Creates a global contract")
|
|
@@ -50,6 +155,8 @@ const compileCommand = new Command()
|
|
|
50
155
|
.option("--output <String>", "output folder for contracts", "./contracts")
|
|
51
156
|
.option("--sourcemaps", "includes sourcemaps in the compiled output", false)
|
|
52
157
|
.option("--npmrc", "includes .npmrc in the compiled output", false)
|
|
158
|
+
.option("--from-lib", "indicates that the contract to deploy is located in the lib folder and not pre-compiled in the contracts folder", false)
|
|
159
|
+
.option("--side-effect-paths <paths...>", "additional paths or package roots that must be preserved as side-effectful during contract bundling")
|
|
53
160
|
.action(async (options) => {
|
|
54
161
|
const pkg = JSON.parse(fs.readFileSync(path.join(process.cwd(), "package.json"), "utf-8"));
|
|
55
162
|
const pkgLock = JSON.parse(fs.readFileSync(path.join(process.cwd(), "package-lock.json"), "utf-8"));
|
|
@@ -75,7 +182,11 @@ const compileCommand = new Command()
|
|
|
75
182
|
// eslint-disable-next-line prefer-const
|
|
76
183
|
sourcemaps,
|
|
77
184
|
// eslint-disable-next-line prefer-const
|
|
78
|
-
npmrc,
|
|
185
|
+
npmrc,
|
|
186
|
+
// eslint-disable-next-line prefer-const
|
|
187
|
+
sideEffectPaths,
|
|
188
|
+
// eslint-disable-next-line prefer-const
|
|
189
|
+
fromLib, } = options;
|
|
79
190
|
const log = logger.for("compile-contract");
|
|
80
191
|
try {
|
|
81
192
|
if (npmrc) {
|
|
@@ -103,7 +214,8 @@ const compileCommand = new Command()
|
|
|
103
214
|
output = stripContractName ? output : path.join(output, name);
|
|
104
215
|
log.info(`Deleting existing output folder (if exists) under ${output}`);
|
|
105
216
|
execSync(`rm -rf ${output}`);
|
|
106
|
-
if (bundle) {
|
|
217
|
+
if (bundle && !fromLib) {
|
|
218
|
+
const sideEffectMatcher = buildSideEffectMatcher(Array.isArray(sideEffectPaths) ? sideEffectPaths : []);
|
|
107
219
|
log.info(`bundling contract from ${input}`);
|
|
108
220
|
const tempBundleDir = fs.mkdtempSync(path.join(process.cwd(), ".contract-bundle-"));
|
|
109
221
|
try {
|
|
@@ -138,8 +250,23 @@ const compileCommand = new Command()
|
|
|
138
250
|
compileWithTsconfigOverrides(tsConfigFile, tempCompilerOptions);
|
|
139
251
|
const bundledContract = await rollup({
|
|
140
252
|
input: bundledEntryPoint,
|
|
253
|
+
external: (id) => !shouldBundleContractModule(id),
|
|
254
|
+
treeshake: {
|
|
255
|
+
moduleSideEffects: (id) => sideEffectMatcher(id),
|
|
256
|
+
},
|
|
141
257
|
plugins: [
|
|
258
|
+
resolveDecafPackageImports(),
|
|
142
259
|
resolveBundledJsImports(),
|
|
260
|
+
nodeResolve({
|
|
261
|
+
extensions: [".mjs", ".js", ".json", ".cjs", ".ts"],
|
|
262
|
+
moduleDirectories: ["node_modules"],
|
|
263
|
+
modulePaths: [path.join(process.cwd(), "node_modules")],
|
|
264
|
+
exportConditions: ["node", "default", "require", "import"],
|
|
265
|
+
preferBuiltins: true,
|
|
266
|
+
}),
|
|
267
|
+
commonjs({
|
|
268
|
+
include: /node_modules/,
|
|
269
|
+
}),
|
|
143
270
|
replace({
|
|
144
271
|
preventAssignment: true,
|
|
145
272
|
delimiters: ["", ""],
|
|
@@ -170,7 +297,7 @@ const compileCommand = new Command()
|
|
|
170
297
|
fs.rmSync(tempBundleDir, { recursive: true, force: true });
|
|
171
298
|
}
|
|
172
299
|
}
|
|
173
|
-
else {
|
|
300
|
+
else if (!fromLib) {
|
|
174
301
|
compileWithTsconfigOverrides(tsConfigFile, {
|
|
175
302
|
outDir: output,
|
|
176
303
|
module: ts.ModuleKind.ESNext,
|
|
@@ -179,6 +306,9 @@ const compileCommand = new Command()
|
|
|
179
306
|
inlineSources: sourcemaps,
|
|
180
307
|
});
|
|
181
308
|
}
|
|
309
|
+
else {
|
|
310
|
+
copyFolderContents(path.join(process.cwd(), "./lib/cjs"), path.join(process.cwd(), output));
|
|
311
|
+
}
|
|
182
312
|
const scripts = {
|
|
183
313
|
start: getContractStartCommand(debug, ccaas),
|
|
184
314
|
"start:dev": "fabric-chaincode-node start --tls.enabled false",
|
|
@@ -196,7 +326,7 @@ const compileCommand = new Command()
|
|
|
196
326
|
delete contractPackage.exports;
|
|
197
327
|
contractPackage.main = bundle
|
|
198
328
|
? `${toPascalCase(name)}.js`
|
|
199
|
-
: `${input}
|
|
329
|
+
: `${removeSrcFromPath(input)}/${fromLib ? "index.cjs" : "index.js"}`;
|
|
200
330
|
fs.writeFileSync(path.join(output, "package.json"), JSON.stringify(contractPackage));
|
|
201
331
|
fs.writeFileSync(path.join(output, "package-lock.json"), JSON.stringify(contractPackageLock));
|
|
202
332
|
if (npmrc && npmrcContent)
|
|
@@ -487,6 +617,84 @@ const getCryptoMaterial = new Command()
|
|
|
487
617
|
cwd: process.cwd(),
|
|
488
618
|
});
|
|
489
619
|
});
|
|
620
|
+
const getCopyToPTP = new Command()
|
|
621
|
+
.name("prepare-ptp")
|
|
622
|
+
.description("copies contract to the ptp folder")
|
|
623
|
+
.option("--origin-folder <String>", "origin workspace folder", undefined)
|
|
624
|
+
.option("--dest-folder <String>", "folder to the destination workspace", undefined)
|
|
625
|
+
.action(async (options) => {
|
|
626
|
+
if (!(options.originFolder && options.destFolder)) {
|
|
627
|
+
logger
|
|
628
|
+
.for("prepare-ptp")
|
|
629
|
+
.error("Both --origin-folder and --dest-folder options are required to prepare-ptp");
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
function copyFolder(source, target) {
|
|
633
|
+
// Remove existing target folder
|
|
634
|
+
if (fs.existsSync(target)) {
|
|
635
|
+
fs.rmSync(target, {
|
|
636
|
+
recursive: true,
|
|
637
|
+
force: true,
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
// Ensure parent exists
|
|
641
|
+
fs.mkdirSync(path.dirname(target), {
|
|
642
|
+
recursive: true,
|
|
643
|
+
});
|
|
644
|
+
// Copy folder
|
|
645
|
+
fs.cpSync(source, target, {
|
|
646
|
+
recursive: true,
|
|
647
|
+
force: true,
|
|
648
|
+
});
|
|
649
|
+
console.log(`Copied: ${source}
|
|
650
|
+
-> ${target}`);
|
|
651
|
+
}
|
|
652
|
+
const origin = path.resolve(options.originFolder);
|
|
653
|
+
const dest = path.resolve(options.destFolder);
|
|
654
|
+
execSync(`cd for-fabric && npm run build`, {
|
|
655
|
+
cwd: origin,
|
|
656
|
+
stdio: "inherit",
|
|
657
|
+
});
|
|
658
|
+
execSync(`cd for-fabric && npm run build:contract:shared`, {
|
|
659
|
+
cwd: origin,
|
|
660
|
+
stdio: "inherit",
|
|
661
|
+
});
|
|
662
|
+
const sourceLib = path.join(origin, "for-fabric", "lib");
|
|
663
|
+
const targetLib = path.join(dest, "infra", "for-fabric", "lib");
|
|
664
|
+
copyFolder(sourceLib, targetLib);
|
|
665
|
+
const sourceGlobal = path.join(origin, "for-fabric", "docker", "infrastructure", "chaincode", "Global");
|
|
666
|
+
const targetContracts = path.join(dest, "toolkit", "contracts");
|
|
667
|
+
fs.mkdirSync(targetContracts, {
|
|
668
|
+
recursive: true,
|
|
669
|
+
});
|
|
670
|
+
for (const item of fs.readdirSync(sourceGlobal)) {
|
|
671
|
+
const sourceItem = path.join(sourceGlobal, item);
|
|
672
|
+
const targetItem = path.join(targetContracts, item);
|
|
673
|
+
// Remove existing target item if needed
|
|
674
|
+
if (fs.existsSync(targetItem)) {
|
|
675
|
+
fs.rmSync(targetItem, {
|
|
676
|
+
recursive: true,
|
|
677
|
+
force: true,
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
fs.cpSync(sourceItem, targetItem, {
|
|
681
|
+
recursive: true,
|
|
682
|
+
force: true,
|
|
683
|
+
});
|
|
684
|
+
console.log(`Copied: ${sourceItem}
|
|
685
|
+
-> ${targetItem}`);
|
|
686
|
+
}
|
|
687
|
+
execSync(`cd toolkit && npm run build`, { cwd: dest, stdio: "inherit" });
|
|
688
|
+
execSync(`cd toolkit && npm run docker:build-contracts`, {
|
|
689
|
+
cwd: dest,
|
|
690
|
+
stdio: "inherit",
|
|
691
|
+
});
|
|
692
|
+
execSync(`cd infra && npm run build`, { cwd: dest, stdio: "inherit" });
|
|
693
|
+
execSync(`cd infra && npm run build:jest:image`, {
|
|
694
|
+
cwd: dest,
|
|
695
|
+
stdio: "inherit",
|
|
696
|
+
});
|
|
697
|
+
});
|
|
490
698
|
const fabricCmd = new Command()
|
|
491
699
|
.name("for-fabric")
|
|
492
700
|
.command("fabric")
|
|
@@ -497,7 +705,8 @@ fabricCmd.addCommand(ensureInfra);
|
|
|
497
705
|
fabricCmd.addCommand(deployContract);
|
|
498
706
|
fabricCmd.addCommand(getCryptoMaterial);
|
|
499
707
|
fabricCmd.addCommand(extractCollections);
|
|
708
|
+
fabricCmd.addCommand(getCopyToPTP);
|
|
500
709
|
export default function fabric() {
|
|
501
710
|
return fabricCmd;
|
|
502
711
|
}
|
|
503
|
-
//# sourceMappingURL=cli-module.js.map
|
|
712
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGktbW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUQsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN4QyxPQUFPLFFBQVEsTUFBTSx5QkFBeUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLFlBQVksR0FDYixrQ0FBeUI7QUFDMUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFDTCxlQUFlLEVBQ2YsMEJBQTBCLEVBQzFCLGVBQWUsRUFDZixlQUFlLEVBQ2YsZUFBZSxFQUNmLHVCQUF1QixFQUN2Qiw0QkFBNEIsR0FDN0IsdUJBQW9CO0FBQ3JCLHFDQUE0QjtBQUM1QixPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUIsT0FBTyxFQUNMLGtCQUFrQixJQUFJLGFBQWEsRUFFbkMsZ0JBQWdCLEVBQ2hCLHlC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TUFBTSxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQUU7S0FDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQztLQUNsQixPQUFPLENBQUMsUUFBUSxDQUFDO0tBQ2pCLFdBQVcsQ0FDVixtRUFBbUUsQ0FDcEUsQ0FBQztBQUVKLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDckMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNyQyxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2xDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDckMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3hDLFNBQVMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN6QyxTQUFTLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxPQUFPLFVBQVUsTUFBTTtJQUM1QixPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IExvZ2dpbmcsIHRvUGFzY2FsQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGJ1aWx0aW5Nb2R1bGVzLCBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBQbHVnaW4sIHJvbGx1cCB9IGZyb20gXCJyb2xsdXBcIjtcbmltcG9ydCBjb21tb25qcyBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tY29tbW9uanNcIjtcbmltcG9ydCB7IG5vZGVSZXNvbHZlIH0gZnJvbSBcIkByb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZVwiO1xuaW1wb3J0IHJlcGxhY2UgZnJvbSBcIkByb2xsdXAvcGx1Z2luLXJlcGxhY2VcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3MsXG4gIGdlbmVyYXRlTW9kZWxJbmRleGVzLFxuICByZWFkTW9kZWxGaWxlLFxuICByZWFkTW9kZWxGb2xkZXJzLFxuICB3cml0ZURlc2lnbkRvY3MsXG4gIHdyaXRlSW5kZXhlcyxcbn0gZnJvbSBcIi4vY2xpZW50L2luZGV4ZXNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgYXBwcm92ZUNvbnRyYWN0LFxuICBlbnN1cmVJbmZyYXN0cnVjdHVyZUJvb3RlZCxcbiAgaW5zdGFsbENvbnRyYWN0LFxuICBwYWNrYWdlQ29udHJhY3QsXG4gIGNvbW1pdENoYWluY29kZSxcbiAgZ2V0Q29udHJhY3RTdGFydENvbW1hbmQsXG4gIGNvbXBpbGVXaXRoVHNjb25maWdPdmVycmlkZXMsXG59IGZyb20gXCIuL2NsaS11dGlsc1wiO1xuaW1wb3J0IFwiLi9zaGFyZWQvb3ZlcnJpZGVzXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCB7XG4gIGV4dHJhY3RDb2xsZWN0aW9ucyBhcyBleENvbGxlY3Rpb25zLFxuICBQcml2YXRlQ29sbGVjdGlvbixcbiAgd3JpdGVDb2xsZWN0aW9ucyxcbiAgd3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyxcbn0gZnJvbSBcIi4vY2xpZW50L2NvbGxlY3Rpb25zL2luZGV4XCI7XG5pbXBvcnQgeyBDb3VjaERCRGVzaWduRG9jLCBDcmVhdGVJbmRleFJlcXVlc3QgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5cbmNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKFwiZmFicmljXCIpO1xuXG5mdW5jdGlvbiByZXNvbHZlQnVuZGxlZEpzSW1wb3J0cygpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwicmVzb2x2ZS1idW5kbGVkLWpzLWltcG9ydHNcIixcbiAgICByZXNvbHZlSWQoc291cmNlLCBpbXBvcnRlcikge1xuICAgICAgaWYgKCFpbXBvcnRlciB8fCAhc291cmNlLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGltcG9ydGVyKSwgc291cmNlKTtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXG4gICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICAgYCR7cmVzb2x2ZWRQYXRofS5qc2AsXG4gICAgICAgIHBhdGguam9pbihyZXNvbHZlZFBhdGgsIFwiaW5kZXguanNcIiksXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkgJiYgZnMuc3RhdFN5bmMoY2FuZGlkYXRlKS5pc0ZpbGUoKSkge1xuICAgICAgICAgIHJldHVybiBjYW5kaWRhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlY2FmUGFja2FnZUltcG9ydHMoKTogUGx1Z2luIHtcbiAgY29uc3QgY29udHJhY3RSZXF1aXJlID0gY3JlYXRlUmVxdWlyZShcbiAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJwYWNrYWdlLmpzb25cIilcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwicmVzb2x2ZS1kZWNhZi1wYWNrYWdlLWltcG9ydHNcIixcbiAgICByZXNvbHZlSWQoc291cmNlKSB7XG4gICAgICBpZiAoIXNvdXJjZS5zdGFydHNXaXRoKFwiQGRlY2FmLXRzL1wiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNvbnRyYWN0UmVxdWlyZS5yZXNvbHZlKHNvdXJjZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgZmFicmljUGVlckRlcGVuZGVuY2llcyA9IG5ldyBTZXQoW1xuICBcIkBncnBjL2dycGMtanNcIixcbiAgXCJAaHlwZXJsZWRnZXIvZmFicmljLWdhdGV3YXlcIixcbiAgXCJAcGVjdWxpYXIvd2ViY3J5cHRvXCIsXG4gIFwiZmFicmljLWNhLWNsaWVudFwiLFxuICBcImZhYnJpYy1jb21tb25cIixcbiAgXCJmYWJyaWMtY29udHJhY3QtYXBpXCIsXG4gIFwiZmFicmljLW5ldHdvcmtcIixcbiAgXCJmYWJyaWMtc2hpbVwiLFxuICBcImZhYnJpYy1zaGltLWFwaVwiLFxuXSk7XG5cbmZ1bmN0aW9uIGlzTm9kZUJ1aWx0aW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkID0gaWQuc3RhcnRzV2l0aChcIm5vZGU6XCIpID8gaWQuc2xpY2UoNSkgOiBpZDtcbiAgcmV0dXJuIGJ1aWx0aW5Nb2R1bGVzLmluY2x1ZGVzKG5vcm1hbGl6ZWQpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRCdW5kbGVDb250cmFjdE1vZHVsZShpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpZC5zdGFydHNXaXRoKFwiLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUoaWQpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGlkLnN0YXJ0c1dpdGgoXCJAZGVjYWYtdHMvXCIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGZhYnJpY1BlZXJEZXBlbmRlbmNpZXMuaGFzKGlkKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaXNOb2RlQnVpbHRpbihpZCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNpZGVFZmZlY3RQYXRoKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQuc3BsaXQocGF0aC5zZXApLmpvaW4oXCIvXCIpO1xufVxuXG5mdW5jdGlvbiBidWlsZFNpZGVFZmZlY3RNYXRjaGVyKGV4dHJhUGF0aHM6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYXMgPSBleHRyYVBhdGhzLm1hcCgoZXh0cmFQYXRoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNpZGVFZmZlY3RQYXRoKGV4dHJhUGF0aC50cmltKCkpO1xuICAgIHJldHVybiB7XG4gICAgICByYXc6IG5vcm1hbGl6ZWQsXG4gICAgICByZXNvbHZlZDogcGF0aC5pc0Fic29sdXRlKGV4dHJhUGF0aClcbiAgICAgICAgPyBub3JtYWxpemVTaWRlRWZmZWN0UGF0aChwYXRoLnJlc29sdmUoZXh0cmFQYXRoKSlcbiAgICAgICAgOiBub3JtYWxpemVTaWRlRWZmZWN0UGF0aChwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZXh0cmFQYXRoKSksXG4gICAgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIChpZDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNpZGVFZmZlY3RQYXRoKGlkKTtcbiAgICBjb25zdCBidWlsdElucyA9IFtcbiAgICAgIFwiL3NyYy9jb250cmFjdHMvYm9vdHN0cmFwXCIsXG4gICAgICBcIi9zcmMvY29udHJhY3RzL292ZXJyaWRlc1wiLFxuICAgICAgXCIvc3JjL2NvbnRyYWN0cy9mYWJyaWMtb3ZlcnJpZGVzXCIsXG4gICAgICBcIi9zcmMvc2hhcmVkL292ZXJyaWRlc1wiLFxuICAgICAgXCIvbm9kZV9tb2R1bGVzL0BkZWNhZi10cy9cIixcbiAgICBdO1xuXG4gICAgaWYgKGJ1aWx0SW5zLnNvbWUoKG5lZWRsZSkgPT4gbm9ybWFsaXplZC5pbmNsdWRlcyhuZWVkbGUpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRFeHRyYXMuc29tZSgoeyByYXcsIHJlc29sdmVkIH0pID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMocmF3KSB8fFxuICAgICAgICBub3JtYWxpemVkLmluY2x1ZGVzKHJlc29sdmVkKSB8fFxuICAgICAgICBub3JtYWxpemVkLmVuZHNXaXRoKGAke3Jhd30uanNgKSB8fFxuICAgICAgICBub3JtYWxpemVkLmVuZHNXaXRoKGAke3Jhd30uY2pzYCkgfHxcbiAgICAgICAgbm9ybWFsaXplZC5lbmRzV2l0aChgJHtyYXd9L2luZGV4LmpzYCkgfHxcbiAgICAgICAgbm9ybWFsaXplZC5lbmRzV2l0aChgJHtyYXd9L2luZGV4LmNqc2ApIHx8XG4gICAgICAgIG5vcm1hbGl6ZWQuZW5kc1dpdGgoYCR7cmVzb2x2ZWR9LmpzYCkgfHxcbiAgICAgICAgbm9ybWFsaXplZC5lbmRzV2l0aChgJHtyZXNvbHZlZH0uY2pzYCkgfHxcbiAgICAgICAgbm9ybWFsaXplZC5lbmRzV2l0aChgJHtyZXNvbHZlZH0vaW5kZXguanNgKSB8fFxuICAgICAgICBub3JtYWxpemVkLmVuZHNXaXRoKGAke3Jlc29sdmVkfS9pbmRleC5janNgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3JjRnJvbVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXlxcLlxcL3NyY1xcLy8sIFwiLi9cIik7XG59XG5cbmZ1bmN0aW9uIGNvcHlGb2xkZXJDb250ZW50cyhzb3VyY2VEaXI6IHN0cmluZywgdGFyZ2V0RGlyOiBzdHJpbmcpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNvdXJjZURpcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICR7c291cmNlRGlyfWApO1xuICB9XG5cbiAgZnMubWtkaXJTeW5jKHRhcmdldERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIGZzLnJlYWRkaXJTeW5jKHNvdXJjZURpcikpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gcGF0aC5qb2luKHNvdXJjZURpciwgaXRlbSk7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsIGl0ZW0pO1xuXG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKHNvdXJjZVBhdGgpO1xuXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29weUZvbGRlckNvbnRlbnRzKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy5jb3B5RmlsZVN5bmMoc291cmNlUGF0aCwgdGFyZ2V0UGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGNvbXBpbGVDb21tYW5kID0gbmV3IENvbW1hbmQoKVxuICAubmFtZShcImNvbXBpbGUtY29udHJhY3RcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ3JlYXRlcyBhIGdsb2JhbCBjb250cmFjdFwiKVxuICAub3B0aW9uKFwiLS1kZXZcIiwgXCJjb21waWxlcyBjb250cmFjdHMgd2l0aG91dCBtaW5pZmljYXRpb25cIiwgZmFsc2UpXG4gIC5vcHRpb24oXCItLWRlYnVnXCIsIFwibWFrZXMgYXR0YWNoaW5nIGRlYnVnZ2VyIHBvc3NpYmxlXCIsIGZhbHNlKVxuICAub3B0aW9uKFxuICAgIFwiLS1jY2Fhc1wiLFxuICAgIFwiQWp1c3RzIHRoZSBwYWNrYWdlIGNvbW1hbmRzIHRvIGJlIGRlcGxveWVkIGFzIGNjYWFzXCIsXG4gICAgZmFsc2VcbiAgKVxuICAub3B0aW9uKFwiLS1uYW1lIDxTdHJpbmc+XCIsIFwiY29udHJhY3QgbmFtZVwiLCBcImdsb2JhbC1jb250cmFjdFwiKVxuICAub3B0aW9uKFwiLS1idW5kbGVcIiwgXCJCdW5kbGVzIHdpdGggcm9sbHVwIGluc3RlYWQgb2YgdXNpbmcgdHNjXCIsIGZhbHNlKVxuICAub3B0aW9uKFxuICAgIFwiLS10cy1jb25maWctZmlsZSA8c3RyaW5nPlwiLFxuICAgIFwicmVsYXRpdmUgcGF0aCB0byB0aGUgdHMgY29uZmlnIGZpbGUgYmFzZWQgb24gY3dkIG9yIGFic29sdXRlIHBhdGhcIixcbiAgICBcIi4vdHNjb25maWcuanNvblwiXG4gIClcbiAgLm9wdGlvbihcbiAgICBcIi0tZGVzY3JpcHRpb24gPFN0cmluZz5cIixcbiAgICBcImNvbnRyYWN0IGRlc2NyaXB0aW9uXCIsXG4gICAgXCJHbG9iYWwgY29udHJhY3QgaW1wbGVtZW50YXRpb25cIlxuICApXG4gIC5vcHRpb24oXCItLXN0cmlwLWNvbnRyYWN0LW5hbWVcIiwgXCJzdHJpcCBjb250cmFjdCBuYW1lIGZyb20gb3V0cHV0XCIsIGZhbHNlKVxuICAub3B0aW9uKFwiLS1pbnB1dCA8U3RyaW5nPlwiLCBcImlucHV0IGZvbGRlciBmb3IgY29udHJhY3RzXCIsIFwibGliL2NvbnRyYWN0c1wiKVxuICAub3B0aW9uKFwiLS1vdXRwdXQgPFN0cmluZz5cIiwgXCJvdXRwdXQgZm9sZGVyIGZvciBjb250cmFjdHNcIiwgXCIuL2NvbnRyYWN0c1wiKVxuICAub3B0aW9uKFwiLS1zb3VyY2VtYXBzXCIsIFwiaW5jbHVkZXMgc291cmNlbWFwcyBpbiB0aGUgY29tcGlsZWQgb3V0cHV0XCIsIGZhbHNlKVxuICAub3B0aW9uKFwiLS1ucG1yY1wiLCBcImluY2x1ZGVzIC5ucG1yYyBpbiB0aGUgY29tcGlsZWQgb3V0cHV0XCIsIGZhbHNlKVxuICAub3B0aW9uKFxuICAgIFwiLS1mcm9tLWxpYlwiLFxuICAgIFwiaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyYWN0IHRvIGRlcGxveSBpcyBsb2NhdGVkIGluIHRoZSBsaWIgZm9sZGVyIGFuZCBub3QgcHJlLWNvbXBpbGVkIGluIHRoZSBjb250cmFjdHMgZm9sZGVyXCIsXG4gICAgZmFsc2VcbiAgKVxuICAub3B0aW9uKFxuICAgIFwiLS1zaWRlLWVmZmVjdC1wYXRocyA8cGF0aHMuLi4+XCIsXG4gICAgXCJhZGRpdGlvbmFsIHBhdGhzIG9yIHBhY2thZ2Ugcm9vdHMgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBhcyBzaWRlLWVmZmVjdGZ1bCBkdXJpbmcgY29udHJhY3QgYnVuZGxpbmdcIlxuICApXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IGFueSkgPT4ge1xuICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgKTtcblxuICAgIGNvbnN0IHBrZ0xvY2sgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInBhY2thZ2UtbG9jay5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgKTtcblxuICAgIGxldCBucG1yY0NvbnRlbnQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB2ZXJzaW9uID0gcGtnLnZlcnNpb247XG5cbiAgICBsZXQge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgZGV2LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgZGVidWcsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICBuYW1lLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBvdXRwdXQsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICBpbnB1dCxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIHN0cmlwQ29udHJhY3ROYW1lLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgY2NhYXMsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICBidW5kbGUsXG5cbiAgICAgIHRzQ29uZmlnRmlsZSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIHNvdXJjZW1hcHMsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICBucG1yYyxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIHNpZGVFZmZlY3RQYXRocyxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgIGZyb21MaWIsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihcImNvbXBpbGUtY29udHJhY3RcIik7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChucG1yYykge1xuICAgICAgICBucG1yY0NvbnRlbnQgPSBmc1xuICAgICAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLm5wbXJjXCIpLCBcInV0Zi04XCIpXG4gICAgICAgICAgLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSBucG1yY0NvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAvXFwkXFx7KFtefV0rKVxcfS9nLFxuICAgICAgICAgIChfOiBhbnksIHZhck5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9jZXNzLmVudlt2YXJOYW1lXTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGBXYXJuaW5nOiBFbnZpcm9ubWVudCB2YXJpYWJsZSBcIiR7dmFyTmFtZX1cIiBpcyBub3Qgc2V0YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBucG1yY0NvbnRlbnQgPSByZXBsYWNlZDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvZy5pbmZvKGBObyAubnBtcmMgZmlsZSBmb3VuZCwgc2tpcHBpbmcgY29weWluZyAubnBtcmMgdG8gb3V0cHV0YCk7XG4gICAgfVxuXG4gICAgbG9nLmRlYnVnKFxuICAgICAgYHJ1bm5pbmcgd2l0aCBvcHRpb25zOiAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfSBmb3IgJHtwa2cubmFtZX0gdmVyc2lvbiAke3ZlcnNpb259YFxuICAgICk7XG5cbiAgICB0c0NvbmZpZ0ZpbGUgPSBwYXRoLmlzQWJzb2x1dGUodHNDb25maWdGaWxlKVxuICAgICAgPyB0c0NvbmZpZ0ZpbGVcbiAgICAgIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHRzQ29uZmlnRmlsZSk7XG5cbiAgICBvdXRwdXQgPSBzdHJpcENvbnRyYWN0TmFtZSA/IG91dHB1dCA6IHBhdGguam9pbihvdXRwdXQsIG5hbWUpO1xuICAgIGxvZy5pbmZvKGBEZWxldGluZyBleGlzdGluZyBvdXRwdXQgZm9sZGVyIChpZiBleGlzdHMpIHVuZGVyICR7b3V0cHV0fWApO1xuICAgIGV4ZWNTeW5jKGBybSAtcmYgJHtvdXRwdXR9YCk7XG4gICAgaWYgKGJ1bmRsZSAmJiAhZnJvbUxpYikge1xuICAgICAgY29uc3Qgc2lkZUVmZmVjdE1hdGNoZXIgPSBidWlsZFNpZGVFZmZlY3RNYXRjaGVyKFxuICAgICAgICBBcnJheS5pc0FycmF5KHNpZGVFZmZlY3RQYXRocykgPyBzaWRlRWZmZWN0UGF0aHMgOiBbXVxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKGBidW5kbGluZyBjb250cmFjdCBmcm9tICR7aW5wdXR9YCk7XG4gICAgICBjb25zdCB0ZW1wQnVuZGxlRGlyID0gZnMubWtkdGVtcFN5bmMoXG4gICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi5jb250cmFjdC1idW5kbGUtXCIpXG4gICAgICApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW5wdXRFbnRyeSA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpbnB1dCwgXCJpbmRleC50c1wiKTtcbiAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHRzLnJlYWRDb25maWdGaWxlKHRzQ29uZmlnRmlsZSwgdHMuc3lzLnJlYWRGaWxlKTtcbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIHRzLmZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoY29uZmlnRmlsZS5lcnJvci5tZXNzYWdlVGV4dCwgXCJcXG5cIilcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkQ29uZmlnID0gdHMucGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQoXG4gICAgICAgICAgY29uZmlnRmlsZS5jb25maWcsXG4gICAgICAgICAgdHMuc3lzLFxuICAgICAgICAgIHBhdGguZGlybmFtZSh0c0NvbmZpZ0ZpbGUpLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB0c0NvbmZpZ0ZpbGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBhcnNlZENvbmZpZy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBwYXJzZWRDb25maWcuZXJyb3JzXG4gICAgICAgICAgICAgIC5tYXAoKGVycm9yKSA9PlxuICAgICAgICAgICAgICAgIHRzLmZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZXJyb3IubWVzc2FnZVRleHQsIFwiXFxuXCIpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGVtcENvbXBpbGVyT3B0aW9uczogdHMuQ29tcGlsZXJPcHRpb25zID0ge1xuICAgICAgICAgIC4uLnBhcnNlZENvbmZpZy5vcHRpb25zLFxuICAgICAgICAgIG91dERpcjogdGVtcEJ1bmRsZURpcixcbiAgICAgICAgICBtb2R1bGU6IHRzLk1vZHVsZUtpbmQuRVNOZXh0LFxuICAgICAgICAgIGRlY2xhcmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICBzb3VyY2VNYXA6IGZhbHNlLFxuICAgICAgICAgIGlubGluZVNvdXJjZXM6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBidW5kbGVkRW50cnlQb2ludCA9IHRzXG4gICAgICAgICAgLmdldE91dHB1dEZpbGVOYW1lcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGFyc2VkQ29uZmlnLFxuICAgICAgICAgICAgICBvcHRpb25zOiB0ZW1wQ29tcGlsZXJPcHRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0RW50cnksXG4gICAgICAgICAgICAhdHMuc3lzLnVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXNcbiAgICAgICAgICApXG4gICAgICAgICAgLmZpbmQoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5lbmRzV2l0aChcIi5qc1wiKSk7XG5cbiAgICAgICAgaWYgKCFidW5kbGVkRW50cnlQb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBkZXRlcm1pbmUgdGhlIGVtaXR0ZWQgYnVuZGxlIGVudHJ5IGZvciAke2lucHV0RW50cnl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21waWxlV2l0aFRzY29uZmlnT3ZlcnJpZGVzKHRzQ29uZmlnRmlsZSwgdGVtcENvbXBpbGVyT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGJ1bmRsZWRDb250cmFjdCA9IGF3YWl0IHJvbGx1cCh7XG4gICAgICAgICAgaW5wdXQ6IGJ1bmRsZWRFbnRyeVBvaW50LFxuICAgICAgICAgIGV4dGVybmFsOiAoaWQpID0+ICFzaG91bGRCdW5kbGVDb250cmFjdE1vZHVsZShpZCksXG4gICAgICAgICAgdHJlZXNoYWtlOiB7XG4gICAgICAgICAgICBtb2R1bGVTaWRlRWZmZWN0czogKGlkKSA9PiBzaWRlRWZmZWN0TWF0Y2hlcihpZCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgICByZXNvbHZlRGVjYWZQYWNrYWdlSW1wb3J0cygpLFxuICAgICAgICAgICAgcmVzb2x2ZUJ1bmRsZWRKc0ltcG9ydHMoKSxcbiAgICAgICAgICAgIG5vZGVSZXNvbHZlKHtcbiAgICAgICAgICAgICAgZXh0ZW5zaW9uczogW1wiLm1qc1wiLCBcIi5qc1wiLCBcIi5qc29uXCIsIFwiLmNqc1wiLCBcIi50c1wiXSxcbiAgICAgICAgICAgICAgbW9kdWxlRGlyZWN0b3JpZXM6IFtcIm5vZGVfbW9kdWxlc1wiXSxcbiAgICAgICAgICAgICAgbW9kdWxlUGF0aHM6IFtwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJub2RlX21vZHVsZXNcIildLFxuICAgICAgICAgICAgICBleHBvcnRDb25kaXRpb25zOiBbXCJub2RlXCIsIFwiZGVmYXVsdFwiLCBcInJlcXVpcmVcIiwgXCJpbXBvcnRcIl0sXG4gICAgICAgICAgICAgIHByZWZlckJ1aWx0aW5zOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb21tb25qcyh7XG4gICAgICAgICAgICAgIGluY2x1ZGU6IC9ub2RlX21vZHVsZXMvLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICByZXBsYWNlKHtcbiAgICAgICAgICAgICAgcHJldmVudEFzc2lnbm1lbnQ6IHRydWUsXG4gICAgICAgICAgICAgIGRlbGltaXRlcnM6IFtcIlwiLCBcIlwiXSxcbiAgICAgICAgICAgICAgdmFsdWVzOiB7IFwiIyNWRVJTSU9OIyNcIjogdmVyc2lvbiwgXCIjI1BBQ0tBR0UjI1wiOiBwa2cubmFtZSB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGB3aXRoaW5nIGNvbnRyYWN0IHRvICR7b3V0cHV0fSB3aXRoIG5hbWUgJHt0b1Bhc2NhbENhc2UobmFtZSl9LmpzYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBidW5kbGVkQ29udHJhY3Qud3JpdGUoe1xuICAgICAgICAgIGZpbGU6IGAke291dHB1dH0vJHt0b1Bhc2NhbENhc2UobmFtZSl9LmpzYCxcbiAgICAgICAgICBmb3JtYXQ6IFwidW1kXCIsXG4gICAgICAgICAgbmFtZTogYCR7dG9QYXNjYWxDYXNlKG5hbWUpfS5qc2AsXG4gICAgICAgICAgc291cmNlbWFwOiBzb3VyY2VtYXBzID8gXCJpbmxpbmVcIiA6IGZhbHNlLFxuICAgICAgICAgIHNvdXJjZW1hcFBhdGhUcmFuc2Zvcm06IChyZWxhdGl2ZVNvdXJjZVBhdGgsIHNvdXJjZW1hcFBhdGgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlU291cmNlUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHNvdXJjZW1hcFBhdGgpLFxuICAgICAgICAgICAgICByZWxhdGl2ZVNvdXJjZVBhdGhcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChhYnNvbHV0ZVNvdXJjZVBhdGguc3RhcnRzV2l0aCh0ZW1wQnVuZGxlRGlyKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcGF0aC5wb3NpeC5qb2luKFxuICAgICAgICAgICAgICAgIFwiLmJ1bmRsZVwiLFxuICAgICAgICAgICAgICAgIHBhdGhcbiAgICAgICAgICAgICAgICAgIC5yZWxhdGl2ZSh0ZW1wQnVuZGxlRGlyLCBhYnNvbHV0ZVNvdXJjZVBhdGgpXG4gICAgICAgICAgICAgICAgICAuc3BsaXQocGF0aC5zZXApXG4gICAgICAgICAgICAgICAgICAuam9pbihcIi9cIilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlU291cmNlUGF0aDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgYnVuZGxlZENvbnRyYWN0LmNsb3NlKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmcy5ybVN5bmModGVtcEJ1bmRsZURpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWZyb21MaWIpIHtcbiAgICAgIGNvbXBpbGVXaXRoVHNjb25maWdPdmVycmlkZXModHNDb25maWdGaWxlLCB7XG4gICAgICAgIG91dERpcjogb3V0cHV0LFxuICAgICAgICBtb2R1bGU6IHRzLk1vZHVsZUtpbmQuRVNOZXh0LFxuICAgICAgICBkZWNsYXJhdGlvbjogZmFsc2UsXG4gICAgICAgIHNvdXJjZU1hcDogc291cmNlbWFwcyxcbiAgICAgICAgaW5saW5lU291cmNlczogc291cmNlbWFwcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3B5Rm9sZGVyQ29udGVudHMoXG4gICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4vbGliL2Nqc1wiKSxcbiAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG91dHB1dClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NyaXB0cyA9IHtcbiAgICAgIHN0YXJ0OiBnZXRDb250cmFjdFN0YXJ0Q29tbWFuZChkZWJ1ZywgY2NhYXMpLFxuICAgICAgXCJzdGFydDpkZXZcIjogXCJmYWJyaWMtY2hhaW5jb2RlLW5vZGUgc3RhcnQgLS10bHMuZW5hYmxlZCBmYWxzZVwiLFxuICAgICAgXCJzdGFydDp3YXRjaFwiOiAnbm9kZW1vbiAtLWV4ZWMgXCJucG0gcnVuIHN0YXJ0OmRldlwiJyxcbiAgICAgIGJ1aWxkOiAnZWNobyBcIk5vIG5lZWQgdG8gYnVpbGQgdGhlIGNoYWluY29kZVwiJyxcbiAgICAgIGxpbnQ6IFwiZXNsaW50IC4gLS1maXggLS1leHQgLmpzXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbnRyYWN0UGFja2FnZSA9IHBrZztcbiAgICBjb25zdCBjb250cmFjdFBhY2thZ2VMb2NrID0gcGtnTG9jaztcblxuICAgIGNvbnRyYWN0UGFja2FnZS5uYW1lID0gbmFtZTtcbiAgICBjb250cmFjdFBhY2thZ2UuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBjb250cmFjdFBhY2thZ2Uuc2NyaXB0cyA9IHNjcmlwdHM7XG5cbiAgICBkZWxldGUgY29udHJhY3RQYWNrYWdlLnR5cGU7XG4gICAgZGVsZXRlIGNvbnRyYWN0UGFja2FnZS50eXBlcztcbiAgICBkZWxldGUgY29udHJhY3RQYWNrYWdlLmV4cG9ydHM7XG4gICAgY29udHJhY3RQYWNrYWdlLm1haW4gPSBidW5kbGVcbiAgICAgID8gYCR7dG9QYXNjYWxDYXNlKG5hbWUpfS5qc2BcbiAgICAgIDogYCR7cmVtb3ZlU3JjRnJvbVBhdGgoaW5wdXQpfS8ke2Zyb21MaWIgPyBcImluZGV4LmNqc1wiIDogXCJpbmRleC5qc1wifWA7XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKG91dHB1dCwgXCJwYWNrYWdlLmpzb25cIiksXG4gICAgICBKU09OLnN0cmluZ2lmeShjb250cmFjdFBhY2thZ2UpXG4gICAgKTtcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4ob3V0cHV0LCBcInBhY2thZ2UtbG9jay5qc29uXCIpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoY29udHJhY3RQYWNrYWdlTG9jaylcbiAgICApO1xuXG4gICAgaWYgKG5wbXJjICYmIG5wbXJjQ29udGVudClcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgXCIubnBtcmNcIiksIG5wbXJjQ29udGVudCk7XG5cbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBhbmQgc2hyaW5rd3JhcHBpbmcgZGVwZW5kZW5jaWVzYCk7XG4gICAgZXhlY1N5bmMoYG5wbSBpbnN0YWxsYCwgeyBjd2Q6IG91dHB1dCB9KTtcbiAgICBleGVjU3luYyhgbnBtIHNocmlua3dyYXBgLCB7IGN3ZDogb3V0cHV0IH0pO1xuICAgIGV4ZWNTeW5jKFwicm0gLXJmIG5vZGVfbW9kdWxlc1wiLCB7IGN3ZDogb3V0cHV0IH0pO1xuICAgIGxvZy5pbmZvKGBkZWxldGluZyB0ZW1wIGZvbGRlcnNgKTtcbiAgICBleGVjU3luYyhgcm0gLXJmIC4vbGliICYmIHJtIC1yZiAuL2Rpc3RgLCB7IGN3ZDogb3V0cHV0IH0pO1xuICAgIGxvZy5pbmZvKFxuICAgICAgYENvbnRyYWN0ICR7bmFtZX0gY29tcGlsZWQgc3VjY2Vzc2Z1bGx5ISBpbiAke3BhdGgucmVzb2x2ZShvdXRwdXQpfWBcbiAgICApO1xuICAgIGlmIChkZXYpIHtcbiAgICAgIGxvZy5pbmZvKGBkZXYgbW9kZSBlbmFibGVkLiBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcyBmb3IgZGVidWdnaW5nYCk7XG4gICAgICBleGVjU3luYyhgbnBtIGluc3RhbGxgLCB7XG4gICAgICAgIGN3ZDogb3V0cHV0LFxuICAgICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIE5PREVfRU5WOiBcInByb2R1Y3Rpb25cIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuY29uc3QgZXh0cmFjdEluZGV4ZXMgPSBuZXcgQ29tbWFuZCgpXG4gIC5jb21tYW5kKFwiZXh0cmFjdC1pbmRleGVzXCIpXG4gIC5vcHRpb24oXCItLWZpbGUgW1N0cmluZ11cIiwgXCJ0aGUgbW9kZWwgZmlsZVwiKVxuICAub3B0aW9uKFwiLS1mb2xkZXIgW1N0cmluZ11cIiwgXCJ0aGUgbW9kZWwgZm9sZGVyXCIpXG4gIC5vcHRpb24oXCItLW91dERpciA8U3RyaW5nPlwiLCBcInRoZSBvdXRkaXIuIHNob3VsZCBtYXRjaCB5b3VyIGNvbnRyYWN0IGZvbGRlclwiKVxuICAuZGVzY3JpcHRpb24oXG4gICAgXCJDcmVhdGVzIGEgdGhlIEpTT04gaW5kZXggZmlsZXMgdG8gYmUgc3VibWl0dGVkIHRvIGFsb25nIHdpdGggdGhlIGNvbnRyYWN0XCJcbiAgKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBhbnkpID0+IHtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJzaW9uID0gcGtnLnZlcnNpb247XG5cbiAgICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKFwiZXh0cmFjdC1pbmRleGVzXCIpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBydW5uaW5nIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX0gZm9yICR7cGtnLm5hbWV9IHZlcnNpb24gJHt2ZXJzaW9ufWBcbiAgICApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IGZpbGUsIGZvbGRlciwgb3V0RGlyIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgbW9kZWxzOiBhbnlbXSA9IFtdO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBtb2RlbHMucHVzaCguLi5yZWFkTW9kZWxGaWxlKGZpbGUpKTtcbiAgICB9XG5cbiAgICBpZiAoZm9sZGVyKSB7XG4gICAgICBsb2cuaW5mbyhgTG9hZGluZyBtb2RlbHMgZnJvbSAke2ZvbGRlcn0uLi5gKTtcbiAgICAgIG1vZGVscy5wdXNoKC4uLihhd2FpdCByZWFkTW9kZWxGb2xkZXJzKGZvbGRlcikpKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgZGVzaWduRG9jczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgaWYgKCFmaWxlICYmICFmb2xkZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTXVzdCBwYXNzIGEgZmlsZSBvciBhIGZvbGRlcmApO1xuXG4gICAgZm9yIChjb25zdCBtIG9mIG1vZGVscykge1xuICAgICAgbG9nLnZlcmJvc2UoYEV4dHJhY3RpbmcgaW5kZXhlcyBmb3IgdGFibGUgJHtNb2RlbC50YWJsZU5hbWUobSl9YCk7XG4gICAgICBjb25zdCBpbmRleGVzID0gZ2VuZXJhdGVNb2RlbEluZGV4ZXMobSk7XG4gICAgICBpbmRleGVzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleC5uYW1lKSB7XG4gICAgICAgICAgcmVzdWx0W2luZGV4Lm5hbWVdID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3MobSwgZGVzaWduRG9jcyk7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ZXNUb1dyaXRlID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQpO1xuICAgIGNvbnN0IGRvY3NUb1dyaXRlID0gT2JqZWN0LnZhbHVlcyhkZXNpZ25Eb2NzKTtcbiAgICBsb2cudmVyYm9zZShgRm91bmQgJHtpbmRleGVzVG9Xcml0ZS5sZW5ndGh9IGluZGV4ZXMgdG8gY3JlYXRlYCk7XG4gICAgbG9nLnZlcmJvc2UoYEZvdW5kICR7ZG9jc1RvV3JpdGUubGVuZ3RofSBkZXNpZ24gZG9jcyB0byBjcmVhdGVgKTtcbiAgICBsb2cuZGVidWcoYEluZGV4ZXM6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgICBsb2cuZGVidWcoYERlc2lnbkRvY3M6ICR7SlNPTi5zdHJpbmdpZnkoZGVzaWduRG9jcyl9YCk7XG4gICAgd3JpdGVJbmRleGVzKGluZGV4ZXNUb1dyaXRlLCBvdXREaXIpO1xuICAgIHdyaXRlRGVzaWduRG9jcyhkb2NzVG9Xcml0ZSwgb3V0RGlyKTtcbiAgfSk7XG5cbmNvbnN0IGV4dHJhY3RDb2xsZWN0aW9ucyA9IG5ldyBDb21tYW5kKClcbiAgLmNvbW1hbmQoXCJleHRyYWN0LWNvbGxlY3Rpb25zXCIpXG4gIC5vcHRpb24oXCItLWZpbGUgW1N0cmluZ11cIiwgXCJ0aGUgbW9kZWwgZmlsZVwiKVxuICAub3B0aW9uKFwiLS1mb2xkZXIgW1N0cmluZ11cIiwgXCJ0aGUgbW9kZWwgZm9sZGVyXCIpXG4gIC5vcHRpb24oXCItLW91dERpciA8U3RyaW5nPlwiLCBcInRoZSBvdXRkaXIuIHNob3VsZCBtYXRjaCB5b3VyIGNvbnRyYWN0IGZvbGRlclwiKVxuICAub3B0aW9uKFwiLS1tc3BJZHMgPFN0cmluZz5cIiwgXCJzaW5nbGUgbXNwSWQgb3Igc3RyaW5naWZpZWQgYXJyYXlcIilcbiAgLm9wdGlvbihcIi0tbWFpbk1zcElkIDxTdHJpbmc+XCIsIFwic2luZ2xlIG1zcElkXCIpXG4gIC5vcHRpb24oXG4gICAgXCItLW92ZXJyaWRlcyBbU3RyaW5nXVwiLFxuICAgIFwic3RyaW5naWZpZWQgb3ZlcnJpZGUgb2JqZWN0IHtyZXF1aXJlZFBlZXJDb3VudDogbnVtYmVyLCBtYXhQZWVyQ291bnQ6IG51bWJlciwgYmxvY2tUb0xpdmU6IG51bWJlciwgbWVtYmVyT25seVJlYWQ6IG51bWJlciwgbWVtYmVyT25seVdyaXRlOiBudW1iZXIsIGVuZG9yc2VtZW50UG9saWN5OiAge319XCJcbiAgKVxuICAuZGVzY3JpcHRpb24oXG4gICAgXCJDcmVhdGVzIGEgdGhlIEpTT04gaW5kZXggZmlsZXMgdG8gYmUgc3VibWl0dGVkIHRvIGFsb25nIHdpdGggdGhlIGNvbnRyYWN0XCJcbiAgKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBhbnkpID0+IHtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJzaW9uID0gcGtnLnZlcnNpb247XG5cbiAgICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKFwiZXh0cmFjdC1jb2xsZWN0aW9uc1wiKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcnVubmluZyB3aXRoIG9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9IGZvciAke3BrZy5uYW1lfSB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyBmaWxlLCBmb2xkZXIsIG91dERpciwgbXNwSWRzLCBtYWluTXNwSWQgfSA9IG9wdGlvbnM7XG5cbiAgICB0cnkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbXNwSWRzID0gbXNwSWRzID8gSlNPTi5wYXJzZShtc3BJZHMpIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIC8vICBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihgVW5hYmxlIHRvIGV4dHJhY3QgbXNwaWRzOiAgJHtlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsczogYW55W10gPSBbXTtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgbW9kZWxzLnB1c2goLi4ucmVhZE1vZGVsRmlsZShmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZvbGRlcikge1xuICAgICAgbG9nLmluZm8oYExvYWRpbmcgbW9kZWxzIGZyb20gJHtmb2xkZXJ9Li4uYCk7XG4gICAgICBtb2RlbHMucHVzaCguLi4oYXdhaXQgcmVhZE1vZGVsRm9sZGVycyhmb2xkZXIpKSk7XG4gICAgfVxuXG4gICAgaWYgKCFmaWxlICYmICFmb2xkZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTXVzdCBwYXNzIGEgZmlsZSBvciBhIGZvbGRlcmApO1xuXG4gICAgY29uc3QgaW5qZWN0YWJsZU1vZGVscyA9IG1vZGVscy5maWx0ZXIoXG4gICAgICAobW9kZWwpID0+XG4gICAgICAgIE1vZGVsLmlzU2hhcmVkKG1vZGVsKSB8fFxuICAgICAgICBNb2RlbC5pc1ByaXZhdGUobW9kZWwpIHx8XG4gICAgICAgICEhTW9kZWwubWlycm9yZWRBdChtb2RlbClcbiAgICApO1xuICAgIGlmICghaW5qZWN0YWJsZU1vZGVscy5sZW5ndGgpIHtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgTm8gc2hhcmVkLCBwcml2YXRlLCBvciBtaXJyb3JlZCBtb2RlbHMgZm91bmQgdG8gZXh0cmFjdCBjb2xsZWN0aW9uc2BcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29scyhtc3BJZHNMaXN0Pzogc3RyaW5nW10pIHtcbiAgICAgIGNvbnN0IGNvbHM6IHtcbiAgICAgICAgaW5kZXhlczogQ3JlYXRlSW5kZXhSZXF1ZXN0W107XG4gICAgICAgIGRlc2lnbkRvY3M6IENvdWNoREJEZXNpZ25Eb2NbXTtcbiAgICAgICAgbWlycm9yPzogUHJpdmF0ZUNvbGxlY3Rpb247XG4gICAgICAgIGNvbGxlY3Rpb25zOiBQcml2YXRlQ29sbGVjdGlvbltdO1xuICAgICAgfVtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGluamVjdGFibGVNb2RlbHMubWFwKGFzeW5jIChjbGF6eikgPT4ge1xuICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgICAgICAgY29uc3QgbWlycm9yTWV0YSA9IE1vZGVsLm1pcnJvcmVkQXQoY2xhenopO1xuXG4gICAgICAgICAgY29uc29sZS5sb2codGFibGVOYW1lKTtcbiAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgbXNwIG9mIG1zcElkc0xpc3QgfHwgbXNwSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uc1ttc3BdID0gYXdhaXQgZXhDb2xsZWN0aW9ucyhcbiAgICAgICAgICAgICAgY2xhenosXG4gICAgICAgICAgICAgIFttc3AsIG1haW5Nc3BJZF0sXG4gICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAgIC8vICAgc2hhcmVkQ29sczogT2JqZWN0LmFzc2lnbih7fSwgb3ZlcnJpZGVzLnNoYXJlZENvbHMpLFxuICAgICAgICAgICAgICAvLyAgIHByaXZhdGVDb2xzOiBPYmplY3QuYXNzaWduKHt9LCBvdmVycmlkZXMucHJpdmF0ZUNvbHMpLFxuICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAhIW1pcnJvck1ldGFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IG1pcnJvckNvbGxlY3Rpb246IFByaXZhdGVDb2xsZWN0aW9uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKG1pcnJvck1ldGEpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25zW21haW5Nc3BJZF0gPSBjb2xsZWN0aW9uc1ttYWluTXNwSWRdIHx8IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbnMpLmZvckVhY2goKG1zcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25zW21haW5Nc3BJZF0ucHJpdmF0ZXMgPSBjb2xsZWN0aW9uc1tcbiAgICAgICAgICAgICAgICBtc3BcbiAgICAgICAgICAgICAgXS5wcml2YXRlcz8uZmlsdGVyKChwOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocC5uYW1lICE9PSAobWlycm9yTWV0YS5yZXNvbHZlciBhcyBzdHJpbmcpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtaXJyb3JDb2xsZWN0aW9uID0gcCBhcyBhbnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHByaXZhdGVzQ291bnQgPSBPYmplY3QudmFsdWVzKGNvbGxlY3Rpb25zKVxuICAgICAgICAgICAgLm1hcCgoYykgPT4gYy5wcml2YXRlcylcbiAgICAgICAgICAgIC5mbGF0KCkubGVuZ3RoO1xuICAgICAgICAgIGlmIChwcml2YXRlc0NvdW50KVxuICAgICAgICAgICAgbG9nXG4gICAgICAgICAgICAgIC5mb3IoTW9kZWwudGFibGVOYW1lKGNsYXp6KSlcbiAgICAgICAgICAgICAgLmluZm8oYEZvdW5kICR7cHJpdmF0ZXNDb3VudH0gcHJpdmF0ZSBjb2xsZWN0aW9ucyB0byBjcmVhdGVgKTtcbiAgICAgICAgICBjb25zdCBzaGFyZWRDb3VudCA9IE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbnMpXG4gICAgICAgICAgICAubWFwKChjKSA9PiBjLnNoYXJlZClcbiAgICAgICAgICAgIC5mbGF0KCkubGVuZ3RoO1xuXG4gICAgICAgICAgbG9nXG4gICAgICAgICAgICAuZm9yKE1vZGVsLnRhYmxlTmFtZShjbGF6eikpXG4gICAgICAgICAgICAuaW5mbyhgRm91bmQgJHtzaGFyZWRDb3VudH0gc2hhcmVkIGNvbGxlY3Rpb25zIHRvIGNyZWF0ZWApO1xuICAgICAgICAgIGlmIChtaXJyb3JDb2xsZWN0aW9uKVxuICAgICAgICAgICAgbG9nXG4gICAgICAgICAgICAgIC5mb3IoTW9kZWwudGFibGVOYW1lKGNsYXp6KSlcbiAgICAgICAgICAgICAgLmluZm8oXG4gICAgICAgICAgICAgICAgYEZvdW5kIG9uZSBtaXJyb3IgY29sbGVjdGlvbiAke21pcnJvck1ldGE/LnJlc29sdmVyIGFzIHN0cmluZ31gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBjb2xMaXN0ID0gT2JqZWN0LnZhbHVlcyhjb2xsZWN0aW9ucylcbiAgICAgICAgICAgIC5tYXAoKGMpID0+IFsuLi4oYy5wcml2YXRlcyB8fCBbXSksIC4uLihjLnNoYXJlZCB8fCBbXSldKVxuICAgICAgICAgICAgLmZsYXQoKTtcbiAgICAgICAgICBsZXQgaW5kZXhlczogQ3JlYXRlSW5kZXhSZXF1ZXN0W10gPSBbXTtcbiAgICAgICAgICBsZXQgZGVzaWduRG9jczogQ291Y2hEQkRlc2lnbkRvY1tdID0gW107XG4gICAgICAgICAgaWYgKGNvbExpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dcbiAgICAgICAgICAgICAgLmZvcihNb2RlbC50YWJsZU5hbWUoY2xhenopKVxuICAgICAgICAgICAgICAudmVyYm9zZShgZ2VuZXJhdGluZyBpbmRleGVzIGZvciBjb2xsZWN0aW9uc2ApO1xuICAgICAgICAgICAgaW5kZXhlcyA9IGdlbmVyYXRlTW9kZWxJbmRleGVzKGNsYXp6KTtcbiAgICAgICAgICAgIGxvZ1xuICAgICAgICAgICAgICAuZm9yKE1vZGVsLnRhYmxlTmFtZShjbGF6eikpXG4gICAgICAgICAgICAgIC5pbmZvKGBmb3VuZCAke2luZGV4ZXMubGVuZ3RofSBpbmRleGVzYCk7XG4gICAgICAgICAgICBkZXNpZ25Eb2NzID0gZ2VuZXJhdGVNb2RlbERlc2lnbkRvY3MoY2xhenopO1xuICAgICAgICAgICAgbG9nXG4gICAgICAgICAgICAgIC5mb3IoTW9kZWwudGFibGVOYW1lKGNsYXp6KSlcbiAgICAgICAgICAgICAgLmluZm8oYGZvdW5kICR7ZGVzaWduRG9jcy5sZW5ndGh9IGRlc2lnbiBkb2NzYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleGVzLFxuICAgICAgICAgICAgZGVzaWduRG9jcyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25zOiBjb2xMaXN0LFxuICAgICAgICAgICAgbWlycm9yOiBtaXJyb3JDb2xsZWN0aW9uLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIGNvbHM7XG4gICAgfVxuXG4gICAgY29uc3QgY29scyA9IGF3YWl0IGdldENvbHMoKTtcbiAgICBjb25zdCBvbmx5TWlycm9yID0gYXdhaXQgZ2V0Q29scyhbbWFpbk1zcElkXSk7XG5cbiAgICBjb25zdCBjb2xsZWN0aW9uc1RvID0gW1xuICAgICAgLi4ub25seU1pcnJvci5maWx0ZXIoKGMpID0+IGMubWlycm9yKS5tYXAoKGMpID0+IGMubWlycm9yKSxcbiAgICAgIC4uLmNvbHMubWFwKChjKSA9PiBjLmNvbGxlY3Rpb25zKS5mbGF0KCksXG4gICAgICAuLi5jb2xzLmZpbHRlcigoYykgPT4gYy5taXJyb3IpLm1hcCgoYykgPT4gYy5taXJyb3IpLFxuICAgIF0gYXMgUHJpdmF0ZUNvbGxlY3Rpb25bXTtcblxuICAgIGNvbnN0IHVuaXF1ZUJ5Q29sbGVjdGlvbiA9IFtcbiAgICAgIC4uLm5ldyBNYXAoXG4gICAgICAgIGNvbGxlY3Rpb25zVG8ubWFwKChpdGVtOiBQcml2YXRlQ29sbGVjdGlvbikgPT4gW2l0ZW0ubmFtZSwgaXRlbV0pXG4gICAgICApLnZhbHVlcygpLFxuICAgIF07XG5cbiAgICBpZiAodW5pcXVlQnlDb2xsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgd3JpdGVDb2xsZWN0aW9ucyh1bmlxdWVCeUNvbGxlY3Rpb24sIG91dERpcik7XG4gICAgICBjb25zdCBtZXRhQ29sbGVjdGlvbnNDb25maWcgPSBwYXRoLmpvaW4oXG4gICAgICAgIG91dERpcixcbiAgICAgICAgXCJNRVRBLUlORlwiLFxuICAgICAgICBcImNvbGxlY3Rpb25zX2NvbmZpZy5qc29uXCJcbiAgICAgICk7XG4gICAgICBjb25zdCBjb250cmFjdENvbGxlY3Rpb25zQ29uZmlnID0gcGF0aC5qb2luKFxuICAgICAgICBvdXREaXIsXG4gICAgICAgIFwiY29sbGVjdGlvbnNfY29uZmlnLmpzb25cIlxuICAgICAgKTtcbiAgICAgIGZzLmNvcHlGaWxlU3luYyhtZXRhQ29sbGVjdGlvbnNDb25maWcsIGNvbnRyYWN0Q29sbGVjdGlvbnNDb25maWcpO1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBTdG9yZWQgJHtjb2xsZWN0aW9uc1RvLmxlbmd0aH0gY29sbGVjdGlvbnMgdG8gJHttZXRhQ29sbGVjdGlvbnNDb25maWd9YFxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKFxuICAgICAgICBgQ29waWVkIGNvbGxlY3Rpb25zX2NvbmZpZyB0byAke2NvbnRyYWN0Q29sbGVjdGlvbnNDb25maWd9IGFsb25nc2lkZSB0aGUgcGFja2FnZS5qc29uYFxuICAgICAgKTtcblxuICAgICAgY29scy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXhlcywgZGVzaWduRG9jcywgY29sbGVjdGlvbnMsIG1pcnJvciB9ID0gYztcbiAgICAgICAgY29uc3QgdG9JbmRleDogUHJpdmF0ZUNvbGxlY3Rpb25bXSA9IFsuLi5jb2xsZWN0aW9ucywgbWlycm9yXS5maWx0ZXIoXG4gICAgICAgICAgQm9vbGVhblxuICAgICAgICApIGFzIFByaXZhdGVDb2xsZWN0aW9uW107XG4gICAgICAgIHRvSW5kZXguZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgICAgIHdyaXRlSW5kZXhlcyhpbmRleGVzLCBvdXREaXIsIGkubmFtZSk7XG4gICAgICAgICAgd3JpdGVDb2xsZWN0aW9uRGVzaWduRG9jcyhkZXNpZ25Eb2NzIHx8IFtdLCBvdXREaXIsIGkubmFtZSk7XG4gICAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgICBgU3RvcmVkICR7aW5kZXhlcz8ubGVuZ3RoIHx8IDB9IGluZGV4ZXMgYW5kICR7ZGVzaWduRG9jcz8ubGVuZ3RoIHx8IDB9IGRlc2lnbiBkb2NzIHRvIGNvbGxlY3Rpb24gJHtpLm5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuY29uc3QgZW5zdXJlSW5mcmEgPSBuZXcgQ29tbWFuZCgpXG4gIC5uYW1lKFwiYXdhaXQtaW5mcmFcIilcbiAgLmRlc2NyaXB0aW9uKFwid2FpdHMgZm9yIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBiZSB1cCBhbmQgcnVubmluZ1wiKVxuICAub3B0aW9uKFxuICAgIFwiLS1jb250YWluZXIgPFN0cmluZz5cIixcbiAgICBcImRvY2tlciBjb250YWluZXIgbmFtZSB0byB0ZXN0ICh1c3VhbGx5IGxhc3QgcGVlcilcIixcbiAgICBcImJvb3Qtb3JnLWMtcGVlci0wXCJcbiAgKVxuICAub3B0aW9uKFwiLS10aW1lb3V0IDxTdHJpbmc+XCIsIFwidGltZW91dCBiZXR3ZWVuIHRlc3RzIGluIG1pbGxpc2Vjb25kc1wiLCBcIjUwMDBcIilcbiAgLm9wdGlvbihcIi0tYXR0ZW1wdHMgPFN0cmluZz5cIiwgXCJudW1iZXIgb2YgYXR0ZW1wdHMgYmVmb3JlIGdpdmluZyB1cFwiLCBcIjEwXCIpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IGFueSkgPT4ge1xuICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgKTtcblxuICAgIGNvbnN0IHZlcnNpb24gPSBwa2cudmVyc2lvbjtcblxuICAgIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoXCJhd2FpdC1pbmZyYVwiKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcnVubmluZyB3aXRoIG9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9IGZvciAke3BrZy5uYW1lfSB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgY29udGFpbmVyLCB0aW1lb3V0LCBhdHRlbXB0cyB9ID0gb3B0aW9ucztcbiAgICB0aW1lb3V0ID0gcGFyc2VJbnQodGltZW91dCkgfHwgNTAwMDtcbiAgICBhdHRlbXB0cyA9IHBhcnNlSW50KGF0dGVtcHRzKSB8fCAxMDtcblxuICAgIGF3YWl0IGVuc3VyZUluZnJhc3RydWN0dXJlQm9vdGVkKFwiYm9vdC1vcmctYy1wZWVyLTBcIiwgdGltZW91dCwgYXR0ZW1wdHMpO1xuXG4gICAgbG9nLmluZm8oXG4gICAgICBgSW5mcmFzdHJ1Y3R1cmUgYm9vdGVkIHN1Y2Nlc3NmdWxseSAoYWNjb3JkaW5nIHRvIGNvbnRhaW5lciAke2NvbnRhaW5lcn0pIWBcbiAgICApO1xuICB9KTtcblxuY29uc3QgZGVwbG95Q29udHJhY3QgPSBuZXcgQ29tbWFuZCgpXG4gIC5uYW1lKFwiZGVwbG95LWNvbnRyYWN0XCIpXG4gIC5kZXNjcmlwdGlvbihcImRlcGxveXMgdGhlIHNlbGVjdGVkIGNvbnRyYWN0XCIpXG4gIC5vcHRpb24oXCItLW5hbWUgPFN0cmluZz5cIiwgXCJDb250cmFjdCBOYW1lIChhbmQgZm9sZGVyKVwiKVxuICAub3B0aW9uKFwiLS1pbnB1dCA8U3RyaW5nPlwiLCBcImlucHV0IGZvbGRlclwiKVxuICAub3B0aW9uKFxuICAgIFwiLS1jb2xsZWN0aW9ucy1jb25maWcgPFN0cmluZz5cIixcbiAgICBcInBhdGggdG8gY29sbGVjdGlvbnNfY29uZmlnLmpzb24gdG8gY29uZmlndXJlIHByaXZhdGUgY29sbGVjdGlvbnNcIlxuICApXG4gIC5vcHRpb24oXG4gICAgXCItLWluY3JlbWVudFZlcnNpb24gPFN0cmluZz5cIixcbiAgICBcIih0cnVlIHwgZmFsc2UpIGlmIHNob3VsZCB1c2UgdmVyc2lvbiBvciBzZXF1ZW5jZSB0byB1cGRhdGUgY29udHJhY3RzXCIsXG4gICAgZmFsc2VcbiAgKVxuICAub3B0aW9uKFxuICAgIFwiLS10cmFja2VyRm9sZGVyIDxTdHJpbmc+XCIsXG4gICAgXCJjb250cmFjdCB2ZXJzaW9uIHRyYWNrZXIgZm9sZGVyIChzaG91bGQgYmUgZGVsZXRlZCBvbiBpbmZyYXN0cnVjdHVyZTpkb3duKVwiLFxuICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRlc3RzXCIsIFwiaW50ZWdyYXRpb25cIiwgXCJjaGFpbmNvZGVUcmFja2Vyc1wiKVxuICApXG4gIC5vcHRpb24oXG4gICAgXCItLXBlZXJzIDxTdHJpbmc+XCIsXG4gICAgXCJjb21tYSBzZXBhcmF0ZWQgcGVlciBpZHNcIixcbiAgICBcIm9yZy1hLXBlZXItMCxvcmctYi1wZWVyLTAsb3JnLWMtcGVlci0wXCJcbiAgKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBhbnkpID0+IHtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJzaW9uID0gcGtnLnZlcnNpb247XG5cbiAgICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKFwiZGVwbG95LWNvbnRyYWN0XCIpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBydW5uaW5nIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX0gZm9yICR7cGtnLm5hbWV9IHZlcnNpb24gJHt2ZXJzaW9ufWBcbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIGlucHV0LFxuICAgICAgcGVlcnMsXG4gICAgICB0cmFja2VyRm9sZGVyLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgaW5jcmVtZW50VmVyc2lvbixcbiAgICAgIGNvbGxlY3Rpb25zQ29uZmlnLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBlZXJJZHMgPSBwZWVycy5zcGxpdChcIixcIik7XG5cbiAgICBjb25zdCBjb3VudFBhdGggPSBwYXRoLnJlc29sdmUocGF0aC5qb2luKHRyYWNrZXJGb2xkZXIsIGAke25hbWV9LmNvdW50YCkpO1xuXG4gICAgbGV0IHNlcXVlbmNlOiBudW1iZXI7XG5cbiAgICB0cnkge1xuICAgICAgc2VxdWVuY2UgPSBwYXJzZUludChmcy5yZWFkRmlsZVN5bmMoY291bnRQYXRoKS50b1N0cmluZyhcInV0Zi04XCIpKTtcbiAgICAgIGlmIChpc05hTihzZXF1ZW5jZSkpIHNlcXVlbmNlID0gMTtcbiAgICAgIGVsc2Ugc2VxdWVuY2UgKz0gMTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBzZXF1ZW5jZSA9IDE7XG4gICAgfVxuICAgIC8vXG4gICAgLy8gaWYgKGluY3JlbWVudFZlcnNpb24pIHtcbiAgICAvLyAgIHZlcnNpb24gPSB2ZXJzaW9uICsgYC0ke3NlcXVlbmNlfWA7XG4gICAgLy8gICAvLyBzZXF1ZW5jZSA9IDE7XG4gICAgLy8gfVxuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgcGVlciBvZiBwZWVySWRzKSB7XG4gICAgICAgIHBhY2thZ2VDb250cmFjdChwZWVyLCBpbnB1dCwgbmFtZSwgdmVyc2lvbik7XG4gICAgICAgIGluc3RhbGxDb250cmFjdChwZWVyLCBuYW1lKTtcbiAgICAgICAgYXBwcm92ZUNvbnRyYWN0KFxuICAgICAgICAgIHBlZXIsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBwZWVyID09PSBcIm9yZy1hLXBlZXItMFwiXG4gICAgICAgICAgICA/IFwidGxzLWNhLWNlcnQucGVtXCJcbiAgICAgICAgICAgIDogXCJvcmRlcmVyLXRscy1jYS1jZXJ0LnBlbVwiLFxuICAgICAgICAgIHNlcXVlbmNlLFxuICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgY29sbGVjdGlvbnNDb25maWdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY291bnRQYXRoLCBzZXF1ZW5jZS50b1N0cmluZygpKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgbG9nLmVycm9yKFwiRXJyb3IgZGVwbG95aW5nIGNvbnRyYWN0OlwiLCBlcnIpO1xuICAgIH1cbiAgICBjb21taXRDaGFpbmNvZGUobmFtZSwgc2VxdWVuY2UsIHZlcnNpb24sIGNvbGxlY3Rpb25zQ29uZmlnKTtcbiAgfSk7XG5cbmNvbnN0IGdldENyeXB0b01hdGVyaWFsID0gbmV3IENvbW1hbmQoKVxuICAubmFtZShcImdldC1jcnlwdG8tbWF0ZXJpYWxcIilcbiAgLmRlc2NyaXB0aW9uKFwiY29waWVzIHRoZSBjcnlwdG8gbWF0ZXJpYWwgdG8gdGhlIHNlbGVjdGVkIGZvbGRlclwiKVxuICAub3B0aW9uKFwiLS1mb2xkZXIgPFN0cmluZz5cIiwgXCJvdXRwdXQgZm9sZGVyXCIsIFwiZG9ja2VyL2RvY2tlci1kYXRhXCIpXG4gIC5vcHRpb24oXCItLW9yZyBbU3RyaW5nXVwiLCBcInRoZSBvcmcvcGVlciB0byBleHRyYWN0IGZyb21cIiwgXCJvcmctYVwiKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBhbnkpID0+IHtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJzaW9uID0gcGtnLnZlcnNpb247XG5cbiAgICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKFwiZ2V0LWNyeXB0by1tYXRlcmlhbFwiKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcnVubmluZyB3aXRoIG9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9IGZvciAke3BrZy5uYW1lfSB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgKTtcbiAgICBjb25zdCB7IGZvbGRlciwgb3JnIH0gPSBvcHRpb25zO1xuICAgIGV4ZWNTeW5jKGBkb2NrZXIgY3AgJHtvcmd9Oi93ZWF2ZXIvY2xpZW50Ly4gJHtmb2xkZXJ9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pO1xuICB9KTtcblxuY29uc3QgZ2V0Q29weVRvUFRQID0gbmV3IENvbW1hbmQoKVxuICAubmFtZShcInByZXBhcmUtcHRwXCIpXG4gIC5kZXNjcmlwdGlvbihcImNvcGllcyBjb250cmFjdCB0byB0aGUgcHRwIGZvbGRlclwiKVxuICAub3B0aW9uKFwiLS1vcmlnaW4tZm9sZGVyIDxTdHJpbmc+XCIsIFwib3JpZ2luIHdvcmtzcGFjZSBmb2xkZXJcIiwgdW5kZWZpbmVkKVxuICAub3B0aW9uKFxuICAgIFwiLS1kZXN0LWZvbGRlciA8U3RyaW5nPlwiLFxuICAgIFwiZm9sZGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3b3Jrc3BhY2VcIixcbiAgICB1bmRlZmluZWRcbiAgKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBhbnkpID0+IHtcbiAgICBpZiAoIShvcHRpb25zLm9yaWdpbkZvbGRlciAmJiBvcHRpb25zLmRlc3RGb2xkZXIpKSB7XG4gICAgICBsb2dnZXJcbiAgICAgICAgLmZvcihcInByZXBhcmUtcHRwXCIpXG4gICAgICAgIC5lcnJvcihcbiAgICAgICAgICBcIkJvdGggLS1vcmlnaW4tZm9sZGVyIGFuZCAtLWRlc3QtZm9sZGVyIG9wdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHByZXBhcmUtcHRwXCJcbiAgICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb3B5Rm9sZGVyKHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZykge1xuICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHRhcmdldCBmb2xkZXJcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRhcmdldCkpIHtcbiAgICAgICAgZnMucm1TeW5jKHRhcmdldCwge1xuICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSBwYXJlbnQgZXhpc3RzXG4gICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKHRhcmdldCksIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENvcHkgZm9sZGVyXG4gICAgICBmcy5jcFN5bmMoc291cmNlLCB0YXJnZXQsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhgQ29waWVkOiAke3NvdXJjZX0gXG4gICAgICAtPiAke3RhcmdldH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW4gPSBwYXRoLnJlc29sdmUob3B0aW9ucy5vcmlnaW5Gb2xkZXIpO1xuICAgIGNvbnN0IGRlc3QgPSBwYXRoLnJlc29sdmUob3B0aW9ucy5kZXN0Rm9sZGVyKTtcblxuICAgIGV4ZWNTeW5jKGBjZCBmb3ItZmFicmljICYmIG5wbSBydW4gYnVpbGRgLCB7XG4gICAgICBjd2Q6IG9yaWdpbixcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcbiAgICBleGVjU3luYyhgY2QgZm9yLWZhYnJpYyAmJiBucG0gcnVuIGJ1aWxkOmNvbnRyYWN0OnNoYXJlZGAsIHtcbiAgICAgIGN3ZDogb3JpZ2luLFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc291cmNlTGliID0gcGF0aC5qb2luKG9yaWdpbiwgXCJmb3ItZmFicmljXCIsIFwibGliXCIpO1xuICAgIGNvbnN0IHRhcmdldExpYiA9IHBhdGguam9pbihkZXN0LCBcImluZnJhXCIsIFwiZm9yLWZhYnJpY1wiLCBcImxpYlwiKTtcblxuICAgIGNvcHlGb2xkZXIoc291cmNlTGliLCB0YXJnZXRMaWIpO1xuXG4gICAgY29uc3Qgc291cmNlR2xvYmFsID0gcGF0aC5qb2luKFxuICAgICAgb3JpZ2luLFxuICAgICAgXCJmb3ItZmFicmljXCIsXG4gICAgICBcImRvY2tlclwiLFxuICAgICAgXCJpbmZyYXN0cnVjdHVyZVwiLFxuICAgICAgXCJjaGFpbmNvZGVcIixcbiAgICAgIFwiR2xvYmFsXCJcbiAgICApO1xuXG4gICAgY29uc3QgdGFyZ2V0Q29udHJhY3RzID0gcGF0aC5qb2luKGRlc3QsIFwidG9vbGtpdFwiLCBcImNvbnRyYWN0c1wiKTtcblxuICAgIGZzLm1rZGlyU3luYyh0YXJnZXRDb250cmFjdHMsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBmcy5yZWFkZGlyU3luYyhzb3VyY2VHbG9iYWwpKSB7XG4gICAgICBjb25zdCBzb3VyY2VJdGVtID0gcGF0aC5qb2luKHNvdXJjZUdsb2JhbCwgaXRlbSk7XG4gICAgICBjb25zdCB0YXJnZXRJdGVtID0gcGF0aC5qb2luKHRhcmdldENvbnRyYWN0cywgaXRlbSk7XG5cbiAgICAgIC8vIFJlbW92ZSBleGlzdGluZyB0YXJnZXQgaXRlbSBpZiBuZWVkZWRcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRhcmdldEl0ZW0pKSB7XG4gICAgICAgIGZzLnJtU3luYyh0YXJnZXRJdGVtLCB7XG4gICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZnMuY3BTeW5jKHNvdXJjZUl0ZW0sIHRhcmdldEl0ZW0sIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhgQ29waWVkOiAke3NvdXJjZUl0ZW19IFxuICAgICAgLT4gJHt0YXJnZXRJdGVtfWApO1xuICAgIH1cblxuICAgIGV4ZWNTeW5jKGBjZCB0b29sa2l0ICYmIG5wbSBydW4gYnVpbGRgLCB7IGN3ZDogZGVzdCwgc3RkaW86IFwiaW5oZXJpdFwiIH0pO1xuICAgIGV4ZWNTeW5jKGBjZCB0b29sa2l0ICYmIG5wbSBydW4gZG9ja2VyOmJ1aWxkLWNvbnRyYWN0c2AsIHtcbiAgICAgIGN3ZDogZGVzdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcbiAgICBleGVjU3luYyhgY2QgaW5mcmEgJiYgbnBtIHJ1biBidWlsZGAsIHsgY3dkOiBkZXN0LCBzdGRpbzogXCJpbmhlcml0XCIgfSk7XG4gICAgZXhlY1N5bmMoYGNkIGluZnJhICYmIG5wbSBydW4gYnVpbGQ6amVzdDppbWFnZWAsIHtcbiAgICAgIGN3ZDogZGVzdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcbiAgfSk7XG5cbmNvbnN0IGZhYnJpY0NtZCA9IG5ldyBDb21tYW5kKClcbiAgLm5hbWUoXCJmb3ItZmFicmljXCIpXG4gIC5jb21tYW5kKFwiZmFicmljXCIpXG4gIC5kZXNjcmlwdGlvbihcbiAgICBcImV4cG9zZXMgc2V2ZXJhbCBjb21tYW5kcyB0byBoZWxwIG1hbmFnZSB0aGUgZmFicmljIGluZnJhc3RydWN0dXJlXCJcbiAgKTtcblxuZmFicmljQ21kLmFkZENvbW1hbmQoY29tcGlsZUNvbW1hbmQpO1xuZmFicmljQ21kLmFkZENvbW1hbmQoZXh0cmFjdEluZGV4ZXMpO1xuZmFicmljQ21kLmFkZENvbW1hbmQoZW5zdXJlSW5mcmEpO1xuZmFicmljQ21kLmFkZENvbW1hbmQoZGVwbG95Q29udHJhY3QpO1xuZmFicmljQ21kLmFkZENvbW1hbmQoZ2V0Q3J5cHRvTWF0ZXJpYWwpO1xuZmFicmljQ21kLmFkZENvbW1hbmQoZXh0cmFjdENvbGxlY3Rpb25zKTtcbmZhYnJpY0NtZC5hZGRDb21tYW5kKGdldENvcHlUb1BUUCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZhYnJpYygpIHtcbiAgcmV0dXJuIGZhYnJpY0NtZDtcbn1cbiJdfQ==
|
package/lib/esm/cli-utils.js
CHANGED
|
@@ -253,4 +253,4 @@ export function compileWithTsconfigOverrides(tsconfigPath, overrides) {
|
|
|
253
253
|
throw new Error("Emit was skipped (check diagnostics above).");
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
|
-
//# sourceMappingURL=cli-utils.js.map
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUIsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxnQkFBd0IsbUJBQW1CO0lBRTNDLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FDckIsa0JBQWtCLGFBQWEsaUNBQWlDLENBQ2pFO2FBQ0UsUUFBUSxFQUFFO2FBQ1YsSUFBSSxFQUFFLENBQUM7UUFFVixPQUFPLE1BQU0sS0FBSyxHQUFHLENBQUM7SUFDeEIsQ0FBQztJQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLGdCQUF3QixtQkFBbUIsRUFDM0MsVUFBa0IsSUFBSSxFQUN0QixXQUFtQixFQUFFO0lBRXJCLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQzdDLElBQUksRUFBRSxRQUFRLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUUxRSxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENB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QyxPQUFPLENBQUMsQ0FBQztJQUNsRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixvRUFBb0U7UUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbEMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7SUFDckQsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDakUsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlkSW5mcmFzdHJ1Y3R1cmVCb290KFxuICBjb250YWluZXJOYW1lOiBzdHJpbmcgPSBcImJvb3Qtb3JnLWMtcGVlci0wXCJcbik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IG91dHB1dCA9IGV4ZWNTeW5jKFxuICAgICAgYGRvY2tlciBpbnNwZWN0ICR7Y29udGFpbmVyTmFtZX0gLS1mb3JtYXQ9J3t7LlN0YXRlLkV4aXRDb2RlfX0nYFxuICAgIClcbiAgICAgIC50b1N0cmluZygpXG4gICAgICAudHJpbSgpO1xuXG4gICAgcmV0dXJuIG91dHB1dCA9PT0gXCIwXCI7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluc3BlY3RpbmcgY29udGFpbmVyOlwiLCBlcnIubWVzc2FnZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVJbmZyYXN0cnVjdHVyZUJvb3RlZChcbiAgY29udGFpbmVyTmFtZTogc3RyaW5nID0gXCJib290LW9yZy1jLXBlZXItMFwiLFxuICB0aW1lb3V0OiBudW1iZXIgPSA1MDAwLFxuICBhdHRlbXB0czogbnVtYmVyID0gMTBcbik6IFByb21pc2U8dm9pZD4ge1xuICB3aGlsZSAoIWRpZEluZnJhc3RydWN0dXJlQm9vdChjb250YWluZXJOYW1lKSkge1xuICAgIGlmICgtLWF0dGVtcHRzIDw9IDApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiZXhjZWVkZWQgYWxsb3dlZCBhdHRlbXB0c1wiKTtcblxuICAgIGNvbnNvbGUubG9nKFwiV2FpdGluZyBmb3IgaW5mcmFzdHJ1Y3R1cmUgdG8gYm9vdC4uLlwiKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCB0aW1lb3V0KSk7IC8vIFdhaXQgZm9yIDUgc2Vjb25kcyBiZWZvcmUgcmV0cnlpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFja2FnZUNvbnRyYWN0KFxuICBkb2NrZXJOYW1lOiBzdHJpbmcsXG4gIGNvbnRyYWN0Rm9sZGVyOiBzdHJpbmcsXG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uOiBzdHJpbmcgPSBcIjEuMFwiXG4pOiB2b2lkIHtcbiAgZXhlY1N5bmMoYGRvY2tlciBleGVjICR7ZG9ja2VyTmFtZX0gbm9kZSAuL3dlYXZlci9saWIvY29yZS9jbGkuY2pzIHBhY2thZ2UtY2hhaW5jb2RlIC1kIFxcXG4gICAgLS1jaGFpbmNvZGUtcGF0aCAuL3dlYXZlci9jaGFpbmNvZGUvJHtjb250cmFjdEZvbGRlcn0gXFxcbiAgICAtLWxhbmcgbm9kZSBcXFxuICAgIC0tY2hhaW5jb2RlLW91dHB1dCAvd2VhdmVyL3BlZXIvJHtjb250cmFjdE5hbWV9LnRhci5neiBcXFxuICAgIC0tY2hhaW5jb2RlLW5hbWUgJHtjb250cmFjdE5hbWV9IFxcXG4gICAgLS1jaGFpbmNvZGUtdmVyc2lvbiAke3ZlcnNpb259IC1zXG4gICAgYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsQ29udHJhY3QoZG9ja2VyTmFtZTogc3RyaW5nLCBjb250cmFjdE5hbWU6IHN0cmluZykge1xuICBleGVjU3luYyhcbiAgICBgZG9ja2VyIGV4ZWMgJHtkb2NrZXJOYW1lfSBub2RlIC4vd2VhdmVyL2xpYi9jb3JlL2NsaS5janMgaW5zdGFsbC1jaGFpbmNvZGUgLWQgLXMgLS1jaGFpbmNvZGUtcGF0aCAuL3dlYXZlci9wZWVyLyR7Y29udHJhY3ROYW1lfS50YXIuZ3pgXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHByb3ZlQ29udHJhY3QoXG4gIGRvY2tlck5hbWU6IHN0cmluZyxcbiAgY29udHJhY3ROYW1lOiBzdHJpbmcsXG4gIHRsc0NlcnROYW1lOiBzdHJpbmcsXG4gIHNlcXVlbmNlOiBudW1iZXIgPSAxLFxuICB2ZXJzaW9uOiBzdHJpbmcgPSBcIjEuMFwiLFxuICBjb2xsZWN0aW9uc0NvbmZpZz86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGNvbGxlY3Rpb25zRmxhZyA9IGNvbGxlY3Rpb25zQ29uZmlnXG4gICAgPyBgIC0tY29sbGVjdGlvbnMtY29uZmlnIFwiJHtjb2xsZWN0aW9uc0NvbmZpZ31cImBcbiAgICA6IFwiXCI7XG4gIGV4ZWNTeW5jKGBkb2NrZXIgZXhlYyAke2RvY2tlck5hbWV9IG5vZGUgLi93ZWF2ZXIvbGliL2NvcmUvY2xpLmNqcyBhcHByb3ZlLWNoYWluY29kZSAtZCAtcyBcXFxuICAgIC0tb3JkZXJlci1hZGRyZXNzIG9yZy1hLW9yZGVyZXItMDo3MDIxIFxcXG4gICAgLS1jaGFubmVsLWlkIHNpbXBsZS1jaGFubmVsIFxcXG4gICAgLS1jaGFpbmNvZGUtbmFtZSAke2NvbnRyYWN0TmFtZX0gXFxcbiAgICAtLWNoYWluY29kZS12ZXJzaW9uICR7dmVyc2lvbn0gXFxcbiAgICAtLXNlcXVlbmNlICR7c2VxdWVuY2V9JHtjb2xsZWN0aW9uc0ZsYWd9IFxcXG4gICAgLS1lbmFibGUtdGxzIFxcXG4gICAgLS10bHMtY2EtY2VydC1maWxlIC93ZWF2ZXIvcGVlci8ke3Rsc0NlcnROYW1lfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95Q29udHJhY3QoXG4gIGNvbnRyYWN0Rm9sZGVyOiBzdHJpbmcsXG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uOiBzdHJpbmcgPSBcIjEuMFwiLFxuICBwZWVyczogc3RyaW5nW10gPSBbXCJvcmctYS1wZWVyLTBcIiwgXCJvcmctYi1wZWVyLTBcIiwgXCJvcmctYy1wZWVyLTBcIl1cbikge1xuICBsZXQgc2VxdWVuY2U6IG51bWJlcjtcbiAgY29uc3QgY291bnRQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgIHBhdGguam9pbihcbiAgICAgIGAke19fZGlybmFtZX1gLFxuICAgICAgXCIuLlwiLFxuICAgICAgXCJpbnRlZ3JhdGlvblwiLFxuICAgICAgXCJjaGFpbmNvZGVUcmFja2Vyc1wiLFxuICAgICAgYCR7Y29udHJhY3ROYW1lfS5jb3VudGBcbiAgICApXG4gICk7XG4gIHRyeSB7XG4gICAgc2VxdWVuY2UgPSBwYXJzZUludChmcy5yZWFkRmlsZVN5bmMoY291bnRQYXRoKS50b1N0cmluZyhcInV0Zi04XCIpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICBzZXF1ZW5jZSA9IDE7XG4gIH1cbiAgZnMud3JpdGVGaWxlU3luYyhjb3VudFBhdGgsIHNlcXVlbmNlLnRvU3RyaW5nKCkpO1xuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICBwYWNrYWdlQ29udHJhY3QocGVlciwgY29udHJhY3RGb2xkZXIsIGNvbnRyYWN0TmFtZSwgdmVyc2lvbik7XG4gICAgICBpbnN0YWxsQ29udHJhY3QocGVlciwgY29udHJhY3ROYW1lKTtcbiAgICAgIGFwcHJvdmVDb250cmFjdChcbiAgICAgICAgcGVlcixcbiAgICAgICAgY29udHJhY3ROYW1lLFxuICAgICAgICBwZWVyID09PSBcIm9yZy1hLXBlZXItMFwiID8gXCJ0bHMtY2EtY2VydC5wZW1cIiA6IFwib3JkZXJlci10bHMtY2EtY2VydC5wZW1cIixcbiAgICAgICAgc2VxdWVuY2UsXG4gICAgICAgIHZlcnNpb25cbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgZGVwbG95aW5nIGNvbnRyYWN0OlwiLCBlcnIubWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdENoYWluY29kZShcbiAgY29udHJhY3ROYW1lOiBzdHJpbmcsXG4gIHNlcXVlbmNlOiBudW1iZXIgPSAxLFxuICB2ZXJzaW9uOiBzdHJpbmcgPSBcIjEuMFwiLFxuICBjb2xsZWN0aW9uc0NvbmZpZz86IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IGNvbGxlY3Rpb25zRmxhZyA9IGNvbGxlY3Rpb25zQ29uZmlnXG4gICAgPyBgIC0tY29sbGVjdGlvbnMtY29uZmlnIFwiJHtjb2xsZWN0aW9uc0NvbmZpZ31cImBcbiAgICA6IFwiXCI7XG4gIGV4ZWNTeW5jKGBkb2NrZXIgZXhlYyBvcmctYS1wZWVyLTAgbm9kZSAuL3dlYXZlci9saWIvY29yZS9jbGkuY2pzIGNvbW1pdC1jaGFpbmNvZGUgLWQgLXMgXFxcbiAgICAtLW9yZGVyZXItYWRkcmVzcyBvcmctYS1vcmRlcmVyLTA6NzAyMSBcXFxuICAgIC0tY2hhbm5lbC1pZCBzaW1wbGUtY2hhbm5lbCBcXFxuICAgIC0tY2hhaW5jb2RlLW5hbWUgJHtjb250cmFjdE5hbWV9IFxcXG4gICAgLS1jaGFpbmNvZGUtdmVyc2lvbiAke3ZlcnNpb259IFxcXG4gICAgLS1zZXF1ZW5jZSAke3NlcXVlbmNlfSR7Y29sbGVjdGlvbnNGbGFnfSBcXFxuICAgIC0tZW5hYmxlLXRscyBcXFxuICAgIC0tdGxzLWNhLWNlcnQtZmlsZSAvd2VhdmVyL3BlZXIvdGxzLWNhLWNlcnQucGVtIFxcXG4gICAgLS1wZWVyLWFkZHJlc3NlcyBvcmctYS1wZWVyLTA6NzAzMSxvcmctYi1wZWVyLTA6NzAzMixvcmctYy1wZWVyLTA6NzAzMyBcXFxuICAgIC0tcGVlci1yb290LXRscyAuL3dlYXZlci9wZWVyL3Rscy1jYS1jZXJ0LnBlbSwuL3dlYXZlci9wZWVyL29yZy1iLXRscy1jYS1jZXJ0LnBlbSwuL3dlYXZlci9wZWVyL29yZy1jLXRscy1jYS1jZXJ0LnBlbWApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ29udHJhY3RSZWFkaW5lc3MoXG4gIGNvbnRyYWN0TmFtZTogc3RyaW5nLFxuICBkb2NrZXJOYW1lOiBzdHJpbmcgPSBcIm9yZy1hLXBlZXItMFwiLFxuICB0bHNDZXJ0OiBzdHJpbmcgPSBcInRscy1jYS1jZXJ0LnBlbVwiLFxuICBjb3VudGVyID0gMFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICAvLyBQcmVwYXJlIHRoZSBKU09OIGFyZ3VtZW50IGZvciB0aGUgY2hhaW5jb2RlXG4gICAgY29uc3QgY2hhaW5jb2RlQXJncyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGZ1bmN0aW9uOiBcImhlYWx0aGNoZWNrXCIsXG4gICAgICBBcmdzOiBbXSxcbiAgICB9KTtcblxuICAgIGlmIChjb3VudGVyID4gMTApIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIC8vIEludm9rZSB0aGUgY2hhaW5jb2RlXG4gICAgY29uc3QgcmVzID0gZXhlY1N5bmMoXG4gICAgICBgZG9ja2VyIGV4ZWMgJHtkb2NrZXJOYW1lfSBwZWVyIGNoYWluY29kZSBxdWVyeSBcXFxuICAgICAgICAtQyBzaW1wbGUtY2hhbm5lbCBcXFxuICAgICAgICAtbiAke2NvbnRyYWN0TmFtZX0gXFxcbiAgICAgICAgLWMgJyR7Y2hhaW5jb2RlQXJnc30nIFxcXG4gICAgICAgIC0tdGxzIC0tY2FmaWxlIC93ZWF2ZXIvcGVlci8ke3Rsc0NlcnR9YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKHJlcy50b1N0cmluZygpKTtcblxuICAgIHJldHVybiByZXN1bHQuaGVhbHRoY2hlY2sudG9TdHJpbmcoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgY29uc29sZS5sb2coXCJDaGFpbmNvZGUgbm90IHJlYWR5LiBSZXRyeWluZy4uLlwiKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MDAwKSk7IC8vIFdhaXQgZm9yIDUgc2Vjb25kcyBiZWZvcmUgcmV0cnlpbmdcbiAgICByZXR1cm4gZW5zdXJlQ29udHJhY3RSZWFkaW5lc3MoXG4gICAgICBjb250cmFjdE5hbWUsXG4gICAgICBkb2NrZXJOYW1lLFxuICAgICAgdGxzQ2VydCxcbiAgICAgIGNvdW50ZXIrK1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyaW0oc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zb2xlLndhcm4oXCJDb250cmFjdCBub3QgdHJpbW1pbmcgcmVzcG9uc2UgcHJvcGVybHk6IFwiLCBzdHIpO1xuICByZXR1cm4gc3RyLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUNoYWluY29kZShcbiAgY29udHJhY3ROYW1lOiBzdHJpbmcsXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgdHJhbnNpZW50OiBhbnkgPSB7fSxcbiAgZG9ja2VyTmFtZTogc3RyaW5nID0gXCJvcmctYS1wZWVyLTBcIixcbiAgdGxzOiBzdHJpbmcgPSBcInRscy1jYS1jZXJ0LnBlbVwiXG4pIHtcbiAgLy8gUHJlcGFyZSB0aGUgSlNPTiBhcmd1bWVudCBmb3IgdGhlIGNoYWluY29kZVxuICBjb25zdCBjaGFpbmNvZGVBcmdzID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGZ1bmN0aW9uOiBmdW5jdGlvbk5hbWUsXG4gICAgQXJnczogYXJncyxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNpZW50RGF0YSA9IEpTT04uc3RyaW5naWZ5KHRyYW5zaWVudCk7XG4gIGNvbnN0IHRyYW5zaWVudFN0cmluZyA9IGAtLXRyYW5zaWVudCAnJHt0cmFuc2llbnREYXRhfSdgO1xuXG4gIC8vIEludm9rZSB0aGUgY2hhaW5jb2RlXG4gIHJldHVybiBleGVjU3luYyhcbiAgICBgZG9ja2VyIGV4ZWMgJHtkb2NrZXJOYW1lfSBwZWVyIGNoYWluY29kZSBpbnZva2UgXFxcbiAgICAtQyBzaW1wbGUtY2hhbm5lbCBcXFxuICAgIC1uICR7Y29udHJhY3ROYW1lfSBcXFxuICAgIC1jICcke2NoYWluY29kZUFyZ3N9JyBcXFxuICAgIC0tcGVlckFkZHJlc3NlcyBvcmctYS1wZWVyLTA6NzAzMSBcXFxuICAgIC0tdGxzUm9vdENlcnRGaWxlcyAvd2VhdmVyL3BlZXIvdGxzLWNhLWNlcnQucGVtIFxcXG4gICAgLS1wZWVyQWRkcmVzc2VzIG9yZy1iLXBlZXItMDo3MDMyIFxcXG4gICAgLS10bHNSb290Q2VydEZpbGVzIC93ZWF2ZXIvcGVlci9vcmctYi10bHMtY2EtY2VydC5wZW0gXFxcbiAgICAtLXBlZXJBZGRyZXNzZXMgb3JnLWMtcGVlci0wOjcwMzMgXFxcbiAgICAtLXRsc1Jvb3RDZXJ0RmlsZXMgL3dlYXZlci9wZWVyL29yZy1jLXRscy1jYS1jZXJ0LnBlbSBcXFxuICAgIC1vIG9yZy1hLW9yZGVyZXItMDo3MDIxIFxcXG4gICAgLS10bHMgLS1jYWZpbGUgL3dlYXZlci9wZWVyLyR7dGxzfSBcXFxuICAgICR7dHJhbnNpZW50ID8gdHJhbnNpZW50U3RyaW5nIDogXCJcIn1gXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeUNoYWluY29kZShcbiAgY29udHJhY3ROYW1lOiBzdHJpbmcsXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgZG9ja2VyTmFtZTogc3RyaW5nID0gXCJvcmctYS1wZWVyLTBcIixcbiAgdGxzOiBzdHJpbmcgPSBcInRscy1jYS1jZXJ0LnBlbVwiXG4pIHtcbiAgdHJ5IHtcbiAgICAvLyBQcmVwYXJlIHRoZSBKU09OIGFyZ3VtZW50IGZvciB0aGUgY2hhaW5jb2RlXG4gICAgY29uc3QgY2hhaW5jb2RlQXJncyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGZ1bmN0aW9uOiBmdW5jdGlvbk5hbWUsXG4gICAgICBBcmdzOiBhcmdzLFxuICAgIH0pO1xuXG4gICAgLy8gSW52b2tlIHRoZSBjaGFpbmNvZGVcbiAgICBjb25zdCByZXMgPSBleGVjU3luYyhcbiAgICAgIGBkb2NrZXIgZXhlYyAke2RvY2tlck5hbWV9IHBlZXIgY2hhaW5jb2RlIHF1ZXJ5IFxcXG4gICAgICAgIC1DIHNpbXBsZS1jaGFubmVsIFxcXG4gICAgICAgIC1uICR7Y29udHJhY3ROYW1lfSBcXFxuICAgICAgICAtYyAnJHtjaGFpbmNvZGVBcmdzfScgXFxcbiAgICAgICAgLS10bHMgLS1jYWZpbGUgJHt0bHN9YFxuICAgICk7XG5cbiAgICBjb25zdCBwcm9jZXNzZWQgPSByZXMudG9TdHJpbmcoKTtcbiAgICBjb25zb2xlLmxvZyhcIkJsb2NrY2hhaW4gcmVhZDpcIiwgcHJvY2Vzc2VkKTtcblxuICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgY29uc29sZS5sb2coXCJGYWlsZWQgdG8gcmVhZCBibG9ja2NoYWluXCIpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlUHJpdmF0ZUNoYWluY29kZShcbiAgY29udHJhY3ROYW1lOiBzdHJpbmcsXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgdHJhbnNpZW50OiBhbnkgPSB7fSxcbiAgZG9ja2VyTmFtZTogc3RyaW5nID0gXCJvcmctYS1wZWVyLTBcIixcbiAgdGxzOiBzdHJpbmcgPSBcInRscy1jYS1jZXJ0LnBlbVwiXG4pIHtcbiAgLy8gUHJlcGFyZSB0aGUgSlNPTiBhcmd1bWVudCBmb3IgdGhlIGNoYWluY29kZVxuICBjb25zdCBjaGFpbmNvZGVBcmdzID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGZ1bmN0aW9uOiBmdW5jdGlvbk5hbWUsXG4gICAgQXJnczogYXJncyxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNpZW50RGF0YSA9IEpTT04uc3RyaW5naWZ5KHRyYW5zaWVudCk7XG4gIGNvbnN0IHRyYW5zaWVudFN0cmluZyA9IGAtLXRyYW5zaWVudCAnJHt0cmFuc2llbnREYXRhfSdgO1xuXG4gIC8vIEludm9rZSB0aGUgY2hhaW5jb2RlXG4gIHJldHVybiBleGVjU3luYyhcbiAgICBgZG9ja2VyIGV4ZWMgJHtkb2NrZXJOYW1lfSBwZWVyIGNoYWluY29kZSBpbnZva2UgXFxcbiAgICAtQyBzaW1wbGUtY2hhbm5lbCBcXFxuICAgIC1uICR7Y29udHJhY3ROYW1lfSBcXFxuICAgIC1jICcke2NoYWluY29kZUFyZ3N9JyBcXFxuICAgIC0tcGVlckFkZHJlc3NlcyBvcmctYS1wZWVyLTA6NzAzMSBcXFxuICAgIC0tdGxzUm9vdENlcnRGaWxlcyAvd2VhdmVyL3BlZXIvdGxzLWNhLWNlcnQucGVtIFxcXG4gICAgLW8gb3JnLWEtb3JkZXJlci0wOjcwMjEgXFxcbiAgICAtLXRscyAtLWNhZmlsZSAvd2VhdmVyL3BlZXIvJHt0bHN9IFxcXG4gICAgJHt0cmFuc2llbnQgPyB0cmFuc2llbnRTdHJpbmcgOiBcIlwifWBcbiAgKTtcblxuICAvLyAgIC0tcGVlckFkZHJlc3NlcyBvcmctYi1wZWVyLTA6NzAzMiBcXFxuICAvLyAtLXRsc1Jvb3RDZXJ0RmlsZXMgL3dlYXZlci9wZWVyL29yZy1iLXRscy1jYS1jZXJ0LnBlbSBcXFxuICAvLyAtLXBlZXJBZGRyZXNzZXMgb3JnLWMtcGVlci0wOjcwMzMgXFxcbiAgLy8gLS10bHNSb290Q2VydEZpbGVzIC93ZWF2ZXIvcGVlci9vcmctYy10bHMtY2EtY2VydC5wZW0gXFxcbn1cblxuZXhwb3J0IGVudW0gU2NyaXB0Q29tbWFuZHMge1xuICBTVEFSVCA9IFwiZmFicmljLWNoYWluY29kZS1ub2RlIHN0YXJ0IFxcXG4gICAgICAgICAgLS1ncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoICR7Q0hBSU5DT0RFX01BWFJFQ1ZNU0dTSVpFLTE1NzI4NjQwfSBcXFxuICAgICAgICAgIC0tZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aCAke0NIQUlOQ09ERV9NQVhTRU5ETVNHU0laRS0xNTcyODY0MH0gXCIsXG4gIFNUQVJUX0NDQUFTID0gXCJmYWJyaWMtY2hhaW5jb2RlLW5vZGUgc2VydmVyIFxcXG4gICAgICAgICAgLS1jaGFpbmNvZGUtYWRkcmVzcz0kQ0hBSU5DT0RFX1NFUlZFUl9BRERSRVNTIFxcXG4gICAgICAgICAgLS1jaGFpbmNvZGUtaWQ9JENIQUlOQ09ERV9JRCBcXFxuICAgICAgICAgIC0tY2hhaW5jb2RlLXRscy1jZXJ0LWZpbGU9JHtDSEFJTkNPREVfVExTX0NFUlR9IFxcXG4gICAgICAgICAgLS1jaGFpbmNvZGUtdGxzLWtleS1maWxlPSR7Q0hBSU5DT0RFX1RMU19LRVl9IFxcXG4gICAgICAgICAgLS1ncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoICR7Q0hBSU5DT0RFX01BWFJFQ1ZNU0dTSVpFLTE1NzI4NjQwfSBcXFxuICAgICAgICAgIC0tZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aCAke0NIQUlOQ09ERV9NQVhTRU5ETVNHU0laRS0xNTcyODY0MH0gXFxcbiAgICAgICAgICAtLXRscy5lbmFibGVkPXRydWVcIixcbiAgU1RBUlRfQ0NBQVNfREVCVUcgPSBcIm5vZGUgLS1pbnNwZWN0PTAuMC4wLjA6OTIyOSAuL25vZGVfbW9kdWxlcy8uYmluL2ZhYnJpYy1jaGFpbmNvZGUtbm9kZSBzZXJ2ZXIgXFxcbiAgICAgICAgICAtLWNoYWluY29kZS1hZGRyZXNzPSRDSEFJTkNPREVfU0VSVkVSX0FERFJFU1MgXFxcbiAgICAgICAgICAtLWNoYWluY29kZS1pZD0kQ0hBSU5DT0RFX0lEIFxcXG4gICAgICAgICAgLS1jaGFpbmNvZGUtdGxzLWNlcnQtZmlsZT0ke0NIQUlOQ09ERV9UTFNfQ0VSVH0gXFxcbiAgICAgICAgICAtLWNoYWluY29kZS10bHMta2V5LWZpbGU9JHtDSEFJTkNPREVfVExTX0tFWX0gXFxcbiAgICAgICAgICAtLWdycGMubWF4X3JlY2VpdmVfbWVzc2FnZV9sZW5ndGggJHtDSEFJTkNPREVfTUFYUkVDVk1TR1NJWkUtMTU3Mjg2NDB9IFxcXG4gICAgICAgICAgLS1ncnBjLm1heF9zZW5kX21lc3NhZ2VfbGVuZ3RoICR7Q0hBSU5DT0RFX01BWFNFTkRNU0dTSVpFLTE1NzI4NjQwfSBcXFxuICAgICAgICAgIC0tdGxzLmVuYWJsZWQ9dHJ1ZVwiLFxuICBTVEFSVF9ERUJVRyA9IFwibm9kZSAtLWluc3BlY3Q9MC4wLjAuMDo5MjI5IC91c3IvbG9jYWwvc3JjL25vZGVfbW9kdWxlcy8uYmluL2ZhYnJpYy1jaGFpbmNvZGUtbm9kZSBzdGFydCBcXFxuICAgICAgICAgIC0tZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aCAke0NIQUlOQ09ERV9NQVhSRUNWTVNHU0laRS0xNTcyODY0MH0gXFxcbiAgICAgICAgICAtLWdycGMubWF4X3NlbmRfbWVzc2FnZV9sZW5ndGggJHtDSEFJTkNPREVfTUFYU0VORE1TR1NJWkUtMTU3Mjg2NDB9XCIsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cmFjdFN0YXJ0Q29tbWFuZChcbiAgZGVidWc6IGJvb2xlYW4sXG4gIGNjYWFzOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBpZiAoY2NhYXMpIHtcbiAgICByZXR1cm4gZGVidWdcbiAgICAgID8gU2NyaXB0Q29tbWFuZHMuU1RBUlRfQ0NBQVNfREVCVUdcbiAgICAgIDogU2NyaXB0Q29tbWFuZHMuU1RBUlRfQ0NBQVM7XG4gIH1cbiAgcmV0dXJuIGRlYnVnID8gU2NyaXB0Q29tbWFuZHMuU1RBUlRfREVCVUcgOiBTY3JpcHRDb21tYW5kcy5TVEFSVDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGlhZ25vc3RpY3MoZGlhZ3M6IHJlYWRvbmx5IHRzLkRpYWdub3N0aWNbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGhvc3Q6IHRzLkZvcm1hdERpYWdub3N0aWNzSG9zdCA9IHtcbiAgICBnZXRDYW5vbmljYWxGaWxlTmFtZTogKGYpID0+IGYsXG4gICAgZ2V0Q3VycmVudERpcmVjdG9yeTogdHMuc3lzLmdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgZ2V0TmV3TGluZTogKCkgPT4gdHMuc3lzLm5ld0xpbmUsXG4gIH07XG4gIHJldHVybiB0cy5mb3JtYXREaWFnbm9zdGljc1dpdGhDb2xvckFuZENvbnRleHQoZGlhZ3MsIGhvc3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVdpdGhUc2NvbmZpZ092ZXJyaWRlcyhcbiAgdHNjb25maWdQYXRoOiBzdHJpbmcsXG4gIG92ZXJyaWRlczogUGFydGlhbDx0cy5Db21waWxlck9wdGlvbnM+XG4pOiB2b2lkIHtcbiAgY29uc3QgYWJzQ29uZmlnUGF0aCA9IHBhdGguaXNBYnNvbHV0ZSh0c2NvbmZpZ1BhdGgpXG4gICAgPyB0c2NvbmZpZ1BhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCB0c2NvbmZpZ1BhdGgpO1xuXG4gIC8vIDEpIFJlYWQgdGhlIHRzY29uZmlnLmpzb25cbiAgY29uc3QgY29uZmlnRmlsZSA9IHRzLnJlYWRDb25maWdGaWxlKGFic0NvbmZpZ1BhdGgsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGlmIChjb25maWdGaWxlLmVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdERpYWdub3N0aWNzKFtjb25maWdGaWxlLmVycm9yXSkpO1xuICB9XG5cbiAgLy8gMikgUGFyc2UgaXQgKHJlc29sdmVzIFwiZXh0ZW5kc1wiLCBpbmNsdWRlL2V4Y2x1ZGUvZmlsZXMsIGV0Yy4pXG4gIGNvbnN0IGNvbmZpZ0RpciA9IHBhdGguZGlybmFtZShhYnNDb25maWdQYXRoKTtcbiAgY29uc3QgcGFyc2VkID0gdHMucGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQoXG4gICAgY29uZmlnRmlsZS5jb25maWcsXG4gICAgdHMuc3lzLFxuICAgIGNvbmZpZ0RpcixcbiAgICAvKmV4aXN0aW5nT3B0aW9ucyovIHVuZGVmaW5lZCxcbiAgICBhYnNDb25maWdQYXRoXG4gICk7XG5cbiAgaWYgKHBhcnNlZC5lcnJvcnMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdERpYWdub3N0aWNzKHBhcnNlZC5lcnJvcnMpKTtcbiAgfVxuXG4gIC8vIDMpIE92ZXJyaWRlIGNvbXBpbGVyIG9wdGlvbnMgaW4tbWVtb3J5XG4gIGNvbnN0IG9wdGlvbnM6IHRzLkNvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAuLi5wYXJzZWQub3B0aW9ucyxcbiAgICAuLi5vdmVycmlkZXMsXG4gIH07XG5cbiAgLy8gT3B0aW9uYWw6IElmIHlvdSBvdmVycmlkZSBvdXREaXIvcm9vdERpciwgZW5zdXJlIHRoZXnigJlyZSBhYnNvbHV0ZVxuICAvLyB0byBhdm9pZCBzdXJwcmlzZXMgZGVwZW5kaW5nIG9uIENXRC5cbiAgaWYgKG9wdGlvbnMub3V0RGlyKSBvcHRpb25zLm91dERpciA9IHBhdGgucmVzb2x2ZShjb25maWdEaXIsIG9wdGlvbnMub3V0RGlyKTtcbiAgaWYgKG9wdGlvbnMucm9vdERpcilcbiAgICBvcHRpb25zLnJvb3REaXIgPSBwYXRoLnJlc29sdmUoY29uZmlnRGlyLCBvcHRpb25zLnJvb3REaXIpO1xuXG4gIC8vIDQpIENyZWF0ZSBwcm9ncmFtICsgZW1pdFxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbSh7XG4gICAgcm9vdE5hbWVzOiBwYXJzZWQuZmlsZU5hbWVzLFxuICAgIG9wdGlvbnMsXG4gICAgcHJvamVjdFJlZmVyZW5jZXM6IHBhcnNlZC5wcm9qZWN0UmVmZXJlbmNlcyxcbiAgfSk7XG5cbiAgY29uc3QgcHJlRW1pdCA9IHRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKTtcbiAgaWYgKHByZUVtaXQubGVuZ3RoKSB7XG4gICAgLy8gSWYgeW91IHdhbnQgXCJ0cmFuc3BpbGUgYW55d2F5XCIsIHlvdSBjYW4gY2hvb3NlIHRvIG5vdCB0aHJvdyBoZXJlLlxuICAgIHRocm93IG5ldyBFcnJvcihmb3JtYXREaWFnbm9zdGljcyhwcmVFbWl0KSk7XG4gIH1cblxuICBjb25zdCBlbWl0UmVzdWx0ID0gcHJvZ3JhbS5lbWl0KCk7XG4gIGNvbnN0IGVtaXREaWFnbm9zdGljcyA9IGVtaXRSZXN1bHQuZGlhZ25vc3RpY3MgPz8gW107XG4gIGlmIChlbWl0RGlhZ25vc3RpY3MubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdERpYWdub3N0aWNzKGVtaXREaWFnbm9zdGljcykpO1xuICB9XG5cbiAgaWYgKGVtaXRSZXN1bHQuZW1pdFNraXBwZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbWl0IHdhcyBza2lwcGVkIChjaGVjayBkaWFnbm9zdGljcyBhYm92ZSkuXCIpO1xuICB9XG59XG4iXX0=
|