@bitgo/account-lib 2.17.1-rc.8 → 2.17.2-node12.0

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.
Files changed (133) hide show
  1. package/dist/browser/bitgo-account-lib.js +2 -0
  2. package/dist/browser/bitgo-account-lib.js.LICENSE.txt +416 -0
  3. package/dist/browser/bitgo-account-lib.min.js +1 -1
  4. package/dist/browser/bitgo-account-lib.min.js.LICENSE.txt +4 -4
  5. package/dist/package.json +4 -4
  6. package/dist/resources/dot/index.ts +2 -0
  7. package/dist/resources/dot/mainnet.ts +2 -0
  8. package/dist/resources/dot/westend.ts +2 -0
  9. package/dist/src/coin/dot/addressInitializationBuilder.d.ts +80 -0
  10. package/dist/src/coin/dot/addressInitializationBuilder.d.ts.map +1 -0
  11. package/dist/src/coin/dot/addressInitializationBuilder.js +205 -0
  12. package/dist/src/coin/dot/batchTransactionBuilder.d.ts +47 -0
  13. package/dist/src/coin/dot/batchTransactionBuilder.d.ts.map +1 -0
  14. package/dist/src/coin/dot/batchTransactionBuilder.js +145 -0
  15. package/dist/src/coin/dot/errors.d.ts +8 -0
  16. package/dist/src/coin/dot/errors.d.ts.map +1 -0
  17. package/dist/src/coin/dot/errors.js +40 -0
  18. package/dist/src/coin/dot/iface.d.ts +181 -0
  19. package/dist/src/coin/dot/iface.d.ts.map +1 -0
  20. package/dist/src/coin/dot/iface.js +37 -0
  21. package/dist/src/coin/dot/stakingBuilder.d.ts +59 -0
  22. package/dist/src/coin/dot/stakingBuilder.d.ts.map +1 -0
  23. package/dist/src/coin/dot/stakingBuilder.js +157 -0
  24. package/dist/src/coin/dot/txnSchema.d.ts +12 -0
  25. package/dist/src/coin/dot/txnSchema.d.ts.map +1 -0
  26. package/dist/src/coin/dot/txnSchema.js +95 -0
  27. package/dist/src/coin/dot/unnominateBuilder.d.ts +24 -0
  28. package/dist/src/coin/dot/unnominateBuilder.d.ts.map +1 -0
  29. package/dist/src/coin/dot/unnominateBuilder.js +72 -0
  30. package/dist/src/coin/dot/unstakeBuilder.d.ts +38 -0
  31. package/dist/src/coin/dot/unstakeBuilder.d.ts.map +1 -0
  32. package/dist/src/coin/dot/unstakeBuilder.js +111 -0
  33. package/dist/src/coin/near/index.d.ts +5 -0
  34. package/dist/src/coin/near/index.d.ts.map +1 -0
  35. package/dist/src/coin/near/index.js +29 -0
  36. package/dist/src/coin/near/keyPair.d.ts +19 -0
  37. package/dist/src/coin/near/keyPair.d.ts.map +1 -0
  38. package/dist/src/coin/near/keyPair.js +76 -0
  39. package/dist/src/coin/near/transaction.d.ts +11 -0
  40. package/dist/src/coin/near/transaction.d.ts.map +1 -0
  41. package/dist/src/coin/near/transaction.js +41 -0
  42. package/dist/src/coin/near/transactionBuilder.d.ts +28 -0
  43. package/dist/src/coin/near/transactionBuilder.d.ts.map +1 -0
  44. package/dist/src/coin/near/transactionBuilder.js +68 -0
  45. package/dist/src/coin/near/transactionBuilderFactory.d.ts +24 -0
  46. package/dist/src/coin/near/transactionBuilderFactory.d.ts.map +1 -0
  47. package/dist/src/coin/near/transactionBuilderFactory.js +56 -0
  48. package/dist/src/coin/near/transferBuilder.d.ts +14 -0
  49. package/dist/src/coin/near/transferBuilder.d.ts.map +1 -0
  50. package/dist/src/coin/near/transferBuilder.js +81 -0
  51. package/dist/src/coin/near/utils.d.ts +19 -0
  52. package/dist/src/coin/near/utils.d.ts.map +1 -0
  53. package/dist/src/coin/near/utils.js +61 -0
  54. package/dist/src/coin/near/walletInitializationBuilder.d.ts +14 -0
  55. package/dist/src/coin/near/walletInitializationBuilder.d.ts.map +1 -0
  56. package/dist/src/coin/near/walletInitializationBuilder.js +81 -0
  57. package/dist/src/coin/sol/constants.d.ts +49 -0
  58. package/dist/src/coin/sol/constants.d.ts.map +1 -0
  59. package/dist/src/coin/sol/constants.js +65 -0
  60. package/dist/src/coin/sol/iface.d.ts +80 -0
  61. package/dist/src/coin/sol/iface.d.ts.map +1 -0
  62. package/dist/src/coin/sol/iface.js +3 -0
  63. package/dist/src/coin/sol/index.d.ts +8 -0
  64. package/dist/src/coin/sol/index.d.ts.map +1 -0
  65. package/dist/src/coin/sol/index.js +35 -0
  66. package/dist/src/coin/sol/instructionParamsFactory.d.ts +12 -0
  67. package/dist/src/coin/sol/instructionParamsFactory.d.ts.map +1 -0
  68. package/dist/src/coin/sol/instructionParamsFactory.js +198 -0
  69. package/dist/src/coin/sol/keyPair.d.ts +27 -0
  70. package/dist/src/coin/sol/keyPair.d.ts.map +1 -0
  71. package/dist/src/coin/sol/keyPair.js +81 -0
  72. package/dist/src/coin/sol/solInstructionFactory.d.ts +10 -0
  73. package/dist/src/coin/sol/solInstructionFactory.d.ts.map +1 -0
  74. package/dist/src/coin/sol/solInstructionFactory.js +174 -0
  75. package/dist/src/coin/sol/stakingActivateBuilder.d.ts +41 -0
  76. package/dist/src/coin/sol/stakingActivateBuilder.d.ts.map +1 -0
  77. package/dist/src/coin/sol/stakingActivateBuilder.js +162 -0
  78. package/dist/src/coin/sol/stakingDeactivateBuilder.d.ts +23 -0
  79. package/dist/src/coin/sol/stakingDeactivateBuilder.d.ts.map +1 -0
  80. package/dist/src/coin/sol/stakingDeactivateBuilder.js +130 -0
  81. package/dist/src/coin/sol/stakingWithdrawBuilder.d.ts +31 -0
  82. package/dist/src/coin/sol/stakingWithdrawBuilder.d.ts.map +1 -0
  83. package/dist/src/coin/sol/stakingWithdrawBuilder.js +146 -0
  84. package/dist/src/coin/sol/transaction.d.ts +56 -0
  85. package/dist/src/coin/sol/transaction.d.ts.map +1 -0
  86. package/dist/src/coin/sol/transaction.js +419 -0
  87. package/dist/src/coin/sol/transactionBuilder.d.ts +98 -0
  88. package/dist/src/coin/sol/transactionBuilder.d.ts.map +1 -0
  89. package/dist/src/coin/sol/transactionBuilder.js +318 -0
  90. package/dist/src/coin/sol/transactionBuilderFactory.d.ts +68 -0
  91. package/dist/src/coin/sol/transactionBuilderFactory.d.ts.map +1 -0
  92. package/dist/src/coin/sol/transactionBuilderFactory.js +132 -0
  93. package/dist/src/coin/sol/transferBuilder.d.ts +26 -0
  94. package/dist/src/coin/sol/transferBuilder.d.ts.map +1 -0
  95. package/dist/src/coin/sol/transferBuilder.js +138 -0
  96. package/dist/src/coin/sol/utils.d.ts +126 -0
  97. package/dist/src/coin/sol/utils.d.ts.map +1 -0
  98. package/dist/src/coin/sol/utils.js +315 -0
  99. package/dist/src/coin/sol/walletInitializationBuilder.d.ts +26 -0
  100. package/dist/src/coin/sol/walletInitializationBuilder.d.ts.map +1 -0
  101. package/dist/src/coin/sol/walletInitializationBuilder.js +139 -0
  102. package/dist/src/coin/stx/abstractContractBuilder.d.ts +19 -0
  103. package/dist/src/coin/stx/abstractContractBuilder.d.ts.map +1 -0
  104. package/dist/src/coin/stx/abstractContractBuilder.js +140 -0
  105. package/dist/src/coin/stx/constants.d.ts +8 -0
  106. package/dist/src/coin/stx/constants.d.ts.map +1 -0
  107. package/dist/src/coin/stx/constants.js +19 -0
  108. package/dist/src/coin/stx/sendmanyBuilder.d.ts +23 -0
  109. package/dist/src/coin/stx/sendmanyBuilder.d.ts.map +1 -0
  110. package/dist/src/coin/stx/sendmanyBuilder.js +140 -0
  111. package/dist/src/coin/stx/transaction.js +2 -2
  112. package/dist/src/coin/stx/utils.d.ts +3 -3
  113. package/dist/src/coin/stx/utils.d.ts.map +1 -1
  114. package/dist/src/coin/stx/utils.js +10 -7
  115. package/dist/src/keyPair/index.d.ts +4 -0
  116. package/dist/src/keyPair/index.d.ts.map +1 -0
  117. package/dist/src/keyPair/index.js +38 -0
  118. package/dist/src/mpc/curves.d.ts +14 -0
  119. package/dist/src/mpc/curves.d.ts.map +1 -0
  120. package/dist/src/mpc/curves.js +99 -0
  121. package/dist/src/mpc/shamir.d.ts +7 -0
  122. package/dist/src/mpc/shamir.d.ts.map +1 -0
  123. package/dist/src/mpc/shamir.js +91 -0
  124. package/dist/src/mpc/tss.d.ts +69 -0
  125. package/dist/src/mpc/tss.d.ts.map +1 -0
  126. package/dist/src/mpc/tss.js +255 -0
  127. package/dist/src/utils/ed25519KeyDeriver.d.ts +49 -0
  128. package/dist/src/utils/ed25519KeyDeriver.d.ts.map +1 -0
  129. package/dist/src/utils/ed25519KeyDeriver.js +92 -0
  130. package/dist/src/utils/index.d.ts +9 -0
  131. package/dist/src/utils/index.d.ts.map +1 -0
  132. package/dist/src/utils/index.js +43 -0
  133. package/package.json +4 -4
@@ -165,7 +165,7 @@ var Transaction = /** @class */ (function (_super) {
165
165
  payloadType: transactions_1.PayloadType.TokenTransfer,
166
166
  // result.payload.memo will be padded with \u0000 up to
167
167
  // MEMO_MAX_LENGTH_BYTES as defined in @stacks/transactions
168
- memo: payload.memo.content,
168
+ memo: utils_1.unpadMemo(payload.memo.content),
169
169
  to: transactions_1.addressToString({
170
170
  type: transactions_1.StacksMessageType.Address,
171
171
  version: payload.recipient.address.version,
@@ -290,4 +290,4 @@ var Transaction = /** @class */ (function (_super) {
290
290
  return Transaction;
291
291
  }(baseCoin_1.BaseTransaction));
292
292
  exports.Transaction = Transaction;
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29pbi9zdHgvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBYzhCO0FBRTlCLDZDQUFnSDtBQUVoSCx3Q0FBK0Q7QUFFL0QsaUNBQTJFO0FBRzNFO0lBQWlDLCtCQUFlO0lBSzlDLHFCQUFZLFdBQWlDO2VBQzNDLGtCQUFNLFdBQVcsQ0FBQztJQUNwQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLDZCQUFPLEdBQVAsVUFBUSxHQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVLLDBCQUFJLEdBQVYsVUFBVyxPQUE0QixFQUFFLE9BQWdCOzs7OztnQkFDakQsUUFBUSxHQUFHLE9BQU8sWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxHQUFHLElBQUksZ0NBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDN0IsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLElBQUksQ0FBQyxRQUFRLG1DQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2hGLFdBQXlCLEVBQVIscUJBQVEsRUFBUixzQkFBUSxFQUFSLElBQVEsRUFBRTtvQkFBaEIsRUFBRTtvQkFDTCxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7d0JBQ2IsTUFBTSxJQUFJLHFC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QUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRztvQkFDZDt3QkFDRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUMxQixLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNO3dCQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJO3FCQUM1QjtpQkFDRixDQUFDO2dCQUVGLElBQUksQ0FBQyxPQUFPLEdBQUc7b0JBQ2I7d0JBQ0UsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJO3dCQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNO3dCQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJO3FCQUM1QjtpQkFDRixDQUFDO2FBQ0g7U0FDRjthQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssMEJBQVcsQ0FBQyxZQUFZLEVBQUU7WUFDbEUsSUFBSSxDQUFDLFFBQVEsR0FBRztnQkFDZDtvQkFDRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlO29CQUN2QyxLQUFLLEVBQUUsR0FBRztvQkFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJO2lCQUM1QjthQUNGLENBQUM7WUFFRixJQUFJLENBQUMsT0FBTyxHQUFHO2dCQUNiO29CQUNFLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDcEIsS0FBSyxFQUFFLEdBQUc7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtpQkFDNUI7YUFDRixDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBQ0gsa0JBQUM7QUFBRCxDQUFDLEFBM05ELENBQWlDLDBCQUFlLEdBMk4vQztBQTNOWSxrQ0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1ZmZlclJlYWRlcixcbiAgUGF5bG9hZFR5cGUsXG4gIFN0YWNrc1RyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblNpZ25lcixcbiAgY3JlYXRlU3RhY2tzUHJpdmF0ZUtleSxcbiAgZGVzZXJpYWxpemVUcmFuc2FjdGlvbixcbiAgYWRkcmVzc1RvU3RyaW5nLFxuICBTdGFja3NNZXNzYWdlVHlwZSxcbiAgY3JlYXRlU3RhY2tzUHVibGljS2V5LFxuICBpc1NpbmdsZVNpZyxcbiAgTXVsdGlTaWdTcGVuZGluZ0NvbmRpdGlvbixcbiAgY3JlYXRlVHJhbnNhY3Rpb25BdXRoRmllbGQsXG4gIFB1YktleUVuY29kaW5nLFxufSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgU2lnbmluZ0Vycm9yLCBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLCBOb3RTdXBwb3J0ZWQgfSBmcm9tICcuLi9iYXNlQ29pbi9lcnJvcnMnO1xuaW1wb3J0IHsgQmFzZUtleSB9IGZyb20gJy4uL2Jhc2VDb2luL2lmYWNlJztcbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgU2lnbmF0dXJlRGF0YSwgU3RhY2tzQ29udHJhY3RQYXlsb2FkLCBTdGFja3NUcmFuc2FjdGlvblBheWxvYWQsIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgZ2V0VHhTZW5kZXJBZGRyZXNzLCByZW1vdmVIZXhQcmVmaXgsIHN0cmluZ2lmeUN2IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSBfc3R4VHJhbnNhY3Rpb246IFN0YWNrc1RyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHJpdmF0ZSBfc2lnSGFzaDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKGtleTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyW10gfCBLZXlQYWlyLCBzaWdIYXNoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qga2V5UGFpcnMgPSBrZXlQYWlyIGluc3RhbmNlb2YgQXJyYXkgPyBrZXlQYWlyIDogW2tleVBhaXJdO1xuICAgIGNvbnN0IHNpZ25lciA9IG5ldyBUcmFuc2FjdGlvblNpZ25lcih0aGlzLl9zdHhUcmFuc2FjdGlvbik7XG4gICAgc2lnbmVyLmNoZWNrT3ZlcnNpZ24gPSBmYWxzZTtcbiAgICBzaWduZXIuc2lnSGFzaCA9IHNpZ0hhc2ggPz8gdGhpcy5fc2lnSGFzaCA/PyB0aGlzLl9zdHhUcmFuc2FjdGlvbi52ZXJpZnlCZWdpbigpO1xuICAgIGZvciAoY29uc3Qga3Agb2Yga2V5UGFpcnMpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBrcC5nZXRLZXlzKGtwLmdldENvbXByZXNzZWQoKSk7XG4gICAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByaXZLZXkgPSBjcmVhdGVTdGFja3NQcml2YXRlS2V5KGtleXMucHJ2KTtcbiAgICAgIHNpZ25lci5zaWduT3JpZ2luKHByaXZLZXkpO1xuICAgICAgdGhpcy5fc2lnSGFzaCA9IHNpZ25lci5zaWdIYXNoO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFwcGVuZE9yaWdpbihwdWJLZXlTdHJpbmc6IHN0cmluZ1tdIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHViS2V5U3RyaW5ncyA9IHB1YktleVN0cmluZyBpbnN0YW5jZW9mIEFycmF5ID8gcHViS2V5U3RyaW5nIDogW3B1YktleVN0cmluZ107XG4gICAgY29uc3Qgc2lnbmVyOiBUcmFuc2FjdGlvblNpZ25lciA9IG5ldyBUcmFuc2FjdGlvblNpZ25lcih0aGlzLl9zdHhUcmFuc2FjdGlvbik7XG4gICAgcHViS2V5U3RyaW5ncy5mb3JFYWNoKChwdWJLZXkpID0+IHtcbiAgICAgIHNpZ25lci5hcHBlbmRPcmlnaW4oY3JlYXRlU3RhY2tzUHVibGljS2V5KHB1YktleSkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2lnbldpdGhTaWduYXR1cmVzKHNpZ25hdHVyZTogU2lnbmF0dXJlRGF0YVtdIHwgU2lnbmF0dXJlRGF0YSwgaXNNdWx0aVNpZzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHNpZ25hdHVyZXMnKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmF0dXJlcyA9IHNpZ25hdHVyZSBpbnN0YW5jZW9mIEFycmF5ID8gc2lnbmF0dXJlIDogW3NpZ25hdHVyZV07XG5cbiAgICBpZiAoIWlzTXVsdGlTaWcpIHtcbiAgICAgIHRoaXMuX3N0eFRyYW5zYWN0aW9uID0gdGhpcy5fc3R4VHJhbnNhY3Rpb24uY3JlYXRlVHhXaXRoU2lnbmF0dXJlKHNpZ25hdHVyZXNbMF0uZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGF1dGhGaWVsZHMgPSBzaWduYXR1cmVzLm1hcCgoc2lnKSA9PiBjcmVhdGVUcmFuc2FjdGlvbkF1dGhGaWVsZChQdWJLZXlFbmNvZGluZy5Db21wcmVzc2VkLCBzaWcpKTtcbiAgICAgICh0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uIGFzIE11bHRpU2lnU3BlbmRpbmdDb25kaXRpb24pLmZpZWxkcyA9IChcbiAgICAgICAgdGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbiBhcyBNdWx0aVNpZ1NwZW5kaW5nQ29uZGl0aW9uXG4gICAgICApLmZpZWxkcy5jb25jYXQoYXV0aEZpZWxkcyk7XG4gICAgfVxuICAgIGlmIChzaWduYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3NpZ0hhc2ggPSBzaWduYXR1cmVzW3NpZ25hdHVyZXMubGVuZ3RoIC0gMV0uc2lnSGFzaDtcbiAgICB9XG4gIH1cblxuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5fc3R4VHJhbnNhY3Rpb24gJiYgdGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbikge1xuICAgICAgaWYgKGlzU2luZ2xlU2lnKHRoaXMuX3N0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24pKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbi5zaWduYXR1cmUuZGF0YV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZC5jb250ZW50cy50eXBlID09PSBTdGFja3NNZXNzYWdlVHlwZS5NZXNzYWdlU2lnbmF0dXJlKSB7XG4gICAgICAgICAgICBzaWduYXR1cmVzLnB1c2goZmllbGQuY29udGVudHMuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNpZ25hdHVyZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0pzb24oKSB7XG4gICAgaWYgKCF0aGlzLl9zdHhUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBUeERhdGEgPSB7XG4gICAgICBpZDogdGhpcy5fc3R4VHJhbnNhY3Rpb24udHhpZCgpLFxuICAgICAgZmVlOiB0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLmdldEZlZSgpLnRvU3RyaW5nKDEwKSxcbiAgICAgIGZyb206IGdldFR4U2VuZGVyQWRkcmVzcyh0aGlzLl9zdHhUcmFuc2FjdGlvbiksXG4gICAgICBub25jZTogdGhpcy5nZXROb25jZSgpLFxuICAgICAgcGF5bG9hZDogdGhpcy5nZXRQYXlsb2FkRGF0YSgpLFxuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGF5bG9hZERhdGEoKTogU3RhY2tzVHJhbnNhY3Rpb25QYXlsb2FkIHwgU3RhY2tzQ29udHJhY3RQYXlsb2FkIHtcbiAgICBpZiAodGhpcy5fc3R4VHJhbnNhY3Rpb24ucGF5bG9hZC5wYXlsb2FkVHlwZSA9PT0gUGF5bG9hZFR5cGUuVG9rZW5UcmFuc2Zlcikge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuX3N0eFRyYW5zYWN0aW9uLnBheWxvYWQ7XG4gICAgICBjb25zdCB0eFBheWxvYWQ6IFN0YWNrc1RyYW5zYWN0aW9uUGF5bG9hZCA9IHtcbiAgICAgICAgcGF5bG9hZFR5cGU6IFBheWxvYWRUeXBlLlRva2VuVHJhbnNmZXIsXG4gICAgICAgIC8vIHJlc3VsdC5wYXlsb2FkLm1lbW8gd2lsbCBiZSBwYWRkZWQgd2l0aCBcXHUwMDAwIHVwIHRvXG4gICAgICAgIC8vIE1FTU9fTUFYX0xFTkdUSF9CWVRFUyBhcyBkZWZpbmVkIGluIEBzdGFja3MvdHJhbnNhY3Rpb25zXG4gICAgICAgIG1lbW86IHBheWxvYWQubWVtby5jb250ZW50LFxuICAgICAgICB0bzogYWRkcmVzc1RvU3RyaW5nKHtcbiAgICAgICAgICB0eXBlOiBTdGFja3NNZXNzYWdlVHlwZS5BZGRyZXNzLFxuICAgICAgICAgIHZlcnNpb246IHBheWxvYWQucmVjaXBpZW50LmFkZHJlc3MudmVyc2lvbixcbiAgICAgICAgICBoYXNoMTYwOiBwYXlsb2FkLnJlY2lwaWVudC5hZGRyZXNzLmhhc2gxNjAudG9TdHJpbmcoKSxcbiAgICAgICAgfSksXG4gICAgICAgIGFtb3VudDogcGF5bG9hZC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gdHhQYXlsb2FkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fc3R4VHJhbnNhY3Rpb24ucGF5bG9hZC5wYXlsb2FkVHlwZSA9PT0gUGF5bG9hZFR5cGUuQ29udHJhY3RDYWxsKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5fc3R4VHJhbnNhY3Rpb24ucGF5bG9hZDtcbiAgICAgIGNvbnN0IGNvbnRyYWN0UGF5bG9hZDogU3RhY2tzQ29udHJhY3RQYXlsb2FkID0ge1xuICAgICAgICBwYXlsb2FkVHlwZTogUGF5bG9hZFR5cGUuQ29udHJhY3RDYWxsLFxuICAgICAgICBjb250cmFjdEFkZHJlc3M6IGFkZHJlc3NUb1N0cmluZyhwYXlsb2FkLmNvbnRyYWN0QWRkcmVzcyksXG4gICAgICAgIGNvbnRyYWN0TmFtZTogcGF5bG9hZC5jb250cmFjdE5hbWUuY29udGVudCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBwYXlsb2FkLmZ1bmN0aW9uTmFtZS5jb250ZW50LFxuICAgICAgICBmdW5jdGlvbkFyZ3M6IHBheWxvYWQuZnVuY3Rpb25BcmdzLm1hcChzdHJpbmdpZnlDdiksXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGNvbnRyYWN0UGF5bG9hZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgncGF5bG9hZCB0eXBlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgYSB0cmFuc2FjdGlvbi4gIFRoaXMgaXMgbmVlZGVkIHRvIGNhbGN1bGF0ZVxuICAgKiB0aGUgdHJhbnNhY3Rpb24gZmVlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICB0cmFuc2FjdGlvblNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3R4VHJhbnNhY3Rpb24uc2VyaWFsaXplKCkubGVuZ3RoO1xuICB9XG5cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3N0eFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3R4VHJhbnNhY3Rpb24uc2VyaWFsaXplKCkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgZ2V0IHN0eFRyYW5zYWN0aW9uKCk6IFN0YWNrc1RyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc3R4VHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgc3R4VHJhbnNhY3Rpb24odDogU3RhY2tzVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl9zdHhUcmFuc2FjdGlvbiA9IHQ7XG4gIH1cblxuICBwcml2YXRlIGdldE5vbmNlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX3N0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBOdW1iZXIodGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbi5ub25jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignc3BlbmRpbmcgY29uZGl0aW9uIGlzIG51bGwnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uXG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZykge1xuICAgIGNvbnN0IHJhdyA9IHJlbW92ZUhleFByZWZpeChyYXdUcmFuc2FjdGlvbik7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3N0eFRyYW5zYWN0aW9uID0gZGVzZXJpYWxpemVUcmFuc2FjdGlvbihCdWZmZXJSZWFkZXIuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShyYXcsICdoZXgnKSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0Vycm9yIHBhcnNpbmcgdGhlIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBvbiB0aGlzIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSB0cmFuc2FjdGlvbiBqc29uXG4gICAqIGlmIHRoZXJlIGFyZSBvdXRwdXRzLlxuICAgKi9cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgY29uc3QgdHhKc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBpZiAodHhKc29uLnBheWxvYWQucGF5bG9hZFR5cGUgPT09IFBheWxvYWRUeXBlLlRva2VuVHJhbnNmZXIpIHtcbiAgICAgIGlmICh0eEpzb24ucGF5bG9hZC50byAmJiB0eEpzb24ucGF5bG9hZC5hbW91bnQpIHtcbiAgICAgICAgdGhpcy5fb3V0cHV0cyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0eEpzb24ucGF5bG9hZC50byxcbiAgICAgICAgICAgIHZhbHVlOiB0eEpzb24ucGF5bG9hZC5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdHhKc29uLmZyb20sXG4gICAgICAgICAgICB2YWx1ZTogdHhKc29uLnBheWxvYWQuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eEpzb24ucGF5bG9hZC5wYXlsb2FkVHlwZSA9PT0gUGF5bG9hZFR5cGUuQ29udHJhY3RDYWxsKSB7XG4gICAgICB0aGlzLl9vdXRwdXRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdHhKc29uLnBheWxvYWQuY29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgdGhpcy5faW5wdXRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdHhKc29uLmZyb20sXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cbiAgfVxufVxuIl19
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29pbi9zdHgvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBYzhCO0FBRTlCLDZDQUFnSDtBQUVoSCx3Q0FBK0Q7QUFFL0QsaUNBQXNGO0FBR3RGO0lBQWlDLCtCQUFlO0lBSzlDLHFCQUFZLFdBQWlDO2VBQzNDLGtCQUFNLFdBQVcsQ0FBQztJQUNwQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLDZCQUFPLEdBQVAsVUFBUSxHQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVLLDBCQUFJLEdBQVYsVUFBVyxPQUE0QixFQUFFLE9BQWdCOzs7OztnQkFDakQsUUFBUSxHQUFHLE9BQU8sWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxHQUFHLElBQUksZ0NBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDN0IsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLElBQUksQ0FBQyxRQUFRLG1DQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2hGLFdBQXlCLEVBQVIscUJBQVEsRUFBUixzQkFBUSxFQUFSLElBQVEsRUFBRTtvQkFBaEIsRUFBRTtvQkFDTCxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7d0JBQ2IsTUFBTSxJQUFJLHFCQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztxQkFDL0M7b0JBQ0ssT0FBTyxHQUFHLHFDQUFzQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDakQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO2lCQUNoQzs7OztLQUNGO0lBRUssa0NBQVksR0FBbEIsVUFBbUIsWUFBK0I7Ozs7Z0JBQzFDLGFBQWEsR0FBRyxZQUFZLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlFLE1BQU0sR0FBc0IsSUFBSSxnQ0FBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzlFLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBQyxNQUFNO29CQUMzQixNQUFNLENBQUMsWUFBWSxDQUFDLG9DQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELENBQUMsQ0FBQyxDQUFDOzs7O0tBQ0o7SUFFSyx3Q0FBa0IsR0FBeEIsVUFBeUIsU0FBMEMsRUFBRSxVQUFtQjs7OztnQkFDdEYsSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDZCxNQUFNLElBQUkscUJBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2lCQUM5QztnQkFDSyxVQUFVLEdBQUcsU0FBUyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUV4RSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNmLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3ZGO3FCQUFNO29CQUNDLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQUMsR0FBRyxJQUFLLE9BQUEseUNBQTBCLENBQUMsNkJBQWMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEVBQTFELENBQTBELENBQUMsQ0FBQztvQkFDdEcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQStDLENBQUMsTUFBTSxHQUMvRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxpQkFDM0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM3QjtnQkFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztpQkFDM0Q7Ozs7S0FDRjtJQUVELHNCQUFJLGtDQUFTO2FBQWI7WUFDRSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3ZFLElBQUksMEJBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO29CQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNyRTtxQkFBTTtvQkFDTCxJQUFNLFlBQVUsR0FBYSxFQUFFLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFLO3dCQUMvRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGdDQUFpQixDQUFDLGdCQUFnQixFQUFFOzRCQUM5RCxZQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ3RDO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sWUFBVSxDQUFDO2lCQUNuQjthQUNGO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDOzs7T0FBQTtJQUVELGtCQUFrQjtJQUNsQiw0QkFBTSxHQUFOO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsTUFBTSxJQUFJLDhCQUFxQixDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFNLE1BQU0sR0FBVztZQUNyQixFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUU7WUFDL0IsR0FBRyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDcEQsSUFBSSxFQUFFLDBCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDOUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUU7U0FDL0IsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxvQ0FBYyxHQUF0QjtRQUNFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLDBCQUFXLENBQUMsYUFBYSxFQUFFO1lBQzFFLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQzdDLElBQU0sU0FBUyxHQUE2QjtnQkFDMUMsV0FBVyxFQUFFLDBCQUFXLENBQUMsYUFBYTtnQkFDdEMsdURBQXVEO2dCQUN2RCwyREFBMkQ7Z0JBQzNELElBQUksRUFBRSxpQkFBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNyQyxFQUFFLEVBQUUsOEJBQWUsQ0FBQztvQkFDbEIsSUFBSSxFQUFFLGdDQUFpQixDQUFDLE9BQU87b0JBQy9CLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPO29CQUMxQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtpQkFDdEQsQ0FBQztnQkFDRixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7YUFDbEMsQ0FBQztZQUNGLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO2FBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssMEJBQVcsQ0FBQyxZQUFZLEVBQUU7WUFDaEYsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7WUFDN0MsSUFBTSxlQUFlLEdBQTBCO2dCQUM3QyxXQUFXLEVBQUUsMEJBQVcsQ0FBQyxZQUFZO2dCQUNyQyxlQUFlLEVBQUUsOEJBQWUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO2dCQUN6RCxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPO2dCQUMxQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPO2dCQUMxQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsbUJBQVcsQ0FBQzthQUNwRCxDQUFDO1lBQ0YsT0FBTyxlQUFlLENBQUM7U0FDeEI7YUFBTTtZQUNMLE1BQU0sSUFBSSxxQkFBWSxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDdEQ7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxxQ0FBZSxHQUFmO1FBQ0UsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBRUQsdUNBQWlCLEdBQWpCO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsTUFBTSxJQUFJLDhCQUFxQixDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdEQ7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxzQkFBSSx1Q0FBYzthQUFsQjtZQUNFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM5QixDQUFDO2FBRUQsVUFBbUIsQ0FBb0I7WUFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDM0IsQ0FBQzs7O09BSkE7SUFNTyw4QkFBUSxHQUFoQjtRQUNFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDL0MsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEU7YUFBTTtZQUNMLE1BQU0sSUFBSSxnQ0FBdUIsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx3Q0FBa0IsR0FBbEIsVUFBbUIsY0FBc0I7UUFDdkMsSUFBTSxHQUFHLEdBQUcsdUJBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1QyxJQUFJO1lBQ0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxxQ0FBc0IsQ0FBQywyQkFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakc7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSw4QkFBcUIsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx3Q0FBa0IsR0FBbEIsVUFBbUIsZUFBZ0M7UUFDakQsSUFBSSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILDBDQUFvQixHQUFwQjtRQUNFLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLDBCQUFXLENBQUMsYUFBYSxFQUFFO1lBQzVELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUc7b0JBQ2Q7d0JBQ0UsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDMUIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTTt3QkFDNUIsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtxQkFDNUI7aUJBQ0YsQ0FBQztnQkFFRixJQUFJLENBQUMsT0FBTyxHQUFHO29CQUNiO3dCQUNFLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSTt3QkFDcEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTTt3QkFDNUIsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtxQkFDNUI7aUJBQ0YsQ0FBQzthQUNIO1NBQ0Y7YUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLDBCQUFXLENBQUMsWUFBWSxFQUFFO1lBQ2xFLElBQUksQ0FBQyxRQUFRLEdBQUc7Z0JBQ2Q7b0JBQ0UsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZTtvQkFDdkMsS0FBSyxFQUFFLEdBQUc7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtpQkFDNUI7YUFDRixDQUFDO1lBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRztnQkFDYjtvQkFDRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ3BCLEtBQUssRUFBRSxHQUFHO29CQUNWLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7aUJBQzVCO2FBQ0YsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUNILGtCQUFDO0FBQUQsQ0FBQyxBQTNORCxDQUFpQywwQkFBZSxHQTJOL0M7QUEzTlksa0NBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCdWZmZXJSZWFkZXIsXG4gIFBheWxvYWRUeXBlLFxuICBTdGFja3NUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25TaWduZXIsXG4gIGNyZWF0ZVN0YWNrc1ByaXZhdGVLZXksXG4gIGRlc2VyaWFsaXplVHJhbnNhY3Rpb24sXG4gIGFkZHJlc3NUb1N0cmluZyxcbiAgU3RhY2tzTWVzc2FnZVR5cGUsXG4gIGNyZWF0ZVN0YWNrc1B1YmxpY0tleSxcbiAgaXNTaW5nbGVTaWcsXG4gIE11bHRpU2lnU3BlbmRpbmdDb25kaXRpb24sXG4gIGNyZWF0ZVRyYW5zYWN0aW9uQXV0aEZpZWxkLFxuICBQdWJLZXlFbmNvZGluZyxcbn0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFNpZ25pbmdFcnJvciwgUGFyc2VUcmFuc2FjdGlvbkVycm9yLCBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciwgTm90U3VwcG9ydGVkIH0gZnJvbSAnLi4vYmFzZUNvaW4vZXJyb3JzJztcbmltcG9ydCB7IEJhc2VLZXkgfSBmcm9tICcuLi9iYXNlQ29pbi9pZmFjZSc7XG5pbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IFNpZ25hdHVyZURhdGEsIFN0YWNrc0NvbnRyYWN0UGF5bG9hZCwgU3RhY2tzVHJhbnNhY3Rpb25QYXlsb2FkLCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGdldFR4U2VuZGVyQWRkcmVzcywgcmVtb3ZlSGV4UHJlZml4LCBzdHJpbmdpZnlDdiwgdW5wYWRNZW1vIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSBfc3R4VHJhbnNhY3Rpb246IFN0YWNrc1RyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHJpdmF0ZSBfc2lnSGFzaDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKGtleTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyW10gfCBLZXlQYWlyLCBzaWdIYXNoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qga2V5UGFpcnMgPSBrZXlQYWlyIGluc3RhbmNlb2YgQXJyYXkgPyBrZXlQYWlyIDogW2tleVBhaXJdO1xuICAgIGNvbnN0IHNpZ25lciA9IG5ldyBUcmFuc2FjdGlvblNpZ25lcih0aGlzLl9zdHhUcmFuc2FjdGlvbik7XG4gICAgc2lnbmVyLmNoZWNrT3ZlcnNpZ24gPSBmYWxzZTtcbiAgICBzaWduZXIuc2lnSGFzaCA9IHNpZ0hhc2ggPz8gdGhpcy5fc2lnSGFzaCA/PyB0aGlzLl9zdHhUcmFuc2FjdGlvbi52ZXJpZnlCZWdpbigpO1xuICAgIGZvciAoY29uc3Qga3Agb2Yga2V5UGFpcnMpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBrcC5nZXRLZXlzKGtwLmdldENvbXByZXNzZWQoKSk7XG4gICAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByaXZLZXkgPSBjcmVhdGVTdGFja3NQcml2YXRlS2V5KGtleXMucHJ2KTtcbiAgICAgIHNpZ25lci5zaWduT3JpZ2luKHByaXZLZXkpO1xuICAgICAgdGhpcy5fc2lnSGFzaCA9IHNpZ25lci5zaWdIYXNoO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFwcGVuZE9yaWdpbihwdWJLZXlTdHJpbmc6IHN0cmluZ1tdIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHViS2V5U3RyaW5ncyA9IHB1YktleVN0cmluZyBpbnN0YW5jZW9mIEFycmF5ID8gcHViS2V5U3RyaW5nIDogW3B1YktleVN0cmluZ107XG4gICAgY29uc3Qgc2lnbmVyOiBUcmFuc2FjdGlvblNpZ25lciA9IG5ldyBUcmFuc2FjdGlvblNpZ25lcih0aGlzLl9zdHhUcmFuc2FjdGlvbik7XG4gICAgcHViS2V5U3RyaW5ncy5mb3JFYWNoKChwdWJLZXkpID0+IHtcbiAgICAgIHNpZ25lci5hcHBlbmRPcmlnaW4oY3JlYXRlU3RhY2tzUHVibGljS2V5KHB1YktleSkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2lnbldpdGhTaWduYXR1cmVzKHNpZ25hdHVyZTogU2lnbmF0dXJlRGF0YVtdIHwgU2lnbmF0dXJlRGF0YSwgaXNNdWx0aVNpZzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHNpZ25hdHVyZXMnKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmF0dXJlcyA9IHNpZ25hdHVyZSBpbnN0YW5jZW9mIEFycmF5ID8gc2lnbmF0dXJlIDogW3NpZ25hdHVyZV07XG5cbiAgICBpZiAoIWlzTXVsdGlTaWcpIHtcbiAgICAgIHRoaXMuX3N0eFRyYW5zYWN0aW9uID0gdGhpcy5fc3R4VHJhbnNhY3Rpb24uY3JlYXRlVHhXaXRoU2lnbmF0dXJlKHNpZ25hdHVyZXNbMF0uZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGF1dGhGaWVsZHMgPSBzaWduYXR1cmVzLm1hcCgoc2lnKSA9PiBjcmVhdGVUcmFuc2FjdGlvbkF1dGhGaWVsZChQdWJLZXlFbmNvZGluZy5Db21wcmVzc2VkLCBzaWcpKTtcbiAgICAgICh0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uIGFzIE11bHRpU2lnU3BlbmRpbmdDb25kaXRpb24pLmZpZWxkcyA9IChcbiAgICAgICAgdGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbiBhcyBNdWx0aVNpZ1NwZW5kaW5nQ29uZGl0aW9uXG4gICAgICApLmZpZWxkcy5jb25jYXQoYXV0aEZpZWxkcyk7XG4gICAgfVxuICAgIGlmIChzaWduYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3NpZ0hhc2ggPSBzaWduYXR1cmVzW3NpZ25hdHVyZXMubGVuZ3RoIC0gMV0uc2lnSGFzaDtcbiAgICB9XG4gIH1cblxuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5fc3R4VHJhbnNhY3Rpb24gJiYgdGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbikge1xuICAgICAgaWYgKGlzU2luZ2xlU2lnKHRoaXMuX3N0eFRyYW5zYWN0aW9uLmF1dGguc3BlbmRpbmdDb25kaXRpb24pKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbi5zaWduYXR1cmUuZGF0YV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaWduYXR1cmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIGlmIChmaWVsZC5jb250ZW50cy50eXBlID09PSBTdGFja3NNZXNzYWdlVHlwZS5NZXNzYWdlU2lnbmF0dXJlKSB7XG4gICAgICAgICAgICBzaWduYXR1cmVzLnB1c2goZmllbGQuY29udGVudHMuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNpZ25hdHVyZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0pzb24oKSB7XG4gICAgaWYgKCF0aGlzLl9zdHhUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBUeERhdGEgPSB7XG4gICAgICBpZDogdGhpcy5fc3R4VHJhbnNhY3Rpb24udHhpZCgpLFxuICAgICAgZmVlOiB0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLmdldEZlZSgpLnRvU3RyaW5nKDEwKSxcbiAgICAgIGZyb206IGdldFR4U2VuZGVyQWRkcmVzcyh0aGlzLl9zdHhUcmFuc2FjdGlvbiksXG4gICAgICBub25jZTogdGhpcy5nZXROb25jZSgpLFxuICAgICAgcGF5bG9hZDogdGhpcy5nZXRQYXlsb2FkRGF0YSgpLFxuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGF5bG9hZERhdGEoKTogU3RhY2tzVHJhbnNhY3Rpb25QYXlsb2FkIHwgU3RhY2tzQ29udHJhY3RQYXlsb2FkIHtcbiAgICBpZiAodGhpcy5fc3R4VHJhbnNhY3Rpb24ucGF5bG9hZC5wYXlsb2FkVHlwZSA9PT0gUGF5bG9hZFR5cGUuVG9rZW5UcmFuc2Zlcikge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuX3N0eFRyYW5zYWN0aW9uLnBheWxvYWQ7XG4gICAgICBjb25zdCB0eFBheWxvYWQ6IFN0YWNrc1RyYW5zYWN0aW9uUGF5bG9hZCA9IHtcbiAgICAgICAgcGF5bG9hZFR5cGU6IFBheWxvYWRUeXBlLlRva2VuVHJhbnNmZXIsXG4gICAgICAgIC8vIHJlc3VsdC5wYXlsb2FkLm1lbW8gd2lsbCBiZSBwYWRkZWQgd2l0aCBcXHUwMDAwIHVwIHRvXG4gICAgICAgIC8vIE1FTU9fTUFYX0xFTkdUSF9CWVRFUyBhcyBkZWZpbmVkIGluIEBzdGFja3MvdHJhbnNhY3Rpb25zXG4gICAgICAgIG1lbW86IHVucGFkTWVtbyhwYXlsb2FkLm1lbW8uY29udGVudCksXG4gICAgICAgIHRvOiBhZGRyZXNzVG9TdHJpbmcoe1xuICAgICAgICAgIHR5cGU6IFN0YWNrc01lc3NhZ2VUeXBlLkFkZHJlc3MsXG4gICAgICAgICAgdmVyc2lvbjogcGF5bG9hZC5yZWNpcGllbnQuYWRkcmVzcy52ZXJzaW9uLFxuICAgICAgICAgIGhhc2gxNjA6IHBheWxvYWQucmVjaXBpZW50LmFkZHJlc3MuaGFzaDE2MC50b1N0cmluZygpLFxuICAgICAgICB9KSxcbiAgICAgICAgYW1vdW50OiBwYXlsb2FkLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICAgIHJldHVybiB0eFBheWxvYWQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zdHhUcmFuc2FjdGlvbi5wYXlsb2FkLnBheWxvYWRUeXBlID09PSBQYXlsb2FkVHlwZS5Db250cmFjdENhbGwpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLl9zdHhUcmFuc2FjdGlvbi5wYXlsb2FkO1xuICAgICAgY29uc3QgY29udHJhY3RQYXlsb2FkOiBTdGFja3NDb250cmFjdFBheWxvYWQgPSB7XG4gICAgICAgIHBheWxvYWRUeXBlOiBQYXlsb2FkVHlwZS5Db250cmFjdENhbGwsXG4gICAgICAgIGNvbnRyYWN0QWRkcmVzczogYWRkcmVzc1RvU3RyaW5nKHBheWxvYWQuY29udHJhY3RBZGRyZXNzKSxcbiAgICAgICAgY29udHJhY3ROYW1lOiBwYXlsb2FkLmNvbnRyYWN0TmFtZS5jb250ZW50LFxuICAgICAgICBmdW5jdGlvbk5hbWU6IHBheWxvYWQuZnVuY3Rpb25OYW1lLmNvbnRlbnQsXG4gICAgICAgIGZ1bmN0aW9uQXJnczogcGF5bG9hZC5mdW5jdGlvbkFyZ3MubWFwKHN0cmluZ2lmeUN2KSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gY29udHJhY3RQYXlsb2FkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdwYXlsb2FkIHR5cGUgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBpcyBuZWVkZWQgdG8gY2FsY3VsYXRlXG4gICAqIHRoZSB0cmFuc2FjdGlvbiBmZWUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHRyYW5zYWN0aW9uU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdHhUcmFuc2FjdGlvbi5zZXJpYWxpemUoKS5sZW5ndGg7XG4gIH1cblxuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fc3R4VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdHhUcmFuc2FjdGlvbi5zZXJpYWxpemUoKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICBnZXQgc3R4VHJhbnNhY3Rpb24oKTogU3RhY2tzVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zdHhUcmFuc2FjdGlvbjtcbiAgfVxuXG4gIHNldCBzdHhUcmFuc2FjdGlvbih0OiBTdGFja3NUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3N0eFRyYW5zYWN0aW9uID0gdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Tm9uY2UoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fc3R4VHJhbnNhY3Rpb24uYXV0aC5zcGVuZGluZ0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIE51bWJlcih0aGlzLl9zdHhUcmFuc2FjdGlvbi5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uLm5vbmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdzcGVuZGluZyBjb25kaXRpb24gaXMgbnVsbCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoaXMgdHJhbnNhY3Rpb24gcGF5bG9hZFxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb25cbiAgICovXG4gIGZyb21SYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKSB7XG4gICAgY29uc3QgcmF3ID0gcmVtb3ZlSGV4UHJlZml4KHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fc3R4VHJhbnNhY3Rpb24gPSBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKEJ1ZmZlclJlYWRlci5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHJhdywgJ2hleCcpKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRXJyb3IgcGFyc2luZyB0aGUgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXRcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIG9uIHRoaXMgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHRyYW5zYWN0aW9uIGpzb25cbiAgICogaWYgdGhlcmUgYXJlIG91dHB1dHMuXG4gICAqL1xuICBsb2FkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBjb25zdCB0eEpzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgIGlmICh0eEpzb24ucGF5bG9hZC5wYXlsb2FkVHlwZSA9PT0gUGF5bG9hZFR5cGUuVG9rZW5UcmFuc2Zlcikge1xuICAgICAgaWYgKHR4SnNvbi5wYXlsb2FkLnRvICYmIHR4SnNvbi5wYXlsb2FkLmFtb3VudCkge1xuICAgICAgICB0aGlzLl9vdXRwdXRzID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHR4SnNvbi5wYXlsb2FkLnRvLFxuICAgICAgICAgICAgdmFsdWU6IHR4SnNvbi5wYXlsb2FkLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0eEpzb24uZnJvbSxcbiAgICAgICAgICAgIHZhbHVlOiB0eEpzb24ucGF5bG9hZC5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR4SnNvbi5wYXlsb2FkLnBheWxvYWRUeXBlID09PSBQYXlsb2FkVHlwZS5Db250cmFjdENhbGwpIHtcbiAgICAgIHRoaXMuX291dHB1dHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0eEpzb24ucGF5bG9hZC5jb250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0eEpzb24uZnJvbSxcbiAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -99,14 +99,14 @@ export declare function isValidContractAddress(addr: string, network: StacksNetw
99
99
  */
100
100
  export declare function isValidContractFunctionName(name: string): boolean;
101
101
  /**
102
- * Pads a memo string with nulls to fill up the length
102
+ * Unpads a memo string, so it removes nulls.
103
103
  *
104
- * Useful when comparing a memo in a transaction against a string.
104
+ * Useful when memo is fill up the length. Result is becomes readable.
105
105
  *
106
106
  * @param {string} memo - the string to be validated
107
107
  * @returns {boolean} - the validation result
108
108
  */
109
- export declare function padMemo(memo: string): string;
109
+ export declare function unpadMemo(memo: string): string;
110
110
  /**
111
111
  * Generate a multisig address from multiple STX public keys
112
112
  *
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/coin/stx/utils.ts"],"names":[],"mappings":";AAIA,OAAO,EACL,eAAe,EACf,iBAAiB,EAUjB,cAAc,EAQd,YAAY,EAEb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC;AAS5B;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAyBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,CAUhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAwBrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQtD;AAYD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,OAAO,GAAG,OAAO,CAYtE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQjD;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAOpF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EAAE,EACjB,cAAc,GAAE,cAA+C,EAC/D,eAAe,GAAE,eAA+C,EAChE,kBAAkB,SAAI,GACrB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAetC;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAc9F;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA6BjE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,MAAM,CAY5E;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOpE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,YAAY,GAAG,GAAG,CAoBjD"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/coin/stx/utils.ts"],"names":[],"mappings":";AAIA,OAAO,EACL,eAAe,EACf,iBAAiB,EASjB,cAAc,EAQd,YAAY,EAEb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC;AAS5B;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAyBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,CAUhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAwBrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQtD;AAYD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,OAAO,GAAG,OAAO,CAYtE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQjD;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAOpF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EAAE,EACjB,cAAc,GAAE,cAA+C,EAC/D,eAAe,GAAE,eAA+C,EAChE,kBAAkB,SAAI,GACrB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAetC;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAc9F;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA6BjE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,MAAM,CAY5E;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOpE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,YAAY,GAAG,GAAG,CAoBjD"}
@@ -22,7 +22,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
23
  };
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.stringifyCv = exports.isValidAddressWithPaymentId = exports.normalizeAddress = exports.getAddressDetails = exports.verifySignature = exports.signMessage = exports.getSTXAddressFromPubKeys = exports.padMemo = exports.isValidContractFunctionName = exports.isValidContractAddress = exports.isValidMemo = exports.isValidRawTransaction = exports.isValidPrivateKey = exports.isValidPublicKey = exports.isValidTransactionId = exports.isValidAddress = exports.isValidAmount = exports.getTxSenderAddress = exports.removeHexPrefix = exports.bufferToHexPrefixString = void 0;
25
+ exports.stringifyCv = exports.isValidAddressWithPaymentId = exports.normalizeAddress = exports.getAddressDetails = exports.verifySignature = exports.signMessage = exports.getSTXAddressFromPubKeys = exports.unpadMemo = exports.isValidContractFunctionName = exports.isValidContractAddress = exports.isValidMemo = exports.isValidRawTransaction = exports.isValidPrivateKey = exports.isValidPublicKey = exports.isValidTransactionId = exports.isValidAddress = exports.isValidAmount = exports.getTxSenderAddress = exports.removeHexPrefix = exports.bufferToHexPrefixString = void 0;
26
26
  var querystring = __importStar(require("querystring"));
27
27
  var url = __importStar(require("url"));
28
28
  var bignumber_js_1 = __importDefault(require("bignumber.js"));
@@ -260,17 +260,20 @@ function isValidContractFunctionName(name) {
260
260
  }
261
261
  exports.isValidContractFunctionName = isValidContractFunctionName;
262
262
  /**
263
- * Pads a memo string with nulls to fill up the length
263
+ * Unpads a memo string, so it removes nulls.
264
264
  *
265
- * Useful when comparing a memo in a transaction against a string.
265
+ * Useful when memo is fill up the length. Result is becomes readable.
266
266
  *
267
267
  * @param {string} memo - the string to be validated
268
268
  * @returns {boolean} - the validation result
269
269
  */
270
- function padMemo(memo) {
271
- return memo.padEnd(transactions_1.MEMO_MAX_LENGTH_BYTES, '\u0000');
270
+ function unpadMemo(memo) {
271
+ var end = memo.indexOf('\u0000');
272
+ if (end < 0)
273
+ return memo;
274
+ return memo.slice(0, end);
272
275
  }
273
- exports.padMemo = padMemo;
276
+ exports.unpadMemo = unpadMemo;
274
277
  /**
275
278
  * Generate a multisig address from multiple STX public keys
276
279
  *
@@ -442,4 +445,4 @@ function stringifyCv(cv) {
442
445
  }
443
446
  }
444
447
  exports.stringifyCv = stringifyCv;
445
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29pbi9zdHgvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVEQUEyQztBQUMzQyx1Q0FBMkI7QUFDM0IsOERBQXFDO0FBQ3JDLDZEQUFtRTtBQUNuRSxxREFzQjhCO0FBQzlCLHFDQUE4QjtBQUU5Qix3Q0FBNEI7QUFDNUIsNkNBQThEO0FBQzlELDZDQUEwRjtBQUkxRixJQUFNLHFCQUFxQixHQUFHO0lBQzVCLFdBQVc7SUFDWCxjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLDBCQUEwQjtJQUMxQixxQkFBcUI7Q0FDdEIsQ0FBQztBQUNGOzs7OztHQUtHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsSUFBWTtJQUNsRCxPQUFPLGtDQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUZELDBEQUVDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixlQUFlLENBQUMsR0FBVztJQUN6QyxPQUFPLHFDQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUZELDBDQUVDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsMkJBQTJCLENBQ2xDLGFBQXFCLEVBQ3JCLFFBQXlCLEVBQ3pCLGtCQUFzQztJQUV0QyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztLQUNoRDtJQUVELElBQU0sT0FBTyxHQUFHLHVDQUF3QixDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3ZFLElBQU0sSUFBSSxHQUFHLHFDQUFzQixDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBTSxVQUFVLEdBQUcsOEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FB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RSxDQUFDO0tBQ2I7QUFDSCxDQUFDO0FBcEJELGtDQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5c3RyaW5nJztcbmltcG9ydCAqIGFzIHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgYnVmZmVyVG9IZXgsIHN0cmlwSGV4UHJlZml4IH0gZnJvbSAnZXRoZXJldW1qcy11dGlscy1vbGQnO1xuaW1wb3J0IHtcbiAgQWRkcmVzc0hhc2hNb2RlLFxuICBTdGFja3NUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25WZXJzaW9uLFxuICBhZGRyZXNzRnJvbVZlcnNpb25IYXNoLFxuICBhZGRyZXNzSGFzaE1vZGVUb1ZlcnNpb24sXG4gIGFkZHJlc3NUb1N0cmluZyxcbiAgdmFsaWRhdGVTdGFja3NBZGRyZXNzLFxuICBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uLFxuICBCdWZmZXJSZWFkZXIsXG4gIGNyZWF0ZU1lbW9TdHJpbmcsXG4gIE1FTU9fTUFYX0xFTkdUSF9CWVRFUyxcbiAgQWRkcmVzc1ZlcnNpb24sXG4gIGFkZHJlc3NGcm9tUHVibGljS2V5cyxcbiAgY3JlYXRlU3RhY2tzUHVibGljS2V5LFxuICBzaWduV2l0aEtleSxcbiAgY3JlYXRlU3RhY2tzUHJpdmF0ZUtleSxcbiAgUHViS2V5RW5jb2RpbmcsXG4gIHB1YmxpY0tleUZyb21TaWduYXR1cmUsXG4gIGNyZWF0ZU1lc3NhZ2VTaWduYXR1cmUsXG4gIENsYXJpdHlWYWx1ZSxcbiAgQ2xhcml0eVR5cGUsXG59IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IGVjIH0gZnJvbSAnZWxsaXB0aWMnO1xuaW1wb3J0IHsgU3RhY2tzTmV0d29yayB9IGZyb20gJ0BzdGFja3MvbmV0d29yayc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBpc1ZhbGlkWHB1YiwgaXNWYWxpZFhwcnYgfSBmcm9tICcuLi8uLi91dGlscy9jcnlwdG8nO1xuaW1wb3J0IHsgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IsIFNpZ25pbmdFcnJvciwgVXRpbHNFcnJvciB9IGZyb20gJy4uL2Jhc2VDb2luL2Vycm9ycyc7XG5pbXBvcnQgeyBBZGRyZXNzRGV0YWlscyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4nO1xuXG5jb25zdCBDb250cmFjdEZ1bmN0aW9uTmFtZXMgPSBbXG4gICdzdGFjay1zdHgnLFxuICAnZGVsZWdhdGUtc3R4JyxcbiAgJ2RlbGVnYXRlLXN0YWNrLXN0eCcsXG4gICdzdGFjay1hZ2dyZWdhdGlvbi1jb21taXQnLFxuICAncmV2b2tlLWRlbGVnYXRlLXN0eCcsXG5dO1xuLyoqXG4gKiBFbmNvZGVzIGEgYnVmZmVyIGFzIGEgXCIweFwiIHByZWZpeGVkIGxvd2VyLWNhc2UgaGV4IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZiAtIGEgYnVmZmVyIHdpdGggYSBoZXhhZGVjaW1hbCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGhleGFkZWNpbWFsIHN0cmluZyBwcmVmaXhlZCB3aXRoIFwiMHhcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVmZmVyVG9IZXhQcmVmaXhTdHJpbmcoYnVmZjogQnVmZmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1ZmZlclRvSGV4KGJ1ZmYpO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgXCIweFwiIHByZWZpeCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcsIGlmIHByZXNlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhleCAtIGEgaGV4YWRlY2ltYWwgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBoZXhhZGVjaW1hbCBzdHJpbmcgd2l0aG91dCBhIGxlYWRpbmcgXCIweFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVIZXhQcmVmaXgoaGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyaXBIZXhQcmVmaXgoaGV4KTtcbn1cblxuLyoqXG4gKiBHZXQgc3RhY2tzIGFkZHJlc3MgZnJvbSBwdWJsaWMga2V5IGhhc2hcbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gcHVibGljS2V5SGFzaCAtIGhhc2ggb2YgcHVibGljIGtleVxuICogQHBhcmFtIHtBZGRyZXNzSGFzaE1vZGV9IGhhc2hNb2RlIC0gaGFzaCBtb2RlXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uVmVyc2lvbn0gdHJhbnNhY3Rpb25WZXJzaW9uIC0gdHggdmVyc2lvblxuICogQHJldHVybnMge3N0cmluZ30gc3RhY2tzIGFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlIYXNoKFxuICBwdWJsaWNLZXlIYXNoOiBCdWZmZXIsXG4gIGhhc2hNb2RlOiBBZGRyZXNzSGFzaE1vZGUsXG4gIHRyYW5zYWN0aW9uVmVyc2lvbjogVHJhbnNhY3Rpb25WZXJzaW9uLFxuKTogc3RyaW5nIHtcbiAgaWYgKHB1YmxpY0tleUhhc2gubGVuZ3RoICE9PSAyMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgMjAtYnl0ZSBwdWJrZXloYXNoJyk7XG4gIH1cblxuICBjb25zdCBhZGRyVmVyID0gYWRkcmVzc0hhc2hNb2RlVG9WZXJzaW9uKGhhc2hNb2RlLCB0cmFuc2FjdGlvblZlcnNpb24pO1xuICBjb25zdCBhZGRyID0gYWRkcmVzc0Zyb21WZXJzaW9uSGFzaChhZGRyVmVyLCBwdWJsaWNLZXlIYXNoLnRvU3RyaW5nKCdoZXgnKSk7XG4gIGNvbnN0IGFkZHJTdHJpbmcgPSBhZGRyZXNzVG9TdHJpbmcoYWRkcik7XG4gIHJldHVybiBhZGRyU3RyaW5nO1xufVxuXG4vKipcbiAqIEBwYXJhbSB0eFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHhTZW5kZXJBZGRyZXNzKHR4OiBTdGFja3NUcmFuc2FjdGlvbik6IHN0cmluZyB7XG4gIGlmICh0eC5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uICE9PSBudWxsICYmIHR4LmF1dGguc3BlbmRpbmdDb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHNwZW5kaW5nQ29uZGl0aW9uID0gdHguYXV0aC5zcGVuZGluZ0NvbmRpdGlvbjtcbiAgICBjb25zdCB0eFNlbmRlciA9IGdldEFkZHJlc3NGcm9tUHVibGljS2V5SGFzaChcbiAgICAgIEJ1ZmZlci5mcm9tKHNwZW5kaW5nQ29uZGl0aW9uLnNpZ25lciwgJ2hleCcpLFxuICAgICAgc3BlbmRpbmdDb25kaXRpb24uaGFzaE1vZGUgYXMgbnVtYmVyLFxuICAgICAgdHgudmVyc2lvbixcbiAgICApO1xuICAgIHJldHVybiB0eFNlbmRlcjtcbiAgfSBlbHNlIHRocm93IG5ldyBFcnJvcignc3BlbmRpbmdDb25kaXRpb24gc2hvdWxkIG5vdCBiZSBudWxsJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG51bWJlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSB0aGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDApO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHByb3RvY29sIGFkZHJlc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIHRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbGlkYXRlU3RhY2tzQWRkcmVzcyhhZGRyZXNzKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBwcm90b2NvbCB0cmFuc2FjdGlvbiBpZCBvciBub3QuXG4gKlxuICogQSB2YWxpZCB0cmFuc2FjdGlvbiBpZCBpcyBhIFNIQS01MTIvMjU2IGhhc2ggb2YgYSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uOyBzZWVcbiAqIHRoZSB0eGlkRnJvbURhdGEgZnVuY3Rpb24gaW4gQHN0YWNrcy90cmFuc2FjdGlvbjpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibG9ja3N0YWNrL3N0YWNrcy5qcy9ibG9iL21hc3Rlci9wYWNrYWdlcy90cmFuc2FjdGlvbnMvc3JjL3V0aWxzLnRzI0w5N1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eElkIC0gdGhlIHRyYW5zYWN0aW9uIGlkIHRvIGJlIHZhbGlkYXRlZFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHR4SWQubGVuZ3RoICE9PSA2NCAmJiB0eElkLmxlbmd0aCAhPT0gNjYpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgbm9QcmVmaXggPSByZW1vdmVIZXhQcmVmaXgodHhJZCk7XG4gIGlmIChub1ByZWZpeC5sZW5ndGggIT09IDY0KSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGFsbEhleENoYXJzKG5vUHJlZml4KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBwcm90b2NvbCBwdWJsaWMga2V5IG9yXG4gKiBleHRlbmRlZCBwdWJsaWMga2V5LlxuICpcbiAqIFRoZSBrZXkgZm9ybWF0IGlzIGRvY3VtZW50ZWQgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFja3Nnb3Yvc2lwcy9ibG9iL21haW4vc2lwcy9zaXAtMDA1L3NpcC0wMDUtYmxvY2tzLWFuZC10cmFuc2FjdGlvbnMubWQjdHJhbnNhY3Rpb24tYXV0aG9yaXphdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwdWIgLSB0aGUgIHB1YmxpYyBrZXkgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzVmFsaWRYcHViKHB1YikpIHJldHVybiB0cnVlO1xuXG4gIGlmIChwdWIubGVuZ3RoICE9PSA2NiAmJiBwdWIubGVuZ3RoICE9PSAxMzApIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBmaXJzdEJ5dGUgPSBwdWIuc2xpY2UoMCwgMik7XG5cbiAgLy8gdW5jb21wcmVzc2VkIHB1YmxpYyBrZXlcbiAgaWYgKHB1Yi5sZW5ndGggPT09IDEzMCAmJiBmaXJzdEJ5dGUgIT09ICcwNCcpIHJldHVybiBmYWxzZTtcblxuICAvLyBjb21wcmVzc2VkIHB1YmxpYyBrZXlcbiAgaWYgKHB1Yi5sZW5ndGggPT09IDY2ICYmIGZpcnN0Qnl0ZSAhPT0gJzAyJyAmJiBmaXJzdEJ5dGUgIT09ICcwMycpIHJldHVybiBmYWxzZTtcblxuICBpZiAoIWFsbEhleENoYXJzKHB1YikpIHJldHVybiBmYWxzZTtcblxuICAvLyB2YWxpZGF0ZSB0aGUgcHVibGljIGtleVxuICBjb25zdCBzZWNwMjU2azEgPSBuZXcgZWMoJ3NlY3AyNTZrMScpO1xuICB0cnkge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWNwMjU2azEua2V5RnJvbVB1YmxpYyhCdWZmZXIuZnJvbShwdWIsICdoZXgnKSk7XG4gICAgY29uc3QgeyByZXN1bHQgfSA9IGtleVBhaXIudmFsaWRhdGUoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgcHJvdG9jb2wgcHJpdmF0ZSBrZXksIG9yIGV4dGVuZGVkXG4gKiBwcml2YXRlIGtleS5cbiAqXG4gKiBUaGUgcHJvdG9jb2wga2V5IGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlIEBzdGFja3MvdHJhbnNhY3Rpb25zIG5wbSBwYWNrYWdlLCBpbiB0aGVcbiAqIGNyZWF0ZVN0YWNrc1ByaXZhdGVLZXkgZnVuY3Rpb246XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmxvY2tzdGFjay9zdGFja3MuanMvYmxvYi9tYXN0ZXIvcGFja2FnZXMvdHJhbnNhY3Rpb25zL3NyYy9rZXlzLnRzI0wxMjVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJ2IC0gdGhlIHByaXZhdGUga2V5IChvciBleHRlbmRlZCBwcml2YXRlIGtleSkgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQcml2YXRlS2V5KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc1ZhbGlkWHBydihwcnYpKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAocHJ2Lmxlbmd0aCAhPT0gNjQgJiYgcHJ2Lmxlbmd0aCAhPT0gNjYpIHJldHVybiBmYWxzZTtcblxuICBpZiAocHJ2Lmxlbmd0aCA9PT0gNjYgJiYgcHJ2LnNsaWNlKDY0KSAhPT0gJzAxJykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBhbGxIZXhDaGFycyhwcnYpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIGNvbXBvc2VkIG9mIGhleCBjaGFycyBvbmx5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1heWJlIC0gdGhlICBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZnVuY3Rpb24gYWxsSGV4Q2hhcnMobWF5YmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL14oWzAtOWEtZl0pKyQvaS50ZXN0KG1heWJlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgcmF3IHRyYW5zYWN0aW9uIGNhbiBiZSBkZXNlcmlhbGl6ZWRcbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHJhd1RyYW5zYWN0aW9uIC0gdHJhbnNhY3Rpb24gaW4gcmF3IGhleCBmb3JtYXRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiByYXdUcmFuc2FjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRlc2VyaWFsaXplVHJhbnNhY3Rpb24oQnVmZmVyUmVhZGVyLmZyb21CdWZmZXIoQnVmZmVyLmZyb20ocmVtb3ZlSGV4UHJlZml4KHJhd1RyYW5zYWN0aW9uKSwgJ2hleCcpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtZW1vIHN0cmluZyBpcyB2YWxpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZW1vIC0gdGhlIHN0cmluZyB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lbW8obWVtbzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY3JlYXRlTWVtb1N0cmluZyhtZW1vKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgdmFsaWQgY29udHJhY3QgYWRkcmVzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyIC0gY29udHJhY3QgZGVwbG95ZXIgYWRkcmVzc1xuICogQHBhcmFtIHtTdGFja3NOZXR3b3JrfSBuZXR3b3JrIC0gbmV0d29yayBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZENvbnRyYWN0QWRkcmVzcyhhZGRyOiBzdHJpbmcsIG5ldHdvcms6IFN0YWNrc05ldHdvcmspOiBib29sZWFuIHtcbiAgaWYgKG5ldHdvcmsuaXNNYWlubmV0KCkpIHtcbiAgICByZXR1cm4gYWRkciA9PT0gJ1NQMDAwMDAwMDAwMDAwMDAwMDAwMDAyUTZWRjc4JztcbiAgfSBlbHNlIGlmIChuZXR3b3JrLnZlcnNpb24gPT09IFRyYW5zYWN0aW9uVmVyc2lvbi5UZXN0bmV0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdOZXR3b3JrIHNob3VsZCBiZSBlaXRoZXIgTWFpbm5ldCBvciBUZXN0bmV0Jyk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIG5hbWUgaXMgb25lIG9mIHZhbGlkIGNvbnRyYWN0IG5hbWVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBmdW5jdGlvbiBuYW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZENvbnRyYWN0RnVuY3Rpb25OYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gQ29udHJhY3RGdW5jdGlvbk5hbWVzLmluY2x1ZGVzKG5hbWUpO1xufVxuXG4vKipcbiAqIFBhZHMgYSBtZW1vIHN0cmluZyB3aXRoIG51bGxzIHRvIGZpbGwgdXAgdGhlIGxlbmd0aFxuICpcbiAqIFVzZWZ1bCB3aGVuIGNvbXBhcmluZyBhIG1lbW8gaW4gYSB0cmFuc2FjdGlvbiBhZ2FpbnN0IGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZW1vIC0gdGhlIHN0cmluZyB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkTWVtbyhtZW1vOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbWVtby5wYWRFbmQoTUVNT19NQVhfTEVOR1RIX0JZVEVTLCAnXFx1MDAwMCcpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgbXVsdGlzaWcgYWRkcmVzcyBmcm9tIG11bHRpcGxlIFNUWCBwdWJsaWMga2V5c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IHB1YktleXMgLSBsaXN0IG9mIHB1YmxpYyBrZXlzIGFzIHN0cmluZ3NcbiAqIEBwYXJhbSB7QWRkcmVzc1ZlcnNpb259IGFkZHJlc3NWZXJzaW9uIC0gTWFpbm5ldE11bHRpU2lnLCBUZXN0bmV0TXVsdGlTaWdcbiAqIEBwYXJhbSB7QWRkcmVzc0hhc2hNb2RlfSBhZGRyZXNzSGFzaE1vZGUgLSBTZXJpYWxpemVQMlNIXG4gKiBAcGFyYW0ge251bWJlcn0gW3NpZ25hdHVyZXNSZXF1aXJlZF0gLSBudW1iZXIgb2Ygc2lnbmF0dXJlcyByZXF1aXJlZCwgZGVmYXVsdCB2YWx1ZSBpdHMgMlxuICogQHJldHVybnMge2FkZHJlc3M6IHN0cmluZywgaGFzaDE2MDogc3RyaW5nfSAtIGEgbXVsdGlzaWcgYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U1RYQWRkcmVzc0Zyb21QdWJLZXlzKFxuICBwdWJLZXlzOiBzdHJpbmdbXSxcbiAgYWRkcmVzc1ZlcnNpb246IEFkZHJlc3NWZXJzaW9uID0gQWRkcmVzc1ZlcnNpb24uTWFpbm5ldE11bHRpU2lnLFxuICBhZGRyZXNzSGFzaE1vZGU6IEFkZHJlc3NIYXNoTW9kZSA9IEFkZHJlc3NIYXNoTW9kZS5TZXJpYWxpemVQMlNILFxuICBzaWduYXR1cmVzUmVxdWlyZWQgPSAyLFxuKTogeyBhZGRyZXNzOiBzdHJpbmc7IGhhc2gxNjA6IHN0cmluZyB9IHtcbiAgaWYgKHB1YktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG51bWJlciBvZiBwdWJsaWMga2V5cycpO1xuICB9XG4gIGlmICghcHViS2V5cy5ldmVyeShpc1ZhbGlkUHVibGljS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJsaWMga2V5cycpO1xuICB9XG4gIGlmIChzaWduYXR1cmVzUmVxdWlyZWQgPiBwdWJLZXlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTnVtYmVyIG9mIHNpZ25hdHVyZXMgcmVxdWlyZWQgbXVzdCBiZSBsb3dlciBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIFB1YmxpYyBLZXlzJyk7XG4gIH1cblxuICBjb25zdCBzdHhQdWJLZXlzID0gcHViS2V5cy5tYXAoY3JlYXRlU3RhY2tzUHVibGljS2V5KTtcbiAgY29uc3QgYWRkcmVzcyA9IGFkZHJlc3NGcm9tUHVibGljS2V5cyhhZGRyZXNzVmVyc2lvbiwgYWRkcmVzc0hhc2hNb2RlLCBzaWduYXR1cmVzUmVxdWlyZWQsIHN0eFB1YktleXMpO1xuXG4gIHJldHVybiB7IGFkZHJlc3M6IGFkZHJlc3NUb1N0cmluZyhhZGRyZXNzKSwgaGFzaDE2MDogYWRkcmVzcy5oYXNoMTYwIH07XG59XG5cbi8qKlxuICogc2lnbnMgYSBzdHJpbmcgbWVzc2FnZVxuICpcbiAqIEBwYXJhbSBrZXlQYWlyXG4gKiBAcGFyYW0gZGF0YSAgLSBtZXNzYWdlIHRvIGJlIHNpZ25lZFxuICogQHJldHVybnMgc2lnbmVkIG1lc3NhZ2Ugc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduTWVzc2FnZShrZXlQYWlyOiBLZXlQYWlyLCBkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcnYgPSBrZXlQYWlyLmdldEtleXMoKS5wcnY7XG4gIGlmIChwcnYpIHtcbiAgICByZXR1cm4gc2lnbldpdGhLZXkoY3JlYXRlU3RhY2tzUHJpdmF0ZUtleShwcnYpLCBkYXRhKS5kYXRhO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgc2lnbmVkIG1lc3NhZ2VcbiAqXG4gKiBUaGUgc2lnbmF0dXJlIG11c3QgYmUgMTMwIGJ5dGVzIGxvbmcgLS0gc2VlIFJFQ09WRVJBQkxFX0VDRFNBX1NJR19MRU5HVEhfQllURVNcbiAqIGluIEBzdGFja3MvdHJhbnNhY3Rpb25zL3NyYy9jb25zdGFudHMudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIG1lc3NhZ2UgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgLSBzaWduYXR1cmUgdG8gdmVyaWZ5XG4gKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5IC0gcHVibGljIGtleSBhcyBoZXggc3RyaW5nIHVzZWQgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHZlcmlmaWNhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShtZXNzYWdlOiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXRoaXMuaXNWYWxpZFB1YmxpY0tleShwdWJsaWNLZXkpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChzaWduYXR1cmUubGVuZ3RoICE9PSAxMzApIHJldHVybiBmYWxzZTtcbiAgaWYgKCFhbGxIZXhDaGFycyhzaWduYXR1cmUpKSB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBzaWduYXR1cmUgaW5wdXQgdG8gdmVyaWZ5U2lnbmF0dXJlJyk7XG4gIGlmIChfLmlzRW1wdHkobWVzc2FnZSkpIHRocm93IG5ldyBVdGlsc0Vycm9yKCdDYW5ub3QgdmVyaWZ5IGVtcHR5IG1lc3NhZ2VzJyk7XG5cbiAgLy8gcHJvdmlkZWQgcHVibGljS2V5IGNhbiBiZSBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZFxuICBjb25zdCBrZXlFbmNvZGluZyA9IHB1YmxpY0tleS5sZW5ndGggPT09IDY2ID8gUHViS2V5RW5jb2RpbmcuQ29tcHJlc3NlZCA6IFB1YktleUVuY29kaW5nLlVuY29tcHJlc3NlZDtcblxuICBjb25zdCBtZXNzYWdlU2lnID0gY3JlYXRlTWVzc2FnZVNpZ25hdHVyZShzaWduYXR1cmUpO1xuXG4gIGNvbnN0IGZvdW5kS2V5ID0gcHVibGljS2V5RnJvbVNpZ25hdHVyZShtZXNzYWdlLCBtZXNzYWdlU2lnLCBrZXlFbmNvZGluZyk7XG5cbiAgcmV0dXJuIGZvdW5kS2V5ID09PSBwdWJsaWNLZXk7XG59XG5cbi8qKlxuICogUHJvY2VzcyBhZGRyZXNzIGludG8gYWRkcmVzcyBhbmQgbWVtbyBpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIHRoZSBhZGRyZXNzIHRvIHByb2Nlc3NcbiAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCBjb250YWluaW5nIGFkZHJlc3MgYW5kIG1lbW8gaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZHJlc3NEZXRhaWxzKGFkZHJlc3M6IHN0cmluZyk6IEFkZHJlc3NEZXRhaWxzIHtcbiAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSB1cmwucGFyc2UoYWRkcmVzcyk7XG4gIGNvbnN0IHF1ZXJ5RGV0YWlscyA9IGFkZHJlc3NEZXRhaWxzLnF1ZXJ5ID8gcXVlcnlzdHJpbmcucGFyc2UoYWRkcmVzc0RldGFpbHMucXVlcnkpIDoge307XG4gIGNvbnN0IGJhc2VBZGRyZXNzID0gPHN0cmluZz5hZGRyZXNzRGV0YWlscy5wYXRobmFtZTtcbiAgaWYgKCFpc1ZhbGlkQWRkcmVzcyhiYXNlQWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gIH1cbiAgLy8gYWRkcmVzcyBkb2Vzbid0IGhhdmUgYSBtZW1vIGlkXG4gIGlmIChiYXNlQWRkcmVzcyA9PT0gYWRkcmVzcykge1xuICAgIHJldHVybiB7XG4gICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgbWVtb0lkOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHF1ZXJ5RGV0YWlscy5tZW1vSWQpKSB7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG1vcmUgcHJvcGVydGllcywgdGhlIHF1ZXJ5IGRldGFpbHMgbmVlZCB0byBjb250YWluIHRoZSBtZW1vIGlkIHByb3BlcnR5XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoYGludmFsaWQgYWRkcmVzcyB3aXRoIG1lbW8gaWQ6ICR7YWRkcmVzc31gKTtcbiAgfVxuICBjb25zdCBtZW1vSWQgPSA8c3RyaW5nPnF1ZXJ5RGV0YWlscy5tZW1vSWQ7XG4gIGNvbnN0IGludE1lbW9JZCA9IHBhcnNlSW50KG1lbW9JZCwgMTApO1xuICBpZiAoaXNOYU4oaW50TWVtb0lkKSB8fCBpbnRNZW1vSWQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG1lbW8gaWQ6ICR7bWVtb0lkfWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhZGRyZXNzOiBiYXNlQWRkcmVzcyxcbiAgICBtZW1vSWQsXG4gIH07XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHJldHVybiBhZGRyZXNzIHdpdGggYXBwZW5kZWQgbWVtbyBpZFxuICpcbiAqIEBwYXJhbSB7QWRkcmVzc0RldGFpbHN9IGFkZHJlc3NEZXRhaWxzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhZGRyZXNzIHdpdGggbWVtbyBpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQWRkcmVzcyh7IGFkZHJlc3MsIG1lbW9JZCB9OiBBZGRyZXNzRGV0YWlscyk6IHN0cmluZyB7XG4gIGlmICghaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKG1lbW9JZCkpIHtcbiAgICBjb25zdCBpbnRNZW1vSWQgPSBwYXJzZUludChtZW1vSWQsIDEwKTtcbiAgICBpZiAoaXNOYU4oaW50TWVtb0lkKSB8fCBpbnRNZW1vSWQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbWVtbyBpZDogJHttZW1vSWR9YCk7XG4gICAgfVxuICAgIHJldHVybiBgJHthZGRyZXNzfT9tZW1vSWQ9JHttZW1vSWR9YDtcbiAgfVxuICByZXR1cm4gYWRkcmVzcztcbn1cblxuLyoqXG4gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgYSB2YWxpZCBhZGRyZXNzIHdpdGggbWVtbyBpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIGFkZHJlc3MgaW4gdGhlIGZvcm0gPGFkZHJlc3M+P21lbW9JZD08bWVtb0lkPlxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaXMgaW5wdXQgaXMgYSB2YWxpZCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQWRkcmVzc1dpdGhQYXltZW50SWQoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBnZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzKTtcbiAgICByZXR1cm4gYWRkcmVzcyA9PT0gbm9ybWFsaXplQWRkcmVzcyhhZGRyZXNzRGV0YWlscyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNsYXJpdHkgdmFsdWUgaW5wdXRcbiAqXG4gKiBAcGFyYW0ge0NsYXJpdHlWYWx1ZX0gY3YgY2xhcml0eSB2YWx1ZSBmdW5jdGlvbiBhcmd1bWVudFxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5naWZpZWQgY2xhcml0eSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5Q3YoY3Y6IENsYXJpdHlWYWx1ZSk6IGFueSB7XG4gIHN3aXRjaCAoY3YudHlwZSkge1xuICAgIGNhc2UgQ2xhcml0eVR5cGUuSW50OlxuICAgIGNhc2UgQ2xhcml0eVR5cGUuVUludDpcbiAgICAgIHJldHVybiB7IHR5cGU6IGN2LnR5cGUsIHZhbHVlOiBjdi52YWx1ZS50b1N0cmluZygpIH07XG4gICAgY2FzZSBDbGFyaXR5VHlwZS5PcHRpb25hbFNvbWU6XG4gICAgICByZXR1cm4geyB0eXBlOiBjdi50eXBlLCB2YWx1ZTogc3RyaW5naWZ5Q3YoY3YudmFsdWUpIH07XG4gICAgY2FzZSBDbGFyaXR5VHlwZS5UdXBsZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGN2LnR5cGUsXG4gICAgICAgIGRhdGE6IF8ubWFwVmFsdWVzKGN2LmRhdGEsICh2YWx1ZSkgPT4gc3RyaW5naWZ5Q3YodmFsdWUpKSxcbiAgICAgIH07XG4gICAgY2FzZSBDbGFyaXR5VHlwZS5MaXN0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogY3YudHlwZSxcbiAgICAgICAgbGlzdDogY3YubGlzdC5tYXAoc3RyaW5naWZ5Q3YpLFxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGN2O1xuICB9XG59XG4iXX0=
448
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29pbi9zdHgvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVEQUEyQztBQUMzQyx1Q0FBMkI7QUFDM0IsOERBQXFDO0FBQ3JDLDZEQUFtRTtBQUNuRSxxREFxQjhCO0FBQzlCLHFDQUE4QjtBQUU5Qix3Q0FBNEI7QUFDNUIsNkNBQThEO0FBQzlELDZDQUEwRjtBQUkxRixJQUFNLHFCQUFxQixHQUFHO0lBQzVCLFdBQVc7SUFDWCxjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLDBCQUEwQjtJQUMxQixxQkFBcUI7Q0FDdEIsQ0FBQztBQUNGOzs7OztHQUtHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsSUFBWTtJQUNsRCxPQUFPLGtDQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUZELDBEQUVDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixlQUFlLENBQUMsR0FBVztJQUN6QyxPQUFPLHFDQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUZELDBDQUVDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsMkJBQTJCLENBQ2xDLGFBQXFCLEVBQ3JCLFFBQXlCLEVBQ3pCLGtCQUFzQztJQUV0QyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztLQUNoRDtJQUVELElBQU0sT0FBTyxHQUFHLHVDQUF3QixDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3ZFLElBQU0sSUFBSSxHQUFHLHFDQUFzQixDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBTSxVQUFVLEdBQUcsOEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FB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RUFBRSxDQUFDLElBQUk7Z0JBQ2IsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQzthQUMvQixDQUFDO1FBQ0o7WUFDRSxPQUFPLEVBQUUsQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQXBCRCxrQ0FvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBxdWVyeXN0cmluZyBmcm9tICdxdWVyeXN0cmluZyc7XG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAndXJsJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IGJ1ZmZlclRvSGV4LCBzdHJpcEhleFByZWZpeCB9IGZyb20gJ2V0aGVyZXVtanMtdXRpbHMtb2xkJztcbmltcG9ydCB7XG4gIEFkZHJlc3NIYXNoTW9kZSxcbiAgU3RhY2tzVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uVmVyc2lvbixcbiAgYWRkcmVzc0Zyb21WZXJzaW9uSGFzaCxcbiAgYWRkcmVzc0hhc2hNb2RlVG9WZXJzaW9uLFxuICBhZGRyZXNzVG9TdHJpbmcsXG4gIHZhbGlkYXRlU3RhY2tzQWRkcmVzcyxcbiAgZGVzZXJpYWxpemVUcmFuc2FjdGlvbixcbiAgQnVmZmVyUmVhZGVyLFxuICBjcmVhdGVNZW1vU3RyaW5nLFxuICBBZGRyZXNzVmVyc2lvbixcbiAgYWRkcmVzc0Zyb21QdWJsaWNLZXlzLFxuICBjcmVhdGVTdGFja3NQdWJsaWNLZXksXG4gIHNpZ25XaXRoS2V5LFxuICBjcmVhdGVTdGFja3NQcml2YXRlS2V5LFxuICBQdWJLZXlFbmNvZGluZyxcbiAgcHVibGljS2V5RnJvbVNpZ25hdHVyZSxcbiAgY3JlYXRlTWVzc2FnZVNpZ25hdHVyZSxcbiAgQ2xhcml0eVZhbHVlLFxuICBDbGFyaXR5VHlwZSxcbn0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgZWMgfSBmcm9tICdlbGxpcHRpYyc7XG5pbXBvcnQgeyBTdGFja3NOZXR3b3JrIH0gZnJvbSAnQHN0YWNrcy9uZXR3b3JrJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGlzVmFsaWRYcHViLCBpc1ZhbGlkWHBydiB9IGZyb20gJy4uLy4uL3V0aWxzL2NyeXB0byc7XG5pbXBvcnQgeyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvciwgU2lnbmluZ0Vycm9yLCBVdGlsc0Vycm9yIH0gZnJvbSAnLi4vYmFzZUNvaW4vZXJyb3JzJztcbmltcG9ydCB7IEFkZHJlc3NEZXRhaWxzIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLic7XG5cbmNvbnN0IENvbnRyYWN0RnVuY3Rpb25OYW1lcyA9IFtcbiAgJ3N0YWNrLXN0eCcsXG4gICdkZWxlZ2F0ZS1zdHgnLFxuICAnZGVsZWdhdGUtc3RhY2stc3R4JyxcbiAgJ3N0YWNrLWFnZ3JlZ2F0aW9uLWNvbW1pdCcsXG4gICdyZXZva2UtZGVsZWdhdGUtc3R4Jyxcbl07XG4vKipcbiAqIEVuY29kZXMgYSBidWZmZXIgYXMgYSBcIjB4XCIgcHJlZml4ZWQgbG93ZXItY2FzZSBoZXggc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmIC0gYSBidWZmZXIgd2l0aCBhIGhleGFkZWNpbWFsIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgaGV4YWRlY2ltYWwgc3RyaW5nIHByZWZpeGVkIHdpdGggXCIweFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJUb0hleFByZWZpeFN0cmluZyhidWZmOiBCdWZmZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYnVmZmVyVG9IZXgoYnVmZik7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBcIjB4XCIgcHJlZml4IGZyb20gdGhlIGdpdmVuIHN0cmluZywgaWYgcHJlc2VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaGV4IC0gYSBoZXhhZGVjaW1hbCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGhleGFkZWNpbWFsIHN0cmluZyB3aXRob3V0IGEgbGVhZGluZyBcIjB4XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUhleFByZWZpeChoZXg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHJpcEhleFByZWZpeChoZXgpO1xufVxuXG4vKipcbiAqIEdldCBzdGFja3MgYWRkcmVzcyBmcm9tIHB1YmxpYyBrZXkgaGFzaFxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBwdWJsaWNLZXlIYXNoIC0gaGFzaCBvZiBwdWJsaWMga2V5XG4gKiBAcGFyYW0ge0FkZHJlc3NIYXNoTW9kZX0gaGFzaE1vZGUgLSBoYXNoIG1vZGVcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25WZXJzaW9ufSB0cmFuc2FjdGlvblZlcnNpb24gLSB0eCB2ZXJzaW9uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBzdGFja3MgYWRkcmVzc1xuICovXG5mdW5jdGlvbiBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleUhhc2goXG4gIHB1YmxpY0tleUhhc2g6IEJ1ZmZlcixcbiAgaGFzaE1vZGU6IEFkZHJlc3NIYXNoTW9kZSxcbiAgdHJhbnNhY3Rpb25WZXJzaW9uOiBUcmFuc2FjdGlvblZlcnNpb24sXG4pOiBzdHJpbmcge1xuICBpZiAocHVibGljS2V5SGFzaC5sZW5ndGggIT09IDIwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCAyMC1ieXRlIHB1YmtleWhhc2gnKTtcbiAgfVxuXG4gIGNvbnN0IGFkZHJWZXIgPSBhZGRyZXNzSGFzaE1vZGVUb1ZlcnNpb24oaGFzaE1vZGUsIHRyYW5zYWN0aW9uVmVyc2lvbik7XG4gIGNvbnN0IGFkZHIgPSBhZGRyZXNzRnJvbVZlcnNpb25IYXNoKGFkZHJWZXIsIHB1YmxpY0tleUhhc2gudG9TdHJpbmcoJ2hleCcpKTtcbiAgY29uc3QgYWRkclN0cmluZyA9IGFkZHJlc3NUb1N0cmluZyhhZGRyKTtcbiAgcmV0dXJuIGFkZHJTdHJpbmc7XG59XG5cbi8qKlxuICogQHBhcmFtIHR4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeFNlbmRlckFkZHJlc3ModHg6IFN0YWNrc1RyYW5zYWN0aW9uKTogc3RyaW5nIHtcbiAgaWYgKHR4LmF1dGguc3BlbmRpbmdDb25kaXRpb24gIT09IG51bGwgJiYgdHguYXV0aC5zcGVuZGluZ0NvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc3BlbmRpbmdDb25kaXRpb24gPSB0eC5hdXRoLnNwZW5kaW5nQ29uZGl0aW9uO1xuICAgIGNvbnN0IHR4U2VuZGVyID0gZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlIYXNoKFxuICAgICAgQnVmZmVyLmZyb20oc3BlbmRpbmdDb25kaXRpb24uc2lnbmVyLCAnaGV4JyksXG4gICAgICBzcGVuZGluZ0NvbmRpdGlvbi5oYXNoTW9kZSBhcyBudW1iZXIsXG4gICAgICB0eC52ZXJzaW9uLFxuICAgICk7XG4gICAgcmV0dXJuIHR4U2VuZGVyO1xuICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKCdzcGVuZGluZ0NvbmRpdGlvbiBzaG91bGQgbm90IGJlIG51bGwnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBhbW91bnQgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFtb3VudChhbW91bnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCk7XG4gIHJldHVybiBiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgJiYgYmlnTnVtYmVyQW1vdW50LmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgcHJvdG9jb2wgYWRkcmVzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gdGhlIGFkZHJlc3MgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsaWRhdGVTdGFja3NBZGRyZXNzKGFkZHJlc3MpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHByb3RvY29sIHRyYW5zYWN0aW9uIGlkIG9yIG5vdC5cbiAqXG4gKiBBIHZhbGlkIHRyYW5zYWN0aW9uIGlkIGlzIGEgU0hBLTUxMi8yNTYgaGFzaCBvZiBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb247IHNlZVxuICogdGhlIHR4aWRGcm9tRGF0YSBmdW5jdGlvbiBpbiBAc3RhY2tzL3RyYW5zYWN0aW9uOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2Jsb2Nrc3RhY2svc3RhY2tzLmpzL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3RyYW5zYWN0aW9ucy9zcmMvdXRpbHMudHMjTDk3XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR4SWQgLSB0aGUgdHJhbnNhY3Rpb24gaWQgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodHhJZC5sZW5ndGggIT09IDY0ICYmIHR4SWQubGVuZ3RoICE9PSA2NikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBub1ByZWZpeCA9IHJlbW92ZUhleFByZWZpeCh0eElkKTtcbiAgaWYgKG5vUHJlZml4Lmxlbmd0aCAhPT0gNjQpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gYWxsSGV4Q2hhcnMobm9QcmVmaXgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHByb3RvY29sIHB1YmxpYyBrZXkgb3JcbiAqIGV4dGVuZGVkIHB1YmxpYyBrZXkuXG4gKlxuICogVGhlIGtleSBmb3JtYXQgaXMgZG9jdW1lbnRlZCBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL3N0YWNrc2dvdi9zaXBzL2Jsb2IvbWFpbi9zaXBzL3NpcC0wMDUvc2lwLTAwNS1ibG9ja3MtYW5kLXRyYW5zYWN0aW9ucy5tZCN0cmFuc2FjdGlvbi1hdXRob3JpemF0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHB1YiAtIHRoZSAgcHVibGljIGtleSB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFB1YmxpY0tleShwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoaXNWYWxpZFhwdWIocHViKSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHB1Yi5sZW5ndGggIT09IDY2ICYmIHB1Yi5sZW5ndGggIT09IDEzMCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGZpcnN0Qnl0ZSA9IHB1Yi5zbGljZSgwLCAyKTtcblxuICAvLyB1bmNvbXByZXNzZWQgcHVibGljIGtleVxuICBpZiAocHViLmxlbmd0aCA9PT0gMTMwICYmIGZpcnN0Qnl0ZSAhPT0gJzA0JykgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIGNvbXByZXNzZWQgcHVibGljIGtleVxuICBpZiAocHViLmxlbmd0aCA9PT0gNjYgJiYgZmlyc3RCeXRlICE9PSAnMDInICYmIGZpcnN0Qnl0ZSAhPT0gJzAzJykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICghYWxsSGV4Q2hhcnMocHViKSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIHZhbGlkYXRlIHRoZSBwdWJsaWMga2V5XG4gIGNvbnN0IHNlY3AyNTZrMSA9IG5ldyBlYygnc2VjcDI1NmsxJyk7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5UGFpciA9IHNlY3AyNTZrMS5rZXlGcm9tUHVibGljKEJ1ZmZlci5mcm9tKHB1YiwgJ2hleCcpKTtcbiAgICBjb25zdCB7IHJlc3VsdCB9ID0ga2V5UGFpci52YWxpZGF0ZSgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBwcm90b2NvbCBwcml2YXRlIGtleSwgb3IgZXh0ZW5kZWRcbiAqIHByaXZhdGUga2V5LlxuICpcbiAqIFRoZSBwcm90b2NvbCBrZXkgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiB0aGUgQHN0YWNrcy90cmFuc2FjdGlvbnMgbnBtIHBhY2thZ2UsIGluIHRoZVxuICogY3JlYXRlU3RhY2tzUHJpdmF0ZUtleSBmdW5jdGlvbjpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibG9ja3N0YWNrL3N0YWNrcy5qcy9ibG9iL21hc3Rlci9wYWNrYWdlcy90cmFuc2FjdGlvbnMvc3JjL2tleXMudHMjTDEyNVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgKG9yIGV4dGVuZGVkIHByaXZhdGUga2V5KSB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByaXZhdGVLZXkocHJ2OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzVmFsaWRYcHJ2KHBydikpIHJldHVybiB0cnVlO1xuXG4gIGlmIChwcnYubGVuZ3RoICE9PSA2NCAmJiBwcnYubGVuZ3RoICE9PSA2NikgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChwcnYubGVuZ3RoID09PSA2NiAmJiBwcnYuc2xpY2UoNjQpICE9PSAnMDEnKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGFsbEhleENoYXJzKHBydik7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgY29tcG9zZWQgb2YgaGV4IGNoYXJzIG9ubHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWF5YmUgLSB0aGUgIHN0cmluZyB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhbGxIZXhDaGFycyhtYXliZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXihbMC05YS1mXSkrJC9pLnRlc3QobWF5YmUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiByYXcgdHJhbnNhY3Rpb24gY2FuIGJlIGRlc2VyaWFsaXplZFxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcmF3VHJhbnNhY3Rpb24gLSB0cmFuc2FjdGlvbiBpbiByYXcgaGV4IGZvcm1hdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHVua25vd24pOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIHJhd1RyYW5zYWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgZGVzZXJpYWxpemVUcmFuc2FjdGlvbihCdWZmZXJSZWFkZXIuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShyZW1vdmVIZXhQcmVmaXgocmF3VHJhbnNhY3Rpb24pLCAnaGV4JykpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1lbW8gc3RyaW5nIGlzIHZhbGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lbW8gLSB0aGUgc3RyaW5nIHRvIGJlIHZhbGlkYXRlZFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWVtbyhtZW1vOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjcmVhdGVNZW1vU3RyaW5nKG1lbW8pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGZvciB2YWxpZCBjb250cmFjdCBhZGRyZXNzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHIgLSBjb250cmFjdCBkZXBsb3llciBhZGRyZXNzXG4gKiBAcGFyYW0ge1N0YWNrc05ldHdvcmt9IG5ldHdvcmsgLSBuZXR3b3JrIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQ29udHJhY3RBZGRyZXNzKGFkZHI6IHN0cmluZywgbmV0d29yazogU3RhY2tzTmV0d29yayk6IGJvb2xlYW4ge1xuICBpZiAobmV0d29yay5pc01haW5uZXQoKSkge1xuICAgIHJldHVybiBhZGRyID09PSAnU1AwMDAwMDAwMDAwMDAwMDAwMDAwMDJRNlZGNzgnO1xuICB9IGVsc2UgaWYgKG5ldHdvcmsudmVyc2lvbiA9PT0gVHJhbnNhY3Rpb25WZXJzaW9uLlRlc3RuZXQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IoJ05ldHdvcmsgc2hvdWxkIGJlIGVpdGhlciBNYWlubmV0IG9yIFRlc3RuZXQnKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgbmFtZSBpcyBvbmUgb2YgdmFsaWQgY29udHJhY3QgbmFtZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIGZ1bmN0aW9uIG5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQ29udHJhY3RGdW5jdGlvbk5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBDb250cmFjdEZ1bmN0aW9uTmFtZXMuaW5jbHVkZXMobmFtZSk7XG59XG5cbi8qKlxuICogVW5wYWRzIGEgbWVtbyBzdHJpbmcsIHNvIGl0IHJlbW92ZXMgbnVsbHMuXG4gKlxuICogVXNlZnVsIHdoZW4gbWVtbyBpcyBmaWxsIHVwIHRoZSBsZW5ndGguIFJlc3VsdCBpcyBiZWNvbWVzIHJlYWRhYmxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZW1vIC0gdGhlIHN0cmluZyB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5wYWRNZW1vKG1lbW86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVuZCA9IG1lbW8uaW5kZXhPZignXFx1MDAwMCcpO1xuICBpZiAoZW5kIDwgMCkgcmV0dXJuIG1lbW87XG4gIHJldHVybiBtZW1vLnNsaWNlKDAsIGVuZCk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtdWx0aXNpZyBhZGRyZXNzIGZyb20gbXVsdGlwbGUgU1RYIHB1YmxpYyBrZXlzXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHViS2V5cyAtIGxpc3Qgb2YgcHVibGljIGtleXMgYXMgc3RyaW5nc1xuICogQHBhcmFtIHtBZGRyZXNzVmVyc2lvbn0gYWRkcmVzc1ZlcnNpb24gLSBNYWlubmV0TXVsdGlTaWcsIFRlc3RuZXRNdWx0aVNpZ1xuICogQHBhcmFtIHtBZGRyZXNzSGFzaE1vZGV9IGFkZHJlc3NIYXNoTW9kZSAtIFNlcmlhbGl6ZVAyU0hcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2lnbmF0dXJlc1JlcXVpcmVkXSAtIG51bWJlciBvZiBzaWduYXR1cmVzIHJlcXVpcmVkLCBkZWZhdWx0IHZhbHVlIGl0cyAyXG4gKiBAcmV0dXJucyB7YWRkcmVzczogc3RyaW5nLCBoYXNoMTYwOiBzdHJpbmd9IC0gYSBtdWx0aXNpZyBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTVFhBZGRyZXNzRnJvbVB1YktleXMoXG4gIHB1YktleXM6IHN0cmluZ1tdLFxuICBhZGRyZXNzVmVyc2lvbjogQWRkcmVzc1ZlcnNpb24gPSBBZGRyZXNzVmVyc2lvbi5NYWlubmV0TXVsdGlTaWcsXG4gIGFkZHJlc3NIYXNoTW9kZTogQWRkcmVzc0hhc2hNb2RlID0gQWRkcmVzc0hhc2hNb2RlLlNlcmlhbGl6ZVAyU0gsXG4gIHNpZ25hdHVyZXNSZXF1aXJlZCA9IDIsXG4pOiB7IGFkZHJlc3M6IHN0cmluZzsgaGFzaDE2MDogc3RyaW5nIH0ge1xuICBpZiAocHViS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbnVtYmVyIG9mIHB1YmxpYyBrZXlzJyk7XG4gIH1cbiAgaWYgKCFwdWJLZXlzLmV2ZXJ5KGlzVmFsaWRQdWJsaWNLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHB1YmxpYyBrZXlzJyk7XG4gIH1cbiAgaWYgKHNpZ25hdHVyZXNSZXF1aXJlZCA+IHB1YktleXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOdW1iZXIgb2Ygc2lnbmF0dXJlcyByZXF1aXJlZCBtdXN0IGJlIGxvd2VyIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgUHVibGljIEtleXMnKTtcbiAgfVxuXG4gIGNvbnN0IHN0eFB1YktleXMgPSBwdWJLZXlzLm1hcChjcmVhdGVTdGFja3NQdWJsaWNLZXkpO1xuICBjb25zdCBhZGRyZXNzID0gYWRkcmVzc0Zyb21QdWJsaWNLZXlzKGFkZHJlc3NWZXJzaW9uLCBhZGRyZXNzSGFzaE1vZGUsIHNpZ25hdHVyZXNSZXF1aXJlZCwgc3R4UHViS2V5cyk7XG5cbiAgcmV0dXJuIHsgYWRkcmVzczogYWRkcmVzc1RvU3RyaW5nKGFkZHJlc3MpLCBoYXNoMTYwOiBhZGRyZXNzLmhhc2gxNjAgfTtcbn1cblxuLyoqXG4gKiBzaWducyBhIHN0cmluZyBtZXNzYWdlXG4gKlxuICogQHBhcmFtIGtleVBhaXJcbiAqIEBwYXJhbSBkYXRhICAtIG1lc3NhZ2UgdG8gYmUgc2lnbmVkXG4gKiBAcmV0dXJucyBzaWduZWQgbWVzc2FnZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25NZXNzYWdlKGtleVBhaXI6IEtleVBhaXIsIGRhdGE6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0S2V5cygpLnBydjtcbiAgaWYgKHBydikge1xuICAgIHJldHVybiBzaWduV2l0aEtleShjcmVhdGVTdGFja3NQcml2YXRlS2V5KHBydiksIGRhdGEpLmRhdGE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICB9XG59XG5cbi8qKlxuICogVmVyaWZpZXMgYSBzaWduZWQgbWVzc2FnZVxuICpcbiAqIFRoZSBzaWduYXR1cmUgbXVzdCBiZSAxMzAgYnl0ZXMgbG9uZyAtLSBzZWUgUkVDT1ZFUkFCTEVfRUNEU0FfU0lHX0xFTkdUSF9CWVRFU1xuICogaW4gQHN0YWNrcy90cmFuc2FjdGlvbnMvc3JjL2NvbnN0YW50cy50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gbWVzc2FnZSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZVxuICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZSAtIHNpZ25hdHVyZSB0byB2ZXJpZnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNLZXkgLSBwdWJsaWMga2V5IGFzIGhleCBzdHJpbmcgdXNlZCB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdmVyaWZpY2F0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKG1lc3NhZ2U6IHN0cmluZywgc2lnbmF0dXJlOiBzdHJpbmcsIHB1YmxpY0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghdGhpcy5pc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKHNpZ25hdHVyZS5sZW5ndGggIT09IDEzMCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWFsbEhleENoYXJzKHNpZ25hdHVyZSkpIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNpZ25hdHVyZSBpbnB1dCB0byB2ZXJpZnlTaWduYXR1cmUnKTtcbiAgaWYgKF8uaXNFbXB0eShtZXNzYWdlKSkgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0Nhbm5vdCB2ZXJpZnkgZW1wdHkgbWVzc2FnZXMnKTtcblxuICAvLyBwcm92aWRlZCBwdWJsaWNLZXkgY2FuIGJlIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkXG4gIGNvbnN0IGtleUVuY29kaW5nID0gcHVibGljS2V5Lmxlbmd0aCA9PT0gNjYgPyBQdWJLZXlFbmNvZGluZy5Db21wcmVzc2VkIDogUHViS2V5RW5jb2RpbmcuVW5jb21wcmVzc2VkO1xuXG4gIGNvbnN0IG1lc3NhZ2VTaWcgPSBjcmVhdGVNZXNzYWdlU2lnbmF0dXJlKHNpZ25hdHVyZSk7XG5cbiAgY29uc3QgZm91bmRLZXkgPSBwdWJsaWNLZXlGcm9tU2lnbmF0dXJlKG1lc3NhZ2UsIG1lc3NhZ2VTaWcsIGtleUVuY29kaW5nKTtcblxuICByZXR1cm4gZm91bmRLZXkgPT09IHB1YmxpY0tleTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIGFkZHJlc3MgaW50byBhZGRyZXNzIGFuZCBtZW1vIGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgdGhlIGFkZHJlc3MgdG8gcHJvY2Vzc1xuICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IGNvbnRhaW5pbmcgYWRkcmVzcyBhbmQgbWVtbyBpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzczogc3RyaW5nKTogQWRkcmVzc0RldGFpbHMge1xuICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IHVybC5wYXJzZShhZGRyZXNzKTtcbiAgY29uc3QgcXVlcnlEZXRhaWxzID0gYWRkcmVzc0RldGFpbHMucXVlcnkgPyBxdWVyeXN0cmluZy5wYXJzZShhZGRyZXNzRGV0YWlscy5xdWVyeSkgOiB7fTtcbiAgY29uc3QgYmFzZUFkZHJlc3MgPSA8c3RyaW5nPmFkZHJlc3NEZXRhaWxzLnBhdGhuYW1lO1xuICBpZiAoIWlzVmFsaWRBZGRyZXNzKGJhc2VBZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgfVxuICAvLyBhZGRyZXNzIGRvZXNuJ3QgaGF2ZSBhIG1lbW8gaWRcbiAgaWYgKGJhc2VBZGRyZXNzID09PSBhZGRyZXNzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICBtZW1vSWQ6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQocXVlcnlEZXRhaWxzLm1lbW9JZCkpIHtcbiAgICAvLyBpZiB0aGVyZSBhcmUgbW9yZSBwcm9wZXJ0aWVzLCB0aGUgcXVlcnkgZGV0YWlscyBuZWVkIHRvIGNvbnRhaW4gdGhlIG1lbW8gaWQgcHJvcGVydHlcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcihgaW52YWxpZCBhZGRyZXNzIHdpdGggbWVtbyBpZDogJHthZGRyZXNzfWApO1xuICB9XG4gIGNvbnN0IG1lbW9JZCA9IDxzdHJpbmc+cXVlcnlEZXRhaWxzLm1lbW9JZDtcbiAgY29uc3QgaW50TWVtb0lkID0gcGFyc2VJbnQobWVtb0lkLCAxMCk7XG4gIGlmIChpc05hTihpbnRNZW1vSWQpIHx8IGludE1lbW9JZCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbWVtbyBpZDogJHttZW1vSWR9YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFkZHJlc3M6IGJhc2VBZGRyZXNzLFxuICAgIG1lbW9JZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgcmV0dXJuIGFkZHJlc3Mgd2l0aCBhcHBlbmRlZCBtZW1vIGlkXG4gKlxuICogQHBhcmFtIHtBZGRyZXNzRGV0YWlsc30gYWRkcmVzc0RldGFpbHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGFkZHJlc3Mgd2l0aCBtZW1vIGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBZGRyZXNzKHsgYWRkcmVzcywgbWVtb0lkIH06IEFkZHJlc3NEZXRhaWxzKTogc3RyaW5nIHtcbiAgaWYgKCFpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQobWVtb0lkKSkge1xuICAgIGNvbnN0IGludE1lbW9JZCA9IHBhcnNlSW50KG1lbW9JZCwgMTApO1xuICAgIGlmIChpc05hTihpbnRNZW1vSWQpIHx8IGludE1lbW9JZCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBtZW1vIGlkOiAke21lbW9JZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke2FkZHJlc3N9P21lbW9JZD0ke21lbW9JZH1gO1xuICB9XG4gIHJldHVybiBhZGRyZXNzO1xufVxuXG4vKipcbiAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyBhIHZhbGlkIGFkZHJlc3Mgd2l0aCBtZW1vIGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgYWRkcmVzcyBpbiB0aGUgZm9ybSA8YWRkcmVzcz4/bWVtb0lkPTxtZW1vSWQ+XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpcyBpbnB1dCBpcyBhIHZhbGlkIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBZGRyZXNzV2l0aFBheW1lbnRJZChhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IGdldEFkZHJlc3NEZXRhaWxzKGFkZHJlc3MpO1xuICAgIHJldHVybiBhZGRyZXNzID09PSBub3JtYWxpemVBZGRyZXNzKGFkZHJlc3NEZXRhaWxzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY2xhcml0eSB2YWx1ZSBpbnB1dFxuICpcbiAqIEBwYXJhbSB7Q2xhcml0eVZhbHVlfSBjdiBjbGFyaXR5IHZhbHVlIGZ1bmN0aW9uIGFyZ3VtZW50XG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmdpZmllZCBjbGFyaXR5IHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlDdihjdjogQ2xhcml0eVZhbHVlKTogYW55IHtcbiAgc3dpdGNoIChjdi50eXBlKSB7XG4gICAgY2FzZSBDbGFyaXR5VHlwZS5JbnQ6XG4gICAgY2FzZSBDbGFyaXR5VHlwZS5VSW50OlxuICAgICAgcmV0dXJuIHsgdHlwZTogY3YudHlwZSwgdmFsdWU6IGN2LnZhbHVlLnRvU3RyaW5nKCkgfTtcbiAgICBjYXNlIENsYXJpdHlUeXBlLk9wdGlvbmFsU29tZTpcbiAgICAgIHJldHVybiB7IHR5cGU6IGN2LnR5cGUsIHZhbHVlOiBzdHJpbmdpZnlDdihjdi52YWx1ZSkgfTtcbiAgICBjYXNlIENsYXJpdHlUeXBlLlR1cGxlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogY3YudHlwZSxcbiAgICAgICAgZGF0YTogXy5tYXBWYWx1ZXMoY3YuZGF0YSwgKHZhbHVlKSA9PiBzdHJpbmdpZnlDdih2YWx1ZSkpLFxuICAgICAgfTtcbiAgICBjYXNlIENsYXJpdHlUeXBlLkxpc3Q6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBjdi50eXBlLFxuICAgICAgICBsaXN0OiBjdi5saXN0Lm1hcChzdHJpbmdpZnlDdiksXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY3Y7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import { BaseKeyPair } from '../coin/baseCoin';
2
+ import { KeyPairOptions } from '../coin/baseCoin/iface';
3
+ export declare function register(coinName: string, source?: KeyPairOptions): BaseKeyPair;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/keyPair/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIxD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,WAAW,CAU/E"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.register = void 0;
23
+ var coinModules = __importStar(require(".."));
24
+ var statics_1 = require("@bitgo/statics");
25
+ var errors_1 = require("../coin/baseCoin/errors");
26
+ function register(coinName, source) {
27
+ var sanitizedCoinName = statics_1.coins.get(coinName.trim().toLowerCase()).family;
28
+ var key = Object.keys(coinModules)
29
+ .filter(function (k) { return coinModules[k].KeyPair; })
30
+ // TODO(BG-40990): eth2 BLS keypair init error
31
+ .find(function (k) { return k.trim().toLowerCase() !== 'eth2' && k.trim().toLowerCase() === sanitizedCoinName; });
32
+ if (key) {
33
+ return new coinModules[key].KeyPair(source);
34
+ }
35
+ throw new errors_1.NotSupported("Coin " + coinName + " not supported");
36
+ }
37
+ exports.register = register;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMva2V5UGFpci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQWtDO0FBR2xDLDBDQUF1QztBQUN2QyxrREFBdUQ7QUFFdkQsU0FBZ0IsUUFBUSxDQUFDLFFBQWdCLEVBQUUsTUFBdUI7SUFDaEUsSUFBTSxpQkFBaUIsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxRSxJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUNqQyxNQUFNLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUF0QixDQUFzQixDQUFDO1FBQ3RDLDhDQUE4QztTQUM3QyxJQUFJLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxpQkFBaUIsRUFBakYsQ0FBaUYsQ0FBQyxDQUFDO0lBQ2xHLElBQUksR0FBRyxFQUFFO1FBQ1AsT0FBTyxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDN0M7SUFDRCxNQUFNLElBQUkscUJBQVksQ0FBQyxVQUFRLFFBQVEsbUJBQWdCLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBVkQsNEJBVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb2luTW9kdWxlcyBmcm9tICcuLic7XG5pbXBvcnQgeyBCYXNlS2V5UGFpciB9IGZyb20gJy4uL2NvaW4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgS2V5UGFpck9wdGlvbnMgfSBmcm9tICcuLi9jb2luL2Jhc2VDb2luL2lmYWNlJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgTm90U3VwcG9ydGVkIH0gZnJvbSAnLi4vY29pbi9iYXNlQ29pbi9lcnJvcnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIoY29pbk5hbWU6IHN0cmluZywgc291cmNlPzogS2V5UGFpck9wdGlvbnMpOiBCYXNlS2V5UGFpciB7XG4gIGNvbnN0IHNhbml0aXplZENvaW5OYW1lID0gY29pbnMuZ2V0KGNvaW5OYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpKS5mYW1pbHk7XG4gIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGNvaW5Nb2R1bGVzKVxuICAgIC5maWx0ZXIoKGspID0+IGNvaW5Nb2R1bGVzW2tdLktleVBhaXIpXG4gICAgLy8gVE9ETyhCRy00MDk5MCk6IGV0aDIgQkxTIGtleXBhaXIgaW5pdCBlcnJvclxuICAgIC5maW5kKChrKSA9PiBrLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9PSAnZXRoMicgJiYgay50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gc2FuaXRpemVkQ29pbk5hbWUpO1xuICBpZiAoa2V5KSB7XG4gICAgcmV0dXJuIG5ldyBjb2luTW9kdWxlc1trZXldLktleVBhaXIoc291cmNlKTtcbiAgfVxuICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKGBDb2luICR7Y29pbk5hbWV9IG5vdCBzdXBwb3J0ZWRgKTtcbn1cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ declare const Ed25519Curve: () => Promise<{
2
+ scalarRandom: () => Uint8Array;
3
+ scalarReduce: (s: Uint8Array) => Uint8Array;
4
+ scalarNegate: (s: Uint8Array) => Uint8Array;
5
+ scalarInvert: (s: Uint8Array) => Uint8Array;
6
+ scalarAdd: (x: Uint8Array, y: Uint8Array) => Uint8Array;
7
+ scalarSub: (x: Uint8Array, y: Uint8Array) => Uint8Array;
8
+ scalarMult: (x: Uint8Array, y: Uint8Array) => Uint8Array;
9
+ basePointMult: (n: Uint8Array) => Uint8Array;
10
+ pointAdd: (p: Uint8Array, q: Uint8Array) => Uint8Array;
11
+ verify: (y: Uint8Array, signedMessage: Uint8Array) => Uint8Array;
12
+ }>;
13
+ export default Ed25519Curve;
14
+ //# sourceMappingURL=curves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curves.d.ts","sourceRoot":"","sources":["../../../src/mpc/curves.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,YAAY;wBAIS,UAAU;sBAKV,UAAU,KAAG,UAAU;sBAIvB,UAAU,KAAG,UAAU;sBAIvB,UAAU,KAAG,UAAU;mBAI1B,UAAU,KAAK,UAAU,KAAG,UAAU;mBAItC,UAAU,KAAK,UAAU,KAAG,UAAU;oBAIrC,UAAU,KAAK,UAAU,KAAG,UAAU;uBAInC,UAAU,KAAG,UAAU;kBAI5B,UAAU,KAAK,UAAU,KAAG,UAAU;gBAIxC,UAAU,iBAAiB,UAAU,KAAG,UAAU;EAgBtE,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var sodium = require('libsodium-wrappers-sumo');
40
+ var crypto_1 = require("crypto");
41
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
42
+ var Ed25519Curve = function () { return __awaiter(void 0, void 0, void 0, function () {
43
+ var scalarRandom, scalarReduce, scalarNegate, scalarInvert, scalarAdd, scalarSub, scalarMult, basePointMult, pointAdd, verify;
44
+ return __generator(this, function (_a) {
45
+ switch (_a.label) {
46
+ case 0:
47
+ // sodium requires await for ready within block scope
48
+ return [4 /*yield*/, sodium.ready];
49
+ case 1:
50
+ // sodium requires await for ready within block scope
51
+ _a.sent();
52
+ scalarRandom = function () {
53
+ var random_buffer = crypto_1.randomBytes(64);
54
+ return sodium.crypto_core_ed25519_scalar_reduce(random_buffer);
55
+ };
56
+ scalarReduce = function (s) {
57
+ return sodium.crypto_core_ed25519_scalar_reduce(s);
58
+ };
59
+ scalarNegate = function (s) {
60
+ return sodium.crypto_core_ed25519_scalar_negate(s);
61
+ };
62
+ scalarInvert = function (s) {
63
+ return sodium.crypto_core_ed25519_scalar_invert(s);
64
+ };
65
+ scalarAdd = function (x, y) {
66
+ return sodium.crypto_core_ed25519_scalar_add(x, y);
67
+ };
68
+ scalarSub = function (x, y) {
69
+ return sodium.crypto_core_ed25519_scalar_sub(x, y);
70
+ };
71
+ scalarMult = function (x, y) {
72
+ return sodium.crypto_core_ed25519_scalar_mul(x, y);
73
+ };
74
+ basePointMult = function (n) {
75
+ return sodium.crypto_scalarmult_ed25519_base_noclamp(n);
76
+ };
77
+ pointAdd = function (p, q) {
78
+ return sodium.crypto_core_ed25519_add(p, q);
79
+ };
80
+ verify = function (y, signedMessage) {
81
+ return sodium.crypto_sign_open(signedMessage, y);
82
+ };
83
+ return [2 /*return*/, {
84
+ scalarRandom: scalarRandom,
85
+ scalarReduce: scalarReduce,
86
+ scalarNegate: scalarNegate,
87
+ scalarInvert: scalarInvert,
88
+ scalarAdd: scalarAdd,
89
+ scalarSub: scalarSub,
90
+ scalarMult: scalarMult,
91
+ basePointMult: basePointMult,
92
+ pointAdd: pointAdd,
93
+ verify: verify,
94
+ }];
95
+ }
96
+ });
97
+ }); };
98
+ exports.default = Ed25519Curve;
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VydmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21wYy9jdXJ2ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUNsRCxpQ0FBMEQ7QUFFMUQsNkVBQTZFO0FBQzdFLElBQU0sWUFBWSxHQUFHOzs7OztZQUNuQixxREFBcUQ7WUFDckQscUJBQU0sTUFBTSxDQUFDLEtBQUssRUFBQTs7Z0JBRGxCLHFEQUFxRDtnQkFDckQsU0FBa0IsQ0FBQztnQkFFYixZQUFZLEdBQUc7b0JBQ25CLElBQU0sYUFBYSxHQUFHLG9CQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM1QyxPQUFPLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDakUsQ0FBQyxDQUFDO2dCQUVJLFlBQVksR0FBRyxVQUFDLENBQWE7b0JBQ2pDLE9BQU8sTUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDLENBQUM7Z0JBRUksWUFBWSxHQUFHLFVBQUMsQ0FBYTtvQkFDakMsT0FBTyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELENBQUMsQ0FBQztnQkFFSSxZQUFZLEdBQUcsVUFBQyxDQUFhO29CQUNqQyxPQUFPLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckQsQ0FBQyxDQUFDO2dCQUVJLFNBQVMsR0FBRyxVQUFDLENBQWEsRUFBRSxDQUFhO29CQUM3QyxPQUFPLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELENBQUMsQ0FBQztnQkFFSSxTQUFTLEdBQUcsVUFBQyxDQUFhLEVBQUUsQ0FBYTtvQkFDN0MsT0FBTyxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDLENBQUM7Z0JBRUksVUFBVSxHQUFHLFVBQUMsQ0FBYSxFQUFFLENBQWE7b0JBQzlDLE9BQU8sTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDckQsQ0FBQyxDQUFDO2dCQUVJLGFBQWEsR0FBRyxVQUFDLENBQWE7b0JBQ2xDLE9BQU8sTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLENBQUM7Z0JBRUksUUFBUSxHQUFHLFVBQUMsQ0FBYSxFQUFFLENBQWE7b0JBQzVDLE9BQU8sTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDOUMsQ0FBQyxDQUFDO2dCQUVJLE1BQU0sR0FBRyxVQUFDLENBQWEsRUFBRSxhQUF5QjtvQkFDdEQsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDLENBQUM7Z0JBRUYsc0JBQU87d0JBQ0wsWUFBWSxjQUFBO3dCQUNaLFlBQVksY0FBQTt3QkFDWixZQUFZLGNBQUE7d0JBQ1osWUFBWSxjQUFBO3dCQUNaLFNBQVMsV0FBQTt3QkFDVCxTQUFTLFdBQUE7d0JBQ1QsVUFBVSxZQUFBO3dCQUNWLGFBQWEsZUFBQTt3QkFDYixRQUFRLFVBQUE7d0JBQ1IsTUFBTSxRQUFBO3FCQUNQLEVBQUM7OztLQUNILENBQUM7QUFFRixrQkFBZSxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBzb2RpdW0gPSByZXF1aXJlKCdsaWJzb2RpdW0td3JhcHBlcnMtc3VtbycpO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgYXMgY3J5cHRvUmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuY29uc3QgRWQyNTUxOUN1cnZlID0gYXN5bmMgKCkgPT4ge1xuICAvLyBzb2RpdW0gcmVxdWlyZXMgYXdhaXQgZm9yIHJlYWR5IHdpdGhpbiBibG9jayBzY29wZVxuICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgY29uc3Qgc2NhbGFyUmFuZG9tID0gKCk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGNvbnN0IHJhbmRvbV9idWZmZXIgPSBjcnlwdG9SYW5kb21CeXRlcyg2NCk7XG4gICAgcmV0dXJuIHNvZGl1bS5jcnlwdG9fY29yZV9lZDI1NTE5X3NjYWxhcl9yZWR1Y2UocmFuZG9tX2J1ZmZlcik7XG4gIH07XG5cbiAgY29uc3Qgc2NhbGFyUmVkdWNlID0gKHM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gc29kaXVtLmNyeXB0b19jb3JlX2VkMjU1MTlfc2NhbGFyX3JlZHVjZShzKTtcbiAgfTtcblxuICBjb25zdCBzY2FsYXJOZWdhdGUgPSAoczogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBzb2RpdW0uY3J5cHRvX2NvcmVfZWQyNTUxOV9zY2FsYXJfbmVnYXRlKHMpO1xuICB9O1xuXG4gIGNvbnN0IHNjYWxhckludmVydCA9IChzOiBVaW50OEFycmF5KTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIHNvZGl1bS5jcnlwdG9fY29yZV9lZDI1NTE5X3NjYWxhcl9pbnZlcnQocyk7XG4gIH07XG5cbiAgY29uc3Qgc2NhbGFyQWRkID0gKHg6IFVpbnQ4QXJyYXksIHk6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gc29kaXVtLmNyeXB0b19jb3JlX2VkMjU1MTlfc2NhbGFyX2FkZCh4LCB5KTtcbiAgfTtcblxuICBjb25zdCBzY2FsYXJTdWIgPSAoeDogVWludDhBcnJheSwgeTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBzb2RpdW0uY3J5cHRvX2NvcmVfZWQyNTUxOV9zY2FsYXJfc3ViKHgsIHkpO1xuICB9O1xuXG4gIGNvbnN0IHNjYWxhck11bHQgPSAoeDogVWludDhBcnJheSwgeTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBzb2RpdW0uY3J5cHRvX2NvcmVfZWQyNTUxOV9zY2FsYXJfbXVsKHgsIHkpO1xuICB9O1xuXG4gIGNvbnN0IGJhc2VQb2ludE11bHQgPSAobjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBzb2RpdW0uY3J5cHRvX3NjYWxhcm11bHRfZWQyNTUxOV9iYXNlX25vY2xhbXAobik7XG4gIH07XG5cbiAgY29uc3QgcG9pbnRBZGQgPSAocDogVWludDhBcnJheSwgcTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBzb2RpdW0uY3J5cHRvX2NvcmVfZWQyNTUxOV9hZGQocCwgcSk7XG4gIH07XG5cbiAgY29uc3QgdmVyaWZ5ID0gKHk6IFVpbnQ4QXJyYXksIHNpZ25lZE1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gc29kaXVtLmNyeXB0b19zaWduX29wZW4oc2lnbmVkTWVzc2FnZSwgeSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzY2FsYXJSYW5kb20sXG4gICAgc2NhbGFyUmVkdWNlLFxuICAgIHNjYWxhck5lZ2F0ZSxcbiAgICBzY2FsYXJJbnZlcnQsXG4gICAgc2NhbGFyQWRkLFxuICAgIHNjYWxhclN1YixcbiAgICBzY2FsYXJNdWx0LFxuICAgIGJhc2VQb2ludE11bHQsXG4gICAgcG9pbnRBZGQsXG4gICAgdmVyaWZ5LFxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRWQyNTUxOUN1cnZlO1xuIl19
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ declare const Shamir: (curve: any) => {
3
+ split: (secret: Buffer, threshold: number, numShares: number, indices?: number[] | undefined) => Record<number, Buffer>;
4
+ combine: (shares: Record<number, Buffer>) => Buffer;
5
+ };
6
+ export default Shamir;
7
+ //# sourceMappingURL=shamir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shamir.d.ts","sourceRoot":"","sources":["../../../src/mpc/shamir.ts"],"names":[],"mappings":";AAEA,QAAA,MAAM,MAAM,UAAW,GAAG;oBAad,MAAM,aACH,MAAM,aACN,MAAM,qCAEhB,OAAO,MAAM,EAAE,MAAM,CAAC;sBAsCA,OAAO,MAAM,EAAE,MAAM,CAAC,KAAG,MAAM;CAuCzD,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var assert = require('assert');
4
+ var Shamir = function (curve) {
5
+ /**
6
+ * Perform Shamir sharing on the secret `secret` to the degree `threshold - 1` split `numShares`
7
+ * ways. The split secret requires `threshold` shares to be reconstructed.
8
+ *
9
+ * @param secret secret to split
10
+ * @param threshold share threshold required to reconstruct secret
11
+ * @param numShares total number of shares to split to split secret into
12
+ * @param indices
13
+ * @returns Dictionary of shares. Each key is an int in the range 1<=x<=numShares
14
+ * representing that share's free term.
15
+ */
16
+ var split = function (secret, threshold, numShares, indices) {
17
+ if (indices === undefined) {
18
+ // make range(1, n + 1)
19
+ indices = Array.from({ length: numShares }, function (_, i) { return i + 1; });
20
+ }
21
+ assert(threshold > 1);
22
+ assert(threshold <= numShares);
23
+ var coefs = [];
24
+ for (var ind = 0; ind < threshold - 1; ind++) {
25
+ var random_value = curve.scalarRandom();
26
+ coefs.push(random_value);
27
+ }
28
+ coefs.push(secret);
29
+ var shares = {};
30
+ for (var ind = 0; ind < indices.length; ind++) {
31
+ var x = indices[ind];
32
+ var x_buffer = Buffer.alloc(32);
33
+ // TODO BG-40908 : converting internal representation to buffers
34
+ x_buffer.writeUInt32LE(x, 0);
35
+ var partial = coefs[0];
36
+ for (var other = 1; other < coefs.length; other++) {
37
+ var scalarMult = curve.scalarMult(partial, x_buffer);
38
+ var newAdd = curve.scalarAdd(coefs[other], scalarMult);
39
+ partial = newAdd;
40
+ }
41
+ shares[x] = Buffer.from(partial);
42
+ }
43
+ return shares;
44
+ };
45
+ /**
46
+ * Reconstitute a secret from a dictionary of shares. The number of shares must
47
+ * be equal to `t` to reconstitute the original secret.
48
+ *
49
+ * @param shares dictionary of shares. each key is the free term of the share
50
+ * @returns secret
51
+ */
52
+ var combine = function (shares) {
53
+ var s = Buffer.alloc(32);
54
+ for (var xi in shares) {
55
+ var yi = shares[xi];
56
+ var xi_buffer = Buffer.alloc(32);
57
+ var num_buffer = Buffer.alloc(32);
58
+ var denum_buffer = Buffer.alloc(32);
59
+ xi_buffer.writeUInt32LE(parseInt(xi, 10), 0);
60
+ num_buffer.writeUInt32LE(1, 0);
61
+ denum_buffer.writeUInt32LE(1, 0);
62
+ for (var xj in shares) {
63
+ var xj_buffer = Buffer.alloc(32);
64
+ xj_buffer.writeUInt32LE(parseInt(xj, 10), 0);
65
+ if (xi !== xj) {
66
+ num_buffer = curve.scalarMult(num_buffer, xj_buffer);
67
+ }
68
+ }
69
+ num_buffer = Buffer.from(num_buffer);
70
+ for (var xj in shares) {
71
+ var xj_buffer = Buffer.alloc(32);
72
+ xj_buffer.writeUInt32LE(parseInt(xj, 10), 0);
73
+ if (xi !== xj) {
74
+ denum_buffer = curve.scalarMult(denum_buffer, curve.scalarSub(xj_buffer, xi_buffer));
75
+ }
76
+ }
77
+ denum_buffer = Buffer.from(denum_buffer);
78
+ var inverted = curve.scalarInvert(denum_buffer);
79
+ var innerMultiplied = curve.scalarMult(num_buffer, inverted);
80
+ var multiplied = curve.scalarMult(innerMultiplied, yi);
81
+ s = curve.scalarAdd(multiplied, s);
82
+ }
83
+ return s;
84
+ };
85
+ return {
86
+ split: split,
87
+ combine: combine,
88
+ };
89
+ };
90
+ exports.default = Shamir;
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhbWlyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21wYy9zaGFtaXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFakMsSUFBTSxNQUFNLEdBQUcsVUFBQyxLQUFVO0lBQ3hCOzs7Ozs7Ozs7O09BVUc7SUFDSCxJQUFNLEtBQUssR0FBRyxVQUNaLE1BQWMsRUFDZCxTQUFpQixFQUNqQixTQUFpQixFQUNqQixPQUF1QjtRQUV2QixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDekIsdUJBQXVCO1lBQ3ZCLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLFVBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSyxPQUFBLENBQUMsR0FBRyxDQUFDLEVBQUwsQ0FBSyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLENBQUM7UUFDL0IsSUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzVDLElBQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuQixJQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFDO1FBQzFDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzdD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QU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEQsSUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0QsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekQsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDLENBQUM7SUFFRixPQUFPO1FBQ0wsS0FBSyxPQUFBO1FBQ0wsT0FBTyxTQUFBO0tBQ1IsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLGtCQUFlLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG5jb25zdCBTaGFtaXIgPSAoY3VydmU6IGFueSkgPT4ge1xuICAvKipcbiAgICogUGVyZm9ybSBTaGFtaXIgc2hhcmluZyBvbiB0aGUgc2VjcmV0IGBzZWNyZXRgIHRvIHRoZSBkZWdyZWUgYHRocmVzaG9sZCAtIDFgIHNwbGl0IGBudW1TaGFyZXNgXG4gICAqIHdheXMuIFRoZSBzcGxpdCBzZWNyZXQgcmVxdWlyZXMgYHRocmVzaG9sZGAgc2hhcmVzIHRvIGJlIHJlY29uc3RydWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZWNyZXQgc2VjcmV0IHRvIHNwbGl0XG4gICAqIEBwYXJhbSB0aHJlc2hvbGQgc2hhcmUgdGhyZXNob2xkIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IHNlY3JldFxuICAgKiBAcGFyYW0gbnVtU2hhcmVzIHRvdGFsIG51bWJlciBvZiBzaGFyZXMgdG8gc3BsaXQgdG8gc3BsaXQgc2VjcmV0IGludG9cbiAgICogQHBhcmFtIGluZGljZXNcbiAgICogQHJldHVybnMgRGljdGlvbmFyeSBvZiBzaGFyZXMuIEVhY2gga2V5IGlzIGFuIGludCBpbiB0aGUgcmFuZ2UgMTw9eDw9bnVtU2hhcmVzXG4gICAqIHJlcHJlc2VudGluZyB0aGF0IHNoYXJlJ3MgZnJlZSB0ZXJtLlxuICAgKi9cbiAgY29uc3Qgc3BsaXQgPSAoXG4gICAgc2VjcmV0OiBCdWZmZXIsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgbnVtU2hhcmVzOiBudW1iZXIsXG4gICAgaW5kaWNlcz86IEFycmF5PG51bWJlcj4sXG4gICk6IFJlY29yZDxudW1iZXIsIEJ1ZmZlcj4gPT4ge1xuICAgIGlmIChpbmRpY2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIG1ha2UgcmFuZ2UoMSwgbiArIDEpXG4gICAgICBpbmRpY2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtU2hhcmVzIH0sIChfLCBpKSA9PiBpICsgMSk7XG4gICAgfVxuICAgIGFzc2VydCh0aHJlc2hvbGQgPiAxKTtcbiAgICBhc3NlcnQodGhyZXNob2xkIDw9IG51bVNoYXJlcyk7XG4gICAgY29uc3QgY29lZnM6IEJ1ZmZlcltdID0gW107XG4gICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgdGhyZXNob2xkIC0gMTsgaW5kKyspIHtcbiAgICAgIGNvbnN0IHJhbmRvbV92YWx1ZSA9IGN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgICAgY29lZnMucHVzaChyYW5kb21fdmFsdWUpO1xuICAgIH1cbiAgICBjb2Vmcy5wdXNoKHNlY3JldCk7XG5cbiAgICBjb25zdCBzaGFyZXM6IFJlY29yZDxudW1iZXIsIEJ1ZmZlcj4gPSB7fTtcbiAgICBmb3IgKGxldCBpbmQgPSAwOyBpbmQgPCBpbmRpY2VzLmxlbmd0aDsgaW5kKyspIHtcbiAgICAgIGNvbnN0IHggPSBpbmRpY2VzW2luZF07XG4gICAgICBjb25zdCB4X2J1ZmZlciA9IEJ1ZmZlci5hbGxvYygzMik7XG4gICAgICAvLyBUT0RPIEJHLTQwOTA4IDogY29udmVydGluZyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0byBidWZmZXJzXG4gICAgICB4X2J1ZmZlci53cml0ZVVJbnQzMkxFKHgsIDApO1xuICAgICAgbGV0IHBhcnRpYWwgPSBjb2Vmc1swXTtcbiAgICAgIGZvciAobGV0IG90aGVyID0gMTsgb3RoZXIgPCBjb2Vmcy5sZW5ndGg7IG90aGVyKyspIHtcbiAgICAgICAgY29uc3Qgc2NhbGFyTXVsdCA9IGN1cnZlLnNjYWxhck11bHQocGFydGlhbCwgeF9idWZmZXIpO1xuICAgICAgICBjb25zdCBuZXdBZGQgPSBjdXJ2ZS5zY2FsYXJBZGQoY29lZnNbb3RoZXJdLCBzY2FsYXJNdWx0KTtcbiAgICAgICAgcGFydGlhbCA9IG5ld0FkZDtcbiAgICAgIH1cbiAgICAgIHNoYXJlc1t4XSA9IEJ1ZmZlci5mcm9tKHBhcnRpYWwpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcmVzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZWNvbnN0aXR1dGUgYSBzZWNyZXQgZnJvbSBhIGRpY3Rpb25hcnkgb2Ygc2hhcmVzLiBUaGUgbnVtYmVyIG9mIHNoYXJlcyBtdXN0XG4gICAqIGJlIGVxdWFsIHRvIGB0YCB0byByZWNvbnN0aXR1dGUgdGhlIG9yaWdpbmFsIHNlY3JldC5cbiAgICpcbiAgICogQHBhcmFtIHNoYXJlcyBkaWN0aW9uYXJ5IG9mIHNoYXJlcy4gZWFjaCBrZXkgaXMgdGhlIGZyZWUgdGVybSBvZiB0aGUgc2hhcmVcbiAgICogQHJldHVybnMgc2VjcmV0XG4gICAqL1xuICBjb25zdCBjb21iaW5lID0gKHNoYXJlczogUmVjb3JkPG51bWJlciwgQnVmZmVyPik6IEJ1ZmZlciA9PiB7XG4gICAgbGV0IHMgPSBCdWZmZXIuYWxsb2MoMzIpO1xuICAgIGZvciAoY29uc3QgeGkgaW4gc2hhcmVzKSB7XG4gICAgICBjb25zdCB5aSA9IHNoYXJlc1t4aV07XG4gICAgICBjb25zdCB4aV9idWZmZXIgPSBCdWZmZXIuYWxsb2MoMzIpO1xuICAgICAgbGV0IG51bV9idWZmZXIgPSBCdWZmZXIuYWxsb2MoMzIpO1xuICAgICAgbGV0IGRlbnVtX2J1ZmZlciA9IEJ1ZmZlci5hbGxvYygzMik7XG4gICAgICB4aV9idWZmZXIud3JpdGVVSW50MzJMRShwYXJzZUludCh4aSwgMTApLCAwKTtcbiAgICAgIG51bV9idWZmZXIud3JpdGVVSW50MzJMRSgxLCAwKTtcbiAgICAgIGRlbnVtX2J1ZmZlci53cml0ZVVJbnQzMkxFKDEsIDApO1xuXG4gICAgICBmb3IgKGNvbnN0IHhqIGluIHNoYXJlcykge1xuICAgICAgICBjb25zdCB4al9idWZmZXIgPSBCdWZmZXIuYWxsb2MoMzIpO1xuICAgICAgICB4al9idWZmZXIud3JpdGVVSW50MzJMRShwYXJzZUludCh4aiwgMTApLCAwKTtcbiAgICAgICAgaWYgKHhpICE9PSB4aikge1xuICAgICAgICAgIG51bV9idWZmZXIgPSBjdXJ2ZS5zY2FsYXJNdWx0KG51bV9idWZmZXIsIHhqX2J1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG51bV9idWZmZXIgPSBCdWZmZXIuZnJvbShudW1fYnVmZmVyKTtcbiAgICAgIGZvciAoY29uc3QgeGogaW4gc2hhcmVzKSB7XG4gICAgICAgIGNvbnN0IHhqX2J1ZmZlciA9IEJ1ZmZlci5hbGxvYygzMik7XG4gICAgICAgIHhqX2J1ZmZlci53cml0ZVVJbnQzMkxFKHBhcnNlSW50KHhqLCAxMCksIDApO1xuICAgICAgICBpZiAoeGkgIT09IHhqKSB7XG4gICAgICAgICAgZGVudW1fYnVmZmVyID0gY3VydmUuc2NhbGFyTXVsdChkZW51bV9idWZmZXIsIGN1cnZlLnNjYWxhclN1Yih4al9idWZmZXIsIHhpX2J1ZmZlcikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZW51bV9idWZmZXIgPSBCdWZmZXIuZnJvbShkZW51bV9idWZmZXIpO1xuICAgICAgY29uc3QgaW52ZXJ0ZWQgPSBjdXJ2ZS5zY2FsYXJJbnZlcnQoZGVudW1fYnVmZmVyKTtcbiAgICAgIGNvbnN0IGlubmVyTXVsdGlwbGllZCA9IGN1cnZlLnNjYWxhck11bHQobnVtX2J1ZmZlciwgaW52ZXJ0ZWQpO1xuICAgICAgY29uc3QgbXVsdGlwbGllZCA9IGN1cnZlLnNjYWxhck11bHQoaW5uZXJNdWx0aXBsaWVkLCB5aSk7XG4gICAgICBzID0gY3VydmUuc2NhbGFyQWRkKG11bHRpcGxpZWQsIHMpO1xuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNwbGl0LFxuICAgIGNvbWJpbmUsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTaGFtaXI7XG4iXX0=