UNPKG

@decaf-ts/fabric-weaver

Version:
212 lines 27.2 kB
import { Logging } from "@decaf-ts/logging"; import { FabricBinaries } from "../constants/fabric-binaries"; import { PeerCommands, PeerLifecycleChaincodeCommands, } from "../constants/fabric-peer"; import { runCommand } from "../../utils/child-process"; export class FabricPeerLifecycleChaincodeCommandBuilder { constructor(logger) { this.binName = FabricBinaries.PEER; this.baseCommand = PeerCommands.LIFECYCLE_CHAINCODE; this.command = PeerLifecycleChaincodeCommands.PACKAGE; this.peerDetails = {}; this.args = []; if (!logger) this.log = Logging.for(FabricPeerLifecycleChaincodeCommandBuilder); else this.log = logger.for(FabricPeerLifecycleChaincodeCommandBuilder.name); } setCommand(command) { if (command !== undefined) { this.log.debug(`Setting command to ${command}`); this.command = command; } return this; } setDestination(destination) { if (destination !== undefined) { this.log.debug(`Setting contract destination to ${destination}`); this.destination = destination; } return this; } setContractPath(contractPath) { if (contractPath !== undefined) { this.log.debug(`Setting contract path to ${contractPath}`); this.args.push(`--path ${contractPath}`); } return this; } setLang(lang) { if (lang !== undefined) { this.log.debug(`Setting contract language to ${lang}`); this.args.push(`--lang ${lang}`); } return this; } setLabel(label) { if (label !== undefined) { this.log.debug(`Setting contract label to ${label}`); this.args.push(`--label ${label}`); } return this; } setOrdererAddress(ordererAddress) { if (ordererAddress !== undefined) { this.log.debug(`Setting orderer address to ${ordererAddress}`); this.args.push(`--orderer ${ordererAddress}`); } return this; } setChannelID(channelID) { if (channelID !== undefined) { this.log.debug(`Setting channel ID to ${channelID}`); this.args.push(`--channelID ${channelID}`); } return this; } setContractName(contractName) { if (contractName !== undefined) { this.log.debug(`Setting contract name to ${contractName}`); this.args.push(`--name ${contractName}`); } return this; } setVersion(version) { if (version !== undefined) { this.log.debug(`Setting contract version to ${version}`); this.args.push(`--version ${version}`); } return this; } setPackageID(packageID) { if (packageID !== undefined) { this.log.debug(`Setting contract package ID to ${packageID}`); this.args.push(`--package-id ${packageID}`); } return this; } setSequence(sequence) { if (sequence !== undefined) { this.log.debug(`Setting contract sequence to ${sequence}`); this.args.push(`--sequence ${sequence}`); } return this; } enableTLS(enable) { if (enable !== undefined && enable === true) { this.log.debug(`Setting TLS enabled: ${enable}`); this.args.push("--tls"); } return this; } setTLSCAFile(caFile) { if (caFile !== undefined) { this.log.debug(`Setting TLS CA file: ${caFile}`); this.args.push(`--cafile ${caFile}`); } return this; } setOrdererTLSHostnameOverride(ordererTLSHostnameOverride) { if (ordererTLSHostnameOverride !== undefined) { this.log.debug(`Setting orderer TLS hostname override to ${ordererTLSHostnameOverride}`); this.args.push(`--ordererTLSHostnameOverride ${ordererTLSHostnameOverride}`); } return this; } setCollectionsConfigPath(collectionsConfigPath) { if (collectionsConfigPath !== undefined) { this.log.debug(`Setting collection configuration path to ${collectionsConfigPath}`); this.args.push(`--collections-config ${collectionsConfigPath}`); } return this; } setPeerAddresses(peerAddresses) { if (peerAddresses !== undefined && Array.isArray(peerAddresses) && peerAddresses.length > 0) { this.log.debug(`Setting peer addresses: ${peerAddresses.join(", ")}`); this.peerDetails.peerAddresses = peerAddresses; } return this; } setPeerTLSRoots(peerTLSRoots) { if (peerTLSRoots !== undefined && Array.isArray(peerTLSRoots) && peerTLSRoots.length > 0) { this.log.debug(`Setting peer TLS roots: ${peerTLSRoots.join(", ")}`); this.peerDetails.peerTLSRoots = peerTLSRoots; } return this; } setOutput(output) { if (output !== undefined) { this.log.debug(`Setting output to ${output}`); this.args.push(`--output ${output}`); } return this; } build() { const command = [ this.getBinary(), this.getBaseCommand(), this.getCommand(), this.destination, ...[...new Set(this.args)], ...(this.generatePeerDetails() || []), ] .filter((item) => item !== undefined && item !== null && item !== "") .join(" "); this.log.debug(`Built command: ${command}`); return command; } getBaseCommand() { return this.baseCommand; } getCommand() { return this.command; } getBinary() { return this.binName; } getArgs() { return [...new Set(this.args)]; } generatePeerDetails() { const peerAddresses = this.peerDetails.peerAddresses || undefined; const peerTLSRoots = this.peerDetails.peerTLSRoots || undefined; this.log.info(`Generating peer details: ${peerAddresses}, ${peerTLSRoots}...`); if (peerAddresses !== undefined && Array.isArray(peerAddresses) && peerAddresses.length > 0) { const peerCommands = peerAddresses.map((address, i) => { let str = `--peerAddresses ${address}`; if (peerTLSRoots !== undefined && Array.isArray(peerTLSRoots)) { str += ` --tlsRootCertFiles ${peerTLSRoots[i]}`; } return str; }); this.log.info(`Generated peer details: ${peerCommands}`); return peerCommands; } return undefined; } async execute(options) { const bin = this.getBinary(); const argz = [ this.getBaseCommand(), this.getCommand(), this.destination, ...this.getArgs(), ...(this.generatePeerDetails() || []), ].filter((item) => item !== undefined && item !== null && item !== ""); try { // const regex = /\[\s*INFO\s*\] Listening on http/; // can be used as a promise but to lock the logs running as execsync return (await runCommand(bin, argz, options)); } catch (error) { this.log.error(`Error: Failed to execute the command: ${error}`); process.exit(1); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLXBlZXItbGlmZWN5Y2xlLWNoYWluY29kZS1jb21tYW5kLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmFicmljL3BlZXIvZmFicmljLXBlZXItbGlmZWN5Y2xlLWNoYWluY29kZS1jb21tYW5kLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLDhCQUE4QixHQUMvQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLE9BQU8sMENBQTBDO0lBZXJELFlBQVksTUFBZTtRQVpuQixZQUFPLEdBQW1CLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDOUMsZ0JBQVcsR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUM7UUFFL0MsWUFBTyxHQUFHLDhCQUE4QixDQUFDLE9BQU8sQ0FBQztRQUlqRCxnQkFBVyxHQUNqQixFQUFFLENBQUM7UUFFRyxTQUFJLEdBQWEsRUFBRSxDQUFDO1FBRzFCLElBQUksQ0FBQyxNQUFNO1lBQ1QsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7O1lBQ2hFLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQXdDO1FBQ2pELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxP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dEIsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQXVDO1FBQ25ELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRztZQUNYLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMsV0FBVztZQUNoQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN0QyxDQUFDLE1BQU0sQ0FDTixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQ2pELENBQUM7UUFFZCxJQUFJLENBQUM7WUFDSCxvREFBb0Q7WUFDcEQsb0VBQW9FO1lBQ3BFLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUE2QixDQUFDO1FBQzVFLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRmFicmljQmluYXJpZXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzL2ZhYnJpYy1iaW5hcmllc1wiO1xuaW1wb3J0IHtcbiAgUGVlckNvbW1hbmRzLFxuICBQZWVyTGlmZWN5Y2xlQ2hhaW5jb2RlQ29tbWFuZHMsXG59IGZyb20gXCIuLi9jb25zdGFudHMvZmFicmljLXBlZXJcIjtcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY2hpbGQtcHJvY2Vzc1wiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRCdWlsZGVyIHtcbiAgcHJpdmF0ZSBsb2c6IExvZ2dlcjtcblxuICBwcml2YXRlIGJpbk5hbWU6IEZhYnJpY0JpbmFyaWVzID0gRmFicmljQmluYXJpZXMuUEVFUjtcbiAgcHJpdmF0ZSBiYXNlQ29tbWFuZCA9IFBlZXJDb21tYW5kcy5MSUZFQ1lDTEVfQ0hBSU5DT0RFO1xuXG4gIHByaXZhdGUgY29tbWFuZCA9IFBlZXJMaWZlY3ljbGVDaGFpbmNvZGVDb21tYW5kcy5QQUNLQUdFO1xuXG4gIHByaXZhdGUgZGVzdGluYXRpb24/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwZWVyRGV0YWlsczogeyBwZWVyQWRkcmVzc2VzPzogc3RyaW5nW107IHBlZXJUTFNSb290cz86IHN0cmluZ1tdIH0gPVxuICAgIHt9O1xuXG4gIHByaXZhdGUgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihsb2dnZXI/OiBMb2dnZXIpIHtcbiAgICBpZiAoIWxvZ2dlcilcbiAgICAgIHRoaXMubG9nID0gTG9nZ2luZy5mb3IoRmFicmljUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRCdWlsZGVyKTtcbiAgICBlbHNlIHRoaXMubG9nID0gbG9nZ2VyLmZvcihGYWJyaWNQZWVyTGlmZWN5Y2xlQ2hhaW5jb2RlQ29tbWFuZEJ1aWxkZXIubmFtZSk7XG4gIH1cblxuICBzZXRDb21tYW5kKGNvbW1hbmQ/OiBQZWVyTGlmZWN5Y2xlQ2hhaW5jb2RlQ29tbWFuZHMpOiB0aGlzIHtcbiAgICBpZiAoY29tbWFuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb21tYW5kIHRvICR7Y29tbWFuZH1gKTtcbiAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVzdGluYXRpb24oZGVzdGluYXRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoZGVzdGluYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgZGVzdGluYXRpb24gdG8gJHtkZXN0aW5hdGlvbn1gKTtcbiAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb250cmFjdFBhdGgoY29udHJhY3RQYXRoPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNvbnRyYWN0UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCBwYXRoIHRvICR7Y29udHJhY3RQYXRofWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tcGF0aCAke2NvbnRyYWN0UGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMYW5nKGxhbmc/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAobGFuZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCBsYW5ndWFnZSB0byAke2xhbmd9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1sYW5nICR7bGFuZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMYWJlbChsYWJlbD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChsYWJlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCBsYWJlbCB0byAke2xhYmVsfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tbGFiZWwgJHtsYWJlbH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcmRlcmVyQWRkcmVzcyhvcmRlcmVyQWRkcmVzcz86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChvcmRlcmVyQWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBvcmRlcmVyIGFkZHJlc3MgdG8gJHtvcmRlcmVyQWRkcmVzc31gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLW9yZGVyZXIgJHtvcmRlcmVyQWRkcmVzc31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDaGFubmVsSUQoY2hhbm5lbElEPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNoYW5uZWxJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFubmVsIElEIHRvICR7Y2hhbm5lbElEfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tY2hhbm5lbElEICR7Y2hhbm5lbElEfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENvbnRyYWN0TmFtZShjb250cmFjdE5hbWU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoY29udHJhY3ROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IG5hbWUgdG8gJHtjb250cmFjdE5hbWV9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1uYW1lICR7Y29udHJhY3ROYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFZlcnNpb24odmVyc2lvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IHZlcnNpb24gdG8gJHt2ZXJzaW9ufWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tdmVyc2lvbiAke3ZlcnNpb259YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UGFja2FnZUlEKHBhY2thZ2VJRD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChwYWNrYWdlSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgcGFja2FnZSBJRCB0byAke3BhY2thZ2VJRH1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLXBhY2thZ2UtaWQgJHtwYWNrYWdlSUR9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0U2VxdWVuY2Uoc2VxdWVuY2U/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoc2VxdWVuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3Qgc2VxdWVuY2UgdG8gJHtzZXF1ZW5jZX1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLXNlcXVlbmNlICR7c2VxdWVuY2V9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5hYmxlVExTKGVuYWJsZT86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICBpZiAoZW5hYmxlICE9PSB1bmRlZmluZWQgJiYgZW5hYmxlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgZW5hYmxlZDogJHtlbmFibGV9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChcIi0tdGxzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFRMU0NBRmlsZShjYUZpbGU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoY2FGaWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBDQSBmaWxlOiAke2NhRmlsZX1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWNhZmlsZSAke2NhRmlsZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZShvcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZT86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChvcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgb3JkZXJlciBUTFMgaG9zdG5hbWUgb3ZlcnJpZGUgdG8gJHtvcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goXG4gICAgICAgIGAtLW9yZGVyZXJUTFNIb3N0bmFtZU92ZXJyaWRlICR7b3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb2xsZWN0aW9uc0NvbmZpZ1BhdGgoY29sbGVjdGlvbnNDb25maWdQYXRoPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNvbGxlY3Rpb25zQ29uZmlnUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgY29sbGVjdGlvbiBjb25maWd1cmF0aW9uIHBhdGggdG8gJHtjb2xsZWN0aW9uc0NvbmZpZ1BhdGh9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWNvbGxlY3Rpb25zLWNvbmZpZyAke2NvbGxlY3Rpb25zQ29uZmlnUGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRQZWVyQWRkcmVzc2VzKHBlZXJBZGRyZXNzZXM/OiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIGlmIChcbiAgICAgIHBlZXJBZGRyZXNzZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShwZWVyQWRkcmVzc2VzKSAmJlxuICAgICAgcGVlckFkZHJlc3Nlcy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBwZWVyIGFkZHJlc3NlczogJHtwZWVyQWRkcmVzc2VzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICAgIHRoaXMucGVlckRldGFpbHMucGVlckFkZHJlc3NlcyA9IHBlZXJBZGRyZXNzZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UGVlclRMU1Jvb3RzKHBlZXJUTFNSb290cz86IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgaWYgKFxuICAgICAgcGVlclRMU1Jvb3RzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkocGVlclRMU1Jvb3RzKSAmJlxuICAgICAgcGVlclRMU1Jvb3RzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHBlZXIgVExTIHJvb3RzOiAke3BlZXJUTFNSb290cy5qb2luKFwiLCBcIil9YCk7XG4gICAgICB0aGlzLnBlZXJEZXRhaWxzLnBlZXJUTFNSb290cyA9IHBlZXJUTFNSb290cztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPdXRwdXQob3V0cHV0Pzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKG91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBvdXRwdXQgdG8gJHtvdXRwdXR9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1vdXRwdXQgJHtvdXRwdXR9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYnVpbGQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21tYW5kOiBzdHJpbmcgPSBbXG4gICAgICB0aGlzLmdldEJpbmFyeSgpLFxuICAgICAgdGhpcy5nZXRCYXNlQ29tbWFuZCgpLFxuICAgICAgdGhpcy5nZXRDb21tYW5kKCksXG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLFxuICAgICAgLi4uWy4uLm5ldyBTZXQodGhpcy5hcmdzKV0sXG4gICAgICAuLi4odGhpcy5nZW5lcmF0ZVBlZXJEZXRhaWxzKCkgfHwgW10pLFxuICAgIF1cbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCAmJiBpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IFwiXCIpXG4gICAgICAuam9pbihcIiBcIik7XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQnVpbHQgY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgIHJldHVybiBjb21tYW5kO1xuICB9XG5cbiAgZ2V0QmFzZUNvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29tbWFuZDtcbiAgfVxuXG4gIGdldENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kO1xuICB9XG5cbiAgZ2V0QmluYXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmluTmFtZTtcbiAgfVxuXG4gIGdldEFyZ3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh0aGlzLmFyZ3MpXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVQZWVyRGV0YWlscygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGVlckFkZHJlc3NlcyA9IHRoaXMucGVlckRldGFpbHMucGVlckFkZHJlc3NlcyB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGVlclRMU1Jvb3RzID0gdGhpcy5wZWVyRGV0YWlscy5wZWVyVExTUm9vdHMgfHwgdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBHZW5lcmF0aW5nIHBlZXIgZGV0YWlsczogJHtwZWVyQWRkcmVzc2VzfSwgJHtwZWVyVExTUm9vdHN9Li4uYFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcGVlckFkZHJlc3NlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBBcnJheS5pc0FycmF5KHBlZXJBZGRyZXNzZXMpICYmXG4gICAgICBwZWVyQWRkcmVzc2VzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IHBlZXJDb21tYW5kcyA9IHBlZXJBZGRyZXNzZXMubWFwKChhZGRyZXNzLCBpKSA9PiB7XG4gICAgICAgIGxldCBzdHIgPSBgLS1wZWVyQWRkcmVzc2VzICR7YWRkcmVzc31gO1xuXG4gICAgICAgIGlmIChwZWVyVExTUm9vdHMgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KHBlZXJUTFNSb290cykpIHtcbiAgICAgICAgICBzdHIgKz0gYCAtLXRsc1Jvb3RDZXJ0RmlsZXMgJHtwZWVyVExTUm9vdHNbaV19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sb2cuaW5mbyhgR2VuZXJhdGVkIHBlZXIgZGV0YWlsczogJHtwZWVyQ29tbWFuZHN9YCk7XG5cbiAgICAgIHJldHVybiBwZWVyQ29tbWFuZHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUob3B0aW9ucz86IHsgW2luZGV4ZXI6IHN0cmluZ106IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYmluID0gdGhpcy5nZXRCaW5hcnkoKTtcbiAgICBjb25zdCBhcmd6ID0gW1xuICAgICAgdGhpcy5nZXRCYXNlQ29tbWFuZCgpLFxuICAgICAgdGhpcy5nZXRDb21tYW5kKCksXG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLFxuICAgICAgLi4udGhpcy5nZXRBcmdzKCksXG4gICAgICAuLi4odGhpcy5nZW5lcmF0ZVBlZXJEZXRhaWxzKCkgfHwgW10pLFxuICAgIF0uZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCAmJiBpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IFwiXCJcbiAgICApIGFzIHN0cmluZ1tdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGNvbnN0IHJlZ2V4ID0gL1xcW1xccypJTkZPXFxzKlxcXSBMaXN0ZW5pbmcgb24gaHR0cC87XG4gICAgICAvLyBjYW4gYmUgdXNlZCBhcyBhIHByb21pc2UgYnV0IHRvIGxvY2sgdGhlIGxvZ3MgcnVubmluZyBhcyBleGVjc3luY1xuICAgICAgcmV0dXJuIChhd2FpdCBydW5Db21tYW5kKGJpbiwgYXJneiwgb3B0aW9ucykpIGFzIHVua25vd24gYXMgUHJvbWlzZTx2b2lkPjtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYEVycm9yOiBGYWlsZWQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZDogJHtlcnJvcn1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==