PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-core/dist/src/account-lib/baseCoin

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseTransactionBuilder = void 0;
const errors_1 = require("./errors");
/**
 * Generic transaction builder to be extended with coin specific logic.
 * Provide a set of default steps (i.e. from, sign, build) and enforces mandatory validations.
 */
class BaseTransactionBuilder {
    /**
     * Base constructor.
     *
     * @param _coinConfig BaseCoin from statics library
     */
    constructor(_coinConfig) {
        this._coinConfig = _coinConfig;
    }
    /**
     * Parse a transaction based on existing data. The input format is determined by the coin
     * extending this class. Some examples are hex, base64, or JSON.
     *
     * @param rawTransaction A raw transaction to be parsed
     * @param isFirstSigner Whether the transaction is being signed by the first signer
     */
    from(rawTransaction, isFirstSigner) {
        this.validateRawTransaction(rawTransaction);
        this.transaction = this.fromImplementation(rawTransaction, isFirstSigner);
    }
    /**
     * Validate keys and sign the transaction.
     *
     * @param key One of the keys associated with this transaction
     */
    sign(key) {
        this.validateKey(key);
        if (!this.transaction.canSign(key)) {
            throw new errors_1.SigningError('Private key cannot sign the transaction');
        }
        this.transaction = this.signImplementation(key);
    }
    /**
     * Adds a signature to the transaction.
     *
     * @param publicKey public key that produced the signature
     * @param signature raw signature as a hex encoded Buffer
     */
    addSignature(publicKey, signature) {
        throw new errors_1.SigningError(`${this.coinName()} does not support adding signatures directly.`);
    }
    /**
     * Finalize the transaction by performing any extra step like calculating hashes, verifying
     * integrity, or adding default values.
     *
     * @returns valid coin specific transaction (signed or unsigned)
     */
    async build() {
        this.validateTransaction(this.transaction);
        return this.buildImplementation();
    }
    /**
     * Get the underlying coin full name as specified in the statics library.
     */
    displayName() {
        return this._coinConfig.fullName;
    }
    /**
     * Get the underlying coin full name as specified in the statics library.
     */
    coinName() {
        return this._coinConfig.name;
    }
    /**
     * Verified validity windows params if them exist and return a valid validity windows.
     * Unit param must be specified
     * If params are not consistent, default params will be return based on firstValid and minDuration
     * @param {ValidityWindow} params validity windows parameters to validate.
     * @param {String} params.unit Parameter that could be 'blockheight' or 'timestamp'
     * @param {Number} [params.minDuration] Optional - Minimum duration of the window
     * @param {Number} [params.maxDuration] Optional - Maximum duration of the window
     * @param {Number} [params.firstValid] Optional - First valid value
     * @param {Number} [params.lastValid] Optional - Last valid value
     * @returns {ValidityWindow} verified validity windows or default values
     */
    getValidityWindow(params) {
        if (!params.unit || (params.unit !== 'timestamp' && params.unit !== 'blockheight')) {
            throw new Error('Unit parameter must be specified as blockheight or timestamp');
        }
        const unit = params.unit;
        let defaultMinDuration;
        let defaultMaxDuration;
        let defaultFirstValid;
        let defaultLastValid;
        /* Set Default Params
          minimum duration is set as 1 hr (3600000 msec) if unit is timestamp or 20 blocks if it is blockheight
          maximum duration is set as 1 year (31536000000 msec) if unit is timestamp or 1000000 blocks if it is blockheight.
         */
        if (unit === 'timestamp') {
            defaultMinDuration = 0;
            defaultMaxDuration = 31536000000;
            defaultFirstValid = Date.now();
            defaultLastValid = defaultFirstValid + defaultMaxDuration;
        }
        else {
            defaultMinDuration = 0;
            defaultMaxDuration = 1000000;
            defaultFirstValid = 0;
            defaultLastValid = defaultFirstValid + defaultMaxDuration;
        }
        // If any params exist, they will be used, otherwise it will be used default params.
        let firstValid = params.firstValid || defaultFirstValid;
        let lastValid = params.lastValid || defaultLastValid;
        let minDuration = params.minDuration || defaultMinDuration;
        let maxDuration = params.maxDuration || defaultMaxDuration;
        /* Validate Params:
          minDuration < maxDuration
          firstValid < lastValid
          firstValid + minDuration <= lastValid <= firstValid + maxDuration
         */
        if (minDuration >= maxDuration) {
            throw new Error(`Expected maxDuration (${maxDuration}) to be grather than minDuration (${minDuration})`);
        }
        firstValid = firstValid >= 0 ? firstValid : defaultFirstValid;
        minDuration = minDuration >= 0 ? minDuration : defaultMinDuration;
        maxDuration = maxDuration > minDuration ? maxDuration : defaultMaxDuration;
        lastValid =
            lastValid >= firstValid + minDuration && lastValid <= firstValid + maxDuration
                ? lastValid
                : firstValid + maxDuration;
        return {
            firstValid,
            lastValid,
            minDuration,
            maxDuration,
            unit,
        };
    }
}
exports.BaseTransactionBuilder = BaseTransactionBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZVRyYW5zYWN0aW9uQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hY2NvdW50LWxpYi9iYXNlQ29pbi9iYXNlVHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFDQUF3QztBQUV4Qzs7O0dBR0c7QUFDSCxNQUFzQixzQkFBc0I7SUFFMUM7Ozs7T0FJRztJQUNILFlBQXNCLFdBQWlDO1FBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLENBQUMsY0FBbUIsRUFBRSxhQUF1QjtRQUMvQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFVRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLEdBQVk7UUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxxQkFBWSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFlBQVksQ0FBQyxTQUFvQixFQUFFLFNBQWlCO1FBQ2xELE1BQU0sSUFBSSxxQkFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFVRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUErQ0Q7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxpQkFBaUIsQ0FBQyxNQUFzQjtRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNuRixNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxrQkFBMEIsQ0FBQztRQUMvQixJQUFJLGtCQUEwQixDQUFDO1FBQy9CLElBQUksaUJBQXlCLENBQUM7UUFDOUIsSUFBSSxnQkFBd0IsQ0FBQztRQUU3Qjs7O1dBR0c7UUFDSCxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN6QixrQkFBa0IsR0FBRyxDQUFDLENBQUM7WUFDdkIsa0JBQWtCLEdBQUcsV0FBVyxDQUFDO1lBQ2pDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMvQixnQkFBZ0IsR0FBRyxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQztRQUM1RCxDQUFDO2FBQU0sQ0FBQztZQUNOLGtCQUFrQixHQUFHLENBQUMsQ0FBQztZQUN2QixrQkFBa0IsR0FBRyxPQUFPLENBQUM7WUFDN0IsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLGdCQUFnQixHQUFHLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDO1FBQzVELENBQUM7UUFFRCxvRkFBb0Y7UUFDcEYsSUFBSSxVQUFVLEdBQVcsTUFBTSxDQUFDLFVBQVUsSUFBSSxpQkFBaUIsQ0FBQztRQUNoRSxJQUFJLFNBQVMsR0FBVyxNQUFNLENBQUMsU0FBUyxJQUFJLGdCQUFnQixDQUFDO1FBQzdELElBQUksV0FBVyxHQUFXLE1BQU0sQ0FBQyxXQUFXLElBQUksa0JBQWtCLENBQUM7UUFDbkUsSUFBSSxXQUFXLEdBQVcsTUFBTSxDQUFDLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQztRQUVuRTs7OztXQUlHO1FBQ0gsSUFBSSxXQUFXLElBQUksV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsV0FBVyxxQ0FBcUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBQ0QsVUFBVSxHQUFHLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7UUFDOUQsV0FBVyxHQUFHLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFDbEUsV0FBVyxHQUFHLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFDM0UsU0FBUztZQUNQLFNBQVMsSUFBSSxVQUFVLEdBQUcsV0FBVyxJQUFJLFNBQVMsSUFBSSxVQUFVLEdBQUcsV0FBVztnQkFDNUUsQ0FBQyxDQUFDLFNBQVM7Z0JBQ1gsQ0FBQyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFFL0IsT0FBTztZQUNMLFVBQVU7WUFDVixTQUFTO1lBQ1QsV0FBVztZQUNYLFdBQVc7WUFDWCxJQUFJO1NBQ0wsQ0FBQztJQUNKLENBQUM7Q0FXRjtBQW5ORCx3REFtTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQmFzZUFkZHJlc3MsIEJhc2VLZXksIFB1YmxpY0tleSwgVmFsaWRpdHlXaW5kb3cgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbiB9IGZyb20gJy4vYmFzZVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFNpZ25pbmdFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBHZW5lcmljIHRyYW5zYWN0aW9uIGJ1aWxkZXIgdG8gYmUgZXh0ZW5kZWQgd2l0aCBjb2luIHNwZWNpZmljIGxvZ2ljLlxuICogUHJvdmlkZSBhIHNldCBvZiBkZWZhdWx0IHN0ZXBzIChpLmUuIGZyb20sIHNpZ24sIGJ1aWxkKSBhbmQgZW5mb3JjZXMgbWFuZGF0b3J5IHZhbGlkYXRpb25zLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz47XG4gIC8qKlxuICAgKiBCYXNlIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gX2NvaW5Db25maWcgQmFzZUNvaW4gZnJvbSBzdGF0aWNzIGxpYnJhcnlcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICB0aGlzLl9jb2luQ29uZmlnID0gX2NvaW5Db25maWc7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSB0cmFuc2FjdGlvbiBiYXNlZCBvbiBleGlzdGluZyBkYXRhLiBUaGUgaW5wdXQgZm9ybWF0IGlzIGRldGVybWluZWQgYnkgdGhlIGNvaW5cbiAgICogZXh0ZW5kaW5nIHRoaXMgY2xhc3MuIFNvbWUgZXhhbXBsZXMgYXJlIGhleCwgYmFzZTY0LCBvciBKU09OLlxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb24gQSByYXcgdHJhbnNhY3Rpb24gdG8gYmUgcGFyc2VkXG4gICAqIEBwYXJhbSBpc0ZpcnN0U2lnbmVyIFdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHNpZ25lZCBieSB0aGUgZmlyc3Qgc2lnbmVyXG4gICAqL1xuICBmcm9tKHJhd1RyYW5zYWN0aW9uOiBhbnksIGlzRmlyc3RTaWduZXI/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gdGhpcy5mcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb24sIGlzRmlyc3RTaWduZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIGZyb219LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBmcm9tfVxuICAgKiBAcmV0dXJucyB0aGUgcGFyc2VkIGNvaW4gc3BlY2lmaWMgdHJhbnNhY3Rpb24gb2JqZWN0XG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBhbnksIGlzRmlyc3RTaWduZXI/OiBib29sZWFuKTogQmFzZVRyYW5zYWN0aW9uO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBrZXlzIGFuZCBzaWduIHRoZSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSBPbmUgb2YgdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb25cbiAgICovXG4gIHNpZ24oa2V5OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUtleShrZXkpO1xuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5jYW5TaWduKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ1ByaXZhdGUga2V5IGNhbm5vdCBzaWduIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0aGlzLnNpZ25JbXBsZW1lbnRhdGlvbihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzaWduYXR1cmUgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcHVibGljS2V5IHB1YmxpYyBrZXkgdGhhdCBwcm9kdWNlZCB0aGUgc2lnbmF0dXJlXG4gICAqIEBwYXJhbSBzaWduYXR1cmUgcmF3IHNpZ25hdHVyZSBhcyBhIGhleCBlbmNvZGVkIEJ1ZmZlclxuICAgKi9cbiAgYWRkU2lnbmF0dXJlKHB1YmxpY0tleTogUHVibGljS2V5LCBzaWduYXR1cmU6IEJ1ZmZlcik6IHZvaWQge1xuICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoYCR7dGhpcy5jb2luTmFtZSgpfSBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBzaWduYXR1cmVzIGRpcmVjdGx5LmApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIHNpZ259LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBzaWdufVxuICAgKiBAcmV0dXJucyBjb2luIHNwZWNpZmljIHRyYW5zYWN0aW9uIHdpdGggc2lnbmF0dXJlIGRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaWduSW1wbGVtZW50YXRpb24oa2V5OiBCYXNlS2V5KTogQmFzZVRyYW5zYWN0aW9uO1xuXG4gIC8qKlxuICAgKiBGaW5hbGl6ZSB0aGUgdHJhbnNhY3Rpb24gYnkgcGVyZm9ybWluZyBhbnkgZXh0cmEgc3RlcCBsaWtlIGNhbGN1bGF0aW5nIGhhc2hlcywgdmVyaWZ5aW5nXG4gICAqIGludGVncml0eSwgb3IgYWRkaW5nIGRlZmF1bHQgdmFsdWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB2YWxpZCBjb2luIHNwZWNpZmljIHRyYW5zYWN0aW9uIChzaWduZWQgb3IgdW5zaWduZWQpXG4gICAqL1xuICBhc3luYyBidWlsZCgpOiBQcm9taXNlPEJhc2VUcmFuc2FjdGlvbj4ge1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbih0aGlzLnRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29pbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgYnVpbGR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBidWlsZH1cbiAgICogQHJldHVybnMgdmFsaWQgY29pbiBzcGVjaWZpYyB0cmFuc2FjdGlvbiAoc2lnbmVkIG9yIHVuc2lnbmVkKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgcHJpdmF0ZSBrZXkgaXMgcHJlc2VudCBhbmQgaXMgdmFsaWQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VLZXl9IGtleSBQcml2YXRlIGtleSB0byB2YWxpZGF0ZVxuICAgKi9cbiAgYWJzdHJhY3QgdmFsaWRhdGVLZXkoa2V5OiBCYXNlS2V5KTogdm9pZDtcblxuICAvKipcbiAgICogQ2hlY2sgdGhlIGFkZHJlc3MgcHJvdmlkZWQgaXMgdmFsaWQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIGRhdGEgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEBwYXJhbSBhZGRyZXNzRm9ybWF0IFRoZSBmb3JtYXQgdGhlIGFkZHJlc3Mgc2hvdWxkIGJlIGluIGlmIG1vcmUgdGhhbiBvbmUgaXMgc3VwcG9ydGVkXG4gICAqL1xuICBhYnN0cmFjdCB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogQmFzZUFkZHJlc3MsIGFkZHJlc3NGb3JtYXQ/OiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgYW1vdW50IHByb3ZpZGVkIGlzIHZhbGlkIGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQsIHRocm93IG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHtCaWdOdW1iZXJ9IHZhbHVlIFRyYW5zYWN0aW9uIGFtb3VudFxuICAgKi9cbiAgYWJzdHJhY3QgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQmlnTnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gaW4gYW55IGZvcm1hdFxuICAgKi9cbiAgYWJzdHJhY3QgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogYW55KTogdm9pZDtcblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIG1hbmRhdG9yeSBmaWVsZHMgcGVyIHRyYW5zYWN0aW9uIHR5cGUgYW5kIGVuc3VyZXMgaXQgaXMgdmFsaWQsIHRocm93XG4gICAqIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHtCYXNlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqL1xuICBhYnN0cmFjdCB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uPzogQmFzZVRyYW5zYWN0aW9uKTogdm9pZDtcblxuICAvKipcbiAgICogR2V0IHRoZSB1bmRlcmx5aW5nIGNvaW4gZnVsbCBuYW1lIGFzIHNwZWNpZmllZCBpbiB0aGUgc3RhdGljcyBsaWJyYXJ5LlxuICAgKi9cbiAgZGlzcGxheU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29pbkNvbmZpZy5mdWxsTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgY29pbiBmdWxsIG5hbWUgYXMgc3BlY2lmaWVkIGluIHRoZSBzdGF0aWNzIGxpYnJhcnkuXG4gICAqL1xuICBjb2luTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb2luQ29uZmlnLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZWQgdmFsaWRpdHkgd2luZG93cyBwYXJhbXMgaWYgdGhlbSBleGlzdCBhbmQgcmV0dXJuIGEgdmFsaWQgdmFsaWRpdHkgd2luZG93cy5cbiAgICogVW5pdCBwYXJhbSBtdXN0IGJlIHNwZWNpZmllZFxuICAgKiBJZiBwYXJhbXMgYXJlIG5vdCBjb25zaXN0ZW50LCBkZWZhdWx0IHBhcmFtcyB3aWxsIGJlIHJldHVybiBiYXNlZCBvbiBmaXJzdFZhbGlkIGFuZCBtaW5EdXJhdGlvblxuICAgKiBAcGFyYW0ge1ZhbGlkaXR5V2luZG93fSBwYXJhbXMgdmFsaWRpdHkgd2luZG93cyBwYXJhbWV0ZXJzIHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnVuaXQgUGFyYW1ldGVyIHRoYXQgY291bGQgYmUgJ2Jsb2NraGVpZ2h0JyBvciAndGltZXN0YW1wJ1xuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5taW5EdXJhdGlvbl0gT3B0aW9uYWwgLSBNaW5pbXVtIGR1cmF0aW9uIG9mIHRoZSB3aW5kb3dcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtwYXJhbXMubWF4RHVyYXRpb25dIE9wdGlvbmFsIC0gTWF4aW11bSBkdXJhdGlvbiBvZiB0aGUgd2luZG93XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLmZpcnN0VmFsaWRdIE9wdGlvbmFsIC0gRmlyc3QgdmFsaWQgdmFsdWVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtwYXJhbXMubGFzdFZhbGlkXSBPcHRpb25hbCAtIExhc3QgdmFsaWQgdmFsdWVcbiAgICogQHJldHVybnMge1ZhbGlkaXR5V2luZG93fSB2ZXJpZmllZCB2YWxpZGl0eSB3aW5kb3dzIG9yIGRlZmF1bHQgdmFsdWVzXG4gICAqL1xuICBnZXRWYWxpZGl0eVdpbmRvdyhwYXJhbXM6IFZhbGlkaXR5V2luZG93KTogVmFsaWRpdHlXaW5kb3cge1xuICAgIGlmICghcGFyYW1zLnVuaXQgfHwgKHBhcmFtcy51bml0ICE9PSAndGltZXN0YW1wJyAmJiBwYXJhbXMudW5pdCAhPT0gJ2Jsb2NraGVpZ2h0JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5pdCBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYmxvY2toZWlnaHQgb3IgdGltZXN0YW1wJyk7XG4gICAgfVxuICAgIGNvbnN0IHVuaXQgPSBwYXJhbXMudW5pdDtcbiAgICBsZXQgZGVmYXVsdE1pbkR1cmF0aW9uOiBudW1iZXI7XG4gICAgbGV0IGRlZmF1bHRNYXhEdXJhdGlvbjogbnVtYmVyO1xuICAgIGxldCBkZWZhdWx0Rmlyc3RWYWxpZDogbnVtYmVyO1xuICAgIGxldCBkZWZhdWx0TGFzdFZhbGlkOiBudW1iZXI7XG5cbiAgICAvKiBTZXQgRGVmYXVsdCBQYXJhbXNcbiAgICAgIG1pbmltdW0gZHVyYXRpb24gaXMgc2V0IGFzIDEgaHIgKDM2MDAwMDAgbXNlYykgaWYgdW5pdCBpcyB0aW1lc3RhbXAgb3IgMjAgYmxvY2tzIGlmIGl0IGlzIGJsb2NraGVpZ2h0XG4gICAgICBtYXhpbXVtIGR1cmF0aW9uIGlzIHNldCBhcyAxIHllYXIgKDMxNTM2MDAwMDAwIG1zZWMpIGlmIHVuaXQgaXMgdGltZXN0YW1wIG9yIDEwMDAwMDAgYmxvY2tzIGlmIGl0IGlzIGJsb2NraGVpZ2h0LlxuICAgICAqL1xuICAgIGlmICh1bml0ID09PSAndGltZXN0YW1wJykge1xuICAgICAgZGVmYXVsdE1pbkR1cmF0aW9uID0gMDtcbiAgICAgIGRlZmF1bHRNYXhEdXJhdGlvbiA9IDMxNTM2MDAwMDAwO1xuICAgICAgZGVmYXVsdEZpcnN0VmFsaWQgPSBEYXRlLm5vdygpO1xuICAgICAgZGVmYXVsdExhc3RWYWxpZCA9IGRlZmF1bHRGaXJzdFZhbGlkICsgZGVmYXVsdE1heER1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWZhdWx0TWluRHVyYXRpb24gPSAwO1xuICAgICAgZGVmYXVsdE1heER1cmF0aW9uID0gMTAwMDAwMDtcbiAgICAgIGRlZmF1bHRGaXJzdFZhbGlkID0gMDtcbiAgICAgIGRlZmF1bHRMYXN0VmFsaWQgPSBkZWZhdWx0Rmlyc3RWYWxpZCArIGRlZmF1bHRNYXhEdXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGFyYW1zIGV4aXN0LCB0aGV5IHdpbGwgYmUgdXNlZCwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdXNlZCBkZWZhdWx0IHBhcmFtcy5cbiAgICBsZXQgZmlyc3RWYWxpZDogbnVtYmVyID0gcGFyYW1zLmZpcnN0VmFsaWQgfHwgZGVmYXVsdEZpcnN0VmFsaWQ7XG4gICAgbGV0IGxhc3RWYWxpZDogbnVtYmVyID0gcGFyYW1zLmxhc3RWYWxpZCB8fCBkZWZhdWx0TGFzdFZhbGlkO1xuICAgIGxldCBtaW5EdXJhdGlvbjogbnVtYmVyID0gcGFyYW1zLm1pbkR1cmF0aW9uIHx8IGRlZmF1bHRNaW5EdXJhdGlvbjtcbiAgICBsZXQgbWF4RHVyYXRpb246IG51bWJlciA9IHBhcmFtcy5tYXhEdXJhdGlvbiB8fCBkZWZhdWx0TWF4RHVyYXRpb247XG5cbiAgICAvKiBWYWxpZGF0ZSBQYXJhbXM6XG4gICAgICBtaW5EdXJhdGlvbiA8IG1heER1cmF0aW9uXG4gICAgICBmaXJzdFZhbGlkIDwgbGFzdFZhbGlkXG4gICAgICBmaXJzdFZhbGlkICsgbWluRHVyYXRpb24gPD0gbGFzdFZhbGlkIDw9IGZpcnN0VmFsaWQgKyBtYXhEdXJhdGlvblxuICAgICAqL1xuICAgIGlmIChtaW5EdXJhdGlvbiA+PSBtYXhEdXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBtYXhEdXJhdGlvbiAoJHttYXhEdXJhdGlvbn0pIHRvIGJlIGdyYXRoZXIgdGhhbiBtaW5EdXJhdGlvbiAoJHttaW5EdXJhdGlvbn0pYCk7XG4gICAgfVxuICAgIGZpcnN0VmFsaWQgPSBmaXJzdFZhbGlkID49IDAgPyBmaXJzdFZhbGlkIDogZGVmYXVsdEZpcnN0VmFsaWQ7XG4gICAgbWluRHVyYXRpb24gPSBtaW5EdXJhdGlvbiA+PSAwID8gbWluRHVyYXRpb24gOiBkZWZhdWx0TWluRHVyYXRpb247XG4gICAgbWF4RHVyYXRpb24gPSBtYXhEdXJhdGlvbiA+IG1pbkR1cmF0aW9uID8gbWF4RHVyYXRpb24gOiBkZWZhdWx0TWF4RHVyYXRpb247XG4gICAgbGFzdFZhbGlkID1cbiAgICAgIGxhc3RWYWxpZCA+PSBmaXJzdFZhbGlkICsgbWluRHVyYXRpb24gJiYgbGFzdFZhbGlkIDw9IGZpcnN0VmFsaWQgKyBtYXhEdXJhdGlvblxuICAgICAgICA/IGxhc3RWYWxpZFxuICAgICAgICA6IGZpcnN0VmFsaWQgKyBtYXhEdXJhdGlvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBmaXJzdFZhbGlkLFxuICAgICAgbGFzdFZhbGlkLFxuICAgICAgbWluRHVyYXRpb24sXG4gICAgICBtYXhEdXJhdGlvbixcbiAgICAgIHVuaXQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRyYW5zYWN0aW9uIGJlaW5nIGJ1aWx0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvbigpOiBCYXNlVHJhbnNhY3Rpb247XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgYnVpbHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBCYXNlVHJhbnNhY3Rpb24pO1xufVxuIl19

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


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