PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-bin/dist/src
Просмотр файла: AddressParser.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AddressParser = void 0;
const utxolib = require("@bitgo/utxo-lib");
const bech32 = require("bech32");
const Parser_1 = require("./Parser");
const args_1 = require("./args");
const bs58 = require('bs58');
const bs58check = require('bs58check');
const cashaddress = require('cashaddress');
function isPrintable(s) {
// https://stackoverflow.com/a/66447494
return !s.match(/[\p{Cc}\p{Cn}\p{Cs}]+/gu);
}
class AddressParser extends Parser_1.Parser {
constructor(params) {
super();
this.params = params;
}
tryParseOpReturn(script) {
let data;
try {
({ data } = utxolib.payments.embed({ output: script }));
}
catch (e) {
// ignore
}
if (!data) {
return [];
}
return data.map((buf, i) => {
let utf8;
try {
utf8 = buf.toString('utf8');
}
catch (e) {
// ignore
}
return this.node(`OP_RETURN ${i}`, `${buf.length} bytes`, [
this.node('hex', buf),
...(utf8 && isPrintable(utf8) ? [this.node('utf8', utf8)] : []),
]);
});
}
parseOutputScript(buffer) {
return [
this.node('scriptPubKey', `[${buffer.length}byte]`, [
this.node('type', utxolib.classify.output(buffer)),
this.node('hex', buffer.toString('hex')),
this.node('asm', utxolib.script.toASM(buffer), this.tryParseOpReturn(buffer)),
]),
];
}
parseBase58(address) {
const payload = bs58.decode(address);
return [this.node('payload', payload)];
}
parseBase58Check(address) {
const payload = bs58check.decode(address);
return [
this.node('payload', payload),
this.node('version', payload.readUInt8(0).toString('16')),
this.node('hash', payload.slice(1)),
];
}
parseWithBechLib(bechlib, address) {
const decoded = bechlib.decode(address);
return [
this.node('prefix', decoded.prefix),
this.node('words', Buffer.from(decoded.words)),
this.node('bytes', Buffer.from(bechlib.fromWords(decoded.words))),
];
}
parseBech32(address) {
return this.parseWithBechLib(bech32.bech32, address);
}
parseBech32m(address) {
return this.parseWithBechLib(bech32.bech32m, address);
}
parseCashaddr(address) {
const payload = cashaddress.decode(address);
return [
this.node('prefix', payload.prefix),
this.node('version', payload.version),
this.node('hash', payload.hash),
];
}
convert(outputScript) {
function getWidth(list) {
return Math.max(...list.map((s) => s.length));
}
const networkWith = getWidth((0, args_1.getNetworkList)().map(args_1.getNetworkName));
const addressFormatWith = getWidth(utxolib.addressFormat.addressFormats);
return this.node('converted', undefined, (0, args_1.getNetworkList)().flatMap((network) => utxolib.addressFormat.addressFormats
.filter((f) => utxolib.addressFormat.isSupportedAddressFormat(f, network))
.map((addressFormat) => {
const label = `${(0, args_1.getNetworkName)(network).padEnd(networkWith)} ${addressFormat.padEnd(addressFormatWith)}`;
try {
return this.node(label, utxolib.addressFormat.fromOutputScriptWithFormat(outputScript, addressFormat, network));
}
catch (e) {
return this.node(label, 'undefined');
}
})));
}
parseToBytes(input) {
const decodeWith = (name, decoder) => {
try {
return [this.node(name, undefined, decoder(input))];
}
catch (e) {
return this.params.all ? [this.node(name, undefined, [this.node('decodeError', String(e))])] : [];
}
};
return [
...decodeWith('base58', this.parseBase58.bind(this)),
...decodeWith('base58Check', this.parseBase58Check.bind(this)),
...decodeWith('bech32', this.parseBech32.bind(this)),
...decodeWith('bech32m', this.parseBech32m.bind(this)),
...decodeWith('cashaddr', this.parseCashaddr.bind(this)),
];
}
parse(input) {
const networks = this.params.network ? [this.params.network] : (0, args_1.getNetworkList)();
const matches = networks.flatMap((network) => {
try {
const [addressFormat, buffer] = utxolib.addressFormat.toOutputScriptAndFormat(input, network);
const address = utxolib.addressFormat.fromOutputScriptWithFormat(buffer, addressFormat, network);
return [{ network, address, addressFormat, buffer }];
}
catch (e) {
return [];
}
});
const firstMatch = matches[0];
const nodes = [];
nodes.push(...this.parseToBytes(input));
if (firstMatch) {
if (input !== firstMatch.address) {
nodes.push(this.node('normalized', firstMatch.address, this.parseToBytes(firstMatch.address)));
}
nodes.push(this.node('format', firstMatch.addressFormat));
nodes.push(this.node('outputScript', firstMatch.buffer, this.parseOutputScript(firstMatch.buffer)));
nodes.push(this.node('network', matches.map((m) => (0, args_1.getNetworkName)(m.network)).join(', ')));
if (this.params.all || this.params.convert) {
nodes.push(this.convert(firstMatch.buffer));
}
}
return this.node('address', input, nodes);
}
}
exports.AddressParser = AddressParser;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkcmVzc1BhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9BZGRyZXNzUGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUEyQztBQUMzQyxpQ0FBaUM7QUFFakMscUNBQThDO0FBQzlDLGlDQUF3RDtBQUV4RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQyxTQUFTLFdBQVcsQ0FBQyxDQUFTO0lBQzVCLHVDQUF1QztJQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxNQUFhLGFBQWMsU0FBUSxlQUFNO0lBQ3ZDLFlBQ1MsTUFJTjtRQUVELEtBQUssRUFBRSxDQUFDO1FBTkQsV0FBTSxHQUFOLE1BQU0sQ0FJWjtJQUdILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksSUFBMEIsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDSCxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekIsSUFBSSxJQUFJLENBQUM7WUFDVCxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxHQUFHLEdB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LENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUExS0Qsc0NBMEtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgYmVjaDMyIGZyb20gJ2JlY2gzMic7XG5cbmltcG9ydCB7IFBhcnNlciwgUGFyc2VyTm9kZSB9IGZyb20gJy4vUGFyc2VyJztcbmltcG9ydCB7IGdldE5ldHdvcmtMaXN0LCBnZXROZXR3b3JrTmFtZSB9IGZyb20gJy4vYXJncyc7XG5cbmNvbnN0IGJzNTggPSByZXF1aXJlKCdiczU4Jyk7XG5jb25zdCBiczU4Y2hlY2sgPSByZXF1aXJlKCdiczU4Y2hlY2snKTtcbmNvbnN0IGNhc2hhZGRyZXNzID0gcmVxdWlyZSgnY2FzaGFkZHJlc3MnKTtcblxuZnVuY3Rpb24gaXNQcmludGFibGUoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82NjQ0NzQ5NFxuICByZXR1cm4gIXMubWF0Y2goL1tcXHB7Q2N9XFxwe0NufVxccHtDc31dKy9ndSk7XG59XG5cbmV4cG9ydCBjbGFzcyBBZGRyZXNzUGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHBhcmFtczoge1xuICAgICAgbmV0d29yaz86IHV0eG9saWIuTmV0d29yaztcbiAgICAgIGFsbDogYm9vbGVhbjtcbiAgICAgIGNvbnZlcnQ6IGJvb2xlYW47XG4gICAgfVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgdHJ5UGFyc2VPcFJldHVybihzY3JpcHQ6IEJ1ZmZlcik6IFBhcnNlck5vZGVbXSB7XG4gICAgbGV0IGRhdGE6IEJ1ZmZlcltdIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAoeyBkYXRhIH0gPSB1dHhvbGliLnBheW1lbnRzLmVtYmVkKHsgb3V0cHV0OiBzY3JpcHQgfSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEubWFwKChidWYsIGkpID0+IHtcbiAgICAgIGxldCB1dGY4O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXRmOCA9IGJ1Zi50b1N0cmluZygndXRmOCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm5vZGUoYE9QX1JFVFVSTiAke2l9YCwgYCR7YnVmLmxlbmd0aH0gYnl0ZXNgLCBbXG4gICAgICAgIHRoaXMubm9kZSgnaGV4JywgYnVmKSxcbiAgICAgICAgLi4uKHV0ZjggJiYgaXNQcmludGFibGUodXRmOCkgPyBbdGhpcy5ub2RlKCd1dGY4JywgdXRmOCldIDogW10pLFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH1cblxuICBwYXJzZU91dHB1dFNjcmlwdChidWZmZXI6IEJ1ZmZlcik6IFBhcnNlck5vZGVbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMubm9kZSgnc2NyaXB0UHViS2V5JywgYFske2J1ZmZlci5sZW5ndGh9Ynl0ZV1gLCBbXG4gICAgICAgIHRoaXMubm9kZSgndHlwZScsIHV0eG9saWIuY2xhc3NpZnkub3V0cHV0KGJ1ZmZlcikpLFxuICAgICAgICB0aGlzLm5vZGUoJ2hleCcsIGJ1ZmZlci50b1N0cmluZygnaGV4JykpLFxuICAgICAgICB0aGlzLm5vZGUoJ2FzbScsIHV0eG9saWIuc2NyaXB0LnRvQVNNKGJ1ZmZlciksIHRoaXMudHJ5UGFyc2VPcFJldHVybihidWZmZXIpKSxcbiAgICAgIF0pLFxuICAgIF07XG4gIH1cblxuICBwYXJzZUJhc2U1OChhZGRyZXNzOiBzdHJpbmcpOiBQYXJzZXJOb2RlW10ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBiczU4LmRlY29kZShhZGRyZXNzKTtcbiAgICByZXR1cm4gW3RoaXMubm9kZSgncGF5bG9hZCcsIHBheWxvYWQpXTtcbiAgfVxuXG4gIHBhcnNlQmFzZTU4Q2hlY2soYWRkcmVzczogc3RyaW5nKTogUGFyc2VyTm9kZVtdIHtcbiAgICBjb25zdCBwYXlsb2FkID0gYnM1OGNoZWNrLmRlY29kZShhZGRyZXNzKTtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5ub2RlKCdwYXlsb2FkJywgcGF5bG9hZCksXG4gICAgICB0aGlzLm5vZGUoJ3ZlcnNpb24nLCBwYXlsb2FkLnJlYWRVSW50OCgwKS50b1N0cmluZygnMTYnKSksXG4gICAgICB0aGlzLm5vZGUoJ2hhc2gnLCBwYXlsb2FkLnNsaWNlKDEpKSxcbiAgICBdO1xuICB9XG5cbiAgcGFyc2VXaXRoQmVjaExpYihiZWNobGliOiBiZWNoMzIuQmVjaExpYiwgYWRkcmVzczogc3RyaW5nKTogUGFyc2VyTm9kZVtdIHtcbiAgICBjb25zdCBkZWNvZGVkID0gYmVjaGxpYi5kZWNvZGUoYWRkcmVzcyk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMubm9kZSgncHJlZml4JywgZGVjb2RlZC5wcmVmaXgpLFxuICAgICAgdGhpcy5ub2RlKCd3b3JkcycsIEJ1ZmZlci5mcm9tKGRlY29kZWQud29yZHMpKSxcbiAgICAgIHRoaXMubm9kZSgnYnl0ZXMnLCBCdWZmZXIuZnJvbShiZWNobGliLmZyb21Xb3JkcyhkZWNvZGVkLndvcmRzKSkpLFxuICAgIF07XG4gIH1cblxuICBwYXJzZUJlY2gzMihhZGRyZXNzOiBzdHJpbmcpOiBQYXJzZXJOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlV2l0aEJlY2hMaWIoYmVjaDMyLmJlY2gzMiwgYWRkcmVzcyk7XG4gIH1cblxuICBwYXJzZUJlY2gzMm0oYWRkcmVzczogc3RyaW5nKTogUGFyc2VyTm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVdpdGhCZWNoTGliKGJlY2gzMi5iZWNoMzJtLCBhZGRyZXNzKTtcbiAgfVxuXG4gIHBhcnNlQ2FzaGFkZHIoYWRkcmVzczogc3RyaW5nKTogUGFyc2VyTm9kZVtdIHtcbiAgICBjb25zdCBwYXlsb2FkID0gY2FzaGFkZHJlc3MuZGVjb2RlKGFkZHJlc3MpO1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLm5vZGUoJ3ByZWZpeCcsIHBheWxvYWQucHJlZml4KSxcbiAgICAgIHRoaXMubm9kZSgndmVyc2lvbicsIHBheWxvYWQudmVyc2lvbiksXG4gICAgICB0aGlzLm5vZGUoJ2hhc2gnLCBwYXlsb2FkLmhhc2gpLFxuICAgIF07XG4gIH1cblxuICBjb252ZXJ0KG91dHB1dFNjcmlwdDogQnVmZmVyKTogUGFyc2VyTm9kZSB7XG4gICAgZnVuY3Rpb24gZ2V0V2lkdGgobGlzdDogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KC4uLmxpc3QubWFwKChzKSA9PiBzLmxlbmd0aCkpO1xuICAgIH1cbiAgICBjb25zdCBuZXR3b3JrV2l0aCA9IGdldFdpZHRoKGdldE5ldHdvcmtMaXN0KCkubWFwKGdldE5ldHdvcmtOYW1lKSk7XG4gICAgY29uc3QgYWRkcmVzc0Zvcm1hdFdpdGggPSBnZXRXaWR0aCh1dHhvbGliLmFkZHJlc3NGb3JtYXQuYWRkcmVzc0Zvcm1hdHMpO1xuICAgIHJldHVybiB0aGlzLm5vZGUoXG4gICAgICAnY29udmVydGVkJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGdldE5ldHdvcmtMaXN0KCkuZmxhdE1hcCgobmV0d29yaykgPT5cbiAgICAgICAgdXR4b2xpYi5hZGRyZXNzRm9ybWF0LmFkZHJlc3NGb3JtYXRzXG4gICAgICAgICAgLmZpbHRlcigoZikgPT4gdXR4b2xpYi5hZGRyZXNzRm9ybWF0LmlzU3VwcG9ydGVkQWRkcmVzc0Zvcm1hdChmLCBuZXR3b3JrKSlcbiAgICAgICAgICAubWFwKChhZGRyZXNzRm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGAke2dldE5ldHdvcmtOYW1lKG5ldHdvcmspLnBhZEVuZChuZXR3b3JrV2l0aCl9ICR7YWRkcmVzc0Zvcm1hdC5wYWRFbmQoYWRkcmVzc0Zvcm1hdFdpdGgpfWA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlKFxuICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIHV0eG9saWIuYWRkcmVzc0Zvcm1hdC5mcm9tT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChvdXRwdXRTY3JpcHQsIGFkZHJlc3NGb3JtYXQsIG5ldHdvcmspXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUobGFiZWwsICd1bmRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwYXJzZVRvQnl0ZXMoaW5wdXQ6IHN0cmluZyk6IFBhcnNlck5vZGVbXSB7XG4gICAgdHlwZSBEZWNvZGVyID0gKGFkZHJlc3M6IHN0cmluZykgPT4gUGFyc2VyTm9kZVtdO1xuICAgIGNvbnN0IGRlY29kZVdpdGggPSAobmFtZTogc3RyaW5nLCBkZWNvZGVyOiBEZWNvZGVyKTogUGFyc2VyTm9kZVtdID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5ub2RlKG5hbWUsIHVuZGVmaW5lZCwgZGVjb2RlcihpbnB1dCkpXTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLmFsbCA/IFt0aGlzLm5vZGUobmFtZSwgdW5kZWZpbmVkLCBbdGhpcy5ub2RlKCdkZWNvZGVFcnJvcicsIFN0cmluZyhlKSldKV0gOiBbXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLmRlY29kZVdpdGgoJ2Jhc2U1OCcsIHRoaXMucGFyc2VCYXNlNTguYmluZCh0aGlzKSksXG4gICAgICAuLi5kZWNvZGVXaXRoKCdiYXNlNThDaGVjaycsIHRoaXMucGFyc2VCYXNlNThDaGVjay5iaW5kKHRoaXMpKSxcbiAgICAgIC4uLmRlY29kZVdpdGgoJ2JlY2gzMicsIHRoaXMucGFyc2VCZWNoMzIuYmluZCh0aGlzKSksXG4gICAgICAuLi5kZWNvZGVXaXRoKCdiZWNoMzJtJywgdGhpcy5wYXJzZUJlY2gzMm0uYmluZCh0aGlzKSksXG4gICAgICAuLi5kZWNvZGVXaXRoKCdjYXNoYWRkcicsIHRoaXMucGFyc2VDYXNoYWRkci5iaW5kKHRoaXMpKSxcbiAgICBdO1xuICB9XG5cbiAgcGFyc2UoaW5wdXQ6IHN0cmluZyk6IFBhcnNlck5vZGUge1xuICAgIGNvbnN0IG5ldHdvcmtzID0gdGhpcy5wYXJhbXMubmV0d29yayA/IFt0aGlzLnBhcmFtcy5uZXR3b3JrXSA6IGdldE5ldHdvcmtMaXN0KCk7XG5cbiAgICB0eXBlIE1hdGNoID0ge1xuICAgICAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrO1xuICAgICAgYWRkcmVzczogc3RyaW5nO1xuICAgICAgYWRkcmVzc0Zvcm1hdDogdXR4b2xpYi5hZGRyZXNzRm9ybWF0LkFkZHJlc3NGb3JtYXQ7XG4gICAgICBidWZmZXI6IEJ1ZmZlcjtcbiAgICB9O1xuICAgIGNvbnN0IG1hdGNoZXM6IE1hdGNoW10gPSBuZXR3b3Jrcy5mbGF0TWFwKChuZXR3b3JrKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbYWRkcmVzc0Zvcm1hdCwgYnVmZmVyXSA9IHV0eG9saWIuYWRkcmVzc0Zvcm1hdC50b091dHB1dFNjcmlwdEFuZEZvcm1hdChpbnB1dCwgbmV0d29yayk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3NGb3JtYXQuZnJvbU91dHB1dFNjcmlwdFdpdGhGb3JtYXQoYnVmZmVyLCBhZGRyZXNzRm9ybWF0LCBuZXR3b3JrKTtcbiAgICAgICAgcmV0dXJuIFt7IG5ldHdvcmssIGFkZHJlc3MsIGFkZHJlc3NGb3JtYXQsIGJ1ZmZlciB9XTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGZpcnN0TWF0Y2ggPSBtYXRjaGVzWzBdO1xuICAgIGNvbnN0IG5vZGVzOiBQYXJzZXJOb2RlW10gPSBbXTtcblxuICAgIG5vZGVzLnB1c2goLi4udGhpcy5wYXJzZVRvQnl0ZXMoaW5wdXQpKTtcblxuICAgIGlmIChmaXJzdE1hdGNoKSB7XG4gICAgICBpZiAoaW5wdXQgIT09IGZpcnN0TWF0Y2guYWRkcmVzcykge1xuICAgICAgICBub2Rlcy5wdXNoKHRoaXMubm9kZSgnbm9ybWFsaXplZCcsIGZpcnN0TWF0Y2guYWRkcmVzcywgdGhpcy5wYXJzZVRvQnl0ZXMoZmlyc3RNYXRjaC5hZGRyZXNzKSkpO1xuICAgICAgfVxuXG4gICAgICBub2Rlcy5wdXNoKHRoaXMubm9kZSgnZm9ybWF0JywgZmlyc3RNYXRjaC5hZGRyZXNzRm9ybWF0KSk7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMubm9kZSgnb3V0cHV0U2NyaXB0JywgZmlyc3RNYXRjaC5idWZmZXIsIHRoaXMucGFyc2VPdXRwdXRTY3JpcHQoZmlyc3RNYXRjaC5idWZmZXIpKSk7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMubm9kZSgnbmV0d29yaycsIG1hdGNoZXMubWFwKChtKSA9PiBnZXROZXR3b3JrTmFtZShtLm5ldHdvcmspKS5qb2luKCcsICcpKSk7XG5cbiAgICAgIGlmICh0aGlzLnBhcmFtcy5hbGwgfHwgdGhpcy5wYXJhbXMuY29udmVydCkge1xuICAgICAgICBub2Rlcy5wdXNoKHRoaXMuY29udmVydChmaXJzdE1hdGNoLmJ1ZmZlcikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm5vZGUoJ2FkZHJlc3MnLCBpbnB1dCwgbm9kZXMpO1xuICB9XG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!