UNPKG

@decaf-ts/fabric-weaver

Version:
180 lines 21 kB
import { Logging } from "@decaf-ts/logging"; import { FabricBinaries } from "../constants/fabric-binaries"; import { mapParser } from "../../utils/parsers"; import { runCommand } from "../../utils/child-process"; export class ConfigtxgenCommandBuilder { constructor(logger) { this.binName = FabricBinaries.CONFIGTXGEN; this.args = new Map(); if (!logger) this.log = Logging.for(ConfigtxgenCommandBuilder); else this.log = logger.for(ConfigtxgenCommandBuilder.name); } /** * @description Sets the organization for config generation. * @param {string} org - The organization name. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setAsOrg(org) { if (org !== undefined) { this.log.debug(`Setting organization to ${org}`); this.args.set("asOrg", org); } return this; } /** * @description Sets the base profile for channel creation tx generation. * @param {string} profile - The profile name. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setChannelCreateTxBaseProfile(profile) { if (profile !== undefined) { this.log.debug(`Setting channel create tx base profile to ${profile}`); this.args.set("channelCreateTxBaseProfile", profile); } return this; } /** * @description Sets the channel ID for the configtx. * @param {string} channelID - The channel ID. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setChannelID(channelID) { if (channelID !== undefined) { this.log.debug(`Setting channel ID to ${channelID}`); this.args.set("channelID", channelID); } return this; } /** * @description Sets the configuration path. * @param {string} path - The configuration path. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setConfigPath(path) { if (path !== undefined) { this.log.debug(`Setting config path to ${path}`); this.args.set("configPath", path); } return this; } /** * @description Sets the path for block inspection. * @param {string} path - The path to the block. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setInspectBlock(path) { if (path !== undefined) { this.log.debug(`Setting inspect block path to ${path}`); this.args.set("inspectBlock", path); } return this; } /** * @description Sets the path for channel create tx inspection. * @param {string} path - The path to the channel create tx. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setInspectChannelCreateTx(path) { if (path !== undefined) { this.log.debug(`Setting inspect channel create tx path to ${path}`); this.args.set("inspectChannelCreateTx", path); } return this; } /** * @description Sets the output path for anchor peers update. * @param {string} path - The output path. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setOutputAnchorPeersUpdate(path) { if (path !== undefined) { this.log.debug(`Setting output anchor peers update path to ${path}`); this.args.set("outputAnchorPeersUpdate", path); } return this; } /** * @description Sets the output path for the genesis block. * @param {string} path - The output path. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setOutputBlock(path) { if (path !== undefined) { this.log.debug(`Setting output block path to ${path}`); this.args.set("outputBlock", path); } return this; } /** * @description Sets the output path for channel creation configtx. * @param {string} path - The output path. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setOutputCreateChannelTx(path) { if (path !== undefined) { this.log.debug(`Setting output create channel tx path to ${path}`); this.args.set("outputCreateChannelTx", path); } return this; } /** * @description Sets the organization to print. * @param {string} org - The organization name. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setPrintOrg(org) { if (org !== undefined) { this.log.debug(`Setting print org to ${org}`); this.args.set("printOrg", org); } return this; } /** * @description Sets the profile to use for generation. * @param {string} profile - The profile name. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setProfile(profile) { if (profile !== undefined) { this.log.debug(`Setting profile to ${profile}`); this.args.set("profile", profile); } return this; } /** * @description Sets whether to show version information. * @param {boolean} show - Whether to show version information. * @returns {ConfigtxgenCommandBuilder} The current instance for method chaining. */ setVersion(show = false) { this.log.debug(`Setting version flag to ${show}`); this.args.set("version", show); return this; } build() { const command = [this.getBinary(), ...mapParser(this.args)].join(" "); this.log.debug(`Built command: ${command}`); return command; } getBinary() { return this.binName; } getArgs() { return mapParser(this.args); } async execute() { const bin = this.getBinary(); const argz = [...this.getArgs()]; try { // can be used as a promise but to lock the logs running as execsync await runCommand(bin, argz); } catch (error) { this.log.error(`Error: Failed to execute the command: ${error}`); process.exit(1); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndHhnZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmFicmljL2NvbmZpZ3R4Z2VuL2NvbmZpZ3R4Z2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLE9BQU8seUJBQXlCO0lBTXBDLFlBQVksTUFBZTtRQUhuQixZQUFPLEdBQW1CLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFDckQsU0FBSSxHQUFzRCxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRzFFLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7O1lBQzFELElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxHQUFZO1FBQ25CLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDZCQUE2QixDQUFDLE9BQWdCO1FBQzVDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lB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QUFDO0lBQ0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBQ0QsT0FBTztRQUNMLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQztZQUNILG9FQUFvRTtZQUNwRSxNQUFNLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMseUNBQXlDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDakUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBGYWJyaWNCaW5hcmllcyB9IGZyb20gXCIuLi9jb25zdGFudHMvZmFicmljLWJpbmFyaWVzXCI7XG5pbXBvcnQgeyBtYXBQYXJzZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcGFyc2Vyc1wiO1xuaW1wb3J0IHsgcnVuQ29tbWFuZCB9IGZyb20gXCIuLi8uLi91dGlscy9jaGlsZC1wcm9jZXNzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyIHtcbiAgcHJpdmF0ZSBsb2c6IExvZ2dlcjtcblxuICBwcml2YXRlIGJpbk5hbWU6IEZhYnJpY0JpbmFyaWVzID0gRmFicmljQmluYXJpZXMuQ09ORklHVFhHRU47XG4gIHByaXZhdGUgYXJnczogTWFwPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZ1tdPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihsb2dnZXI/OiBMb2dnZXIpIHtcbiAgICBpZiAoIWxvZ2dlcikgdGhpcy5sb2cgPSBMb2dnaW5nLmZvcihDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyKTtcbiAgICBlbHNlIHRoaXMubG9nID0gbG9nZ2VyLmZvcihDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBvcmdhbml6YXRpb24gZm9yIGNvbmZpZyBnZW5lcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3JnIC0gVGhlIG9yZ2FuaXphdGlvbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7Q29uZmlndHhnZW5Db21tYW5kQnVpbGRlcn0gVGhlIGN1cnJlbnQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEFzT3JnKG9yZz86IHN0cmluZyk6IENvbmZpZ3R4Z2VuQ29tbWFuZEJ1aWxkZXIge1xuICAgIGlmIChvcmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgb3JnYW5pemF0aW9uIHRvICR7b3JnfWApO1xuICAgICAgdGhpcy5hcmdzLnNldChcImFzT3JnXCIsIG9yZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBiYXNlIHByb2ZpbGUgZm9yIGNoYW5uZWwgY3JlYXRpb24gdHggZ2VuZXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb2ZpbGUgLSBUaGUgcHJvZmlsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7Q29uZmlndHhnZW5Db21tYW5kQnVpbGRlcn0gVGhlIGN1cnJlbnQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldENoYW5uZWxDcmVhdGVUeEJhc2VQcm9maWxlKHByb2ZpbGU/OiBzdHJpbmcpOiBDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyIHtcbiAgICBpZiAocHJvZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFubmVsIGNyZWF0ZSB0eCBiYXNlIHByb2ZpbGUgdG8gJHtwcm9maWxlfWApO1xuICAgICAgdGhpcy5hcmdzLnNldChcImNoYW5uZWxDcmVhdGVUeEJhc2VQcm9maWxlXCIsIHByb2ZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY2hhbm5lbCBJRCBmb3IgdGhlIGNvbmZpZ3R4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbElEIC0gVGhlIGNoYW5uZWwgSUQuXG4gICAqIEByZXR1cm5zIHtDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyfSBUaGUgY3VycmVudCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0Q2hhbm5lbElEKGNoYW5uZWxJRD86IHN0cmluZyk6IENvbmZpZ3R4Z2VuQ29tbWFuZEJ1aWxkZXIge1xuICAgIGlmIChjaGFubmVsSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY2hhbm5lbCBJRCB0byAke2NoYW5uZWxJRH1gKTtcbiAgICAgIHRoaXMuYXJncy5zZXQoXCJjaGFubmVsSURcIiwgY2hhbm5lbElEKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgY29uZmlndXJhdGlvbiBwYXRoLlxuICAgKiBAcmV0dXJucyB7Q29uZmlndHhnZW5Db21tYW5kQnVpbGRlcn0gVGhlIGN1cnJlbnQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldENvbmZpZ1BhdGgocGF0aD86IHN0cmluZyk6IENvbmZpZ3R4Z2VuQ29tbWFuZEJ1aWxkZXIge1xuICAgIGlmIChwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbmZpZyBwYXRoIHRvICR7cGF0aH1gKTtcbiAgICAgIHRoaXMuYXJncy5zZXQoXCJjb25maWdQYXRoXCIsIHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgcGF0aCBmb3IgYmxvY2sgaW5zcGVjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgYmxvY2suXG4gICAqIEByZXR1cm5zIHtDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyfSBUaGUgY3VycmVudCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5zcGVjdEJsb2NrKHBhdGg/OiBzdHJpbmcpOiBDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyIHtcbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBpbnNwZWN0IGJsb2NrIHBhdGggdG8gJHtwYXRofWApO1xuICAgICAgdGhpcy5hcmdzLnNldChcImluc3BlY3RCbG9ja1wiLCBwYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHBhdGggZm9yIGNoYW5uZWwgY3JlYXRlIHR4IGluc3BlY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGNoYW5uZWwgY3JlYXRlIHR4LlxuICAgKiBAcmV0dXJucyB7Q29uZmlndHhnZW5Db21tYW5kQnVpbGRlcn0gVGhlIGN1cnJlbnQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEluc3BlY3RDaGFubmVsQ3JlYXRlVHgocGF0aD86IHN0cmluZyk6IENvbmZpZ3R4Z2VuQ29tbWFuZEJ1aWxkZXIge1xuICAgIGlmIChwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGluc3BlY3QgY2hhbm5lbCBjcmVhdGUgdHggcGF0aCB0byAke3BhdGh9YCk7XG4gICAgICB0aGlzLmFyZ3Muc2V0KFwiaW5zcGVjdENoYW5uZWxDcmVhdGVUeFwiLCBwYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG91dHB1dCBwYXRoIGZvciBhbmNob3IgcGVlcnMgdXBkYXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBvdXRwdXQgcGF0aC5cbiAgICogQHJldHVybnMge0NvbmZpZ3R4Z2VuQ29tbWFuZEJ1aWxkZXJ9IFRoZSBjdXJyZW50IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRPdXRwdXRBbmNob3JQZWVyc1VwZGF0ZShwYXRoPzogc3RyaW5nKTogQ29uZmlndHhnZW5Db21tYW5kQnVpbGRlciB7XG4gICAgaWYgKHBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgb3V0cHV0IGFuY2hvciBwZWVycyB1cGRhdGUgcGF0aCB0byAke3BhdGh9YCk7XG4gICAgICB0aGlzLmFyZ3Muc2V0KFwib3V0cHV0QW5jaG9yUGVlcnNVcGRhdGVcIiwgcGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBvdXRwdXQgcGF0aCBmb3IgdGhlIGdlbmVzaXMgYmxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIG91dHB1dCBwYXRoLlxuICAgKiBAcmV0dXJucyB7Q29uZmlndHhnZW5Db21tYW5kQnVpbGRlcn0gVGhlIGN1cnJlbnQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE91dHB1dEJsb2NrKHBhdGg/OiBzdHJpbmcpOiBDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyIHtcbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBvdXRwdXQgYmxvY2sgcGF0aCB0byAke3BhdGh9YCk7XG4gICAgICB0aGlzLmFyZ3Muc2V0KFwib3V0cHV0QmxvY2tcIiwgcGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBvdXRwdXQgcGF0aCBmb3IgY2hhbm5lbCBjcmVhdGlvbiBjb25maWd0eC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgb3V0cHV0IHBhdGguXG4gICAqIEByZXR1cm5zIHtDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyfSBUaGUgY3VycmVudCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0T3V0cHV0Q3JlYXRlQ2hhbm5lbFR4KHBhdGg/OiBzdHJpbmcpOiBDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyIHtcbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBvdXRwdXQgY3JlYXRlIGNoYW5uZWwgdHggcGF0aCB0byAke3BhdGh9YCk7XG4gICAgICB0aGlzLmFyZ3Muc2V0KFwib3V0cHV0Q3JlYXRlQ2hhbm5lbFR4XCIsIHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG9yZ2FuaXphdGlvbiB0byBwcmludC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9yZyAtIFRoZSBvcmdhbml6YXRpb24gbmFtZS5cbiAgICogQHJldHVybnMge0NvbmZpZ3R4Z2VuQ29tbWFuZEJ1aWxkZXJ9IFRoZSBjdXJyZW50IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRQcmludE9yZyhvcmc/OiBzdHJpbmcpOiBDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyIHtcbiAgICBpZiAob3JnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHByaW50IG9yZyB0byAke29yZ31gKTtcbiAgICAgIHRoaXMuYXJncy5zZXQoXCJwcmludE9yZ1wiLCBvcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgcHJvZmlsZSB0byB1c2UgZm9yIGdlbmVyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9maWxlIC0gVGhlIHByb2ZpbGUgbmFtZS5cbiAgICogQHJldHVybnMge0NvbmZpZ3R4Z2VuQ29tbWFuZEJ1aWxkZXJ9IFRoZSBjdXJyZW50IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRQcm9maWxlKHByb2ZpbGU/OiBzdHJpbmcpOiBDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyIHtcbiAgICBpZiAocHJvZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBwcm9maWxlIHRvICR7cHJvZmlsZX1gKTtcbiAgICAgIHRoaXMuYXJncy5zZXQoXCJwcm9maWxlXCIsIHByb2ZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB3aGV0aGVyIHRvIHNob3cgdmVyc2lvbiBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBzaG93IC0gV2hldGhlciB0byBzaG93IHZlcnNpb24gaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm5zIHtDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyfSBUaGUgY3VycmVudCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0VmVyc2lvbihzaG93OiBib29sZWFuID0gZmFsc2UpOiBDb25maWd0eGdlbkNvbW1hbmRCdWlsZGVyIHtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyB2ZXJzaW9uIGZsYWcgdG8gJHtzaG93fWApO1xuICAgIHRoaXMuYXJncy5zZXQoXCJ2ZXJzaW9uXCIsIHNob3cpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYnVpbGQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21tYW5kOiBzdHJpbmcgPSBbdGhpcy5nZXRCaW5hcnkoKSwgLi4ubWFwUGFyc2VyKHRoaXMuYXJncyldLmpvaW4oXG4gICAgICBcIiBcIlxuICAgICk7XG4gICAgdGhpcy5sb2cuZGVidWcoYEJ1aWx0IGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcbiAgICByZXR1cm4gY29tbWFuZDtcbiAgfVxuICBnZXRCaW5hcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaW5OYW1lO1xuICB9XG4gIGdldEFyZ3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBtYXBQYXJzZXIodGhpcy5hcmdzKTtcbiAgfVxuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJpbiA9IHRoaXMuZ2V0QmluYXJ5KCk7XG4gICAgY29uc3QgYXJneiA9IFsuLi50aGlzLmdldEFyZ3MoKV07XG5cbiAgICB0cnkge1xuICAgICAgLy8gY2FuIGJlIHVzZWQgYXMgYSBwcm9taXNlIGJ1dCB0byBsb2NrIHRoZSBsb2dzIHJ1bm5pbmcgYXMgZXhlY3N5bmNcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoYmluLCBhcmd6KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYEVycm9yOiBGYWlsZWQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZDogJHtlcnJvcn1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==