@bitgo-beta/sdk-coin-sol 7.6.4-beta.4 → 7.6.4-beta.400
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/cjs/src/bigint-buffer-guard.js +29 -0
- package/dist/cjs/src/config/token2022StaticConfig.d.ts.map +1 -0
- package/dist/cjs/src/config/token2022StaticConfig.js +50 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/ataInitializationBuilder.js +196 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts +51 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/closeAtaBuilder.js +147 -0
- package/dist/{src → cjs/src}/lib/constants.d.ts +24 -0
- package/dist/cjs/src/lib/constants.d.ts.map +1 -0
- package/dist/cjs/src/lib/constants.js +196 -0
- package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/customInstructionBuilder.js +289 -0
- package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
- package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
- package/dist/cjs/src/lib/explainTransactionWasm.js +264 -0
- package/dist/{src → cjs/src}/lib/iface.d.ts +20 -2
- package/dist/cjs/src/lib/iface.d.ts.map +1 -0
- package/dist/cjs/src/lib/iface.js +7 -0
- package/dist/{src → cjs/src}/lib/index.d.ts +1 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/lib/index.js +4 -2
- package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +1 -0
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/instructionParamsFactory.js +1059 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
- package/dist/cjs/src/lib/keyPair.js +63 -0
- package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
- package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
- package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/solInstructionFactory.js +595 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.js +120 -0
- package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
- package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingDeactivateBuilder.js +208 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.js +120 -0
- package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
- package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingWithdrawBuilder.js +78 -0
- package/dist/cjs/src/lib/token2022Config.d.ts.map +1 -0
- package/dist/cjs/src/lib/token2022Config.js +27 -0
- package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenTransferBuilder.js +188 -0
- package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/transaction.js +612 -0
- package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilder.js +380 -0
- package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +5 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.js +209 -0
- package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilder.js +70 -0
- package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilderV2.js +210 -0
- package/dist/cjs/src/lib/utils.d.ts.map +1 -0
- package/dist/cjs/src/lib/utils.js +604 -0
- package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
- package/dist/cjs/src/register.d.ts.map +1 -0
- package/dist/cjs/src/register.js +15 -0
- package/dist/{src → cjs/src}/sol.d.ts +53 -0
- package/dist/cjs/src/sol.d.ts.map +1 -0
- package/dist/cjs/src/sol.js +1464 -0
- package/dist/cjs/src/solToken.d.ts.map +1 -0
- package/dist/cjs/src/solToken.js +69 -0
- package/dist/cjs/src/tsol.d.ts.map +1 -0
- package/dist/cjs/src/tsol.js +24 -0
- package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
- package/dist/cjs/test/fixtures/sol.js +1433 -0
- package/dist/{test → cjs/test}/resources/sol.d.ts +27 -27
- package/dist/cjs/test/resources/sol.d.ts.map +1 -0
- package/dist/cjs/test/resources/sol.js +320 -0
- package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
- package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
- package/dist/cjs/test/unit/explainTransactionWasm.js +26 -0
- package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
- package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/instructionParamsFactory.js +412 -0
- package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
- package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
- package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
- package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
- package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
- package/dist/cjs/test/unit/keyPair.js +177 -0
- package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
- package/dist/cjs/test/unit/sol.js +3504 -0
- package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/solInstructionFactory.js +454 -0
- package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
- package/dist/cjs/test/unit/solToken.js +31 -0
- package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction.js +1108 -0
- package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +333 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +286 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
- package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
- package/dist/cjs/test/unit/utils.js +517 -0
- package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/versionedTransaction.js +207 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/bigint-buffer-guard.d.ts +1 -0
- package/dist/esm/config/token2022StaticConfig.d.ts +3 -0
- package/dist/esm/config/token2022StaticConfig.js +47 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/lib/ataInitializationBuilder.d.ts +47 -0
- package/dist/esm/lib/ataInitializationBuilder.js +156 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts +51 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/esm/lib/closeAtaBuilder.js +140 -0
- package/dist/esm/lib/constants.d.ts +164 -0
- package/dist/esm/lib/constants.d.ts.map +1 -0
- package/dist/esm/lib/constants.js +193 -0
- package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
- package/dist/esm/lib/customInstructionBuilder.js +282 -0
- package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
- package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
- package/dist/esm/lib/explainTransactionWasm.js +261 -0
- package/dist/esm/lib/iface.d.ts +262 -0
- package/dist/esm/lib/iface.d.ts.map +1 -0
- package/dist/esm/lib/iface.js +3 -0
- package/dist/esm/lib/index.d.ts +23 -0
- package/dist/{src → esm}/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +23 -0
- package/dist/esm/lib/instructionParamsFactory.d.ts +13 -0
- package/dist/{src → esm}/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/esm/lib/instructionParamsFactory.js +1052 -0
- package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
- package/dist/esm/lib/keyPair.d.ts +26 -0
- package/dist/esm/lib/keyPair.js +59 -0
- package/dist/esm/lib/messages/index.d.ts +2 -0
- package/dist/esm/lib/messages/index.js +2 -0
- package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
- package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
- package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
- package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
- package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
- package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
- package/dist/esm/lib/solInstructionFactory.js +589 -0
- package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
- package/dist/esm/lib/stakingActivateBuilder.js +113 -0
- package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
- package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
- package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
- package/dist/{src → esm}/lib/stakingDeactivateBuilder.js +31 -38
- package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
- package/dist/esm/lib/stakingDelegateBuilder.js +113 -0
- package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
- package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
- package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
- package/dist/esm/lib/stakingWithdrawBuilder.js +71 -0
- package/dist/esm/lib/token2022Config.d.ts +44 -0
- package/dist/esm/lib/token2022Config.js +23 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts +41 -0
- package/dist/esm/lib/tokenTransferBuilder.js +181 -0
- package/dist/esm/lib/transaction.d.ts +103 -0
- package/dist/esm/lib/transaction.d.ts.map +1 -0
- package/dist/esm/lib/transaction.js +605 -0
- package/dist/esm/lib/transactionBuilder.d.ts +128 -0
- package/dist/esm/lib/transactionBuilder.js +373 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts +120 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/esm/lib/transactionBuilderFactory.js +205 -0
- package/dist/esm/lib/transferBuilder.d.ts +26 -0
- package/dist/esm/lib/transferBuilder.js +63 -0
- package/dist/esm/lib/transferBuilderV2.d.ts +43 -0
- package/dist/esm/lib/transferBuilderV2.js +203 -0
- package/dist/esm/lib/utils.d.ts +200 -0
- package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +567 -0
- package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
- package/dist/esm/lib/walletInitializationBuilder.js +64 -0
- package/dist/esm/register.d.ts +3 -0
- package/dist/esm/register.js +11 -0
- package/dist/esm/sol.d.ts +280 -0
- package/dist/esm/sol.d.ts.map +1 -0
- package/dist/esm/sol.js +1423 -0
- package/dist/esm/solToken.d.ts +37 -0
- package/dist/esm/solToken.js +65 -0
- package/dist/esm/tsol.d.ts +11 -0
- package/dist/esm/tsol.js +20 -0
- package/package.json +35 -16
- package/dist/src/config/token2022StaticConfig.js +0 -50
- package/dist/src/lib/ataInitializationBuilder.js +0 -196
- package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
- package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
- package/dist/src/lib/closeAtaBuilder.js +0 -69
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -171
- package/dist/src/lib/customInstructionBuilder.js +0 -289
- package/dist/src/lib/iface.d.ts.map +0 -1
- package/dist/src/lib/iface.js +0 -7
- package/dist/src/lib/instructionParamsFactory.js +0 -1036
- package/dist/src/lib/jitoStakePoolOperations.js +0 -200
- package/dist/src/lib/keyPair.js +0 -63
- package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
- package/dist/src/lib/solInstructionFactory.js +0 -572
- package/dist/src/lib/stakingActivateBuilder.js +0 -120
- package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
- package/dist/src/lib/stakingDelegateBuilder.js +0 -120
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
- package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
- package/dist/src/lib/token2022Config.js +0 -27
- package/dist/src/lib/tokenTransferBuilder.js +0 -188
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -595
- package/dist/src/lib/transactionBuilder.js +0 -380
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilderFactory.js +0 -202
- package/dist/src/lib/transferBuilder.js +0 -70
- package/dist/src/lib/transferBuilderV2.js +0 -210
- package/dist/src/lib/utils.js +0 -586
- package/dist/src/lib/walletInitializationBuilder.js +0 -71
- package/dist/src/register.js +0 -15
- package/dist/src/sol.d.ts.map +0 -1
- package/dist/src/sol.js +0 -1285
- package/dist/src/solToken.js +0 -69
- package/dist/src/tsol.js +0 -24
- package/dist/test/fixtures/sol.js +0 -1433
- package/dist/test/resources/sol.d.ts.map +0 -1
- package/dist/test/resources/sol.js +0 -320
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
- package/dist/test/unit/fixtures/solBackupKey.js +0 -8
- package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
- package/dist/test/unit/getBuilderFactory.js +0 -10
- package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
- package/dist/test/unit/instructionParamsFactory.js +0 -412
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
- package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
- package/dist/test/unit/keyPair.js +0 -177
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
- package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
- package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
- package/dist/test/unit/sol.js +0 -3108
- package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
- package/dist/test/unit/solInstructionFactory.js +0 -454
- package/dist/test/unit/solToken.d.ts.map +0 -1
- package/dist/test/unit/solToken.js +0 -31
- package/dist/test/unit/transaction.d.ts.map +0 -1
- package/dist/test/unit/transaction.js +0 -983
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
- package/dist/test/unit/utils.js +0 -517
- package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
- package/dist/test/unit/versionedTransaction.js +0 -207
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
- /package/dist/{src → cjs/src}/config/token2022StaticConfig.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/keyPair.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/token2022Config.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transferBuilderV2.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/utils.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/register.d.ts +0 -0
- /package/dist/{src → cjs/src}/solToken.d.ts +0 -0
- /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
- /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
- /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
- /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
- /package/dist/{src → esm}/config/token2022StaticConfig.d.ts.map +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/ataInitializationBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/keyPair.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/token2022Config.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/tokenTransferBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/transactionBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/transferBuilderV2.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/register.d.ts.map +0 -0
- /package/dist/{src → esm}/solToken.d.ts.map +0 -0
- /package/dist/{src → esm}/tsol.d.ts.map +0 -0
package/dist/src/lib/utils.js
DELETED
|
@@ -1,586 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.isIdempotentAtaInstruction = isIdempotentAtaInstruction;
|
|
7
|
-
exports.isValidAddress = isValidAddress;
|
|
8
|
-
exports.isValidBlockId = isValidBlockId;
|
|
9
|
-
exports.isValidPrivateKey = isValidPrivateKey;
|
|
10
|
-
exports.isValidPublicKey = isValidPublicKey;
|
|
11
|
-
exports.isValidSignature = isValidSignature;
|
|
12
|
-
exports.isValidTransactionId = isValidTransactionId;
|
|
13
|
-
exports.isValidAmount = isValidAmount;
|
|
14
|
-
exports.isValidStakingAmount = isValidStakingAmount;
|
|
15
|
-
exports.isValidMemo = isValidMemo;
|
|
16
|
-
exports.isValidBase64 = isValidBase64;
|
|
17
|
-
exports.isValidHex = isValidHex;
|
|
18
|
-
exports.isValidRawTransaction = isValidRawTransaction;
|
|
19
|
-
exports.verifySignature = verifySignature;
|
|
20
|
-
exports.base58ToUint8Array = base58ToUint8Array;
|
|
21
|
-
exports.Uint8ArrayTobase58 = Uint8ArrayTobase58;
|
|
22
|
-
exports.countNotNullSignatures = countNotNullSignatures;
|
|
23
|
-
exports.requiresAllSignatures = requiresAllSignatures;
|
|
24
|
-
exports.matchTransactionTypeByInstructionsOrder = matchTransactionTypeByInstructionsOrder;
|
|
25
|
-
exports.getTransactionType = getTransactionType;
|
|
26
|
-
exports.getInstructionType = getInstructionType;
|
|
27
|
-
exports.validateIntructionTypes = validateIntructionTypes;
|
|
28
|
-
exports.validateRawMsgInstruction = validateRawMsgInstruction;
|
|
29
|
-
exports.validateRawTransaction = validateRawTransaction;
|
|
30
|
-
exports.validateAddress = validateAddress;
|
|
31
|
-
exports.getSolTokenFromAddress = getSolTokenFromAddress;
|
|
32
|
-
exports.getSolTokenFromAddressOnly = getSolTokenFromAddressOnly;
|
|
33
|
-
exports.getSolTokenFromTokenName = getSolTokenFromTokenName;
|
|
34
|
-
exports.getAssociatedTokenAccountAddress = getAssociatedTokenAccountAddress;
|
|
35
|
-
exports.validateMintAddress = validateMintAddress;
|
|
36
|
-
exports.validateOwnerAddress = validateOwnerAddress;
|
|
37
|
-
exports.isSolLegacyInstruction = isSolLegacyInstruction;
|
|
38
|
-
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
39
|
-
const statics_1 = require("@bitgo-beta/statics");
|
|
40
|
-
const spl_token_1 = require("@solana/spl-token");
|
|
41
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
42
|
-
const assert_1 = __importDefault(require("assert"));
|
|
43
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
44
|
-
const bs58_1 = __importDefault(require("bs58"));
|
|
45
|
-
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
46
|
-
const constants_1 = require("./constants");
|
|
47
|
-
const spl_stake_pool_1 = require("@solana/spl-stake-pool");
|
|
48
|
-
const DECODED_BLOCK_HASH_LENGTH = 32; // https://docs.solana.com/developing/programming-model/transactions#blockhash-format
|
|
49
|
-
const DECODED_SIGNATURE_LENGTH = 64; // https://docs.solana.com/terminology#signature
|
|
50
|
-
const BASE_58_ENCONDING_REGEX = '[1-9A-HJ-NP-Za-km-z]';
|
|
51
|
-
const COMPUTE_BUDGET = 'ComputeBudget111111111111111111111111111111';
|
|
52
|
-
/**
|
|
53
|
-
* Checks if an ATA instruction is idempotent (discriminator byte = 1).
|
|
54
|
-
*
|
|
55
|
-
* Idempotent ATA instructions use Buffer.from([1]) as instruction data, created by
|
|
56
|
-
* @solana/spl-token's createAssociatedTokenAccountIdempotentInstruction() (v0.4.1+).
|
|
57
|
-
* An idempotent ATA instruction succeed even if account exists,
|
|
58
|
-
* preventing race condition errors in concurrent scenarios.
|
|
59
|
-
*
|
|
60
|
-
* @param {TransactionInstruction} instruction - The instruction to validate
|
|
61
|
-
* @returns {boolean} True if instruction data is a single byte with value 1
|
|
62
|
-
*/
|
|
63
|
-
function isIdempotentAtaInstruction(instruction) {
|
|
64
|
-
return instruction.data.length === 1 && instruction.data[0] === 1;
|
|
65
|
-
}
|
|
66
|
-
/** @inheritdoc */
|
|
67
|
-
function isValidAddress(address) {
|
|
68
|
-
return isValidPublicKey(address);
|
|
69
|
-
}
|
|
70
|
-
/** @inheritdoc */
|
|
71
|
-
function isValidBlockId(hash) {
|
|
72
|
-
try {
|
|
73
|
-
return (!!hash && new RegExp(BASE_58_ENCONDING_REGEX).test(hash) && bs58_1.default.decode(hash).length === DECODED_BLOCK_HASH_LENGTH);
|
|
74
|
-
}
|
|
75
|
-
catch (e) {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/** @inheritdoc */
|
|
80
|
-
function isValidPrivateKey(prvKey) {
|
|
81
|
-
try {
|
|
82
|
-
const key = typeof prvKey === 'string' ? base58ToUint8Array(prvKey) : prvKey;
|
|
83
|
-
return !!web3_js_1.Keypair.fromSecretKey(key);
|
|
84
|
-
}
|
|
85
|
-
catch (e) {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/** @inheritdoc */
|
|
90
|
-
function isValidPublicKey(pubKey) {
|
|
91
|
-
try {
|
|
92
|
-
if ((0, sdk_core_1.isValidXpub)(pubKey))
|
|
93
|
-
return true;
|
|
94
|
-
new web3_js_1.PublicKey(pubKey);
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/** @inheritdoc */
|
|
102
|
-
function isValidSignature(signature) {
|
|
103
|
-
try {
|
|
104
|
-
return !!signature && bs58_1.default.decode(signature).length === DECODED_SIGNATURE_LENGTH;
|
|
105
|
-
}
|
|
106
|
-
catch (e) {
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/** @inheritdoc */
|
|
111
|
-
// TransactionId are the first signature on a Transaction
|
|
112
|
-
function isValidTransactionId(txId) {
|
|
113
|
-
return isValidSignature(txId);
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Returns whether or not the string is a valid amount of lamports number
|
|
117
|
-
*
|
|
118
|
-
* @param {string} amount - the string to validate
|
|
119
|
-
* @returns {boolean} - the validation result
|
|
120
|
-
*/
|
|
121
|
-
function isValidAmount(amount) {
|
|
122
|
-
const bigNumberAmount = new bignumber_js_1.default(amount);
|
|
123
|
-
return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThanOrEqualTo(0);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Check if the string is a valid amount of lamports number on staking
|
|
127
|
-
*
|
|
128
|
-
* @param {string} amount - the string to validate
|
|
129
|
-
* @returns {boolean} - the validation result
|
|
130
|
-
*/
|
|
131
|
-
function isValidStakingAmount(amount) {
|
|
132
|
-
const bigNumberAmount = new bignumber_js_1.default(amount);
|
|
133
|
-
return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThan(0);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Check if this is a valid memo or not.
|
|
137
|
-
*
|
|
138
|
-
* @param memo - the memo string
|
|
139
|
-
* @returns {boolean} - the validation result
|
|
140
|
-
*/
|
|
141
|
-
function isValidMemo(memo) {
|
|
142
|
-
return Buffer.from(memo).length <= constants_1.MAX_MEMO_LENGTH;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Checks if a string is valid base64 encoded data
|
|
146
|
-
* @param str - The string to validate
|
|
147
|
-
* @returns True if the string is valid base64, false otherwise
|
|
148
|
-
*/
|
|
149
|
-
function isValidBase64(str) {
|
|
150
|
-
try {
|
|
151
|
-
const decoded = Buffer.from(str, 'base64').toString('base64');
|
|
152
|
-
return decoded === str;
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
return false;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Checks if a string is valid hexadecimal data
|
|
160
|
-
* @param str - The string to validate
|
|
161
|
-
* @returns True if the string is valid hex, false otherwise
|
|
162
|
-
*/
|
|
163
|
-
function isValidHex(str) {
|
|
164
|
-
return /^[0-9A-Fa-f]*$/.test(str) && str.length % 2 === 0;
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Checks if raw transaction can be deserialized
|
|
168
|
-
*
|
|
169
|
-
* @param {string} rawTransaction - transaction in base64 string format
|
|
170
|
-
* @param {boolean} requireAllSignatures - require all signatures to be present
|
|
171
|
-
* @param {boolean} verifySignatures - verify signatures
|
|
172
|
-
* @returns {boolean} - the validation result
|
|
173
|
-
*/
|
|
174
|
-
function isValidRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
|
|
175
|
-
try {
|
|
176
|
-
const tx = web3_js_1.Transaction.from(Buffer.from(rawTransaction, 'base64'));
|
|
177
|
-
tx.serialize({ requireAllSignatures, verifySignatures });
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
catch (e) {
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Verifies if signature for message is valid.
|
|
186
|
-
*
|
|
187
|
-
* @param {Buffer} serializedTx - tx as a base64 string
|
|
188
|
-
* @param {string} signature - signature as a string
|
|
189
|
-
* @param {string} publicKey - public key as base 58
|
|
190
|
-
* @returns {Boolean} true if signature is valid.
|
|
191
|
-
*/
|
|
192
|
-
function verifySignature(serializedTx, signature, publicKey) {
|
|
193
|
-
if (!isValidRawTransaction(serializedTx)) {
|
|
194
|
-
throw new sdk_core_1.UtilsError('Invalid serializedTx');
|
|
195
|
-
}
|
|
196
|
-
if (!isValidPublicKey(publicKey)) {
|
|
197
|
-
throw new sdk_core_1.UtilsError('Invalid publicKey');
|
|
198
|
-
}
|
|
199
|
-
if (!isValidSignature(signature)) {
|
|
200
|
-
throw new sdk_core_1.UtilsError('Invalid signature');
|
|
201
|
-
}
|
|
202
|
-
const msg = web3_js_1.Transaction.from(Buffer.from(serializedTx, 'base64')).serializeMessage();
|
|
203
|
-
const sig = base58ToUint8Array(signature);
|
|
204
|
-
const pub = new web3_js_1.PublicKey(publicKey);
|
|
205
|
-
return tweetnacl_1.default.sign.detached.verify(msg, sig, pub.toBuffer());
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Converts a base58 string into a Uint8Array.
|
|
209
|
-
*
|
|
210
|
-
* @param {string} input - a string in base58
|
|
211
|
-
* @returns {Uint8Array} - an Uint8Array
|
|
212
|
-
*/
|
|
213
|
-
function base58ToUint8Array(input) {
|
|
214
|
-
return new Uint8Array(bs58_1.default.decode(input));
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Converts a Uint8Array to a base58 string.
|
|
218
|
-
*
|
|
219
|
-
* @param {Uint8Array} input - an Uint8Array
|
|
220
|
-
* @returns {string} - a string in base58
|
|
221
|
-
*/
|
|
222
|
-
function Uint8ArrayTobase58(input) {
|
|
223
|
-
return bs58_1.default.encode(input);
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Count the amount of signatures are not null.
|
|
227
|
-
*
|
|
228
|
-
* @param {SignaturePubkeyPair[]} signatures - an array of SignaturePubkeyPair
|
|
229
|
-
* @returns {number} - the amount of valid signatures
|
|
230
|
-
*/
|
|
231
|
-
function countNotNullSignatures(signatures) {
|
|
232
|
-
return signatures.filter((sig) => !!sig.signature).length;
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Check if all signatures are completed.
|
|
236
|
-
*
|
|
237
|
-
* @param {SignaturePubkeyPair[]} signatures - signatures
|
|
238
|
-
* @returns {boolean}
|
|
239
|
-
*/
|
|
240
|
-
function requiresAllSignatures(signatures) {
|
|
241
|
-
return signatures.length > 0 && countNotNullSignatures(signatures) === signatures.length;
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Check the transaction type matching instructions by order. Memo and AdvanceNonceAccount instructions
|
|
245
|
-
* are ignored.
|
|
246
|
-
*
|
|
247
|
-
* @param {TransactionInstruction[]} instructions - the array of supported Solana instructions to be parsed
|
|
248
|
-
* @param {Record<string, number>} instructionIndexes - the instructions indexes of the current transaction
|
|
249
|
-
* @returns true if it matches by order.
|
|
250
|
-
*/
|
|
251
|
-
function matchTransactionTypeByInstructionsOrder(instructions, instructionIndexes) {
|
|
252
|
-
const instructionsCopy = [...instructions]; // Make a copy since we may modify the array below
|
|
253
|
-
// AdvanceNonceAccount is optional and the first instruction added, it does not matter to match the type
|
|
254
|
-
if (instructionsCopy.length > 0) {
|
|
255
|
-
if (getInstructionType(instructions[0]) === 'AdvanceNonceAccount') {
|
|
256
|
-
instructionsCopy.shift();
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
// Memo is optional and the last instruction added, it does not matter to match the type
|
|
260
|
-
// Why have it in instructionKeys if we are going to ignore it?
|
|
261
|
-
const instructionsKeys = Object.keys(instructionIndexes);
|
|
262
|
-
if (instructionsKeys[instructionsKeys.length - 1] === 'Memo') {
|
|
263
|
-
instructionsKeys.pop();
|
|
264
|
-
}
|
|
265
|
-
// Check instructions by order using the index.
|
|
266
|
-
for (const keyName of instructionsKeys) {
|
|
267
|
-
const index = instructionIndexes[keyName];
|
|
268
|
-
if (index >= instructionsCopy.length) {
|
|
269
|
-
return false;
|
|
270
|
-
}
|
|
271
|
-
const result = getInstructionType(instructionsCopy[index]);
|
|
272
|
-
if (result !== keyName) {
|
|
273
|
-
return false;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
return true;
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Returns the transaction Type based on the transaction instructions.
|
|
280
|
-
* Wallet initialization, Transfer and Staking transactions are supported.
|
|
281
|
-
*
|
|
282
|
-
* @param {SolTransaction} transaction - the solana transaction
|
|
283
|
-
* @returns {TransactionType} - the type of transaction
|
|
284
|
-
*/
|
|
285
|
-
function getTransactionType(transaction) {
|
|
286
|
-
const { instructions } = transaction;
|
|
287
|
-
if (validateRawMsgInstruction(instructions)) {
|
|
288
|
-
return sdk_core_1.TransactionType.StakingAuthorizeRaw;
|
|
289
|
-
}
|
|
290
|
-
validateIntructionTypes(instructions);
|
|
291
|
-
// check if deactivate instruction does not exist because deactivate can be include a transfer instruction
|
|
292
|
-
const memoInstruction = instructions.find((instruction) => getInstructionType(instruction) === 'Memo');
|
|
293
|
-
const memoData = memoInstruction?.data.toString('utf-8');
|
|
294
|
-
if (instructions.filter((instruction) => getInstructionType(instruction) === 'Deactivate').length === 0) {
|
|
295
|
-
for (const instruction of instructions) {
|
|
296
|
-
const instructionType = getInstructionType(instruction);
|
|
297
|
-
// Check if memo instruction is there and if it contains 'PrepareForRevoke' because Marinade staking deactivate transaction will have this
|
|
298
|
-
if ((instructionType === constants_1.ValidInstructionTypesEnum.Transfer && !memoData?.includes('PrepareForRevoke')) ||
|
|
299
|
-
instructionType === constants_1.ValidInstructionTypesEnum.TokenTransfer) {
|
|
300
|
-
return sdk_core_1.TransactionType.Send;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.walletInitInstructionIndexes)) {
|
|
305
|
-
return sdk_core_1.TransactionType.WalletInitialization;
|
|
306
|
-
}
|
|
307
|
-
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingActivateInstructionsIndexes) ||
|
|
308
|
-
matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingActivateInstructionsIndexes) ||
|
|
309
|
-
matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingActivateWithATAInstructionsIndexes) ||
|
|
310
|
-
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingActivateInstructionsIndexes)) {
|
|
311
|
-
return sdk_core_1.TransactionType.StakingActivate;
|
|
312
|
-
}
|
|
313
|
-
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingAuthorizeInstructionsIndexes)) {
|
|
314
|
-
return sdk_core_1.TransactionType.StakingAuthorize;
|
|
315
|
-
}
|
|
316
|
-
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDelegateInstructionsIndexes)) {
|
|
317
|
-
return sdk_core_1.TransactionType.StakingDelegate;
|
|
318
|
-
}
|
|
319
|
-
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingDeactivateInstructionsIndexes) ||
|
|
320
|
-
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDeactivateInstructionsIndexes) ||
|
|
321
|
-
matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingPartialDeactivateInstructionsIndexes) ||
|
|
322
|
-
matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingDeactivateInstructionsIndexes)) {
|
|
323
|
-
return sdk_core_1.TransactionType.StakingDeactivate;
|
|
324
|
-
}
|
|
325
|
-
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingWithdrawInstructionsIndexes)) {
|
|
326
|
-
return sdk_core_1.TransactionType.StakingWithdraw;
|
|
327
|
-
}
|
|
328
|
-
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataInitInstructionIndexes)) {
|
|
329
|
-
return sdk_core_1.TransactionType.AssociatedTokenAccountInitialization;
|
|
330
|
-
}
|
|
331
|
-
else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataCloseInstructionIndexes)) {
|
|
332
|
-
return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
|
|
333
|
-
}
|
|
334
|
-
else {
|
|
335
|
-
return sdk_core_1.TransactionType.CustomTx;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Returns the instruction Type based on the solana instructions.
|
|
340
|
-
* Throws if the solana instruction program is not supported
|
|
341
|
-
*
|
|
342
|
-
* @param {TransactionInstruction} instruction - a solana instruction
|
|
343
|
-
* @returns {ValidInstructionTypes} - a solana instruction type
|
|
344
|
-
*/
|
|
345
|
-
function getInstructionType(instruction) {
|
|
346
|
-
switch (instruction.programId.toString()) {
|
|
347
|
-
case new web3_js_1.PublicKey(constants_1.MEMO_PROGRAM_PK).toString():
|
|
348
|
-
return 'Memo';
|
|
349
|
-
case web3_js_1.SystemProgram.programId.toString():
|
|
350
|
-
return web3_js_1.SystemInstruction.decodeInstructionType(instruction);
|
|
351
|
-
case spl_token_1.TOKEN_PROGRAM_ID.toString():
|
|
352
|
-
case spl_token_1.TOKEN_2022_PROGRAM_ID.toString():
|
|
353
|
-
const decodedInstruction = (0, spl_token_1.decodeInstruction)(instruction, instruction.programId);
|
|
354
|
-
const instructionTypeMap = new Map();
|
|
355
|
-
instructionTypeMap.set(spl_token_1.TokenInstruction.CloseAccount, 'CloseAssociatedTokenAccount');
|
|
356
|
-
instructionTypeMap.set(spl_token_1.TokenInstruction.Burn, 'Burn');
|
|
357
|
-
instructionTypeMap.set(spl_token_1.TokenInstruction.MintTo, 'MintTo');
|
|
358
|
-
instructionTypeMap.set(spl_token_1.TokenInstruction.Approve, 'Approve');
|
|
359
|
-
instructionTypeMap.set(spl_token_1.TokenInstruction.TransferChecked, 'TokenTransfer');
|
|
360
|
-
const validInstruction = instructionTypeMap.get(decodedInstruction.data.instruction);
|
|
361
|
-
if (!validInstruction) {
|
|
362
|
-
return 'CustomInstruction';
|
|
363
|
-
}
|
|
364
|
-
return validInstruction;
|
|
365
|
-
case spl_stake_pool_1.STAKE_POOL_PROGRAM_ID.toString():
|
|
366
|
-
const discriminator = instruction.data.readUint8(0);
|
|
367
|
-
const layoutKey = Object.entries(spl_stake_pool_1.STAKE_POOL_INSTRUCTION_LAYOUTS).find(([_, v]) => v.index === discriminator)?.[0];
|
|
368
|
-
if (layoutKey === undefined) {
|
|
369
|
-
throw new Error('Instruction type incorrect; unknown discriminator');
|
|
370
|
-
}
|
|
371
|
-
const instructionKey = layoutKey;
|
|
372
|
-
return instructionKey;
|
|
373
|
-
case web3_js_1.StakeProgram.programId.toString():
|
|
374
|
-
return web3_js_1.StakeInstruction.decodeInstructionType(instruction);
|
|
375
|
-
case spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID.toString():
|
|
376
|
-
// TODO: change this when @spl-token supports decoding associated token instructions
|
|
377
|
-
// Support both legacy ATA creation (data.length === 0) and idempotent ATA creation (discriminator = 1)
|
|
378
|
-
// Both instruction types are treated as 'InitializeAssociatedTokenAccount' for compatibility
|
|
379
|
-
if (instruction.data.length === 0 || isIdempotentAtaInstruction(instruction)) {
|
|
380
|
-
return 'InitializeAssociatedTokenAccount';
|
|
381
|
-
}
|
|
382
|
-
else {
|
|
383
|
-
throw new sdk_core_1.NotSupported('Invalid transaction, instruction program id not supported: ' + instruction.programId.toString());
|
|
384
|
-
}
|
|
385
|
-
case COMPUTE_BUDGET:
|
|
386
|
-
if (web3_js_1.ComputeBudgetInstruction.decodeInstructionType(instruction) === 'SetComputeUnitLimit') {
|
|
387
|
-
return 'SetComputeUnitLimit';
|
|
388
|
-
}
|
|
389
|
-
return 'SetPriorityFee';
|
|
390
|
-
default:
|
|
391
|
-
return 'CustomInstruction';
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Validate solana instructions types to see if they are supported by the builder.
|
|
396
|
-
* Throws if the instruction type is invalid.
|
|
397
|
-
*
|
|
398
|
-
* @param {TransactionInstruction} instructions - a solana instruction
|
|
399
|
-
* @returns {void}
|
|
400
|
-
*/
|
|
401
|
-
function validateIntructionTypes(instructions) {
|
|
402
|
-
for (const instruction of instructions) {
|
|
403
|
-
if (!constants_1.VALID_SYSTEM_INSTRUCTION_TYPES.includes(getInstructionType(instruction))) {
|
|
404
|
-
throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
/**
|
|
409
|
-
* Validate solana instructions match raw msg authorize transaction
|
|
410
|
-
*
|
|
411
|
-
* @param {TransactionInstruction} instructions - a solana instruction
|
|
412
|
-
* @returns {boolean} true if the instructions match the raw msg authorize transaction
|
|
413
|
-
*/
|
|
414
|
-
function validateRawMsgInstruction(instructions) {
|
|
415
|
-
// as web3.js cannot decode authorize instruction from CLI, we need to check it manually first
|
|
416
|
-
if (instructions.length === 2) {
|
|
417
|
-
const programId1 = instructions[0].programId.toString();
|
|
418
|
-
const programId2 = instructions[1].programId.toString();
|
|
419
|
-
if (programId1 === web3_js_1.SystemProgram.programId.toString() && programId2 === web3_js_1.StakeProgram.programId.toString()) {
|
|
420
|
-
const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
|
|
421
|
-
const data = instructions[1].data.toString('hex');
|
|
422
|
-
if (instructionName1 === constants_1.nonceAdvanceInstruction &&
|
|
423
|
-
(data === constants_1.validInstructionData || data === constants_1.validInstructionData2)) {
|
|
424
|
-
return true;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
if (instructions.length === 3) {
|
|
429
|
-
const programId1 = instructions[0].programId.toString();
|
|
430
|
-
const programId2 = instructions[1].programId.toString();
|
|
431
|
-
const programId3 = instructions[2].programId.toString();
|
|
432
|
-
if (programId1 === web3_js_1.SystemProgram.programId.toString() &&
|
|
433
|
-
programId2 === web3_js_1.StakeProgram.programId.toString() &&
|
|
434
|
-
programId3 === web3_js_1.StakeProgram.programId.toString()) {
|
|
435
|
-
const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
|
|
436
|
-
const data = instructions[1].data.toString('hex');
|
|
437
|
-
const data2 = instructions[2].data.toString('hex');
|
|
438
|
-
if (instructionName1 === constants_1.nonceAdvanceInstruction &&
|
|
439
|
-
(data === constants_1.validInstructionData || data === constants_1.validInstructionData2) &&
|
|
440
|
-
(data2 === constants_1.validInstructionData || data2 === constants_1.validInstructionData2)) {
|
|
441
|
-
return true;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
return false;
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
449
|
-
*
|
|
450
|
-
* @param {string} rawTransaction - Transaction in base64 string format
|
|
451
|
-
*/
|
|
452
|
-
function validateRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
|
|
453
|
-
if (!rawTransaction) {
|
|
454
|
-
throw new sdk_core_1.ParseTransactionError('Invalid raw transaction: Undefined');
|
|
455
|
-
}
|
|
456
|
-
if (!isValidRawTransaction(rawTransaction, requireAllSignatures, verifySignatures)) {
|
|
457
|
-
throw new sdk_core_1.ParseTransactionError('Invalid raw transaction');
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
/**
|
|
461
|
-
* Validates address to check if it exists and is a valid Solana public key
|
|
462
|
-
*
|
|
463
|
-
* @param {string} address The address to be validated
|
|
464
|
-
* @param {string} fieldName Name of the field to validate, its needed to return which field is failing on case of error.
|
|
465
|
-
*/
|
|
466
|
-
function validateAddress(address, fieldName) {
|
|
467
|
-
if (!address || !isValidPublicKey(address)) {
|
|
468
|
-
throw new sdk_core_1.BuildTransactionError(`Invalid or missing ${fieldName}, got: ${address}`);
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
/**
|
|
472
|
-
* Get the statics coin object matching a given Solana token address if it exists
|
|
473
|
-
*
|
|
474
|
-
* @param tokenAddress The token address to match against
|
|
475
|
-
* @param network Solana Mainnet or Testnet
|
|
476
|
-
* @returns statics BaseCoin object for the matching token
|
|
477
|
-
*/
|
|
478
|
-
function getSolTokenFromAddress(tokenAddress, network) {
|
|
479
|
-
const tokens = statics_1.coins.filter((coin) => {
|
|
480
|
-
if (coin instanceof statics_1.SolCoin) {
|
|
481
|
-
return coin.network.type === network.type && coin.tokenAddress.toLowerCase() === tokenAddress.toLowerCase();
|
|
482
|
-
}
|
|
483
|
-
return false;
|
|
484
|
-
});
|
|
485
|
-
const tokensArray = tokens.map((token) => token);
|
|
486
|
-
if (tokensArray.length >= 1) {
|
|
487
|
-
// there should never be two tokens with the same contract address, so we assert that here
|
|
488
|
-
(0, assert_1.default)(tokensArray.length === 1);
|
|
489
|
-
return tokensArray[0];
|
|
490
|
-
}
|
|
491
|
-
return undefined;
|
|
492
|
-
}
|
|
493
|
-
/**
|
|
494
|
-
* Get the statics coin object matching a given Solana token address if it exists
|
|
495
|
-
*
|
|
496
|
-
* @param tokenAddress The token address to match against
|
|
497
|
-
* @param network Solana Mainnet or Testnet
|
|
498
|
-
* @returns statics BaseCoin object for the matching token
|
|
499
|
-
*/
|
|
500
|
-
function getSolTokenFromAddressOnly(tokenAddress) {
|
|
501
|
-
const tokens = statics_1.coins.filter((coin) => {
|
|
502
|
-
if (coin instanceof statics_1.SolCoin) {
|
|
503
|
-
return coin.tokenAddress.toLowerCase() === tokenAddress.toLowerCase();
|
|
504
|
-
}
|
|
505
|
-
return false;
|
|
506
|
-
});
|
|
507
|
-
const tokensArray = tokens.map((token) => token);
|
|
508
|
-
if (tokensArray.length >= 1) {
|
|
509
|
-
// there should never be two tokens with the same contract address, so we assert that here
|
|
510
|
-
(0, assert_1.default)(tokensArray.length === 1);
|
|
511
|
-
return tokensArray[0];
|
|
512
|
-
}
|
|
513
|
-
return undefined;
|
|
514
|
-
}
|
|
515
|
-
/**
|
|
516
|
-
* Get the solana token object from token name
|
|
517
|
-
* @param tokenName The token name to match against
|
|
518
|
-
* */
|
|
519
|
-
function getSolTokenFromTokenName(tokenName) {
|
|
520
|
-
try {
|
|
521
|
-
const token = statics_1.coins.get(tokenName);
|
|
522
|
-
if (!(token.isToken && token instanceof statics_1.SolCoin)) {
|
|
523
|
-
return undefined;
|
|
524
|
-
}
|
|
525
|
-
return token;
|
|
526
|
-
}
|
|
527
|
-
catch (e) {
|
|
528
|
-
if (!(e instanceof statics_1.CoinNotDefinedError)) {
|
|
529
|
-
throw e;
|
|
530
|
-
}
|
|
531
|
-
return undefined;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
/**
|
|
535
|
-
* Get the solana associated token account address
|
|
536
|
-
* @param tokenAddress token mint address
|
|
537
|
-
* @param ownerAddress The owner of the associated token account
|
|
538
|
-
* @returns The associated token account address
|
|
539
|
-
* */
|
|
540
|
-
async function getAssociatedTokenAccountAddress(tokenMintAddress, ownerAddress, allowOwnerOffCurve = false, programId) {
|
|
541
|
-
const mintPublicKey = new web3_js_1.PublicKey(tokenMintAddress);
|
|
542
|
-
const ownerPublicKey = new web3_js_1.PublicKey(ownerAddress);
|
|
543
|
-
// tokenAddress are not on ed25519 curve, so they can't be used as ownerAddress
|
|
544
|
-
if (!allowOwnerOffCurve && !web3_js_1.PublicKey.isOnCurve(ownerPublicKey.toBuffer())) {
|
|
545
|
-
throw new sdk_core_1.UtilsError('Invalid ownerAddress - address off ed25519 curve, got: ' + ownerAddress);
|
|
546
|
-
}
|
|
547
|
-
if (!programId) {
|
|
548
|
-
const coin = getSolTokenFromAddressOnly(tokenMintAddress);
|
|
549
|
-
if (coin && coin instanceof statics_1.SolCoin && 'programId' in coin && coin.programId) {
|
|
550
|
-
programId = coin.programId.toString();
|
|
551
|
-
}
|
|
552
|
-
else {
|
|
553
|
-
programId = spl_token_1.TOKEN_PROGRAM_ID.toString();
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
let ataAddress;
|
|
557
|
-
if (programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
|
|
558
|
-
ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, allowOwnerOffCurve, spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
559
|
-
}
|
|
560
|
-
else {
|
|
561
|
-
ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, allowOwnerOffCurve);
|
|
562
|
-
}
|
|
563
|
-
return ataAddress.toString();
|
|
564
|
-
}
|
|
565
|
-
function validateMintAddress(mintAddress) {
|
|
566
|
-
if (!mintAddress || !isValidAddress(mintAddress)) {
|
|
567
|
-
throw new sdk_core_1.BuildTransactionError('Invalid or missing mintAddress, got: ' + mintAddress);
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
function validateOwnerAddress(ownerAddress) {
|
|
571
|
-
if (!ownerAddress || !isValidAddress(ownerAddress)) {
|
|
572
|
-
throw new sdk_core_1.BuildTransactionError('Invalid or missing ownerAddress, got: ' + ownerAddress);
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
/**
|
|
576
|
-
* Type predicate to check if an instruction is a legacy SolInstruction.
|
|
577
|
-
* Uses 'programId' property as the discriminator since it's unique to legacy instructions
|
|
578
|
-
* Versioned instructions have 'programIdIndex' property.
|
|
579
|
-
*
|
|
580
|
-
* @param instruction - The instruction to check
|
|
581
|
-
* @returns True if the instruction is a SolInstruction (has programId field)
|
|
582
|
-
*/
|
|
583
|
-
function isSolLegacyInstruction(instruction) {
|
|
584
|
-
return 'programId' in instruction;
|
|
585
|
-
}
|
|
586
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBNkVBLGdFQUVDO0FBR0Qsd0NBRUM7QUFHRCx3Q0FRQztBQUdELDhDQU9DO0FBR0QsNENBUUM7QUFHRCw0Q0FNQztBQUlELG9EQUVDO0FBUUQsc0NBR0M7QUFRRCxvREFHQztBQVFELGtDQUVDO0FBT0Qsc0NBT0M7QUFPRCxnQ0FFQztBQVVELHNEQVlDO0FBVUQsMENBY0M7QUFRRCxnREFFQztBQVFELGdEQUVDO0FBUUQsd0RBRUM7QUFRRCxzREFFQztBQVVELDBGQStCQztBQVNELGdEQWtEQztBQVNELGdEQWlEQztBQVNELDBEQU1DO0FBUUQsOERBc0NDO0FBTUQsd0RBV0M7QUFRRCwwQ0FJQztBQVNELHdEQWNDO0FBU0QsZ0VBY0M7QUFNRCw0REFhQztBQVFELDRFQW1DQztBQUVELGtEQUlDO0FBRUQsb0RBSUM7QUFVRCx3REFJQztBQTlvQkQsbURBUzhCO0FBQzlCLGlEQUFpRztBQUNqRyxpREFPMkI7QUFDM0IsNkNBV3lCO0FBQ3pCLG9EQUE0QjtBQUM1QixnRUFBcUM7QUFDckMsZ0RBQXdCO0FBQ3hCLDBEQUE2QjtBQUM3QiwyQ0FzQnFCO0FBRXJCLDJEQUErRjtBQUUvRixNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDLHFGQUFxRjtBQUMzSCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDtBQUNyRixNQUFNLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0FBQ3ZELE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBRXJFOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxXQUFtQztJQUM1RSxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENB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QUMsQ0FBQztJQUMzRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixzQkFBc0IsQ0FDcEMsV0FBcUQ7SUFFckQsT0FBTyxXQUFXLElBQUksV0FBVyxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gIGlzVmFsaWRYcHViLFxuICBOb3RTdXBwb3J0ZWQsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgU29sSW5zdHJ1Y3Rpb24sXG4gIFNvbFZlcnNpb25lZEluc3RydWN0aW9uLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFV0aWxzRXJyb3IsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luLCBCYXNlTmV0d29yaywgQ29pbk5vdERlZmluZWRFcnJvciwgY29pbnMsIFNvbENvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEFTU09DSUFURURfVE9LRU5fUFJPR1JBTV9JRCxcbiAgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzcyxcbiAgVE9LRU5fUFJPR1JBTV9JRCxcbiAgVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICBkZWNvZGVJbnN0cnVjdGlvbixcbiAgVG9rZW5JbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHtcbiAgS2V5cGFpcixcbiAgUHVibGljS2V5LFxuICBTaWduYXR1cmVQdWJrZXlQYWlyLFxuICBUcmFuc2FjdGlvbiBhcyBTb2xUcmFuc2FjdGlvbixcbiAgU3Rha2VJbnN0cnVjdGlvbixcbiAgU3Rha2VQcm9ncmFtLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbixcbiAgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgbmFjbCBmcm9tICd0d2VldG5hY2wnO1xuaW1wb3J0IHtcbiAgYXRhQ2xvc2VJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIGF0YUluaXRJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIE1BWF9NRU1PX0xFTkdUSCxcbiAgTUVNT19QUk9HUkFNX1BLLFxuICBub25jZUFkdmFuY2VJbnN0cnVjdGlvbixcbiAgc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgbWFyaW5hZGVTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBtYXJpbmFkZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ1BhcnRpYWxEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgVkFMSURfU1lTVEVNX0lOU1RSVUNUSU9OX1RZUEVTLFxuICB2YWxpZEluc3RydWN0aW9uRGF0YSxcbiAgdmFsaWRJbnN0cnVjdGlvbkRhdGEyLFxuICBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLFxuICB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLFxuICBqaXRvU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgaml0b1N0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgaml0b1N0YWtpbmdBY3RpdmF0ZVdpdGhBVEFJbnN0cnVjdGlvbnNJbmRleGVzLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBWYWxpZEluc3RydWN0aW9uVHlwZXMgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IFNUQUtFX1BPT0xfSU5TVFJVQ1RJT05fTEFZT1VUUywgU1RBS0VfUE9PTF9QUk9HUkFNX0lEIH0gZnJvbSAnQHNvbGFuYS9zcGwtc3Rha2UtcG9vbCc7XG5cbmNvbnN0IERFQ09ERURfQkxPQ0tfSEFTSF9MRU5HVEggPSAzMjsgLy8gaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vZGV2ZWxvcGluZy9wcm9ncmFtbWluZy1tb2RlbC90cmFuc2FjdGlvbnMjYmxvY2toYXNoLWZvcm1hdFxuY29uc3QgREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIID0gNjQ7IC8vIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL3Rlcm1pbm9sb2d5I3NpZ25hdHVyZVxuY29uc3QgQkFTRV81OF9FTkNPTkRJTkdfUkVHRVggPSAnWzEtOUEtSEotTlAtWmEta20tel0nO1xuY29uc3QgQ09NUFVURV9CVURHRVQgPSAnQ29tcHV0ZUJ1ZGdldDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIEFUQSBpbnN0cnVjdGlvbiBpcyBpZGVtcG90ZW50IChkaXNjcmltaW5hdG9yIGJ5dGUgPSAxKS5cbiAqXG4gKiBJZGVtcG90ZW50IEFUQSBpbnN0cnVjdGlvbnMgdXNlIEJ1ZmZlci5mcm9tKFsxXSkgYXMgaW5zdHJ1Y3Rpb24gZGF0YSwgY3JlYXRlZCBieVxuICogQHNvbGFuYS9zcGwtdG9rZW4ncyBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SWRlbXBvdGVudEluc3RydWN0aW9uKCkgKHYwLjQuMSspLlxuICogQW4gaWRlbXBvdGVudCBBVEEgaW5zdHJ1Y3Rpb24gc3VjY2VlZCBldmVuIGlmIGFjY291bnQgZXhpc3RzLFxuICogcHJldmVudGluZyByYWNlIGNvbmRpdGlvbiBlcnJvcnMgaW4gY29uY3VycmVudCBzY2VuYXJpb3MuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbiAtIFRoZSBpbnN0cnVjdGlvbiB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgaW5zdHJ1Y3Rpb24gZGF0YSBpcyBhIHNpbmdsZSBieXRlIHdpdGggdmFsdWUgMVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVtcG90ZW50QXRhSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGluc3RydWN0aW9uLmRhdGEubGVuZ3RoID09PSAxICYmIGluc3RydWN0aW9uLmRhdGFbMF0gPT09IDE7XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZFB1YmxpY0tleShhZGRyZXNzKTtcbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhaGFzaCAmJiBuZXcgUmVnRXhwKEJBU0VfNThfRU5DT05ESU5HX1JFR0VYKS50ZXN0KGhhc2gpICYmIGJzNTguZGVjb2RlKGhhc2gpLmxlbmd0aCA9PT0gREVDT0RFRF9CTE9DS19IQVNIX0xFTkdUSFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByaXZhdGVLZXkocHJ2S2V5OiBzdHJpbmcgfCBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5OiBVaW50OEFycmF5ID0gdHlwZW9mIHBydktleSA9PT0gJ3N0cmluZycgPyBiYXNlNThUb1VpbnQ4QXJyYXkocHJ2S2V5KSA6IHBydktleTtcbiAgICByZXR1cm4gISFLZXlwYWlyLmZyb21TZWNyZXRLZXkoa2V5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHVibGljS2V5KHB1YktleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgaWYgKGlzVmFsaWRYcHViKHB1YktleSkpIHJldHVybiB0cnVlO1xuICAgIG5ldyBQdWJsaWNLZXkocHViS2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFzaWduYXR1cmUgJiYgYnM1OC5kZWNvZGUoc2lnbmF0dXJlKS5sZW5ndGggPT09IERFQ09ERURfU0lHTkFUVVJFX0xFTkdUSDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbi8vIFRyYW5zYWN0aW9uSWQgYXJlIHRoZSBmaXJzdCBzaWduYXR1cmUgb24gYSBUcmFuc2FjdGlvblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZFNpZ25hdHVyZSh0eElkKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBhbW91bnQgb2YgbGFtcG9ydHMgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFtb3VudChhbW91bnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCk7XG4gIHJldHVybiBiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgJiYgYmlnTnVtYmVyQW1vdW50LmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXIgb24gc3Rha2luZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSB0aGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTdGFraW5nQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbigwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGlzIGEgdmFsaWQgbWVtbyBvciBub3QuXG4gKlxuICogQHBhcmFtIG1lbW8gLSB0aGUgbWVtbyBzdHJpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lbW8obWVtbzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShtZW1vKS5sZW5ndGggPD0gTUFYX01FTU9fTEVOR1RIO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0cmluZyBpcyB2YWxpZCBiYXNlNjQgZW5jb2RlZCBkYXRhXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIHZhbGlkIGJhc2U2NCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmFzZTY0KHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKHN0ciwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICByZXR1cm4gZGVjb2RlZCA9PT0gc3RyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzdHJpbmcgaXMgdmFsaWQgaGV4YWRlY2ltYWwgZGF0YVxuICogQHBhcmFtIHN0ciAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN0cmluZyBpcyB2YWxpZCBoZXgsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEhleChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bMC05QS1GYS1mXSokLy50ZXN0KHN0cikgJiYgc3RyLmxlbmd0aCAlIDIgPT09IDA7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHJhdyB0cmFuc2FjdGlvbiBjYW4gYmUgZGVzZXJpYWxpemVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyBmb3JtYXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVxdWlyZUFsbFNpZ25hdHVyZXMgLSByZXF1aXJlIGFsbCBzaWduYXR1cmVzIHRvIGJlIHByZXNlbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmVyaWZ5U2lnbmF0dXJlcyAtIHZlcmlmeSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRSYXdUcmFuc2FjdGlvbihcbiAgcmF3VHJhbnNhY3Rpb246IHN0cmluZyxcbiAgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSBmYWxzZSxcbiAgdmVyaWZ5U2lnbmF0dXJlcyA9IGZhbHNlXG4pOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0eCA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgdHguc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXMsIHZlcmlmeVNpZ25hdHVyZXMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyBpZiBzaWduYXR1cmUgZm9yIG1lc3NhZ2UgaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IHNlcmlhbGl6ZWRUeCAtIHR4IGFzIGEgYmFzZTY0IHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSAtIHNpZ25hdHVyZSBhcyBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY0tleSAtIHB1YmxpYyBrZXkgYXMgYmFzZSA1OFxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHNlcmlhbGl6ZWRUeDogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgcHVibGljS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpc1ZhbGlkUmF3VHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNlcmlhbGl6ZWRUeCcpO1xuICB9XG4gIGlmICghaXNWYWxpZFB1YmxpY0tleShwdWJsaWNLZXkpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgcHVibGljS2V5Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBzaWduYXR1cmUnKTtcbiAgfVxuICBjb25zdCBtc2cgPSBTb2xUcmFuc2FjdGlvbi5mcm9tKEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2Jhc2U2NCcpKS5zZXJpYWxpemVNZXNzYWdlKCk7XG4gIGNvbnN0IHNpZyA9IGJhc2U1OFRvVWludDhBcnJheShzaWduYXR1cmUpO1xuICBjb25zdCBwdWIgPSBuZXcgUHVibGljS2V5KHB1YmxpY0tleSk7XG4gIHJldHVybiBuYWNsLnNpZ24uZGV0YWNoZWQudmVyaWZ5KG1zZywgc2lnLCBwdWIudG9CdWZmZXIoKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBiYXNlNTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IC0gYW4gVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTU4VG9VaW50OEFycmF5KGlucHV0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJzNTguZGVjb2RlKGlucHV0KSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBVaW50OEFycmF5IHRvIGEgYmFzZTU4IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGlucHV0IC0gYW4gVWludDhBcnJheVxuICogQHJldHVybnMge3N0cmluZ30gLSBhIHN0cmluZyBpbiBiYXNlNThcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVpbnQ4QXJyYXlUb2Jhc2U1OChpbnB1dDogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBiczU4LmVuY29kZShpbnB1dCk7XG59XG5cbi8qKlxuICogQ291bnQgdGhlIGFtb3VudCBvZiBzaWduYXR1cmVzIGFyZSBub3QgbnVsbC5cbiAqXG4gKiBAcGFyYW0ge1NpZ25hdHVyZVB1YmtleVBhaXJbXX0gc2lnbmF0dXJlcyAtIGFuIGFycmF5IG9mIFNpZ25hdHVyZVB1YmtleVBhaXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gdGhlIGFtb3VudCBvZiB2YWxpZCBzaWduYXR1cmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXM6IFNpZ25hdHVyZVB1YmtleVBhaXJbXSk6IG51bWJlciB7XG4gIHJldHVybiBzaWduYXR1cmVzLmZpbHRlcigoc2lnKSA9PiAhIXNpZy5zaWduYXR1cmUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbGwgc2lnbmF0dXJlcyBhcmUgY29tcGxldGVkLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gc2lnbmF0dXJlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlc0FsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaWduYXR1cmVzLmxlbmd0aCA+IDAgJiYgY291bnROb3ROdWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzKSA9PT0gc2lnbmF0dXJlcy5sZW5ndGg7XG59XG5cbi8qKlxuICogQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHR5cGUgbWF0Y2hpbmcgaW5zdHJ1Y3Rpb25zIGJ5IG9yZGVyLiBNZW1vIGFuZCBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uc1xuICogYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9ucyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gaW5zdHJ1Y3Rpb25JbmRleGVzIC0gdGhlIGluc3RydWN0aW9ucyBpbmRleGVzIG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB0cnVlIGlmIGl0IG1hdGNoZXMgYnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnN0cnVjdGlvbnNDb3B5ID0gWy4uLmluc3RydWN0aW9uc107IC8vIE1ha2UgYSBjb3B5IHNpbmNlIHdlIG1heSBtb2RpZnkgdGhlIGFycmF5IGJlbG93XG4gIC8vIEFkdmFuY2VOb25jZUFjY291bnQgaXMgb3B0aW9uYWwgYW5kIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBhZGRlZCwgaXQgZG9lcyBub3QgbWF0dGVyIHRvIG1hdGNoIHRoZSB0eXBlXG4gIGlmIChpbnN0cnVjdGlvbnNDb3B5Lmxlbmd0aCA+IDApIHtcbiAgICBpZiAoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc1swXSkgPT09ICdBZHZhbmNlTm9uY2VBY2NvdW50Jykge1xuICAgICAgaW5zdHJ1Y3Rpb25zQ29weS5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1lbW8gaXMgb3B0aW9uYWwgYW5kIHRoZSBsYXN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgLy8gV2h5IGhhdmUgaXQgaW4gaW5zdHJ1Y3Rpb25LZXlzIGlmIHdlIGFyZSBnb2luZyB0byBpZ25vcmUgaXQ/XG4gIGNvbnN0IGluc3RydWN0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhpbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAoaW5zdHJ1Y3Rpb25zS2V5c1tpbnN0cnVjdGlvbnNLZXlzLmxlbmd0aCAtIDFdID09PSAnTWVtbycpIHtcbiAgICBpbnN0cnVjdGlvbnNLZXlzLnBvcCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaW5zdHJ1Y3Rpb25zIGJ5IG9yZGVyIHVzaW5nIHRoZSBpbmRleC5cbiAgZm9yIChjb25zdCBrZXlOYW1lIG9mIGluc3RydWN0aW9uc0tleXMpIHtcbiAgICBjb25zdCBpbmRleCA9IGluc3RydWN0aW9uSW5kZXhlc1trZXlOYW1lXTtcbiAgICBpZiAoaW5kZXggPj0gaW5zdHJ1Y3Rpb25zQ29weS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc0NvcHlbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ICE9PSBrZXlOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHRyYW5zYWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlICB0cmFuc2FjdGlvbiBpbnN0cnVjdGlvbnMuXG4gKiBXYWxsZXQgaW5pdGlhbGl6YXRpb24sIFRyYW5zZmVyIGFuZCBTdGFraW5nIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7U29sVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uIC0gdGhlIHNvbGFuYSB0cmFuc2FjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uVHlwZX0gLSB0aGUgdHlwZSBvZiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBTb2xUcmFuc2FjdGlvbik6IFRyYW5zYWN0aW9uVHlwZSB7XG4gIGNvbnN0IHsgaW5zdHJ1Y3Rpb25zIH0gPSB0cmFuc2FjdGlvbjtcbiAgaWYgKHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdztcbiAgfVxuICB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnMpO1xuICAvLyBjaGVjayBpZiBkZWFjdGl2YXRlIGluc3RydWN0aW9uIGRvZXMgbm90IGV4aXN0IGJlY2F1c2UgZGVhY3RpdmF0ZSBjYW4gYmUgaW5jbHVkZSBhIHRyYW5zZmVyIGluc3RydWN0aW9uXG4gIGNvbnN0IG1lbW9JbnN0cnVjdGlvbiA9IGluc3RydWN0aW9ucy5maW5kKChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ01lbW8nKTtcbiAgY29uc3QgbWVtb0RhdGEgPSBtZW1vSW5zdHJ1Y3Rpb24/LmRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIGlmIChpbnN0cnVjdGlvbnMuZmlsdGVyKChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ0RlYWN0aXZhdGUnKS5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICAgIC8vIENoZWNrIGlmIG1lbW8gaW5zdHJ1Y3Rpb24gaXMgdGhlcmUgYW5kIGlmIGl0IGNvbnRhaW5zICdQcmVwYXJlRm9yUmV2b2tlJyBiZWNhdXNlIE1hcmluYWRlIHN0YWtpbmcgZGVhY3RpdmF0ZSB0cmFuc2FjdGlvbiB3aWxsIGhhdmUgdGhpc1xuICAgICAgaWYgKFxuICAgICAgICAoaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyICYmICFtZW1vRGF0YT8uaW5jbHVkZXMoJ1ByZXBhcmVGb3JSZXZva2UnKSkgfHxcbiAgICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb247XG4gIH0gZWxzZSBpZiAoXG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgbWFyaW5hZGVTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGppdG9TdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGppdG9TdGFraW5nQWN0aXZhdGVXaXRoQVRBSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKVxuICApIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZTtcbiAgfSBlbHNlIGlmIChcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBtYXJpbmFkZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ1BhcnRpYWxEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBqaXRvU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKVxuICApIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFDbG9zZUluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4O1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgc29sYW5hIGluc3RydWN0aW9ucy5cbiAqIFRocm93cyBpZiB0aGUgc29sYW5hIGluc3RydWN0aW9uIHByb2dyYW0gaXMgbm90IHN1cHBvcnRlZFxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb24gLSBhIHNvbGFuYSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1ZhbGlkSW5zdHJ1Y3Rpb25UeXBlc30gLSBhIHNvbGFuYSBpbnN0cnVjdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pOiBWYWxpZEluc3RydWN0aW9uVHlwZXMge1xuICBzd2l0Y2ggKGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpKSB7XG4gICAgY2FzZSBuZXcgUHVibGljS2V5KE1FTU9fUFJPR1JBTV9QSykudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiAnTWVtbyc7XG4gICAgY2FzZSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgY2FzZSBUT0tFTl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgY2FzZSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICAgIGNvbnN0IGRlY29kZWRJbnN0cnVjdGlvbiA9IGRlY29kZUluc3RydWN0aW9uKGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlTWFwOiBNYXA8VG9rZW5JbnN0cnVjdGlvbiwgVmFsaWRJbnN0cnVjdGlvblR5cGVzPiA9IG5ldyBNYXAoKTtcbiAgICAgIGluc3RydWN0aW9uVHlwZU1hcC5zZXQoVG9rZW5JbnN0cnVjdGlvbi5DbG9zZUFjY291bnQsICdDbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnKTtcbiAgICAgIGluc3RydWN0aW9uVHlwZU1hcC5zZXQoVG9rZW5JbnN0cnVjdGlvbi5CdXJuLCAnQnVybicpO1xuICAgICAgaW5zdHJ1Y3Rpb25UeXBlTWFwLnNldChUb2tlbkluc3RydWN0aW9uLk1pbnRUbywgJ01pbnRUbycpO1xuICAgICAgaW5zdHJ1Y3Rpb25UeXBlTWFwLnNldChUb2tlbkluc3RydWN0aW9uLkFwcHJvdmUsICdBcHByb3ZlJyk7XG4gICAgICBpbnN0cnVjdGlvblR5cGVNYXAuc2V0KFRva2VuSW5zdHJ1Y3Rpb24uVHJhbnNmZXJDaGVja2VkLCAnVG9rZW5UcmFuc2ZlcicpO1xuICAgICAgY29uc3QgdmFsaWRJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uVHlwZU1hcC5nZXQoZGVjb2RlZEluc3RydWN0aW9uLmRhdGEuaW5zdHJ1Y3Rpb24pO1xuICAgICAgaWYgKCF2YWxpZEluc3RydWN0aW9uKSB7XG4gICAgICAgIHJldHVybiAnQ3VzdG9tSW5zdHJ1Y3Rpb24nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbGlkSW5zdHJ1Y3Rpb247XG4gICAgY2FzZSBTVEFLRV9QT09MX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSBpbnN0cnVjdGlvbi5kYXRhLnJlYWRVaW50OCgwKTtcbiAgICAgIGNvbnN0IGxheW91dEtleSA9IE9iamVjdC5lbnRyaWVzKFNUQUtFX1BPT0xfSU5TVFJVQ1RJT05fTEFZT1VUUykuZmluZCgoW18sIHZdKSA9PiB2LmluZGV4ID09PSBkaXNjcmltaW5hdG9yKT8uWzBdO1xuICAgICAgaWYgKGxheW91dEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5zdHJ1Y3Rpb24gdHlwZSBpbmNvcnJlY3Q7IHVua25vd24gZGlzY3JpbWluYXRvcicpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25LZXkgPSBsYXlvdXRLZXkgYXMga2V5b2YgdHlwZW9mIFNUQUtFX1BPT0xfSU5TVFJVQ1RJT05fTEFZT1VUUztcbiAgICAgIHJldHVybiBpbnN0cnVjdGlvbktleTtcbiAgICBjYXNlIFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiBTdGFrZUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgY2FzZSBBU1NPQ0lBVEVEX1RPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTpcbiAgICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIHdoZW4gQHNwbC10b2tlbiBzdXBwb3J0cyBkZWNvZGluZyBhc3NvY2lhdGVkIHRva2VuIGluc3RydWN0aW9uc1xuICAgICAgLy8gU3VwcG9ydCBib3RoIGxlZ2FjeSBBVEEgY3JlYXRpb24gKGRhdGEubGVuZ3RoID09PSAwKSBhbmQgaWRlbXBvdGVudCBBVEEgY3JlYXRpb24gKGRpc2NyaW1pbmF0b3IgPSAxKVxuICAgICAgLy8gQm90aCBpbnN0cnVjdGlvbiB0eXBlcyBhcmUgdHJlYXRlZCBhcyAnSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnIGZvciBjb21wYXRpYmlsaXR5XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPT09IDAgfHwgaXNJZGVtcG90ZW50QXRhSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKSB7XG4gICAgICAgIHJldHVybiAnSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpZCBub3Qgc3VwcG9ydGVkOiAnICsgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICBjYXNlIENPTVBVVEVfQlVER0VUOlxuICAgICAgaWYgKENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pID09PSAnU2V0Q29tcHV0ZVVuaXRMaW1pdCcpIHtcbiAgICAgICAgcmV0dXJuICdTZXRDb21wdXRlVW5pdExpbWl0JztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnU2V0UHJpb3JpdHlGZWUnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ0N1c3RvbUluc3RydWN0aW9uJztcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNvbGFuYSBpbnN0cnVjdGlvbnMgdHlwZXMgdG8gc2VlIGlmIHRoZXkgYXJlIHN1cHBvcnRlZCBieSB0aGUgYnVpbGRlci5cbiAqIFRocm93cyBpZiB0aGUgaW5zdHJ1Y3Rpb24gdHlwZSBpcyBpbnZhbGlkLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb25zIC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJbnRydWN0aW9uVHlwZXMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBpZiAoIVZBTElEX1NZU1RFTV9JTlNUUlVDVElPTl9UWVBFUy5pbmNsdWRlcyhnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pKSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc29sYW5hIGluc3RydWN0aW9ucyBtYXRjaCByYXcgbXNnIGF1dGhvcml6ZSB0cmFuc2FjdGlvblxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb25zIC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbnMgbWF0Y2ggdGhlIHJhdyBtc2cgYXV0aG9yaXplIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJhd01zZ0luc3RydWN0aW9uKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogYm9vbGVhbiB7XG4gIC8vIGFzIHdlYjMuanMgY2Fubm90IGRlY29kZSBhdXRob3JpemUgaW5zdHJ1Y3Rpb24gZnJvbSBDTEksIHdlIG5lZWQgdG8gY2hlY2sgaXQgbWFudWFsbHkgZmlyc3RcbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCBwcm9ncmFtSWQxID0gaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGNvbnN0IHByb2dyYW1JZDIgPSBpbnN0cnVjdGlvbnNbMV0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgaWYgKHByb2dyYW1JZDEgPT09IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgJiYgcHJvZ3JhbUlkMiA9PT0gU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpKSB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbk5hbWUxID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc1swXSk7XG4gICAgICBjb25zdCBkYXRhID0gaW5zdHJ1Y3Rpb25zWzFdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbk5hbWUxID09PSBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiAmJlxuICAgICAgICAoZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEgfHwgZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEyKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMykge1xuICAgIGNvbnN0IHByb2dyYW1JZDEgPSBpbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcHJvZ3JhbUlkMiA9IGluc3RydWN0aW9uc1sxXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwcm9ncmFtSWQzID0gaW5zdHJ1Y3Rpb25zWzJdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGlmIChcbiAgICAgIHByb2dyYW1JZDEgPT09IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgJiZcbiAgICAgIHByb2dyYW1JZDIgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSAmJlxuICAgICAgcHJvZ3JhbUlkMyA9PT0gU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbk5hbWUxID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc1swXSk7XG4gICAgICBjb25zdCBkYXRhID0gaW5zdHJ1Y3Rpb25zWzFdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgZGF0YTIgPSBpbnN0cnVjdGlvbnNbMl0uZGF0YS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uTmFtZTEgPT09IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uICYmXG4gICAgICAgIChkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YSB8fCBkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpICYmXG4gICAgICAgIChkYXRhMiA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEgfHwgZGF0YTIgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMilcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBDaGVjayB0aGUgcmF3IHRyYW5zYWN0aW9uIGhhcyBhIHZhbGlkIGZvcm1hdCBpbiB0aGUgYmxvY2tjaGFpbiBjb250ZXh0LCB0aHJvdyBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gVHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyAgZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKFxuICByYXdUcmFuc2FjdGlvbjogc3RyaW5nLFxuICByZXF1aXJlQWxsU2lnbmF0dXJlcyA9IGZhbHNlLFxuICB2ZXJpZnlTaWduYXR1cmVzID0gZmFsc2Vcbik6IHZvaWQge1xuICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb246IFVuZGVmaW5lZCcpO1xuICB9XG4gIGlmICghaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uLCByZXF1aXJlQWxsU2lnbmF0dXJlcywgdmVyaWZ5U2lnbmF0dXJlcykpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFkZHJlc3MgdG8gY2hlY2sgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHZhbGlkIFNvbGFuYSBwdWJsaWMga2V5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHZhbGlkYXRlLCBpdHMgbmVlZGVkIHRvIHJldHVybiB3aGljaCBmaWVsZCBpcyBmYWlsaW5nIG9uIGNhc2Ugb2YgZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWFkZHJlc3MgfHwgIWlzVmFsaWRQdWJsaWNLZXkoYWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIG9yIG1pc3NpbmcgJHtmaWVsZE5hbWV9LCBnb3Q6ICR7YWRkcmVzc31gKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdGljcyBjb2luIG9iamVjdCBtYXRjaGluZyBhIGdpdmVuIFNvbGFuYSB0b2tlbiBhZGRyZXNzIGlmIGl0IGV4aXN0c1xuICpcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVGhlIHRva2VuIGFkZHJlc3MgdG8gbWF0Y2ggYWdhaW5zdFxuICogQHBhcmFtIG5ldHdvcmsgU29sYW5hIE1haW5uZXQgb3IgVGVzdG5ldFxuICogQHJldHVybnMgc3RhdGljcyBCYXNlQ29pbiBvYmplY3QgZm9yIHRoZSBtYXRjaGluZyB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29sVG9rZW5Gcm9tQWRkcmVzcyh0b2tlbkFkZHJlc3M6IHN0cmluZywgbmV0d29yazogQmFzZU5ldHdvcmspOiBSZWFkb25seTxCYXNlQ29pbj4gfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+IHtcbiAgICBpZiAoY29pbiBpbnN0YW5jZW9mIFNvbENvaW4pIHtcbiAgICAgIHJldHVybiBjb2luLm5ldHdvcmsudHlwZSA9PT0gbmV0d29yay50eXBlICYmIGNvaW4udG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCkgPT09IHRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuICBjb25zdCB0b2tlbnNBcnJheSA9IHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbik7XG4gIGlmICh0b2tlbnNBcnJheS5sZW5ndGggPj0gMSkge1xuICAgIC8vIHRoZXJlIHNob3VsZCBuZXZlciBiZSB0d28gdG9rZW5zIHdpdGggdGhlIHNhbWUgY29udHJhY3QgYWRkcmVzcywgc28gd2UgYXNzZXJ0IHRoYXQgaGVyZVxuICAgIGFzc2VydCh0b2tlbnNBcnJheS5sZW5ndGggPT09IDEpO1xuICAgIHJldHVybiB0b2tlbnNBcnJheVswXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdGljcyBjb2luIG9iamVjdCBtYXRjaGluZyBhIGdpdmVuIFNvbGFuYSB0b2tlbiBhZGRyZXNzIGlmIGl0IGV4aXN0c1xuICpcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgVGhlIHRva2VuIGFkZHJlc3MgdG8gbWF0Y2ggYWdhaW5zdFxuICogQHBhcmFtIG5ldHdvcmsgU29sYW5hIE1haW5uZXQgb3IgVGVzdG5ldFxuICogQHJldHVybnMgc3RhdGljcyBCYXNlQ29pbiBvYmplY3QgZm9yIHRoZSBtYXRjaGluZyB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29sVG9rZW5Gcm9tQWRkcmVzc09ubHkodG9rZW5BZGRyZXNzOiBzdHJpbmcpOiBSZWFkb25seTxCYXNlQ29pbj4gfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+IHtcbiAgICBpZiAoY29pbiBpbnN0YW5jZW9mIFNvbENvaW4pIHtcbiAgICAgIHJldHVybiBjb2luLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSB0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbiAgY29uc3QgdG9rZW5zQXJyYXkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW4pO1xuICBpZiAodG9rZW5zQXJyYXkubGVuZ3RoID49IDEpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICBhc3NlcnQodG9rZW5zQXJyYXkubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdG9rZW5zQXJyYXlbMF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNvbGFuYSB0b2tlbiBvYmplY3QgZnJvbSB0b2tlbiBuYW1lXG4gKiBAcGFyYW0gdG9rZW5OYW1lIFRoZSB0b2tlbiBuYW1lIHRvIG1hdGNoIGFnYWluc3RcbiAqICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29sVG9rZW5Gcm9tVG9rZW5OYW1lKHRva2VuTmFtZTogc3RyaW5nKTogUmVhZG9ubHk8U29sQ29pbj4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHRva2VuID0gY29pbnMuZ2V0KHRva2VuTmFtZSk7XG4gICAgaWYgKCEodG9rZW4uaXNUb2tlbiAmJiB0b2tlbiBpbnN0YW5jZW9mIFNvbENvaW4pKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW47XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIShlIGluc3RhbmNlb2YgQ29pbk5vdERlZmluZWRFcnJvcikpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNvbGFuYSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQWRkcmVzcyB0b2tlbiBtaW50IGFkZHJlc3NcbiAqIEBwYXJhbSBvd25lckFkZHJlc3MgVGhlIG93bmVyIG9mIHRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnRcbiAqIEByZXR1cm5zIFRoZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgYWRkcmVzc1xuICogKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBc3NvY2lhdGVkVG9rZW5BY2NvdW50QWRkcmVzcyhcbiAgdG9rZW5NaW50QWRkcmVzczogc3RyaW5nLFxuICBvd25lckFkZHJlc3M6IHN0cmluZyxcbiAgYWxsb3dPd25lck9mZkN1cnZlID0gZmFsc2UsXG4gIHByb2dyYW1JZD86IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbWludFB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkodG9rZW5NaW50QWRkcmVzcyk7XG4gIGNvbnN0IG93bmVyUHVibGljS2V5ID0gbmV3IFB1YmxpY0tleShvd25lckFkZHJlc3MpO1xuXG4gIC8vIHRva2VuQWRkcmVzcyBhcmUgbm90IG9uIGVkMjU1MTkgY3VydmUsIHNvIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBvd25lckFkZHJlc3NcbiAgaWYgKCFhbGxvd093bmVyT2ZmQ3VydmUgJiYgIVB1YmxpY0tleS5pc09uQ3VydmUob3duZXJQdWJsaWNLZXkudG9CdWZmZXIoKSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBvd25lckFkZHJlc3MgLSBhZGRyZXNzIG9mZiBlZDI1NTE5IGN1cnZlLCBnb3Q6ICcgKyBvd25lckFkZHJlc3MpO1xuICB9XG5cbiAgaWYgKCFwcm9ncmFtSWQpIHtcbiAgICBjb25zdCBjb2luID0gZ2V0U29sVG9rZW5Gcm9tQWRkcmVzc09ubHkodG9rZW5NaW50QWRkcmVzcyk7XG4gICAgaWYgKGNvaW4gJiYgY29pbiBpbnN0YW5jZW9mIFNvbENvaW4gJiYgJ3Byb2dyYW1JZCcgaW4gY29pbiAmJiBjb2luLnByb2dyYW1JZCkge1xuICAgICAgcHJvZ3JhbUlkID0gY29pbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3JhbUlkID0gVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBhdGFBZGRyZXNzOiBQdWJsaWNLZXk7XG4gIGlmIChwcm9ncmFtSWQgPT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgYXRhQWRkcmVzcyA9IGF3YWl0IGdldEFzc29jaWF0ZWRUb2tlbkFkZHJlc3MoXG4gICAgICBtaW50UHVibGljS2V5LFxuICAgICAgb3duZXJQdWJsaWNLZXksXG4gICAgICBhbGxvd093bmVyT2ZmQ3VydmUsXG4gICAgICBUT0tFTl8yMDIyX1BST0dSQU1fSURcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGF0YUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzKG1pbnRQdWJsaWNLZXksIG93bmVyUHVibGljS2V5LCBhbGxvd093bmVyT2ZmQ3VydmUpO1xuICB9XG4gIHJldHVybiBhdGFBZGRyZXNzLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1pbnRBZGRyZXNzKG1pbnRBZGRyZXNzOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFtaW50QWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3MobWludEFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG1pbnRBZGRyZXNzLCBnb3Q6ICcgKyBtaW50QWRkcmVzcyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlT3duZXJBZGRyZXNzKG93bmVyQWRkcmVzczogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghb3duZXJBZGRyZXNzIHx8ICFpc1ZhbGlkQWRkcmVzcyhvd25lckFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIG93bmVyQWRkcmVzcywgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgcHJlZGljYXRlIHRvIGNoZWNrIGlmIGFuIGluc3RydWN0aW9uIGlzIGEgbGVnYWN5IFNvbEluc3RydWN0aW9uLlxuICogVXNlcyAncHJvZ3JhbUlkJyBwcm9wZXJ0eSBhcyB0aGUgZGlzY3JpbWluYXRvciBzaW5jZSBpdCdzIHVuaXF1ZSB0byBsZWdhY3kgaW5zdHJ1Y3Rpb25zXG4gKiBWZXJzaW9uZWQgaW5zdHJ1Y3Rpb25zIGhhdmUgJ3Byb2dyYW1JZEluZGV4JyBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gaW5zdHJ1Y3Rpb24gLSBUaGUgaW5zdHJ1Y3Rpb24gdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgU29sSW5zdHJ1Y3Rpb24gKGhhcyBwcm9ncmFtSWQgZmllbGQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NvbExlZ2FjeUluc3RydWN0aW9uKFxuICBpbnN0cnVjdGlvbjogU29sSW5zdHJ1Y3Rpb24gfCBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvblxuKTogaW5zdHJ1Y3Rpb24gaXMgU29sSW5zdHJ1Y3Rpb24ge1xuICByZXR1cm4gJ3Byb2dyYW1JZCcgaW4gaW5zdHJ1Y3Rpb247XG59XG4iXX0=
|