PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/abstract-eth/dist/src/lib
Просмотр файла: transaction.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Transaction = void 0;
const sdk_core_1 = require("@bitgo/sdk-core");
const types_1 = require("./types");
const utils_1 = require("./utils");
const UNSUPPORTED_COIN_NAME = 'unsupported';
class Transaction extends sdk_core_1.BaseTransaction {
/**
* return a new Transaction initialized with the serialized tx string
*
* @param coinConfig The coin configuration object
* @param common network commons
* @param serializedTx The serialized tx string with which to initialize the transaction
* @param isFirstSigner whether the transaction is being signed by the first signer
* @returns a new transaction object
*/
static fromSerialized(coinConfig, common, serializedTx, isFirstSigner) {
return new Transaction(coinConfig, common, types_1.EthTransactionData.fromSerialized(serializedTx, common).toJson(), isFirstSigner);
}
/**
* Public constructor.
*
* @param {Readonly<CoinConfig>} coinConfig
* @param common the network commons
* @param {TxData} txData The object transaction data or encoded transaction data
* @param {boolean} isFirstSigner whether the transaction is being signed by the first signer
*/
constructor(coinConfig, common, txData, isFirstSigner) {
super(coinConfig);
this._common = common;
if (txData) {
this.setTransactionData(txData, isFirstSigner);
}
}
/**
* Set the transaction data
*
* @param {TxData} txData The transaction data to set
* @param {boolean} isFirstSigner Whether the transaction is being signed by the first signer
*/
setTransactionData(txData, isFirstSigner) {
this._transactionData = types_1.EthTransactionData.fromJson(txData, this._common);
this.updateFields(isFirstSigner);
}
/**
* Update the internal fields based on the currently set transaction data, if there is any
*/
updateFields(isFirstSigner) {
if (!this._transactionData) {
return;
}
const txData = this._transactionData.toJson();
if (txData.id) {
this._id = txData.id;
}
this._type = (0, utils_1.classifyTransaction)(txData.data);
// reset arrays to empty to ensure that they are only set with one set of fresh values
this._inputs = [];
this._outputs = [];
this._signatures = [];
if ((0, utils_1.hasSignature)(txData)) {
this._signatures.push((0, utils_1.toStringSig)({ v: txData.v, r: txData.r, s: txData.s }));
}
// only send transactions have inputs / outputs / signatures to parse
if (this._type === sdk_core_1.TransactionType.Send ||
this._type === sdk_core_1.TransactionType.SendERC721 ||
this._type === sdk_core_1.TransactionType.SendERC1155) {
const { to, amount, tokenContractAddress, signature } = (0, utils_1.decodeTransferData)(txData.data, isFirstSigner);
let coinName;
if (tokenContractAddress) {
const token = (0, utils_1.getToken)(tokenContractAddress, this._coinConfig.network, this._coinConfig.family);
coinName = token ? token.name : UNSUPPORTED_COIN_NAME;
}
else {
coinName = this._coinConfig.name;
}
this.outputs.push({
address: to,
value: amount,
coin: coinName,
});
this.inputs.push({
address: txData.to, // the sending wallet contract is the recipient of the outer transaction
value: amount,
coin: coinName,
});
if (signature !== '0x') {
this._signatures.push(signature);
}
}
}
/**
* Set the transaction type
*
* @param {TransactionType} transactionType The transaction type to be set
*/
setTransactionType(transactionType) {
this._type = transactionType;
}
/** @inheritdoc */
canSign(key) {
// TODO: implement this validation for the ethereum network
return true;
}
/**
* Sign the transaction with the provided key. It does not check if the signer is allowed to sign
* it or not.
*
* @param {KeyPair} keyPair The key to sign the transaction with
*/
async sign(keyPair) {
if (!this._transactionData) {
throw new sdk_core_1.InvalidTransactionError('No transaction data to sign');
}
if (!keyPair.getKeys().prv) {
throw new sdk_core_1.SigningError('Missing private key');
}
await this._transactionData.sign(keyPair);
const txData = this._transactionData.toJson();
if (txData.id) {
this._id = txData.id;
}
this._signatures.push((0, utils_1.toStringSig)({ v: txData.v, r: txData.r, s: txData.s }));
}
/** @inheritdoc */
toBroadcastFormat() {
if (this._transactionData) {
return this._transactionData.toSerialized();
}
throw new sdk_core_1.InvalidTransactionError('No transaction data to format');
}
/** @inheritdoc */
toJson() {
if (this._transactionData) {
return this._transactionData.toJson();
}
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
}
}
exports.Transaction = Transaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLDhDQU95QjtBQUd6QixtQ0FBNkM7QUFDN0MsbUNBQXVHO0FBRXZHLE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDO0FBRTVDLE1BQWEsV0FBWSxTQUFRLDBCQUFlO0lBVTlDOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FDMUIsVUFBZ0MsRUFDaEMsTUFBc0IsRUFDdEIsWUFBb0IsRUFDcEIsYUFBdUI7UUFFdkIsT0FBTyxJQUFJLFdBQVcsQ0FDcEIsVUFBVSxFQUNWLE1BQU0sRUFDTiwwQkFBa0IsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUNoRSxhQUFhLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxVQUFnQyxFQUFFLE1BQXNCLEVBQUUsTUFBZSxFQUFFLGFBQXVCO1FBQzVHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0JBQWtCLENBQUMsTUFBYyxFQUFFLGFBQXVCO1FBQ3hELElBQUksQ0FBQyxnQkFBZ0IsR0FBRywwQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNPLFlBQVksQ0FBQyxhQUF1QjtRQUM1QyxJQUFJ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QztJQUN6RCxDQUFDO0NBQ0Y7QUF0S0Qsa0NBc0tDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFdGhlcmV1bSB0cmFuc2FjdGlvbiBtb2RlbC4gVGhpcyBpcyB0aGUgYmFzZSBtb2RlbCBmb3IgYWxsIGV0aGVyZXVtIGJhc2VkIGNvaW5zIChDZWxvLCBFVEMsIFJTSywgRVRIKVxuICovXG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IEV0aGVyZXVtQ29tbW9uIGZyb20gJ0BldGhlcmV1bWpzL2NvbW1vbic7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBFbnRyeSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBTaWduaW5nRXJyb3IsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7IEV0aExpa2VUcmFuc2FjdGlvbkRhdGEsIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgRXRoVHJhbnNhY3Rpb25EYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVRyYW5zYWN0aW9uLCBkZWNvZGVUcmFuc2ZlckRhdGEsIGdldFRva2VuLCBoYXNTaWduYXR1cmUsIHRvU3RyaW5nU2lnIH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IFVOU1VQUE9SVEVEX0NPSU5fTkFNRSA9ICd1bnN1cHBvcnRlZCc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfaWQ6IHN0cmluZzsgLy8gVGhlIHRyYW5zYWN0aW9uIGlkIGFzIHNlZW4gaW4gdGhlIGJsb2NrY2hhaW5cbiAgcHJvdGVjdGVkIF9pbnB1dHM6IEVudHJ5W107XG4gIHByb3RlY3RlZCBfb3V0cHV0czogRW50cnlbXTtcbiAgcHJvdGVjdGVkIF9zaWduYXR1cmVzOiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIF90eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIHByb3RlY3RlZCBfY29tbW9uOiBFdGhlcmV1bUNvbW1vbjtcblxuICBwcm90ZWN0ZWQgX3RyYW5zYWN0aW9uRGF0YT86IEV0aExpa2VUcmFuc2FjdGlvbkRhdGE7XG5cbiAgLyoqXG4gICAqIHJldHVybiBhIG5ldyBUcmFuc2FjdGlvbiBpbml0aWFsaXplZCB3aXRoIHRoZSBzZXJpYWxpemVkIHR4IHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0gY29pbkNvbmZpZyBUaGUgY29pbiBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0gY29tbW9uIG5ldHdvcmsgY29tbW9uc1xuICAgKiBAcGFyYW0gc2VyaWFsaXplZFR4IFRoZSBzZXJpYWxpemVkIHR4IHN0cmluZyB3aXRoIHdoaWNoIHRvIGluaXRpYWxpemUgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBpc0ZpcnN0U2lnbmVyIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHNpZ25lZCBieSB0aGUgZmlyc3Qgc2lnbmVyXG4gICAqIEByZXR1cm5zIGEgbmV3IHRyYW5zYWN0aW9uIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChcbiAgICBjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPixcbiAgICBjb21tb246IEV0aGVyZXVtQ29tbW9uLFxuICAgIHNlcmlhbGl6ZWRUeDogc3RyaW5nLFxuICAgIGlzRmlyc3RTaWduZXI/OiBib29sZWFuXG4gICk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKFxuICAgICAgY29pbkNvbmZpZyxcbiAgICAgIGNvbW1vbixcbiAgICAgIEV0aFRyYW5zYWN0aW9uRGF0YS5mcm9tU2VyaWFsaXplZChzZXJpYWxpemVkVHgsIGNvbW1vbikudG9Kc29uKCksXG4gICAgICBpc0ZpcnN0U2lnbmVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhZG9ubHk8Q29pbkNvbmZpZz59IGNvaW5Db25maWdcbiAgICogQHBhcmFtIGNvbW1vbiB0aGUgbmV0d29yayBjb21tb25zXG4gICAqIEBwYXJhbSB7VHhEYXRhfSB0eERhdGEgVGhlIG9iamVjdCB0cmFuc2FjdGlvbiBkYXRhIG9yIGVuY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRmlyc3RTaWduZXIgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gaXMgYmVpbmcgc2lnbmVkIGJ5IHRoZSBmaXJzdCBzaWduZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+LCBjb21tb246IEV0aGVyZXVtQ29tbW9uLCB0eERhdGE/OiBUeERhdGEsIGlzRmlyc3RTaWduZXI/OiBib29sZWFuKSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fY29tbW9uID0gY29tbW9uO1xuICAgIGlmICh0eERhdGEpIHtcbiAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25EYXRhKHR4RGF0YSwgaXNGaXJzdFNpZ25lcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge1R4RGF0YX0gdHhEYXRhIFRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHNldFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRmlyc3RTaWduZXIgV2hldGhlciB0aGUgdHJhbnNhY3Rpb24gaXMgYmVpbmcgc2lnbmVkIGJ5IHRoZSBmaXJzdCBzaWduZXJcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uRGF0YSh0eERhdGE6IFR4RGF0YSwgaXNGaXJzdFNpZ25lcj86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbkRhdGEgPSBFdGhUcmFuc2FjdGlvbkRhdGEuZnJvbUpzb24odHhEYXRhLCB0aGlzLl9jb21tb24pO1xuICAgIHRoaXMudXBkYXRlRmllbGRzKGlzRmlyc3RTaWduZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgaW50ZXJuYWwgZmllbGRzIGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgc2V0IHRyYW5zYWN0aW9uIGRhdGEsIGlmIHRoZXJlIGlzIGFueVxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUZpZWxkcyhpc0ZpcnN0U2lnbmVyPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdHJhbnNhY3Rpb25EYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHhEYXRhID0gdGhpcy5fdHJhbnNhY3Rpb25EYXRhLnRvSnNvbigpO1xuICAgIGlmICh0eERhdGEuaWQpIHtcbiAgICAgIHRoaXMuX2lkID0gdHhEYXRhLmlkO1xuICAgIH1cbiAgICB0aGlzLl90eXBlID0gY2xhc3NpZnlUcmFuc2FjdGlvbih0eERhdGEuZGF0YSk7XG5cbiAgICAvLyByZXNldCBhcnJheXMgdG8gZW1wdHkgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgb25seSBzZXQgd2l0aCBvbmUgc2V0IG9mIGZyZXNoIHZhbHVlc1xuICAgIHRoaXMuX2lucHV0cyA9IFtdO1xuICAgIHRoaXMuX291dHB1dHMgPSBbXTtcbiAgICB0aGlzLl9zaWduYXR1cmVzID0gW107XG5cbiAgICBpZiAoaGFzU2lnbmF0dXJlKHR4RGF0YSkpIHtcbiAgICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaCh0b1N0cmluZ1NpZyh7IHY6IHR4RGF0YS52ISwgcjogdHhEYXRhLnIhLCBzOiB0eERhdGEucyEgfSkpO1xuICAgIH1cblxuICAgIC8vIG9ubHkgc2VuZCB0cmFuc2FjdGlvbnMgaGF2ZSBpbnB1dHMgLyBvdXRwdXRzIC8gc2lnbmF0dXJlcyB0byBwYXJzZVxuICAgIGlmIChcbiAgICAgIHRoaXMuX3R5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kIHx8XG4gICAgICB0aGlzLl90eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU2VuZEVSQzcyMSB8fFxuICAgICAgdGhpcy5fdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmRFUkMxMTU1XG4gICAgKSB7XG4gICAgICBjb25zdCB7IHRvLCBhbW91bnQsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBzaWduYXR1cmUgfSA9IGRlY29kZVRyYW5zZmVyRGF0YSh0eERhdGEuZGF0YSwgaXNGaXJzdFNpZ25lcik7XG4gICAgICBsZXQgY29pbk5hbWU6IHN0cmluZztcbiAgICAgIGlmICh0b2tlbkNvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGdldFRva2VuKHRva2VuQ29udHJhY3RBZGRyZXNzLCB0aGlzLl9jb2luQ29uZmlnLm5ldHdvcmssIHRoaXMuX2NvaW5Db25maWcuZmFtaWx5KTtcbiAgICAgICAgY29pbk5hbWUgPSB0b2tlbiA/IHRva2VuLm5hbWUgOiBVTlNVUFBPUlRFRF9DT0lOX05BTUU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2luTmFtZSA9IHRoaXMuX2NvaW5Db25maWcubmFtZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vdXRwdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiB0byxcbiAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgY29pbjogY29pbk5hbWUsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pbnB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IHR4RGF0YS50byEsIC8vIHRoZSBzZW5kaW5nIHdhbGxldCBjb250cmFjdCBpcyB0aGUgcmVjaXBpZW50IG9mIHRoZSBvdXRlciB0cmFuc2FjdGlvblxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiBjb2luTmFtZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gJzB4Jykge1xuICAgICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oa2V5OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgdmFsaWRhdGlvbiBmb3IgdGhlIGV0aGVyZXVtIG5ldHdvcmtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRoZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBrZXkuIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoZSBzaWduZXIgaXMgYWxsb3dlZCB0byBzaWduXG4gICAqIGl0IG9yIG5vdC5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIFRoZSBrZXkgdG8gc2lnbiB0aGUgdHJhbnNhY3Rpb24gd2l0aFxuICAgKi9cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl90cmFuc2FjdGlvbkRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignTm8gdHJhbnNhY3Rpb24gZGF0YSB0byBzaWduJyk7XG4gICAgfVxuICAgIGlmICgha2V5UGFpci5nZXRLZXlzKCkucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uRGF0YS5zaWduKGtleVBhaXIpO1xuICAgIGNvbnN0IHR4RGF0YSA9IHRoaXMuX3RyYW5zYWN0aW9uRGF0YS50b0pzb24oKTtcbiAgICBpZiAodHhEYXRhLmlkKSB7XG4gICAgICB0aGlzLl9pZCA9IHR4RGF0YS5pZDtcbiAgICB9XG4gICAgdGhpcy5fc2lnbmF0dXJlcy5wdXNoKHRvU3RyaW5nU2lnKHsgdjogdHhEYXRhLnYhLCByOiB0eERhdGEuciEsIHM6IHR4RGF0YS5zISB9KSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb25EYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25EYXRhLnRvU2VyaWFsaXplZCgpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ05vIHRyYW5zYWN0aW9uIGRhdGEgdG8gZm9ybWF0Jyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKHRoaXMuX3RyYW5zYWN0aW9uRGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uRGF0YS50b0pzb24oKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICB9XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!