PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-dot/dist/src/lib
Просмотр файла: nativeTransferBuilder.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.NativeTransferBuilder = void 0;
const sdk_core_1 = require("@bitgo/sdk-core");
const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const iface_1 = require("./iface");
const iface_utils_1 = require("./iface_utils");
const singletonRegistry_1 = require("./singletonRegistry");
const transactionBuilder_1 = require("./transactionBuilder");
const txnSchema_1 = require("./txnSchema");
const utils_1 = __importDefault(require("./utils"));
class NativeTransferBuilder extends transactionBuilder_1.TransactionBuilder {
constructor(_coinConfig) {
super(_coinConfig);
this._sweepFreeBalance = false;
this._keepAddressAlive = true;
}
/**
*
* Dispatch the given call from an account that the sender is authorised for through add_proxy.
*
* @returns {UnsignedTransaction} an unsigned Dot transaction
*
* @see https://polkadot.js.org/docs/substrate/extrinsics/#proxy
*/
buildTransaction() {
const baseTxInfo = this.createBaseTxInfo();
let transferTx;
if (this._sweepFreeBalance) {
transferTx = txwrapper_polkadot_1.methods.balances.transferAll({
dest: { id: this._to },
keepAlive: this._keepAddressAlive,
}, baseTxInfo.baseTxInfo, baseTxInfo.options);
}
else {
transferTx = txwrapper_polkadot_1.methods.balances.transferKeepAlive({
value: this._amount,
dest: { id: this._to },
}, baseTxInfo.baseTxInfo, baseTxInfo.options);
}
if (!this._owner) {
return transferTx;
}
return txwrapper_polkadot_1.methods.proxy.proxy({
real: this._owner,
forceProxyType: this._forceProxyType,
call: transferTx.method,
}, baseTxInfo.baseTxInfo, baseTxInfo.options);
}
get transactionType() {
return sdk_core_1.TransactionType.Send;
}
/**
*
* Set this to be a sweep transaction, using TransferAll with keepAlive set to true by default.
* If keepAlive is false, the entire address will be swept (including the 1 DOT minimum).
*
* @param {boolean} keepAlive - keep the address alive after this sweep
* @returns {TransferBuilder} This transfer builder.
*
* @see https://github.com/paritytech/txwrapper-core/blob/main/docs/modules/txwrapper_substrate_src.methods.balances.md#transferall
*/
sweep(keepAlive) {
this._sweepFreeBalance = true;
if (keepAlive !== undefined) {
this._keepAddressAlive = keepAlive;
}
return this;
}
/**
*
* The amount for transfer transaction.
*
* @param {string} amount
* @returns {TransferBuilder} This transfer builder.
*
* @see https://wiki.polkadot.network/docs/build-protocol-info
*/
amount(amount) {
this.validateValue(new bignumber_js_1.default(amount));
this._amount = amount;
return this;
}
/**
*
* The destination address for transfer transaction.
*
* @param {string} dest
* @returns {TransferBuilder} This transfer builder.
*
* @see https://wiki.polkadot.network/docs/build-protocol-info
*/
to({ address }) {
this.validateAddress({ address });
this._to = address;
return this;
}
/**
*
* The real address of the original tx
*
* @param {BaseAddress} real
* @returns {TransferBuilder} This builder.
*
* @see https://wiki.polkadot.network/docs/learn-proxies#why-use-a-proxy
*/
owner(owner) {
this.validateAddress({ address: owner.address });
this._owner = owner.address;
return this;
}
/**
*
* The proxy type to execute
*
* @param {proxyType} forceProxyType
* @returns {TransferBuilder} This builder.
*
* @see https://wiki.polkadot.network/docs/learn-proxies#proxy-types
*/
forceProxyType(forceProxyType) {
this._forceProxyType = forceProxyType;
return this;
}
/** @inheritdoc */
validateDecodedTransaction(decodedTxn, rawTransaction) {
if (decodedTxn.method?.name === iface_1.MethodNames.TransferKeepAlive) {
const txMethod = decodedTxn.method.args;
const amount = `${txMethod.value}`;
const to = txMethod.dest.id;
const validationResult = txnSchema_1.TransferTransactionSchema.validate({ amount, to });
if (validationResult.error) {
throw new sdk_core_1.InvalidTransactionError(`Transfer Transaction validation failed: ${validationResult.error.message}`);
}
}
else if (decodedTxn.method?.name === iface_1.MethodNames.Proxy) {
const txMethod = decodedTxn.method.args;
const real = (0, iface_utils_1.getAddress)(txMethod);
const forceProxyType = txMethod.forceProxyType;
const decodedCall = utils_1.default.decodeCallMethod(rawTransaction, {
registry: singletonRegistry_1.SingletonRegistry.getInstance(this._material),
metadataRpc: this._material.metadata,
});
const amount = `${decodedCall.value}`;
const to = decodedCall.dest.id;
const validationResult = txnSchema_1.ProxyTransactionSchema.validate({ real, forceProxyType, amount, to });
if (validationResult.error) {
throw new sdk_core_1.InvalidTransactionError(`Proxy Transaction validation failed: ${validationResult.error.message}`);
}
}
}
/** @inheritdoc */
fromImplementation(rawTransaction) {
const tx = super.fromImplementation(rawTransaction);
if (this._method?.name === iface_1.MethodNames.TransferKeepAlive) {
const txMethod = this._method.args;
this.amount(txMethod.value);
this.to({
address: utils_1.default.decodeDotAddress(txMethod.dest.id, utils_1.default.getAddressFormat(this._coinConfig.name)),
});
}
else if (this._method?.name === iface_1.MethodNames.TransferAll) {
this._sweepFreeBalance = true;
const txMethod = this._method.args;
this.sweep(txMethod.keepAlive);
this.to({
address: utils_1.default.decodeDotAddress(txMethod.dest.id, utils_1.default.getAddressFormat(this._coinConfig.name)),
});
}
else if (this._method?.name === iface_1.MethodNames.Proxy) {
const txMethod = this._method.args;
this.owner({
address: utils_1.default.decodeDotAddress((0, iface_utils_1.getAddress)(txMethod), utils_1.default.getAddressFormat(this._coinConfig.name)),
});
this.forceProxyType(txMethod.forceProxyType);
const decodedCall = utils_1.default.decodeCallMethod(rawTransaction, {
registry: singletonRegistry_1.SingletonRegistry.getInstance(this._material),
metadataRpc: this._material.metadata,
});
if (!decodedCall.value || !decodedCall.dest) {
throw new sdk_core_1.InvalidTransactionError(`Invalid Proxy Transaction Method: ${this._method?.name}. Expected transferKeepAlive`);
}
this.amount(`${decodedCall.value}`);
this.to({
address: utils_1.default.decodeDotAddress(decodedCall.dest.id, utils_1.default.getAddressFormat(this._coinConfig.name)),
});
}
else {
throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${this._method?.name}. Expected a transferKeepAlive or a proxy transferKeepAlive transaction`);
}
return tx;
}
/** @inheritdoc */
validateTransaction(_) {
super.validateTransaction(_);
this.validateFields(this._to, this._amount, this._owner, this._forceProxyType);
}
validateFields(to, amount, real, forceProxyType) {
let validationResult;
if (forceProxyType) {
validationResult = txnSchema_1.ProxyTransactionSchema.validate({ to, amount, real, forceProxyType });
}
else if (this._sweepFreeBalance) {
validationResult = txnSchema_1.TransferAllTransactionSchema.validate({ to });
}
else {
validationResult = txnSchema_1.TransferTransactionSchema.validate({ amount, to });
}
if (validationResult.error) {
throw new sdk_core_1.InvalidTransactionError(`Proxy/TransferAll/TransferKeepAlive Transaction validation failed: ${validationResult.error.message}`);
}
}
}
exports.NativeTransferBuilder = NativeTransferBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlVHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9uYXRpdmVUcmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOENBQXVHO0FBRXZHLHNFQUF3RDtBQUV4RCxnRUFBcUM7QUFDckMsbUNBQTJGO0FBQzNGLCtDQUEyQztBQUMzQywyREFBd0Q7QUFFeEQsNkRBQTBEO0FBQzFELDJDQUE4RztBQUM5RyxvREFBNEI7QUFFNUIsTUFBc0IscUJBQXNCLFNBQVEsdUNBQWtCO0lBUXBFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBUlgsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHNCQUFpQixHQUFHLElBQUksQ0FBQztJQVFuQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLGdCQUFnQjtRQUN4QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsVUFBVSxHQUFHLDRCQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FDdkM7Z0JBQ0UsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3RCLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2FBQ2xDLEVBQ0QsVUFBVSxDQUFDLFVBQVUsRUFDckIsVUFBVSxDQUFDLE9BQU8sQ0FDbkIsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxHQUFHLDRCQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUM3QztnQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ25CLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2FBQ3ZCLEVBQ0QsVUFB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RUFBRSxNQUFjLEVBQUUsSUFBYSxFQUFFLGNBQXVCO1FBQ3ZGLElBQUksZ0JBQWdCLENBQUM7UUFDckIsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixnQkFBZ0IsR0FBRyxrQ0FBc0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2xDLGdCQUFnQixHQUFHLHdDQUE0QixDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQzthQUFNLENBQUM7WUFDTixnQkFBZ0IsR0FBRyxxQ0FBeUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksa0NBQXVCLENBQy9CLHNFQUFzRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQ3ZHLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbFBELHNEQWtQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VBZGRyZXNzLCBEb3RBc3NldFR5cGVzLCBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBtZXRob2RzIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItcG9sa2Fkb3QnO1xuaW1wb3J0IHsgRGVjb2RlZFNpZ25lZFR4LCBEZWNvZGVkU2lnbmluZ1BheWxvYWQsIFVuc2lnbmVkVHJhbnNhY3Rpb24gfSBmcm9tICdAc3Vic3RyYXRlL3R4d3JhcHBlci1jb3JlJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IE1ldGhvZE5hbWVzLCBQcm94eUFyZ3MsIFByb3h5VHlwZSwgVHJhbnNmZXJBbGxBcmdzLCBUcmFuc2ZlckFyZ3MgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGdldEFkZHJlc3MgfSBmcm9tICcuL2lmYWNlX3V0aWxzJztcbmltcG9ydCB7IFNpbmdsZXRvblJlZ2lzdHJ5IH0gZnJvbSAnLi9zaW5nbGV0b25SZWdpc3RyeSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgUHJveHlUcmFuc2FjdGlvblNjaGVtYSwgVHJhbnNmZXJBbGxUcmFuc2FjdGlvblNjaGVtYSwgVHJhbnNmZXJUcmFuc2FjdGlvblNjaGVtYSB9IGZyb20gJy4vdHhuU2NoZW1hJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5hdGl2ZVRyYW5zZmVyQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfc3dlZXBGcmVlQmFsYW5jZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2tlZXBBZGRyZXNzQWxpdmUgPSB0cnVlO1xuICBwcm90ZWN0ZWQgX2Ftb3VudDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3RvOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfb3duZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9mb3JjZVByb3h5VHlwZTogUHJveHlUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBEaXNwYXRjaCB0aGUgZ2l2ZW4gY2FsbCBmcm9tIGFuIGFjY291bnQgdGhhdCB0aGUgc2VuZGVyIGlzIGF1dGhvcmlzZWQgZm9yIHRocm91Z2ggYWRkX3Byb3h5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7VW5zaWduZWRUcmFuc2FjdGlvbn0gYW4gdW5zaWduZWQgRG90IHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9wb2xrYWRvdC5qcy5vcmcvZG9jcy9zdWJzdHJhdGUvZXh0cmluc2ljcy8jcHJveHlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZFRyYW5zYWN0aW9uKCk6IFVuc2lnbmVkVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGJhc2VUeEluZm8gPSB0aGlzLmNyZWF0ZUJhc2VUeEluZm8oKTtcbiAgICBsZXQgdHJhbnNmZXJUeDtcbiAgICBpZiAodGhpcy5fc3dlZXBGcmVlQmFsYW5jZSkge1xuICAgICAgdHJhbnNmZXJUeCA9IG1ldGhvZHMuYmFsYW5jZXMudHJhbnNmZXJBbGwoXG4gICAgICAgIHtcbiAgICAgICAgICBkZXN0OiB7IGlkOiB0aGlzLl90byB9LFxuICAgICAgICAgIGtlZXBBbGl2ZTogdGhpcy5fa2VlcEFkZHJlc3NBbGl2ZSxcbiAgICAgICAgfSxcbiAgICAgICAgYmFzZVR4SW5mby5iYXNlVHhJbmZvLFxuICAgICAgICBiYXNlVHhJbmZvLm9wdGlvbnNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYW5zZmVyVHggPSBtZXRob2RzLmJhbGFuY2VzLnRyYW5zZmVyS2VlcEFsaXZlKFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuX2Ftb3VudCxcbiAgICAgICAgICBkZXN0OiB7IGlkOiB0aGlzLl90byB9LFxuICAgICAgICB9LFxuICAgICAgICBiYXNlVHhJbmZvLmJhc2VUeEluZm8sXG4gICAgICAgIGJhc2VUeEluZm8ub3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX293bmVyKSB7XG4gICAgICByZXR1cm4gdHJhbnNmZXJUeDtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGhvZHMucHJveHkucHJveHkoXG4gICAgICB7XG4gICAgICAgIHJlYWw6IHRoaXMuX293bmVyLFxuICAgICAgICBmb3JjZVByb3h5VHlwZTogdGhpcy5fZm9yY2VQcm94eVR5cGUsXG4gICAgICAgIGNhbGw6IHRyYW5zZmVyVHgubWV0aG9kLFxuICAgICAgfSxcbiAgICAgIGJhc2VUeEluZm8uYmFzZVR4SW5mbyxcbiAgICAgIGJhc2VUeEluZm8ub3B0aW9uc1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBTZXQgdGhpcyB0byBiZSBhIHN3ZWVwIHRyYW5zYWN0aW9uLCB1c2luZyBUcmFuc2ZlckFsbCB3aXRoIGtlZXBBbGl2ZSBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0LlxuICAgKiBJZiBrZWVwQWxpdmUgaXMgZmFsc2UsIHRoZSBlbnRpcmUgYWRkcmVzcyB3aWxsIGJlIHN3ZXB0IChpbmNsdWRpbmcgdGhlIDEgRE9UIG1pbmltdW0pLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGtlZXBBbGl2ZSAtIGtlZXAgdGhlIGFkZHJlc3MgYWxpdmUgYWZ0ZXIgdGhpcyBzd2VlcFxuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJCdWlsZGVyfSBUaGlzIHRyYW5zZmVyIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvdHh3cmFwcGVyLWNvcmUvYmxvYi9tYWluL2RvY3MvbW9kdWxlcy90eHdyYXBwZXJfc3Vic3RyYXRlX3NyYy5tZXRob2RzLmJhbGFuY2VzLm1kI3RyYW5zZmVyYWxsXG4gICAqL1xuICBzd2VlcChrZWVwQWxpdmU/OiBib29sZWFuKTogdGhpcyB7XG4gICAgdGhpcy5fc3dlZXBGcmVlQmFsYW5jZSA9IHRydWU7XG4gICAgaWYgKGtlZXBBbGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9rZWVwQWRkcmVzc0FsaXZlID0ga2VlcEFsaXZlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgYW1vdW50IGZvciB0cmFuc2ZlciB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudFxuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJCdWlsZGVyfSBUaGlzIHRyYW5zZmVyIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBvbGthZG90Lm5ldHdvcmsvZG9jcy9idWlsZC1wcm90b2NvbC1pbmZvXG4gICAqL1xuICBhbW91bnQoYW1vdW50OiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcihhbW91bnQpKTtcbiAgICB0aGlzLl9hbW91bnQgPSBhbW91bnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRyYW5zZmVyIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzdFxuICAgKiBAcmV0dXJucyB7VHJhbnNmZXJCdWlsZGVyfSBUaGlzIHRyYW5zZmVyIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBvbGthZG90Lm5ldHdvcmsvZG9jcy9idWlsZC1wcm90b2NvbC1pbmZvXG4gICAqL1xuICB0byh7IGFkZHJlc3MgfTogQmFzZUFkZHJlc3MpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gICAgdGhpcy5fdG8gPSBhZGRyZXNzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoZSByZWFsIGFkZHJlc3Mgb2YgdGhlIG9yaWdpbmFsIHR4XG4gICAqXG4gICAqIEBwYXJhbSB7QmFzZUFkZHJlc3N9IHJlYWxcbiAgICogQHJldHVybnMge1RyYW5zZmVyQnVpbGRlcn0gVGhpcyBidWlsZGVyLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd2lraS5wb2xrYWRvdC5uZXR3b3JrL2RvY3MvbGVhcm4tcHJveGllcyN3aHktdXNlLWEtcHJveHlcbiAgICovXG4gIG93bmVyKG93bmVyOiBCYXNlQWRkcmVzcyk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogb3duZXIuYWRkcmVzcyB9KTtcbiAgICB0aGlzLl9vd25lciA9IG93bmVyLmFkZHJlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhlIHByb3h5IHR5cGUgdG8gZXhlY3V0ZVxuICAgKlxuICAgKiBAcGFyYW0ge3Byb3h5VHlwZX0gZm9yY2VQcm94eVR5cGVcbiAgICogQHJldHVybnMge1RyYW5zZmVyQnVpbGRlcn0gVGhpcyBidWlsZGVyLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd2lraS5wb2xrYWRvdC5uZXR3b3JrL2RvY3MvbGVhcm4tcHJveGllcyNwcm94eS10eXBlc1xuICAgKi9cbiAgZm9yY2VQcm94eVR5cGUoZm9yY2VQcm94eVR5cGU6IFByb3h5VHlwZSk6IHRoaXMge1xuICAgIHRoaXMuX2ZvcmNlUHJveHlUeXBlID0gZm9yY2VQcm94eVR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVEZWNvZGVkVHJhbnNhY3Rpb24oZGVjb2RlZFR4bjogRGVjb2RlZFNpZ25pbmdQYXlsb2FkIHwgRGVjb2RlZFNpZ25lZFR4LCByYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGRlY29kZWRUeG4ubWV0aG9kPy5uYW1lID09PSBNZXRob2ROYW1lcy5UcmFuc2ZlcktlZXBBbGl2ZSkge1xuICAgICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHhuLm1ldGhvZC5hcmdzIGFzIHVua25vd24gYXMgVHJhbnNmZXJBcmdzO1xuICAgICAgY29uc3QgYW1vdW50ID0gYCR7dHhNZXRob2QudmFsdWV9YDtcbiAgICAgIGNvbnN0IHRvID0gdHhNZXRob2QuZGVzdC5pZDtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBUcmFuc2ZlclRyYW5zYWN0aW9uU2NoZW1hLnZhbGlkYXRlKHsgYW1vdW50LCB0byB9KTtcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgVHJhbnNmZXIgVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVjb2RlZFR4bi5tZXRob2Q/Lm5hbWUgPT09IE1ldGhvZE5hbWVzLlByb3h5KSB7XG4gICAgICBjb25zdCB0eE1ldGhvZCA9IGRlY29kZWRUeG4ubWV0aG9kLmFyZ3MgYXMgdW5rbm93biBhcyBQcm94eUFyZ3M7XG4gICAgICBjb25zdCByZWFsID0gZ2V0QWRkcmVzcyh0eE1ldGhvZCk7XG4gICAgICBjb25zdCBmb3JjZVByb3h5VHlwZSA9IHR4TWV0aG9kLmZvcmNlUHJveHlUeXBlO1xuICAgICAgY29uc3QgZGVjb2RlZENhbGwgPSB1dGlscy5kZWNvZGVDYWxsTWV0aG9kKHJhd1RyYW5zYWN0aW9uLCB7XG4gICAgICAgIHJlZ2lzdHJ5OiBTaW5nbGV0b25SZWdpc3RyeS5nZXRJbnN0YW5jZSh0aGlzLl9tYXRlcmlhbCksXG4gICAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9tYXRlcmlhbC5tZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYW1vdW50ID0gYCR7ZGVjb2RlZENhbGwudmFsdWV9YDtcbiAgICAgIGNvbnN0IHRvID0gZGVjb2RlZENhbGwuZGVzdC5pZDtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBQcm94eVRyYW5zYWN0aW9uU2NoZW1hLnZhbGlkYXRlKHsgcmVhbCwgZm9yY2VQcm94eVR5cGUsIGFtb3VudCwgdG8gfSk7XG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYFByb3h5IFRyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICBpZiAodGhpcy5fbWV0aG9kPy5uYW1lID09PSBNZXRob2ROYW1lcy5UcmFuc2ZlcktlZXBBbGl2ZSkge1xuICAgICAgY29uc3QgdHhNZXRob2QgPSB0aGlzLl9tZXRob2QuYXJncyBhcyBUcmFuc2ZlckFyZ3M7XG4gICAgICB0aGlzLmFtb3VudCh0eE1ldGhvZC52YWx1ZSk7XG4gICAgICB0aGlzLnRvKHtcbiAgICAgICAgYWRkcmVzczogdXRpbHMuZGVjb2RlRG90QWRkcmVzcyhcbiAgICAgICAgICB0eE1ldGhvZC5kZXN0LmlkLFxuICAgICAgICAgIHV0aWxzLmdldEFkZHJlc3NGb3JtYXQodGhpcy5fY29pbkNvbmZpZy5uYW1lIGFzIERvdEFzc2V0VHlwZXMpXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX21ldGhvZD8ubmFtZSA9PT0gTWV0aG9kTmFtZXMuVHJhbnNmZXJBbGwpIHtcbiAgICAgIHRoaXMuX3N3ZWVwRnJlZUJhbGFuY2UgPSB0cnVlO1xuICAgICAgY29uc3QgdHhNZXRob2QgPSB0aGlzLl9tZXRob2QuYXJncyBhcyBUcmFuc2ZlckFsbEFyZ3M7XG4gICAgICB0aGlzLnN3ZWVwKHR4TWV0aG9kLmtlZXBBbGl2ZSk7XG4gICAgICB0aGlzLnRvKHtcbiAgICAgICAgYWRkcmVzczogdXRpbHMuZGVjb2RlRG90QWRkcmVzcyhcbiAgICAgICAgICB0eE1ldGhvZC5kZXN0LmlkLFxuICAgICAgICAgIHV0aWxzLmdldEFkZHJlc3NGb3JtYXQodGhpcy5fY29pbkNvbmZpZy5uYW1lIGFzIERvdEFzc2V0VHlwZXMpXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX21ldGhvZD8ubmFtZSA9PT0gTWV0aG9kTmFtZXMuUHJveHkpIHtcbiAgICAgIGNvbnN0IHR4TWV0aG9kID0gdGhpcy5fbWV0aG9kLmFyZ3MgYXMgUHJveHlBcmdzO1xuICAgICAgdGhpcy5vd25lcih7XG4gICAgICAgIGFkZHJlc3M6IHV0aWxzLmRlY29kZURvdEFkZHJlc3MoXG4gICAgICAgICAgZ2V0QWRkcmVzcyh0eE1ldGhvZCksXG4gICAgICAgICAgdXRpbHMuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLl9jb2luQ29uZmlnLm5hbWUgYXMgRG90QXNzZXRUeXBlcylcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5mb3JjZVByb3h5VHlwZSh0eE1ldGhvZC5mb3JjZVByb3h5VHlwZSk7XG4gICAgICBjb25zdCBkZWNvZGVkQ2FsbCA9IHV0aWxzLmRlY29kZUNhbGxNZXRob2QocmF3VHJhbnNhY3Rpb24sIHtcbiAgICAgICAgcmVnaXN0cnk6IFNpbmdsZXRvblJlZ2lzdHJ5LmdldEluc3RhbmNlKHRoaXMuX21hdGVyaWFsKSxcbiAgICAgICAgbWV0YWRhdGFScGM6IHRoaXMuX21hdGVyaWFsLm1ldGFkYXRhLFxuICAgICAgfSk7XG4gICAgICBpZiAoIWRlY29kZWRDYWxsLnZhbHVlIHx8ICFkZWNvZGVkQ2FsbC5kZXN0KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBQcm94eSBUcmFuc2FjdGlvbiBNZXRob2Q6ICR7dGhpcy5fbWV0aG9kPy5uYW1lfS4gRXhwZWN0ZWQgdHJhbnNmZXJLZWVwQWxpdmVgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmFtb3VudChgJHtkZWNvZGVkQ2FsbC52YWx1ZX1gKTtcbiAgICAgIHRoaXMudG8oe1xuICAgICAgICBhZGRyZXNzOiB1dGlscy5kZWNvZGVEb3RBZGRyZXNzKFxuICAgICAgICAgIGRlY29kZWRDYWxsLmRlc3QuaWQsXG4gICAgICAgICAgdXRpbHMuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLl9jb2luQ29uZmlnLm5hbWUgYXMgRG90QXNzZXRUeXBlcylcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFRyYW5zYWN0aW9uIFR5cGU6ICR7dGhpcy5fbWV0aG9kPy5uYW1lfS4gRXhwZWN0ZWQgYSB0cmFuc2ZlcktlZXBBbGl2ZSBvciBhIHByb3h5IHRyYW5zZmVyS2VlcEFsaXZlIHRyYW5zYWN0aW9uYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24oXzogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBzdXBlci52YWxpZGF0ZVRyYW5zYWN0aW9uKF8pO1xuICAgIHRoaXMudmFsaWRhdGVGaWVsZHModGhpcy5fdG8sIHRoaXMuX2Ftb3VudCwgdGhpcy5fb3duZXIsIHRoaXMuX2ZvcmNlUHJveHlUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVGaWVsZHModG86IHN0cmluZywgYW1vdW50OiBzdHJpbmcsIHJlYWw/OiBzdHJpbmcsIGZvcmNlUHJveHlUeXBlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHZhbGlkYXRpb25SZXN1bHQ7XG4gICAgaWYgKGZvcmNlUHJveHlUeXBlKSB7XG4gICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gUHJveHlUcmFuc2FjdGlvblNjaGVtYS52YWxpZGF0ZSh7IHRvLCBhbW91bnQsIHJlYWwsIGZvcmNlUHJveHlUeXBlIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fc3dlZXBGcmVlQmFsYW5jZSkge1xuICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IFRyYW5zZmVyQWxsVHJhbnNhY3Rpb25TY2hlbWEudmFsaWRhdGUoeyB0byB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IFRyYW5zZmVyVHJhbnNhY3Rpb25TY2hlbWEudmFsaWRhdGUoeyBhbW91bnQsIHRvIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBQcm94eS9UcmFuc2ZlckFsbC9UcmFuc2ZlcktlZXBBbGl2ZSBUcmFuc2FjdGlvbiB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9yLm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!