PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/utxo-lib/dist/src/bitgo/zcash
Просмотр файла: ZcashPsbt.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ZcashPsbt = void 0;
const UtxoPsbt_1 = require("../UtxoPsbt");
const ZcashTransaction_1 = require("./ZcashTransaction");
const __1 = require("../../");
const bip174_1 = require("bip174");
const types = require("bitcoinjs-lib/src/types");
const PsbtUtil_1 = require("../PsbtUtil");
const typeforce = require('typeforce');
const CONSENSUS_BRANCH_ID_KEY = Buffer.concat([
Buffer.of(0xfc),
Buffer.of(0x05),
Buffer.from(PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER),
Buffer.of(PsbtUtil_1.ProprietaryKeySubtype.ZEC_CONSENSUS_BRANCH_ID),
]);
class ZcashPsbt extends UtxoPsbt_1.UtxoPsbt {
static transactionFromBuffer(buffer, network) {
return ZcashTransaction_1.ZcashTransaction.fromBuffer(buffer, false, 'bigint', network);
}
static createPsbt(opts, data) {
return new ZcashPsbt(opts, data || new bip174_1.Psbt(new __1.PsbtTransaction({ tx: new ZcashTransaction_1.ZcashTransaction(opts.network) })));
}
/**
* In version < 5 of Zcash transactions, the consensus branch ID is not serialized in the transaction
* whereas in version 5 it is. If the transaction is less than a version 5, set the consensus branch id
* in the global map in the psbt. If it is a version 5 transaction, throw an error if the consensus
* branch id is set in the psbt (because it should be on the transaction already).
* @param buffer Psbt buffer
* @param opts options
*/
static fromBuffer(buffer, opts) {
const psbt = super.fromBuffer(buffer, opts);
// Read `consensusBranchId` from the global-map
let consensusBranchId = undefined;
psbt.data.globalMap.unknownKeyVals?.forEach(({ key, value }, i) => {
if (key.equals(CONSENSUS_BRANCH_ID_KEY)) {
consensusBranchId = value.readUint32LE();
}
});
switch (psbt.tx.version) {
case 4:
case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_CANOPY:
case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_NU5:
if (!consensusBranchId || !psbt.data.globalMap.unknownKeyVals) {
throw new Error('Could not find consensus branch id on psbt for version 4 Zcash transaction');
}
psbt.tx.consensusBranchId = consensusBranchId;
psbt.data.globalMap.unknownKeyVals = psbt.data.globalMap.unknownKeyVals.filter(({ key }) => key !== CONSENSUS_BRANCH_ID_KEY);
// Delete consensusBranchId from globalMap so that if we were to serialize the psbt again
// we would not add a duplicate key into the global map
psbt.data.globalMap.unknownKeyVals.pop();
return psbt;
case 5:
case ZcashTransaction_1.ZcashTransaction.VERSION5_BRANCH_NU5:
if (consensusBranchId) {
throw new Error('Found consensus branch id in psbt global-map for version 5 Zcash transaction');
}
return psbt;
default:
throw new Error(`Unsupported transaction version ${psbt.tx.version}`);
}
}
/**
* If it is a version 4 transaction, add the consensus branch id to
* the global map. If it is a version 5 transaction, just return the
* buffer because the consensus branch id is already serialized in
* the transaction.
*/
toBuffer() {
if (this.tx.version === 5 || this.tx.version >= ZcashTransaction_1.ZcashTransaction.VERSION5_BRANCH_NU5) {
return super.toBuffer();
}
const value = Buffer.alloc(4);
value.writeUint32LE(this.tx.consensusBranchId);
this.addUnknownKeyValToGlobal({ key: CONSENSUS_BRANCH_ID_KEY, value });
if (!this.data.globalMap.unknownKeyVals) {
throw new Error('Failed adding consensus branch id to unknownKeyVals');
}
const buff = super.toBuffer();
this.data.globalMap.unknownKeyVals.pop();
return buff;
}
setVersion(version, overwinter = true) {
typeforce(types.UInt32, version);
this.tx.overwintered = overwinter ? 1 : 0;
this.tx.version = version;
return this;
}
setDefaultsForVersion(network, version) {
switch (version) {
case 4:
case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_CANOPY:
case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_NU5:
case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_NU6:
case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_NU6_1:
this.setVersion(4);
break;
case 5:
case ZcashTransaction_1.ZcashTransaction.VERSION5_BRANCH_NU5:
case ZcashTransaction_1.ZcashTransaction.VERSION5_BRANCH_NU6:
case ZcashTransaction_1.ZcashTransaction.VERSION5_BRANCH_NU6_1:
this.setVersion(5);
break;
default:
throw new Error(`invalid version ${version}`);
}
this.tx.versionGroupId = (0, ZcashTransaction_1.getDefaultVersionGroupIdForVersion)(version);
this.tx.consensusBranchId = (0, ZcashTransaction_1.getDefaultConsensusBranchIdForVersion)(network, version);
}
setPropertyCheckSignatures(propName, value) {
if (this.tx[propName] === value) {
return;
}
this.checkForSignatures(propName);
this.tx[propName] = value;
}
setConsensusBranchId(consensusBranchId) {
typeforce(types.UInt32, consensusBranchId);
this.setPropertyCheckSignatures('consensusBranchId', consensusBranchId);
}
setVersionGroupId(versionGroupId) {
typeforce(types.UInt32, versionGroupId);
this.setPropertyCheckSignatures('versionGroupId', versionGroupId);
}
setExpiryHeight(expiryHeight) {
typeforce(types.UInt32, expiryHeight);
this.setPropertyCheckSignatures('expiryHeight', expiryHeight);
}
clone() {
return ZcashPsbt.fromBuffer(this.toBuffer(), { network: this.network });
}
}
exports.ZcashPsbt = ZcashPsbt;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmNhc2hQc2J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3pjYXNoL1pjYXNoUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwQ0FBaUQ7QUFDakQseURBSTRCO0FBQzVCLDhCQUFrRDtBQUNsRCxtQ0FBMEM7QUFDMUMsaURBQWlEO0FBQ2pELDBDQUFpRjtBQUNqRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdkMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUEyQixDQUFDO0lBQ3hDLE1BQU0sQ0FBQyxFQUFFLENBQUMsZ0NBQXFCLENBQUMsdUJBQXVCLENBQUM7Q0FDekQsQ0FBQyxDQUFDO0FBRUgsTUFBYSxTQUFVLFNBQVEsbUJBQWtDO0lBQ3JELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFjLEVBQUUsT0FBZ0I7UUFDckUsT0FBTyxtQ0FBZ0IsQ0FBQyxVQUFVLENBQVMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBYyxFQUFFLElBQWU7UUFDL0MsT0FBTyxJQUFJLFNBQVMsQ0FDbEIsSUFBSSxFQUNKLElBQUksSUFBSSxJQUFJLGFBQVEsQ0FBQyxJQUFJLG1CQUFlLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxtQ0FBZ0IsQ0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQzlGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBYyxFQUFFLElBQWM7UUFDOUMs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QUUsT0FBTyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVPLDBCQUEwQixDQUFDLFFBQXdDLEVBQUUsS0FBYztRQUN6RixJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVELG9CQUFvQixDQUFDLGlCQUF5QjtRQUM1QyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxjQUFzQjtRQUN0QyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELGVBQWUsQ0FBQyxZQUFvQjtRQUNsQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQVMsQ0FBQztJQUNsRixDQUFDO0NBQ0Y7QUF0SUQsOEJBc0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHNidE9wdHMsIFV0eG9Qc2J0IH0gZnJvbSAnLi4vVXR4b1BzYnQnO1xuaW1wb3J0IHtcbiAgZ2V0RGVmYXVsdENvbnNlbnN1c0JyYW5jaElkRm9yVmVyc2lvbixcbiAgZ2V0RGVmYXVsdFZlcnNpb25Hcm91cElkRm9yVmVyc2lvbixcbiAgWmNhc2hUcmFuc2FjdGlvbixcbn0gZnJvbSAnLi9aY2FzaFRyYW5zYWN0aW9uJztcbmltcG9ydCB7IE5ldHdvcmssIFBzYnRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLyc7XG5pbXBvcnQgeyBQc2J0IGFzIFBzYnRCYXNlIH0gZnJvbSAnYmlwMTc0JztcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJ2JpdGNvaW5qcy1saWIvc3JjL3R5cGVzJztcbmltcG9ydCB7IFByb3ByaWV0YXJ5S2V5U3VidHlwZSwgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSIH0gZnJvbSAnLi4vUHNidFV0aWwnO1xuY29uc3QgdHlwZWZvcmNlID0gcmVxdWlyZSgndHlwZWZvcmNlJyk7XG5cbmNvbnN0IENPTlNFTlNVU19CUkFOQ0hfSURfS0VZID0gQnVmZmVyLmNvbmNhdChbXG4gIEJ1ZmZlci5vZigweGZjKSxcbiAgQnVmZmVyLm9mKDB4MDUpLFxuICBCdWZmZXIuZnJvbShQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIpLFxuICBCdWZmZXIub2YoUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLlpFQ19DT05TRU5TVVNfQlJBTkNIX0lEKSxcbl0pO1xuXG5leHBvcnQgY2xhc3MgWmNhc2hQc2J0IGV4dGVuZHMgVXR4b1BzYnQ8WmNhc2hUcmFuc2FjdGlvbjxiaWdpbnQ+PiB7XG4gIHByb3RlY3RlZCBzdGF0aWMgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBuZXR3b3JrOiBOZXR3b3JrKTogWmNhc2hUcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gWmNhc2hUcmFuc2FjdGlvbi5mcm9tQnVmZmVyPGJpZ2ludD4oYnVmZmVyLCBmYWxzZSwgJ2JpZ2ludCcsIG5ldHdvcmspO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBzYnQob3B0czogUHNidE9wdHMsIGRhdGE/OiBQc2J0QmFzZSk6IFpjYXNoUHNidCB7XG4gICAgcmV0dXJuIG5ldyBaY2FzaFBzYnQoXG4gICAgICBvcHRzLFxuICAgICAgZGF0YSB8fCBuZXcgUHNidEJhc2UobmV3IFBzYnRUcmFuc2FjdGlvbih7IHR4OiBuZXcgWmNhc2hUcmFuc2FjdGlvbjxiaWdpbnQ+KG9wdHMubmV0d29yaykgfSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiB2ZXJzaW9uIDwgNSBvZiBaY2FzaCB0cmFuc2FjdGlvbnMsIHRoZSBjb25zZW5zdXMgYnJhbmNoIElEIGlzIG5vdCBzZXJpYWxpemVkIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiB3aGVyZWFzIGluIHZlcnNpb24gNSBpdCBpcy4gSWYgdGhlIHRyYW5zYWN0aW9uIGlzIGxlc3MgdGhhbiBhIHZlcnNpb24gNSwgc2V0IHRoZSBjb25zZW5zdXMgYnJhbmNoIGlkXG4gICAqIGluIHRoZSBnbG9iYWwgbWFwIGluIHRoZSBwc2J0LiBJZiBpdCBpcyBhIHZlcnNpb24gNSB0cmFuc2FjdGlvbiwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGNvbnNlbnN1c1xuICAgKiBicmFuY2ggaWQgaXMgc2V0IGluIHRoZSBwc2J0IChiZWNhdXNlIGl0IHNob3VsZCBiZSBvbiB0aGUgdHJhbnNhY3Rpb24gYWxyZWFkeSkuXG4gICAqIEBwYXJhbSBidWZmZXIgUHNidCBidWZmZXJcbiAgICogQHBhcmFtIG9wdHMgb3B0aW9uc1xuICAgKi9cbiAgc3RhdGljIGZyb21CdWZmZXIoYnVmZmVyOiBCdWZmZXIsIG9wdHM6IFBzYnRPcHRzKTogVXR4b1BzYnQ8WmNhc2hUcmFuc2FjdGlvbjxiaWdpbnQ+PiB7XG4gICAgY29uc3QgcHNidCA9IHN1cGVyLmZyb21CdWZmZXIoYnVmZmVyLCBvcHRzKSBhcyBaY2FzaFBzYnQ7XG5cbiAgICAvLyBSZWFkIGBjb25zZW5zdXNCcmFuY2hJZGAgZnJvbSB0aGUgZ2xvYmFsLW1hcFxuICAgIGxldCBjb25zZW5zdXNCcmFuY2hJZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHBzYnQuZGF0YS5nbG9iYWxNYXAudW5rbm93bktleVZhbHM/LmZvckVhY2goKHsga2V5LCB2YWx1ZSB9LCBpKSA9PiB7XG4gICAgICBpZiAoa2V5LmVxdWFscyhDT05TRU5TVVNfQlJBTkNIX0lEX0tFWSkpIHtcbiAgICAgICAgY29uc2Vuc3VzQnJhbmNoSWQgPSB2YWx1ZS5yZWFkVWludDMyTEUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzd2l0Y2ggKHBzYnQudHgudmVyc2lvbikge1xuICAgICAgY2FzZSA0OlxuICAgICAgY2FzZSBaY2FzaFRyYW5zYWN0aW9uLlZFUlNJT040X0JSQU5DSF9DQU5PUFk6XG4gICAgICBjYXNlIFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTjRfQlJBTkNIX05VNTpcbiAgICAgICAgaWYgKCFjb25zZW5zdXNCcmFuY2hJZCB8fCAhcHNidC5kYXRhLmdsb2JhbE1hcC51bmtub3duS2V5VmFscykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgY29uc2Vuc3VzIGJyYW5jaCBpZCBvbiBwc2J0IGZvciB2ZXJzaW9uIDQgWmNhc2ggdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBwc2J0LnR4LmNvbnNlbnN1c0JyYW5jaElkID0gY29uc2Vuc3VzQnJhbmNoSWQ7XG4gICAgICAgIHBzYnQuZGF0YS5nbG9iYWxNYXAudW5rbm93bktleVZhbHMgPSBwc2J0LmRhdGEuZ2xvYmFsTWFwLnVua25vd25LZXlWYWxzLmZpbHRlcihcbiAgICAgICAgICAoeyBrZXkgfSkgPT4ga2V5ICE9PSBDT05TRU5TVVNfQlJBTkNIX0lEX0tFWVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERlbGV0ZSBjb25zZW5zdXNCcmFuY2hJZCBmcm9tIGdsb2JhbE1hcCBzbyB0aGF0IGlmIHdlIHdlcmUgdG8gc2VyaWFsaXplIHRoZSBwc2J0IGFnYWluXG4gICAgICAgIC8vIHdlIHdvdWxkIG5vdCBhZGQgYSBkdXBsaWNhdGUga2V5IGludG8gdGhlIGdsb2JhbCBtYXBcbiAgICAgICAgcHNidC5kYXRhLmdsb2JhbE1hcC51bmtub3duS2V5VmFscy5wb3AoKTtcbiAgICAgICAgcmV0dXJuIHBzYnQ7XG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTjVfQlJBTkNIX05VNTpcbiAgICAgICAgaWYgKGNvbnNlbnN1c0JyYW5jaElkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBjb25zZW5zdXMgYnJhbmNoIGlkIGluIHBzYnQgZ2xvYmFsLW1hcCBmb3IgdmVyc2lvbiA1IFpjYXNoIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBzYnQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHZlcnNpb24gJHtwc2J0LnR4LnZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIGl0IGlzIGEgdmVyc2lvbiA0IHRyYW5zYWN0aW9uLCBhZGQgdGhlIGNvbnNlbnN1cyBicmFuY2ggaWQgdG9cbiAgICogdGhlIGdsb2JhbCBtYXAuIElmIGl0IGlzIGEgdmVyc2lvbiA1IHRyYW5zYWN0aW9uLCBqdXN0IHJldHVybiB0aGVcbiAgICogYnVmZmVyIGJlY2F1c2UgdGhlIGNvbnNlbnN1cyBicmFuY2ggaWQgaXMgYWxyZWFkeSBzZXJpYWxpemVkIGluXG4gICAqIHRoZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIHRvQnVmZmVyKCk6IEJ1ZmZlciB7XG4gICAgaWYgKHRoaXMudHgudmVyc2lvbiA9PT0gNSB8fCB0aGlzLnR4LnZlcnNpb24gPj0gWmNhc2hUcmFuc2FjdGlvbi5WRVJTSU9ONV9CUkFOQ0hfTlU1KSB7XG4gICAgICByZXR1cm4gc3VwZXIudG9CdWZmZXIoKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgdmFsdWUud3JpdGVVaW50MzJMRSh0aGlzLnR4LmNvbnNlbnN1c0JyYW5jaElkKTtcbiAgICB0aGlzLmFkZFVua25vd25LZXlWYWxUb0dsb2JhbCh7IGtleTogQ09OU0VOU1VTX0JSQU5DSF9JRF9LRVksIHZhbHVlIH0pO1xuICAgIGlmICghdGhpcy5kYXRhLmdsb2JhbE1hcC51bmtub3duS2V5VmFscykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgYWRkaW5nIGNvbnNlbnN1cyBicmFuY2ggaWQgdG8gdW5rbm93bktleVZhbHMnKTtcbiAgICB9XG4gICAgY29uc3QgYnVmZiA9IHN1cGVyLnRvQnVmZmVyKCk7XG4gICAgdGhpcy5kYXRhLmdsb2JhbE1hcC51bmtub3duS2V5VmFscy5wb3AoKTtcbiAgICByZXR1cm4gYnVmZjtcbiAgfVxuXG4gIHNldFZlcnNpb24odmVyc2lvbjogbnVtYmVyLCBvdmVyd2ludGVyID0gdHJ1ZSk6IHRoaXMge1xuICAgIHR5cGVmb3JjZSh0eXBlcy5VSW50MzIsIHZlcnNpb24pO1xuICAgIHRoaXMudHgub3ZlcndpbnRlcmVkID0gb3ZlcndpbnRlciA/IDEgOiAwO1xuICAgIHRoaXMudHgudmVyc2lvbiA9IHZlcnNpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXREZWZhdWx0c0ZvclZlcnNpb24obmV0d29yazogTmV0d29yaywgdmVyc2lvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgc3dpdGNoICh2ZXJzaW9uKSB7XG4gICAgICBjYXNlIDQ6XG4gICAgICBjYXNlIFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTjRfQlJBTkNIX0NBTk9QWTpcbiAgICAgIGNhc2UgWmNhc2hUcmFuc2FjdGlvbi5WRVJTSU9ONF9CUkFOQ0hfTlU1OlxuICAgICAgY2FzZSBaY2FzaFRyYW5zYWN0aW9uLlZFUlNJT040X0JSQU5DSF9OVTY6XG4gICAgICBjYXNlIFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTjRfQlJBTkNIX05VNl8xOlxuICAgICAgICB0aGlzLnNldFZlcnNpb24oNCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1OlxuICAgICAgY2FzZSBaY2FzaFRyYW5zYWN0aW9uLlZFUlNJT041X0JSQU5DSF9OVTU6XG4gICAgICBjYXNlIFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTjVfQlJBTkNIX05VNjpcbiAgICAgIGNhc2UgWmNhc2hUcmFuc2FjdGlvbi5WRVJTSU9ONV9CUkFOQ0hfTlU2XzE6XG4gICAgICAgIHRoaXMuc2V0VmVyc2lvbig1KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdmVyc2lvbiAke3ZlcnNpb259YCk7XG4gICAgfVxuXG4gICAgdGhpcy50eC52ZXJzaW9uR3JvdXBJZCA9IGdldERlZmF1bHRWZXJzaW9uR3JvdXBJZEZvclZlcnNpb24odmVyc2lvbik7XG4gICAgdGhpcy50eC5jb25zZW5zdXNCcmFuY2hJZCA9IGdldERlZmF1bHRDb25zZW5zdXNCcmFuY2hJZEZvclZlcnNpb24obmV0d29yaywgdmVyc2lvbik7XG4gIH1cblxuICBwcml2YXRlIHNldFByb3BlcnR5Q2hlY2tTaWduYXR1cmVzKHByb3BOYW1lOiBrZXlvZiBaY2FzaFRyYW5zYWN0aW9uPGJpZ2ludD4sIHZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHRoaXMudHhbcHJvcE5hbWVdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrRm9yU2lnbmF0dXJlcyhwcm9wTmFtZSk7XG4gICAgdGhpcy50eFtwcm9wTmFtZV0gPSB2YWx1ZSBhcyBhbnk7XG4gIH1cblxuICBzZXRDb25zZW5zdXNCcmFuY2hJZChjb25zZW5zdXNCcmFuY2hJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdHlwZWZvcmNlKHR5cGVzLlVJbnQzMiwgY29uc2Vuc3VzQnJhbmNoSWQpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlDaGVja1NpZ25hdHVyZXMoJ2NvbnNlbnN1c0JyYW5jaElkJywgY29uc2Vuc3VzQnJhbmNoSWQpO1xuICB9XG5cbiAgc2V0VmVyc2lvbkdyb3VwSWQodmVyc2lvbkdyb3VwSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHR5cGVmb3JjZSh0eXBlcy5VSW50MzIsIHZlcnNpb25Hcm91cElkKTtcbiAgICB0aGlzLnNldFByb3BlcnR5Q2hlY2tTaWduYXR1cmVzKCd2ZXJzaW9uR3JvdXBJZCcsIHZlcnNpb25Hcm91cElkKTtcbiAgfVxuXG4gIHNldEV4cGlyeUhlaWdodChleHBpcnlIZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIHR5cGVmb3JjZSh0eXBlcy5VSW50MzIsIGV4cGlyeUhlaWdodCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eUNoZWNrU2lnbmF0dXJlcygnZXhwaXJ5SGVpZ2h0JywgZXhwaXJ5SGVpZ2h0KTtcbiAgfVxuXG4gIGNsb25lKCk6IHRoaXMge1xuICAgIHJldHVybiBaY2FzaFBzYnQuZnJvbUJ1ZmZlcih0aGlzLnRvQnVmZmVyKCksIHsgbmV0d29yazogdGhpcy5uZXR3b3JrIH0pIGFzIHRoaXM7XG4gIH1cbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!