PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-baby/dist/src/lib

Просмотр файла: utils.js

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Utils = void 0;
const babylon_proto_ts_1 = require("@babylonlabs-io/babylon-proto-ts");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const abstract_cosmos_1 = require("@bitgo/abstract-cosmos");
const sdk_core_1 = require("@bitgo/sdk-core");
const constants = __importStar(require("./constants"));
class Utils extends abstract_cosmos_1.CosmosUtils {
    constructor() {
        super();
        this.babylonMessageKindToTypeUrl = {
            CreateBtcDelegation: constants.createBTCDelegationMsgTypeUrl,
            WithdrawReward: constants.withdrawRewardMsgTypeUrl,
        };
        this.babylonMessageTypeUrlToKind = Object.fromEntries(Object.entries(this.babylonMessageKindToTypeUrl).map(([key, value]) => [value, key]));
        this.wrappedMsgTypeUrls = new Set([
            constants.wrappedDelegateMsgTypeUrl,
            constants.wrappedUndelegateMsgTypeUrl,
            constants.wrappedBeginRedelegateTypeUrl,
        ]);
        this.customMsgTypeUrls = new Set([constants.createBTCDelegationMsgTypeUrl]);
        this.registry.register(constants.wrappedDelegateMsgTypeUrl, babylon_proto_ts_1.epochingtx.MsgWrappedDelegate);
        this.registry.register(constants.wrappedUndelegateMsgTypeUrl, babylon_proto_ts_1.epochingtx.MsgWrappedUndelegate);
        this.registry.register(constants.wrappedBeginRedelegateTypeUrl, babylon_proto_ts_1.epochingtx.MsgWrappedBeginRedelegate);
        this.registry.register(constants.createBTCDelegationMsgTypeUrl, babylon_proto_ts_1.btcstakingtx.MsgCreateBTCDelegation);
        this.registry.register(constants.withdrawRewardMsgTypeUrl, babylon_proto_ts_1.incentivetx.MsgWithdrawReward);
    }
    /** @inheritdoc */
    getDelegateOrUndelegateMessageDataFromDecodedTx(decodedTx) {
        return decodedTx.body.messages.map((message) => {
            const value = this.registry.decode(message).msg;
            return {
                typeUrl: message.typeUrl,
                value: {
                    delegatorAddress: value.delegatorAddress,
                    validatorAddress: value.validatorAddress,
                    amount: value.amount,
                },
            };
        });
    }
    /** @inheritdoc */
    getRedelegateMessageDataFromDecodedTx(decodedTx) {
        return decodedTx.body.messages.map((message) => {
            const value = this.registry.decode(message).msg;
            return {
                typeUrl: message.typeUrl,
                value: {
                    delegatorAddress: value.delegatorAddress,
                    validatorSrcAddress: value.validatorSrcAddress,
                    validatorDstAddress: value.validatorDstAddress,
                    amount: value.amount,
                },
            };
        });
    }
    /** @inheritdoc */
    getCustomMessageDataFromDecodedTx(decodedTx) {
        return decodedTx.body.messages.map((message) => {
            const value = this.registry.decode(message);
            return {
                typeUrl: message.typeUrl,
                value: {
                    _kind: this.babylonMessageTypeUrlToKind[message.typeUrl],
                    ...value,
                },
            };
        });
    }
    /** @inheritdoc */
    getTransactionTypeFromTypeUrl(typeUrl) {
        switch (typeUrl) {
            case constants.wrappedDelegateMsgTypeUrl:
                return sdk_core_1.TransactionType.StakingActivate;
            case constants.wrappedUndelegateMsgTypeUrl:
                return sdk_core_1.TransactionType.StakingDeactivate;
            case constants.wrappedBeginRedelegateTypeUrl:
                return sdk_core_1.TransactionType.StakingRedelegate;
            case constants.createBTCDelegationMsgTypeUrl:
            case constants.withdrawRewardMsgTypeUrl:
                return sdk_core_1.TransactionType.CustomTx;
            default:
                return super.getTransactionTypeFromTypeUrl(typeUrl);
        }
    }
    /** @inheritdoc */
    getSendMessagesForEncodingTx(cosmosLikeTransaction) {
        return cosmosLikeTransaction.sendMessages.map(({ typeUrl, value }) => {
            let valueToEncode = value;
            if (this.wrappedMsgTypeUrls.has(typeUrl)) {
                valueToEncode = { msg: value };
            }
            else if (this.customMsgTypeUrls.has(typeUrl)) {
                // eslint-disable-next-line @typescript-eslint/no-unused-vars
                const { _kind, ...rest } = value;
                valueToEncode = rest;
            }
            return { typeUrl, value: valueToEncode };
        });
    }
    /** @inheritdoc */
    validateCustomMessage(customMessage) {
        switch (customMessage._kind) {
            case 'CreateBtcDelegation':
                this.validateCreateBtcDelegationMessage(customMessage);
                break;
            case 'WithdrawReward':
                this.validateWithdrawRewardMessage(customMessage);
                break;
            default:
                throw new sdk_core_1.InvalidTransactionError(`Unsupported BabylonSpecificMessages message`);
        }
    }
    validateCreateBtcDelegationMessage(createBtcDelegationMessage) {
        if (createBtcDelegationMessage._kind !== 'CreateBtcDelegation') {
            throw new sdk_core_1.InvalidTransactionError(`Invalid CreateBtcDelegationMessage kind: ${createBtcDelegationMessage._kind}`);
        }
        // TODO: check the other fields more thoroughly
        this.isObjPropertyNull(createBtcDelegationMessage, [
            'stakerAddr',
            // 'pop',
            'btcPk',
            'fpBtcPkList',
            'stakingTime',
            'stakingValue',
            'stakingTx',
            // 'stakingTxInclusionProof',
            'slashingTx',
            'delegatorSlashingSig',
            'unbondingTime',
            'unbondingTx',
            'unbondingValue',
            'unbondingSlashingTx',
            'delegatorUnbondingSlashingSig',
        ]);
        if (createBtcDelegationMessage.pop) {
            this.isObjPropertyNull(createBtcDelegationMessage.pop, ['btcSigType', 'btcSig']);
        }
        if (createBtcDelegationMessage.stakingTxInclusionProof) {
            this.isObjPropertyNull(createBtcDelegationMessage.stakingTxInclusionProof, ['key', 'proof']);
            if (createBtcDelegationMessage.stakingTxInclusionProof.key) {
                this.isObjPropertyNull(createBtcDelegationMessage.stakingTxInclusionProof.key, ['index', 'hash']);
            }
        }
        if (!this.isValidAddress(createBtcDelegationMessage.stakerAddr)) {
            throw new sdk_core_1.InvalidTransactionError(`Invalid CreateBtcDelegationMessage stakerAddr: ${createBtcDelegationMessage.stakerAddr}`);
        }
    }
    validateWithdrawRewardMessage(withdrawRewardMessage) {
        if (withdrawRewardMessage._kind !== 'WithdrawReward') {
            throw new sdk_core_1.InvalidTransactionError(`Invalid WithdrawRewardMessage kind: ${withdrawRewardMessage._kind}`);
        }
        this.isObjPropertyNull(withdrawRewardMessage, ['type', 'address']);
        if (!['finality_provider', 'btc_staker'].includes(withdrawRewardMessage.type)) {
            throw new sdk_core_1.InvalidTransactionError(`Invalid WithdrawRewardMessage type: ${withdrawRewardMessage.type}`);
        }
        if (!this.isValidAddress(withdrawRewardMessage.address)) {
            throw new sdk_core_1.InvalidTransactionError(`Invalid WithdrawRewardMessage address: ${withdrawRewardMessage.address}`);
        }
    }
    /** @inheritdoc */
    isValidAddress(address) {
        return this.isValidCosmosLikeAddressWithMemoId(address, constants.accountAddressRegex);
    }
    /** @inheritdoc */
    isValidValidatorAddress(address) {
        return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex);
    }
    /** @inheritdoc */
    isValidContractAddress(address) {
        return this.isValidBech32AddressMatchingRegex(address, constants.contractAddressRegex);
    }
    /** @inheritdoc */
    validateAmount(amount) {
        const amountBig = (0, bignumber_js_1.default)(amount.amount);
        if (amountBig.isLessThanOrEqualTo(0)) {
            throw new sdk_core_1.InvalidTransactionError('transactionBuilder: validateAmount: Invalid amount: ' + amount.amount);
        }
        if (!constants.validDenoms.find((denom) => denom === amount.denom)) {
            throw new sdk_core_1.InvalidTransactionError('transactionBuilder: validateAmount: Invalid denom: ' + amount.denom);
        }
    }
}
exports.Utils = Utils;
const utils = new Utils();
exports.default = utils;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVFQUF5RjtBQUd6RixnRUFBcUM7QUFRckMsNERBQWtFO0FBQ2xFLDhDQUEyRTtBQUMzRSx1REFBeUM7QUFFekMsTUFBYSxLQUFNLFNBQVEsNkJBQW9DO0lBZ0I3RDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBaEJILGdDQUEyQixHQUErQztZQUMvRSxtQkFBbUIsRUFBRSxTQUFTLENBQUMsNkJBQTZCO1lBQzVELGNBQWMsRUFBRSxTQUFTLENBQUMsd0JBQXdCO1NBQ25ELENBQUM7UUFDSyxnQ0FBMkIsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUNyRCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUN2QyxDQUFDO1FBRXRDLHVCQUFrQixHQUFHLElBQUksR0FBRyxDQUFTO1lBQzdDLFNBQVMsQ0FBQyx5QkFBeUI7WUFDbkMsU0FBUyxDQUFDLDJCQUEyQjtZQUNyQyxTQUFTLENBQUMsNkJBQTZCO1NBQ3hDLENBQUMsQ0FBQztRQUNPLHNCQUFpQixHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztRQUl2RixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMseUJBQXlCLEVBQUUsNkJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsRUFBRSw2QkFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLDZCQUE2QixFQUFFLDZCQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLEVBQUUsK0JBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSw4QkFBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELGtCQUFrQjtJQUNsQiwrQ0FBK0MsQ0FBQyxTQUF1QjtRQUNyRSxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNoRCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsS0FBSyxFQUFFO29CQUNMLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtpQkFDckI7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLHFDQUFxQyxDQUFDLFNBQXVCO1FBQzNELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2hELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dCQUN4QixLQUFLLEVBQUU7b0JBQ0wsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtvQkFDeEMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtvQkFDOUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtvQkFDOUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2lCQUNyQjthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUNBQWlDLENBQUMsU0FBdUI7UUFDdkQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxPQUFPO2dCQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztvQkFDeEQsR0FBRyxLQUFLO2lCQUNUO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQjtJQUNsQiw2QkFBNkIsQ0FBQyxPQUFlO1FBQzNDLFFBQVEsT0FBTyxFQUFFLENBQUM7WUFDaEIsS0FBSyxTQUFTLENBQUMseUJBQXlCO2dCQUN0QyxPQUFPLDBCQUFlLENBQUMsZUFBZSxDQUFDO1lBQ3pDLEtBQUssU0FBUyxDQUFDLDJCQUEyQjtnQkFDeEMsT0FBTywwQkFBZSxDQUFDLGlCQUFpQixDQUFDO1lBQzNDLEtBQUssU0FBUyxDQUFDLDZCQUE2QjtnQkFDMUMsT0FBTywwQkFBZSxDQUFDLGlCQUFpQixDQUFDO1lBQzNDLEtBQUssU0FBUyxDQUFDLDZCQUE2QixDQUFDO1lBQzdDLEtBQUssU0FBUyxDQUFDLHdCQUF3QjtnQkFDckMsT0FBTywwQkFBZSxDQUFDLFFBQVEsQ0FBQztZQUNsQztnQkFDRSxPQUFPLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQiw0QkFBNEIsQ0FDMUIscUJBQTBHO1FBRTFHLE9BQU8scUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDbkUsSUFBSSxhQUFhLEdBQVksS0FBSyxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxhQUFhLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDakMsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsNkRBQTZEO2dCQUM3RCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsS0FBZ0MsQ0FBQztnQkFDNUQsYUFBYSxHQUFHLElBQUksQ0FBQztZQUN2QixDQUFDO1lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDM0MsQ0FBQyxDQUFxQixDQUFDO0lBQ3pCLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIscUJBQXFCLENBQUMsYUFBc0M7UUFDMUQsUUFBUSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsS0FBSyxxQkFBcUI7Z0JBQ3hCLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdkQsTUFBTTtZQUNSLEtBQUssZ0JBQWdCO2dCQUNuQixJQUFJLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xELE1BQU07WUFDUjtnQkFDRSxNQUFNLElBQUksa0NBQXVCLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNyRixDQUFDO0lBQ0gsQ0FBQztJQUVELGtDQUFrQyxDQUFDLDBCQUFzRDtRQUN2RixJQUFJLDBCQUEwQixDQUFDLEtBQUssS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9ELE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyw0Q0FBNEMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwSCxDQUFDO1FBRUQsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsRUFBRTtZQUNqRCxZQUFZO1lBQ1osU0FBUztZQUNULE9BQU87WUFDUCxhQUFhO1lBQ2IsYUFBYTtZQUNiLGNBQWM7WUFDZCxXQUFXO1lBQ1gsNkJBQTZCO1lBQzdCLFlBQVk7WUFDWixzQkFBc0I7WUFDdEIsZUFBZTtZQUNmLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIscUJBQXFCO1lBQ3JCLCtCQUErQjtTQUNoQyxDQUFDLENBQUM7UUFFSCxJQUFJLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsSUFBSSwwQkFBMEIsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBRTdGLElBQUksMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNwRyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEUsTUFBTSxJQUFJLGtDQUF1QixDQUMvQixrREFBa0QsMEJBQTBCLENBQUMsVUFBVSxFQUFFLENBQzFGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELDZCQUE2QixDQUFDLHFCQUE0QztRQUN4RSxJQUFJLHFCQUFxQixDQUFDLEtBQUssS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JELE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyx1Q0FBdUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMxRyxDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUUsTUFBTSxJQUFJLGtDQUF1QixDQUFDLHVDQUF1QyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hELE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQywwQ0FBMEMscUJBQXFCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsT0FBZTtRQUM1QixPQUFPLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELGtCQUFrQjtJQUNsQix1QkFBdUIsQ0FBQyxPQUFlO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLHNCQUFzQixDQUFDLE9BQWU7UUFDcEMsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLE1BQVk7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBQSxzQkFBUyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxJQUFJLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxzREFBc0QsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUcsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25FLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxxREFBcUQsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUcsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFNRCxzQkEwTUM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBRTFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVwb2NoaW5ndHgsIGJ0Y3N0YWtpbmd0eCwgaW5jZW50aXZldHggfSBmcm9tICdAYmFieWxvbmxhYnMtaW8vYmFieWxvbi1wcm90by10cyc7XG5pbXBvcnQgeyBEZWNvZGVkVHhSYXcgfSBmcm9tICdAY29zbWpzL3Byb3RvLXNpZ25pbmcnO1xuaW1wb3J0IHsgQ29pbiB9IGZyb20gJ0Bjb3NtanMvc3RhcmdhdGUnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgQW55IH0gZnJvbSAnY29zbWpzLXR5cGVzL2dvb2dsZS9wcm90b2J1Zi9hbnknO1xuaW1wb3J0IHtcbiAgQmFieWxvblNwZWNpZmljTWVzc2FnZUtpbmQsXG4gIEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzLFxuICBDcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZSxcbiAgV2l0aGRyYXdSZXdhcmRNZXNzYWdlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IENvc21vc1V0aWxzLCBNZXNzYWdlRGF0YSB9IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1jb3Ntb3MnO1xuaW1wb3J0IHsgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgVXRpbHMgZXh0ZW5kcyBDb3Ntb3NVdGlsczxCYWJ5bG9uU3BlY2lmaWNNZXNzYWdlcz4ge1xuICBwdWJsaWMgYmFieWxvbk1lc3NhZ2VLaW5kVG9UeXBlVXJsOiBSZWNvcmQ8QmFieWxvblNwZWNpZmljTWVzc2FnZUtpbmQsIHN0cmluZz4gPSB7XG4gICAgQ3JlYXRlQnRjRGVsZWdhdGlvbjogY29uc3RhbnRzLmNyZWF0ZUJUQ0RlbGVnYXRpb25Nc2dUeXBlVXJsLFxuICAgIFdpdGhkcmF3UmV3YXJkOiBjb25zdGFudHMud2l0aGRyYXdSZXdhcmRNc2dUeXBlVXJsLFxuICB9O1xuICBwdWJsaWMgYmFieWxvbk1lc3NhZ2VUeXBlVXJsVG9LaW5kID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuYmFieWxvbk1lc3NhZ2VLaW5kVG9UeXBlVXJsKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW3ZhbHVlLCBrZXldKVxuICApIGFzIFJlY29yZDxzdHJpbmcsIEJhYnlsb25TcGVjaWZpY01lc3NhZ2VLaW5kPjtcblxuICBwcm90ZWN0ZWQgd3JhcHBlZE1zZ1R5cGVVcmxzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICBjb25zdGFudHMud3JhcHBlZERlbGVnYXRlTXNnVHlwZVVybCxcbiAgICBjb25zdGFudHMud3JhcHBlZFVuZGVsZWdhdGVNc2dUeXBlVXJsLFxuICAgIGNvbnN0YW50cy53cmFwcGVkQmVnaW5SZWRlbGVnYXRlVHlwZVVybCxcbiAgXSk7XG4gIHByb3RlY3RlZCBjdXN0b21Nc2dUeXBlVXJscyA9IG5ldyBTZXQ8c3RyaW5nPihbY29uc3RhbnRzLmNyZWF0ZUJUQ0RlbGVnYXRpb25Nc2dUeXBlVXJsXSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy53cmFwcGVkRGVsZWdhdGVNc2dUeXBlVXJsLCBlcG9jaGluZ3R4Lk1zZ1dyYXBwZWREZWxlZ2F0ZSk7XG4gICAgdGhpcy5yZWdpc3RyeS5yZWdpc3Rlcihjb25zdGFudHMud3JhcHBlZFVuZGVsZWdhdGVNc2dUeXBlVXJsLCBlcG9jaGluZ3R4Lk1zZ1dyYXBwZWRVbmRlbGVnYXRlKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy53cmFwcGVkQmVnaW5SZWRlbGVnYXRlVHlwZVVybCwgZXBvY2hpbmd0eC5Nc2dXcmFwcGVkQmVnaW5SZWRlbGVnYXRlKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy5jcmVhdGVCVENEZWxlZ2F0aW9uTXNnVHlwZVVybCwgYnRjc3Rha2luZ3R4Lk1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24pO1xuICAgIHRoaXMucmVnaXN0cnkucmVnaXN0ZXIoY29uc3RhbnRzLndpdGhkcmF3UmV3YXJkTXNnVHlwZVVybCwgaW5jZW50aXZldHguTXNnV2l0aGRyYXdSZXdhcmQpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldERlbGVnYXRlT3JVbmRlbGVnYXRlTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGE8QmFieWxvblNwZWNpZmljTWVzc2FnZXM+W10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSkubXNnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGRlbGVnYXRvckFkZHJlc3M6IHZhbHVlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogdmFsdWUudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0UmVkZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhPEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzPltdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpLm1zZztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBkZWxlZ2F0b3JBZGRyZXNzOiB2YWx1ZS5kZWxlZ2F0b3JBZGRyZXNzLFxuICAgICAgICAgIHZhbGlkYXRvclNyY0FkZHJlc3M6IHZhbHVlLnZhbGlkYXRvclNyY0FkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yRHN0QWRkcmVzczogdmFsdWUudmFsaWRhdG9yRHN0QWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0Q3VzdG9tTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGE8QmFieWxvblNwZWNpZmljTWVzc2FnZXM+W10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgX2tpbmQ6IHRoaXMuYmFieWxvbk1lc3NhZ2VUeXBlVXJsVG9LaW5kW21lc3NhZ2UudHlwZVVybF0sXG4gICAgICAgICAgLi4udmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFRyYW5zYWN0aW9uVHlwZUZyb21UeXBlVXJsKHR5cGVVcmw6IHN0cmluZyk6IFRyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh0eXBlVXJsKSB7XG4gICAgICBjYXNlIGNvbnN0YW50cy53cmFwcGVkRGVsZWdhdGVNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTtcbiAgICAgIGNhc2UgY29uc3RhbnRzLndyYXBwZWRVbmRlbGVnYXRlTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTtcbiAgICAgIGNhc2UgY29uc3RhbnRzLndyYXBwZWRCZWdpblJlZGVsZWdhdGVUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdSZWRlbGVnYXRlO1xuICAgICAgY2FzZSBjb25zdGFudHMuY3JlYXRlQlRDRGVsZWdhdGlvbk1zZ1R5cGVVcmw6XG4gICAgICBjYXNlIGNvbnN0YW50cy53aXRoZHJhd1Jld2FyZE1zZ1R5cGVVcmw6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwodHlwZVVybCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldFNlbmRNZXNzYWdlc0ZvckVuY29kaW5nVHgoXG4gICAgY29zbW9zTGlrZVRyYW5zYWN0aW9uOiBQYXJhbWV0ZXJzPENvc21vc1V0aWxzPEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzPlsnZ2V0U2VuZE1lc3NhZ2VzRm9yRW5jb2RpbmdUeCddPlswXVxuICApOiBBbnlbXSB7XG4gICAgcmV0dXJuIGNvc21vc0xpa2VUcmFuc2FjdGlvbi5zZW5kTWVzc2FnZXMubWFwKCh7IHR5cGVVcmwsIHZhbHVlIH0pID0+IHtcbiAgICAgIGxldCB2YWx1ZVRvRW5jb2RlOiB1bmtub3duID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy53cmFwcGVkTXNnVHlwZVVybHMuaGFzKHR5cGVVcmwpKSB7XG4gICAgICAgIHZhbHVlVG9FbmNvZGUgPSB7IG1zZzogdmFsdWUgfTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXN0b21Nc2dUeXBlVXJscy5oYXModHlwZVVybCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCB7IF9raW5kLCAuLi5yZXN0IH0gPSB2YWx1ZSBhcyBCYWJ5bG9uU3BlY2lmaWNNZXNzYWdlcztcbiAgICAgICAgdmFsdWVUb0VuY29kZSA9IHJlc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0eXBlVXJsLCB2YWx1ZTogdmFsdWVUb0VuY29kZSB9O1xuICAgIH0pIGFzIHVua25vd24gYXMgQW55W107XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVDdXN0b21NZXNzYWdlKGN1c3RvbU1lc3NhZ2U6IEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzKTogdm9pZCB7XG4gICAgc3dpdGNoIChjdXN0b21NZXNzYWdlLl9raW5kKSB7XG4gICAgICBjYXNlICdDcmVhdGVCdGNEZWxlZ2F0aW9uJzpcbiAgICAgICAgdGhpcy52YWxpZGF0ZUNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlKGN1c3RvbU1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dpdGhkcmF3UmV3YXJkJzpcbiAgICAgICAgdGhpcy52YWxpZGF0ZVdpdGhkcmF3UmV3YXJkTWVzc2FnZShjdXN0b21NZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYFVuc3VwcG9ydGVkIEJhYnlsb25TcGVjaWZpY01lc3NhZ2VzIG1lc3NhZ2VgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlOiBDcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZSk6IHZvaWQge1xuICAgIGlmIChjcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZS5fa2luZCAhPT0gJ0NyZWF0ZUJ0Y0RlbGVnYXRpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgQ3JlYXRlQnRjRGVsZWdhdGlvbk1lc3NhZ2Uga2luZDogJHtjcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZS5fa2luZH1gKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBjaGVjayB0aGUgb3RoZXIgZmllbGRzIG1vcmUgdGhvcm91Z2hseVxuICAgIHRoaXMuaXNPYmpQcm9wZXJ0eU51bGwoY3JlYXRlQnRjRGVsZWdhdGlvbk1lc3NhZ2UsIFtcbiAgICAgICdzdGFrZXJBZGRyJyxcbiAgICAgIC8vICdwb3AnLFxuICAgICAgJ2J0Y1BrJyxcbiAgICAgICdmcEJ0Y1BrTGlzdCcsXG4gICAgICAnc3Rha2luZ1RpbWUnLFxuICAgICAgJ3N0YWtpbmdWYWx1ZScsXG4gICAgICAnc3Rha2luZ1R4JyxcbiAgICAgIC8vICdzdGFraW5nVHhJbmNsdXNpb25Qcm9vZicsXG4gICAgICAnc2xhc2hpbmdUeCcsXG4gICAgICAnZGVsZWdhdG9yU2xhc2hpbmdTaWcnLFxuICAgICAgJ3VuYm9uZGluZ1RpbWUnLFxuICAgICAgJ3VuYm9uZGluZ1R4JyxcbiAgICAgICd1bmJvbmRpbmdWYWx1ZScsXG4gICAgICAndW5ib25kaW5nU2xhc2hpbmdUeCcsXG4gICAgICAnZGVsZWdhdG9yVW5ib25kaW5nU2xhc2hpbmdTaWcnLFxuICAgIF0pO1xuXG4gICAgaWYgKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnBvcCkge1xuICAgICAgdGhpcy5pc09ialByb3BlcnR5TnVsbChjcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZS5wb3AsIFsnYnRjU2lnVHlwZScsICdidGNTaWcnXSk7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtpbmdUeEluY2x1c2lvblByb29mKSB7XG4gICAgICB0aGlzLmlzT2JqUHJvcGVydHlOdWxsKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtpbmdUeEluY2x1c2lvblByb29mLCBbJ2tleScsICdwcm9vZiddKTtcblxuICAgICAgaWYgKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtpbmdUeEluY2x1c2lvblByb29mLmtleSkge1xuICAgICAgICB0aGlzLmlzT2JqUHJvcGVydHlOdWxsKGNyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtpbmdUeEluY2x1c2lvblByb29mLmtleSwgWydpbmRleCcsICdoYXNoJ10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhjcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZS5zdGFrZXJBZGRyKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBDcmVhdGVCdGNEZWxlZ2F0aW9uTWVzc2FnZSBzdGFrZXJBZGRyOiAke2NyZWF0ZUJ0Y0RlbGVnYXRpb25NZXNzYWdlLnN0YWtlckFkZHJ9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVdpdGhkcmF3UmV3YXJkTWVzc2FnZSh3aXRoZHJhd1Jld2FyZE1lc3NhZ2U6IFdpdGhkcmF3UmV3YXJkTWVzc2FnZSk6IHZvaWQge1xuICAgIGlmICh3aXRoZHJhd1Jld2FyZE1lc3NhZ2UuX2tpbmQgIT09ICdXaXRoZHJhd1Jld2FyZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBXaXRoZHJhd1Jld2FyZE1lc3NhZ2Uga2luZDogJHt3aXRoZHJhd1Jld2FyZE1lc3NhZ2UuX2tpbmR9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc09ialByb3BlcnR5TnVsbCh3aXRoZHJhd1Jld2FyZE1lc3NhZ2UsIFsndHlwZScsICdhZGRyZXNzJ10pO1xuXG4gICAgaWYgKCFbJ2ZpbmFsaXR5X3Byb3ZpZGVyJywgJ2J0Y19zdGFrZXInXS5pbmNsdWRlcyh3aXRoZHJhd1Jld2FyZE1lc3NhZ2UudHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBXaXRoZHJhd1Jld2FyZE1lc3NhZ2UgdHlwZTogJHt3aXRoZHJhd1Jld2FyZE1lc3NhZ2UudHlwZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3Mod2l0aGRyYXdSZXdhcmRNZXNzYWdlLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgV2l0aGRyYXdSZXdhcmRNZXNzYWdlIGFkZHJlc3M6ICR7d2l0aGRyYXdSZXdhcmRNZXNzYWdlLmFkZHJlc3N9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRDb3Ntb3NMaWtlQWRkcmVzc1dpdGhNZW1vSWQoYWRkcmVzcywgY29uc3RhbnRzLmFjY291bnRBZGRyZXNzUmVnZXgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRCZWNoMzJBZGRyZXNzTWF0Y2hpbmdSZWdleChhZGRyZXNzLCBjb25zdGFudHMudmFsaWRhdG9yQWRkcmVzc1JlZ2V4KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQ29udHJhY3RBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRCZWNoMzJBZGRyZXNzTWF0Y2hpbmdSZWdleChhZGRyZXNzLCBjb25zdGFudHMuY29udHJhY3RBZGRyZXNzUmVnZXgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlQW1vdW50KGFtb3VudDogQ29pbik6IHZvaWQge1xuICAgIGNvbnN0IGFtb3VudEJpZyA9IEJpZ051bWJlcihhbW91bnQuYW1vdW50KTtcbiAgICBpZiAoYW1vdW50QmlnLmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcigndHJhbnNhY3Rpb25CdWlsZGVyOiB2YWxpZGF0ZUFtb3VudDogSW52YWxpZCBhbW91bnQ6ICcgKyBhbW91bnQuYW1vdW50KTtcbiAgICB9XG4gICAgaWYgKCFjb25zdGFudHMudmFsaWREZW5vbXMuZmluZCgoZGVub20pID0+IGRlbm9tID09PSBhbW91bnQuZGVub20pKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ3RyYW5zYWN0aW9uQnVpbGRlcjogdmFsaWRhdGVBbW91bnQ6IEludmFsaWQgZGVub206ICcgKyBhbW91bnQuZGVub20pO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==

Выполнить команду


Для локальной разработки. Не используйте в интернете!