@coolwallet/sol
Version:
Coolwallet Solana sdk
154 lines (153 loc) • 26.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.encodeAndPaddingSeedInstructionBuffer = encodeAndPaddingSeedInstructionBuffer;
exports.encodeInstructionBuffer = encodeInstructionBuffer;
exports.encodeSignData = encodeSignData;
exports.initAndPaddingComputeBudgetInstructionBuffer = initAndPaddingComputeBudgetInstructionBuffer;
exports.paddingSeedInstructionBuffer = paddingSeedInstructionBuffer;
var _params = require("../config/params");
var _bufferLayoutUtils = require("./bufferLayoutUtils");
var _instructions = require("./instructions");
function initializeInsructionBuffer(instructionCount) {
var instructionBuffer = Buffer.alloc(_params.PACKET_DATA_SIZE);
if (instructionCount) {
Buffer.from(instructionCount).copy(instructionBuffer);
}
var instructionBufferLength = !instructionCount ? 0 : instructionCount.length;
return {
instructionBuffer: instructionBuffer,
instructionBufferLength: instructionBufferLength
};
}
function paddingEmptyInstructionBuffer(params) {
var paddingLength = params.paddingLength,
sourceInstructionBuf = params.sourceInstructionBuf,
sourceInstructionLength = params.sourceInstructionLength;
var emptyPaddingBuf = Buffer.alloc(paddingLength);
emptyPaddingBuf.copy(sourceInstructionBuf, sourceInstructionLength);
return {
instructionBuffer: sourceInstructionBuf,
instructionBufferLength: sourceInstructionLength + paddingLength
};
}
function paddingEmptyComputeBudgetInsructionBuffer(srcInstructionBuffer, srcInstructionBufferLength, hasGasPriceComputeBudget, hasGasLimitComputeBudget) {
var instructionBuffer = srcInstructionBuffer;
var instructionBufferLength = srcInstructionBufferLength;
if (!hasGasPriceComputeBudget) {
var paddingEmptyGasPrice = paddingEmptyInstructionBuffer({
paddingLength: 12,
sourceInstructionBuf: srcInstructionBuffer,
sourceInstructionLength: srcInstructionBufferLength
});
instructionBuffer = paddingEmptyGasPrice.instructionBuffer;
instructionBufferLength = paddingEmptyGasPrice.instructionBufferLength;
}
if (!hasGasLimitComputeBudget) {
var paddingEmptyGasLimit = paddingEmptyInstructionBuffer({
paddingLength: 8,
sourceInstructionBuf: instructionBuffer,
sourceInstructionLength: instructionBufferLength
});
instructionBuffer = paddingEmptyGasLimit.instructionBuffer;
instructionBufferLength = paddingEmptyGasLimit.instructionBufferLength;
}
return {
instructionBuffer: instructionBuffer,
instructionBufferLength: instructionBufferLength
};
}
function initAndPaddingComputeBudgetInstructionBuffer(accountKeys, instructions, instructionCount) {
var initializeInstruction = initializeInsructionBuffer(instructionCount);
var hasGasPriceComputeBudget = (0, _instructions.hasSpecificInstruction)(accountKeys, instructions, _params.COMPUTE_BUDGET_PROGRAM_ID, 3);
var hasGasLimitComputeBudget = (0, _instructions.hasSpecificInstruction)(accountKeys, instructions, _params.COMPUTE_BUDGET_PROGRAM_ID, 2);
var paddingInstruction = paddingEmptyComputeBudgetInsructionBuffer(initializeInstruction.instructionBuffer, initializeInstruction.instructionBufferLength, hasGasPriceComputeBudget, hasGasLimitComputeBudget);
return {
instructionBuffer: paddingInstruction.instructionBuffer,
instructionBufferLength: paddingInstruction.instructionBufferLength
};
}
function paddingSeedInstructionBuffer(srcInstructionBuffer, srcInstructionBufferLength, seedData) {
/*
Since seed is length variant, trying to padding seed to length 32 bytes:
Default structure:
instruction(4 bytes),
basePubkey(32 bytes),
length(4 bytes),
lengthPadding(4 bytes),
seed(variant),
lamports(8 bytes),
space(8 bytes),
programId(32 bytes)
After structure:
instruction(4 bytes),
basePubkey(32 bytes),
length(4 bytes),
lengthPadding(4 bytes),
seed(32 bytes),
lamports(8 bytes),
space(8 bytes),
programId(32 bytes)
*/
var defaultLength = 92;
var prefixLength = 44;
var seedLength = seedData.length - defaultLength;
var dataAllocator = Buffer.allocUnsafe(seedData.length - seedLength + 32);
var dataPrefix = Buffer.from(seedData.slice(0, prefixLength));
var seed = Buffer.from(seedData.slice(prefixLength, prefixLength + seedLength));
var dataPostfix = Buffer.from(seedData.slice(prefixLength + seedLength, seedData.length));
var paddingSeed = Buffer.alloc(32);
seed.copy(paddingSeed, 32 - seed.length);
dataPrefix.copy(dataAllocator, 0);
paddingSeed.copy(dataAllocator, dataPrefix.length);
dataPostfix.copy(dataAllocator, dataPrefix.length + paddingSeed.length);
var copiedBufferLength = dataAllocator.copy(srcInstructionBuffer, srcInstructionBufferLength);
return {
instructionBuffer: srcInstructionBuffer,
instructionBufferLength: srcInstructionBufferLength + copiedBufferLength
};
}
function encodeInstructionBuffer(instructions, srcInstructionBuffer, srcInstructionBufferLength) {
var instructionBuffer = srcInstructionBuffer;
var instructionBufferLength = srcInstructionBufferLength;
instructions.forEach(function (instruction) {
var instructionLayout = (0, _bufferLayoutUtils.structInstructionLayout)(instruction);
instructionBufferLength += instructionLayout.encode(instruction, instructionBuffer, instructionBufferLength);
});
return instructionBuffer.slice(0, instructionBufferLength);
}
function encodeAndPaddingSeedInstructionBuffer(accountKeys, instructions, srcInstructionBuffer, srcInstructionBufferLength) {
var instructionBuffer = srcInstructionBuffer;
var instructionBufferLength = srcInstructionBufferLength;
instructions.forEach(function (instruction) {
var instructionLayout;
var isCreateSeedInstruction = (0, _instructions.isSpecificInstruction)(accountKeys, instruction, _params.SYSTEM_PROGRAM_ID, 3);
if (isCreateSeedInstruction) {
instructionLayout = (0, _bufferLayoutUtils.structInstructionLayoutWithoutData)(instruction);
instructionBufferLength += instructionLayout.encode(instruction, instructionBuffer, instructionBufferLength);
var paddingSeedInstruction = paddingSeedInstructionBuffer(instructionBuffer, instructionBufferLength, instruction.data);
instructionBuffer = paddingSeedInstruction.instructionBuffer;
instructionBufferLength = paddingSeedInstruction.instructionBufferLength;
} else {
instructionLayout = (0, _bufferLayoutUtils.structInstructionLayout)(instruction);
instructionBufferLength += instructionLayout.encode(instruction, instructionBuffer, instructionBufferLength);
}
});
return instructionBuffer.slice(0, instructionBufferLength);
}
function encodeSignData(keyCount, newAccountKeys, recentBlockhash, instructionBuffer) {
var signDataLayout = (0, _bufferLayoutUtils.structSignDataLayout)(keyCount, newAccountKeys);
var transaction = {
keyCount: Buffer.from(keyCount),
keys: newAccountKeys.map(function (key) {
return Buffer.from(key, 'hex');
}),
recentBlockhash: Buffer.from(recentBlockhash, 'hex')
};
var signData = Buffer.alloc(2048); // sign data max length
var length = signDataLayout.encode(transaction, signData);
instructionBuffer.copy(signData, length);
return signData.slice(0, length + instructionBuffer.length);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGFyYW1zIiwicmVxdWlyZSIsIl9idWZmZXJMYXlvdXRVdGlscyIsIl9pbnN0cnVjdGlvbnMiLCJpbml0aWFsaXplSW5zcnVjdGlvbkJ1ZmZlciIsImluc3RydWN0aW9uQ291bnQiLCJpbnN0cnVjdGlvbkJ1ZmZlciIsIkJ1ZmZlciIsImFsbG9jIiwiUEFDS0VUX0RBVEFfU0laRSIsImZyb20iLCJjb3B5IiwiaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGgiLCJsZW5ndGgiLCJwYWRkaW5nRW1wdHlJbnN0cnVjdGlvbkJ1ZmZlciIsInBhcmFtcyIsInBhZGRpbmdMZW5ndGgiLCJzb3VyY2VJbnN0cnVjdGlvbkJ1ZiIsInNvdXJjZUluc3RydWN0aW9uTGVuZ3RoIiwiZW1wdHlQYWRkaW5nQnVmIiwicGFkZGluZ0VtcHR5Q29tcHV0ZUJ1ZGdldEluc3J1Y3Rpb25CdWZmZXIiLCJzcmNJbnN0cnVjdGlvbkJ1ZmZlciIsInNyY0luc3RydWN0aW9uQnVmZmVyTGVuZ3RoIiwiaGFzR2FzUHJpY2VDb21wdXRlQnVkZ2V0IiwiaGFzR2FzTGltaXRDb21wdXRlQnVkZ2V0IiwicGFkZGluZ0VtcHR5R2FzUHJpY2UiLCJwYWRkaW5nRW1wdHlHYXNMaW1pdCIsImluaXRBbmRQYWRkaW5nQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uQnVmZmVyIiwiYWNjb3VudEtleXMiLCJpbnN0cnVjdGlvbnMiLCJpbml0aWFsaXplSW5zdHJ1Y3Rpb24iLCJoYXNTcGVjaWZpY0luc3RydWN0aW9uIiwiQ09NUFVURV9CVURHRVRfUFJPR1JBTV9JRCIsInBhZGRpbmdJbnN0cnVjdGlvbiIsInBhZGRpbmdTZWVkSW5zdHJ1Y3Rpb25CdWZmZXIiLCJzZWVkRGF0YSIsImRlZmF1bHRMZW5ndGgiLCJwcmVmaXhMZW5ndGgiLCJzZWVkTGVuZ3RoIiwiZGF0YUFsbG9jYXRvciIsImFsbG9jVW5zYWZlIiwiZGF0YVByZWZpeCIsInNsaWNlIiwic2VlZCIsImRhdGFQb3N0Zml4IiwicGFkZGluZ1NlZWQiLCJjb3BpZWRCdWZmZXJMZW5ndGgiLCJlbmNvZGVJbnN0cnVjdGlvbkJ1ZmZlciIsImZvckVhY2giLCJpbnN0cnVjdGlvbiIsImluc3RydWN0aW9uTGF5b3V0Iiwic3RydWN0SW5zdHJ1Y3Rpb25MYXlvdXQiLCJlbmNvZGUiLCJlbmNvZGVBbmRQYWRkaW5nU2VlZEluc3RydWN0aW9uQnVmZmVyIiwiaXNDcmVhdGVTZWVkSW5zdHJ1Y3Rpb24iLCJpc1NwZWNpZmljSW5zdHJ1Y3Rpb24iLCJTWVNURU1fUFJPR1JBTV9JRCIsInN0cnVjdEluc3RydWN0aW9uTGF5b3V0V2l0aG91dERhdGEiLCJwYWRkaW5nU2VlZEluc3RydWN0aW9uIiwiZGF0YSIsImVuY29kZVNpZ25EYXRhIiwia2V5Q291bnQiLCJuZXdBY2NvdW50S2V5cyIsInJlY2VudEJsb2NraGFzaCIsInNpZ25EYXRhTGF5b3V0Iiwic3RydWN0U2lnbkRhdGFMYXlvdXQiLCJ0cmFuc2FjdGlvbiIsImtleXMiLCJtYXAiLCJrZXkiLCJzaWduRGF0YSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9idWZmZXJVdGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT01QVVRFX0JVREdFVF9QUk9HUkFNX0lELCBQQUNLRVRfREFUQV9TSVpFLCBTWVNURU1fUFJPR1JBTV9JRCB9IGZyb20gJy4uL2NvbmZpZy9wYXJhbXMnO1xuaW1wb3J0IHsgU2VyaWFsaXplZEluc3RydWN0aW9uIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCB7IHN0cnVjdEluc3RydWN0aW9uTGF5b3V0LCBzdHJ1Y3RJbnN0cnVjdGlvbkxheW91dFdpdGhvdXREYXRhLCBzdHJ1Y3RTaWduRGF0YUxheW91dCB9IGZyb20gJy4vYnVmZmVyTGF5b3V0VXRpbHMnO1xuaW1wb3J0IHsgaGFzU3BlY2lmaWNJbnN0cnVjdGlvbiwgaXNTcGVjaWZpY0luc3RydWN0aW9uIH0gZnJvbSAnLi9pbnN0cnVjdGlvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluc3J1Y3Rpb25CdWZmZXJJbmZvIHtcbiAgaW5zdHJ1Y3Rpb25CdWZmZXI6IEJ1ZmZlcjtcbiAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg6IG51bWJlcjtcbn1cbmZ1bmN0aW9uIGluaXRpYWxpemVJbnNydWN0aW9uQnVmZmVyKGluc3RydWN0aW9uQ291bnQ/OiBudW1iZXJbXSk6IEluc3J1Y3Rpb25CdWZmZXJJbmZvIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25CdWZmZXIgPSBCdWZmZXIuYWxsb2MoUEFDS0VUX0RBVEFfU0laRSk7XG4gIGlmIChpbnN0cnVjdGlvbkNvdW50KSB7XG4gICAgQnVmZmVyLmZyb20oaW5zdHJ1Y3Rpb25Db3VudCkuY29weShpbnN0cnVjdGlvbkJ1ZmZlcik7XG4gIH1cbiAgY29uc3QgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggPSAhaW5zdHJ1Y3Rpb25Db3VudCA/IDAgOiBpbnN0cnVjdGlvbkNvdW50Lmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFkZGluZ0VtcHR5SW5zdHJ1Y3Rpb25CdWZmZXIocGFyYW1zOiB7XG4gIHBhZGRpbmdMZW5ndGg6IG51bWJlcjtcbiAgc291cmNlSW5zdHJ1Y3Rpb25CdWY6IEJ1ZmZlcjtcbiAgc291cmNlSW5zdHJ1Y3Rpb25MZW5ndGg6IG51bWJlcjtcbn0pOiBJbnNydWN0aW9uQnVmZmVySW5mbyB7XG4gIGNvbnN0IHsgcGFkZGluZ0xlbmd0aCwgc291cmNlSW5zdHJ1Y3Rpb25CdWYsIHNvdXJjZUluc3RydWN0aW9uTGVuZ3RoIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVtcHR5UGFkZGluZ0J1ZiA9IEJ1ZmZlci5hbGxvYyhwYWRkaW5nTGVuZ3RoKTtcbiAgZW1wdHlQYWRkaW5nQnVmLmNvcHkoc291cmNlSW5zdHJ1Y3Rpb25CdWYsIHNvdXJjZUluc3RydWN0aW9uTGVuZ3RoKTtcbiAgcmV0dXJuIHtcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlcjogc291cmNlSW5zdHJ1Y3Rpb25CdWYsXG4gICAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg6IHNvdXJjZUluc3RydWN0aW9uTGVuZ3RoICsgcGFkZGluZ0xlbmd0aCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFkZGluZ0VtcHR5Q29tcHV0ZUJ1ZGdldEluc3J1Y3Rpb25CdWZmZXIoXG4gIHNyY0luc3RydWN0aW9uQnVmZmVyOiBCdWZmZXIsXG4gIHNyY0luc3RydWN0aW9uQnVmZmVyTGVuZ3RoOiBudW1iZXIsXG4gIGhhc0dhc1ByaWNlQ29tcHV0ZUJ1ZGdldDogYm9vbGVhbixcbiAgaGFzR2FzTGltaXRDb21wdXRlQnVkZ2V0OiBib29sZWFuXG4pOiBJbnNydWN0aW9uQnVmZmVySW5mbyB7XG4gIGxldCBpbnN0cnVjdGlvbkJ1ZmZlciA9IHNyY0luc3RydWN0aW9uQnVmZmVyO1xuICBsZXQgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggPSBzcmNJbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDtcbiAgaWYgKCFoYXNHYXNQcmljZUNvbXB1dGVCdWRnZXQpIHtcbiAgICBjb25zdCBwYWRkaW5nRW1wdHlHYXNQcmljZSA9IHBhZGRpbmdFbXB0eUluc3RydWN0aW9uQnVmZmVyKHtcbiAgICAgIHBhZGRpbmdMZW5ndGg6IDEyLFxuICAgICAgc291cmNlSW5zdHJ1Y3Rpb25CdWY6IHNyY0luc3RydWN0aW9uQnVmZmVyLFxuICAgICAgc291cmNlSW5zdHJ1Y3Rpb25MZW5ndGg6IHNyY0luc3RydWN0aW9uQnVmZmVyTGVuZ3RoLFxuICAgIH0pO1xuICAgIGluc3RydWN0aW9uQnVmZmVyID0gcGFkZGluZ0VtcHR5R2FzUHJpY2UuaW5zdHJ1Y3Rpb25CdWZmZXI7XG4gICAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggPSBwYWRkaW5nRW1wdHlHYXNQcmljZS5pbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDtcbiAgfVxuICBpZiAoIWhhc0dhc0xpbWl0Q29tcHV0ZUJ1ZGdldCkge1xuICAgIGNvbnN0IHBhZGRpbmdFbXB0eUdhc0xpbWl0ID0gcGFkZGluZ0VtcHR5SW5zdHJ1Y3Rpb25CdWZmZXIoe1xuICAgICAgcGFkZGluZ0xlbmd0aDogOCxcbiAgICAgIHNvdXJjZUluc3RydWN0aW9uQnVmOiBpbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICAgIHNvdXJjZUluc3RydWN0aW9uTGVuZ3RoOiBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCxcbiAgICB9KTtcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlciA9IHBhZGRpbmdFbXB0eUdhc0xpbWl0Lmluc3RydWN0aW9uQnVmZmVyO1xuICAgIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoID0gcGFkZGluZ0VtcHR5R2FzTGltaXQuaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRBbmRQYWRkaW5nQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uQnVmZmVyKFxuICBhY2NvdW50S2V5czogc3RyaW5nW10sXG4gIGluc3RydWN0aW9uczogU2VyaWFsaXplZEluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uQ291bnQ/OiBudW1iZXJbXVxuKTogSW5zcnVjdGlvbkJ1ZmZlckluZm8ge1xuICBjb25zdCBpbml0aWFsaXplSW5zdHJ1Y3Rpb24gPSBpbml0aWFsaXplSW5zcnVjdGlvbkJ1ZmZlcihpbnN0cnVjdGlvbkNvdW50KTtcbiAgY29uc3QgaGFzR2FzUHJpY2VDb21wdXRlQnVkZ2V0ID0gaGFzU3BlY2lmaWNJbnN0cnVjdGlvbihhY2NvdW50S2V5cywgaW5zdHJ1Y3Rpb25zLCBDT01QVVRFX0JVREdFVF9QUk9HUkFNX0lELCAzKTtcbiAgY29uc3QgaGFzR2FzTGltaXRDb21wdXRlQnVkZ2V0ID0gaGFzU3BlY2lmaWNJbnN0cnVjdGlvbihhY2NvdW50S2V5cywgaW5zdHJ1Y3Rpb25zLCBDT01QVVRFX0JVREdFVF9QUk9HUkFNX0lELCAyKTtcbiAgY29uc3QgcGFkZGluZ0luc3RydWN0aW9uID0gcGFkZGluZ0VtcHR5Q29tcHV0ZUJ1ZGdldEluc3J1Y3Rpb25CdWZmZXIoXG4gICAgaW5pdGlhbGl6ZUluc3RydWN0aW9uLmluc3RydWN0aW9uQnVmZmVyLFxuICAgIGluaXRpYWxpemVJbnN0cnVjdGlvbi5pbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCxcbiAgICBoYXNHYXNQcmljZUNvbXB1dGVCdWRnZXQsXG4gICAgaGFzR2FzTGltaXRDb21wdXRlQnVkZ2V0XG4gICk7XG4gIHJldHVybiB7XG4gICAgaW5zdHJ1Y3Rpb25CdWZmZXI6IHBhZGRpbmdJbnN0cnVjdGlvbi5pbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDogcGFkZGluZ0luc3RydWN0aW9uLmluc3RydWN0aW9uQnVmZmVyTGVuZ3RoLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkZGluZ1NlZWRJbnN0cnVjdGlvbkJ1ZmZlcihcbiAgc3JjSW5zdHJ1Y3Rpb25CdWZmZXI6IEJ1ZmZlcixcbiAgc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg6IG51bWJlcixcbiAgc2VlZERhdGE6IG51bWJlcltdXG4pOiBJbnNydWN0aW9uQnVmZmVySW5mbyB7XG4gIC8qXG4gICAgU2luY2Ugc2VlZCBpcyBsZW5ndGggdmFyaWFudCwgdHJ5aW5nIHRvIHBhZGRpbmcgc2VlZCB0byBsZW5ndGggMzIgYnl0ZXM6XG5cbiAgICBEZWZhdWx0IHN0cnVjdHVyZTpcbiAgICAgIGluc3RydWN0aW9uKDQgYnl0ZXMpLFxuICAgICAgYmFzZVB1YmtleSgzMiBieXRlcyksXG4gICAgICBsZW5ndGgoNCBieXRlcyksXG4gICAgICBsZW5ndGhQYWRkaW5nKDQgYnl0ZXMpLFxuICAgICAgc2VlZCh2YXJpYW50KSxcbiAgICAgIGxhbXBvcnRzKDggYnl0ZXMpLFxuICAgICAgc3BhY2UoOCBieXRlcyksXG4gICAgICBwcm9ncmFtSWQoMzIgYnl0ZXMpXG5cbiAgICBBZnRlciBzdHJ1Y3R1cmU6XG4gICAgICBpbnN0cnVjdGlvbig0IGJ5dGVzKSxcbiAgICAgIGJhc2VQdWJrZXkoMzIgYnl0ZXMpLFxuICAgICAgbGVuZ3RoKDQgYnl0ZXMpLFxuICAgICAgbGVuZ3RoUGFkZGluZyg0IGJ5dGVzKSxcbiAgICAgIHNlZWQoMzIgYnl0ZXMpLFxuICAgICAgbGFtcG9ydHMoOCBieXRlcyksXG4gICAgICBzcGFjZSg4IGJ5dGVzKSxcbiAgICAgIHByb2dyYW1JZCgzMiBieXRlcylcbiAgKi9cbiAgY29uc3QgZGVmYXVsdExlbmd0aCA9IDkyO1xuICBjb25zdCBwcmVmaXhMZW5ndGggPSA0NDtcbiAgY29uc3Qgc2VlZExlbmd0aCA9IHNlZWREYXRhLmxlbmd0aCAtIGRlZmF1bHRMZW5ndGg7XG4gIGNvbnN0IGRhdGFBbGxvY2F0b3IgPSBCdWZmZXIuYWxsb2NVbnNhZmUoc2VlZERhdGEubGVuZ3RoIC0gc2VlZExlbmd0aCArIDMyKTtcbiAgY29uc3QgZGF0YVByZWZpeCA9IEJ1ZmZlci5mcm9tKHNlZWREYXRhLnNsaWNlKDAsIHByZWZpeExlbmd0aCkpO1xuICBjb25zdCBzZWVkID0gQnVmZmVyLmZyb20oc2VlZERhdGEuc2xpY2UocHJlZml4TGVuZ3RoLCBwcmVmaXhMZW5ndGggKyBzZWVkTGVuZ3RoKSk7XG4gIGNvbnN0IGRhdGFQb3N0Zml4ID0gQnVmZmVyLmZyb20oc2VlZERhdGEuc2xpY2UocHJlZml4TGVuZ3RoICsgc2VlZExlbmd0aCwgc2VlZERhdGEubGVuZ3RoKSk7XG4gIGNvbnN0IHBhZGRpbmdTZWVkID0gQnVmZmVyLmFsbG9jKDMyKTtcbiAgc2VlZC5jb3B5KHBhZGRpbmdTZWVkLCAzMiAtIHNlZWQubGVuZ3RoKTtcbiAgZGF0YVByZWZpeC5jb3B5KGRhdGFBbGxvY2F0b3IsIDApO1xuICBwYWRkaW5nU2VlZC5jb3B5KGRhdGFBbGxvY2F0b3IsIGRhdGFQcmVmaXgubGVuZ3RoKTtcbiAgZGF0YVBvc3RmaXguY29weShkYXRhQWxsb2NhdG9yLCBkYXRhUHJlZml4Lmxlbmd0aCArIHBhZGRpbmdTZWVkLmxlbmd0aCk7XG4gIGNvbnN0IGNvcGllZEJ1ZmZlckxlbmd0aCA9IGRhdGFBbGxvY2F0b3IuY29weShzcmNJbnN0cnVjdGlvbkJ1ZmZlciwgc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGgpO1xuICByZXR1cm4ge1xuICAgIGluc3RydWN0aW9uQnVmZmVyOiBzcmNJbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDogc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggKyBjb3BpZWRCdWZmZXJMZW5ndGgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVJbnN0cnVjdGlvbkJ1ZmZlcihcbiAgaW5zdHJ1Y3Rpb25zOiBTZXJpYWxpemVkSW5zdHJ1Y3Rpb25bXSxcbiAgc3JjSW5zdHJ1Y3Rpb25CdWZmZXI6IEJ1ZmZlcixcbiAgc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg6IG51bWJlclxuKTogQnVmZmVyIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25CdWZmZXIgPSBzcmNJbnN0cnVjdGlvbkJ1ZmZlcjtcbiAgbGV0IGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoID0gc3JjSW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg7XG4gIGluc3RydWN0aW9ucy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGluc3RydWN0aW9uTGF5b3V0ID0gc3RydWN0SW5zdHJ1Y3Rpb25MYXlvdXQoaW5zdHJ1Y3Rpb24pO1xuICAgIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoICs9IGluc3RydWN0aW9uTGF5b3V0LmVuY29kZShpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb25CdWZmZXIsIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoKTtcbiAgfSk7XG4gIHJldHVybiBpbnN0cnVjdGlvbkJ1ZmZlci5zbGljZSgwLCBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVBbmRQYWRkaW5nU2VlZEluc3RydWN0aW9uQnVmZmVyKFxuICBhY2NvdW50S2V5czogc3RyaW5nW10sXG4gIGluc3RydWN0aW9uczogU2VyaWFsaXplZEluc3RydWN0aW9uW10sXG4gIHNyY0luc3RydWN0aW9uQnVmZmVyOiBCdWZmZXIsXG4gIHNyY0luc3RydWN0aW9uQnVmZmVyTGVuZ3RoOiBudW1iZXJcbik6IEJ1ZmZlciB7XG4gIGxldCBpbnN0cnVjdGlvbkJ1ZmZlciA9IHNyY0luc3RydWN0aW9uQnVmZmVyO1xuICBsZXQgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggPSBzcmNJbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aDtcbiAgaW5zdHJ1Y3Rpb25zLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgbGV0IGluc3RydWN0aW9uTGF5b3V0O1xuICAgIGNvbnN0IGlzQ3JlYXRlU2VlZEluc3RydWN0aW9uID0gaXNTcGVjaWZpY0luc3RydWN0aW9uKGFjY291bnRLZXlzLCBpbnN0cnVjdGlvbiwgU1lTVEVNX1BST0dSQU1fSUQsIDMpO1xuICAgIGlmIChpc0NyZWF0ZVNlZWRJbnN0cnVjdGlvbikge1xuICAgICAgaW5zdHJ1Y3Rpb25MYXlvdXQgPSBzdHJ1Y3RJbnN0cnVjdGlvbkxheW91dFdpdGhvdXREYXRhKGluc3RydWN0aW9uKTtcbiAgICAgIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoICs9IGluc3RydWN0aW9uTGF5b3V0LmVuY29kZShpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb25CdWZmZXIsIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoKTtcbiAgICAgIGNvbnN0IHBhZGRpbmdTZWVkSW5zdHJ1Y3Rpb24gPSBwYWRkaW5nU2VlZEluc3RydWN0aW9uQnVmZmVyKFxuICAgICAgICBpbnN0cnVjdGlvbkJ1ZmZlcixcbiAgICAgICAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGgsXG4gICAgICAgIGluc3RydWN0aW9uLmRhdGFcbiAgICAgICk7XG4gICAgICBpbnN0cnVjdGlvbkJ1ZmZlciA9IHBhZGRpbmdTZWVkSW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25CdWZmZXI7XG4gICAgICBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCA9IHBhZGRpbmdTZWVkSW5zdHJ1Y3Rpb24uaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RydWN0aW9uTGF5b3V0ID0gc3RydWN0SW5zdHJ1Y3Rpb25MYXlvdXQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGggKz0gaW5zdHJ1Y3Rpb25MYXlvdXQuZW5jb2RlKGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbkJ1ZmZlciwgaW5zdHJ1Y3Rpb25CdWZmZXJMZW5ndGgpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBpbnN0cnVjdGlvbkJ1ZmZlci5zbGljZSgwLCBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVTaWduRGF0YShcbiAga2V5Q291bnQ6IG51bWJlcltdLFxuICBuZXdBY2NvdW50S2V5czogc3RyaW5nW10sXG4gIHJlY2VudEJsb2NraGFzaDogc3RyaW5nLFxuICBpbnN0cnVjdGlvbkJ1ZmZlcjogQnVmZmVyXG4pOiBCdWZmZXIge1xuICBjb25zdCBzaWduRGF0YUxheW91dCA9IHN0cnVjdFNpZ25EYXRhTGF5b3V0KGtleUNvdW50LCBuZXdBY2NvdW50S2V5cyk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0ge1xuICAgIGtleUNvdW50OiBCdWZmZXIuZnJvbShrZXlDb3VudCksXG4gICAga2V5czogbmV3QWNjb3VudEtleXMubWFwKChrZXkpID0+IEJ1ZmZlci5mcm9tKGtleSwgJ2hleCcpKSxcbiAgICByZWNlbnRCbG9ja2hhc2g6IEJ1ZmZlci5mcm9tKHJlY2VudEJsb2NraGFzaCwgJ2hleCcpLFxuICB9O1xuICBjb25zdCBzaWduRGF0YSA9IEJ1ZmZlci5hbGxvYygyMDQ4KTsgLy8gc2lnbiBkYXRhIG1heCBsZW5ndGhcbiAgY29uc3QgbGVuZ3RoID0gc2lnbkRhdGFMYXlvdXQuZW5jb2RlKHRyYW5zYWN0aW9uLCBzaWduRGF0YSk7XG4gIGluc3RydWN0aW9uQnVmZmVyLmNvcHkoc2lnbkRhdGEsIGxlbmd0aCk7XG4gIHJldHVybiBzaWduRGF0YS5zbGljZSgwLCBsZW5ndGggKyBpbnN0cnVjdGlvbkJ1ZmZlci5sZW5ndGgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBRUEsSUFBQUMsa0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQU1BLFNBQVNHLDBCQUEwQkEsQ0FBQ0MsZ0JBQTJCLEVBQXdCO0VBQ3JGLElBQU1DLGlCQUFpQixHQUFHQyxNQUFNLENBQUNDLEtBQUssQ0FBQ0Msd0JBQWdCLENBQUM7RUFDeEQsSUFBSUosZ0JBQWdCLEVBQUU7SUFDcEJFLE1BQU0sQ0FBQ0csSUFBSSxDQUFDTCxnQkFBZ0IsQ0FBQyxDQUFDTSxJQUFJLENBQUNMLGlCQUFpQixDQUFDO0VBQ3ZEO0VBQ0EsSUFBTU0sdUJBQXVCLEdBQUcsQ0FBQ1AsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHQSxnQkFBZ0IsQ0FBQ1EsTUFBTTtFQUMvRSxPQUFPO0lBQ0xQLGlCQUFpQixFQUFqQkEsaUJBQWlCO0lBQ2pCTSx1QkFBdUIsRUFBdkJBO0VBQ0YsQ0FBQztBQUNIO0FBRUEsU0FBU0UsNkJBQTZCQSxDQUFDQyxNQUl0QyxFQUF3QjtFQUN2QixJQUFRQyxhQUFhLEdBQW9ERCxNQUFNLENBQXZFQyxhQUFhO0lBQUVDLG9CQUFvQixHQUE4QkYsTUFBTSxDQUF4REUsb0JBQW9CO0lBQUVDLHVCQUF1QixHQUFLSCxNQUFNLENBQWxDRyx1QkFBdUI7RUFDcEUsSUFBTUMsZUFBZSxHQUFHWixNQUFNLENBQUNDLEtBQUssQ0FBQ1EsYUFBYSxDQUFDO0VBQ25ERyxlQUFlLENBQUNSLElBQUksQ0FBQ00sb0JBQW9CLEVBQUVDLHVCQUF1QixDQUFDO0VBQ25FLE9BQU87SUFDTFosaUJBQWlCLEVBQUVXLG9CQUFv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