@bitgo-beta/sdk-coin-sol 7.6.4-beta.31 → 7.6.4-beta.310
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.map +1 -0
- package/dist/cjs/src/lib/closeAtaBuilder.js +69 -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 +595 -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 +40 -0
- package/dist/cjs/src/sol.d.ts.map +1 -0
- package/dist/cjs/src/sol.js +1402 -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 +3326 -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/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 +19 -0
- package/dist/esm/lib/closeAtaBuilder.js +62 -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 +558 -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 +267 -0
- package/dist/esm/sol.d.ts.map +1 -0
- package/dist/esm/sol.js +1361 -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 +34 -15
- package/dist/src/config/token2022StaticConfig.js +0 -50
- package/dist/src/lib/ataInitializationBuilder.js +0 -196
- 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 -589
- 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/closeAtaBuilder.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/closeAtaBuilder.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
|
@@ -1,572 +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.solInstructionFactory = solInstructionFactory;
|
|
7
|
-
const public_types_1 = require("@bitgo/public-types");
|
|
8
|
-
const statics_1 = require("@bitgo-beta/statics");
|
|
9
|
-
const spl_token_1 = require("@solana/spl-token");
|
|
10
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
11
|
-
const assert_1 = __importDefault(require("assert"));
|
|
12
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
13
|
-
const constants_1 = require("./constants");
|
|
14
|
-
const utils_1 = require("./utils");
|
|
15
|
-
const jitoStakePoolOperations_1 = require("./jitoStakePoolOperations");
|
|
16
|
-
const token2022Config_1 = require("./token2022Config");
|
|
17
|
-
/**
|
|
18
|
-
* Construct Solana instructions from instructions params
|
|
19
|
-
*
|
|
20
|
-
* @param {InstructionParams} instructionToBuild - the data containing the instruction params
|
|
21
|
-
* @returns {TransactionInstruction[]} An array containing supported Solana instructions
|
|
22
|
-
*/
|
|
23
|
-
function solInstructionFactory(instructionToBuild) {
|
|
24
|
-
switch (instructionToBuild.type) {
|
|
25
|
-
case constants_1.InstructionBuilderTypes.NonceAdvance:
|
|
26
|
-
return advanceNonceInstruction(instructionToBuild);
|
|
27
|
-
case constants_1.InstructionBuilderTypes.Memo:
|
|
28
|
-
return memoInstruction(instructionToBuild);
|
|
29
|
-
case constants_1.InstructionBuilderTypes.Transfer:
|
|
30
|
-
return transferInstruction(instructionToBuild);
|
|
31
|
-
case constants_1.InstructionBuilderTypes.TokenTransfer:
|
|
32
|
-
return tokenTransferInstruction(instructionToBuild);
|
|
33
|
-
case constants_1.InstructionBuilderTypes.Approve:
|
|
34
|
-
return approveInstruction(instructionToBuild);
|
|
35
|
-
case constants_1.InstructionBuilderTypes.CreateNonceAccount:
|
|
36
|
-
return createNonceAccountInstruction(instructionToBuild);
|
|
37
|
-
case constants_1.InstructionBuilderTypes.StakingActivate:
|
|
38
|
-
return stakingInitializeInstruction(instructionToBuild);
|
|
39
|
-
case constants_1.InstructionBuilderTypes.StakingDeactivate:
|
|
40
|
-
return stakingDeactivateInstruction(instructionToBuild);
|
|
41
|
-
case constants_1.InstructionBuilderTypes.StakingWithdraw:
|
|
42
|
-
return stakingWithdrawInstruction(instructionToBuild);
|
|
43
|
-
case constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount:
|
|
44
|
-
return createATAInstruction(instructionToBuild);
|
|
45
|
-
case constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount:
|
|
46
|
-
return closeATAInstruction(instructionToBuild);
|
|
47
|
-
case constants_1.InstructionBuilderTypes.StakingAuthorize:
|
|
48
|
-
return stakingAuthorizeInstruction(instructionToBuild);
|
|
49
|
-
case constants_1.InstructionBuilderTypes.StakingDelegate:
|
|
50
|
-
return stakingDelegateInstruction(instructionToBuild);
|
|
51
|
-
case constants_1.InstructionBuilderTypes.SetComputeUnitLimit:
|
|
52
|
-
return setComputeUnitLimitInstruction(instructionToBuild);
|
|
53
|
-
case constants_1.InstructionBuilderTypes.SetPriorityFee:
|
|
54
|
-
return fetchPriorityFeeInstruction(instructionToBuild);
|
|
55
|
-
case constants_1.InstructionBuilderTypes.MintTo:
|
|
56
|
-
return mintToInstruction(instructionToBuild);
|
|
57
|
-
case constants_1.InstructionBuilderTypes.Burn:
|
|
58
|
-
return burnInstruction(instructionToBuild);
|
|
59
|
-
case constants_1.InstructionBuilderTypes.CustomInstruction:
|
|
60
|
-
return customInstruction(instructionToBuild);
|
|
61
|
-
default:
|
|
62
|
-
throw new Error(`Invalid instruction type or not supported`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Construct Advance Nonce Solana instructions
|
|
67
|
-
*
|
|
68
|
-
* @param {Nonce} data - the data to build the instruction
|
|
69
|
-
* @returns {TransactionInstruction[]} An array containing Advance Nonce Solana instruction
|
|
70
|
-
*/
|
|
71
|
-
function advanceNonceInstruction(data) {
|
|
72
|
-
const { params: { authWalletAddress, walletNonceAddress }, } = data;
|
|
73
|
-
(0, assert_1.default)(authWalletAddress, 'Missing authWalletAddress param');
|
|
74
|
-
(0, assert_1.default)(walletNonceAddress, 'Missing walletNonceAddress param');
|
|
75
|
-
const nonceInstruction = web3_js_1.SystemProgram.nonceAdvance({
|
|
76
|
-
noncePubkey: new web3_js_1.PublicKey(walletNonceAddress),
|
|
77
|
-
authorizedPubkey: new web3_js_1.PublicKey(authWalletAddress),
|
|
78
|
-
});
|
|
79
|
-
return [nonceInstruction];
|
|
80
|
-
}
|
|
81
|
-
function setComputeUnitLimitInstruction(instructionToBuild) {
|
|
82
|
-
const setComputeUnitLimit = web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({
|
|
83
|
-
units: instructionToBuild.params.units,
|
|
84
|
-
});
|
|
85
|
-
return [setComputeUnitLimit];
|
|
86
|
-
}
|
|
87
|
-
function fetchPriorityFeeInstruction(instructionToBuild) {
|
|
88
|
-
const addPriorityFee = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({
|
|
89
|
-
microLamports: instructionToBuild.params.fee,
|
|
90
|
-
});
|
|
91
|
-
return [addPriorityFee];
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Construct Memo Solana instructions
|
|
95
|
-
*
|
|
96
|
-
* @param {Memo} data - the data to build the instruction
|
|
97
|
-
* @returns {TransactionInstruction[]} An array containing Memo Solana instruction
|
|
98
|
-
*/
|
|
99
|
-
function memoInstruction(data) {
|
|
100
|
-
const { params: { memo }, } = data;
|
|
101
|
-
(0, assert_1.default)(memo, 'Missing memo param');
|
|
102
|
-
const memoInstruction = new web3_js_1.TransactionInstruction({
|
|
103
|
-
keys: [],
|
|
104
|
-
programId: new web3_js_1.PublicKey(constants_1.MEMO_PROGRAM_PK),
|
|
105
|
-
data: Buffer.from(memo),
|
|
106
|
-
});
|
|
107
|
-
return [memoInstruction];
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Construct Transfer Solana instructions
|
|
111
|
-
*
|
|
112
|
-
* @param {Transfer} data - the data to build the instruction
|
|
113
|
-
* @returns {TransactionInstruction[]} An array containing Transfer Solana instruction
|
|
114
|
-
*/
|
|
115
|
-
function transferInstruction(data) {
|
|
116
|
-
const { params: { fromAddress, toAddress, amount }, } = data;
|
|
117
|
-
(0, assert_1.default)(fromAddress, 'Missing fromAddress param');
|
|
118
|
-
(0, assert_1.default)(toAddress, 'Missing toAddress param');
|
|
119
|
-
(0, assert_1.default)(amount, 'Missing toAddress param');
|
|
120
|
-
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
121
|
-
fromPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
122
|
-
toPubkey: new web3_js_1.PublicKey(toAddress),
|
|
123
|
-
lamports: parseInt(amount, 10),
|
|
124
|
-
});
|
|
125
|
-
return [transferInstruction];
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Construct Transfer Solana instructions
|
|
129
|
-
*
|
|
130
|
-
* @param {Transfer} data - the data to build the instruction
|
|
131
|
-
* @returns {TransactionInstruction[]} An array containing Transfer Solana instruction
|
|
132
|
-
*/
|
|
133
|
-
function tokenTransferInstruction(data) {
|
|
134
|
-
const { params: { fromAddress, toAddress, amount, tokenName, sourceAddress }, } = data;
|
|
135
|
-
(0, assert_1.default)(fromAddress, 'Missing fromAddress (owner) param');
|
|
136
|
-
(0, assert_1.default)(toAddress, 'Missing toAddress param');
|
|
137
|
-
(0, assert_1.default)(amount, 'Missing amount param');
|
|
138
|
-
(0, assert_1.default)(tokenName, 'Missing token name');
|
|
139
|
-
(0, assert_1.default)(sourceAddress, 'Missing ata address');
|
|
140
|
-
const token = (0, utils_1.getSolTokenFromTokenName)(data.params.tokenName);
|
|
141
|
-
let tokenAddress;
|
|
142
|
-
let programId;
|
|
143
|
-
let decimalPlaces;
|
|
144
|
-
if (data.params.tokenAddress && data.params.decimalPlaces) {
|
|
145
|
-
tokenAddress = data.params.tokenAddress;
|
|
146
|
-
decimalPlaces = data.params.decimalPlaces;
|
|
147
|
-
programId = data.params.programId;
|
|
148
|
-
}
|
|
149
|
-
else if (token) {
|
|
150
|
-
(0, assert_1.default)(token instanceof statics_1.SolCoin);
|
|
151
|
-
tokenAddress = token.tokenAddress;
|
|
152
|
-
decimalPlaces = token.decimalPlaces;
|
|
153
|
-
programId = token.programId;
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
throw new Error('Invalid token name, got:' + data.params.tokenName);
|
|
157
|
-
}
|
|
158
|
-
let transferInstruction;
|
|
159
|
-
const instructions = [];
|
|
160
|
-
if (programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
|
|
161
|
-
// Create the base transfer instruction
|
|
162
|
-
transferInstruction = (0, spl_token_1.createTransferCheckedInstruction)(new web3_js_1.PublicKey(sourceAddress), new web3_js_1.PublicKey(tokenAddress), new web3_js_1.PublicKey(toAddress), new web3_js_1.PublicKey(fromAddress), BigInt(amount), decimalPlaces, [], spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
163
|
-
// Check if this token has a transfer hook configuration
|
|
164
|
-
const tokenConfig = (0, token2022Config_1.getToken2022Config)(tokenAddress);
|
|
165
|
-
if (tokenConfig?.transferHook) {
|
|
166
|
-
addTransferHookAccounts(transferInstruction, tokenConfig.transferHook);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
transferInstruction = (0, spl_token_1.createTransferCheckedInstruction)(new web3_js_1.PublicKey(sourceAddress), new web3_js_1.PublicKey(tokenAddress), new web3_js_1.PublicKey(toAddress), new web3_js_1.PublicKey(fromAddress), BigInt(amount), decimalPlaces);
|
|
171
|
-
}
|
|
172
|
-
instructions.push(transferInstruction);
|
|
173
|
-
return instructions;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Construct Transfer Solana instructions
|
|
177
|
-
*
|
|
178
|
-
* @param {Transfer} data - the data to build the instruction
|
|
179
|
-
* @returns {TransactionInstruction[]} An array containing Transfer Solana instruction
|
|
180
|
-
*/
|
|
181
|
-
function approveInstruction(data) {
|
|
182
|
-
const { params: { accountAddress, delegateAddress, ownerAddress, amount, programId }, } = data;
|
|
183
|
-
(0, assert_1.default)(accountAddress, 'Missing fromAddress (owner) param');
|
|
184
|
-
(0, assert_1.default)(delegateAddress, 'Missing toAddress param');
|
|
185
|
-
(0, assert_1.default)(ownerAddress, 'Missing ownerAddress param');
|
|
186
|
-
(0, assert_1.default)(programId, 'Missing programId param');
|
|
187
|
-
(0, assert_1.default)(amount, 'Missing amount param');
|
|
188
|
-
return [
|
|
189
|
-
(0, spl_token_1.createApproveInstruction)(new web3_js_1.PublicKey(accountAddress), new web3_js_1.PublicKey(delegateAddress), new web3_js_1.PublicKey(ownerAddress), BigInt(amount), undefined, programId === undefined ? undefined : new web3_js_1.PublicKey(programId)),
|
|
190
|
-
];
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Construct Create and Initialize Nonce Solana instructions
|
|
194
|
-
*
|
|
195
|
-
* @param {WalletInit} data - the data to build the instruction
|
|
196
|
-
* @returns {TransactionInstruction[]} An array containing Create and Initialize Nonce Solana instruction
|
|
197
|
-
*/
|
|
198
|
-
function createNonceAccountInstruction(data) {
|
|
199
|
-
const { params: { fromAddress, nonceAddress, authAddress, amount }, } = data;
|
|
200
|
-
(0, assert_1.default)(fromAddress, 'Missing fromAddress param');
|
|
201
|
-
(0, assert_1.default)(nonceAddress, 'Missing nonceAddress param');
|
|
202
|
-
(0, assert_1.default)(authAddress, 'Missing authAddress param');
|
|
203
|
-
(0, assert_1.default)(amount, 'Missing amount param');
|
|
204
|
-
const nonceAccountInstruction = web3_js_1.SystemProgram.createNonceAccount({
|
|
205
|
-
fromPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
206
|
-
noncePubkey: new web3_js_1.PublicKey(nonceAddress),
|
|
207
|
-
authorizedPubkey: new web3_js_1.PublicKey(authAddress),
|
|
208
|
-
lamports: new bignumber_js_1.default(amount).toNumber(),
|
|
209
|
-
});
|
|
210
|
-
return nonceAccountInstruction.instructions;
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Construct Create Staking Account and Delegate Solana instructions
|
|
214
|
-
*
|
|
215
|
-
* @param {StakingActivate} data - the data to build the instruction
|
|
216
|
-
* @returns {TransactionInstruction[]} An array containing Create Staking Account and Delegate Solana instructions
|
|
217
|
-
*/
|
|
218
|
-
function stakingInitializeInstruction(data) {
|
|
219
|
-
const { params: { fromAddress, stakingAddress, amount, validator, stakingType, extraParams }, } = data;
|
|
220
|
-
(0, assert_1.default)(fromAddress, 'Missing fromAddress param');
|
|
221
|
-
(0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
|
|
222
|
-
(0, assert_1.default)(amount, 'Missing amount param');
|
|
223
|
-
(0, assert_1.default)(validator, 'Missing validator param');
|
|
224
|
-
const fromPubkey = new web3_js_1.PublicKey(fromAddress);
|
|
225
|
-
const stakePubkey = new web3_js_1.PublicKey(stakingAddress);
|
|
226
|
-
const validatorPubkey = new web3_js_1.PublicKey(validator);
|
|
227
|
-
const tx = new web3_js_1.Transaction();
|
|
228
|
-
switch (stakingType) {
|
|
229
|
-
case public_types_1.SolStakingTypeEnum.JITO: {
|
|
230
|
-
(0, assert_1.default)(extraParams !== undefined, 'Missing extraParams param');
|
|
231
|
-
const instructions = (0, jitoStakePoolOperations_1.depositSolInstructions)({
|
|
232
|
-
stakePoolAddress: stakePubkey,
|
|
233
|
-
from: fromPubkey,
|
|
234
|
-
lamports: BigInt(amount),
|
|
235
|
-
}, extraParams.stakePoolData, !!extraParams.createAssociatedTokenAccount);
|
|
236
|
-
tx.add(...instructions);
|
|
237
|
-
break;
|
|
238
|
-
}
|
|
239
|
-
case public_types_1.SolStakingTypeEnum.MARINADE: {
|
|
240
|
-
const walletInitStaking = web3_js_1.StakeProgram.createAccount({
|
|
241
|
-
fromPubkey,
|
|
242
|
-
stakePubkey,
|
|
243
|
-
authorized: new web3_js_1.Authorized(validatorPubkey, fromPubkey), // staker and withdrawer
|
|
244
|
-
lockup: new web3_js_1.Lockup(0, 0, fromPubkey), // No minimum epoch to withdraw
|
|
245
|
-
lamports: new bignumber_js_1.default(amount).toNumber(),
|
|
246
|
-
});
|
|
247
|
-
tx.add(walletInitStaking);
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
250
|
-
case public_types_1.SolStakingTypeEnum.NATIVE: {
|
|
251
|
-
const walletInitStaking = web3_js_1.StakeProgram.createAccount({
|
|
252
|
-
fromPubkey,
|
|
253
|
-
stakePubkey,
|
|
254
|
-
authorized: new web3_js_1.Authorized(fromPubkey, fromPubkey), // staker and withdrawer
|
|
255
|
-
lockup: new web3_js_1.Lockup(0, 0, fromPubkey), // No minimum epoch to withdraw
|
|
256
|
-
lamports: new bignumber_js_1.default(amount).toNumber(),
|
|
257
|
-
});
|
|
258
|
-
tx.add(walletInitStaking);
|
|
259
|
-
const delegateStaking = web3_js_1.StakeProgram.delegate({
|
|
260
|
-
stakePubkey: new web3_js_1.PublicKey(stakingAddress),
|
|
261
|
-
authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
262
|
-
votePubkey: new web3_js_1.PublicKey(validator),
|
|
263
|
-
});
|
|
264
|
-
tx.add(delegateStaking);
|
|
265
|
-
break;
|
|
266
|
-
}
|
|
267
|
-
default: {
|
|
268
|
-
const unreachable = stakingType;
|
|
269
|
-
throw new Error(`Unknown staking type ${unreachable}`);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
return tx.instructions;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Construct staking deactivate Solana instructions
|
|
276
|
-
*
|
|
277
|
-
* @param {StakingDeactivate} data - the data to build the instruction
|
|
278
|
-
* @returns {TransactionInstruction[]} An array containing staking deactivate instruction
|
|
279
|
-
*/
|
|
280
|
-
function stakingDeactivateInstruction(data) {
|
|
281
|
-
const { params: { fromAddress, stakingAddress, amount, unstakingAddress, recipients, stakingType, extraParams }, } = data;
|
|
282
|
-
(0, assert_1.default)(fromAddress, 'Missing fromAddress param');
|
|
283
|
-
switch (stakingType) {
|
|
284
|
-
case public_types_1.SolStakingTypeEnum.JITO: {
|
|
285
|
-
(0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
|
|
286
|
-
(0, assert_1.default)(unstakingAddress, 'Missing unstakingAddress param');
|
|
287
|
-
(0, assert_1.default)(amount, 'Missing amount param');
|
|
288
|
-
(0, assert_1.default)(extraParams, 'Missing extraParams param');
|
|
289
|
-
const tx = new web3_js_1.Transaction();
|
|
290
|
-
tx.add(...(0, jitoStakePoolOperations_1.withdrawStakeInstructions)({
|
|
291
|
-
stakePoolAddress: new web3_js_1.PublicKey(stakingAddress),
|
|
292
|
-
tokenOwner: new web3_js_1.PublicKey(fromAddress),
|
|
293
|
-
destinationStakeAccount: new web3_js_1.PublicKey(unstakingAddress),
|
|
294
|
-
validatorAddress: new web3_js_1.PublicKey(extraParams.validatorAddress),
|
|
295
|
-
transferAuthority: new web3_js_1.PublicKey(extraParams.transferAuthorityAddress),
|
|
296
|
-
poolAmount: amount,
|
|
297
|
-
}, extraParams.stakePoolData));
|
|
298
|
-
return tx.instructions;
|
|
299
|
-
}
|
|
300
|
-
case public_types_1.SolStakingTypeEnum.MARINADE: {
|
|
301
|
-
(0, assert_1.default)(recipients, 'Missing recipients param');
|
|
302
|
-
const tx = new web3_js_1.Transaction();
|
|
303
|
-
const toPubkeyAddress = new web3_js_1.PublicKey(recipients[0].address || '');
|
|
304
|
-
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
305
|
-
fromPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
306
|
-
toPubkey: toPubkeyAddress,
|
|
307
|
-
lamports: parseInt(recipients[0].amount, 10),
|
|
308
|
-
});
|
|
309
|
-
tx.add(transferInstruction);
|
|
310
|
-
return tx.instructions;
|
|
311
|
-
}
|
|
312
|
-
case public_types_1.SolStakingTypeEnum.NATIVE: {
|
|
313
|
-
(0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
|
|
314
|
-
if (data.params.amount && data.params.unstakingAddress) {
|
|
315
|
-
const tx = new web3_js_1.Transaction();
|
|
316
|
-
const unstakingAddress = new web3_js_1.PublicKey(data.params.unstakingAddress);
|
|
317
|
-
const allocateAccount = web3_js_1.SystemProgram.allocate({
|
|
318
|
-
accountPubkey: unstakingAddress,
|
|
319
|
-
space: web3_js_1.StakeProgram.space,
|
|
320
|
-
});
|
|
321
|
-
tx.add(allocateAccount);
|
|
322
|
-
const assignAccount = web3_js_1.SystemProgram.assign({
|
|
323
|
-
accountPubkey: unstakingAddress,
|
|
324
|
-
programId: web3_js_1.StakeProgram.programId,
|
|
325
|
-
});
|
|
326
|
-
tx.add(assignAccount);
|
|
327
|
-
const splitStake = web3_js_1.StakeProgram.split({
|
|
328
|
-
stakePubkey: new web3_js_1.PublicKey(stakingAddress),
|
|
329
|
-
authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
330
|
-
splitStakePubkey: unstakingAddress,
|
|
331
|
-
lamports: new bignumber_js_1.default(data.params.amount).toNumber(),
|
|
332
|
-
}, 0);
|
|
333
|
-
tx.add(splitStake.instructions[1]);
|
|
334
|
-
const deactivateStaking = web3_js_1.StakeProgram.deactivate({
|
|
335
|
-
stakePubkey: unstakingAddress,
|
|
336
|
-
authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
337
|
-
});
|
|
338
|
-
tx.add(deactivateStaking);
|
|
339
|
-
return tx.instructions;
|
|
340
|
-
}
|
|
341
|
-
else {
|
|
342
|
-
const deactivateStaking = web3_js_1.StakeProgram.deactivate({
|
|
343
|
-
stakePubkey: new web3_js_1.PublicKey(stakingAddress),
|
|
344
|
-
authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
345
|
-
});
|
|
346
|
-
return deactivateStaking.instructions;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
default: {
|
|
350
|
-
const unreachable = stakingType;
|
|
351
|
-
throw new Error(`Unknown staking type ${unreachable}`);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* Construct Staking Withdraw Solana instructions
|
|
357
|
-
*
|
|
358
|
-
* @param {StakingWithdraw} data - the data to build the instruction
|
|
359
|
-
* @returns {TransactionInstruction[]} An array containing Staking Withdraw Solana instructions
|
|
360
|
-
*/
|
|
361
|
-
function stakingWithdrawInstruction(data) {
|
|
362
|
-
const { params: { fromAddress, stakingAddress, amount }, } = data;
|
|
363
|
-
(0, assert_1.default)(fromAddress, 'Missing fromAddress param');
|
|
364
|
-
(0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
|
|
365
|
-
(0, assert_1.default)(amount, 'Missing amount param');
|
|
366
|
-
const withdrawStaking = web3_js_1.StakeProgram.withdraw({
|
|
367
|
-
stakePubkey: new web3_js_1.PublicKey(stakingAddress),
|
|
368
|
-
authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
369
|
-
toPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
370
|
-
lamports: new bignumber_js_1.default(amount).toNumber(),
|
|
371
|
-
});
|
|
372
|
-
return withdrawStaking.instructions;
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Construct Create and Initialize Nonce Solana instructions
|
|
376
|
-
*
|
|
377
|
-
* @param {WalletInit} data - the data to build the instruction
|
|
378
|
-
* @returns {TransactionInstruction[]} An array containing Create and Initialize Nonce Solana instruction
|
|
379
|
-
*/
|
|
380
|
-
function createATAInstruction(data) {
|
|
381
|
-
const { params: { mintAddress, ataAddress, ownerAddress, payerAddress, programId }, } = data;
|
|
382
|
-
(0, assert_1.default)(mintAddress, 'Missing mintAddress param');
|
|
383
|
-
(0, assert_1.default)(ataAddress, 'Missing ataAddress param');
|
|
384
|
-
(0, assert_1.default)(ownerAddress, 'Missing ownerAddress param');
|
|
385
|
-
(0, assert_1.default)(payerAddress, 'Missing payerAddress param');
|
|
386
|
-
let associatedTokenAccountInstruction;
|
|
387
|
-
if (programId && programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
|
|
388
|
-
associatedTokenAccountInstruction = (0, spl_token_1.createAssociatedTokenAccountInstruction)(new web3_js_1.PublicKey(payerAddress), new web3_js_1.PublicKey(ataAddress), new web3_js_1.PublicKey(ownerAddress), new web3_js_1.PublicKey(mintAddress), spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
389
|
-
}
|
|
390
|
-
else {
|
|
391
|
-
associatedTokenAccountInstruction = (0, spl_token_1.createAssociatedTokenAccountInstruction)(new web3_js_1.PublicKey(payerAddress), new web3_js_1.PublicKey(ataAddress), new web3_js_1.PublicKey(ownerAddress), new web3_js_1.PublicKey(mintAddress));
|
|
392
|
-
}
|
|
393
|
-
return [associatedTokenAccountInstruction];
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Construct Close ATA Solana instructions
|
|
397
|
-
*
|
|
398
|
-
* @param {WalletInit} data - the data to build the instruction
|
|
399
|
-
* @returns {TransactionInstruction[]} An array containing Close ATA Solana instruction
|
|
400
|
-
*/
|
|
401
|
-
function closeATAInstruction(data) {
|
|
402
|
-
const { params: { accountAddress, destinationAddress, authorityAddress }, } = data;
|
|
403
|
-
(0, assert_1.default)(accountAddress, 'Missing accountAddress param');
|
|
404
|
-
(0, assert_1.default)(destinationAddress, 'Missing destinationAddress param');
|
|
405
|
-
(0, assert_1.default)(authorityAddress, 'Missing authorityAddress param');
|
|
406
|
-
const closeAssociatedTokenAccountInstruction = (0, spl_token_1.createCloseAccountInstruction)(new web3_js_1.PublicKey(accountAddress), new web3_js_1.PublicKey(destinationAddress), new web3_js_1.PublicKey(authorityAddress));
|
|
407
|
-
return [closeAssociatedTokenAccountInstruction];
|
|
408
|
-
}
|
|
409
|
-
/**
|
|
410
|
-
* Construct Staking Account Authorize Solana instructions
|
|
411
|
-
*
|
|
412
|
-
* @param {StakingAuthorize} data - the data to build the instruction
|
|
413
|
-
* @returns {TransactionInstruction[]} An array containing Staking Account Authorize instructions
|
|
414
|
-
*/
|
|
415
|
-
function stakingAuthorizeInstruction(data) {
|
|
416
|
-
const { params: { stakingAddress, oldAuthorizeAddress, newAuthorizeAddress, newWithdrawAddress }, } = data;
|
|
417
|
-
(0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
|
|
418
|
-
(0, assert_1.default)(oldAuthorizeAddress, 'Missing oldAuthorizeAddress param');
|
|
419
|
-
(0, assert_1.default)(newAuthorizeAddress, 'Missing newAuthorizeAddress param');
|
|
420
|
-
(0, assert_1.default)(newWithdrawAddress, 'Missing newWithdrawAddress param');
|
|
421
|
-
const tx = new web3_js_1.Transaction();
|
|
422
|
-
const authorizeStaking = web3_js_1.StakeProgram.authorize({
|
|
423
|
-
stakePubkey: new web3_js_1.PublicKey(stakingAddress),
|
|
424
|
-
authorizedPubkey: new web3_js_1.PublicKey(oldAuthorizeAddress),
|
|
425
|
-
newAuthorizedPubkey: new web3_js_1.PublicKey(newAuthorizeAddress),
|
|
426
|
-
stakeAuthorizationType: web3_js_1.StakeAuthorizationLayout.Staker,
|
|
427
|
-
});
|
|
428
|
-
const authorizeWithdraw = web3_js_1.StakeProgram.authorize({
|
|
429
|
-
stakePubkey: new web3_js_1.PublicKey(stakingAddress),
|
|
430
|
-
authorizedPubkey: new web3_js_1.PublicKey(oldAuthorizeAddress),
|
|
431
|
-
newAuthorizedPubkey: new web3_js_1.PublicKey(newAuthorizeAddress),
|
|
432
|
-
stakeAuthorizationType: web3_js_1.StakeAuthorizationLayout.Withdrawer,
|
|
433
|
-
custodianPubkey: new web3_js_1.PublicKey(newWithdrawAddress),
|
|
434
|
-
});
|
|
435
|
-
tx.add(authorizeStaking);
|
|
436
|
-
tx.add(authorizeWithdraw);
|
|
437
|
-
return tx.instructions;
|
|
438
|
-
}
|
|
439
|
-
/**
|
|
440
|
-
* Construct Delegate Solana instructions
|
|
441
|
-
*
|
|
442
|
-
* @param {StakingActivate} data - the data to build the instruction
|
|
443
|
-
* @returns {TransactionInstruction[]} An array containing Delegate Solana instructions
|
|
444
|
-
*/
|
|
445
|
-
function stakingDelegateInstruction(data) {
|
|
446
|
-
const { params: { fromAddress, stakingAddress, validator }, } = data;
|
|
447
|
-
(0, assert_1.default)(fromAddress, 'Missing fromAddress param');
|
|
448
|
-
(0, assert_1.default)(stakingAddress, 'Missing stakingAddress param');
|
|
449
|
-
(0, assert_1.default)(validator, 'Missing validator param');
|
|
450
|
-
const tx = new web3_js_1.Transaction();
|
|
451
|
-
const delegateStaking = web3_js_1.StakeProgram.delegate({
|
|
452
|
-
stakePubkey: new web3_js_1.PublicKey(stakingAddress),
|
|
453
|
-
authorizedPubkey: new web3_js_1.PublicKey(fromAddress),
|
|
454
|
-
votePubkey: new web3_js_1.PublicKey(validator),
|
|
455
|
-
});
|
|
456
|
-
tx.add(delegateStaking);
|
|
457
|
-
return tx.instructions;
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Construct MintTo Solana instructions
|
|
461
|
-
*
|
|
462
|
-
* @param {MintTo} data - the data to build the instruction
|
|
463
|
-
* @returns {TransactionInstruction[]} An array containing MintTo Solana instructions
|
|
464
|
-
*/
|
|
465
|
-
function mintToInstruction(data) {
|
|
466
|
-
const { params: { mintAddress, destinationAddress, authorityAddress, amount, programId }, } = data;
|
|
467
|
-
(0, assert_1.default)(mintAddress, 'Missing mintAddress param');
|
|
468
|
-
(0, assert_1.default)(destinationAddress, 'Missing destinationAddress param');
|
|
469
|
-
(0, assert_1.default)(authorityAddress, 'Missing authorityAddress param');
|
|
470
|
-
(0, assert_1.default)(amount, 'Missing amount param');
|
|
471
|
-
const mint = new web3_js_1.PublicKey(mintAddress);
|
|
472
|
-
const destination = new web3_js_1.PublicKey(destinationAddress);
|
|
473
|
-
const authority = new web3_js_1.PublicKey(authorityAddress);
|
|
474
|
-
let mintToInstr;
|
|
475
|
-
if (programId && programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
|
|
476
|
-
mintToInstr = (0, spl_token_1.createMintToInstruction)(mint, destination, authority, BigInt(amount), [], spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
477
|
-
}
|
|
478
|
-
else {
|
|
479
|
-
mintToInstr = (0, spl_token_1.createMintToInstruction)(mint, destination, authority, BigInt(amount));
|
|
480
|
-
}
|
|
481
|
-
return [mintToInstr];
|
|
482
|
-
}
|
|
483
|
-
/**
|
|
484
|
-
* Construct Burn Solana instructions
|
|
485
|
-
*
|
|
486
|
-
* @param {Burn} data - the data to build the instruction
|
|
487
|
-
* @returns {TransactionInstruction[]} An array containing Burn Solana instructions
|
|
488
|
-
*/
|
|
489
|
-
function burnInstruction(data) {
|
|
490
|
-
const { params: { mintAddress, accountAddress, authorityAddress, amount, programId }, } = data;
|
|
491
|
-
(0, assert_1.default)(mintAddress, 'Missing mintAddress param');
|
|
492
|
-
(0, assert_1.default)(accountAddress, 'Missing accountAddress param');
|
|
493
|
-
(0, assert_1.default)(authorityAddress, 'Missing authorityAddress param');
|
|
494
|
-
(0, assert_1.default)(amount, 'Missing amount param');
|
|
495
|
-
const mint = new web3_js_1.PublicKey(mintAddress);
|
|
496
|
-
const account = new web3_js_1.PublicKey(accountAddress);
|
|
497
|
-
const authority = new web3_js_1.PublicKey(authorityAddress);
|
|
498
|
-
let burnInstr;
|
|
499
|
-
if (programId && programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
|
|
500
|
-
burnInstr = (0, spl_token_1.createBurnInstruction)(account, mint, authority, BigInt(amount), [], spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
501
|
-
}
|
|
502
|
-
else {
|
|
503
|
-
burnInstr = (0, spl_token_1.createBurnInstruction)(account, mint, authority, BigInt(amount));
|
|
504
|
-
}
|
|
505
|
-
return [burnInstr];
|
|
506
|
-
}
|
|
507
|
-
/**
|
|
508
|
-
* Process custom instruction - converts to TransactionInstruction
|
|
509
|
-
* Handles conversion from string-based format to TransactionInstruction format
|
|
510
|
-
*
|
|
511
|
-
* @param {CustomInstruction} data - the data containing the custom instruction
|
|
512
|
-
* @returns {TransactionInstruction[]} An array containing the custom instruction
|
|
513
|
-
*/
|
|
514
|
-
function customInstruction(data) {
|
|
515
|
-
const { params } = data;
|
|
516
|
-
(0, assert_1.default)(params.programId, 'Missing programId in custom instruction');
|
|
517
|
-
(0, assert_1.default)(params.keys && Array.isArray(params.keys), 'Missing or invalid keys in custom instruction');
|
|
518
|
-
(0, assert_1.default)(params.data !== undefined, 'Missing data in custom instruction');
|
|
519
|
-
// Convert string data to Buffer
|
|
520
|
-
let dataBuffer;
|
|
521
|
-
if ((0, utils_1.isValidBase64)(params.data)) {
|
|
522
|
-
dataBuffer = Buffer.from(params.data, 'base64');
|
|
523
|
-
}
|
|
524
|
-
else if ((0, utils_1.isValidHex)(params.data)) {
|
|
525
|
-
dataBuffer = Buffer.from(params.data, 'hex');
|
|
526
|
-
}
|
|
527
|
-
else {
|
|
528
|
-
// Fallback to UTF-8
|
|
529
|
-
dataBuffer = Buffer.from(params.data, 'utf8');
|
|
530
|
-
}
|
|
531
|
-
// Create a new TransactionInstruction with the converted data
|
|
532
|
-
const convertedInstruction = new web3_js_1.TransactionInstruction({
|
|
533
|
-
programId: new web3_js_1.PublicKey(params.programId),
|
|
534
|
-
keys: params.keys.map((key) => ({
|
|
535
|
-
pubkey: new web3_js_1.PublicKey(key.pubkey),
|
|
536
|
-
isSigner: key.isSigner,
|
|
537
|
-
isWritable: key.isWritable,
|
|
538
|
-
})),
|
|
539
|
-
data: dataBuffer,
|
|
540
|
-
});
|
|
541
|
-
return [convertedInstruction];
|
|
542
|
-
}
|
|
543
|
-
function upsertAccountMeta(keys, meta) {
|
|
544
|
-
const existing = keys.find((account) => account.pubkey.equals(meta.pubkey));
|
|
545
|
-
if (existing) {
|
|
546
|
-
existing.isWritable = existing.isWritable || meta.isWritable;
|
|
547
|
-
existing.isSigner = existing.isSigner || meta.isSigner;
|
|
548
|
-
}
|
|
549
|
-
else {
|
|
550
|
-
keys.push(meta);
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
function buildStaticTransferHookAccounts(transferHook) {
|
|
554
|
-
const metas = [];
|
|
555
|
-
if (transferHook.extraAccountMetas?.length) {
|
|
556
|
-
for (const meta of transferHook.extraAccountMetas) {
|
|
557
|
-
metas.push({
|
|
558
|
-
pubkey: new web3_js_1.PublicKey(meta.pubkey),
|
|
559
|
-
isSigner: meta.isSigner,
|
|
560
|
-
isWritable: meta.isWritable,
|
|
561
|
-
});
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
return metas;
|
|
565
|
-
}
|
|
566
|
-
function addTransferHookAccounts(instruction, transferHook) {
|
|
567
|
-
const extraMetas = buildStaticTransferHookAccounts(transferHook);
|
|
568
|
-
for (const meta of extraMetas) {
|
|
569
|
-
upsertAccountMeta(instruction.keys, meta);
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sSW5zdHJ1Y3Rpb25GYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zb2xJbnN0cnVjdGlvbkZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUF5REEsc0RBeUNDO0FBbEdELHNEQUF5RDtBQUN6RCxpREFBOEM7QUFDOUMsaURBUTJCO0FBQzNCLDZDQVd5QjtBQUN6QixvREFBNEI7QUFDNUIsZ0VBQXFDO0FBQ3JDLDJDQUF1RTtBQXNCdkUsbUNBQThFO0FBQzlFLHVFQUE4RjtBQUM5Rix1REFBMkU7QUFFM0U7Ozs7O0dBS0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxrQkFBcUM7SUFDekUsUUFBUSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxLQUFLLG1DQUF1QixDQUFDLFlBQVk7WUFDdkMsT0FBTyx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JELEtBQUssbUNBQXVCLENBQUMsSUFBSTtZQUMvQixPQUFPLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdDLEtBQUssbUNBQXVCLENBQUMsUUFBUTtZQUNuQyxPQUFPLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDakQsS0FBSyxtQ0FBdUIsQ0FBQyxhQUFhO1lBQ3hDLE9BQU8sd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0RCxLQUFLLG1DQUF1QixDQUFDLE9BQU87WUFDbEMsT0FBTyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELEtBQUssbUNBQXVCLENBQUMsa0JBQWtCO1lBQzdDLE9BQU8sNkJBQTZCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzRCxLQUFLLG1DQUF1QixDQUFDLGVBQWU7WUFDMUMsT0FBTyw0QkFBNEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFELEtBQUssbUNBQXVCLENBQUMsaUJBQWlCO1lBQzVDLE9BQU8sNEJBQTRCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxRCxLQUFLLG1DQUF1QixDQUFDLGVBQWU7WUFDMUMsT0FBTywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hELEtBQUssbUNBQXVCLENBQUMsNEJBQTRCO1lBQ3ZELE9BQU8sb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNsRCxLQUFLLG1DQUF1QixDQUFDLDJCQUEyQjtZQUN0RCxPQUFPLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDakQsS0FBSyxtQ0FBdUIsQ0FBQyxnQkFBZ0I7WUFDM0MsT0FBTywyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pELEtBQUssbUNBQXVCLENBQUMsZUFBZTtZQUMxQyxPQUFPLDBCQUEwQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDeEQsS0FBSyxtQ0FBdUIsQ0FBQyxtQkFBbUI7WUFDOUMsT0FBTyw4QkFBOEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzVELEtBQUssbUNBQXVCLENBQUMsY0FBYztZQUN6QyxPQUFPLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekQsS0FBSyxtQ0FBdUIsQ0FBQyxNQUFNO1lBQ2pDLE9BQU8saUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMvQyxLQUFLLG1DQUF1QixDQUFDLElBQUk7WUFDL0IsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3QyxLQUFLLG1DQUF1QixDQUFDLGlCQUFpQjtZQUM1QyxPQUFPLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0M7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7SUFDakUsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQUMsSUFBVztJQUMxQyxNQUFNLEVBQ0osTUFBTSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsR0FDbEQsR0FBRyxJQUFJLENBQUM7SUFDVCxJQUFBLGdCQUFNLEVBQUMsaUJBQWlCLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUM3RCxJQUFBLGdCQUFNLEVBQUMsa0JBQWtCLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztJQUMvRCxNQUFNLGdCQUFnQixHQUFHLHVCQUFhLENBQUMsWUFBWSxDQUFDO1FBQ2xELFdBQVcsRUFBRSxJQUFJLG1CQUFTLENBQUMsa0JBQWtCLENBQUM7UUFDOUMsZ0JBQWdCLEVBQUUsSUFBSSxtQkFBUyxDQUFDLGlCQUFpQixDQUFDO0tBQ25ELENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxTQUFTLDhCQUE4QixDQUFDLGtCQUF1QztJQUM3RSxNQUFNLG1CQUFtQixHQUFHLDhCQUFvQixDQUFDLG1CQUFtQixDQUFDO1FBQ25FLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsS0FBSztLQUN2QyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUywyQkFBMkIsQ0FBQyxrQkFBa0M7SUFDckUsTUFBTSxjQUFjLEdBQUcsOEJBQW9CLENBQUMsbUJBQW1CLENBQUM7UUFDOUQsYUFBYSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHO0tBQzdDLENBQUMsQ0FBQztJQUVILE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxJQUFVO0lBQ2pDLE1BQU0sRUFDSixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FDakIsR0FBRyxJQUFJLENBQUM7SUFDVCxJQUFBLGdCQUFNLEVBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDbkMsTUFBTSxlQUFlLEdBQUcsSUFBSSxnQ0FBc0IsQ0FBQztRQUNqRCxJQUFJLEVBQUUsRUFBRTtRQUNSLFNBQVMsRUFBRSxJQUFJLG1CQUFTLENBQUMsMkJBQWUsQ0FBQztRQUN6QyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsbUJBQW1CLENBQUMsSUFBYztJQUN6QyxNQUFNLEVBQ0osTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FDM0MsR0FBRyxJQUFJLENBQUM7SUFDVCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDakQsSUFBQSxnQkFBTSxFQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLElBQUEsZ0JBQU0sRUFBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUMxQyxNQUFNLG1CQUFtQixHQUFHLHVCQUFhLENBQUMsUUFBUSxDQUFDO1FBQ2pELFVBQVUsRUFBRSxJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3RDLFFBQVEsRUFBRSxJQUFJLG1CQUFTLENBQUMsU0FBUyxDQUFDO1FBQ2xDLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztLQUMvQixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHdCQUF3QixDQUFDLElBQW1CO0lBQ25ELE1BQU0sRUFDSixNQUFNLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEdBQ3JFLEdBQUcsSUFBSSxDQUFDO0lBQ1QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3pELElBQUEsZ0JBQU0sRUFBQyxTQUFTLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxJQUFBLGdCQUFNLEVBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDdkMsSUFBQSxnQkFBTSxFQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3hDLElBQUEsZ0JBQU0sRUFBQyxhQUFhLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFBLGdDQUF3QixFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsSUFBSSxZQUFvQixDQUFDO0lBQ3pCLElBQUksU0FBNkIsQ0FBQztJQUNsQyxJQUFJLGFBQXFCLENBQUM7SUFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFELFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUN4QyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDMUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQ3BDLENBQUM7U0FBTSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ2pCLElBQUEsZ0JBQU0sRUFBQyxLQUFLLFlBQVksaUJBQU8sQ0FBQyxDQUFDO1FBQ2pDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xDLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3BDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQzlCLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLG1CQUEyQyxDQUFDO0lBQ2hELE1BQU0sWUFBWSxHQUE2QixFQUFFLENBQUM7SUFFbEQsSUFBSSxTQUFTLEtBQUssaUNBQXFCLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUNuRCx1Q0FBdUM7UUFDdkMsbUJBQW1CLEdBQUcsSUFBQSw0Q0FBZ0MsRUFDcEQsSUFBSSxtQkFBUyxDQUFDLGFBQWEsQ0FBQyxFQUM1QixJQUFJLG1CQUFTLENBQUMsWUFBWSxDQUFDLEVBQzNCLElBQUksbUJBQVMsQ0FBQyxTQUFTLENBQUMsRUFDeEIsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQyxFQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQ2QsYUFBYSxFQUNiLEVBQUUsRUFDRixpQ0FBcUIsQ0FDdEIsQ0FBQztRQUNGLHdEQUF3RDtRQUN4RCxNQUFNLFdBQVcsR0FBRyxJQUFBLG9DQUFrQixFQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JELElBQUksV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQzlCLHVCQUF1QixDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixtQkFBbUIsR0FBRyxJQUFBLDRDQUFnQyxFQUNwRCxJQUFJLG1CQUFTLENBQUMsYUFBYSxDQUFDLEVBQzVCLElBQUksbUJBQVMsQ0FBQyxZQUFZLENBQUMsRUFDM0IsSUFBSSxtQkFBUyxDQUFDLFNBQVMsQ0FBQyxFQUN4QixJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDLEVBQzFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDZCxhQUFhLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFDRCxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdkMsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxJQUFhO0lBQ3ZDLE1BQU0sRUFDSixNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQzdFLEdBQUcsSUFBSSxDQUFDO0lBQ1QsSUFBQSxnQkFBTSxFQUFDLGNBQWMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0lBQzVELElBQUEsZ0JBQU0sRUFBQyxlQUFlLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUNuRCxJQUFBLGdCQUFNLEVBQUMsWUFBWSxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFDbkQsSUFBQSxnQkFBTSxFQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLElBQUEsZ0JBQU0sRUFBQyxNQUFNLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN2QyxPQUFPO1FBQ0wsSUFBQSxvQ0FBd0IsRUFDdEIsSUFBSSxtQkFBUyxDQUFDLGNBQWMsQ0FBQyxFQUM3QixJQUFJLG1CQUFTLENBQUMsZUFBZSxDQUFDLEVBQzlCLElBQUksbUJBQVMsQ0FBQyxZQUFZLENBQUMsRUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUNkLFNBQVMsRUFDVCxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksbUJBQVMsQ0FBQyxTQUFTLENBQUMsQ0FDL0Q7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyw2QkFBNkIsQ0FBQyxJQUFnQjtJQUNyRCxNQUFNLEVBQ0osTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEdBQzNELEdBQUcsSUFBSSxDQUFDO0lBQ1QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ2pELElBQUEsZ0JBQU0sRUFBQyxZQUFZLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztJQUNuRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDakQsSUFBQSxnQkFBTSxFQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sdUJBQXVCLEdBQUcsdUJBQWEsQ0FBQyxrQkFBa0IsQ0FBQztRQUMvRCxVQUFVLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQztRQUN0QyxXQUFXLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFlBQVksQ0FBQztRQUN4QyxnQkFBZ0IsRUFBRSxJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDO1FBQzVDLFFBQVEsRUFBRSxJQUFJLHNCQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFO0tBQzNDLENBQUMsQ0FBQztJQUNILE9BQU8sdUJBQXVCLENBQUMsWUFBWSxDQUFDO0FBQzlDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsNEJBQTRCLENBQUMsSUFBcUI7SUFDekQsTUFBTSxFQUNKLE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQ3JGLEdBQUcsSUFBSSxDQUFDO0lBQ1QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ2pELElBQUEsZ0JBQU0sRUFBQyxjQUFjLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUN2RCxJQUFBLGdCQUFNLEVBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDdkMsSUFBQSxnQkFBTSxFQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sVUFBVSxHQUFHLElBQUksbUJBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLG1CQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxtQkFBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sRUFBRSxHQUFHLElBQUkscUJBQVcsRUFBRSxDQUFDO0lBRTdCLFFBQVEsV0FBVyxFQUFFLENBQUM7UUFDcEIsS0FBSyxpQ0FBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUEsZ0JBQU0sRUFBQyxXQUFXLEtBQUssU0FBUyxFQUFFLDJCQUEyQixDQUFDLENBQUM7WUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBQSxnREFBc0IsRUFDekM7Z0JBQ0UsZ0JBQWdCLEVBQUUsV0FBVztnQkFDN0IsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ3pCLEVBQ0QsV0FBVyxDQUFDLGFBQWEsRUFDekIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsQ0FDM0MsQ0FBQztZQUNGLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUN4QixNQUFNO1FBQ1IsQ0FBQztRQUVELEtBQUssaUNBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNqQyxNQUFNLGlCQUFpQixHQUFHLHNCQUFZLENBQUMsYUFBYSxDQUFDO2dCQUNuRCxVQUFVO2dCQUNWLFdBQVc7Z0JBQ1gsVUFBVSxFQUFFLElBQUksb0JBQVUsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLEVBQUUsd0JBQXdCO2dCQUNqRixNQUFNLEVBQUUsSUFBSSxnQkFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsK0JBQStCO2dCQUNyRSxRQUFRLEVBQUUsSUFBSSxzQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRTthQUMzQyxDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDMUIsTUFBTTtRQUNSLENBQUM7UUFFRCxLQUFLLGlDQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxpQkFBaUIsR0FBRyxzQkFBWSxDQUFDLGFBQWEsQ0FBQztnQkFDbkQsVUFBVTtnQkFDVixXQUFXO2dCQUNYLFVBQVUsRUFBRSxJQUFJLG9CQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLHdCQUF3QjtnQkFDNUUsTUFBTSxFQUFFLElBQUksZ0JBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLCtCQUErQjtnQkFDckUsUUFBUSxFQUFFLElBQUksc0JBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUU7YUFDM0MsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBRTFCLE1BQU0sZUFBZSxHQUFHLHNCQUFZLENBQUMsUUFBUSxDQUFDO2dCQUM1QyxXQUFXLEVBQUUsSUFBSSxtQkFBUyxDQUFDLGNBQWMsQ0FBQztnQkFDMUMsZ0JBQWdCLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQztnQkFDNUMsVUFBVSxFQUFFLElBQUksbUJBQVMsQ0FBQyxTQUFTLENBQUM7YUFDckMsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN4QixNQUFNO1FBQ1IsQ0FBQztRQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDUixNQUFNLFdBQVcsR0FBVSxXQUFXLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDRCQUE0QixDQUFDLElBQXVCO0lBQzNELE1BQU0sRUFDSixNQUFNLEVBQUUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxHQUN4RyxHQUFHLElBQUksQ0FBQztJQUNULElBQUEsZ0JBQU0sRUFBQyxXQUFXLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztJQUVqRCxRQUFRLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssaUNBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFBLGdCQUFNLEVBQUMsY0FBYyxFQUFFLDhCQUE4QixDQUFDLENBQUM7WUFDdkQsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixFQUFFLGdDQUFnQyxDQUFDLENBQUM7WUFDM0QsSUFBQSxnQkFBTSxFQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3ZDLElBQUEsZ0JBQU0sRUFBQyxXQUFXLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztZQUVqRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztZQUM3QixFQUFFLENBQUMsR0FBRyxDQUNKLEdBQUcsSUFBQSxtREFBeUIsRUFDMUI7Z0JBQ0UsZ0JBQWdCLEVBQUUsSUFBSSxtQkFBUyxDQUFDLGNBQWMsQ0FBQztnQkFDL0MsVUFBVSxFQUFFLElBQUksbUJBQVMsQ0FBQyxXQUFXLENBQUM7Z0JBQ3RDLHVCQUF1QixFQUFFLElBQUksbUJBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDeEQsZ0JBQWdCLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDN0QsaUJBQWlCLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQztnQkFDdEUsVUFBVSxFQUFFLE1BQU07YUFDbkIsRUFDRCxXQUFXLENBQUMsYUFBYSxDQUMxQixDQUNGLENBQUM7WUFDRixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDekIsQ0FBQztRQUVELEtBQUssaUNBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxFQUFFLDBCQUEwQixDQUFDLENBQUM7WUFFL0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7WUFDN0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxtQkFBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkUsTUFBTSxtQkFBbUIsR0FBRyx1QkFBYSxDQUFDLFFBQVEsQ0FBQztnQkFDakQsVUFBVSxFQUFFLElBQUksbUJBQVMsQ0FBQyxXQUFXLENBQUM7Z0JBQ3RDLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixRQUFRLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2FBQzdDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUM1QixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDekIsQ0FBQztRQUVELEtBQUssaUNBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMvQixJQUFBLGdCQUFNLEVBQUMsY0FBYyxFQUFFLDhCQUE4QixDQUFDLENBQUM7WUFFdkQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3ZELE1BQU0sRUFBRSxHQUFHLElBQUkscUJBQVcsRUFBRSxDQUFDO2dCQUM3QixNQUFNLGdCQUFnQixHQUFHLElBQUksbUJBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBRXJFLE1BQU0sZUFBZSxHQUFHLHVCQUFhLENBQUMsUUFBUSxDQUFDO29CQUM3QyxhQUFhLEVBQUUsZ0JBQWdCO29CQUMvQixLQUFLLEVBQUUsc0JBQVksQ0FBQyxLQUFLO2lCQUMxQixDQUFDLENBQUM7Z0JBQ0gsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFeEIsTUFBTSxhQUFhLEdBQUcsdUJBQWEsQ0FBQyxNQUFNLENBQUM7b0JBQ3pDLGFBQWEsRUFBRSxnQkFBZ0I7b0JBQy9CLFNBQVMsRUFBRSxzQkFBWSxDQUFDLFNBQVM7aUJBQ2xDLENBQUMsQ0FBQztnQkFDSCxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUV0QixNQUFNLFVBQVUsR0FBRyxzQkFBWSxDQUFDLEtBQUssQ0FDbkM7b0JBQ0UsV0FBVyxFQUFFLElBQUksbUJBQVMsQ0FBQyxjQUFjLENBQUM7b0JBQzFDLGdCQUFnQixFQUFFLElBQUksbUJBQVMsQ0FBQyxXQUFXLENBQUM7b0JBQzVDLGdCQUFnQixFQUFFLGdCQUFnQjtvQkFDbEMsUUFBUSxFQUFFLElBQUksc0JBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRTtpQkFDdkQsRUFDRCxDQUFDLENBQ0YsQ0FBQztnQkFDRixFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFbkMsTUFBTSxpQkFBaUIsR0FBRyxzQkFBWSxDQUFDLFVBQVUsQ0FBQztvQkFDaEQsV0FBVyxFQUFFLGdCQUFnQjtvQkFDN0IsZ0JBQWdCLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQztpQkFDN0MsQ0FBQyxDQUFDO2dCQUNILEVBQUUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFFMUIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3pCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLGlCQUFpQixHQUFHLHNCQUFZLENBQUMsVUFBVSxDQUFDO29CQUNoRCxXQUFXLEVBQUUsSUFBSSxtQkFBUyxDQUFDLGNBQWMsQ0FBQztvQkFDMUMsZ0JBQWdCLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQztpQkFDN0MsQ0FBQyxDQUFDO2dCQUVILE9BQU8saUJBQWlCLENBQUMsWUFBWSxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNSLE1BQU0sV0FBVyxHQUFVLFdBQVcsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxJQUFxQjtJQUN2RCxNQUFNLEVBQ0osTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsR0FDaEQsR0FBRyxJQUFJLENBQUM7SUFDVCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDakQsSUFBQSxnQkFBTSxFQUFDLGNBQWMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3ZELElBQUEsZ0JBQU0sRUFBQyxNQUFNLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUV2QyxNQUFNLGVBQWUsR0FBRyxzQkFBWSxDQUFDLFFBQVEsQ0FBQztRQUM1QyxXQUFXLEVBQUUsSUFBSSxtQkFBUyxDQUFDLGNBQWMsQ0FBQztRQUMxQyxnQkFBZ0IsRUFBRSxJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDO1FBQzVDLFFBQVEsRUFBRSxJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3BDLFFBQVEsRUFBRSxJQUFJLHNCQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFO0tBQzNDLENBQUMsQ0FBQztJQUVILE9BQU8sZUFBZSxDQUFDLFlBQVksQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG9CQUFvQixDQUFDLElBQWE7SUFDekMsTUFBTSxFQUNKLE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FDM0UsR0FBRyxJQUFJLENBQUM7SUFDVCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDakQsSUFBQSxnQkFBTSxFQUFDLFVBQVUsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQy9DLElBQUEsZ0JBQU0sRUFBQyxZQUFZLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztJQUNuRCxJQUFBLGdCQUFNLEVBQUMsWUFBWSxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFFbkQsSUFBSSxpQ0FBeUQsQ0FBQztJQUM5RCxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssaUNBQXFCLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUNoRSxpQ0FBaUMsR0FBRyxJQUFBLG1EQUF1QyxFQUN6RSxJQUFJLG1CQUFTLENBQUMsWUFBWSxDQUFDLEVBQzNCLElBQUksbUJBQVMsQ0FBQyxVQUFVLENBQUMsRUFDekIsSUFBSSxtQkFBUyxDQUFDLFlBQVksQ0FBQyxFQUMzQixJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDLEVBQzFCLGlDQUFxQixDQUN0QixDQUFDO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFDTixpQ0FBaUMsR0FBRyxJQUFBLG1EQUF1QyxFQUN6RSxJQUFJLG1CQUFTLENBQUMsWUFBWSxDQUFDLEVBQzNCLElBQUksbUJBQVMsQ0FBQyxVQUFVLENBQUMsRUFDekIsSUFBSSxtQkFBUyxDQUFDLFlBQVksQ0FBQyxFQUMzQixJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDLENBQzNCLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxJQUFjO0lBQ3pDLE1BQU0sRUFDSixNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsR0FDakUsR0FBRyxJQUFJLENBQUM7SUFDVCxJQUFBLGdCQUFNLEVBQUMsY0FBYyxFQUFFLDhCQUE4QixDQUFDLENBQUM7SUFDdkQsSUFBQSxnQkFBTSxFQUFDLGtCQUFrQixFQUFFLGtDQUFrQyxDQUFDLENBQUM7SUFDL0QsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixFQUFFLGdDQUFnQyxDQUFDLENBQUM7SUFFM0QsTUFBTSxzQ0FBc0MsR0FBRyxJQUFBLHlDQUE2QixFQUMxRSxJQUFJLG1CQUFTLENBQUMsY0FBYyxDQUFDLEVBQzdCLElBQUksbUJBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUNqQyxJQUFJLG1CQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FDaEMsQ0FBQztJQUNGLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsMkJBQTJCLENBQUMsSUFBc0I7SUFDekQsTUFBTSxFQUNKLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxHQUN6RixHQUFHLElBQUksQ0FBQztJQUNULElBQUEsZ0JBQU0sRUFBQyxjQUFjLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUN2RCxJQUFBLGdCQUFNLEVBQUMsbUJBQW1CLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztJQUNqRSxJQUFBLGdCQUFNLEVBQUMsbUJBQW1CLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztJQUNqRSxJQUFBLGdCQUFNLEVBQUMsa0JBQWtCLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztJQUUvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztJQUU3QixNQUFNLGdCQUFnQixHQUFHLHNCQUFZLENBQUMsU0FBUyxDQUFDO1FBQzlDLFdBQVcsRUFBRSxJQUFJLG1CQUFTLENBQUMsY0FBYyxDQUFDO1FBQzFDLGdCQUFnQixFQUFFLElBQUksbUJBQVMsQ0FBQyxtQkFBbUIsQ0FBQztRQUNwRCxtQkFBbUIsRUFBRSxJQUFJLG1CQUFTLENBQUMsbUJBQW1CLENBQUM7UUFDdkQsc0JBQXNCLEVBQUUsa0NBQXdCLENBQUMsTUFBTTtLQUN4RCxDQUFDLENBQUM7SUFFSCxNQUFNLGlCQUFpQixHQUFHLHNCQUFZLENBQUMsU0FBUyxDQUFDO1FBQy9DLFdBQVcsRUFBRSxJQUFJLG1CQUFTLENBQUMsY0FBYyxDQUFDO1FBQzFDLGdCQUFnQixFQUFFLElBQUksbUJBQVMsQ0FBQyxtQkFBbUIsQ0FBQztRQUNwRCxtQkFBbUIsRUFBRSxJQUFJLG1CQUFTLENBQUMsbUJBQW1CLENBQUM7UUFDdkQsc0JBQXNCLEVBQUUsa0NBQXdCLENBQUMsVUFBVTtRQUMzRCxlQUFlLEVBQUUsSUFBSSxtQkFBUyxDQUFDLGtCQUFrQixDQUFDO0tBQ25ELENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6QixFQUFFLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFMUIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsMEJBQTBCLENBQUMsSUFBcUI7SUFDdkQsTUFBTSxFQUNKLE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLEdBQ25ELEdBQUcsSUFBSSxDQUFDO0lBQ1QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ2pELElBQUEsZ0JBQU0sRUFBQyxjQUFjLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUN2RCxJQUFBLGdCQUFNLEVBQUMsU0FBUyxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7SUFDN0IsTUFBTSxlQUFlLEdBQUcsc0JBQVksQ0FBQyxRQUFRLENBQUM7UUFDNUMsV0FBVyxFQUFFLElBQUksbUJBQVMsQ0FBQyxjQUFjLENBQUM7UUFDMUMsZ0JBQWdCLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQztRQUM1QyxVQUFVLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFNBQVMsQ0FBQztLQUNyQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXhCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLElBQVk7SUFDckMsTUFBTSxFQUNKLE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQ2pGLEdBQUcsSUFBSSxDQUFDO0lBQ1QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ2pELElBQUEsZ0JBQU0sRUFBQyxrQkFBa0IsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO0lBQy9ELElBQUEsZ0JBQU0sRUFBQyxnQkFBZ0IsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQzNELElBQUEsZ0JBQU0sRUFBQyxNQUFNLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUV2QyxNQUFNLElBQUksR0FBRyxJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxtQkFBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxtQkFBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFbEQsSUFBSSxXQUFtQyxDQUFDO0lBQ3hDLElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxpQ0FBcUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBQ2hFLFdBQVcsR0FBRyxJQUFBLG1DQUF1QixFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsaUNBQXFCLENBQUMsQ0FBQztJQUNqSCxDQUFDO1NBQU0sQ0FBQztRQUNOLFdBQVcsR0FBRyxJQUFBLG1DQUF1QixFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxlQUFlLENBQUMsSUFBVTtJQUNqQyxNQUFNLEVBQ0osTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQzdFLEdBQUcsSUFBSSxDQUFDO0lBQ1QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ2pELElBQUEsZ0JBQU0sRUFBQyxjQUFjLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUN2RCxJQUFBLGdCQUFNLEVBQUMsZ0JBQWdCLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztJQUMzRCxJQUFBLGdCQUFNLEVBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFFdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVsRCxJQUFJLFNBQWlDLENBQUM7SUFDdEMsSUFBSSxTQUFTLElBQUksU0FBUyxLQUFLLGlDQUFxQixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDaEUsU0FBUyxHQUFHLElBQUEsaUNBQXFCLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxpQ0FBcUIsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7U0FBTSxDQUFDO1FBQ04sU0FBUyxHQUFHLElBQUEsaUNBQXFCLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxJQUF1QjtJQUNoRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBeUIsQ0FBQztJQUM3QyxJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ3BFLElBQUEsZ0JBQU0sRUFBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLCtDQUErQyxDQUFDLENBQUM7SUFDbkcsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLG9DQUFvQyxDQUFDLENBQUM7SUFFeEUsZ0NBQWdDO0lBQ2hDLElBQUksVUFBa0IsQ0FBQztJQUV2QixJQUFJLElBQUEscUJBQWEsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMvQixVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7U0FBTSxJQUFJLElBQUEsa0JBQVUsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7U0FBTSxDQUFDO1FBQ04sb0JBQW9CO1FBQ3BCLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxNQUFNLG9CQUFvQixHQUFHLElBQUksZ0NBQXNCLENBQUM7UUFDdEQsU0FBUyxFQUFFLElBQUksbUJBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM5QixNQUFNLEVBQUUsSUFBSSxtQkFBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDakMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1lBQ3RCLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLEVBQUUsVUFBVTtLQUNqQixDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxJQUFtQixFQUFFLElBQWlCO0lBQy9ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVFLElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixRQUFRLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM3RCxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6RCxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUFDLFlBQWdDO0lBQ3ZFLE1BQU0sS0FBSyxHQUFrQixFQUFFLENBQUM7SUFDaEMsSUFBSSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDM0MsS0FBSyxNQUFNLElBQUksSUFBSSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUNULE1BQU0sRUFBRSxJQUFJLG1CQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDbEMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7YUFDNUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUFDLFdBQW1DLEVBQUUsWUFBZ0M7SUFDcEcsTUFBTSxVQUFVLEdBQUcsK0JBQStCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakUsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM5QixpQkFBaUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBTb2xDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5zdHJ1Y3Rpb24sXG4gIGNyZWF0ZUNsb3NlQWNjb3VudEluc3RydWN0aW9uLFxuICBjcmVhdGVNaW50VG9JbnN0cnVjdGlvbixcbiAgY3JlYXRlQnVybkluc3RydWN0aW9uLFxuICBjcmVhdGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbixcbiAgVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICBjcmVhdGVBcHByb3ZlSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvc3BsLXRva2VuJztcbmltcG9ydCB7XG4gIEFjY291bnRNZXRhLFxuICBBdXRob3JpemVkLFxuICBMb2NrdXAsXG4gIFB1YmxpY0tleSxcbiAgU3Rha2VBdXRob3JpemF0aW9uTGF5b3V0LFxuICBTdGFrZVByb2dyYW0sXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLCBNRU1PX1BST0dSQU1fUEsgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFDbG9zZSxcbiAgQXRhSW5pdCxcbiAgSW5zdHJ1Y3Rpb25QYXJhbXMsXG4gIE1lbW8sXG4gIE1pbnRUbyxcbiAgQnVybixcbiAgTm9uY2UsXG4gIFN0YWtpbmdBY3RpdmF0ZSxcbiAgU3Rha2luZ0F1dGhvcml6ZSxcbiAgU3Rha2luZ0RlYWN0aXZhdGUsXG4gIFN0YWtpbmdEZWxlZ2F0ZSxcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICBUb2tlblRyYW5zZmVyLFxuICBUcmFuc2ZlcixcbiAgV2FsbGV0SW5pdCxcbiAgU2V0Q29tcHV0ZVVuaXRMaW1pdCxcbiAgU2V0UHJpb3JpdHlGZWUsXG4gIEN1c3RvbUluc3RydWN0aW9uLFxuICBBcHByb3ZlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSwgaXNWYWxpZEJhc2U2NCwgaXNWYWxpZEhleCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZGVwb3NpdFNvbEluc3RydWN0aW9ucywgd2l0aGRyYXdTdGFrZUluc3RydWN0aW9ucyB9IGZyb20gJy4vaml0b1N0YWtlUG9vbE9wZXJhdGlvbnMnO1xuaW1wb3J0IHsgZ2V0VG9rZW4yMDIyQ29uZmlnLCBUcmFuc2Zlckhvb2tDb25maWcgfSBmcm9tICcuL3Rva2VuMjAyMkNvbmZpZyc7XG5cbi8qKlxuICogQ29uc3RydWN0IFNvbGFuYSBpbnN0cnVjdGlvbnMgZnJvbSBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtJbnN0cnVjdGlvblBhcmFtc30gaW5zdHJ1Y3Rpb25Ub0J1aWxkIC0gdGhlIGRhdGEgY29udGFpbmluZyB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBBbiBhcnJheSBjb250YWluaW5nIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2xJbnN0cnVjdGlvbkZhY3RvcnkoaW5zdHJ1Y3Rpb25Ub0J1aWxkOiBJbnN0cnVjdGlvblBhcmFtcyk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIHN3aXRjaCAoaW5zdHJ1Y3Rpb25Ub0J1aWxkLnR5cGUpIHtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZTpcbiAgICAgIHJldHVybiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbzpcbiAgICAgIHJldHVybiBtZW1vSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyOlxuICAgICAgcmV0dXJuIHRyYW5zZmVySW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXI6XG4gICAgICByZXR1cm4gdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uKGluc3RydWN0aW9uVG9CdWlsZCk7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5BcHByb3ZlOlxuICAgICAgcmV0dXJuIGFwcHJvdmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50OlxuICAgICAgcmV0dXJuIGNyZWF0ZU5vbmNlQWNjb3VudEluc3RydWN0aW9uKGluc3RydWN0aW9uVG9CdWlsZCk7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGU6XG4gICAgICByZXR1cm4gc3Rha2luZ0luaXRpYWxpemVJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICByZXR1cm4gc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgcmV0dXJuIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uKGluc3RydWN0aW9uVG9CdWlsZCk7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgcmV0dXJuIGNyZWF0ZUFUQUluc3RydWN0aW9uKGluc3RydWN0aW9uVG9CdWlsZCk7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICByZXR1cm4gY2xvc2VBVEFJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZTpcbiAgICAgIHJldHVybiBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgIHJldHVybiBzdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0Q29tcHV0ZVVuaXRMaW1pdDpcbiAgICAgIHJldHVybiBzZXRDb21wdXRlVW5pdExpbWl0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldFByaW9yaXR5RmVlOlxuICAgICAgcmV0dXJuIGZldGNoUHJpb3JpdHlGZWVJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWludFRvOlxuICAgICAgcmV0dXJuIG1pbnRUb0luc3RydWN0aW9uKGluc3RydWN0aW9uVG9CdWlsZCk7XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5CdXJuOlxuICAgICAgcmV0dXJuIGJ1cm5JbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQpO1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb246XG4gICAgICByZXR1cm4gY3VzdG9tSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25Ub0J1aWxkKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluc3RydWN0aW9uIHR5cGUgb3Igbm90IHN1cHBvcnRlZGApO1xuICB9XG59XG5cbi8qKlxuICogQ29uc3RydWN0IEFkdmFuY2UgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7Tm9uY2V9IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgQWR2YW5jZSBOb25jZSBTb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24oZGF0YTogTm9uY2UpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IGF1dGhXYWxsZXRBZGRyZXNzLCB3YWxsZXROb25jZUFkZHJlc3MgfSxcbiAgfSA9IGRhdGE7XG4gIGFzc2VydChhdXRoV2FsbGV0QWRkcmVzcywgJ01pc3NpbmcgYXV0aFdhbGxldEFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KHdhbGxldE5vbmNlQWRkcmVzcywgJ01pc3Npbmcgd2FsbGV0Tm9uY2VBZGRyZXNzIHBhcmFtJyk7XG4gIGNvbnN0IG5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLm5vbmNlQWR2YW5jZSh7XG4gICAgbm9uY2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkod2FsbGV0Tm9uY2VBZGRyZXNzKSxcbiAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhXYWxsZXRBZGRyZXNzKSxcbiAgfSk7XG4gIHJldHVybiBbbm9uY2VJbnN0cnVjdGlvbl07XG59XG5cbmZ1bmN0aW9uIHNldENvbXB1dGVVbml0TGltaXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQ6IFNldENvbXB1dGVVbml0TGltaXQpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCBzZXRDb21wdXRlVW5pdExpbWl0ID0gQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7XG4gICAgdW5pdHM6IGluc3RydWN0aW9uVG9CdWlsZC5wYXJhbXMudW5pdHMsXG4gIH0pO1xuXG4gIHJldHVybiBbc2V0Q29tcHV0ZVVuaXRMaW1pdF07XG59XG5cbmZ1bmN0aW9uIGZldGNoUHJpb3JpdHlGZWVJbnN0cnVjdGlvbihpbnN0cnVjdGlvblRvQnVpbGQ6IFNldFByaW9yaXR5RmVlKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3QgYWRkUHJpb3JpdHlGZWUgPSBDb21wdXRlQnVkZ2V0UHJvZ3JhbS5zZXRDb21wdXRlVW5pdFByaWNlKHtcbiAgICBtaWNyb0xhbXBvcnRzOiBpbnN0cnVjdGlvblRvQnVpbGQucGFyYW1zLmZlZSxcbiAgfSk7XG5cbiAgcmV0dXJuIFthZGRQcmlvcml0eUZlZV07XG59XG5cbi8qKlxuICogQ29uc3RydWN0IE1lbW8gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7TWVtb30gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvblxuICovXG5mdW5jdGlvbiBtZW1vSW5zdHJ1Y3Rpb24oZGF0YTogTWVtbyk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgbWVtbyB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KG1lbW8sICdNaXNzaW5nIG1lbW8gcGFyYW0nKTtcbiAgY29uc3QgbWVtb0luc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIGtleXM6IFtdLFxuICAgIHByb2dyYW1JZDogbmV3IFB1YmxpY0tleShNRU1PX1BST0dSQU1fUEspLFxuICAgIGRhdGE6IEJ1ZmZlci5mcm9tKG1lbW8pLFxuICB9KTtcbiAgcmV0dXJuIFttZW1vSW5zdHJ1Y3Rpb25dO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBUcmFuc2ZlciBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2Zlcn0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBUcmFuc2ZlciBTb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gdHJhbnNmZXJJbnN0cnVjdGlvbihkYXRhOiBUcmFuc2Zlcik6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgZnJvbUFkZHJlc3MsIHRvQWRkcmVzcywgYW1vdW50IH0sXG4gIH0gPSBkYXRhO1xuICBhc3NlcnQoZnJvbUFkZHJlc3MsICdNaXNzaW5nIGZyb21BZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydCh0b0FkZHJlc3MsICdNaXNzaW5nIHRvQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYW1vdW50LCAnTWlzc2luZyB0b0FkZHJlc3MgcGFyYW0nKTtcbiAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoZnJvbUFkZHJlc3MpLFxuICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KHRvQWRkcmVzcyksXG4gICAgbGFtcG9ydHM6IHBhcnNlSW50KGFtb3VudCwgMTApLFxuICB9KTtcbiAgcmV0dXJuIFt0cmFuc2Zlckluc3RydWN0aW9uXTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgVHJhbnNmZXIgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNmZXJ9IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgVHJhbnNmZXIgU29sYW5hIGluc3RydWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbihkYXRhOiBUb2tlblRyYW5zZmVyKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3Qge1xuICAgIHBhcmFtczogeyBmcm9tQWRkcmVzcywgdG9BZGRyZXNzLCBhbW91bnQsIHRva2VuTmFtZSwgc291cmNlQWRkcmVzcyB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KGZyb21BZGRyZXNzLCAnTWlzc2luZyBmcm9tQWRkcmVzcyAob3duZXIpIHBhcmFtJyk7XG4gIGFzc2VydCh0b0FkZHJlc3MsICdNaXNzaW5nIHRvQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYW1vdW50LCAnTWlzc2luZyBhbW91bnQgcGFyYW0nKTtcbiAgYXNzZXJ0KHRva2VuTmFtZSwgJ01pc3NpbmcgdG9rZW4gbmFtZScpO1xuICBhc3NlcnQoc291cmNlQWRkcmVzcywgJ01pc3NpbmcgYXRhIGFkZHJlc3MnKTtcbiAgY29uc3QgdG9rZW4gPSBnZXRTb2xUb2tlbkZyb21Ub2tlbk5hbWUoZGF0YS5wYXJhbXMudG9rZW5OYW1lKTtcbiAgbGV0IHRva2VuQWRkcmVzczogc3RyaW5nO1xuICBsZXQgcHJvZ3JhbUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBkZWNpbWFsUGxhY2VzOiBudW1iZXI7XG4gIGlmIChkYXRhLnBhcmFtcy50b2tlbkFkZHJlc3MgJiYgZGF0YS5wYXJhbXMuZGVjaW1hbFBsYWNlcykge1xuICAgIHRva2VuQWRkcmVzcyA9IGRhdGEucGFyYW1zLnRva2VuQWRkcmVzcztcbiAgICBkZWNpbWFsUGxhY2VzID0gZGF0YS5wYXJhbXMuZGVjaW1hbFBsYWNlcztcbiAgICBwcm9ncmFtSWQgPSBkYXRhLnBhcmFtcy5wcm9ncmFtSWQ7XG4gIH0gZWxzZSBpZiAodG9rZW4pIHtcbiAgICBhc3NlcnQodG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKTtcbiAgICB0b2tlbkFkZHJlc3MgPSB0b2tlbi50b2tlbkFkZHJlc3M7XG4gICAgZGVjaW1hbFBsYWNlcyA9IHRva2VuLmRlY2ltYWxQbGFjZXM7XG4gICAgcHJvZ3JhbUlkID0gdG9rZW4ucHJvZ3JhbUlkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBuYW1lLCBnb3Q6JyArIGRhdGEucGFyYW1zLnRva2VuTmFtZSk7XG4gIH1cblxuICBsZXQgdHJhbnNmZXJJbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbjtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10gPSBbXTtcblxuICBpZiAocHJvZ3JhbUlkID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgIC8vIENyZWF0ZSB0aGUgYmFzZSB0cmFuc2ZlciBpbnN0cnVjdGlvblxuICAgIHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBjcmVhdGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbihcbiAgICAgIG5ldyBQdWJsaWNLZXkoc291cmNlQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KHRva2VuQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KHRvQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKSxcbiAgICAgIEJpZ0ludChhbW91bnQpLFxuICAgICAgZGVjaW1hbFBsYWNlcyxcbiAgICAgIFtdLFxuICAgICAgVE9LRU5fMjAyMl9QUk9HUkFNX0lEXG4gICAgKTtcbiAgICAvLyBDaGVjayBpZiB0aGlzIHRva2VuIGhhcyBhIHRyYW5zZmVyIGhvb2sgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHRva2VuQ29uZmlnID0gZ2V0VG9rZW4yMDIyQ29uZmlnKHRva2VuQWRkcmVzcyk7XG4gICAgaWYgKHRva2VuQ29uZmlnPy50cmFuc2Zlckhvb2spIHtcbiAgICAgIGFkZFRyYW5zZmVySG9va0FjY291bnRzKHRyYW5zZmVySW5zdHJ1Y3Rpb24sIHRva2VuQ29uZmlnLnRyYW5zZmVySG9vayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBjcmVhdGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbihcbiAgICAgIG5ldyBQdWJsaWNLZXkoc291cmNlQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KHRva2VuQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KHRvQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKSxcbiAgICAgIEJpZ0ludChhbW91bnQpLFxuICAgICAgZGVjaW1hbFBsYWNlc1xuICAgICk7XG4gIH1cbiAgaW5zdHJ1Y3Rpb25zLnB1c2godHJhbnNmZXJJbnN0cnVjdGlvbik7XG4gIHJldHVybiBpbnN0cnVjdGlvbnM7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IFRyYW5zZmVyIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zZmVyfSBkYXRhIC0gdGhlIGRhdGEgdG8gYnVpbGQgdGhlIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBBbiBhcnJheSBjb250YWluaW5nIFRyYW5zZmVyIFNvbGFuYSBpbnN0cnVjdGlvblxuICovXG5mdW5jdGlvbiBhcHByb3ZlSW5zdHJ1Y3Rpb24oZGF0YTogQXBwcm92ZSk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgYWNjb3VudEFkZHJlc3MsIGRlbGVnYXRlQWRkcmVzcywgb3duZXJBZGRyZXNzLCBhbW91bnQsIHByb2dyYW1JZCB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KGFjY291bnRBZGRyZXNzLCAnTWlzc2luZyBmcm9tQWRkcmVzcyAob3duZXIpIHBhcmFtJyk7XG4gIGFzc2VydChkZWxlZ2F0ZUFkZHJlc3MsICdNaXNzaW5nIHRvQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQob3duZXJBZGRyZXNzLCAnTWlzc2luZyBvd25lckFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KHByb2dyYW1JZCwgJ01pc3NpbmcgcHJvZ3JhbUlkIHBhcmFtJyk7XG4gIGFzc2VydChhbW91bnQsICdNaXNzaW5nIGFtb3VudCBwYXJhbScpO1xuICByZXR1cm4gW1xuICAgIGNyZWF0ZUFwcHJvdmVJbnN0cnVjdGlvbihcbiAgICAgIG5ldyBQdWJsaWNLZXkoYWNjb3VudEFkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleShkZWxlZ2F0ZUFkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleShvd25lckFkZHJlc3MpLFxuICAgICAgQmlnSW50KGFtb3VudCksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBwcm9ncmFtSWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG5ldyBQdWJsaWNLZXkocHJvZ3JhbUlkKVxuICAgICksXG4gIF07XG59XG5cbi8qKlxuICogQ29uc3RydWN0IENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBOb25jZSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtXYWxsZXRJbml0fSBkYXRhIC0gdGhlIGRhdGEgdG8gYnVpbGQgdGhlIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBBbiBhcnJheSBjb250YWluaW5nIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBOb25jZSBTb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24oZGF0YTogV2FsbGV0SW5pdCk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgZnJvbUFkZHJlc3MsIG5vbmNlQWRkcmVzcywgYXV0aEFkZHJlc3MsIGFtb3VudCB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KGZyb21BZGRyZXNzLCAnTWlzc2luZyBmcm9tQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQobm9uY2VBZGRyZXNzLCAnTWlzc2luZyBub25jZUFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KGF1dGhBZGRyZXNzLCAnTWlzc2luZyBhdXRoQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYW1vdW50LCAnTWlzc2luZyBhbW91bnQgcGFyYW0nKTtcbiAgY29uc3Qgbm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLmNyZWF0ZU5vbmNlQWNjb3VudCh7XG4gICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgbm9uY2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkobm9uY2VBZGRyZXNzKSxcbiAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBZGRyZXNzKSxcbiAgICBsYW1wb3J0czogbmV3IEJpZ051bWJlcihhbW91bnQpLnRvTnVtYmVyKCksXG4gIH0pO1xuICByZXR1cm4gbm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25zO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBDcmVhdGUgU3Rha2luZyBBY2NvdW50IGFuZCBEZWxlZ2F0ZSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtTdGFraW5nQWN0aXZhdGV9IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgQ3JlYXRlIFN0YWtpbmcgQWNjb3VudCBhbmQgRGVsZWdhdGUgU29sYW5hIGluc3RydWN0aW9uc1xuICovXG5mdW5jdGlvbiBzdGFraW5nSW5pdGlhbGl6ZUluc3RydWN0aW9uKGRhdGE6IFN0YWtpbmdBY3RpdmF0ZSk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgZnJvbUFkZHJlc3MsIHN0YWtpbmdBZGRyZXNzLCBhbW91bnQsIHZhbGlkYXRvciwgc3Rha2luZ1R5cGUsIGV4dHJhUGFyYW1zIH0sXG4gIH0gPSBkYXRhO1xuICBhc3NlcnQoZnJvbUFkZHJlc3MsICdNaXNzaW5nIGZyb21BZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChzdGFraW5nQWRkcmVzcywgJ01pc3Npbmcgc3Rha2luZ0FkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KGFtb3VudCwgJ01pc3NpbmcgYW1vdW50IHBhcmFtJyk7XG4gIGFzc2VydCh2YWxpZGF0b3IsICdNaXNzaW5nIHZhbGlkYXRvciBwYXJhbScpO1xuXG4gIGNvbnN0IGZyb21QdWJrZXkgPSBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKTtcbiAgY29uc3Qgc3Rha2VQdWJrZXkgPSBuZXcgUHVibGljS2V5KHN0YWtpbmdBZGRyZXNzKTtcbiAgY29uc3QgdmFsaWRhdG9yUHVia2V5ID0gbmV3IFB1YmxpY0tleSh2YWxpZGF0b3IpO1xuICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuXG4gIHN3aXRjaCAoc3Rha2luZ1R5cGUpIHtcbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPOiB7XG4gICAgICBhc3NlcnQoZXh0cmFQYXJhbXMgIT09IHVuZGVmaW5lZCwgJ01pc3NpbmcgZXh0cmFQYXJhbXMgcGFyYW0nKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGRlcG9zaXRTb2xJbnN0cnVjdGlvbnMoXG4gICAgICAgIHtcbiAgICAgICAgICBzdGFrZVBvb2xBZGRyZXNzOiBzdGFrZVB1YmtleSxcbiAgICAgICAgICBmcm9tOiBmcm9tUHVia2V5LFxuICAgICAgICAgIGxhbXBvcnRzOiBCaWdJbnQoYW1vdW50KSxcbiAgICAgICAgfSxcbiAgICAgICAgZXh0cmFQYXJhbXMuc3Rha2VQb29sRGF0YSxcbiAgICAgICAgISFleHRyYVBhcmFtcy5jcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50XG4gICAgICApO1xuICAgICAgdHguYWRkKC4uLmluc3RydWN0aW9ucyk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERToge1xuICAgICAgY29uc3Qgd2FsbGV0SW5pdFN0YWtpbmcgPSBTdGFrZVByb2dyYW0uY3JlYXRlQWNjb3VudCh7XG4gICAgICAgIGZyb21QdWJrZXksXG4gICAgICAgIHN0YWtlUHVia2V5LFxuICAgICAgICBhdXRob3JpemVkOiBuZXcgQXV0aG9yaXplZCh2YWxpZGF0b3JQdWJrZXksIGZyb21QdWJrZXkpLCAvLyBzdGFrZXIgYW5kIHdpdGhkcmF3ZXJcbiAgICAgICAgbG9ja3VwOiBuZXcgTG9ja3VwKDAsIDAsIGZyb21QdWJrZXkpLCAvLyBObyBtaW5pbXVtIGVwb2NoIHRvIHdpdGhkcmF3XG4gICAgICAgIGxhbXBvcnRzOiBuZXcgQmlnTnVtYmVyKGFtb3VudCkudG9OdW1iZXIoKSxcbiAgICAgIH0pO1xuICAgICAgdHguYWRkKHdhbGxldEluaXRTdGFraW5nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRToge1xuICAgICAgY29uc3Qgd2FsbGV0SW5pdFN0YWtpbmcgPSBTdGFrZVByb2dyYW0uY3JlYXRlQWNjb3VudCh7XG4gICAgICAgIGZyb21QdWJrZXksXG4gICAgICAgIHN0YWtlUHVia2V5LFxuICAgICAgICBhdXRob3JpemVkOiBuZXcgQXV0aG9yaXplZChmcm9tUHVia2V5LCBmcm9tUHVia2V5KSwgLy8gc3Rha2VyIGFuZCB3aXRoZHJhd2VyXG4gICAgICAgIGxvY2t1cDogbmV3IExvY2t1cCgwLCAwLCBmcm9tUHVia2V5KSwgLy8gTm8gbWluaW11bSBlcG9jaCB0byB3aXRoZHJhd1xuICAgICAgICBsYW1wb3J0czogbmV3IEJpZ051bWJlcihhbW91bnQpLnRvTnVtYmVyKCksXG4gICAgICB9KTtcbiAgICAgIHR4LmFkZCh3YWxsZXRJbml0U3Rha2luZyk7XG5cbiAgICAgIGNvbnN0IGRlbGVnYXRlU3Rha2luZyA9IFN0YWtlUHJvZ3JhbS5kZWxlZ2F0ZSh7XG4gICAgICAgIHN0YWtlUHVia2V5OiBuZXcgUHVibGljS2V5KHN0YWtpbmdBZGRyZXNzKSxcbiAgICAgICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICAgIHZvdGVQdWJrZXk6IG5ldyBQdWJsaWNLZXkodmFsaWRhdG9yKSxcbiAgICAgIH0pO1xuICAgICAgdHguYWRkKGRlbGVnYXRlU3Rha2luZyk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCB1bnJlYWNoYWJsZTogbmV2ZXIgPSBzdGFraW5nVHlwZTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFraW5nIHR5cGUgJHt1bnJlYWNoYWJsZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHguaW5zdHJ1Y3Rpb25zO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBzdGFraW5nIGRlYWN0aXZhdGUgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7U3Rha2luZ0RlYWN0aXZhdGV9IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgc3Rha2luZyBkZWFjdGl2YXRlIGluc3RydWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb24oZGF0YTogU3Rha2luZ0RlYWN0aXZhdGUpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IGZyb21BZGRyZXNzLCBzdGFraW5nQWRkcmVzcywgYW1vdW50LCB1bnN0YWtpbmdBZGRyZXNzLCByZWNpcGllbnRzLCBzdGFraW5nVHlwZSwgZXh0cmFQYXJhbXMgfSxcbiAgfSA9IGRhdGE7XG4gIGFzc2VydChmcm9tQWRkcmVzcywgJ01pc3NpbmcgZnJvbUFkZHJlc3MgcGFyYW0nKTtcblxuICBzd2l0Y2ggKHN0YWtpbmdUeXBlKSB7XG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uSklUTzoge1xuICAgICAgYXNzZXJ0KHN0YWtpbmdBZGRyZXNzLCAnTWlzc2luZyBzdGFraW5nQWRkcmVzcyBwYXJhbScpO1xuICAgICAgYXNzZXJ0KHVuc3Rha2luZ0FkZHJlc3MsICdNaXNzaW5nIHVuc3Rha2luZ0FkZHJlc3MgcGFyYW0nKTtcbiAgICAgIGFzc2VydChhbW91bnQsICdNaXNzaW5nIGFtb3VudCBwYXJhbScpO1xuICAgICAgYXNzZXJ0KGV4dHJhUGFyYW1zLCAnTWlzc2luZyBleHRyYVBhcmFtcyBwYXJhbScpO1xuXG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgICAgdHguYWRkKFxuICAgICAgICAuLi53aXRoZHJhd1N0YWtlSW5zdHJ1Y3Rpb25zKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YWtlUG9vbEFkZHJlc3M6IG5ldyBQdWJsaWNLZXkoc3Rha2luZ0FkZHJlc3MpLFxuICAgICAgICAgICAgdG9rZW5Pd25lcjogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICAgICAgICBkZXN0aW5hdGlvblN0YWtlQWNjb3VudDogbmV3IFB1YmxpY0tleSh1bnN0YWtpbmdBZGRyZXNzKSxcbiAgICAgICAgICAgIHZhbGlkYXRvckFkZHJlc3M6IG5ldyBQdWJsaWNLZXkoZXh0cmFQYXJhbXMudmFsaWRhdG9yQWRkcmVzcyksXG4gICAgICAgICAgICB0cmFuc2ZlckF1dGhvcml0eTogbmV3IFB1YmxpY0tleShleHRyYVBhcmFtcy50cmFuc2ZlckF1dGhvcml0eUFkZHJlc3MpLFxuICAgICAgICAgICAgcG9vbEFtb3VudDogYW1vdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXh0cmFQYXJhbXMuc3Rha2VQb29sRGF0YVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuIHR4Lmluc3RydWN0aW9ucztcbiAgICB9XG5cbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERToge1xuICAgICAgYXNzZXJ0KHJlY2lwaWVudHMsICdNaXNzaW5nIHJlY2lwaWVudHMgcGFyYW0nKTtcblxuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgICAgIGNvbnN0IHRvUHVia2V5QWRkcmVzcyA9IG5ldyBQdWJsaWNLZXkocmVjaXBpZW50c1swXS5hZGRyZXNzIHx8ICcnKTtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICAgIHRvUHVia2V5OiB0b1B1YmtleUFkZHJlc3MsXG4gICAgICAgIGxhbXBvcnRzOiBwYXJzZUludChyZWNpcGllbnRzWzBdLmFtb3VudCwgMTApLFxuICAgICAgfSk7XG5cbiAgICAgIHR4LmFkZCh0cmFuc2Zlckluc3RydWN0aW9uKTtcbiAgICAgIHJldHVybiB0eC5pbnN0cnVjdGlvbnM7XG4gICAgfVxuXG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFOiB7XG4gICAgICBhc3NlcnQoc3Rha2luZ0FkZHJlc3MsICdNaXNzaW5nIHN0YWtpbmdBZGRyZXNzIHBhcmFtJyk7XG5cbiAgICAgIGlmIChkYXRhLnBhcmFtcy5hbW91bnQgJiYgZGF0YS5wYXJhbXMudW5zdGFraW5nQWRkcmVzcykge1xuICAgICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgICAgICBjb25zdCB1bnN0YWtpbmdBZGRyZXNzID0gbmV3IFB1YmxpY0tleShkYXRhLnBhcmFtcy51bnN0YWtpbmdBZGRyZXNzKTtcblxuICAgICAgICBjb25zdCBhbGxvY2F0ZUFjY291bnQgPSBTeXN0ZW1Qcm9ncmFtLmFsbG9jYXRlKHtcbiAgICAgICAgICBhY2NvdW50UHVia2V5OiB1bnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgIHNwYWNlOiBTdGFrZVByb2dyYW0uc3BhY2UsXG4gICAgICAgIH0pO1xuICAgICAgICB0eC5hZGQoYWxsb2NhdGVBY2NvdW50KTtcblxuICAgICAgICBjb25zdCBhc3NpZ25BY2NvdW50ID0gU3lzdGVtUHJvZ3JhbS5hc3NpZ24oe1xuICAgICAgICAgIGFjY291bnRQdWJrZXk6IHVuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgcHJvZ3JhbUlkOiBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgICB9KTtcbiAgICAgICAgdHguYWRkKGFzc2lnbkFjY291bnQpO1xuXG4gICAgICAgIGNvbnN0IHNwbGl0U3Rha2UgPSBTdGFrZVByb2dyYW0uc3BsaXQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3Rha2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkoc3Rha2luZ0FkZHJlc3MpLFxuICAgICAgICAgICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICAgICAgICBzcGxpdFN0YWtlUHVia2V5OiB1bnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgbGFtcG9ydHM6IG5ldyBCaWdOdW1iZXIoZGF0YS5wYXJhbXMuYW1vdW50KS50b051bWJlcigpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgMFxuICAgICAgICApO1xuICAgICAgICB0eC5hZGQoc3BsaXRTdGFrZS5pbnN0cnVjdGlvbnNbMV0pO1xuXG4gICAgICAgIGNvbnN0IGRlYWN0aXZhdGVTdGFraW5nID0gU3Rha2VQcm9ncmFtLmRlYWN0aXZhdGUoe1xuICAgICAgICAgIHN0YWtlUHVia2V5OiB1bnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgIGF1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkoZnJvbUFkZHJlc3MpLFxuICAgICAgICB9KTtcbiAgICAgICAgdHguYWRkKGRlYWN0aXZhdGVTdGFraW5nKTtcblxuICAgICAgICByZXR1cm4gdHguaW5zdHJ1Y3Rpb25zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVhY3RpdmF0ZVN0YWtpbmcgPSBTdGFrZVByb2dyYW0uZGVhY3RpdmF0ZSh7XG4gICAgICAgICAgc3Rha2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkoc3Rha2luZ0FkZHJlc3MpLFxuICAgICAgICAgIGF1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkoZnJvbUFkZHJlc3MpLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZVN0YWtpbmcuaW5zdHJ1Y3Rpb25zO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IHVucmVhY2hhYmxlOiBuZXZlciA9IHN0YWtpbmdUeXBlO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YWtpbmcgdHlwZSAke3VucmVhY2hhYmxlfWApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbnN0cnVjdCBTdGFraW5nIFdpdGhkcmF3IFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1N0YWtpbmdXaXRoZHJhd30gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBTdGFraW5nIFdpdGhkcmF3ICBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uKGRhdGE6IFN0YWtpbmdXaXRoZHJhdyk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgZnJvbUFkZHJlc3MsIHN0YWtpbmdBZGRyZXNzLCBhbW91bnQgfSxcbiAgfSA9IGRhdGE7XG4gIGFzc2VydChmcm9tQWRkcmVzcywgJ01pc3NpbmcgZnJvbUFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KHN0YWtpbmdBZGRyZXNzLCAnTWlzc2luZyBzdGFraW5nQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYW1vdW50LCAnTWlzc2luZyBhbW91bnQgcGFyYW0nKTtcblxuICBjb25zdCB3aXRoZHJhd1N0YWtpbmcgPSBTdGFrZVByb2dyYW0ud2l0aGRyYXcoe1xuICAgIHN0YWtlUHVia2V5OiBuZXcgUHVibGljS2V5KHN0YWtpbmdBZGRyZXNzKSxcbiAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKSxcbiAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgbGFtcG9ydHM6IG5ldyBCaWdOdW1iZXIoYW1vdW50KS50b051bWJlcigpLFxuICB9KTtcblxuICByZXR1cm4gd2l0aGRyYXdTdGFraW5nLmluc3RydWN0aW9ucztcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgQ3JlYXRlIGFuZCBJbml0aWFsaXplIE5vbmNlIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1dhbGxldEluaXR9IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgQ3JlYXRlIGFuZCBJbml0aWFsaXplIE5vbmNlIFNvbGFuYSBpbnN0cnVjdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVBVEFJbnN0cnVjdGlvbihkYXRhOiBBdGFJbml0KTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3Qge1xuICAgIHBhcmFtczogeyBtaW50QWRkcmVzcywgYXRhQWRkcmVzcywgb3duZXJBZGRyZXNzLCBwYXllckFkZHJlc3MsIHByb2dyYW1JZCB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KG1pbnRBZGRyZXNzLCAnTWlzc2luZyBtaW50QWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYXRhQWRkcmVzcywgJ01pc3NpbmcgYXRhQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQob3duZXJBZGRyZXNzLCAnTWlzc2luZyBvd25lckFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KHBheWVyQWRkcmVzcywgJ01pc3NpbmcgcGF5ZXJBZGRyZXNzIHBhcmFtJyk7XG5cbiAgbGV0IGFzc29jaWF0ZWRUb2tlbkFjY291bnRJbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbjtcbiAgaWYgKHByb2dyYW1JZCAmJiBwcm9ncmFtSWQgPT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgYXNzb2NpYXRlZFRva2VuQWNjb3VudEluc3RydWN0aW9uID0gY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudEluc3RydWN0aW9uKFxuICAgICAgbmV3IFB1YmxpY0tleShwYXllckFkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleShhdGFBZGRyZXNzKSxcbiAgICAgIG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKSxcbiAgICAgIG5ldyBQdWJsaWNLZXkobWludEFkZHJlc3MpLFxuICAgICAgVE9LRU5fMjAyMl9QUk9HUkFNX0lEXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5zdHJ1Y3Rpb24gPSBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5zdHJ1Y3Rpb24oXG4gICAgICBuZXcgUHVibGljS2V5KHBheWVyQWRkcmVzcyksXG4gICAgICBuZXcgUHVibGljS2V5KGF0YUFkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleShvd25lckFkZHJlc3MpLFxuICAgICAgbmV3IFB1YmxpY0tleShtaW50QWRkcmVzcylcbiAgICApO1xuICB9XG4gIHJldHVybiBbYXNzb2NpYXRlZFRva2VuQWNjb3VudEluc3RydWN0aW9uXTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgQ2xvc2UgQVRBIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1dhbGxldEluaXR9IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgQ2xvc2UgQVRBIFNvbGFuYSBpbnN0cnVjdGlvblxuICovXG5mdW5jdGlvbiBjbG9zZUFUQUluc3RydWN0aW9uKGRhdGE6IEF0YUNsb3NlKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3Qge1xuICAgIHBhcmFtczogeyBhY2NvdW50QWRkcmVzcywgZGVzdGluYXRpb25BZGRyZXNzLCBhdXRob3JpdHlBZGRyZXNzIH0sXG4gIH0gPSBkYXRhO1xuICBhc3NlcnQoYWNjb3VudEFkZHJlc3MsICdNaXNzaW5nIGFjY291bnRBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChkZXN0aW5hdGlvbkFkZHJlc3MsICdNaXNzaW5nIGRlc3RpbmF0aW9uQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYXV0aG9yaXR5QWRkcmVzcywgJ01pc3NpbmcgYXV0aG9yaXR5QWRkcmVzcyBwYXJhbScpO1xuXG4gIGNvbnN0IGNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudEluc3RydWN0aW9uID0gY3JlYXRlQ2xvc2VBY2NvdW50SW5zdHJ1Y3Rpb24oXG4gICAgbmV3IFB1YmxpY0tleShhY2NvdW50QWRkcmVzcyksXG4gICAgbmV3IFB1YmxpY0tleShkZXN0aW5hdGlvbkFkZHJlc3MpLFxuICAgIG5ldyBQdWJsaWNLZXkoYXV0aG9yaXR5QWRkcmVzcylcbiAgKTtcbiAgcmV0dXJuIFtjbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJbnN0cnVjdGlvbl07XG59XG5cbi8qKlxuICogQ29uc3RydWN0IFN0YWtpbmcgQWNjb3VudCBBdXRob3JpemUgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7U3Rha2luZ0F1dGhvcml6ZX0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBTdGFraW5nIEFjY291bnQgQXV0aG9yaXplIGluc3RydWN0aW9uc1xuICovXG5mdW5jdGlvbiBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb24oZGF0YTogU3Rha2luZ0F1dGhvcml6ZSk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXM6IHsgc3Rha2luZ0FkZHJlc3MsIG9sZEF1dGhvcml6ZUFkZHJlc3MsIG5ld0F1dGhvcml6ZUFkZHJlc3MsIG5ld1dpdGhkcmF3QWRkcmVzcyB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KHN0YWtpbmdBZGRyZXNzLCAnTWlzc2luZyBzdGFraW5nQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQob2xkQXV0aG9yaXplQWRkcmVzcywgJ01pc3Npbmcgb2xkQXV0aG9yaXplQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQobmV3QXV0aG9yaXplQWRkcmVzcywgJ01pc3NpbmcgbmV3QXV0aG9yaXplQWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQobmV3V2l0aGRyYXdBZGRyZXNzLCAnTWlzc2luZyBuZXdXaXRoZHJhd0FkZHJlc3MgcGFyYW0nKTtcblxuICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbigpO1xuXG4gIGNvbnN0IGF1dGhvcml6ZVN0YWtpbmcgPSBTdGFrZVByb2dyYW0uYXV0aG9yaXplKHtcbiAgICBzdGFrZVB1YmtleTogbmV3IFB1YmxpY0tleShzdGFraW5nQWRkcmVzcyksXG4gICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShvbGRBdXRob3JpemVBZGRyZXNzKSxcbiAgICBuZXdBdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KG5ld0F1dGhvcml6ZUFkZHJlc3MpLFxuICAgIHN0YWtlQXV0aG9yaXphdGlvblR5cGU6IFN0YWtlQXV0aG9yaXphdGlvbkxheW91dC5TdGFrZXIsXG4gIH0pO1xuXG4gIGNvbnN0IGF1dGhvcml6ZVdpdGhkcmF3ID0gU3Rha2VQcm9ncmFtLmF1dGhvcml6ZSh7XG4gICAgc3Rha2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkoc3Rha2luZ0FkZHJlc3MpLFxuICAgIGF1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkob2xkQXV0aG9yaXplQWRkcmVzcyksXG4gICAgbmV3QXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShuZXdBdXRob3JpemVBZGRyZXNzKSxcbiAgICBzdGFrZUF1dGhvcml6YXRpb25UeXBlOiBTdGFrZUF1dGhvcml6YXRpb25MYXlvdXQuV2l0aGRyYXdlcixcbiAgICBjdXN0b2RpYW5QdWJrZXk6IG5ldyBQdWJsaWNLZXkobmV3V2l0aGRyYXdBZGRyZXNzKSxcbiAgfSk7XG4gIHR4LmFkZChhdXRob3JpemVTdGFraW5nKTtcbiAgdHguYWRkKGF1dGhvcml6ZVdpdGhkcmF3KTtcblxuICByZXR1cm4gdHguaW5zdHJ1Y3Rpb25zO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBEZWxlZ2F0ZSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtTdGFraW5nQWN0aXZhdGV9IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgRGVsZWdhdGUgU29sYW5hIGluc3RydWN0aW9uc1xuICovXG5mdW5jdGlvbiBzdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbihkYXRhOiBTdGFraW5nRGVsZWdhdGUpOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IGZyb21BZGRyZXNzLCBzdGFraW5nQWRkcmVzcywgdmFsaWRhdG9yIH0sXG4gIH0gPSBkYXRhO1xuICBhc3NlcnQoZnJvbUFkZHJlc3MsICdNaXNzaW5nIGZyb21BZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChzdGFraW5nQWRkcmVzcywgJ01pc3Npbmcgc3Rha2luZ0FkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KHZhbGlkYXRvciwgJ01pc3NpbmcgdmFsaWRhdG9yIHBhcmFtJyk7XG4gIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIGNvbnN0IGRlbGVnYXRlU3Rha2luZyA9IFN0YWtlUHJvZ3JhbS5kZWxlZ2F0ZSh7XG4gICAgc3Rha2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkoc3Rha2luZ0FkZHJlc3MpLFxuICAgIGF1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkoZnJvbUFkZHJlc3MpLFxuICAgIHZvdGVQdWJrZXk6IG5ldyBQdWJsaWNLZXkodmFsaWRhdG9yKSxcbiAgfSk7XG4gIHR4LmFkZChkZWxlZ2F0ZVN0YWtpbmcpO1xuXG4gIHJldHVybiB0eC5pbnN0cnVjdGlvbnM7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IE1pbnRUbyBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtNaW50VG99IGRhdGEgLSB0aGUgZGF0YSB0byBidWlsZCB0aGUgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgTWludFRvIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqL1xuZnVuY3Rpb24gbWludFRvSW5zdHJ1Y3Rpb24oZGF0YTogTWludFRvKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdIHtcbiAgY29uc3Qge1xuICAgIHBhcmFtczogeyBtaW50QWRkcmVzcywgZGVzdGluYXRpb25BZGRyZXNzLCBhdXRob3JpdHlBZGRyZXNzLCBhbW91bnQsIHByb2dyYW1JZCB9LFxuICB9ID0gZGF0YTtcbiAgYXNzZXJ0KG1pbnRBZGRyZXNzLCAnTWlzc2luZyBtaW50QWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoZGVzdGluYXRpb25BZGRyZXNzLCAnTWlzc2luZyBkZXN0aW5hdGlvbkFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KGF1dGhvcml0eUFkZHJlc3MsICdNaXNzaW5nIGF1dGhvcml0eUFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KGFtb3VudCwgJ01pc3NpbmcgYW1vdW50IHBhcmFtJyk7XG5cbiAgY29uc3QgbWludCA9IG5ldyBQdWJsaWNLZXkobWludEFkZHJlc3MpO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IG5ldyBQdWJsaWNLZXkoZGVzdGluYXRpb25BZGRyZXNzKTtcbiAgY29uc3QgYXV0aG9yaXR5ID0gbmV3IFB1YmxpY0tleShhdXRob3JpdHlBZGRyZXNzKTtcblxuICBsZXQgbWludFRvSW5zdHI6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb247XG4gIGlmIChwcm9ncmFtSWQgJiYgcHJvZ3JhbUlkID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgIG1pbnRUb0luc3RyID0gY3JlYXRlTWludFRvSW5zdHJ1Y3Rpb24obWludCwgZGVzdGluYXRpb24sIGF1dGhvcml0eSwgQmlnSW50KGFtb3VudCksIFtdLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICB9IGVsc2Uge1xuICAgIG1pbnRUb0luc3RyID0gY3JlYXRlTWludFRvSW5zdHJ1Y3Rpb24obWludCwgZGVzdGluYXRpb24sIGF1dGhvcml0eSwgQmlnSW50KGFtb3VudCkpO1xuICB9XG5cbiAgcmV0dXJuIFttaW50VG9JbnN0cl07XG59XG5cbi8qKlxuICogQ29uc3RydWN0IEJ1cm4gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7QnVybn0gZGF0YSAtIHRoZSBkYXRhIHRvIGJ1aWxkIHRoZSBpbnN0cnVjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gQW4gYXJyYXkgY29udGFpbmluZyBCdXJuIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqL1xuZnVuY3Rpb24gYnVybkluc3RydWN0aW9uKGRhdGE6IEJ1cm4pOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10ge1xuICBjb25zdCB7XG4gICAgcGFyYW1zOiB7IG1pbnRBZGRyZXNzLCBhY2NvdW50QWRkcmVzcywgYXV0aG9yaXR5QWRkcmVzcywgYW1vdW50LCBwcm9ncmFtSWQgfSxcbiAgfSA9IGRhdGE7XG4gIGFzc2VydChtaW50QWRkcmVzcywgJ01pc3NpbmcgbWludEFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KGFjY291bnRBZGRyZXNzLCAnTWlzc2luZyBhY2NvdW50QWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYXV0aG9yaXR5QWRkcmVzcywgJ01pc3NpbmcgYXV0aG9yaXR5QWRkcmVzcyBwYXJhbScpO1xuICBhc3NlcnQoYW1vdW50LCAnTWlzc2luZyBhbW91bnQgcGFyYW0nKTtcblxuICBjb25zdCBtaW50ID0gbmV3IFB1YmxpY0tleShtaW50QWRkcmVzcyk7XG4gIGNvbnN0IGFjY291bnQgPSBuZXcgUHVibGljS2V5KGFjY291bnRBZGRyZXNzKTtcbiAgY29uc3QgYXV0aG9yaXR5ID0gbmV3IFB1YmxpY0tleShhdXRob3JpdHlBZGRyZXNzKTtcblxuICBsZXQgYnVybkluc3RyOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uO1xuICBpZiAocHJvZ3JhbUlkICYmIHByb2dyYW1JZCA9PT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCkpIHtcbiAgICBidXJuSW5zdHIgPSBjcmVhdGVCdXJuSW5zdHJ1Y3Rpb24oYWNjb3VudCwgbWludCwgYXV0aG9yaXR5LCBCaWdJbnQoYW1vdW50KSwgW10sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gIH0gZWxzZSB7XG4gICAgYnVybkluc3RyID0gY3JlYXRlQnVybkluc3RydWN0aW9uKGFjY291bnQsIG1pbnQsIGF1dGhvcml0eSwgQmlnSW50KGFtb3VudCkpO1xuICB9XG5cbiAgcmV0dXJuIFtidXJuSW5zdHJdO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgY3VzdG9tIGluc3RydWN0aW9uIC0gY29udmVydHMgdG8gVHJhbnNhY3Rpb25JbnN0cnVjdGlvblxuICogSGFuZGxlcyBjb252ZXJzaW9uIGZyb20gc3RyaW5nLWJhc2VkIGZvcm1hdCB0byBUcmFuc2FjdGlvbkluc3RydWN0aW9uIGZvcm1hdFxuICpcbiAqIEBwYXJhbSB7Q3VzdG9tSW5zdHJ1Y3Rpb259IGRhdGEgLSB0aGUgZGF0YSBjb250YWluaW5nIHRoZSBjdXN0b20gaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGN1c3RvbSBpbnN0cnVjdGlvblxuICovXG5mdW5jdGlvbiBjdXN0b21JbnN0cnVjdGlvbihkYXRhOiBJbnN0cnVjdGlvblBhcmFtcyk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IHsgcGFyYW1zIH0gPSBkYXRhIGFzIEN1c3RvbUluc3RydWN0aW9uO1xuICBhc3NlcnQocGFyYW1zLnByb2dyYW1JZCwgJ01pc3NpbmcgcHJvZ3JhbUlkIGluIGN1c3RvbSBpbnN0cnVjdGlvbicpO1xuICBhc3NlcnQocGFyYW1zLmtleXMgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMua2V5cyksICdNaXNzaW5nIG9yIGludmFsaWQga2V5cyBpbiBjdXN0b20gaW5zdHJ1Y3Rpb24nKTtcbiAgYXNzZXJ0KHBhcmFtcy5kYXRhICE9PSB1bmRlZmluZWQsICdNaXNzaW5nIGRhdGEgaW4gY3VzdG9tIGluc3RydWN0aW9uJyk7XG5cbiAgLy8gQ29udmVydCBzdHJpbmcgZGF0YSB0byBCdWZmZXJcbiAgbGV0IGRhdGFCdWZmZXI6IEJ1ZmZlcjtcblxuICBpZiAoaXNWYWxpZEJhc2U2NChwYXJhbXMuZGF0YSkpIHtcbiAgICBkYXRhQnVmZmVyID0gQnVmZmVyLmZyb20ocGFyYW1zLmRhdGEsICdiYXNlNjQnKTtcbiAgfSBlbHNlIGlmIChpc1ZhbGlkSGV4KHBhcmFtcy5kYXRhKSkge1xuICAgIGRhdGFCdWZmZXIgPSBCdWZmZXIuZnJvbShwYXJhbXMuZGF0YSwgJ2hleCcpO1xuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrIHRvIFVURi04XG4gICAgZGF0YUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHBhcmFtcy5kYXRhLCAndXRmOCcpO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24gd2l0aCB0aGUgY29udmVydGVkIGRhdGFcbiAgY29uc3QgY29udmVydGVkSW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBuZXcgUHVibGljS2V5KHBhcmFtcy5wcm9ncmFtSWQpLFxuICAgIGtleXM6IHBhcmFtcy5rZXlzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgcHVia2V5OiBuZXcgUHVibGljS2V5KGtleS5wdWJrZXkpLFxuICAgICAgaXNTaWduZXI6IGtleS5pc1NpZ25lcixcbiAgICAgIGlzV3JpdGFibGU6IGtleS5pc1dyaXRhYmxlLFxuICAgIH0pKSxcbiAgICBkYXRhOiBkYXRhQnVmZmVyLFxuICB9KTtcblxuICByZXR1cm4gW2NvbnZlcnRlZEluc3RydWN0aW9uXTtcbn1cblxuZnVuY3Rpb24gdXBzZXJ0QWNjb3VudE1ldGEoa2V5czogQWNjb3VudE1ldGFbXSwgbWV0YTogQWNjb3VudE1ldGEpOiB2b2lkIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBrZXlzLmZpbmQoKGFjY291bnQpID0+IGFjY291bnQucHVia2V5LmVxdWFscyhtZXRhLnB1YmtleSkpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBleGlzdGluZy5pc1dyaXRhYmxlID0gZXhpc3RpbmcuaXNXcml0YWJsZSB8fCBtZXRhLmlzV3JpdGFibGU7XG4gICAgZXhpc3RpbmcuaXNTaWduZXIgPSBleGlzdGluZy5pc1NpZ25lciB8fCBtZXRhLmlzU2lnbmVyO1xuICB9IGVsc2Uge1xuICAgIGtleXMucHVzaChtZXRhKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFN0YXRpY1RyYW5zZmVySG9va0FjY291bnRzKHRyYW5zZmVySG9vazogVHJhbnNmZXJIb29rQ29uZmlnKTogQWNjb3VudE1ldGFbXSB7XG4gIGNvbnN0IG1ldGFzOiBBY2NvdW50TWV0YVtdID0gW107XG4gIGlmICh0cmFuc2Zlckhvb2suZXh0cmFBY2NvdW50TWV0YXM/Lmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgbWV0YSBvZiB0cmFuc2Zlckhvb2suZXh0cmFBY2NvdW50TWV0YXMpIHtcbiAgICAgIG1ldGFzLnB1c2goe1xuICAgICAgICBwdWJrZXk6IG5ldyBQdWJsaWNLZXkobWV0YS5wdWJrZXkpLFxuICAgICAgICBpc1NpZ25lcjogbWV0YS5pc1NpZ25lcixcbiAgICAgICAgaXNXcml0YWJsZTogbWV0YS5pc1dyaXRhYmxlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXRhcztcbn1cblxuZnVuY3Rpb24gYWRkVHJhbnNmZXJIb29rQWNjb3VudHMoaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sIHRyYW5zZmVySG9vazogVHJhbnNmZXJIb29rQ29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IGV4dHJhTWV0YXMgPSBidWlsZFN0YXRpY1RyYW5zZmVySG9va0FjY291bnRzKHRyYW5zZmVySG9vayk7XG4gIGZvciAoY29uc3QgbWV0YSBvZiBleHRyYU1ldGFzKSB7XG4gICAgdXBzZXJ0QWNjb3VudE1ldGEoaW5zdHJ1Y3Rpb24ua2V5cywgbWV0YSk7XG4gIH1cbn1cbiJdfQ==
|