@cybrid/cybrid-api-bank-angular 0.123.558 → 0.123.559
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 +2 -2
- package/esm2020/api/accounts.service.mjs +2 -2
- package/esm2020/api/assets.service.mjs +2 -2
- package/esm2020/api/banks.service.mjs +2 -2
- package/esm2020/api/counterparties.service.mjs +2 -2
- package/esm2020/api/customers.service.mjs +2 -2
- package/esm2020/api/depositAddresses.service.mjs +2 -2
- package/esm2020/api/depositBankAccounts.service.mjs +2 -2
- package/esm2020/api/externalBankAccounts.service.mjs +2 -2
- package/esm2020/api/externalWallets.service.mjs +2 -2
- package/esm2020/api/files.service.mjs +2 -2
- package/esm2020/api/identityVerifications.service.mjs +2 -2
- package/esm2020/api/invoices.service.mjs +2 -2
- package/esm2020/api/paymentInstructions.service.mjs +2 -2
- package/esm2020/api/personaSessions.service.mjs +2 -2
- package/esm2020/api/prices.service.mjs +2 -2
- package/esm2020/api/quotes.service.mjs +2 -2
- package/esm2020/api/symbols.service.mjs +2 -2
- package/esm2020/api/trades.service.mjs +2 -2
- package/esm2020/api/transfers.service.mjs +2 -2
- package/esm2020/api/workflows.service.mjs +2 -2
- package/esm2020/model/account.mjs +2 -2
- package/esm2020/model/accountList.mjs +1 -1
- package/esm2020/model/accountState.mjs +2 -2
- package/esm2020/model/accountType.mjs +2 -2
- package/esm2020/model/activityLimit.mjs +2 -2
- package/esm2020/model/activitySide.mjs +2 -2
- package/esm2020/model/activityType.mjs +2 -2
- package/esm2020/model/asset.mjs +2 -2
- package/esm2020/model/assetList.mjs +1 -1
- package/esm2020/model/assetTypes.mjs +2 -2
- package/esm2020/model/bank.mjs +1 -1
- package/esm2020/model/bankFeature.mjs +2 -2
- package/esm2020/model/bankList.mjs +1 -1
- package/esm2020/model/bankSupportedPayoutSymbolsInner.mjs +2 -2
- package/esm2020/model/bankType.mjs +2 -2
- package/esm2020/model/complianceCheck.mjs +2 -2
- package/esm2020/model/complianceCheckOutcome.mjs +2 -2
- package/esm2020/model/complianceCheckType.mjs +2 -2
- package/esm2020/model/complianceDecision.mjs +2 -2
- package/esm2020/model/complianceDecisionState.mjs +2 -2
- package/esm2020/model/complianceDecisionType.mjs +2 -2
- package/esm2020/model/counterparty.mjs +1 -1
- package/esm2020/model/counterpartyAddress.mjs +2 -2
- package/esm2020/model/counterpartyAliasesInner.mjs +2 -2
- package/esm2020/model/counterpartyList.mjs +1 -1
- package/esm2020/model/counterpartyName.mjs +2 -2
- package/esm2020/model/counterpartyState.mjs +2 -2
- package/esm2020/model/counterpartyType.mjs +2 -2
- package/esm2020/model/customer.mjs +1 -1
- package/esm2020/model/customerAddress.mjs +2 -2
- package/esm2020/model/customerAliasesInner.mjs +2 -2
- package/esm2020/model/customerList.mjs +1 -1
- package/esm2020/model/customerName.mjs +2 -2
- package/esm2020/model/customerState.mjs +2 -2
- package/esm2020/model/customerType.mjs +2 -2
- package/esm2020/model/depositAddress.mjs +2 -2
- package/esm2020/model/depositAddressFormat.mjs +2 -2
- package/esm2020/model/depositAddressList.mjs +1 -1
- package/esm2020/model/depositAddressState.mjs +2 -2
- package/esm2020/model/depositBankAccount.mjs +1 -1
- package/esm2020/model/depositBankAccountAccountDetailsInner.mjs +2 -2
- package/esm2020/model/depositBankAccountCounterpartyAddress.mjs +2 -2
- package/esm2020/model/depositBankAccountList.mjs +1 -1
- package/esm2020/model/depositBankAccountRoutingDetailsInner.mjs +2 -2
- package/esm2020/model/depositBankAccountRoutingNumberType.mjs +2 -2
- package/esm2020/model/depositBankAccountState.mjs +2 -2
- package/esm2020/model/errorResponse.mjs +2 -2
- package/esm2020/model/externalBankAccount.mjs +1 -1
- package/esm2020/model/externalBankAccountBalances.mjs +2 -2
- package/esm2020/model/externalBankAccountKind.mjs +2 -2
- package/esm2020/model/externalBankAccountList.mjs +1 -1
- package/esm2020/model/externalBankAccountPiiInner.mjs +1 -1
- package/esm2020/model/externalBankAccountPiiInnerAddressesInner.mjs +2 -2
- package/esm2020/model/externalBankAccountPiiInnerRoutingDetailsInner.mjs +2 -2
- package/esm2020/model/externalBankAccountState.mjs +2 -2
- package/esm2020/model/externalWallet.mjs +2 -2
- package/esm2020/model/externalWalletEnvironment.mjs +2 -2
- package/esm2020/model/externalWalletList.mjs +1 -1
- package/esm2020/model/externalWalletState.mjs +2 -2
- package/esm2020/model/identificationNumber.mjs +2 -2
- package/esm2020/model/identityVerification.mjs +1 -1
- package/esm2020/model/identityVerificationBusinessAssociate.mjs +2 -2
- package/esm2020/model/identityVerificationDocument.mjs +1 -1
- package/esm2020/model/identityVerificationDocumentFile.mjs +2 -2
- package/esm2020/model/identityVerificationList.mjs +1 -1
- package/esm2020/model/identityVerificationMethod.mjs +2 -2
- package/esm2020/model/identityVerificationOutcome.mjs +2 -2
- package/esm2020/model/identityVerificationPersonaState.mjs +2 -2
- package/esm2020/model/identityVerificationState.mjs +2 -2
- package/esm2020/model/identityVerificationType.mjs +2 -2
- package/esm2020/model/identityVerificationWithDetails.mjs +1 -1
- package/esm2020/model/identityVerificationWithDetailsPii.mjs +1 -1
- package/esm2020/model/identityVerificationWithDetailsPiiAddress.mjs +2 -2
- package/esm2020/model/identityVerificationWithDetailsPiiAliasesInner.mjs +2 -2
- package/esm2020/model/identityVerificationWithDetailsPiiName.mjs +2 -2
- package/esm2020/model/invoice.mjs +2 -2
- package/esm2020/model/invoiceList.mjs +1 -1
- package/esm2020/model/patchBank.mjs +1 -1
- package/esm2020/model/patchCustomer.mjs +2 -2
- package/esm2020/model/patchExternalBankAccount.mjs +2 -2
- package/esm2020/model/patchTransfer.mjs +1 -1
- package/esm2020/model/patchTransferParticipant.mjs +2 -2
- package/esm2020/model/paymentInstruction.mjs +2 -2
- package/esm2020/model/paymentInstructionList.mjs +1 -1
- package/esm2020/model/personaSession.mjs +2 -2
- package/esm2020/model/platformFile.mjs +2 -2
- package/esm2020/model/platformFileList.mjs +1 -1
- package/esm2020/model/postAccount.mjs +2 -2
- package/esm2020/model/postBank.mjs +1 -1
- package/esm2020/model/postCounterparty.mjs +1 -1
- package/esm2020/model/postCounterpartyAddress.mjs +2 -2
- package/esm2020/model/postCounterpartyAliasesInner.mjs +2 -2
- package/esm2020/model/postCounterpartyName.mjs +2 -2
- package/esm2020/model/postCustomer.mjs +1 -1
- package/esm2020/model/postCustomerAddress.mjs +2 -2
- package/esm2020/model/postCustomerAliasesInner.mjs +2 -2
- package/esm2020/model/postCustomerName.mjs +2 -2
- package/esm2020/model/postDepositAddress.mjs +2 -2
- package/esm2020/model/postDepositBankAccount.mjs +2 -2
- package/esm2020/model/postExternalBankAccount.mjs +1 -1
- package/esm2020/model/postExternalBankAccountCounterpartyAddress.mjs +2 -2
- package/esm2020/model/postExternalBankAccountCounterpartyBankAccount.mjs +2 -2
- package/esm2020/model/postExternalBankAccountCounterpartyName.mjs +2 -2
- package/esm2020/model/postExternalWallet.mjs +2 -2
- package/esm2020/model/postFee.mjs +2 -2
- package/esm2020/model/postFile.mjs +2 -2
- package/esm2020/model/postIdentificationNumber.mjs +2 -2
- package/esm2020/model/postIdentityVerification.mjs +1 -1
- package/esm2020/model/postIdentityVerificationAddress.mjs +2 -2
- package/esm2020/model/postIdentityVerificationAliasesInner.mjs +2 -2
- package/esm2020/model/postIdentityVerificationName.mjs +2 -2
- package/esm2020/model/postInvoice.mjs +2 -2
- package/esm2020/model/postPaymentInstruction.mjs +2 -2
- package/esm2020/model/postPersonaSession.mjs +2 -2
- package/esm2020/model/postQuote.mjs +1 -1
- package/esm2020/model/postQuoteEntry.mjs +2 -2
- package/esm2020/model/postSupportedPayoutSymbols.mjs +2 -2
- package/esm2020/model/postTrade.mjs +2 -2
- package/esm2020/model/postTransfer.mjs +1 -1
- package/esm2020/model/postTransferParticipant.mjs +2 -2
- package/esm2020/model/postUltimateBeneficialOwner.mjs +2 -2
- package/esm2020/model/postWorkflow.mjs +2 -2
- package/esm2020/model/quote.mjs +1 -1
- package/esm2020/model/quoteEntry.mjs +1 -1
- package/esm2020/model/quoteEntryDestinationAccount.mjs +2 -2
- package/esm2020/model/quoteEntrySourceAccount.mjs +2 -2
- package/esm2020/model/quoteList.mjs +1 -1
- package/esm2020/model/quoteSide.mjs +2 -2
- package/esm2020/model/quoteType.mjs +2 -2
- package/esm2020/model/symbolPrice.mjs +2 -2
- package/esm2020/model/trade.mjs +2 -2
- package/esm2020/model/tradeFailureCode.mjs +2 -2
- package/esm2020/model/tradeList.mjs +1 -1
- package/esm2020/model/tradeSide.mjs +2 -2
- package/esm2020/model/tradeState.mjs +2 -2
- package/esm2020/model/tradeType.mjs +2 -2
- package/esm2020/model/transfer.mjs +1 -1
- package/esm2020/model/transferAccountType.mjs +2 -2
- package/esm2020/model/transferDestinationAccount.mjs +2 -2
- package/esm2020/model/transferEntry.mjs +1 -1
- package/esm2020/model/transferEntryDestinationAccount.mjs +2 -2
- package/esm2020/model/transferFailureCode.mjs +2 -2
- package/esm2020/model/transferList.mjs +1 -1
- package/esm2020/model/transferParticipant.mjs +2 -2
- package/esm2020/model/transferSide.mjs +2 -2
- package/esm2020/model/transferSourceAccount.mjs +2 -2
- package/esm2020/model/transferState.mjs +2 -2
- package/esm2020/model/transferType.mjs +2 -2
- package/esm2020/model/workflow.mjs +2 -2
- package/esm2020/model/workflowState.mjs +2 -2
- package/esm2020/model/workflowType.mjs +2 -2
- package/esm2020/model/workflowWithDetails.mjs +1 -1
- package/esm2020/model/workflowWithDetailsAllOf.mjs +2 -2
- package/esm2020/model/workflowsList.mjs +1 -1
- package/fesm2015/cybrid-cybrid-api-bank-angular.mjs +77 -77
- package/fesm2015/cybrid-cybrid-api-bank-angular.mjs.map +1 -1
- package/fesm2020/cybrid-cybrid-api-bank-angular.mjs +133 -133
- package/fesm2020/cybrid-cybrid-api-bank-angular.mjs.map +1 -1
- package/model/account.d.ts +1 -1
- package/model/accountList.d.ts +1 -1
- package/model/accountState.d.ts +1 -1
- package/model/accountType.d.ts +1 -1
- package/model/activityLimit.d.ts +1 -1
- package/model/activitySide.d.ts +1 -1
- package/model/activityType.d.ts +1 -1
- package/model/asset.d.ts +1 -1
- package/model/assetList.d.ts +1 -1
- package/model/assetTypes.d.ts +1 -1
- package/model/bank.d.ts +1 -1
- package/model/bankFeature.d.ts +1 -1
- package/model/bankList.d.ts +1 -1
- package/model/bankSupportedPayoutSymbolsInner.d.ts +1 -1
- package/model/bankType.d.ts +1 -1
- package/model/complianceCheck.d.ts +1 -1
- package/model/complianceCheckOutcome.d.ts +1 -1
- package/model/complianceCheckType.d.ts +1 -1
- package/model/complianceDecision.d.ts +1 -1
- package/model/complianceDecisionState.d.ts +1 -1
- package/model/complianceDecisionType.d.ts +1 -1
- package/model/counterparty.d.ts +1 -1
- package/model/counterpartyAddress.d.ts +1 -1
- package/model/counterpartyAliasesInner.d.ts +1 -1
- package/model/counterpartyList.d.ts +1 -1
- package/model/counterpartyName.d.ts +1 -1
- package/model/counterpartyState.d.ts +1 -1
- package/model/counterpartyType.d.ts +1 -1
- package/model/customer.d.ts +1 -1
- package/model/customerAddress.d.ts +1 -1
- package/model/customerAliasesInner.d.ts +1 -1
- package/model/customerList.d.ts +1 -1
- package/model/customerName.d.ts +1 -1
- package/model/customerState.d.ts +1 -1
- package/model/customerType.d.ts +1 -1
- package/model/depositAddress.d.ts +1 -1
- package/model/depositAddressFormat.d.ts +1 -1
- package/model/depositAddressList.d.ts +1 -1
- package/model/depositAddressState.d.ts +1 -1
- package/model/depositBankAccount.d.ts +1 -1
- package/model/depositBankAccountAccountDetailsInner.d.ts +1 -1
- package/model/depositBankAccountCounterpartyAddress.d.ts +1 -1
- package/model/depositBankAccountList.d.ts +1 -1
- package/model/depositBankAccountRoutingDetailsInner.d.ts +1 -1
- package/model/depositBankAccountRoutingNumberType.d.ts +1 -1
- package/model/depositBankAccountState.d.ts +1 -1
- package/model/errorResponse.d.ts +1 -1
- package/model/externalBankAccount.d.ts +1 -1
- package/model/externalBankAccountBalances.d.ts +1 -1
- package/model/externalBankAccountKind.d.ts +1 -1
- package/model/externalBankAccountList.d.ts +1 -1
- package/model/externalBankAccountPiiInner.d.ts +1 -1
- package/model/externalBankAccountPiiInnerAddressesInner.d.ts +1 -1
- package/model/externalBankAccountPiiInnerRoutingDetailsInner.d.ts +1 -1
- package/model/externalBankAccountState.d.ts +1 -1
- package/model/externalWallet.d.ts +1 -1
- package/model/externalWalletEnvironment.d.ts +1 -1
- package/model/externalWalletList.d.ts +1 -1
- package/model/externalWalletState.d.ts +1 -1
- package/model/identificationNumber.d.ts +1 -1
- package/model/identityVerification.d.ts +1 -1
- package/model/identityVerificationBusinessAssociate.d.ts +1 -1
- package/model/identityVerificationDocument.d.ts +1 -1
- package/model/identityVerificationDocumentFile.d.ts +1 -1
- package/model/identityVerificationList.d.ts +1 -1
- package/model/identityVerificationMethod.d.ts +1 -1
- package/model/identityVerificationOutcome.d.ts +1 -1
- package/model/identityVerificationPersonaState.d.ts +1 -1
- package/model/identityVerificationState.d.ts +1 -1
- package/model/identityVerificationType.d.ts +1 -1
- package/model/identityVerificationWithDetails.d.ts +1 -1
- package/model/identityVerificationWithDetailsPii.d.ts +1 -1
- package/model/identityVerificationWithDetailsPiiAddress.d.ts +1 -1
- package/model/identityVerificationWithDetailsPiiAliasesInner.d.ts +1 -1
- package/model/identityVerificationWithDetailsPiiName.d.ts +1 -1
- package/model/invoice.d.ts +1 -1
- package/model/invoiceList.d.ts +1 -1
- package/model/patchBank.d.ts +1 -1
- package/model/patchCustomer.d.ts +1 -1
- package/model/patchExternalBankAccount.d.ts +1 -1
- package/model/patchTransfer.d.ts +1 -1
- package/model/patchTransferParticipant.d.ts +1 -1
- package/model/paymentInstruction.d.ts +1 -1
- package/model/paymentInstructionList.d.ts +1 -1
- package/model/personaSession.d.ts +1 -1
- package/model/platformFile.d.ts +1 -1
- package/model/platformFileList.d.ts +1 -1
- package/model/postAccount.d.ts +1 -1
- package/model/postBank.d.ts +1 -1
- package/model/postCounterparty.d.ts +1 -1
- package/model/postCounterpartyAddress.d.ts +1 -1
- package/model/postCounterpartyAliasesInner.d.ts +1 -1
- package/model/postCounterpartyName.d.ts +1 -1
- package/model/postCustomer.d.ts +1 -1
- package/model/postCustomerAddress.d.ts +1 -1
- package/model/postCustomerAliasesInner.d.ts +1 -1
- package/model/postCustomerName.d.ts +1 -1
- package/model/postDepositAddress.d.ts +1 -1
- package/model/postDepositBankAccount.d.ts +1 -1
- package/model/postExternalBankAccount.d.ts +1 -1
- package/model/postExternalBankAccountCounterpartyAddress.d.ts +1 -1
- package/model/postExternalBankAccountCounterpartyBankAccount.d.ts +1 -1
- package/model/postExternalBankAccountCounterpartyName.d.ts +1 -1
- package/model/postExternalWallet.d.ts +1 -1
- package/model/postFee.d.ts +1 -1
- package/model/postFile.d.ts +1 -1
- package/model/postIdentificationNumber.d.ts +1 -1
- package/model/postIdentityVerification.d.ts +1 -1
- package/model/postIdentityVerificationAddress.d.ts +1 -1
- package/model/postIdentityVerificationAliasesInner.d.ts +1 -1
- package/model/postIdentityVerificationName.d.ts +1 -1
- package/model/postInvoice.d.ts +1 -1
- package/model/postPaymentInstruction.d.ts +1 -1
- package/model/postPersonaSession.d.ts +1 -5
- package/model/postQuote.d.ts +1 -1
- package/model/postQuoteEntry.d.ts +1 -1
- package/model/postSupportedPayoutSymbols.d.ts +1 -1
- package/model/postTrade.d.ts +1 -1
- package/model/postTransfer.d.ts +1 -1
- package/model/postTransferParticipant.d.ts +1 -1
- package/model/postUltimateBeneficialOwner.d.ts +1 -1
- package/model/postWorkflow.d.ts +1 -1
- package/model/quote.d.ts +1 -1
- package/model/quoteEntry.d.ts +1 -1
- package/model/quoteEntryDestinationAccount.d.ts +1 -1
- package/model/quoteEntrySourceAccount.d.ts +1 -1
- package/model/quoteList.d.ts +1 -1
- package/model/quoteSide.d.ts +1 -1
- package/model/quoteType.d.ts +1 -1
- package/model/symbolPrice.d.ts +1 -1
- package/model/trade.d.ts +1 -1
- package/model/tradeFailureCode.d.ts +1 -1
- package/model/tradeList.d.ts +1 -1
- package/model/tradeSide.d.ts +1 -1
- package/model/tradeState.d.ts +1 -1
- package/model/tradeType.d.ts +1 -1
- package/model/transfer.d.ts +1 -1
- package/model/transferAccountType.d.ts +1 -1
- package/model/transferDestinationAccount.d.ts +1 -1
- package/model/transferEntry.d.ts +1 -1
- package/model/transferEntryDestinationAccount.d.ts +1 -1
- package/model/transferFailureCode.d.ts +1 -1
- package/model/transferList.d.ts +1 -1
- package/model/transferParticipant.d.ts +1 -1
- package/model/transferSide.d.ts +1 -1
- package/model/transferSourceAccount.d.ts +1 -1
- package/model/transferState.d.ts +1 -1
- package/model/transferType.d.ts +1 -1
- package/model/workflow.d.ts +1 -1
- package/model/workflowState.d.ts +1 -1
- package/model/workflowType.d.ts +1 -1
- package/model/workflowWithDetailsAllOf.d.ts +1 -1
- package/model/workflowsList.d.ts +1 -1
- package/package.json +1 -1
@@ -2,7 +2,7 @@
|
|
2
2
|
* Cybrid Bank API
|
3
3
|
* # Cybrid API documentation Welcome to Cybrid, an all-in-one crypto platform that enables you to easily **build** and **launch** white-label crypto products or services. In these documents, you\'ll find details on how our REST API operates and generally how our platform functions. If you\'re looking for our UI SDK Widgets for Web or Mobile (iOS/Android), generated API clients, or demo applications, head over to our [Github repo](https://github.com/Cybrid-app). 💡 We recommend bookmarking the [Cybrid LinkTree](https://linktr.ee/cybridtechnologies) which contains many helpful links to platform resources. ## Getting Started This is Cybrid\'s public interactive API documentation, which allows you to fully test our APIs. If you\'d like to use a different tool to exercise our APIs, you can download the [Open API 3.0 yaml](https://bank.production.cybrid.app/api/schema/v1/swagger.yaml) for import. If you\'re new to our APIs and the Cybrid Platform, follow the below guides to get set up and familiar with the platform: 1. [Introduction](https://docs.cybrid.xyz/docs/introduction) 2. [Platform Introduction](https://docs.cybrid.xyz/docs/how-is-cybrid-architected) 3. [Testing with Hosted Web Demo App](https://docs.cybrid.xyz/docs/testing-with-hosted-web-demo-app) In [Getting Started in the Cybrid Sandbox](https://docs.cybrid.xyz/docs/how-do-i-get-started-with-the-sandbox), we walk you through how to use the [Cybrid Sandbox](https://id.sandbox.cybrid.app/) to create a test bank and generate API keys. In [Getting Ready for Trading](https://kb.cybrid.xyz/getting-ready-for-trading), we walk through creating customers, customer identities, accounts, as well as executing quotes and trades. ## Working with the Cybrid Platform There are three primary ways you can interact with the Cybrid platform: 1. Directly via our RESTful API (this documentation) 2. Using our API clients available in a variety of languages ([Angular](https://github.com/Cybrid-app/cybrid-api-bank-angular), [Java](https://github.com/Cybrid-app/cybrid-api-bank-java), [Kotlin](https://github.com/Cybrid-app/cybrid-api-bank-kotlin), [Python](https://github.com/Cybrid-app/cybrid-api-bank-python), [Ruby](https://github.com/Cybrid-app/cybrid-api-bank-ruby), [Swift](https://github.com/Cybrid-app/cybrid-api-bank-swift) or [Typescript](https://github.com/Cybrid-app/cybrid-api-bank-typescript)) 3. Integrating a platform specific SDK ([Web](https://github.com/Cybrid-app/cybrid-sdk-web), [Android](https://github.com/Cybrid-app/cybrid-sdk-android), [iOS](https://github.com/Cybrid-app/cybrid-sdk-ios)) Our complete set of APIs allows you to manage resources across three distinct areas: your `Organization`, your `Banks` and your `Identities`. For most of your testing and interaction you\'ll be using the `Bank` API, which is where the majority of APIs reside. *The complete set of APIs can be found on the following pages:* | API | Description | |------------------------------------------------------------------|-------------------------------------------------------------| | [Organization API](https://organization.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organizations | | [Bank API](https://bank.production.cybrid.app/api/schema/swagger-ui) | APIs to manage banks (and all downstream customer activity) | | [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organization and bank identities | For questions please contact [Support](mailto:support@cybrid.xyz) at any time for assistance, or contact the [Product Team](mailto:product@cybrid.xyz) for product suggestions. ## Authenticating with the API The Cybrid Platform uses OAuth 2.0 Bearer Tokens to authenticate requests to the platform. Credentials to create `Organization` and `Bank` tokens can be generated via the [Cybrid Sandbox](https://id.production.cybrid.app). Access tokens can be generated for a `Customer` as well via the [Cybrid IdP](https://id.production.cybrid.app) as well. An `Organization` access token applies broadly to the whole Organization and all of its `Banks`, whereas, a `Bank` access token is specific to an individual Bank. `Customer` tokens, similarly, are scoped to a specific customer in a bank. Both `Organization` and `Bank` tokens can be created using the OAuth Client Credential Grant flow. Each Organization and Bank has its own unique `Client ID` and `Secret` that allows for machine-to-machine authentication. A `Bank` can then generate `Customer` access tokens via API using our [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui). <font color=\"orange\">**⚠️ Never share your Client ID or Secret publicly or in your source code repository.**</font> Your `Client ID` and `Secret` can be exchanged for a time-limited `Bearer Token` by interacting with the Cybrid Identity Provider or through interacting with the **Authorize** button in this document. The following curl command can be used to quickly generate a `Bearer Token` for use in testing the API or demo applications. ``` # Example request when using Bank credentials curl -X POST https://id.production.cybrid.app/oauth/token -d \'{ \"grant_type\": \"client_credentials\", \"client_id\": \"<Your Client ID>\", \"client_secret\": \"<Your Secret>\", \"scope\": \"banks:read banks:write bank_applications:execute accounts:read accounts:execute counterparties:read counterparties:pii:read counterparties:write counterparties:execute customers:read customers:pii:read customers:write customers:execute prices:read quotes:execute quotes:read trades:execute trades:read transfers:execute transfers:read transfers:write external_bank_accounts:read external_bank_accounts:pii:read external_bank_accounts:write external_bank_accounts:execute external_wallets:read external_wallets:execute workflows:read workflows:execute deposit_addresses:read deposit_addresses:execute deposit_bank_accounts:read deposit_bank_accounts:execute invoices:read invoices:write invoices:execute identity_verifications:read identity_verifications:pii:read identity_verifications:write identity_verifications:execute persona_sessions:execute files:read files:pii:read files:execute\" }\' -H \"Content-Type: application/json\" # When using Organization credentials set `scope` to \'organizations:read organizations:write organization_applications:execute banks:read banks:write banks:execute bank_applications:execute users:read users:execute counterparties:read counterparties:pii:read customers:read customers:pii:read accounts:read prices:read quotes:execute quotes:read trades:execute trades:read transfers:read transfers:write transfers:execute external_bank_accounts:read external_bank_accounts:pii:read external_wallets:read workflows:read deposit_addresses:read deposit_bank_accounts:read invoices:read subscriptions:read subscriptions:write subscriptions:execute subscription_events:read subscription_events:execute identity_verifications:read identity_verifications:pii:read identity_verifications:execute persona_sessions:execute files:read files:pii:read files:execute\' ``` <font color=\"orange\">**⚠️ Note: The above curl will create a bearer token with full scope access. Delete scopes if you\'d like to restrict access.**</font> ## Authentication Scopes The Cybrid platform supports the use of scopes to control the level of access a token is limited to. Scopes do not grant access to resources; instead, they provide limits, in support of the least privilege principal. The following scopes are available on the platform and can be requested when generating either an Organization, Bank or Customer token. Generally speaking, the _Read_ scope is required to read and list resources, the _Write_ scope is required to update a resource and the _Execute_ scope is required to create a resource. | Resource | Read scope (Token Type) | Write scope (Token Type) | Execute scope (Token Type) | |-----------------------|------------------------------------------------------------|-----------------------------------------------|--------------------------------------------------| | Account | accounts:read (Organization, Bank, Customer) | | accounts:execute (Bank, Customer) | | Bank | banks:read (Organization, Bank) | banks:write (Organization, Bank) | banks:execute (Organization) | | Customer | customers:read (Organization, Bank, Customer) | customers:write (Bank, Customer) | customers:execute (Bank) | | Counterparty | counterparties:read (Organization, Bank, Customer) | counterparties:write (Bank, Customer) | counterparties:execute (Bank) | | Deposit Address | deposit_addresses:read (Organization, Bank, Customer) | deposit_addresses:write (Bank, Customer) | deposit_addresses:execute (Bank, Customer) | | External Bank Account | external_bank_accounts:read (Organization, Bank, Customer) | external_bank_accounts:write (Bank, Customer) | external_bank_accounts:execute (Bank, Customer) | | External Wallet | external_wallet:read (Organization, Bank, Customer) | | external_wallet:execute (Bank, Customer) | | Organization | organizations:read (Organization) | organizations:write (Organization) | | | User | users:read (Organization) | | users:execute (Organization) | | Price | prices:read (Bank, Customer) | | | | Quote | quotes:read (Organization, Bank, Customer) | | quotes:execute (Organization, Bank, Customer) | | Trade | trades:read (Organization, Bank, Customer) | | trades:execute (Organization, Bank, Customer) | | Transfer | transfers:read (Organization, Bank, Customer) | | transfers:execute (Organization, Bank, Customer) | | Workflow | workflows:read (Organization, Bank, Customer) | | workflows:execute (Bank, Customer) | | Invoice | invoices:read (Organization, Bank, Customer) | invoices:write (Bank, Customer) | invoices:execute (Bank, Customer) | ## Available Endpoints The available APIs for the [Identity](https://id.production.cybrid.app/api/schema/swagger-ui), [Organization](https://organization.production.cybrid.app/api/schema/swagger-ui) and [Bank](https://bank.production.cybrid.app/api/schema/swagger-ui) API services are listed below: | API Service | Model | API Endpoint Path | Description | |--------------|----------------------|--------------------------------|---------------------------------------------------------------------------------------------------| | Identity | Bank | /api/bank_applications | Create and list banks | | Identity | CustomerToken | /api/customer_tokens | Create customer JWT access tokens | | Identity | Organization | /api/organization_applications | Create and list organizations | | Identity | Organization | /api/users | Create and list organization users | | Organization | Organization | /api/organizations | APIs to retrieve and update organization name | | Bank | Account | /api/accounts | Create and list accounts, which hold a specific asset for a customers | | Bank | Asset | /api/assets | Get a list of assets supported by the platform (ex: BTC, ETH) | | Bank | Bank | /api/banks | Create, update and list banks, the parent to customers, accounts, etc | | Bank | Customer | /api/customers | Create and list customers | | Bank | Counterparty | /api/counterparties | Create and list counterparties | | Bank | DepositAddress | /api/deposit_addresses | Create, get and list deposit addresses | | Bank | ExternalBankAccount | /api/external_bank_accounts | Create, get and list external bank accounts, which connect customer bank accounts to the platform | | Bank | ExternalWallet | /api/external_wallets | Create, get, list and delete external wallets, which connect customer wallets to the platform | | Bank | IdentityVerification | /api/identity_verifications | Create and list identity verifications, which are performed on customers for KYC | | Bank | Invoice | /api/invoices | Create, get, cancel and list invoices | | Bank | PaymentInstruction | /api/payment_instructions | Create, get and list payment instructions for invoices | | Bank | Price | /api/prices | Get the current prices for assets on the platform | | Bank | Quote | /api/quotes | Create and list quotes, which are required to execute trades | | Bank | Symbol | /api/symbols | Get a list of symbols supported for trade (ex: BTC-USD) | | Bank | Trade | /api/trades | Create and list trades, which buy or sell cryptocurrency | | Bank | Transfer | /api/transfers | Create, get and list transfers (e.g., funding, book) | | Bank | Workflow | /api/workflows | Create, get and list workflows | ## Understanding Object Models & Endpoints **Organizations** An `Organization` is meant to represent the organization partnering with Cybrid to use our platform. An `Organization` typically does not directly interact with `customers`. Instead, an Organization has one or more `banks`, which encompass the financial service offerings of the platform. **Banks** A `Bank` is owned by an `Organization` and can be thought of as an environment or container for `customers` and product offerings. Banks are created in either `Sandbox` or `Production` mode, where `Sandbox` is the environment that you would test, prototype and build in prior to moving to `Production`. An `Organization` can have multiple `banks`, in either `Sandbox` or `Production` environments. A `Sandbox Bank` will be backed by stubbed data and process flows. For instance, funding source transfer processes as well as trades will be simulated rather than performed, however asset prices are representative of real-world values. You have an unlimited amount of simulated fiat currency for testing purposes. **Customers** `Customers` represent your banking users on the platform. At present, we offer support for `Individuals` as Customers. `Customers` must be verified (i.e., KYC\'d) in our system before they can play any part on the platform, which means they must have an associated and a passing `Identity Verification`. See the Identity Verifications section for more details on how a customer can be verified. `Customers` must also have an `Account` to be able to transact, in the desired asset class. See the Accounts APIs for more details on setting up accounts for the customer.
|
4
4
|
*
|
5
|
-
* The version of the OpenAPI document: v0.123.
|
5
|
+
* The version of the OpenAPI document: v0.123.559
|
6
6
|
* Contact: support@cybrid.app
|
7
7
|
*
|
8
8
|
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
@@ -360,4 +360,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
360
360
|
}] }, { type: i2.Configuration, decorators: [{
|
361
361
|
type: Optional
|
362
362
|
}] }]; } });
|
363
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcGkvdHJhbnNmZXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxXQUFXLEVBQUUsVUFBVSxFQUNVLFdBQVcsRUFDeEQsTUFBWSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBK0IsWUFBWSxDQUFDO0FBYy9FLGFBQWE7QUFDYixPQUFPLEVBQUUsU0FBUyxFQUFzQixNQUEwQixjQUFjLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUEwQyxrQkFBa0IsQ0FBQzs7OztBQU9yRixNQUFNLE9BQU8sZ0JBQWdCO0lBT3pCLFlBQXNCLFVBQXNCLEVBQWdDLFFBQWdCLEVBQWMsYUFBNEI7UUFBaEgsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUxsQyxhQUFRLEdBQUcsaUNBQWlDLENBQUM7UUFDaEQsbUJBQWMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ25DLGtCQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUl2QyxJQUFJLGFBQWEsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNqRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtnQkFDOUIsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDNUI7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDMUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUks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QUUsTUFBTSxDQUFDLENBQUM7U0FDdEI7UUFDRCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLElBQUksRUFBRTtZQUN2RCx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtZQUMvQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDL0I7UUFDRCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLElBQUksRUFBRTtZQUN2RCx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtZQUNyRCx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUN6Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUN2Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdEI7UUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUN6Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxD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QUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyRCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO2lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsRUFBRTtnQkFDeEUsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTTtnQkFDSCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFvQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxrQkFBa0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFDdEksc0JBQXNCLEVBQ3RCO1lBQ0ksT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixZQUFZLEVBQU8sYUFBYTtZQUNoQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlO1lBQ25ELE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLGNBQWMsRUFBRSxjQUFjO1NBQ2pDLENBQ0osQ0FBQztJQUNOLENBQUM7OzhHQXBiUSxnQkFBZ0IsNENBT3dDLFNBQVM7a0hBUGpFLGdCQUFnQixjQUZmLE1BQU07NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBUWtELFFBQVE7OzBCQUFHLE1BQU07MkJBQUMsU0FBUzs7MEJBQXFCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN5YnJpZCBCYW5rIEFQSVxuICogIyBDeWJyaWQgQVBJIGRvY3VtZW50YXRpb24gIFdlbGNvbWUgdG8gQ3licmlkLCBhbiBhbGwtaW4tb25lIGNyeXB0byBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMgeW91IHRvIGVhc2lseSAqKmJ1aWxkKiogYW5kICoqbGF1bmNoKiogd2hpdGUtbGFiZWwgY3J5cHRvIHByb2R1Y3RzIG9yIHNlcnZpY2VzLiAgSW4gdGhlc2UgZG9jdW1lbnRzLCB5b3VcXCdsbCBmaW5kIGRldGFpbHMgb24gaG93IG91ciBSRVNUIEFQSSBvcGVyYXRlcyBhbmQgZ2VuZXJhbGx5IGhvdyBvdXIgcGxhdGZvcm0gZnVuY3Rpb25zLiAgSWYgeW91XFwncmUgbG9va2luZyBmb3Igb3VyIFVJIFNESyBXaWRnZXRzIGZvciBXZWIgb3IgTW9iaWxlIChpT1MvQW5kcm9pZCksIGdlbmVyYXRlZCBBUEkgY2xpZW50cywgb3IgZGVtbyBhcHBsaWNhdGlvbnMsIGhlYWQgb3ZlciB0byBvdXIgW0dpdGh1YiByZXBvXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcCkuICDwn5KhIFdlIHJlY29tbWVuZCBib29rbWFya2luZyB0aGUgW0N5YnJpZCBMaW5rVHJlZV0oaHR0cHM6Ly9saW5rdHIuZWUvY3licmlkdGVjaG5vbG9naWVzKSB3aGljaCBjb250YWlucyBtYW55IGhlbHBmdWwgbGlua3MgdG8gcGxhdGZvcm0gcmVzb3VyY2VzLiAgIyMgR2V0dGluZyBTdGFydGVkICBUaGlzIGlzIEN5YnJpZFxcJ3MgcHVibGljIGludGVyYWN0aXZlIEFQSSBkb2N1bWVudGF0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIGZ1bGx5IHRlc3Qgb3VyIEFQSXMuIElmIHlvdVxcJ2QgbGlrZSB0byB1c2UgYSBkaWZmZXJlbnQgdG9vbCB0byBleGVyY2lzZSBvdXIgQVBJcywgeW91IGNhbiBkb3dubG9hZCB0aGUgW09wZW4gQVBJIDMuMCB5YW1sXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvdjEvc3dhZ2dlci55YW1sKSBmb3IgaW1wb3J0LiAgSWYgeW91XFwncmUgbmV3IHRvIG91ciBBUElzIGFuZCB0aGUgQ3licmlkIFBsYXRmb3JtLCBmb2xsb3cgdGhlIGJlbG93IGd1aWRlcyB0byBnZXQgc2V0IHVwIGFuZCBmYW1pbGlhciB3aXRoIHRoZSBwbGF0Zm9ybTogIDEuIFtJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaW50cm9kdWN0aW9uKSAyLiBbUGxhdGZvcm0gSW50cm9kdWN0aW9uXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2hvdy1pcy1jeWJyaWQtYXJjaGl0ZWN0ZWQpIDMuIFtUZXN0aW5nIHdpdGggSG9zdGVkIFdlYiBEZW1vIEFwcF0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy90ZXN0aW5nLXdpdGgtaG9zdGVkLXdlYi1kZW1vLWFwcCkgIEluIFtHZXR0aW5nIFN0YXJ0ZWQgaW4gdGhlIEN5YnJpZCBTYW5kYm94XShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2hvdy1kby1pLWdldC1zdGFydGVkLXdpdGgtdGhlLXNhbmRib3gpLCB3ZSB3YWxrIHlvdSB0aHJvdWdoIGhvdyB0byB1c2UgdGhlIFtDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9pZC5zYW5kYm94LmN5YnJpZC5hcHAvKSB0byBjcmVhdGUgYSB0ZXN0IGJhbmsgYW5kIGdlbmVyYXRlIEFQSSBrZXlzLiBJbiBbR2V0dGluZyBSZWFkeSBmb3IgVHJhZGluZ10oaHR0cHM6Ly9rYi5jeWJyaWQueHl6L2dldHRpbmctcmVhZHktZm9yLXRyYWRpbmcpLCB3ZSB3YWxrIHRocm91Z2ggY3JlYXRpbmcgY3VzdG9tZXJzLCBjdXN0b21lciBpZGVudGl0aWVzLCBhY2NvdW50cywgYXMgd2VsbCBhcyBleGVjdXRpbmcgcXVvdGVzIGFuZCB0cmFkZXMuICAjIyBXb3JraW5nIHdpdGggdGhlIEN5YnJpZCBQbGF0Zm9ybSAgVGhlcmUgYXJlIHRocmVlIHByaW1hcnkgd2F5cyB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIEN5YnJpZCBwbGF0Zm9ybTogIDEuIERpcmVjdGx5IHZpYSBvdXIgUkVTVGZ1bCBBUEkgKHRoaXMgZG9jdW1lbnRhdGlvbikgMi4gVXNpbmcgb3VyIEFQSSBjbGllbnRzIGF2YWlsYWJsZSBpbiBhIHZhcmlldHkgb2YgbGFuZ3VhZ2VzIChbQW5ndWxhcl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWFuZ3VsYXIpLCBbSmF2YV0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWphdmEpLCBbS290bGluXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmsta290bGluKSwgW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXB5dGhvbiksIFtSdWJ5XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcnVieSksIFtTd2lmdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXN3aWZ0KSBvciBbVHlwZXNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXR5cGVzY3JpcHQpKSAzLiBJbnRlZ3JhdGluZyBhIHBsYXRmb3JtIHNwZWNpZmljIFNESyAoW1dlYl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay13ZWIpLCBbQW5kcm9pZF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1hbmRyb2lkKSwgW2lPU10oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1pb3MpKSAgT3VyIGNvbXBsZXRlIHNldCBvZiBBUElzIGFsbG93cyB5b3UgdG8gbWFuYWdlIHJlc291cmNlcyBhY3Jvc3MgdGhyZWUgZGlzdGluY3QgYXJlYXM6IHlvdXIgYE9yZ2FuaXphdGlvbmAsIHlvdXIgYEJhbmtzYCBhbmQgeW91ciBgSWRlbnRpdGllc2AuIEZvciBtb3N0IG9mIHlvdXIgdGVzdGluZyBhbmQgaW50ZXJhY3Rpb24geW91XFwnbGwgYmUgdXNpbmcgdGhlIGBCYW5rYCBBUEksIHdoaWNoIGlzIHdoZXJlIHRoZSBtYWpvcml0eSBvZiBBUElzIHJlc2lkZS4gICpUaGUgY29tcGxldGUgc2V0IG9mIEFQSXMgY2FuIGJlIGZvdW5kIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXM6KiAgfCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgW09yZ2FuaXphdGlvbiBBUEldKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgfCBBUElzIHRvIG1hbmFnZSBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgW0JhbmsgQVBJXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgfCBBUElzIHRvIG1hbmFnZSBiYW5rcyAoYW5kIGFsbCBkb3duc3RyZWFtIGN1c3RvbWVyIGFjdGl2aXR5KSB8IHwgW0lkZW50aXRpZXMgQVBJXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgICAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbiBhbmQgYmFuayBpZGVudGl0aWVzICAgICAgICAgICAgIHwgIEZvciBxdWVzdGlvbnMgcGxlYXNlIGNvbnRhY3QgW1N1cHBvcnRdKG1haWx0bzpzdXBwb3J0QGN5YnJpZC54eXopIGF0IGFueSB0aW1lIGZvciBhc3Npc3RhbmNlLCBvciBjb250YWN0IHRoZSBbUHJvZHVjdCBUZWFtXShtYWlsdG86cHJvZHVjdEBjeWJyaWQueHl6KSBmb3IgcHJvZHVjdCBzdWdnZXN0aW9ucy4gICMjIEF1dGhlbnRpY2F0aW5nIHdpdGggdGhlIEFQSSAgVGhlIEN5YnJpZCBQbGF0Zm9ybSB1c2VzIE9BdXRoIDIuMCBCZWFyZXIgVG9rZW5zIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgcGxhdGZvcm0uIENyZWRlbnRpYWxzIHRvIGNyZWF0ZSBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIHZpYSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkuIEFjY2VzcyB0b2tlbnMgY2FuIGJlIGdlbmVyYXRlZCBmb3IgYSBgQ3VzdG9tZXJgIGFzIHdlbGwgdmlhIHRoZSBbQ3licmlkIElkUF0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHApIGFzIHdlbGwuICBBbiBgT3JnYW5pemF0aW9uYCBhY2Nlc3MgdG9rZW4gYXBwbGllcyBicm9hZGx5IHRvIHRoZSB3aG9sZSBPcmdhbml6YXRpb24gYW5kIGFsbCBvZiBpdHMgYEJhbmtzYCwgd2hlcmVhcywgYSBgQmFua2AgYWNjZXNzIHRva2VuIGlzIHNwZWNpZmljIHRvIGFuIGluZGl2aWR1YWwgQmFuay4gYEN1c3RvbWVyYCB0b2tlbnMsIHNpbWlsYXJseSwgYXJlIHNjb3BlZCB0byBhIHNwZWNpZmljIGN1c3RvbWVyIGluIGEgYmFuay4gIEJvdGggYE9yZ2FuaXphdGlvbmAgYW5kIGBCYW5rYCB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIE9BdXRoIENsaWVudCBDcmVkZW50aWFsIEdyYW50IGZsb3cuIEVhY2ggT3JnYW5pemF0aW9uIGFuZCBCYW5rIGhhcyBpdHMgb3duIHVuaXF1ZSBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgdGhhdCBhbGxvd3MgZm9yIG1hY2hpbmUtdG8tbWFjaGluZSBhdXRoZW50aWNhdGlvbi4gIEEgYEJhbmtgIGNhbiB0aGVuIGdlbmVyYXRlIGBDdXN0b21lcmAgYWNjZXNzIHRva2VucyB2aWEgQVBJIHVzaW5nIG91ciBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkuICA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOZXZlciBzaGFyZSB5b3VyIENsaWVudCBJRCBvciBTZWNyZXQgcHVibGljbHkgb3IgaW4geW91ciBzb3VyY2UgY29kZSByZXBvc2l0b3J5LioqPC9mb250PiAgWW91ciBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYSB0aW1lLWxpbWl0ZWQgYEJlYXJlciBUb2tlbmAgYnkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQ3licmlkIElkZW50aXR5IFByb3ZpZGVyIG9yIHRocm91Z2ggaW50ZXJhY3Rpbmcgd2l0aCB0aGUgKipBdXRob3JpemUqKiBidXR0b24gaW4gdGhpcyBkb2N1bWVudC4gIFRoZSBmb2xsb3dpbmcgY3VybCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZ2VuZXJhdGUgYSBgQmVhcmVyIFRva2VuYCBmb3IgdXNlIGluIHRlc3RpbmcgdGhlIEFQSSBvciBkZW1vIGFwcGxpY2F0aW9ucy4gIGBgYCAjIEV4YW1wbGUgcmVxdWVzdCB3aGVuIHVzaW5nIEJhbmsgY3JlZGVudGlhbHMgY3VybCAtWCBQT1NUIGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL29hdXRoL3Rva2VuIC1kIFxcJ3sgICAgIFxcXCJncmFudF90eXBlXFxcIjogXFxcImNsaWVudF9jcmVkZW50aWFsc1xcXCIsICAgICBcXFwiY2xpZW50X2lkXFxcIjogXFxcIjxZb3VyIENsaWVudCBJRD5cXFwiLCAgICAgXFxcImNsaWVudF9zZWNyZXRcXFwiOiBcXFwiPFlvdXIgU2VjcmV0PlxcXCIsICAgICBcXFwic2NvcGVcXFwiOiBcXFwiYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rX2FwcGxpY2F0aW9uczpleGVjdXRlIGFjY291bnRzOnJlYWQgYWNjb3VudHM6ZXhlY3V0ZSBjb3VudGVycGFydGllczpyZWFkIGNvdW50ZXJwYXJ0aWVzOnBpaTpyZWFkIGNvdW50ZXJwYXJ0aWVzOndyaXRlIGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOnBpaTpyZWFkIGN1c3RvbWVyczp3cml0ZSBjdXN0b21lcnM6ZXhlY3V0ZSBwcmljZXM6cmVhZCBxdW90ZXM6ZXhlY3V0ZSBxdW90ZXM6cmVhZCB0cmFkZXM6ZXhlY3V0ZSB0cmFkZXM6cmVhZCB0cmFuc2ZlcnM6ZXhlY3V0ZSB0cmFuc2ZlcnM6cmVhZCB0cmFuc2ZlcnM6d3JpdGUgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cGlpOnJlYWQgZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIGV4dGVybmFsX3dhbGxldHM6ZXhlY3V0ZSB3b3JrZmxvd3M6cmVhZCB3b3JrZmxvd3M6ZXhlY3V0ZSBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIGRlcG9zaXRfYWRkcmVzc2VzOmV4ZWN1dGUgZGVwb3NpdF9iYW5rX2FjY291bnRzOnJlYWQgZGVwb3NpdF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgaW52b2ljZXM6cmVhZCBpbnZvaWNlczp3cml0ZSBpbnZvaWNlczpleGVjdXRlIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCBpZGVudGl0eV92ZXJpZmljYXRpb25zOnBpaTpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIHBlcnNvbmFfc2Vzc2lvbnM6ZXhlY3V0ZSBmaWxlczpyZWFkIGZpbGVzOnBpaTpyZWFkIGZpbGVzOmV4ZWN1dGVcXFwiICAgfVxcJyAtSCBcXFwiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXFxcIiAgIyBXaGVuIHVzaW5nIE9yZ2FuaXphdGlvbiBjcmVkZW50aWFscyBzZXQgYHNjb3BlYCB0byBcXCdvcmdhbml6YXRpb25zOnJlYWQgb3JnYW5pemF0aW9uczp3cml0ZSBvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOmV4ZWN1dGUgYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rczpleGVjdXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgdXNlcnM6cmVhZCB1c2VyczpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6cGlpOnJlYWQgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOnBpaTpyZWFkIGFjY291bnRzOnJlYWQgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOndyaXRlIHRyYW5zZmVyczpleGVjdXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOnBpaTpyZWFkIGV4dGVybmFsX3dhbGxldHM6cmVhZCB3b3JrZmxvd3M6cmVhZCBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIGRlcG9zaXRfYmFua19hY2NvdW50czpyZWFkIGludm9pY2VzOnJlYWQgc3Vic2NyaXB0aW9uczpyZWFkIHN1YnNjcmlwdGlvbnM6d3JpdGUgc3Vic2NyaXB0aW9uczpleGVjdXRlIHN1YnNjcmlwdGlvbl9ldmVudHM6cmVhZCBzdWJzY3JpcHRpb25fZXZlbnRzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cGlpOnJlYWQgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIHBlcnNvbmFfc2Vzc2lvbnM6ZXhlY3V0ZSBmaWxlczpyZWFkIGZpbGVzOnBpaTpyZWFkIGZpbGVzOmV4ZWN1dGVcXCcgYGBgIDxmb250IGNvbG9yPVxcXCJvcmFuZ2VcXFwiPioq4pqg77iPIE5vdGU6IFRoZSBhYm92ZSBjdXJsIHdpbGwgY3JlYXRlIGEgYmVhcmVyIHRva2VuIHdpdGggZnVsbCBzY29wZSBhY2Nlc3MuIERlbGV0ZSBzY29wZXMgaWYgeW91XFwnZCBsaWtlIHRvIHJlc3RyaWN0IGFjY2Vzcy4qKjwvZm9udD4gICMjIEF1dGhlbnRpY2F0aW9uIFNjb3BlcyAgVGhlIEN5YnJpZCBwbGF0Zm9ybSBzdXBwb3J0cyB0aGUgdXNlIG9mIHNjb3BlcyB0byBjb250cm9sIHRoZSBsZXZlbCBvZiBhY2Nlc3MgYSB0b2tlbiBpcyBsaW1pdGVkIHRvLiBTY29wZXMgZG8gbm90IGdyYW50IGFjY2VzcyB0byByZXNvdXJjZXM7IGluc3RlYWQsIHRoZXkgcHJvdmlkZSBsaW1pdHMsIGluIHN1cHBvcnQgb2YgdGhlIGxlYXN0IHByaXZpbGVnZSBwcmluY2lwYWwuICBUaGUgZm9sbG93aW5nIHNjb3BlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybSBhbmQgY2FuIGJlIHJlcXVlc3RlZCB3aGVuIGdlbmVyYXRpbmcgZWl0aGVyIGFuIE9yZ2FuaXphdGlvbiwgQmFuayBvciBDdXN0b21lciB0b2tlbi4gR2VuZXJhbGx5IHNwZWFraW5nLCB0aGUgX1JlYWRfIHNjb3BlIGlzIHJlcXVpcmVkIHRvIHJlYWQgYW5kIGxpc3QgcmVzb3VyY2VzLCB0aGUgX1dyaXRlXyBzY29wZSBpcyByZXF1aXJlZCB0byB1cGRhdGUgYSByZXNvdXJjZSBhbmQgdGhlIF9FeGVjdXRlXyBzY29wZSBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSByZXNvdXJjZS4gIHwgUmVzb3VyY2UgICAgICAgICAgICAgIHwgUmVhZCBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdyaXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICB8IEV4ZWN1dGUgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgQWNjb3VudCAgICAgICAgICAgICAgIHwgYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgICAgICAgICAgIHwgYmFua3M6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJhbmtzOndyaXRlIChPcmdhbml6YXRpb24sIEJhbmspICAgICAgICAgICAgICB8IGJhbmtzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICB8IHwgQ3VzdG9tZXIgICAgICAgICAgICAgIHwgY3VzdG9tZXJzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8IGN1c3RvbWVyczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8IGN1c3RvbWVyczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQ291bnRlcnBhcnR5ICAgICAgICAgIHwgY291bnRlcnBhcnRpZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgKEJhbmspICAgICAgICAgICAgICAgICAgICB8IHwgRGVwb3NpdCBBZGRyZXNzICAgICAgIHwgZGVwb3NpdF9hZGRyZXNzZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICB8IHwgRXh0ZXJuYWwgQmFuayBBY2NvdW50IHwgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICB8IHwgRXh0ZXJuYWwgV2FsbGV0ICAgICAgIHwgZXh0ZXJuYWxfd2FsbGV0OnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dGVybmFsX3dhbGxldDpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICB8IHwgT3JnYW5pemF0aW9uICAgICAgICAgIHwgb3JnYW5pemF0aW9uczpyZWFkIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6d3JpdGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgVXNlciAgICAgICAgICAgICAgICAgIHwgdXNlcnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVzZXJzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICB8IHwgUHJpY2UgICAgICAgICAgICAgICAgIHwgcHJpY2VzOnJlYWQgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgUXVvdGUgICAgICAgICAgICAgICAgIHwgcXVvdGVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHF1b3RlczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICB8IHwgVHJhZGUgICAgICAgICAgICAgICAgIHwgdHJhZGVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYWRlczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICB8IHwgVHJhbnNmZXIgICAgICAgICAgICAgIHwgdHJhbnNmZXJzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zZmVyczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSB8IHwgV29ya2Zsb3cgICAgICAgICAgICAgIHwgd29ya2Zsb3dzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdvcmtmbG93czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IHwgSW52b2ljZSAgICAgICAgICAgICAgIHwgaW52b2ljZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IGludm9pY2VzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IGludm9pY2VzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICB8ICAjIyBBdmFpbGFibGUgRW5kcG9pbnRzICBUaGUgYXZhaWxhYmxlIEFQSXMgZm9yIHRoZSBbSWRlbnRpdHldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSksIFtPcmdhbml6YXRpb25dKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpIGFuZCBbQmFua10oaHR0cHM6Ly9iYW5rLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpIEFQSSBzZXJ2aWNlcyBhcmUgbGlzdGVkIGJlbG93OiAgfCBBUEkgU2VydmljZSAgfCBNb2RlbCAgICAgICAgICAgICAgICB8IEFQSSBFbmRwb2ludCBQYXRoICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgSWRlbnRpdHkgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtfYXBwbGljYXRpb25zICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgYmFua3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBDdXN0b21lclRva2VuICAgICAgICB8IC9hcGkvY3VzdG9tZXJfdG9rZW5zICAgICAgICAgICB8IENyZWF0ZSBjdXN0b21lciBKV1QgYWNjZXNzIHRva2VucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS9vcmdhbml6YXRpb25fYXBwbGljYXRpb25zIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL3VzZXJzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3Qgb3JnYW5pemF0aW9uIHVzZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBPcmdhbml6YXRpb24gfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9ucyAgICAgICAgICAgICB8IEFQSXMgdG8gcmV0cmlldmUgYW5kIHVwZGF0ZSBvcmdhbml6YXRpb24gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFjY291bnQgICAgICAgICAgICAgIHwgL2FwaS9hY2NvdW50cyAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGFjY291bnRzLCB3aGljaCBob2xkIGEgc3BlY2lmaWMgYXNzZXQgZm9yIGEgY3VzdG9tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQXNzZXQgICAgICAgICAgICAgICAgfCAvYXBpL2Fzc2V0cyAgICAgICAgICAgICAgICAgICAgfCBHZXQgYSBsaXN0IG9mIGFzc2V0cyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIChleDogQlRDLCBFVEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBCYW5rICAgICAgICAgICAgICAgICB8IC9hcGkvYmFua3MgICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgdXBkYXRlIGFuZCBsaXN0IGJhbmtzLCB0aGUgcGFyZW50IHRvIGN1c3RvbWVycywgYWNjb3VudHMsIGV0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEN1c3RvbWVyICAgICAgICAgICAgIHwgL2FwaS9jdXN0b21lcnMgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQ291bnRlcnBhcnR5ICAgICAgICAgfCAvYXBpL2NvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgY291bnRlcnBhcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBEZXBvc2l0QWRkcmVzcyAgICAgICB8IC9hcGkvZGVwb3NpdF9hZGRyZXNzZXMgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGRlcG9zaXQgYWRkcmVzc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsQmFua0FjY291bnQgIHwgL2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgZXh0ZXJuYWwgYmFuayBhY2NvdW50cywgd2hpY2ggY29ubmVjdCBjdXN0b21lciBiYW5rIGFjY291bnRzIHRvIHRoZSBwbGF0Zm9ybSB8IHwgQmFuayAgICAgICAgIHwgRXh0ZXJuYWxXYWxsZXQgICAgICAgfCAvYXBpL2V4dGVybmFsX3dhbGxldHMgICAgICAgICAgfCBDcmVhdGUsIGdldCwgbGlzdCBhbmQgZGVsZXRlIGV4dGVybmFsIHdhbGxldHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgd2FsbGV0cyB0byB0aGUgcGxhdGZvcm0gICAgIHwgfCBCYW5rICAgICAgICAgfCBJZGVudGl0eVZlcmlmaWNhdGlvbiB8IC9hcGkvaWRlbnRpdHlfdmVyaWZpY2F0aW9ucyAgICB8IENyZWF0ZSBhbmQgbGlzdCBpZGVudGl0eSB2ZXJpZmljYXRpb25zLCB3aGljaCBhcmUgcGVyZm9ybWVkIG9uIGN1c3RvbWVycyBmb3IgS1lDICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEludm9pY2UgICAgICAgICAgICAgIHwgL2FwaS9pbnZvaWNlcyAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGNhbmNlbCBhbmQgbGlzdCBpbnZvaWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUGF5bWVudEluc3RydWN0aW9uICAgfCAvYXBpL3BheW1lbnRfaW5zdHJ1Y3Rpb25zICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBwYXltZW50IGluc3RydWN0aW9ucyBmb3IgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBQcmljZSAgICAgICAgICAgICAgICB8IC9hcGkvcHJpY2VzICAgICAgICAgICAgICAgICAgICB8IEdldCB0aGUgY3VycmVudCBwcmljZXMgZm9yIGFzc2V0cyBvbiB0aGUgcGxhdGZvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFF1b3RlICAgICAgICAgICAgICAgIHwgL2FwaS9xdW90ZXMgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IHF1b3Rlcywgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGV4ZWN1dGUgdHJhZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgU3ltYm9sICAgICAgICAgICAgICAgfCAvYXBpL3N5bWJvbHMgICAgICAgICAgICAgICAgICAgfCBHZXQgYSBsaXN0IG9mIHN5bWJvbHMgc3VwcG9ydGVkIGZvciB0cmFkZSAoZXg6IEJUQy1VU0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFkZSAgICAgICAgICAgICAgICB8IC9hcGkvdHJhZGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCB0cmFkZXMsIHdoaWNoIGJ1eSBvciBzZWxsIGNyeXB0b2N1cnJlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFRyYW5zZmVyICAgICAgICAgICAgIHwgL2FwaS90cmFuc2ZlcnMgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgdHJhbnNmZXJzIChlLmcuLCBmdW5kaW5nLCBib29rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgV29ya2Zsb3cgICAgICAgICAgICAgfCAvYXBpL3dvcmtmbG93cyAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCB3b3JrZmxvd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICMjIFVuZGVyc3RhbmRpbmcgT2JqZWN0IE1vZGVscyAmIEVuZHBvaW50cyAgKipPcmdhbml6YXRpb25zKiogIEFuIGBPcmdhbml6YXRpb25gIGlzIG1lYW50IHRvIHJlcHJlc2VudCB0aGUgb3JnYW5pemF0aW9uIHBhcnRuZXJpbmcgd2l0aCBDeWJyaWQgdG8gdXNlIG91ciBwbGF0Zm9ybS4gIEFuIGBPcmdhbml6YXRpb25gIHR5cGljYWxseSBkb2VzIG5vdCBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIGBjdXN0b21lcnNgLiBJbnN0ZWFkLCBhbiBPcmdhbml6YXRpb24gaGFzIG9uZSBvciBtb3JlIGBiYW5rc2AsIHdoaWNoIGVuY29tcGFzcyB0aGUgZmluYW5jaWFsIHNlcnZpY2Ugb2ZmZXJpbmdzIG9mIHRoZSBwbGF0Zm9ybS4gICoqQmFua3MqKiAgQSBgQmFua2AgaXMgb3duZWQgYnkgYW4gYE9yZ2FuaXphdGlvbmAgYW5kIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGFuIGVudmlyb25tZW50IG9yIGNvbnRhaW5lciBmb3IgYGN1c3RvbWVyc2AgYW5kIHByb2R1Y3Qgb2ZmZXJpbmdzLiBCYW5rcyBhcmUgY3JlYXRlZCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBtb2RlLCB3aGVyZSBgU2FuZGJveGAgaXMgdGhlIGVudmlyb25tZW50IHRoYXQgeW91IHdvdWxkIHRlc3QsIHByb3RvdHlwZSBhbmQgYnVpbGQgaW4gcHJpb3IgdG8gbW92aW5nIHRvIGBQcm9kdWN0aW9uYC4gIEFuIGBPcmdhbml6YXRpb25gIGNhbiBoYXZlIG11bHRpcGxlIGBiYW5rc2AsIGluIGVpdGhlciBgU2FuZGJveGAgb3IgYFByb2R1Y3Rpb25gIGVudmlyb25tZW50cy4gQSBgU2FuZGJveCBCYW5rYCB3aWxsIGJlIGJhY2tlZCBieSBzdHViYmVkIGRhdGEgYW5kIHByb2Nlc3MgZmxvd3MuIEZvciBpbnN0YW5jZSwgZnVuZGluZyBzb3VyY2UgdHJhbnNmZXIgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdHJhZGVzIHdpbGwgYmUgc2ltdWxhdGVkIHJhdGhlciB0aGFuIHBlcmZvcm1lZCwgaG93ZXZlciBhc3NldCBwcmljZXMgYXJlIHJlcHJlc2VudGF0aXZlIG9mIHJlYWwtd29ybGQgdmFsdWVzLiBZb3UgaGF2ZSBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIHNpbXVsYXRlZCBmaWF0IGN1cnJlbmN5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAgKipDdXN0b21lcnMqKiAgYEN1c3RvbWVyc2AgcmVwcmVzZW50IHlvdXIgYmFua2luZyB1c2VycyBvbiB0aGUgcGxhdGZvcm0uIEF0IHByZXNlbnQsIHdlIG9mZmVyIHN1cHBvcnQgZm9yIGBJbmRpdmlkdWFsc2AgYXMgQ3VzdG9tZXJzLiAgYEN1c3RvbWVyc2AgbXVzdCBiZSB2ZXJpZmllZCAoaS5lLiwgS1lDXFwnZCkgaW4gb3VyIHN5c3RlbSBiZWZvcmUgdGhleSBjYW4gcGxheSBhbnkgcGFydCBvbiB0aGUgcGxhdGZvcm0sIHdoaWNoIG1lYW5zIHRoZXkgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgYW5kIGEgcGFzc2luZyBgSWRlbnRpdHkgVmVyaWZpY2F0aW9uYC4gU2VlIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb25zIHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgYSBjdXN0b21lciBjYW4gYmUgdmVyaWZpZWQuICBgQ3VzdG9tZXJzYCBtdXN0IGFsc28gaGF2ZSBhbiBgQWNjb3VudGAgdG8gYmUgYWJsZSB0byB0cmFuc2FjdCwgaW4gdGhlIGRlc2lyZWQgYXNzZXQgY2xhc3MuIFNlZSB0aGUgQWNjb3VudHMgQVBJcyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNldHRpbmcgdXAgYWNjb3VudHMgZm9yIHRoZSBjdXN0b21lci4gXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IHYwLjEyMy41NThcbiAqIENvbnRhY3Q6IHN1cHBvcnRAY3licmlkLmFwcFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwUGFyYW1ldGVyQ29kZWMsIEh0dHBDb250ZXh0IFxuICAgICAgICB9ICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9lbmNvZGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRXJyb3JSZXNwb25zZUJhbmtNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Vycm9yUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUGF0Y2hUcmFuc2ZlckJhbmtNb2RlbCB9IGZyb20gJy4uL21vZGVsL3BhdGNoVHJhbnNmZXInO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUG9zdFRyYW5zZmVyQmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvcG9zdFRyYW5zZmVyJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRyYW5zZmVyQmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvdHJhbnNmZXInO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVHJhbnNmZXJMaXN0QmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvdHJhbnNmZXJMaXN0JztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUcmFuc2ZlcnNTZXJ2aWNlIHtcblxuICAgIHByb3RlY3RlZCBiYXNlUGF0aCA9ICdodHRwczovL2Jhbmsuc2FuZGJveC5jeWJyaWQuYXBwJztcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgcHVibGljIGVuY29kZXI6IEh0dHBQYXJhbWV0ZXJDb2RlYztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlciB8fCBuZXcgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjKCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlPzogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKCBlbGVtID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cigwLCAxMCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCggayA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMsIHZhbHVlW2tdLCBrZXkgIT0gbnVsbCA/IGAke2tleX0uJHtrfWAgOiBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBUcmFuc2ZlclxuICAgICAqIENyZWF0ZXMgYSB0cmFuc2Zlci4gICMjIFN0YXRlICB8IFN0YXRlIHwgRGVzY3JpcHRpb24gfCB8LS0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8IHN0b3JpbmcgfCBUaGUgUGxhdGZvcm0gaXMgc3RvcmluZyB0aGUgdHJhbnNmZXIgZGV0YWlscyBpbiBvdXIgcHJpdmF0ZSBzdG9yZSB8IHwgcmV2aWV3aW5nIHwgVGhlIFBsYXRmb3JtIGlzIHJldmlld2luZyB0aGUgdHJhbnNmZXIgZm9yIGNvbXBsaWFuY2UgfCB8IHBlbmRpbmcgfCBUaGUgUGxhdGZvcm0gaXMgZXhlY3V0aW5nIHRoZSB0cmFuc2ZlciB8IHwgY29tcGxldGVkIHwgVGhlIFBsYXRmb3JtIGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoZSB0cmFuc2ZlciB8IHwgZmFpbGVkIHwgVGhlIFBsYXRmb3JtIHdhcyBub3QgYWJsZSB0byBzdWNjZXNzZnVsbHkgY29tcGxldGUgdGhlIHRyYW5zZmVyIHwgICMjIEZhaWx1cmUgY29kZXMgIHwgQ29kZSB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8IGFtb3VudF90b29fbG93IHwgVGhlIHRyYW5zZmVyIHdhcyByZWplY3RlZCBkdWUgdG8gdGhlIGFtb3VudCBiZWluZyB0b28gbG93IHwgfCBjYW5jZWxsZWQgfCBUaGUgdHJhbnNmZXIgd2FzIG1hbnVhbGx5IGNhbmNlbGxlZCB8IHwgY29tcGxpYW5jZV9yZWplY3Rpb24gfCBUaGUgdHJhbnNmZXIgd2FzIHJlamVjdGVkIGZvciBjb21wbGlhbmNlIHJlYXNvbnMgfCB8IGludGVybmFsX2Vycm9yIHwgQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgdHJhbnNmZXIsIHBsZWFzZSB0cnkgYWdhaW4gfCB8IGludmFsaWRfYWRkcmVzcyB8IFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIGludmFsaWQgZm9yIHRyYW5zZmVyIHwgfCBpbnZhbGlkX2JhbGFuY2UgfCBUaGVyZSB3YXMgaW5zdWZmaWNpZW50IGJhbGFuY2UgZm9yIGFsbCByZXF1aXJlZCBjdXJyZW5jaWVzIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2ZlciB8IHwgbGltaXRfZXhjZWVkZWQgfCBUaGUgY3VzdG9tZXIgaXMgb3ZlciB0aGUgbGltaXRzIHRoYXQgaGF2ZSBiZWVuIHNldCBmb3IgdGhlbSBmb3IgdGhpcyBhY3Rpdml0eSB8IHwgbmV0d29ya19mZWVfdG9vX2xvdyB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgZHVlIHRvIHRoZSBuZXR3b3JrIGZlZSBiZWluZyB0b28gbG93IHwgfCBub25fc3VmZmljaWVudF9mdW5kcyB8IFRoZSBjdXN0b21lciBkb2VzIG5vdCBoYXZlIGVub3VnaCBmdW5kcyB0byBjb21wbGV0ZSB0aGUgdHJhbnNmZXIgfCB8IHBhcnR5X25hbWVfaW52YWxpZCB8IFRoZSB0cmFuc2ZlclxcJiMzOTtzIGFzc29jaWF0ZWQgZXh0ZXJuYWwgYmFuayBhY2NvdW50IGhhcyBhbiBpbnZhbGlkIHBhcnR5IG5hbWUgfCB8IHBheW1lbnRfcmFpbF9pbnZhbGlkIHwgVGhlIHBheW1lbnQgcmFpbCBzcGVjaWZpZWQgZm9yIHRoZSB0cmFuc2ZlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgfCB8IHBsYWlkX2FjY2Vzc19ub3RfZ3JhbnRlZCB8IFNlZSB0aGUgZGVzY3JpcHRpb24gZnJvbSBQbGFpZCBbaGVyZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaXRlbS8jYWNjZXNzX25vdF9ncmFudGVkKSB8IHwgcGxhaWRfaW5zdGl0dXRpb25fbm90X3Jlc3BvbmRpbmcgfCBTZWUgdGhlIGRlc2NyaXB0aW9uIGZyb20gUGxhaWQgW2hlcmVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2luc3RpdHV0aW9uLyNpbnN0aXR1dGlvbl9ub3RfcmVzcG9uZGluZykgfCB8IHBsYWlkX2ludGVybmFsX3NlcnZlcl9lcnJvciB8IFNlZSB0aGUgZGVzY3JpcHRpb24gZnJvbSBQbGFpZCBbaGVyZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvYXBpLyNpbnRlcm5hbF9zZXJ2ZXJfZXJyb3Itb3ItcGxhaWQtaW50ZXJuYWwtZXJyb3IpIHwgfCBwbGFpZF9pdGVtX25vdF9mb3VuZCB8IFNlZSB0aGUgZGVzY3JpcHRpb24gZnJvbSBQbGFpZCBbaGVyZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaXRlbS8jaXRlbV9ub3RfZm91bmQpIHwgfCBwbGFpZF9pdGVtX25vdF9zdXBwb3J0ZWQgfCBTZWUgdGhlIGRlc2NyaXB0aW9uIGZyb20gUGxhaWQgW2hlcmVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2l0ZW0vI2l0ZW1fbm90X3N1cHBvcnRlZCkgfCB8IHBsYWlkX211bHRpcGxlX2FjY291bnRzIHwgTXVsdGlwbGUgYWNjb3VudHMgd2VyZSBzZWxlY3RlZCB0aHJvdWdoIFBsYWlkIExpbmsuIHwgfCBwbGFpZF9ub19hY2NvdW50cyB8IFNlZSB0aGUgZGVzY3JpcHRpb24gZnJvbSBQbGFpZCBbaGVyZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaXRlbS8jbm9fYWNjb3VudHMpIHwgfCBwbGFpZF9ub25lX2JhbGFuY2VzX2Vycm9yIHwgVGhlIHRyYW5zZmVyIHdhcyByZWplY3RlZCBkdWUgdG8gYW4gZXJyb3Igd2l0aCB0aGUgYmFsYW5jZXMgcmV0cmlldmVkIGJ5IFBsYWlkIHwgfCBwbGFpZF91bmtub3duX2Vycm9yIHwgU2VlIHRoZSBkZXNjcmlwdGlvbiBmcm9tIFBsYWlkIFtoZXJlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy9hcGkvI3Vua25vd25fZXJyb3IpIHwgfCByZWZyZXNoX3JlcXVpcmVkIHwgVGhlIHRyYW5zZmVyXFwmIzM5O3MgYXNzb2NpYXRlZCBleHRlcm5hbF9iYW5rX2FjY291bnQgbmVlZHMgdG8gYmUgcmVjb25uZWN0ZWQgdmlhIFBsYWlkIHwgfCByZXZlcnNlZCB8IFRoZSB0cmFuc2ZlciB3YXMgcmV2ZXJzZWQgfCAgIyMgRmFpbHVyZSBjb2RlcyB0aGF0IHdpbGwgcmVzdWx0IGluIGEgc3RhdGUgY2hhbmdlIGZvciB0aGUgYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgIHwgQ29kZSB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8IHJlZnJlc2hfcmVxdWlyZWQgfCBUaGUgdHJhbnNmZXIgd2FzIHJlamVjdGVkIGR1ZSB0byB0aGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IG5lZWRpbmcgdG8gYmUgcmVmcmVzaGVkLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtyZWZyZXNoX3JlcXVpcmVkJiN4NjA7IHwgfCBwbGFpZF9hY2Nlc3Nfbm90X2dyYW50ZWQgfCBUaGUgdHJhbnNmZXIgd2FzIHJlamVjdGVkIGR1ZSB0byB0aGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IG5lZWRpbmcgdG8gYmUgcmVjb25uZWN0ZWQgdmlhIFBsYWlkLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtkZWxldGVkJiN4NjA7IHwgfCBwbGFpZF9pdGVtX25vdF9mb3VuZCB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgZHVlIHRvIHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgbmVlZGluZyB0byBiZSByZWNvbm5lY3RlZCB2aWEgUGxhaWQuIFRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgd2lsbCBiZSBwdXQgaW4gdGhlIHN0YXRlICYjeDYwO2RlbGV0ZWQmI3g2MDsgfCB8IHBsYWlkX2l0ZW1fbm90X3N1cHBvcnRlZCB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgYmVjYXVzZSB0aGUgYWNjb3VudCBpcyBub3Qgc3VwcG9ydGVkLiBBIGRpZmZlcmVudCBhY2NvdW50IHNob3VsZCBiZSBjb25uZWN0ZWQgdmlhIFBsYWlkLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtkZWxldGVkJiN4NjA7IHwgfCBwbGFpZF9tdWx0aXBsZV9hY2NvdW50cyB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgYmVjYXVzZSBtdWx0aXBsZSBhY2NvdW50cyB3ZXJlIHNlbGVjdGVkIHRocm91Z2ggUGxhaWQgTGluay4gT25seSBvbmUgYWNjb3VudCBtdXN0IGJlIHNlbGVjdGVkLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtkZWxldGVkJiN4NjA7IHwgfCBwbGFpZF9ub19hY2NvdW50cyB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgYmVjYXVzZSBubyBjb21wYXRpYmxlIGFjY291bnRzIGNvdWxkIGJlIGZvdW5kLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtkZWxldGVkJiN4NjA7IHwgICAgUmVxdWlyZWQgc2NvcGU6ICoqdHJhbnNmZXJzOmV4ZWN1dGUqKlxuICAgICAqIEBwYXJhbSBwb3N0VHJhbnNmZXJCYW5rTW9kZWwgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVRyYW5zZmVyKHBvc3RUcmFuc2ZlckJhbmtNb2RlbDogUG9zdFRyYW5zZmVyQmFua01vZGVsLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8VHJhbnNmZXJCYW5rTW9kZWw+O1xuICAgIHB1YmxpYyBjcmVhdGVUcmFuc2Zlcihwb3N0VHJhbnNmZXJCYW5rTW9kZWw6IFBvc3RUcmFuc2ZlckJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VHJhbnNmZXJCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgY3JlYXRlVHJhbnNmZXIocG9zdFRyYW5zZmVyQmFua01vZGVsOiBQb3N0VHJhbnNmZXJCYW5rTW9kZWwsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUcmFuc2ZlckJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVUcmFuc2Zlcihwb3N0VHJhbnNmZXJCYW5rTW9kZWw6IFBvc3RUcmFuc2ZlckJhbmtNb2RlbCwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAocG9zdFRyYW5zZmVyQmFua01vZGVsID09PSBudWxsIHx8IHBvc3RUcmFuc2ZlckJhbmtNb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBwb3N0VHJhbnNmZXJCYW5rTW9kZWwgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVUcmFuc2Zlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxUcmFuc2ZlckJhbmtNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvdHJhbnNmZXJzYCxcbiAgICAgICAgICAgIHBvc3RUcmFuc2ZlckJhbmtNb2RlbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgVHJhbnNmZXJcbiAgICAgKiBSZXRyaWV2ZXMgYSB0cmFuc2Zlci4gIFJlcXVpcmVkIHNjb3BlOiAqKnRyYW5zZmVyczpyZWFkKipcbiAgICAgKiBAcGFyYW0gdHJhbnNmZXJHdWlkIElkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHJhbnNmZXIodHJhbnNmZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxUcmFuc2ZlckJhbmtNb2RlbD47XG4gICAgcHVibGljIGdldFRyYW5zZmVyKHRyYW5zZmVyR3VpZDogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxUcmFuc2ZlckJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBnZXRUcmFuc2Zlcih0cmFuc2Zlckd1aWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFRyYW5zZmVyQmFua01vZGVsPj47XG4gICAgcHVibGljIGdldFRyYW5zZmVyKHRyYW5zZmVyR3VpZDogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmICh0cmFuc2Zlckd1aWQgPT09IG51bGwgfHwgdHJhbnNmZXJHdWlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHRyYW5zZmVyR3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFRyYW5zZmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxUcmFuc2ZlckJhbmtNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvdHJhbnNmZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh0cmFuc2Zlckd1aWQpKX1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0cmFuc2ZlcnMgbGlzdFxuICAgICAqIFJldHJpZXZlcyBhIGxpc3Rpbmcgb2YgdHJhbnNmZXJzLiAgUmVxdWlyZWQgc2NvcGU6ICoqdHJhbnNmZXJzOnJlYWQqKlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIGluZGV4IHRvIHJldHJpZXZlLlxuICAgICAqIEBwYXJhbSBwZXJQYWdlIFRoZSBudW1iZXIgb2YgZW50aXRpZXMgcGVyIHBhZ2UgdG8gcmV0dXJuLlxuICAgICAqIEBwYXJhbSBndWlkIENvbW1hIHNlcGFyYXRlZCB0cmFuc2Zlcl9ndWlkcyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSBDb21tYSBzZXBhcmF0ZWQgdHJhbnNmZXJfdHlwZXMgdG8gbGlzdCBhY2NvdW50cyBmb3IuXG4gICAgICogQHBhcmFtIGJhbmtHdWlkIENvbW1hIHNlcGFyYXRlZCBiYW5rX2d1aWRzIHRvIGxpc3QgdHJhbnNmZXJzIGZvci5cbiAgICAgKiBAcGFyYW0gY3VzdG9tZXJHdWlkIENvbW1hIHNlcGFyYXRlZCBjdXN0b21lcl9ndWlkcyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIGFjY291bnRHdWlkIENvbW1hIHNlcGFyYXRlZCBhY2NvdW50X2d1aWRzIHRvIGxpc3QgdHJhbnNmZXJzIGZvci5cbiAgICAgKiBAcGFyYW0gc3RhdGUgQ29tbWEgc2VwYXJhdGVkIHN0YXRlcyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIHNpZGUgQ29tbWEgc2VwYXJhdGVkIHNpZGVzIHRvIGxpc3QgdHJhbnNmZXJzIGZvci5cbiAgICAgKiBAcGFyYW0gbGFiZWwgQ29tbWEgc2VwYXJhdGVkIGxhYmVscyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIHR4bkhhc2ggQ29tbWEgc2VwYXJhdGVkIHRyYW5zYWN0aW9uIGhhc2hlcyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIGNyZWF0ZWRBdEd0ZSBDcmVhdGVkIGF0IHN0YXJ0IGRhdGUtdGltZSBpbmNsdXNpdmUgbG93ZXIgYm91bmQsIElTTzg2MDFcbiAgICAgKiBAcGFyYW0gY3JlYXRlZEF0THQgQ3JlYXRlZCBhdCBlbmQgZGF0ZS10aW1lIGV4Y2x1c2l2ZSB1cHBlciBib3VuZCwgSVNPODYwMS5cbiAgICAgKiBAcGFyYW0gdXBkYXRlZEF0R3RlIENyZWF0ZWQgYXQgc3RhcnQgZGF0ZS10aW1lIGluY2x1c2l2ZSBsb3dlciBib3VuZCwgSVNPODYwMVxuICAgICAqIEBwYXJhbSB1cGRhdGVkQXRMdCBDcmVhdGVkIGF0IGVuZCBkYXRlLXRpbWUgZXhjbHVzaXZlIHVwcGVyIGJvdW5kLCBJU084NjAxLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0VHJhbnNmZXJzKHBhZ2U/OiBzdHJpbmcsIHBlclBhZ2U/OiBzdHJpbmcsIGd1aWQ/OiBzdHJpbmcsIHRyYW5zZmVyVHlwZT86IHN0cmluZywgYmFua0d1aWQ/OiBzdHJpbmcsIGN1c3RvbWVyR3VpZD86IHN0cmluZywgYWNjb3VudEd1aWQ/OiBzdHJpbmcsIHN0YXRlPzogc3RyaW5nLCBzaWRlPzogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdHhuSGFzaD86IHN0cmluZywgY3JlYXRlZEF0R3RlPzogc3RyaW5nLCBjcmVhdGVkQXRMdD86IHN0cmluZywgdXBkYXRlZEF0R3RlPzogc3RyaW5nLCB1cGRhdGVkQXRMdD86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPFRyYW5zZmVyTGlzdEJhbmtNb2RlbD47XG4gICAgcHVibGljIGxpc3RUcmFuc2ZlcnMocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgZ3VpZD86IHN0cmluZywgdHJhbnNmZXJUeXBlPzogc3RyaW5nLCBiYW5rR3VpZD86IHN0cmluZywgY3VzdG9tZXJHdWlkPzogc3RyaW5nLCBhY2NvdW50R3VpZD86IHN0cmluZywgc3RhdGU/OiBzdHJpbmcsIHNpZGU/OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nLCB0eG5IYXNoPzogc3RyaW5nLCBjcmVhdGVkQXRHdGU/OiBzdHJpbmcsIGNyZWF0ZWRBdEx0Pzogc3RyaW5nLCB1cGRhdGVkQXRHdGU/OiBzdHJpbmcsIHVwZGF0ZWRBdEx0Pzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxUcmFuc2Zlckxpc3RCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgbGlzdFRyYW5zZmVycyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCB0cmFuc2ZlclR5cGU/OiBzdHJpbmcsIGJhbmtHdWlkPzogc3RyaW5nLCBjdXN0b21lckd1aWQ/OiBzdHJpbmcsIGFjY291bnRHdWlkPzogc3RyaW5nLCBzdGF0ZT86IHN0cmluZywgc2lkZT86IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHR4bkhhc2g/OiBzdHJpbmcsIGNyZWF0ZWRBdEd0ZT86IHN0cmluZywgY3JlYXRlZEF0THQ/OiBzdHJpbmcsIHVwZGF0ZWRBdEd0ZT86IHN0cmluZywgdXBkYXRlZEF0THQ/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUcmFuc2Zlckxpc3RCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgbGlzdFRyYW5zZmVycyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCB0cmFuc2ZlclR5cGU/OiBzdHJpbmcsIGJhbmtHdWlkPzogc3RyaW5nLCBjdXN0b21lckd1aWQ/OiBzdHJpbmcsIGFjY291bnRHdWlkPzogc3RyaW5nLCBzdGF0ZT86IHN0cmluZywgc2lkZT86IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHR4bkhhc2g/OiBzdHJpbmcsIGNyZWF0ZWRBdEd0ZT86IHN0cmluZywgY3JlYXRlZEF0THQ/OiBzdHJpbmcsIHVwZGF0ZWRBdEd0ZT86IHN0cmluZywgdXBkYXRlZEF0THQ/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlclBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwZXJQYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGVyUGFnZSwgJ3Blcl9wYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGd1aWQgIT09IHVuZGVmaW5lZCAmJiBndWlkICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+Z3VpZCwgJ2d1aWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNmZXJUeXBlICE9PSB1bmRlZmluZWQgJiYgdHJhbnNmZXJUeXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dHJhbnNmZXJUeXBlLCAndHJhbnNmZXJfdHlwZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYW5rR3VpZCAhPT0gdW5kZWZpbmVkICYmIGJhbmtHdWlkICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YmFua0d1aWQsICdiYW5rX2d1aWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VzdG9tZXJHdWlkICE9PSB1bmRlZmluZWQgJiYgY3VzdG9tZXJHdWlkICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+Y3VzdG9tZXJHdWlkLCAnY3VzdG9tZXJfZ3VpZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY2NvdW50R3VpZCAhPT0gdW5kZWZpbmVkICYmIGFjY291bnRHdWlkICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YWNjb3VudEd1aWQsICdhY2NvdW50X2d1aWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnN0YXRlLCAnc3RhdGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lkZSAhPT0gdW5kZWZpbmVkICYmIHNpZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5zaWRlLCAnc2lkZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYWJlbCAhPT0gdW5kZWZpbmVkICYmIGxhYmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGFiZWwsICdsYWJlbCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eG5IYXNoICE9PSB1bmRlZmluZWQgJiYgdHhuSGFzaCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnR4bkhhc2gsICd0eG5faGFzaCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjcmVhdGVkQXRHdGUgIT09IHVuZGVmaW5lZCAmJiBjcmVhdGVkQXRHdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5jcmVhdGVkQXRHdGUsICdjcmVhdGVkX2F0X2d0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjcmVhdGVkQXRMdCAhPT0gdW5kZWZpbmVkICYmIGNyZWF0ZWRBdEx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+Y3JlYXRlZEF0THQsICdjcmVhdGVkX2F0X2x0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWRBdEd0ZSAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRBdEd0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnVwZGF0ZWRBdEd0ZSwgJ3VwZGF0ZWRfYXRfZ3RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWRBdEx0ICE9PSB1bmRlZmluZWQgJiYgdXBkYXRlZEF0THQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT51cGRhdGVkQXRMdCwgJ3VwZGF0ZWRfYXRfbHQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8VHJhbnNmZXJMaXN0QmFua01vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS90cmFuc2ZlcnNgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF0Y2ggVHJhbnNmZXJcbiAgICAgKiBVcGRhdGUgYSB0cmFuc2Zlci4gIFJlcXVpcmVkIHNjb3BlOiAqKnRyYW5zZmVyczp3cml0ZSoqXG4gICAgICogQHBhcmFtIHRyYW5zZmVyR3VpZCBJZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHBhcmFtIHBhdGNoVHJhbnNmZXJCYW5rTW9kZWwgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVRyYW5zZmVyKHRyYW5zZmVyR3VpZDogc3RyaW5nLCBwYXRjaFRyYW5zZmVyQmFua01vZGVsOiBQYXRjaFRyYW5zZmVyQmFua01vZGVsLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8VHJhbnNmZXJCYW5rTW9kZWw+O1xuICAgIHB1YmxpYyB1cGRhdGVUcmFuc2Zlcih0cmFuc2Zlckd1aWQ6IHN0cmluZywgcGF0Y2hUcmFuc2ZlckJhbmtNb2RlbDogUGF0Y2hUcmFuc2ZlckJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VHJhbnNmZXJCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgdXBkYXRlVHJhbnNmZXIodHJhbnNmZXJHdWlkOiBzdHJpbmcsIHBhdGNoVHJhbnNmZXJCYW5rTW9kZWw6IFBhdGNoVHJhbnNmZXJCYW5rTW9kZWwsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUcmFuc2ZlckJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyB1cGRhdGVUcmFuc2Zlcih0cmFuc2Zlckd1aWQ6IHN0cmluZywgcGF0Y2hUcmFuc2ZlckJhbmtNb2RlbDogUGF0Y2hUcmFuc2ZlckJhbmtNb2RlbCwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAodHJhbnNmZXJHdWlkID09PSBudWxsIHx8IHRyYW5zZmVyR3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmFuc2Zlckd1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVUcmFuc2Zlci4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hUcmFuc2ZlckJhbmtNb2RlbCA9PT0gbnVsbCB8fCBwYXRjaFRyYW5zZmVyQmFua01vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHBhdGNoVHJhbnNmZXJCYW5rTW9kZWwgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVUcmFuc2Zlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucGF0Y2g8VHJhbnNmZXJCYW5rTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL3RyYW5zZmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcodHJhbnNmZXJHdWlkKSl9YCxcbiAgICAgICAgICAgIHBhdGNoVHJhbnNmZXJCYW5rTW9kZWwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG59XG4iXX0=
|
363
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcGkvdHJhbnNmZXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxXQUFXLEVBQUUsVUFBVSxFQUNVLFdBQVcsRUFDeEQsTUFBWSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBK0IsWUFBWSxDQUFDO0FBYy9FLGFBQWE7QUFDYixPQUFPLEVBQUUsU0FBUyxFQUFzQixNQUEwQixjQUFjLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUEwQyxrQkFBa0IsQ0FBQzs7OztBQU9yRixNQUFNLE9BQU8sZ0JBQWdCO0lBT3pCLFlBQXNCLFVBQXNCLEVBQWdDLFFBQWdCLEVBQWMsYUFBNEI7UUFBaEgsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUxsQyxhQUFRLEdBQUcsaUNBQWlDLENBQUM7UUFDaEQsbUJBQWMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ25DLGtCQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUl2QyxJQUFJLGFBQWEsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNqRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtnQkFDOUIsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDNUI7WUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDMUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLElBQUksd0JBQXdCLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBR08sZUFBZSxDQUFDLFVBQXNCLEVBQUUsS0FBVSxFQUFFLEdBQVk7UUFDcEUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxZQUFZLElBQUksS0FBSyxLQUFLLEVBQUU7WUFDOUQsVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDakU7YUFBTTtZQUNILFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN0RTtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxVQUFzQixFQUFFLEtBQVcsRUFBRSxHQUFZO1FBQzlFLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUNmLE9BQU8sVUFBVSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNyQixLQUFlLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDeEc7aUJBQU0sSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFO2dCQUM5QixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7b0JBQ2IsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFHLEtBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ3BGO3FCQUFNO29CQUNKLE1BQU0sS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7aUJBQ3REO2FBQ0o7aUJBQU07Z0JBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUN2RSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9EO1NBQ0o7YUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDSCxNQUFNLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQVlNLGNBQWMsQ0FBQyxxQkFBNEMsRUFBRSxVQUFlLE1BQU0sRUFBRSxpQkFBMEIsS0FBSyxFQUFFLE9BQXdFO1FBQ2hNLElBQUkscUJBQXFCLEtBQUssSUFBSSxJQUFJLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtZQUN2RSxNQUFNLElBQUksS0FBSyxDQUFDLDZGQUE2RixDQUFDLENBQUM7U0FDbEg7UUFFRCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRTFDLElBQUksa0JBQXNDLENBQUM7UUFDM0MsdUNBQXVDO1FBQ3ZDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkUsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixlQUFlLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLGtCQUFrQixDQUFDLENBQUM7U0FDMUY7UUFFRCxtQ0FBbUM7UUFDbkMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRSxJQUFJLGtCQUFrQixFQUFFO1lBQ3BCLGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztTQUMxRjtRQUVELElBQUksZ0NBQWdDLEdBQXVCLE9BQU8sSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDL0YsSUFBSSxnQ0FBZ0MsS0FBSyxTQUFTLEVBQUU7WUFDaEQsaUNBQWlDO1lBQ2pDLE1BQU0saUJBQWlCLEdBQWE7Z0JBQ2hDLGtCQUFrQjthQUNyQixDQUFDO1lBQ0YsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQy9GO1FBQ0QsSUFBSSxnQ0FBZ0MsS0FBSyxTQUFTLEVBQUU7WUFDaEQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7U0FDckY7UUFFRCxJQUFJLG1CQUFtQixHQUE0QixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRTtZQUNuQyxtQkFBbUIsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQzNDO1FBR0QsdUNBQXVDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFhO1lBQ3ZCLGtCQUFrQjtTQUNyQixDQUFDO1FBQ0YsTUFBTSx1QkFBdUIsR0FBdUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RyxJQUFJLHVCQUF1QixLQUFLLFNBQVMsRUFBRTtZQUN2QyxlQUFlLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztTQUNsRjtRQUVELElBQUksYUFBYSxHQUE2QixNQUFNLENBQUM7UUFDckQsSUFBSSxnQ0FBZ0MsRUFBRTtZQUNsQyxJQUFJLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckQsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLEVBQUU7Z0JBQ3hFLGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0gsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBb0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsZ0JBQWdCLEVBQ3pGLHFCQUFxQixFQUNyQjtZQUNJLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsWUFBWSxFQUFPLGFBQWE7WUFDaEMsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZTtZQUNuRCxPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsT0FBTztZQUNoQixjQUFjLEVBQUUsY0FBYztTQUNqQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBWU0sV0FBVyxDQUFDLFlBQW9CLEVBQUUsVUFBZSxNQUFNLEVBQUUsaUJBQTBCLEtBQUssRUFBRSxPQUF3RTtRQUNySyxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLGlGQUFpRixDQUFDLENBQUM7U0FDdEc7UUFFRCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRTFDLElBQUksa0JBQXNDLENBQUM7UUFDM0MsdUNBQXVDO1FBQ3ZDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkUsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixlQUFlLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLGtCQUFrQixDQUFDLENBQUM7U0FDMUY7UUFFRCxtQ0FBbUM7UUFDbkMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRSxJQUFJLGtCQUFrQixFQUFFO1lBQ3BCLGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztTQUMxRjtRQUVELElBQUksZ0NBQWdDLEdBQXVCLE9BQU8sSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDL0YsSUFBSSxnQ0FBZ0MsS0FBSyxTQUFTLEVBQUU7WUFDaEQsaUNBQWlDO1lBQ2pDLE1BQU0saUJBQWlCLEdBQWE7Z0JBQ2hDLGtCQUFrQjthQUNyQixDQUFDO1lBQ0YsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQy9GO1FBQ0QsSUFBSSxnQ0FBZ0MsS0FBSyxTQUFTLEVBQUU7WUFDaEQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7U0FDckY7UUFFRCxJQUFJLG1CQUFtQixHQUE0QixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRTtZQUNuQyxtQkFBbUIsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQzNDO1FBR0QsSUFBSSxhQUFhLEdBQTZCLE1BQU0sQ0FBQztRQUNyRCxJQUFJLGdDQUFnQyxFQUFFO1lBQ2xDLElBQUksZ0NBQWdDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyRCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO2lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsRUFBRTtnQkFDeEUsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTTtnQkFDSCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFvQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxrQkFBa0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFDcEk7WUFDSSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFlBQVksRUFBTyxhQUFhO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQTBCTSxhQUFhLENBQUMsSUFBYSxFQUFFLE9BQWdCLEVBQUUsSUFBYSxFQUFFLFlBQXFCLEVBQUUsUUFBaUIsRUFBRSxZQUFxQixFQUFFLFdBQW9CLEVBQUUsS0FBYyxFQUFFLElBQWEsRUFBRSxLQUFjLEVBQUUsT0FBZ0IsRUFBRSxZQUFxQixFQUFFLFdBQW9CLEVBQUUsWUFBcUIsRUFBRSxXQUFvQixFQUFFLFVBQWUsTUFBTSxFQUFFLGlCQUEwQixLQUFLLEVBQUUsT0FBd0U7UUFFbmIsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUN2Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdEI7UUFDRCxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtZQUM3Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDN0I7UUFDRCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUN2Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdEI7UUFDRCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLElBQUksRUFBRTtZQUN2RCx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtZQUMvQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDL0I7UUFDRCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLElBQUksRUFBRTtZQUN2RCx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtZQUNyRCx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUN6Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUN2Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUMvRCxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdEI7UUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUN6Qyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxD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QUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyRCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO2lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsRUFBRTtnQkFDeEUsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTTtnQkFDSCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFvQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxrQkFBa0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFDdEksc0JBQXNCLEVBQ3RCO1lBQ0ksT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixZQUFZLEVBQU8sYUFBYTtZQUNoQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlO1lBQ25ELE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLGNBQWMsRUFBRSxjQUFjO1NBQ2pDLENBQ0osQ0FBQztJQUNOLENBQUM7OzhHQXBiUSxnQkFBZ0IsNENBT3dDLFNBQVM7a0hBUGpFLGdCQUFnQixjQUZmLE1BQU07NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBUWtELFFBQVE7OzBCQUFHLE1BQU07MkJBQUMsU0FBUzs7MEJBQXFCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN5YnJpZCBCYW5rIEFQSVxuICogIyBDeWJyaWQgQVBJIGRvY3VtZW50YXRpb24gIFdlbGNvbWUgdG8gQ3licmlkLCBhbiBhbGwtaW4tb25lIGNyeXB0byBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMgeW91IHRvIGVhc2lseSAqKmJ1aWxkKiogYW5kICoqbGF1bmNoKiogd2hpdGUtbGFiZWwgY3J5cHRvIHByb2R1Y3RzIG9yIHNlcnZpY2VzLiAgSW4gdGhlc2UgZG9jdW1lbnRzLCB5b3VcXCdsbCBmaW5kIGRldGFpbHMgb24gaG93IG91ciBSRVNUIEFQSSBvcGVyYXRlcyBhbmQgZ2VuZXJhbGx5IGhvdyBvdXIgcGxhdGZvcm0gZnVuY3Rpb25zLiAgSWYgeW91XFwncmUgbG9va2luZyBmb3Igb3VyIFVJIFNESyBXaWRnZXRzIGZvciBXZWIgb3IgTW9iaWxlIChpT1MvQW5kcm9pZCksIGdlbmVyYXRlZCBBUEkgY2xpZW50cywgb3IgZGVtbyBhcHBsaWNhdGlvbnMsIGhlYWQgb3ZlciB0byBvdXIgW0dpdGh1YiByZXBvXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcCkuICDwn5KhIFdlIHJlY29tbWVuZCBib29rbWFya2luZyB0aGUgW0N5YnJpZCBMaW5rVHJlZV0oaHR0cHM6Ly9saW5rdHIuZWUvY3licmlkdGVjaG5vbG9naWVzKSB3aGljaCBjb250YWlucyBtYW55IGhlbHBmdWwgbGlua3MgdG8gcGxhdGZvcm0gcmVzb3VyY2VzLiAgIyMgR2V0dGluZyBTdGFydGVkICBUaGlzIGlzIEN5YnJpZFxcJ3MgcHVibGljIGludGVyYWN0aXZlIEFQSSBkb2N1bWVudGF0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIGZ1bGx5IHRlc3Qgb3VyIEFQSXMuIElmIHlvdVxcJ2QgbGlrZSB0byB1c2UgYSBkaWZmZXJlbnQgdG9vbCB0byBleGVyY2lzZSBvdXIgQVBJcywgeW91IGNhbiBkb3dubG9hZCB0aGUgW09wZW4gQVBJIDMuMCB5YW1sXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvdjEvc3dhZ2dlci55YW1sKSBmb3IgaW1wb3J0LiAgSWYgeW91XFwncmUgbmV3IHRvIG91ciBBUElzIGFuZCB0aGUgQ3licmlkIFBsYXRmb3JtLCBmb2xsb3cgdGhlIGJlbG93IGd1aWRlcyB0byBnZXQgc2V0IHVwIGFuZCBmYW1pbGlhciB3aXRoIHRoZSBwbGF0Zm9ybTogIDEuIFtJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaW50cm9kdWN0aW9uKSAyLiBbUGxhdGZvcm0gSW50cm9kdWN0aW9uXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2hvdy1pcy1jeWJyaWQtYXJjaGl0ZWN0ZWQpIDMuIFtUZXN0aW5nIHdpdGggSG9zdGVkIFdlYiBEZW1vIEFwcF0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy90ZXN0aW5nLXdpdGgtaG9zdGVkLXdlYi1kZW1vLWFwcCkgIEluIFtHZXR0aW5nIFN0YXJ0ZWQgaW4gdGhlIEN5YnJpZCBTYW5kYm94XShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2hvdy1kby1pLWdldC1zdGFydGVkLXdpdGgtdGhlLXNhbmRib3gpLCB3ZSB3YWxrIHlvdSB0aHJvdWdoIGhvdyB0byB1c2UgdGhlIFtDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9pZC5zYW5kYm94LmN5YnJpZC5hcHAvKSB0byBjcmVhdGUgYSB0ZXN0IGJhbmsgYW5kIGdlbmVyYXRlIEFQSSBrZXlzLiBJbiBbR2V0dGluZyBSZWFkeSBmb3IgVHJhZGluZ10oaHR0cHM6Ly9rYi5jeWJyaWQueHl6L2dldHRpbmctcmVhZHktZm9yLXRyYWRpbmcpLCB3ZSB3YWxrIHRocm91Z2ggY3JlYXRpbmcgY3VzdG9tZXJzLCBjdXN0b21lciBpZGVudGl0aWVzLCBhY2NvdW50cywgYXMgd2VsbCBhcyBleGVjdXRpbmcgcXVvdGVzIGFuZCB0cmFkZXMuICAjIyBXb3JraW5nIHdpdGggdGhlIEN5YnJpZCBQbGF0Zm9ybSAgVGhlcmUgYXJlIHRocmVlIHByaW1hcnkgd2F5cyB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIEN5YnJpZCBwbGF0Zm9ybTogIDEuIERpcmVjdGx5IHZpYSBvdXIgUkVTVGZ1bCBBUEkgKHRoaXMgZG9jdW1lbnRhdGlvbikgMi4gVXNpbmcgb3VyIEFQSSBjbGllbnRzIGF2YWlsYWJsZSBpbiBhIHZhcmlldHkgb2YgbGFuZ3VhZ2VzIChbQW5ndWxhcl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWFuZ3VsYXIpLCBbSmF2YV0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWphdmEpLCBbS290bGluXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmsta290bGluKSwgW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXB5dGhvbiksIFtSdWJ5XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcnVieSksIFtTd2lmdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXN3aWZ0KSBvciBbVHlwZXNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXR5cGVzY3JpcHQpKSAzLiBJbnRlZ3JhdGluZyBhIHBsYXRmb3JtIHNwZWNpZmljIFNESyAoW1dlYl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay13ZWIpLCBbQW5kcm9pZF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1hbmRyb2lkKSwgW2lPU10oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1pb3MpKSAgT3VyIGNvbXBsZXRlIHNldCBvZiBBUElzIGFsbG93cyB5b3UgdG8gbWFuYWdlIHJlc291cmNlcyBhY3Jvc3MgdGhyZWUgZGlzdGluY3QgYXJlYXM6IHlvdXIgYE9yZ2FuaXphdGlvbmAsIHlvdXIgYEJhbmtzYCBhbmQgeW91ciBgSWRlbnRpdGllc2AuIEZvciBtb3N0IG9mIHlvdXIgdGVzdGluZyBhbmQgaW50ZXJhY3Rpb24geW91XFwnbGwgYmUgdXNpbmcgdGhlIGBCYW5rYCBBUEksIHdoaWNoIGlzIHdoZXJlIHRoZSBtYWpvcml0eSBvZiBBUElzIHJlc2lkZS4gICpUaGUgY29tcGxldGUgc2V0IG9mIEFQSXMgY2FuIGJlIGZvdW5kIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXM6KiAgfCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgW09yZ2FuaXphdGlvbiBBUEldKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgfCBBUElzIHRvIG1hbmFnZSBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgW0JhbmsgQVBJXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgfCBBUElzIHRvIG1hbmFnZSBiYW5rcyAoYW5kIGFsbCBkb3duc3RyZWFtIGN1c3RvbWVyIGFjdGl2aXR5KSB8IHwgW0lkZW50aXRpZXMgQVBJXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgICAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbiBhbmQgYmFuayBpZGVudGl0aWVzICAgICAgICAgICAgIHwgIEZvciBxdWVzdGlvbnMgcGxlYXNlIGNvbnRhY3QgW1N1cHBvcnRdKG1haWx0bzpzdXBwb3J0QGN5YnJpZC54eXopIGF0IGFueSB0aW1lIGZvciBhc3Npc3RhbmNlLCBvciBjb250YWN0IHRoZSBbUHJvZHVjdCBUZWFtXShtYWlsdG86cHJvZHVjdEBjeWJyaWQueHl6KSBmb3IgcHJvZHVjdCBzdWdnZXN0aW9ucy4gICMjIEF1dGhlbnRpY2F0aW5nIHdpdGggdGhlIEFQSSAgVGhlIEN5YnJpZCBQbGF0Zm9ybSB1c2VzIE9BdXRoIDIuMCBCZWFyZXIgVG9rZW5zIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgcGxhdGZvcm0uIENyZWRlbnRpYWxzIHRvIGNyZWF0ZSBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIHZpYSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkuIEFjY2VzcyB0b2tlbnMgY2FuIGJlIGdlbmVyYXRlZCBmb3IgYSBgQ3VzdG9tZXJgIGFzIHdlbGwgdmlhIHRoZSBbQ3licmlkIElkUF0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHApIGFzIHdlbGwuICBBbiBgT3JnYW5pemF0aW9uYCBhY2Nlc3MgdG9rZW4gYXBwbGllcyBicm9hZGx5IHRvIHRoZSB3aG9sZSBPcmdhbml6YXRpb24gYW5kIGFsbCBvZiBpdHMgYEJhbmtzYCwgd2hlcmVhcywgYSBgQmFua2AgYWNjZXNzIHRva2VuIGlzIHNwZWNpZmljIHRvIGFuIGluZGl2aWR1YWwgQmFuay4gYEN1c3RvbWVyYCB0b2tlbnMsIHNpbWlsYXJseSwgYXJlIHNjb3BlZCB0byBhIHNwZWNpZmljIGN1c3RvbWVyIGluIGEgYmFuay4gIEJvdGggYE9yZ2FuaXphdGlvbmAgYW5kIGBCYW5rYCB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIE9BdXRoIENsaWVudCBDcmVkZW50aWFsIEdyYW50IGZsb3cuIEVhY2ggT3JnYW5pemF0aW9uIGFuZCBCYW5rIGhhcyBpdHMgb3duIHVuaXF1ZSBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgdGhhdCBhbGxvd3MgZm9yIG1hY2hpbmUtdG8tbWFjaGluZSBhdXRoZW50aWNhdGlvbi4gIEEgYEJhbmtgIGNhbiB0aGVuIGdlbmVyYXRlIGBDdXN0b21lcmAgYWNjZXNzIHRva2VucyB2aWEgQVBJIHVzaW5nIG91ciBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkuICA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOZXZlciBzaGFyZSB5b3VyIENsaWVudCBJRCBvciBTZWNyZXQgcHVibGljbHkgb3IgaW4geW91ciBzb3VyY2UgY29kZSByZXBvc2l0b3J5LioqPC9mb250PiAgWW91ciBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYSB0aW1lLWxpbWl0ZWQgYEJlYXJlciBUb2tlbmAgYnkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQ3licmlkIElkZW50aXR5IFByb3ZpZGVyIG9yIHRocm91Z2ggaW50ZXJhY3Rpbmcgd2l0aCB0aGUgKipBdXRob3JpemUqKiBidXR0b24gaW4gdGhpcyBkb2N1bWVudC4gIFRoZSBmb2xsb3dpbmcgY3VybCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZ2VuZXJhdGUgYSBgQmVhcmVyIFRva2VuYCBmb3IgdXNlIGluIHRlc3RpbmcgdGhlIEFQSSBvciBkZW1vIGFwcGxpY2F0aW9ucy4gIGBgYCAjIEV4YW1wbGUgcmVxdWVzdCB3aGVuIHVzaW5nIEJhbmsgY3JlZGVudGlhbHMgY3VybCAtWCBQT1NUIGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL29hdXRoL3Rva2VuIC1kIFxcJ3sgICAgIFxcXCJncmFudF90eXBlXFxcIjogXFxcImNsaWVudF9jcmVkZW50aWFsc1xcXCIsICAgICBcXFwiY2xpZW50X2lkXFxcIjogXFxcIjxZb3VyIENsaWVudCBJRD5cXFwiLCAgICAgXFxcImNsaWVudF9zZWNyZXRcXFwiOiBcXFwiPFlvdXIgU2VjcmV0PlxcXCIsICAgICBcXFwic2NvcGVcXFwiOiBcXFwiYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rX2FwcGxpY2F0aW9uczpleGVjdXRlIGFjY291bnRzOnJlYWQgYWNjb3VudHM6ZXhlY3V0ZSBjb3VudGVycGFydGllczpyZWFkIGNvdW50ZXJwYXJ0aWVzOnBpaTpyZWFkIGNvdW50ZXJwYXJ0aWVzOndyaXRlIGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOnBpaTpyZWFkIGN1c3RvbWVyczp3cml0ZSBjdXN0b21lcnM6ZXhlY3V0ZSBwcmljZXM6cmVhZCBxdW90ZXM6ZXhlY3V0ZSBxdW90ZXM6cmVhZCB0cmFkZXM6ZXhlY3V0ZSB0cmFkZXM6cmVhZCB0cmFuc2ZlcnM6ZXhlY3V0ZSB0cmFuc2ZlcnM6cmVhZCB0cmFuc2ZlcnM6d3JpdGUgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cGlpOnJlYWQgZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIGV4dGVybmFsX3dhbGxldHM6ZXhlY3V0ZSB3b3JrZmxvd3M6cmVhZCB3b3JrZmxvd3M6ZXhlY3V0ZSBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIGRlcG9zaXRfYWRkcmVzc2VzOmV4ZWN1dGUgZGVwb3NpdF9iYW5rX2FjY291bnRzOnJlYWQgZGVwb3NpdF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgaW52b2ljZXM6cmVhZCBpbnZvaWNlczp3cml0ZSBpbnZvaWNlczpleGVjdXRlIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCBpZGVudGl0eV92ZXJpZmljYXRpb25zOnBpaTpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIHBlcnNvbmFfc2Vzc2lvbnM6ZXhlY3V0ZSBmaWxlczpyZWFkIGZpbGVzOnBpaTpyZWFkIGZpbGVzOmV4ZWN1dGVcXFwiICAgfVxcJyAtSCBcXFwiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXFxcIiAgIyBXaGVuIHVzaW5nIE9yZ2FuaXphdGlvbiBjcmVkZW50aWFscyBzZXQgYHNjb3BlYCB0byBcXCdvcmdhbml6YXRpb25zOnJlYWQgb3JnYW5pemF0aW9uczp3cml0ZSBvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOmV4ZWN1dGUgYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rczpleGVjdXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgdXNlcnM6cmVhZCB1c2VyczpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6cGlpOnJlYWQgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOnBpaTpyZWFkIGFjY291bnRzOnJlYWQgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOndyaXRlIHRyYW5zZmVyczpleGVjdXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOnBpaTpyZWFkIGV4dGVybmFsX3dhbGxldHM6cmVhZCB3b3JrZmxvd3M6cmVhZCBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIGRlcG9zaXRfYmFua19hY2NvdW50czpyZWFkIGludm9pY2VzOnJlYWQgc3Vic2NyaXB0aW9uczpyZWFkIHN1YnNjcmlwdGlvbnM6d3JpdGUgc3Vic2NyaXB0aW9uczpleGVjdXRlIHN1YnNjcmlwdGlvbl9ldmVudHM6cmVhZCBzdWJzY3JpcHRpb25fZXZlbnRzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cGlpOnJlYWQgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIHBlcnNvbmFfc2Vzc2lvbnM6ZXhlY3V0ZSBmaWxlczpyZWFkIGZpbGVzOnBpaTpyZWFkIGZpbGVzOmV4ZWN1dGVcXCcgYGBgIDxmb250IGNvbG9yPVxcXCJvcmFuZ2VcXFwiPioq4pqg77iPIE5vdGU6IFRoZSBhYm92ZSBjdXJsIHdpbGwgY3JlYXRlIGEgYmVhcmVyIHRva2VuIHdpdGggZnVsbCBzY29wZSBhY2Nlc3MuIERlbGV0ZSBzY29wZXMgaWYgeW91XFwnZCBsaWtlIHRvIHJlc3RyaWN0IGFjY2Vzcy4qKjwvZm9udD4gICMjIEF1dGhlbnRpY2F0aW9uIFNjb3BlcyAgVGhlIEN5YnJpZCBwbGF0Zm9ybSBzdXBwb3J0cyB0aGUgdXNlIG9mIHNjb3BlcyB0byBjb250cm9sIHRoZSBsZXZlbCBvZiBhY2Nlc3MgYSB0b2tlbiBpcyBsaW1pdGVkIHRvLiBTY29wZXMgZG8gbm90IGdyYW50IGFjY2VzcyB0byByZXNvdXJjZXM7IGluc3RlYWQsIHRoZXkgcHJvdmlkZSBsaW1pdHMsIGluIHN1cHBvcnQgb2YgdGhlIGxlYXN0IHByaXZpbGVnZSBwcmluY2lwYWwuICBUaGUgZm9sbG93aW5nIHNjb3BlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybSBhbmQgY2FuIGJlIHJlcXVlc3RlZCB3aGVuIGdlbmVyYXRpbmcgZWl0aGVyIGFuIE9yZ2FuaXphdGlvbiwgQmFuayBvciBDdXN0b21lciB0b2tlbi4gR2VuZXJhbGx5IHNwZWFraW5nLCB0aGUgX1JlYWRfIHNjb3BlIGlzIHJlcXVpcmVkIHRvIHJlYWQgYW5kIGxpc3QgcmVzb3VyY2VzLCB0aGUgX1dyaXRlXyBzY29wZSBpcyByZXF1aXJlZCB0byB1cGRhdGUgYSByZXNvdXJjZSBhbmQgdGhlIF9FeGVjdXRlXyBzY29wZSBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSByZXNvdXJjZS4gIHwgUmVzb3VyY2UgICAgICAgICAgICAgIHwgUmVhZCBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdyaXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICB8IEV4ZWN1dGUgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgQWNjb3VudCAgICAgICAgICAgICAgIHwgYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgICAgICAgICAgIHwgYmFua3M6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJhbmtzOndyaXRlIChPcmdhbml6YXRpb24sIEJhbmspICAgICAgICAgICAgICB8IGJhbmtzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICB8IHwgQ3VzdG9tZXIgICAgICAgICAgICAgIHwgY3VzdG9tZXJzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8IGN1c3RvbWVyczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8IGN1c3RvbWVyczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQ291bnRlcnBhcnR5ICAgICAgICAgIHwgY291bnRlcnBhcnRpZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgKEJhbmspICAgICAgICAgICAgICAgICAgICB8IHwgRGVwb3NpdCBBZGRyZXNzICAgICAgIHwgZGVwb3NpdF9hZGRyZXNzZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICB8IHwgRXh0ZXJuYWwgQmFuayBBY2NvdW50IHwgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICB8IHwgRXh0ZXJuYWwgV2FsbGV0ICAgICAgIHwgZXh0ZXJuYWxfd2FsbGV0OnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dGVybmFsX3dhbGxldDpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICB8IHwgT3JnYW5pemF0aW9uICAgICAgICAgIHwgb3JnYW5pemF0aW9uczpyZWFkIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6d3JpdGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgVXNlciAgICAgICAgICAgICAgICAgIHwgdXNlcnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVzZXJzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICB8IHwgUHJpY2UgICAgICAgICAgICAgICAgIHwgcHJpY2VzOnJlYWQgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgUXVvdGUgICAgICAgICAgICAgICAgIHwgcXVvdGVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHF1b3RlczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICB8IHwgVHJhZGUgICAgICAgICAgICAgICAgIHwgdHJhZGVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYWRlczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICB8IHwgVHJhbnNmZXIgICAgICAgICAgICAgIHwgdHJhbnNmZXJzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zZmVyczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSB8IHwgV29ya2Zsb3cgICAgICAgICAgICAgIHwgd29ya2Zsb3dzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdvcmtmbG93czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IHwgSW52b2ljZSAgICAgICAgICAgICAgIHwgaW52b2ljZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IGludm9pY2VzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IGludm9pY2VzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICB8ICAjIyBBdmFpbGFibGUgRW5kcG9pbnRzICBUaGUgYXZhaWxhYmxlIEFQSXMgZm9yIHRoZSBbSWRlbnRpdHldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSksIFtPcmdhbml6YXRpb25dKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpIGFuZCBbQmFua10oaHR0cHM6Ly9iYW5rLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpIEFQSSBzZXJ2aWNlcyBhcmUgbGlzdGVkIGJlbG93OiAgfCBBUEkgU2VydmljZSAgfCBNb2RlbCAgICAgICAgICAgICAgICB8IEFQSSBFbmRwb2ludCBQYXRoICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgSWRlbnRpdHkgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtfYXBwbGljYXRpb25zICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgYmFua3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBDdXN0b21lclRva2VuICAgICAgICB8IC9hcGkvY3VzdG9tZXJfdG9rZW5zICAgICAgICAgICB8IENyZWF0ZSBjdXN0b21lciBKV1QgYWNjZXNzIHRva2VucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS9vcmdhbml6YXRpb25fYXBwbGljYXRpb25zIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL3VzZXJzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3Qgb3JnYW5pemF0aW9uIHVzZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBPcmdhbml6YXRpb24gfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9ucyAgICAgICAgICAgICB8IEFQSXMgdG8gcmV0cmlldmUgYW5kIHVwZGF0ZSBvcmdhbml6YXRpb24gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFjY291bnQgICAgICAgICAgICAgIHwgL2FwaS9hY2NvdW50cyAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGFjY291bnRzLCB3aGljaCBob2xkIGEgc3BlY2lmaWMgYXNzZXQgZm9yIGEgY3VzdG9tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQXNzZXQgICAgICAgICAgICAgICAgfCAvYXBpL2Fzc2V0cyAgICAgICAgICAgICAgICAgICAgfCBHZXQgYSBsaXN0IG9mIGFzc2V0cyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIChleDogQlRDLCBFVEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBCYW5rICAgICAgICAgICAgICAgICB8IC9hcGkvYmFua3MgICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgdXBkYXRlIGFuZCBsaXN0IGJhbmtzLCB0aGUgcGFyZW50IHRvIGN1c3RvbWVycywgYWNjb3VudHMsIGV0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEN1c3RvbWVyICAgICAgICAgICAgIHwgL2FwaS9jdXN0b21lcnMgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQ291bnRlcnBhcnR5ICAgICAgICAgfCAvYXBpL2NvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgY291bnRlcnBhcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBEZXBvc2l0QWRkcmVzcyAgICAgICB8IC9hcGkvZGVwb3NpdF9hZGRyZXNzZXMgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGRlcG9zaXQgYWRkcmVzc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsQmFua0FjY291bnQgIHwgL2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgZXh0ZXJuYWwgYmFuayBhY2NvdW50cywgd2hpY2ggY29ubmVjdCBjdXN0b21lciBiYW5rIGFjY291bnRzIHRvIHRoZSBwbGF0Zm9ybSB8IHwgQmFuayAgICAgICAgIHwgRXh0ZXJuYWxXYWxsZXQgICAgICAgfCAvYXBpL2V4dGVybmFsX3dhbGxldHMgICAgICAgICAgfCBDcmVhdGUsIGdldCwgbGlzdCBhbmQgZGVsZXRlIGV4dGVybmFsIHdhbGxldHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgd2FsbGV0cyB0byB0aGUgcGxhdGZvcm0gICAgIHwgfCBCYW5rICAgICAgICAgfCBJZGVudGl0eVZlcmlmaWNhdGlvbiB8IC9hcGkvaWRlbnRpdHlfdmVyaWZpY2F0aW9ucyAgICB8IENyZWF0ZSBhbmQgbGlzdCBpZGVudGl0eSB2ZXJpZmljYXRpb25zLCB3aGljaCBhcmUgcGVyZm9ybWVkIG9uIGN1c3RvbWVycyBmb3IgS1lDICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEludm9pY2UgICAgICAgICAgICAgIHwgL2FwaS9pbnZvaWNlcyAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGNhbmNlbCBhbmQgbGlzdCBpbnZvaWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUGF5bWVudEluc3RydWN0aW9uICAgfCAvYXBpL3BheW1lbnRfaW5zdHJ1Y3Rpb25zICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBwYXltZW50IGluc3RydWN0aW9ucyBmb3IgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBQcmljZSAgICAgICAgICAgICAgICB8IC9hcGkvcHJpY2VzICAgICAgICAgICAgICAgICAgICB8IEdldCB0aGUgY3VycmVudCBwcmljZXMgZm9yIGFzc2V0cyBvbiB0aGUgcGxhdGZvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFF1b3RlICAgICAgICAgICAgICAgIHwgL2FwaS9xdW90ZXMgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IHF1b3Rlcywgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGV4ZWN1dGUgdHJhZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgU3ltYm9sICAgICAgICAgICAgICAgfCAvYXBpL3N5bWJvbHMgICAgICAgICAgICAgICAgICAgfCBHZXQgYSBsaXN0IG9mIHN5bWJvbHMgc3VwcG9ydGVkIGZvciB0cmFkZSAoZXg6IEJUQy1VU0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFkZSAgICAgICAgICAgICAgICB8IC9hcGkvdHJhZGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCB0cmFkZXMsIHdoaWNoIGJ1eSBvciBzZWxsIGNyeXB0b2N1cnJlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFRyYW5zZmVyICAgICAgICAgICAgIHwgL2FwaS90cmFuc2ZlcnMgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgdHJhbnNmZXJzIChlLmcuLCBmdW5kaW5nLCBib29rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgV29ya2Zsb3cgICAgICAgICAgICAgfCAvYXBpL3dvcmtmbG93cyAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCB3b3JrZmxvd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICMjIFVuZGVyc3RhbmRpbmcgT2JqZWN0IE1vZGVscyAmIEVuZHBvaW50cyAgKipPcmdhbml6YXRpb25zKiogIEFuIGBPcmdhbml6YXRpb25gIGlzIG1lYW50IHRvIHJlcHJlc2VudCB0aGUgb3JnYW5pemF0aW9uIHBhcnRuZXJpbmcgd2l0aCBDeWJyaWQgdG8gdXNlIG91ciBwbGF0Zm9ybS4gIEFuIGBPcmdhbml6YXRpb25gIHR5cGljYWxseSBkb2VzIG5vdCBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIGBjdXN0b21lcnNgLiBJbnN0ZWFkLCBhbiBPcmdhbml6YXRpb24gaGFzIG9uZSBvciBtb3JlIGBiYW5rc2AsIHdoaWNoIGVuY29tcGFzcyB0aGUgZmluYW5jaWFsIHNlcnZpY2Ugb2ZmZXJpbmdzIG9mIHRoZSBwbGF0Zm9ybS4gICoqQmFua3MqKiAgQSBgQmFua2AgaXMgb3duZWQgYnkgYW4gYE9yZ2FuaXphdGlvbmAgYW5kIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGFuIGVudmlyb25tZW50IG9yIGNvbnRhaW5lciBmb3IgYGN1c3RvbWVyc2AgYW5kIHByb2R1Y3Qgb2ZmZXJpbmdzLiBCYW5rcyBhcmUgY3JlYXRlZCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBtb2RlLCB3aGVyZSBgU2FuZGJveGAgaXMgdGhlIGVudmlyb25tZW50IHRoYXQgeW91IHdvdWxkIHRlc3QsIHByb3RvdHlwZSBhbmQgYnVpbGQgaW4gcHJpb3IgdG8gbW92aW5nIHRvIGBQcm9kdWN0aW9uYC4gIEFuIGBPcmdhbml6YXRpb25gIGNhbiBoYXZlIG11bHRpcGxlIGBiYW5rc2AsIGluIGVpdGhlciBgU2FuZGJveGAgb3IgYFByb2R1Y3Rpb25gIGVudmlyb25tZW50cy4gQSBgU2FuZGJveCBCYW5rYCB3aWxsIGJlIGJhY2tlZCBieSBzdHViYmVkIGRhdGEgYW5kIHByb2Nlc3MgZmxvd3MuIEZvciBpbnN0YW5jZSwgZnVuZGluZyBzb3VyY2UgdHJhbnNmZXIgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdHJhZGVzIHdpbGwgYmUgc2ltdWxhdGVkIHJhdGhlciB0aGFuIHBlcmZvcm1lZCwgaG93ZXZlciBhc3NldCBwcmljZXMgYXJlIHJlcHJlc2VudGF0aXZlIG9mIHJlYWwtd29ybGQgdmFsdWVzLiBZb3UgaGF2ZSBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIHNpbXVsYXRlZCBmaWF0IGN1cnJlbmN5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAgKipDdXN0b21lcnMqKiAgYEN1c3RvbWVyc2AgcmVwcmVzZW50IHlvdXIgYmFua2luZyB1c2VycyBvbiB0aGUgcGxhdGZvcm0uIEF0IHByZXNlbnQsIHdlIG9mZmVyIHN1cHBvcnQgZm9yIGBJbmRpdmlkdWFsc2AgYXMgQ3VzdG9tZXJzLiAgYEN1c3RvbWVyc2AgbXVzdCBiZSB2ZXJpZmllZCAoaS5lLiwgS1lDXFwnZCkgaW4gb3VyIHN5c3RlbSBiZWZvcmUgdGhleSBjYW4gcGxheSBhbnkgcGFydCBvbiB0aGUgcGxhdGZvcm0sIHdoaWNoIG1lYW5zIHRoZXkgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgYW5kIGEgcGFzc2luZyBgSWRlbnRpdHkgVmVyaWZpY2F0aW9uYC4gU2VlIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb25zIHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgYSBjdXN0b21lciBjYW4gYmUgdmVyaWZpZWQuICBgQ3VzdG9tZXJzYCBtdXN0IGFsc28gaGF2ZSBhbiBgQWNjb3VudGAgdG8gYmUgYWJsZSB0byB0cmFuc2FjdCwgaW4gdGhlIGRlc2lyZWQgYXNzZXQgY2xhc3MuIFNlZSB0aGUgQWNjb3VudHMgQVBJcyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNldHRpbmcgdXAgYWNjb3VudHMgZm9yIHRoZSBjdXN0b21lci4gXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IHYwLjEyMy41NTlcbiAqIENvbnRhY3Q6IHN1cHBvcnRAY3licmlkLmFwcFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwUGFyYW1ldGVyQ29kZWMsIEh0dHBDb250ZXh0IFxuICAgICAgICB9ICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9lbmNvZGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRXJyb3JSZXNwb25zZUJhbmtNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Vycm9yUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUGF0Y2hUcmFuc2ZlckJhbmtNb2RlbCB9IGZyb20gJy4uL21vZGVsL3BhdGNoVHJhbnNmZXInO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUG9zdFRyYW5zZmVyQmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvcG9zdFRyYW5zZmVyJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRyYW5zZmVyQmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvdHJhbnNmZXInO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVHJhbnNmZXJMaXN0QmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvdHJhbnNmZXJMaXN0JztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUcmFuc2ZlcnNTZXJ2aWNlIHtcblxuICAgIHByb3RlY3RlZCBiYXNlUGF0aCA9ICdodHRwczovL2Jhbmsuc2FuZGJveC5jeWJyaWQuYXBwJztcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgcHVibGljIGVuY29kZXI6IEh0dHBQYXJhbWV0ZXJDb2RlYztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlciB8fCBuZXcgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjKCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlPzogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKCBlbGVtID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cigwLCAxMCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCggayA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMsIHZhbHVlW2tdLCBrZXkgIT0gbnVsbCA/IGAke2tleX0uJHtrfWAgOiBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBUcmFuc2ZlclxuICAgICAqIENyZWF0ZXMgYSB0cmFuc2Zlci4gICMjIFN0YXRlICB8IFN0YXRlIHwgRGVzY3JpcHRpb24gfCB8LS0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8IHN0b3JpbmcgfCBUaGUgUGxhdGZvcm0gaXMgc3RvcmluZyB0aGUgdHJhbnNmZXIgZGV0YWlscyBpbiBvdXIgcHJpdmF0ZSBzdG9yZSB8IHwgcmV2aWV3aW5nIHwgVGhlIFBsYXRmb3JtIGlzIHJldmlld2luZyB0aGUgdHJhbnNmZXIgZm9yIGNvbXBsaWFuY2UgfCB8IHBlbmRpbmcgfCBUaGUgUGxhdGZvcm0gaXMgZXhlY3V0aW5nIHRoZSB0cmFuc2ZlciB8IHwgY29tcGxldGVkIHwgVGhlIFBsYXRmb3JtIGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoZSB0cmFuc2ZlciB8IHwgZmFpbGVkIHwgVGhlIFBsYXRmb3JtIHdhcyBub3QgYWJsZSB0byBzdWNjZXNzZnVsbHkgY29tcGxldGUgdGhlIHRyYW5zZmVyIHwgICMjIEZhaWx1cmUgY29kZXMgIHwgQ29kZSB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8IGFtb3VudF90b29fbG93IHwgVGhlIHRyYW5zZmVyIHdhcyByZWplY3RlZCBkdWUgdG8gdGhlIGFtb3VudCBiZWluZyB0b28gbG93IHwgfCBjYW5jZWxsZWQgfCBUaGUgdHJhbnNmZXIgd2FzIG1hbnVhbGx5IGNhbmNlbGxlZCB8IHwgY29tcGxpYW5jZV9yZWplY3Rpb24gfCBUaGUgdHJhbnNmZXIgd2FzIHJlamVjdGVkIGZvciBjb21wbGlhbmNlIHJlYXNvbnMgfCB8IGludGVybmFsX2Vycm9yIHwgQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgdHJhbnNmZXIsIHBsZWFzZSB0cnkgYWdhaW4gfCB8IGludmFsaWRfYWRkcmVzcyB8IFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIGludmFsaWQgZm9yIHRyYW5zZmVyIHwgfCBpbnZhbGlkX2JhbGFuY2UgfCBUaGVyZSB3YXMgaW5zdWZmaWNpZW50IGJhbGFuY2UgZm9yIGFsbCByZXF1aXJlZCBjdXJyZW5jaWVzIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2ZlciB8IHwgbGltaXRfZXhjZWVkZWQgfCBUaGUgY3VzdG9tZXIgaXMgb3ZlciB0aGUgbGltaXRzIHRoYXQgaGF2ZSBiZWVuIHNldCBmb3IgdGhlbSBmb3IgdGhpcyBhY3Rpdml0eSB8IHwgbmV0d29ya19mZWVfdG9vX2xvdyB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgZHVlIHRvIHRoZSBuZXR3b3JrIGZlZSBiZWluZyB0b28gbG93IHwgfCBub25fc3VmZmljaWVudF9mdW5kcyB8IFRoZSBjdXN0b21lciBkb2VzIG5vdCBoYXZlIGVub3VnaCBmdW5kcyB0byBjb21wbGV0ZSB0aGUgdHJhbnNmZXIgfCB8IHBhcnR5X25hbWVfaW52YWxpZCB8IFRoZSB0cmFuc2ZlclxcJiMzOTtzIGFzc29jaWF0ZWQgZXh0ZXJuYWwgYmFuayBhY2NvdW50IGhhcyBhbiBpbnZhbGlkIHBhcnR5IG5hbWUgfCB8IHBheW1lbnRfcmFpbF9pbnZhbGlkIHwgVGhlIHBheW1lbnQgcmFpbCBzcGVjaWZpZWQgZm9yIHRoZSB0cmFuc2ZlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgfCB8IHBsYWlkX2FjY2Vzc19ub3RfZ3JhbnRlZCB8IFNlZSB0aGUgZGVzY3JpcHRpb24gZnJvbSBQbGFpZCBbaGVyZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaXRlbS8jYWNjZXNzX25vdF9ncmFudGVkKSB8IHwgcGxhaWRfaW5zdGl0dXRpb25fbm90X3Jlc3BvbmRpbmcgfCBTZWUgdGhlIGRlc2NyaXB0aW9uIGZyb20gUGxhaWQgW2hlcmVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2luc3RpdHV0aW9uLyNpbnN0aXR1dGlvbl9ub3RfcmVzcG9uZGluZykgfCB8IHBsYWlkX2ludGVybmFsX3NlcnZlcl9lcnJvciB8IFNlZSB0aGUgZGVzY3JpcHRpb24gZnJvbSBQbGFpZCBbaGVyZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvYXBpLyNpbnRlcm5hbF9zZXJ2ZXJfZXJyb3Itb3ItcGxhaWQtaW50ZXJuYWwtZXJyb3IpIHwgfCBwbGFpZF9pdGVtX25vdF9mb3VuZCB8IFNlZSB0aGUgZGVzY3JpcHRpb24gZnJvbSBQbGFpZCBbaGVyZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaXRlbS8jaXRlbV9ub3RfZm91bmQpIHwgfCBwbGFpZF9pdGVtX25vdF9zdXBwb3J0ZWQgfCBTZWUgdGhlIGRlc2NyaXB0aW9uIGZyb20gUGxhaWQgW2hlcmVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2l0ZW0vI2l0ZW1fbm90X3N1cHBvcnRlZCkgfCB8IHBsYWlkX211bHRpcGxlX2FjY291bnRzIHwgTXVsdGlwbGUgYWNjb3VudHMgd2VyZSBzZWxlY3RlZCB0aHJvdWdoIFBsYWlkIExpbmsuIHwgfCBwbGFpZF9ub19hY2NvdW50cyB8IFNlZSB0aGUgZGVzY3JpcHRpb24gZnJvbSBQbGFpZCBbaGVyZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvaXRlbS8jbm9fYWNjb3VudHMpIHwgfCBwbGFpZF9ub25lX2JhbGFuY2VzX2Vycm9yIHwgVGhlIHRyYW5zZmVyIHdhcyByZWplY3RlZCBkdWUgdG8gYW4gZXJyb3Igd2l0aCB0aGUgYmFsYW5jZXMgcmV0cmlldmVkIGJ5IFBsYWlkIHwgfCBwbGFpZF91bmtub3duX2Vycm9yIHwgU2VlIHRoZSBkZXNjcmlwdGlvbiBmcm9tIFBsYWlkIFtoZXJlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy9hcGkvI3Vua25vd25fZXJyb3IpIHwgfCByZWZyZXNoX3JlcXVpcmVkIHwgVGhlIHRyYW5zZmVyXFwmIzM5O3MgYXNzb2NpYXRlZCBleHRlcm5hbF9iYW5rX2FjY291bnQgbmVlZHMgdG8gYmUgcmVjb25uZWN0ZWQgdmlhIFBsYWlkIHwgfCByZXZlcnNlZCB8IFRoZSB0cmFuc2ZlciB3YXMgcmV2ZXJzZWQgfCAgIyMgRmFpbHVyZSBjb2RlcyB0aGF0IHdpbGwgcmVzdWx0IGluIGEgc3RhdGUgY2hhbmdlIGZvciB0aGUgYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgIHwgQ29kZSB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCB8IHJlZnJlc2hfcmVxdWlyZWQgfCBUaGUgdHJhbnNmZXIgd2FzIHJlamVjdGVkIGR1ZSB0byB0aGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IG5lZWRpbmcgdG8gYmUgcmVmcmVzaGVkLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtyZWZyZXNoX3JlcXVpcmVkJiN4NjA7IHwgfCBwbGFpZF9hY2Nlc3Nfbm90X2dyYW50ZWQgfCBUaGUgdHJhbnNmZXIgd2FzIHJlamVjdGVkIGR1ZSB0byB0aGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IG5lZWRpbmcgdG8gYmUgcmVjb25uZWN0ZWQgdmlhIFBsYWlkLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtkZWxldGVkJiN4NjA7IHwgfCBwbGFpZF9pdGVtX25vdF9mb3VuZCB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgZHVlIHRvIHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgbmVlZGluZyB0byBiZSByZWNvbm5lY3RlZCB2aWEgUGxhaWQuIFRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgd2lsbCBiZSBwdXQgaW4gdGhlIHN0YXRlICYjeDYwO2RlbGV0ZWQmI3g2MDsgfCB8IHBsYWlkX2l0ZW1fbm90X3N1cHBvcnRlZCB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgYmVjYXVzZSB0aGUgYWNjb3VudCBpcyBub3Qgc3VwcG9ydGVkLiBBIGRpZmZlcmVudCBhY2NvdW50IHNob3VsZCBiZSBjb25uZWN0ZWQgdmlhIFBsYWlkLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtkZWxldGVkJiN4NjA7IHwgfCBwbGFpZF9tdWx0aXBsZV9hY2NvdW50cyB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgYmVjYXVzZSBtdWx0aXBsZSBhY2NvdW50cyB3ZXJlIHNlbGVjdGVkIHRocm91Z2ggUGxhaWQgTGluay4gT25seSBvbmUgYWNjb3VudCBtdXN0IGJlIHNlbGVjdGVkLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtkZWxldGVkJiN4NjA7IHwgfCBwbGFpZF9ub19hY2NvdW50cyB8IFRoZSB0cmFuc2ZlciB3YXMgcmVqZWN0ZWQgYmVjYXVzZSBubyBjb21wYXRpYmxlIGFjY291bnRzIGNvdWxkIGJlIGZvdW5kLiBUaGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHdpbGwgYmUgcHV0IGluIHRoZSBzdGF0ZSAmI3g2MDtkZWxldGVkJiN4NjA7IHwgICAgUmVxdWlyZWQgc2NvcGU6ICoqdHJhbnNmZXJzOmV4ZWN1dGUqKlxuICAgICAqIEBwYXJhbSBwb3N0VHJhbnNmZXJCYW5rTW9kZWwgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVRyYW5zZmVyKHBvc3RUcmFuc2ZlckJhbmtNb2RlbDogUG9zdFRyYW5zZmVyQmFua01vZGVsLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8VHJhbnNmZXJCYW5rTW9kZWw+O1xuICAgIHB1YmxpYyBjcmVhdGVUcmFuc2Zlcihwb3N0VHJhbnNmZXJCYW5rTW9kZWw6IFBvc3RUcmFuc2ZlckJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VHJhbnNmZXJCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgY3JlYXRlVHJhbnNmZXIocG9zdFRyYW5zZmVyQmFua01vZGVsOiBQb3N0VHJhbnNmZXJCYW5rTW9kZWwsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUcmFuc2ZlckJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVUcmFuc2Zlcihwb3N0VHJhbnNmZXJCYW5rTW9kZWw6IFBvc3RUcmFuc2ZlckJhbmtNb2RlbCwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAocG9zdFRyYW5zZmVyQmFua01vZGVsID09PSBudWxsIHx8IHBvc3RUcmFuc2ZlckJhbmtNb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBwb3N0VHJhbnNmZXJCYW5rTW9kZWwgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVUcmFuc2Zlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxUcmFuc2ZlckJhbmtNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvdHJhbnNmZXJzYCxcbiAgICAgICAgICAgIHBvc3RUcmFuc2ZlckJhbmtNb2RlbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgVHJhbnNmZXJcbiAgICAgKiBSZXRyaWV2ZXMgYSB0cmFuc2Zlci4gIFJlcXVpcmVkIHNjb3BlOiAqKnRyYW5zZmVyczpyZWFkKipcbiAgICAgKiBAcGFyYW0gdHJhbnNmZXJHdWlkIElkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHJhbnNmZXIodHJhbnNmZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxUcmFuc2ZlckJhbmtNb2RlbD47XG4gICAgcHVibGljIGdldFRyYW5zZmVyKHRyYW5zZmVyR3VpZDogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxUcmFuc2ZlckJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBnZXRUcmFuc2Zlcih0cmFuc2Zlckd1aWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFRyYW5zZmVyQmFua01vZGVsPj47XG4gICAgcHVibGljIGdldFRyYW5zZmVyKHRyYW5zZmVyR3VpZDogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmICh0cmFuc2Zlckd1aWQgPT09IG51bGwgfHwgdHJhbnNmZXJHdWlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHRyYW5zZmVyR3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFRyYW5zZmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxUcmFuc2ZlckJhbmtNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvdHJhbnNmZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh0cmFuc2Zlckd1aWQpKX1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0cmFuc2ZlcnMgbGlzdFxuICAgICAqIFJldHJpZXZlcyBhIGxpc3Rpbmcgb2YgdHJhbnNmZXJzLiAgUmVxdWlyZWQgc2NvcGU6ICoqdHJhbnNmZXJzOnJlYWQqKlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIGluZGV4IHRvIHJldHJpZXZlLlxuICAgICAqIEBwYXJhbSBwZXJQYWdlIFRoZSBudW1iZXIgb2YgZW50aXRpZXMgcGVyIHBhZ2UgdG8gcmV0dXJuLlxuICAgICAqIEBwYXJhbSBndWlkIENvbW1hIHNlcGFyYXRlZCB0cmFuc2Zlcl9ndWlkcyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSBDb21tYSBzZXBhcmF0ZWQgdHJhbnNmZXJfdHlwZXMgdG8gbGlzdCBhY2NvdW50cyBmb3IuXG4gICAgICogQHBhcmFtIGJhbmtHdWlkIENvbW1hIHNlcGFyYXRlZCBiYW5rX2d1aWRzIHRvIGxpc3QgdHJhbnNmZXJzIGZvci5cbiAgICAgKiBAcGFyYW0gY3VzdG9tZXJHdWlkIENvbW1hIHNlcGFyYXRlZCBjdXN0b21lcl9ndWlkcyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIGFjY291bnRHdWlkIENvbW1hIHNlcGFyYXRlZCBhY2NvdW50X2d1aWRzIHRvIGxpc3QgdHJhbnNmZXJzIGZvci5cbiAgICAgKiBAcGFyYW0gc3RhdGUgQ29tbWEgc2VwYXJhdGVkIHN0YXRlcyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIHNpZGUgQ29tbWEgc2VwYXJhdGVkIHNpZGVzIHRvIGxpc3QgdHJhbnNmZXJzIGZvci5cbiAgICAgKiBAcGFyYW0gbGFiZWwgQ29tbWEgc2VwYXJhdGVkIGxhYmVscyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIHR4bkhhc2ggQ29tbWEgc2VwYXJhdGVkIHRyYW5zYWN0aW9uIGhhc2hlcyB0byBsaXN0IHRyYW5zZmVycyBmb3IuXG4gICAgICogQHBhcmFtIGNyZWF0ZWRBdEd0ZSBDcmVhdGVkIGF0IHN0YXJ0IGRhdGUtdGltZSBpbmNsdXNpdmUgbG93ZXIgYm91bmQsIElTTzg2MDFcbiAgICAgKiBAcGFyYW0gY3JlYXRlZEF0THQgQ3JlYXRlZCBhdCBlbmQgZGF0ZS10aW1lIGV4Y2x1c2l2ZSB1cHBlciBib3VuZCwgSVNPODYwMS5cbiAgICAgKiBAcGFyYW0gdXBkYXRlZEF0R3RlIENyZWF0ZWQgYXQgc3RhcnQgZGF0ZS10aW1lIGluY2x1c2l2ZSBsb3dlciBib3VuZCwgSVNPODYwMVxuICAgICAqIEBwYXJhbSB1cGRhdGVkQXRMdCBDcmVhdGVkIGF0IGVuZCBkYXRlLXRpbWUgZXhjbHVzaXZlIHVwcGVyIGJvdW5kLCBJU084NjAxLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0VHJhbnNmZXJzKHBhZ2U/OiBzdHJpbmcsIHBlclBhZ2U/OiBzdHJpbmcsIGd1aWQ/OiBzdHJpbmcsIHRyYW5zZmVyVHlwZT86IHN0cmluZywgYmFua0d1aWQ/OiBzdHJpbmcsIGN1c3RvbWVyR3VpZD86IHN0cmluZywgYWNjb3VudEd1aWQ/OiBzdHJpbmcsIHN0YXRlPzogc3RyaW5nLCBzaWRlPzogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdHhuSGFzaD86IHN0cmluZywgY3JlYXRlZEF0R3RlPzogc3RyaW5nLCBjcmVhdGVkQXRMdD86IHN0cmluZywgdXBkYXRlZEF0R3RlPzogc3RyaW5nLCB1cGRhdGVkQXRMdD86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPFRyYW5zZmVyTGlzdEJhbmtNb2RlbD47XG4gICAgcHVibGljIGxpc3RUcmFuc2ZlcnMocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgZ3VpZD86IHN0cmluZywgdHJhbnNmZXJUeXBlPzogc3RyaW5nLCBiYW5rR3VpZD86IHN0cmluZywgY3VzdG9tZXJHdWlkPzogc3RyaW5nLCBhY2NvdW50R3VpZD86IHN0cmluZywgc3RhdGU/OiBzdHJpbmcsIHNpZGU/OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nLCB0eG5IYXNoPzogc3RyaW5nLCBjcmVhdGVkQXRHdGU/OiBzdHJpbmcsIGNyZWF0ZWRBdEx0Pzogc3RyaW5nLCB1cGRhdGVkQXRHdGU/OiBzdHJpbmcsIHVwZGF0ZWRBdEx0Pzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxUcmFuc2Zlckxpc3RCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgbGlzdFRyYW5zZmVycyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCB0cmFuc2ZlclR5cGU/OiBzdHJpbmcsIGJhbmtHdWlkPzogc3RyaW5nLCBjdXN0b21lckd1aWQ/OiBzdHJpbmcsIGFjY291bnRHdWlkPzogc3RyaW5nLCBzdGF0ZT86IHN0cmluZywgc2lkZT86IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHR4bkhhc2g/OiBzdHJpbmcsIGNyZWF0ZWRBdEd0ZT86IHN0cmluZywgY3JlYXRlZEF0THQ/OiBzdHJpbmcsIHVwZGF0ZWRBdEd0ZT86IHN0cmluZywgdXBkYXRlZEF0THQ/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUcmFuc2Zlckxpc3RCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgbGlzdFRyYW5zZmVycyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCB0cmFuc2ZlclR5cGU/OiBzdHJpbmcsIGJhbmtHdWlkPzogc3RyaW5nLCBjdXN0b21lckd1aWQ/OiBzdHJpbmcsIGFjY291bnRHdWlkPzogc3RyaW5nLCBzdGF0ZT86IHN0cmluZywgc2lkZT86IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHR4bkhhc2g/OiBzdHJpbmcsIGNyZWF0ZWRBdEd0ZT86IHN0cmluZywgY3JlYXRlZEF0THQ/OiBzdHJpbmcsIHVwZGF0ZWRBdEd0ZT86IHN0cmluZywgdXBkYXRlZEF0THQ/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlclBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwZXJQYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGVyUGFnZSwgJ3Blcl9wYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGd1aWQgIT09IHVuZGVmaW5lZCAmJiBndWlkICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+Z3VpZCwgJ2d1aWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhbnNmZXJUeXBlICE9PSB1bmRlZmluZWQgJiYgdHJhbnNmZXJUeXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dHJhbnNmZXJUeXBlLCAndHJhbnNmZXJfdHlwZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYW5rR3VpZCAhPT0gdW5kZWZpbmVkICYmIGJhbmtHdWlkICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YmFua0d1aWQsICdiYW5rX2d1aWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VzdG9tZXJHdWlkICE9PSB1bmRlZmluZWQgJiYgY3VzdG9tZXJHdWlkICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+Y3VzdG9tZXJHdWlkLCAnY3VzdG9tZXJfZ3VpZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY2NvdW50R3VpZCAhPT0gdW5kZWZpbmVkICYmIGFjY291bnRHdWlkICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YWNjb3VudEd1aWQsICdhY2NvdW50X2d1aWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnN0YXRlLCAnc3RhdGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lkZSAhPT0gdW5kZWZpbmVkICYmIHNpZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5zaWRlLCAnc2lkZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYWJlbCAhPT0gdW5kZWZpbmVkICYmIGxhYmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGFiZWwsICdsYWJlbCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eG5IYXNoICE9PSB1bmRlZmluZWQgJiYgdHhuSGFzaCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnR4bkhhc2gsICd0eG5faGFzaCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjcmVhdGVkQXRHdGUgIT09IHVuZGVmaW5lZCAmJiBjcmVhdGVkQXRHdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5jcmVhdGVkQXRHdGUsICdjcmVhdGVkX2F0X2d0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjcmVhdGVkQXRMdCAhPT0gdW5kZWZpbmVkICYmIGNyZWF0ZWRBdEx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+Y3JlYXRlZEF0THQsICdjcmVhdGVkX2F0X2x0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWRBdEd0ZSAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRBdEd0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnVwZGF0ZWRBdEd0ZSwgJ3VwZGF0ZWRfYXRfZ3RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWRBdEx0ICE9PSB1bmRlZmluZWQgJiYgdXBkYXRlZEF0THQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT51cGRhdGVkQXRMdCwgJ3VwZGF0ZWRfYXRfbHQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8VHJhbnNmZXJMaXN0QmFua01vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS90cmFuc2ZlcnNgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF0Y2ggVHJhbnNmZXJcbiAgICAgKiBVcGRhdGUgYSB0cmFuc2Zlci4gIFJlcXVpcmVkIHNjb3BlOiAqKnRyYW5zZmVyczp3cml0ZSoqXG4gICAgICogQHBhcmFtIHRyYW5zZmVyR3VpZCBJZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHBhcmFtIHBhdGNoVHJhbnNmZXJCYW5rTW9kZWwgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVRyYW5zZmVyKHRyYW5zZmVyR3VpZDogc3RyaW5nLCBwYXRjaFRyYW5zZmVyQmFua01vZGVsOiBQYXRjaFRyYW5zZmVyQmFua01vZGVsLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8VHJhbnNmZXJCYW5rTW9kZWw+O1xuICAgIHB1YmxpYyB1cGRhdGVUcmFuc2Zlcih0cmFuc2Zlckd1aWQ6IHN0cmluZywgcGF0Y2hUcmFuc2ZlckJhbmtNb2RlbDogUGF0Y2hUcmFuc2ZlckJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VHJhbnNmZXJCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgdXBkYXRlVHJhbnNmZXIodHJhbnNmZXJHdWlkOiBzdHJpbmcsIHBhdGNoVHJhbnNmZXJCYW5rTW9kZWw6IFBhdGNoVHJhbnNmZXJCYW5rTW9kZWwsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUcmFuc2ZlckJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyB1cGRhdGVUcmFuc2Zlcih0cmFuc2Zlckd1aWQ6IHN0cmluZywgcGF0Y2hUcmFuc2ZlckJhbmtNb2RlbDogUGF0Y2hUcmFuc2ZlckJhbmtNb2RlbCwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAodHJhbnNmZXJHdWlkID09PSBudWxsIHx8IHRyYW5zZmVyR3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB0cmFuc2Zlckd1aWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVUcmFuc2Zlci4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hUcmFuc2ZlckJhbmtNb2RlbCA9PT0gbnVsbCB8fCBwYXRjaFRyYW5zZmVyQmFua01vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHBhdGNoVHJhbnNmZXJCYW5rTW9kZWwgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVUcmFuc2Zlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucGF0Y2g8VHJhbnNmZXJCYW5rTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL3RyYW5zZmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcodHJhbnNmZXJHdWlkKSl9YCxcbiAgICAgICAgICAgIHBhdGNoVHJhbnNmZXJCYW5rTW9kZWwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG59XG4iXX0=
|