UNPKG

@coolwallet/sol

Version:
246 lines (234 loc) 32.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.TransactionInstruction = exports.Transaction = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _error = require("@coolwallet/core/lib/error"); var stringUtil = _interopRequireWildcard(require("./stringUtil")); var _message = require("../message"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } /** * List of TransactionInstruction object fields that may be initialized at construction */ /** * Transaction Instruction class */ var TransactionInstruction = /*#__PURE__*/function () { /** * Public keys to include in this transaction * Boolean represents whether this pubkey needs to sign the transaction */ /** * Program Id to execute */ /** * Program input */ function TransactionInstruction(opts) { (0, _classCallCheck2["default"])(this, TransactionInstruction); (0, _defineProperty2["default"])(this, "data", Buffer.alloc(0)); this.programId = opts.programId; this.keys = opts.keys; if (opts.data) { this.data = opts.data; } } /** * @internal */ (0, _createClass2["default"])(TransactionInstruction, [{ key: "toJSON", value: function toJSON() { return { keys: this.keys.map(function (_ref) { var pubkey = _ref.pubkey, isSigner = _ref.isSigner, isWritable = _ref.isWritable; return { pubkey: stringUtil.toBase58(pubkey), isSigner: isSigner, isWritable: isWritable }; }), programId: this.programId.toJSON(), data: (0, _toConsumableArray2["default"])(this.data) }; } }]); return TransactionInstruction; }(); exports.TransactionInstruction = TransactionInstruction; var Transaction = /*#__PURE__*/function () { function Transaction(tx) { (0, _classCallCheck2["default"])(this, Transaction); this.feePayer = stringUtil.formHex(tx.feePayer); this.recentBlockhash = stringUtil.formHex(tx.recentBlockhash); this.instructions = tx.instructions.map(function (instruction) { return _objectSpread(_objectSpread({}, instruction), {}, { programId: stringUtil.formHex(instruction.programId), accounts: instruction.accounts.map(function (account) { return _objectSpread(_objectSpread({}, account), {}, { pubkey: stringUtil.formHex(account.pubkey) }); }) }); }); } (0, _createClass2["default"])(Transaction, [{ key: "add", value: function add(instruction) { this.instructions.push(instruction); } /** * Compile transaction data */ }, { key: "compileMessage", value: function compileMessage() { var recentBlockhash = this.recentBlockhash; if (!recentBlockhash) { throw new _error.SDKError(this.compileMessage.name, 'Transaction recentBlockhash required'); } if (this.instructions.length < 1) { console.warn('No instructions provided'); } var feePayer; if (this.feePayer) { feePayer = this.feePayer; } else { throw new Error('Transaction fee payer required'); } for (var i = 0; i < this.instructions.length; i++) { if (this.instructions[i].programId === undefined) { throw new Error("Transaction instruction index ".concat(i, " has undefined program id")); } } var programIds = []; var accountMetas = []; this.instructions.forEach(function (instruction) { instruction.accounts.forEach(function (accountMeta) { accountMetas.push(_objectSpread({}, accountMeta)); }); var programId = instruction.programId.toString(); if (!programIds.includes(programId)) { programIds.push(programId); } }); // Append programID account metas programIds.forEach(function (programId) { accountMetas.push({ pubkey: programId, isSigner: false, isWritable: false }); }); // Sort. Prioritizing first by signer, then by writable accountMetas.sort(function (x, y) { var pubkeySorting = stringUtil.toBase58(x.pubkey).localeCompare(stringUtil.toBase58(y.pubkey)); var checkSigner = x.isSigner === y.isSigner ? 0 : x.isSigner ? -1 : 1; var checkWritable = x.isWritable === y.isWritable ? pubkeySorting : x.isWritable ? -1 : 1; return checkSigner || checkWritable; }); // Cull duplicate account metas var uniqueMetas = []; accountMetas.forEach(function (accountMeta) { var uniqueIndex = uniqueMetas.findIndex(function (x) { return x.pubkey === accountMeta.pubkey; }); if (uniqueIndex > -1) { uniqueMetas[uniqueIndex].isWritable = uniqueMetas[uniqueIndex].isWritable || accountMeta.isWritable; } else { uniqueMetas.push(accountMeta); } }); // Move fee payer to the front var feePayerIndex = uniqueMetas.findIndex(function (x) { return stringUtil.toPublicKey(x.pubkey) === feePayer; }); if (feePayerIndex > -1) { var _uniqueMetas$splice = uniqueMetas.splice(feePayerIndex, 1), _uniqueMetas$splice2 = (0, _slicedToArray2["default"])(_uniqueMetas$splice, 1), payerMeta = _uniqueMetas$splice2[0]; payerMeta.isSigner = true; payerMeta.isWritable = true; uniqueMetas.unshift(payerMeta); } else { uniqueMetas.unshift({ pubkey: feePayer, isSigner: true, isWritable: true }); } var numRequiredSignatures = 0; var numReadonlySignedAccounts = 0; var numReadonlyUnsignedAccounts = 0; // Split out signing from non-signing keys and count header values var signedKeys = []; var unsignedKeys = []; uniqueMetas.forEach(function (_ref2) { var pubkey = _ref2.pubkey, isSigner = _ref2.isSigner, isWritable = _ref2.isWritable; if (isSigner) { signedKeys.push(pubkey.toString()); numRequiredSignatures += 1; if (!isWritable) { numReadonlySignedAccounts += 1; } } else { unsignedKeys.push(pubkey.toString()); if (!isWritable) { numReadonlyUnsignedAccounts += 1; } } }); var accountKeys = signedKeys.concat(unsignedKeys); var instructions = this.instructions.map(function (instruction) { var data = instruction.data, programId = instruction.programId; return { programIdIndex: accountKeys.indexOf(programId.toString()), accounts: instruction.accounts.map(function (meta) { return accountKeys.indexOf(meta.pubkey.toString()); }), data: stringUtil.formHex(data) }; }); return new _message.Message({ header: { numRequiredSignatures: numRequiredSignatures, numReadonlySignedAccounts: numReadonlySignedAccounts, numReadonlyUnsignedAccounts: numReadonlyUnsignedAccounts }, accountKeys: accountKeys, recentBlockhash: recentBlockhash, instructions: instructions }); } /** * Return sendable tx string with given signature. * * @param signature signature generated by CoolWallet Pro * @returns */ }, { key: "toTxString", value: function toTxString(signature) { this.signature = signature; return '01' + this.signature + Buffer.from(this.compileMessage().serialize()).toString('hex'); } }]); return Transaction; }(); exports.Transaction = Transaction; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXJyb3IiLCJyZXF1aXJlIiwic3RyaW5nVXRpbCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX21lc3NhZ2UiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0Iiwib3duS2V5cyIsIm9iamVjdCIsImVudW1lcmFibGVPbmx5Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsInN5bWJvbHMiLCJmaWx0ZXIiLCJzeW0iLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsInRhcmdldCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiIsIm9wdHMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiQnVmZmVyIiwiYWxsb2MiLCJwcm9ncmFtSWQiLCJkYXRhIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwidG9KU09OIiwibWFwIiwiX3JlZiIsInB1YmtleSIsImlzU2lnbmVyIiwiaXNXcml0YWJsZSIsInRvQmFzZTU4IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImV4cG9ydHMiLCJUcmFuc2FjdGlvbiIsInR4IiwiZmVlUGF5ZXIiLCJmb3JtSGV4IiwicmVjZW50QmxvY2toYXNoIiwiaW5zdHJ1Y3Rpb25zIiwiaW5zdHJ1Y3Rpb24iLCJhY2NvdW50cyIsImFjY291bnQiLCJhZGQiLCJjb21waWxlTWVzc2FnZSIsIlNES0Vycm9yIiwibmFtZSIsImNvbnNvbGUiLCJ3YXJuIiwiRXJyb3IiLCJ1bmRlZmluZWQiLCJjb25jYXQiLCJwcm9ncmFtSWRzIiwiYWNjb3VudE1ldGFzIiwiYWNjb3VudE1ldGEiLCJ0b1N0cmluZyIsImluY2x1ZGVzIiwic29ydCIsIngiLCJ5IiwicHVia2V5U29ydGluZyIsImxvY2FsZUNvbXBhcmUiLCJjaGVja1NpZ25lciIsImNoZWNrV3JpdGFibGUiLCJ1bmlxdWVNZXRhcyIsInVuaXF1ZUluZGV4IiwiZmluZEluZGV4IiwiZmVlUGF5ZXJJbmRleCIsInRvUHVibGljS2V5IiwiX3VuaXF1ZU1ldGFzJHNwbGljZSIsInNwbGljZSIsIl91bmlxdWVNZXRhcyRzcGxpY2UyIiwiX3NsaWNlZFRvQXJyYXkyIiwicGF5ZXJNZXRhIiwidW5zaGlmdCIsIm51bVJlcXVpcmVkU2lnbmF0dXJlcyIsIm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMiLCJudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMiLCJzaWduZWRLZXlzIiwidW5zaWduZWRLZXlzIiwiX3JlZjIiLCJhY2NvdW50S2V5cyIsInByb2dyYW1JZEluZGV4IiwiaW5kZXhPZiIsIm1ldGEiLCJNZXNzYWdlIiwiaGVhZGVyIiwidG9UeFN0cmluZyIsInNpZ25hdHVyZSIsImZyb20iLCJzZXJpYWxpemUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvVHJhbnNhY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU0RLRXJyb3IgfSBmcm9tICdAY29vbHdhbGxldC9jb3JlL2xpYi9lcnJvcic7XG5pbXBvcnQgKiBhcyBzdHJpbmdVdGlsIGZyb20gJy4vc3RyaW5nVXRpbCc7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuaW1wb3J0IHsgUHVibGljS2V5IH0gZnJvbSAnLi9wdWJsaWNrZXknO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4uL21lc3NhZ2UnO1xuXG4vKipcbiAqIExpc3Qgb2YgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiBvYmplY3QgZmllbGRzIHRoYXQgbWF5IGJlIGluaXRpYWxpemVkIGF0IGNvbnN0cnVjdGlvblxuICovXG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkluc3RydWN0aW9uQ3RvckZpZWxkcyA9IHtcbiAga2V5czogQXJyYXk8dHlwZXMuQWNjb3VudE1ldGE+O1xuICBwcm9ncmFtSWQ6IFB1YmxpY0tleTtcbiAgZGF0YT86IEJ1ZmZlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbkpTT04ge1xuICBrZXlzOiB7XG4gICAgcHVia2V5OiBzdHJpbmc7XG4gICAgaXNTaWduZXI6IGJvb2xlYW47XG4gICAgaXNXcml0YWJsZTogYm9vbGVhbjtcbiAgfVtdO1xuICBwcm9ncmFtSWQ6IHN0cmluZztcbiAgZGF0YTogbnVtYmVyW107XG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gSW5zdHJ1Y3Rpb24gY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24ge1xuICAvKipcbiAgICogUHVibGljIGtleXMgdG8gaW5jbHVkZSBpbiB0aGlzIHRyYW5zYWN0aW9uXG4gICAqIEJvb2xlYW4gcmVwcmVzZW50cyB3aGV0aGVyIHRoaXMgcHVia2V5IG5lZWRzIHRvIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBrZXlzOiBBcnJheTx0eXBlcy5BY2NvdW50TWV0YT47XG5cbiAgLyoqXG4gICAqIFByb2dyYW0gSWQgdG8gZXhlY3V0ZVxuICAgKi9cbiAgcHJvZ3JhbUlkOiBQdWJsaWNLZXk7XG5cbiAgLyoqXG4gICAqIFByb2dyYW0gaW5wdXRcbiAgICovXG4gIGRhdGE6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcblxuICBjb25zdHJ1Y3RvcihvcHRzOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uQ3RvckZpZWxkcykge1xuICAgIHRoaXMucHJvZ3JhbUlkID0gb3B0cy5wcm9ncmFtSWQ7XG4gICAgdGhpcy5rZXlzID0gb3B0cy5rZXlzO1xuICAgIGlmIChvcHRzLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IG9wdHMuZGF0YTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICB0b0pTT04oKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBrZXlzOiB0aGlzLmtleXMubWFwKCh7IHB1YmtleSwgaXNTaWduZXIsIGlzV3JpdGFibGUgfSkgPT4gKHtcbiAgICAgICAgcHVia2V5OiBzdHJpbmdVdGlsLnRvQmFzZTU4KHB1YmtleSksXG4gICAgICAgIGlzU2lnbmVyLFxuICAgICAgICBpc1dyaXRhYmxlLFxuICAgICAgfSkpLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZC50b0pTT04oKSxcbiAgICAgIGRhdGE6IFsuLi50aGlzLmRhdGFdLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgZmVlUGF5ZXI6IHN0cmluZztcbiAgcmVjZW50QmxvY2toYXNoOiBzdHJpbmc7XG4gIGluc3RydWN0aW9uczogdHlwZXMuVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdO1xuICBzaWduYXR1cmU/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IodHg6IHR5cGVzLlRyYW5zYWN0aW9uQXJncykge1xuICAgIHRoaXMuZmVlUGF5ZXIgPSBzdHJpbmdVdGlsLmZvcm1IZXgodHguZmVlUGF5ZXIpO1xuICAgIHRoaXMucmVjZW50QmxvY2toYXNoID0gc3RyaW5nVXRpbC5mb3JtSGV4KHR4LnJlY2VudEJsb2NraGFzaCk7XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMgPSB0eC5pbnN0cnVjdGlvbnMubWFwKChpbnN0cnVjdGlvbikgPT4gKHtcbiAgICAgIC4uLmluc3RydWN0aW9uLFxuICAgICAgcHJvZ3JhbUlkOiBzdHJpbmdVdGlsLmZvcm1IZXgoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSxcbiAgICAgIGFjY291bnRzOiBpbnN0cnVjdGlvbi5hY2NvdW50cy5tYXAoKGFjY291bnQpID0+ICh7XG4gICAgICAgIC4uLmFjY291bnQsXG4gICAgICAgIHB1YmtleTogc3RyaW5nVXRpbC5mb3JtSGV4KGFjY291bnQucHVia2V5KSxcbiAgICAgIH0pKSxcbiAgICB9KSk7XG4gIH1cblxuICBhZGQoaW5zdHJ1Y3Rpb246IHR5cGVzLlRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmluc3RydWN0aW9ucy5wdXNoKGluc3RydWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21waWxlIHRyYW5zYWN0aW9uIGRhdGFcbiAgICovXG4gIGNvbXBpbGVNZXNzYWdlKCk6IE1lc3NhZ2Uge1xuICAgIGNvbnN0IHsgcmVjZW50QmxvY2toYXNoIH0gPSB0aGlzO1xuICAgIGlmICghcmVjZW50QmxvY2toYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgU0RLRXJyb3IodGhpcy5jb21waWxlTWVzc2FnZS5uYW1lLCAnVHJhbnNhY3Rpb24gcmVjZW50QmxvY2toYXNoIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCA8IDEpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gaW5zdHJ1Y3Rpb25zIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgbGV0IGZlZVBheWVyOiBzdHJpbmc7XG4gICAgaWYgKHRoaXMuZmVlUGF5ZXIpIHtcbiAgICAgIGZlZVBheWVyID0gdGhpcy5mZWVQYXllcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBmZWUgcGF5ZXIgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnNbaV0ucHJvZ3JhbUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiBpbnN0cnVjdGlvbiBpbmRleCAke2l9IGhhcyB1bmRlZmluZWQgcHJvZ3JhbSBpZGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb2dyYW1JZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWNjb3VudE1ldGFzOiB0eXBlcy5BY2NvdW50TWV0YVtdID0gW107XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgIGluc3RydWN0aW9uLmFjY291bnRzLmZvckVhY2goKGFjY291bnRNZXRhKSA9PiB7XG4gICAgICAgIGFjY291bnRNZXRhcy5wdXNoKHsgLi4uYWNjb3VudE1ldGEgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJvZ3JhbUlkID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICBpZiAoIXByb2dyYW1JZHMuaW5jbHVkZXMocHJvZ3JhbUlkKSkge1xuICAgICAgICBwcm9ncmFtSWRzLnB1c2gocHJvZ3JhbUlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCBwcm9ncmFtSUQgYWNjb3VudCBtZXRhc1xuICAgIHByb2dyYW1JZHMuZm9yRWFjaCgocHJvZ3JhbUlkKSA9PiB7XG4gICAgICBhY2NvdW50TWV0YXMucHVzaCh7XG4gICAgICAgIHB1YmtleTogcHJvZ3JhbUlkLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBTb3J0LiBQcmlvcml0aXppbmcgZmlyc3QgYnkgc2lnbmVyLCB0aGVuIGJ5IHdyaXRhYmxlXG4gICAgYWNjb3VudE1ldGFzLnNvcnQoZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgIGNvbnN0IHB1YmtleVNvcnRpbmcgPSBzdHJpbmdVdGlsLnRvQmFzZTU4KHgucHVia2V5KS5sb2NhbGVDb21wYXJlKHN0cmluZ1V0aWwudG9CYXNlNTgoeS5wdWJrZXkpKTtcbiAgICAgIGNvbnN0IGNoZWNrU2lnbmVyID0geC5pc1NpZ25lciA9PT0geS5pc1NpZ25lciA/IDAgOiB4LmlzU2lnbmVyID8gLTEgOiAxO1xuICAgICAgY29uc3QgY2hlY2tXcml0YWJsZSA9IHguaXNXcml0YWJsZSA9PT0geS5pc1dyaXRhYmxlID8gcHVia2V5U29ydGluZyA6IHguaXNXcml0YWJsZSA/IC0xIDogMTtcbiAgICAgIHJldHVybiBjaGVja1NpZ25lciB8fCBjaGVja1dyaXRhYmxlO1xuICAgIH0pO1xuXG4gICAgLy8gQ3VsbCBkdXBsaWNhdGUgYWNjb3VudCBtZXRhc1xuICAgIGNvbnN0IHVuaXF1ZU1ldGFzOiB0eXBlcy5BY2NvdW50TWV0YVtdID0gW107XG4gICAgYWNjb3VudE1ldGFzLmZvckVhY2goKGFjY291bnRNZXRhKSA9PiB7XG4gICAgICBjb25zdCB1bmlxdWVJbmRleCA9IHVuaXF1ZU1ldGFzLmZpbmRJbmRleCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4geC5wdWJrZXkgPT09IGFjY291bnRNZXRhLnB1YmtleTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHVuaXF1ZUluZGV4ID4gLTEpIHtcbiAgICAgICAgdW5pcXVlTWV0YXNbdW5pcXVlSW5kZXhdLmlzV3JpdGFibGUgPSB1bmlxdWVNZXRhc1t1bmlxdWVJbmRleF0uaXNXcml0YWJsZSB8fCBhY2NvdW50TWV0YS5pc1dyaXRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5pcXVlTWV0YXMucHVzaChhY2NvdW50TWV0YSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNb3ZlIGZlZSBwYXllciB0byB0aGUgZnJvbnRcbiAgICBjb25zdCBmZWVQYXllckluZGV4ID0gdW5pcXVlTWV0YXMuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICByZXR1cm4gc3RyaW5nVXRpbC50b1B1YmxpY0tleSh4LnB1YmtleSkgPT09IGZlZVBheWVyO1xuICAgIH0pO1xuICAgIGlmIChmZWVQYXllckluZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IFtwYXllck1ldGFdID0gdW5pcXVlTWV0YXMuc3BsaWNlKGZlZVBheWVySW5kZXgsIDEpO1xuICAgICAgcGF5ZXJNZXRhLmlzU2lnbmVyID0gdHJ1ZTtcbiAgICAgIHBheWVyTWV0YS5pc1dyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIHVuaXF1ZU1ldGFzLnVuc2hpZnQocGF5ZXJNZXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pcXVlTWV0YXMudW5zaGlmdCh7XG4gICAgICAgIHB1YmtleTogZmVlUGF5ZXIsXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IG51bVJlcXVpcmVkU2lnbmF0dXJlcyA9IDA7XG4gICAgbGV0IG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMgPSAwO1xuICAgIGxldCBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMgPSAwO1xuXG4gICAgLy8gU3BsaXQgb3V0IHNpZ25pbmcgZnJvbSBub24tc2lnbmluZyBrZXlzIGFuZCBjb3VudCBoZWFkZXIgdmFsdWVzXG4gICAgY29uc3Qgc2lnbmVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB1bnNpZ25lZEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgdW5pcXVlTWV0YXMuZm9yRWFjaCgoeyBwdWJrZXksIGlzU2lnbmVyLCBpc1dyaXRhYmxlIH0pID0+IHtcbiAgICAgIGlmIChpc1NpZ25lcikge1xuICAgICAgICBzaWduZWRLZXlzLnB1c2gocHVia2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXMgKz0gMTtcbiAgICAgICAgaWYgKCFpc1dyaXRhYmxlKSB7XG4gICAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyArPSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnNpZ25lZEtleXMucHVzaChwdWJrZXkudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICghaXNXcml0YWJsZSkge1xuICAgICAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyArPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2NvdW50S2V5cyA9IHNpZ25lZEtleXMuY29uY2F0KHVuc2lnbmVkS2V5cyk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zOiB0eXBlcy5Db21wbGllZEluc3RydWN0aW9uW10gPSB0aGlzLmluc3RydWN0aW9ucy5tYXAoKGluc3RydWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCB7IGRhdGEsIHByb2dyYW1JZCB9ID0gaW5zdHJ1Y3Rpb247XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9ncmFtSWRJbmRleDogYWNjb3VudEtleXMuaW5kZXhPZihwcm9ncmFtSWQudG9TdHJpbmcoKSksXG4gICAgICAgIGFjY291bnRzOiBpbnN0cnVjdGlvbi5hY2NvdW50cy5tYXAoKG1ldGEpID0+IGFjY291bnRLZXlzLmluZGV4T2YobWV0YS5wdWJrZXkudG9TdHJpbmcoKSkpLFxuICAgICAgICBkYXRhOiBzdHJpbmdVdGlsLmZvcm1IZXgoZGF0YSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlKHtcbiAgICAgIGhlYWRlcjoge1xuICAgICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXMsXG4gICAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMsXG4gICAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyxcbiAgICAgIH0sXG4gICAgICBhY2NvdW50S2V5cyxcbiAgICAgIHJlY2VudEJsb2NraGFzaCxcbiAgICAgIGluc3RydWN0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc2VuZGFibGUgdHggc3RyaW5nIHdpdGggZ2l2ZW4gc2lnbmF0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0gc2lnbmF0dXJlIHNpZ25hdHVyZSBnZW5lcmF0ZWQgYnkgQ29vbFdhbGxldCBQcm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIHRvVHhTdHJpbmcoc2lnbmF0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgIHJldHVybiAnMDEnICsgdGhpcy5zaWduYXR1cmUgKyBCdWZmZXIuZnJvbSh0aGlzLmNvbXBpbGVNZXNzYWdlKCkuc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBR0EsSUFBQUcsUUFBQSxHQUFBSCxPQUFBO0FBQXFDLFNBQUFJLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBSCx3QkFBQU8sR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLGFBQUFFLE9BQUEsQ0FBQUYsR0FBQSx5QkFBQUEsR0FBQSx1Q0FBQUEsR0FBQSxVQUFBRyxLQUFBLEdBQUFSLHdCQUFBLENBQUFDLFdBQUEsT0FBQU8sS0FBQSxJQUFBQSxLQUFBLENBQUFDLEdBQUEsQ0FBQUosR0FBQSxZQUFBRyxLQUFBLENBQUFFLEdBQUEsQ0FBQUwsR0FBQSxTQUFBTSxNQUFBLFdBQUFDLHFCQUFBLEdBQUFDLE1BQUEsQ0FBQUMs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