@zkpersona/noir-social-verify
Version:
A library that provides a simple way to verify ownership of social accounts by proving e-mails.
138 lines (135 loc) • 15.5 kB
JavaScript
;
var zkemailNr = require('@zk-email/zkemail-nr');
var bb_js = require('@aztec/bb.js');
var noir_js = require('@noir-lang/noir_js');
// src/helpers.ts
var circuitParams = {
google: {
maxHeadersLength: 576,
maxBodyLength: 16384,
extractFrom: true,
extractTo: true
},
x: {
maxHeadersLength: 576,
maxBodyLength: 16384,
extractFrom: true,
extractTo: true
}
};
var createProver = (circuit, backend) => {
const prover = new ZKEmailProver(circuit, backend);
return prover;
};
var generateCircuitInputs = async (emailContent, circuitType) => {
const inputs = await zkemailNr.generateEmailVerifierInputs(
emailContent,
circuitParams[circuitType]
);
return inputs;
};
var ZKEmailProver = class {
plonk;
honk;
noir;
provingBackend;
constructor(circuit, provingBackend) {
const acirBytecode = circuit.bytecode;
if (provingBackend.type === "plonk" || provingBackend.type === "all") {
this.plonk = new bb_js.UltraPlonkBackend(
acirBytecode,
provingBackend.options,
provingBackend.circuitOptions
);
}
if (provingBackend.type === "honk" || provingBackend.type === "all") {
this.honk = new bb_js.UltraHonkBackend(
acirBytecode,
provingBackend.options,
provingBackend.circuitOptions
);
}
this.provingBackend = provingBackend;
this.noir = new noir_js.Noir(circuit);
}
/**
* Compute the witness for a given input to the circuit without generating a proof
*
* @param input - the input that should produce a satisfying witness for the circuit
* @returns - the witness for the input and the output of the circuit if satisfiable
*/
async simulateWitness(input) {
return await this.noir.execute(input);
}
/**
* Generate a proof of a satisfying input to the circuit using a provided witness
*
* @param input - a satisfying witness for the circuit
* @param provingBackend - optionally provided if the class was initialized with both proving schemes
* @returns proof of valid execution of the circuit
*/
async prove(witness, provingBackend) {
const backend = this.getProvingBackend(provingBackend?.type);
return await backend.generateProof(witness);
}
/**
* Simulate the witness for a given input and generate a proof
*
* @param input - the input that should produce a satisfying witness for the circuit
* @param provingBackend - optionally provided if the class was initialized with both proving schemes
* @returns proof of valid execution of the circuit
*/
async fullProve(input, provingBackend) {
const { witness } = await this.simulateWitness(input);
return this.prove(witness, provingBackend);
}
/**
* Verify a proof of a satisfying input to the circuit for a given proving scheme
*
* @param proof - the proof to verify
* @param provingBackend - optionally provided if the class was initialized with both proving schemes
* @returns true if the proof is valid, false otherwise
*/
async verify(proof, provingBackend) {
const backend = this.getProvingBackend(provingBackend?.type);
return await backend.verifyProof(proof);
}
/**
* End the prover wasm instance(s) and clean up resources
*/
async destroy() {
if (this.plonk) {
await this.plonk.destroy();
}
if (this.honk) {
await this.honk.destroy();
}
}
getProvingBackend(backendType) {
let type;
if (backendType === "plonk" || this.provingBackend.type === "plonk") {
type = "plonk";
} else if (backendType === "honk" || this.provingBackend.type === "honk") {
type = "honk";
} else {
throw new Error(
'Specify a proving backend from either "plonk" or "honk"'
);
}
let backend;
if (type === "plonk" && this.plonk) {
backend = this.plonk;
} else if (type === "honk" && this.honk) {
backend = this.honk;
} else {
throw new Error(`Proving backend ${type} not initialized`);
}
return backend;
}
};
exports.ZKEmailProver = ZKEmailProver;
exports.circuitParams = circuitParams;
exports.createProver = createProver;
exports.generateCircuitInputs = generateCircuitInputs;
//# sourceMappingURL=index.js.map
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzLnRzIiwiLi4vc3JjL3Byb3Zlci50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUVtYWlsVmVyaWZpZXJJbnB1dHMiLCJVbHRyYVBsb25rQmFja2VuZCIsIlVsdHJhSG9ua0JhY2tlbmQiLCJOb2lyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBUU8sSUFBTSxhQUEwRCxHQUFBO0FBQUEsRUFDckUsTUFBUSxFQUFBO0FBQUEsSUFDTixnQkFBa0IsRUFBQSxHQUFBO0FBQUEsSUFDbEIsYUFBZSxFQUFBLEtBQUE7QUFBQSxJQUNmLFdBQWEsRUFBQSxJQUFBO0FBQUEsSUFDYixTQUFXLEVBQUE7QUFBQSxHQUNiO0FBQUEsRUFDQSxDQUFHLEVBQUE7QUFBQSxJQUNELGdCQUFrQixFQUFBLEdBQUE7QUFBQSxJQUNsQixhQUFlLEVBQUEsS0FBQTtBQUFBLElBQ2YsV0FBYSxFQUFBLElBQUE7QUFBQSxJQUNiLFNBQVcsRUFBQTtBQUFBO0FBRWY7QUFFYSxJQUFBLFlBQUEsR0FBZSxDQUMxQixPQUFBLEVBQ0EsT0FDRyxLQUFBO0FBQ0gsRUFBQSxNQUFNLE1BQVMsR0FBQSxJQUFJLGFBQWMsQ0FBQSxPQUFBLEVBQVMsT0FBTyxDQUFBO0FBQ2pELEVBQU8sT0FBQSxNQUFBO0FBQ1Q7QUFFYSxJQUFBLHFCQUFBLEdBQXdCLE9BQ25DLFlBQUEsRUFDQSxXQUNHLEtBQUE7QUFDSCxFQUFBLE1BQU0sU0FBUyxNQUFNQSxxQ0FBQTtBQUFBLElBQ25CLFlBQUE7QUFBQSxJQUNBLGNBQWMsV0FBVztBQUFBLEdBQzNCO0FBRUEsRUFBTyxPQUFBLE1BQUE7QUFDVDtBQ3JCTyxJQUFNLGdCQUFOLE1BQW9CO0FBQUEsRUFDekIsS0FBQTtBQUFBLEVBQ0EsSUFBQTtBQUFBLEVBQ0EsSUFBQTtBQUFBLEVBQ0EsY0FBQTtBQUFBLEVBRUEsV0FBQSxDQUFZLFNBQTBCLGNBQWdDLEVBQUE7QUFDcEUsSUFBQSxNQUFNLGVBQWUsT0FBUSxDQUFBLFFBQUE7QUFDN0IsSUFBQSxJQUFJLGNBQWUsQ0FBQSxJQUFBLEtBQVMsT0FBVyxJQUFBLGNBQUEsQ0FBZSxTQUFTLEtBQU8sRUFBQTtBQUNwRSxNQUFBLElBQUEsQ0FBSyxRQUFRLElBQUlDLHVCQUFBO0FBQUEsUUFDZixZQUFBO0FBQUEsUUFDQSxjQUFlLENBQUEsT0FBQTtBQUFBLFFBQ2YsY0FBZSxDQUFBO0FBQUEsT0FDakI7QUFBQTtBQUVGLElBQUEsSUFBSSxjQUFlLENBQUEsSUFBQSxLQUFTLE1BQVUsSUFBQSxjQUFBLENBQWUsU0FBUyxLQUFPLEVBQUE7QUFDbkUsTUFBQSxJQUFBLENBQUssT0FBTyxJQUFJQyxzQkFBQTtBQUFBLFFBQ2QsWUFBQTtBQUFBLFFBQ0EsY0FBZSxDQUFBLE9BQUE7QUFBQSxRQUNmLGNBQWUsQ0FBQTtBQUFBLE9BQ2pCO0FBQUE7QUFFRixJQUFBLElBQUEsQ0FBSyxjQUFpQixHQUFBLGNBQUE7QUFDdEIsSUFBSyxJQUFBLENBQUEsSUFBQSxHQUFPLElBQUlDLFlBQUEsQ0FBSyxPQUFPLENBQUE7QUFBQTtBQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQU0sZ0JBQ0osS0FDMkQsRUFBQTtBQUMzRCxJQUFBLE9BQU8sTUFBTSxJQUFBLENBQUssSUFBSyxDQUFBLE9BQUEsQ0FBUSxLQUFLLENBQUE7QUFBQTtBQUN0QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBTSxLQUNKLENBQUEsT0FBQSxFQUNBLGNBQ29CLEVBQUE7QUFDcEIsSUFBQSxNQUFNLE9BQVUsR0FBQSxJQUFBLENBQUssaUJBQWtCLENBQUEsY0FBQSxFQUFnQixJQUFJLENBQUE7QUFDM0QsSUFBTyxPQUFBLE1BQU0sT0FBUSxDQUFBLGFBQUEsQ0FBYyxPQUFPLENBQUE7QUFBQTtBQUM1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBTSxTQUNKLENBQUEsS0FBQSxFQUNBLGNBQ29CLEVBQUE7QUFDcEIsSUFBQSxNQUFNLEVBQUUsT0FBUSxFQUFBLEdBQUksTUFBTSxJQUFBLENBQUssZ0JBQWdCLEtBQUssQ0FBQTtBQUNwRCxJQUFPLE9BQUEsSUFBQSxDQUFLLEtBQU0sQ0FBQSxPQUFBLEVBQVMsY0FBYyxDQUFBO0FBQUE7QUFDM0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLE1BQU0sTUFDSixDQUFBLEtBQUEsRUFDQSxjQUNrQixFQUFBO0FBQ2xCLElBQUEsTUFBTSxPQUFVLEdBQUEsSUFBQSxDQUFLLGlCQUFrQixDQUFBLGNBQUEsRUFBZ0IsSUFBSSxDQUFBO0FBQzNELElBQU8sT0FBQSxNQUFNLE9BQVEsQ0FBQSxXQUFBLENBQVksS0FBSyxDQUFBO0FBQUE7QUFDeEM7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFNLE9BQVUsR0FBQTtBQUNkLElBQUEsSUFBSSxLQUFLLEtBQU8sRUFBQTtBQUNkLE1BQU0sTUFBQSxJQUFBLENBQUssTUFBTSxPQUFRLEVBQUE7QUFBQTtBQUUzQixJQUFBLElBQUksS0FBSyxJQUFNLEVBQUE7QUFDYixNQUFNLE1BQUEsSUFBQSxDQUFLLEtBQUssT0FBUSxFQUFBO0FBQUE7QUFDMUI7QUFDRixFQUVRLGtCQUFrQixXQUFzQyxFQUFBO0FBQzlELElBQUksSUFBQSxJQUFBO0FBQ0osSUFBQSxJQUFJLFdBQWdCLEtBQUEsT0FBQSxJQUFXLElBQUssQ0FBQSxjQUFBLENBQWUsU0FBUyxPQUFTLEVBQUE7QUFDbkUsTUFBTyxJQUFBLEdBQUEsT0FBQTtBQUFBLGVBQ0UsV0FBZ0IsS0FBQSxNQUFBLElBQVUsSUFBSyxDQUFBLGNBQUEsQ0FBZSxTQUFTLE1BQVEsRUFBQTtBQUN4RSxNQUFPLElBQUEsR0FBQSxNQUFBO0FBQUEsS0FDRixNQUFBO0FBQ0wsTUFBQSxNQUFNLElBQUksS0FBQTtBQUFBLFFBQ1I7QUFBQSxPQUNGO0FBQUE7QUFHRixJQUFJLElBQUEsT0FBQTtBQUNKLElBQUksSUFBQSxJQUFBLEtBQVMsT0FBVyxJQUFBLElBQUEsQ0FBSyxLQUFPLEVBQUE7QUFDbEMsTUFBQSxPQUFBLEdBQVUsSUFBSyxDQUFBLEtBQUE7QUFBQSxLQUNOLE1BQUEsSUFBQSxJQUFBLEtBQVMsTUFBVSxJQUFBLElBQUEsQ0FBSyxJQUFNLEVBQUE7QUFDdkMsTUFBQSxPQUFBLEdBQVUsSUFBSyxDQUFBLElBQUE7QUFBQSxLQUNWLE1BQUE7QUFDTCxNQUFBLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBbUIsZ0JBQUEsRUFBQSxJQUFJLENBQWtCLGdCQUFBLENBQUEsQ0FBQTtBQUFBO0FBRzNELElBQU8sT0FBQSxPQUFBO0FBQUE7QUFFWCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tcGlsZWRDaXJjdWl0IH0gZnJvbSAnQG5vaXItbGFuZy9ub2lyX2pzJztcbmltcG9ydCB7XG4gIHR5cGUgSW5wdXRHZW5lcmF0aW9uQXJncyxcbiAgZ2VuZXJhdGVFbWFpbFZlcmlmaWVySW5wdXRzLFxufSBmcm9tICdAemstZW1haWwvemtlbWFpbC1ucic7XG5pbXBvcnQgeyB0eXBlIFByb3ZpbmdCYWNrZW5kLCBaS0VtYWlsUHJvdmVyIH0gZnJvbSAnLi4vc3JjJztcbmltcG9ydCB0eXBlIHsgQ2lyY3VpdElucHV0TWFwLCBDaXJjdWl0VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgY2lyY3VpdFBhcmFtczogUmVjb3JkPENpcmN1aXRUeXBlLCBJbnB1dEdlbmVyYXRpb25BcmdzPiA9IHtcbiAgZ29vZ2xlOiB7XG4gICAgbWF4SGVhZGVyc0xlbmd0aDogNTc2LFxuICAgIG1heEJvZHlMZW5ndGg6IDE2Mzg0LFxuICAgIGV4dHJhY3RGcm9tOiB0cnVlLFxuICAgIGV4dHJhY3RUbzogdHJ1ZSxcbiAgfSxcbiAgeDoge1xuICAgIG1heEhlYWRlcnNMZW5ndGg6IDU3NixcbiAgICBtYXhCb2R5TGVuZ3RoOiAxNjM4NCxcbiAgICBleHRyYWN0RnJvbTogdHJ1ZSxcbiAgICBleHRyYWN0VG86IHRydWUsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUHJvdmVyID0gKFxuICBjaXJjdWl0OiBDb21waWxlZENpcmN1aXQsXG4gIGJhY2tlbmQ6IFByb3ZpbmdCYWNrZW5kXG4pID0+IHtcbiAgY29uc3QgcHJvdmVyID0gbmV3IFpLRW1haWxQcm92ZXIoY2lyY3VpdCwgYmFja2VuZCk7XG4gIHJldHVybiBwcm92ZXI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVDaXJjdWl0SW5wdXRzID0gYXN5bmMgPFQgZXh0ZW5kcyBDaXJjdWl0VHlwZT4oXG4gIGVtYWlsQ29udGVudDogQnVmZmVyIHwgc3RyaW5nLFxuICBjaXJjdWl0VHlwZTogVFxuKSA9PiB7XG4gIGNvbnN0IGlucHV0cyA9IGF3YWl0IGdlbmVyYXRlRW1haWxWZXJpZmllcklucHV0cyhcbiAgICBlbWFpbENvbnRlbnQsXG4gICAgY2lyY3VpdFBhcmFtc1tjaXJjdWl0VHlwZV1cbiAgKTtcblxuICByZXR1cm4gaW5wdXRzIGFzIENpcmN1aXRJbnB1dE1hcFtUXTtcbn07XG4iLCJpbXBvcnQge1xuICB0eXBlIEJhY2tlbmRPcHRpb25zLFxuICB0eXBlIFByb29mRGF0YSxcbiAgVWx0cmFIb25rQmFja2VuZCxcbiAgVWx0cmFQbG9ua0JhY2tlbmQsXG59IGZyb20gJ0BhenRlYy9iYi5qcyc7XG5pbXBvcnQgeyB0eXBlIENvbXBpbGVkQ2lyY3VpdCwgdHlwZSBJbnB1dE1hcCwgTm9pciB9IGZyb20gJ0Bub2lyLWxhbmcvbm9pcl9qcyc7XG50eXBlIElucHV0VmFsdWUgPSBJbnB1dE1hcFtzdHJpbmddO1xuXG50eXBlIENpcmN1aXRPcHRpb25zID0ge1xuICAvKiogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdG8gcHJvZHVjZSBTTkFSSyBmcmllbmRseSBwcm9vZnMgKi9cbiAgcmVjdXJzaXZlOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvdmluZ0JhY2tlbmQgPSB7XG4gIHR5cGU6ICdob25rJyB8ICdwbG9uaycgfCAnYWxsJztcbiAgb3B0aW9ucz86IEJhY2tlbmRPcHRpb25zO1xuICBjaXJjdWl0T3B0aW9ucz86IENpcmN1aXRPcHRpb25zO1xufTtcblxuZXhwb3J0IGNsYXNzIFpLRW1haWxQcm92ZXIge1xuICBwbG9uaz86IFVsdHJhUGxvbmtCYWNrZW5kO1xuICBob25rPzogVWx0cmFIb25rQmFja2VuZDtcbiAgbm9pcjogTm9pcjtcbiAgcHJvdmluZ0JhY2tlbmQ6IFByb3ZpbmdCYWNrZW5kO1xuXG4gIGNvbnN0cnVjdG9yKGNpcmN1aXQ6IENvbXBpbGVkQ2lyY3VpdCwgcHJvdmluZ0JhY2tlbmQ6IFByb3ZpbmdCYWNrZW5kKSB7XG4gICAgY29uc3QgYWNpckJ5dGVjb2RlID0gY2lyY3VpdC5ieXRlY29kZTtcbiAgICBpZiAocHJvdmluZ0JhY2tlbmQudHlwZSA9PT0gJ3Bsb25rJyB8fCBwcm92aW5nQmFja2VuZC50eXBlID09PSAnYWxsJykge1xuICAgICAgdGhpcy5wbG9uayA9IG5ldyBVbHRyYVBsb25rQmFja2VuZChcbiAgICAgICAgYWNpckJ5dGVjb2RlLFxuICAgICAgICBwcm92aW5nQmFja2VuZC5vcHRpb25zLFxuICAgICAgICBwcm92aW5nQmFja2VuZC5jaXJjdWl0T3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3ZpbmdCYWNrZW5kLnR5cGUgPT09ICdob25rJyB8fCBwcm92aW5nQmFja2VuZC50eXBlID09PSAnYWxsJykge1xuICAgICAgdGhpcy5ob25rID0gbmV3IFVsdHJhSG9ua0JhY2tlbmQoXG4gICAgICAgIGFjaXJCeXRlY29kZSxcbiAgICAgICAgcHJvdmluZ0JhY2tlbmQub3B0aW9ucyxcbiAgICAgICAgcHJvdmluZ0JhY2tlbmQuY2lyY3VpdE9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucHJvdmluZ0JhY2tlbmQgPSBwcm92aW5nQmFja2VuZDtcbiAgICB0aGlzLm5vaXIgPSBuZXcgTm9pcihjaXJjdWl0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSB3aXRuZXNzIGZvciBhIGdpdmVuIGlucHV0IHRvIHRoZSBjaXJjdWl0IHdpdGhvdXQgZ2VuZXJhdGluZyBhIHByb29mXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIHRoZSBpbnB1dCB0aGF0IHNob3VsZCBwcm9kdWNlIGEgc2F0aXNmeWluZyB3aXRuZXNzIGZvciB0aGUgY2lyY3VpdFxuICAgKiBAcmV0dXJucyAtIHRoZSB3aXRuZXNzIGZvciB0aGUgaW5wdXQgYW5kIHRoZSBvdXRwdXQgb2YgdGhlIGNpcmN1aXQgaWYgc2F0aXNmaWFibGVcbiAgICovXG4gIGFzeW5jIHNpbXVsYXRlV2l0bmVzcyhcbiAgICBpbnB1dDogSW5wdXRNYXBcbiAgKTogUHJvbWlzZTx7IHdpdG5lc3M6IFVpbnQ4QXJyYXk7IHJldHVyblZhbHVlOiBJbnB1dFZhbHVlIH0+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ub2lyLmV4ZWN1dGUoaW5wdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgcHJvb2Ygb2YgYSBzYXRpc2Z5aW5nIGlucHV0IHRvIHRoZSBjaXJjdWl0IHVzaW5nIGEgcHJvdmlkZWQgd2l0bmVzc1xuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBhIHNhdGlzZnlpbmcgd2l0bmVzcyBmb3IgdGhlIGNpcmN1aXRcbiAgICogQHBhcmFtIHByb3ZpbmdCYWNrZW5kIC0gb3B0aW9uYWxseSBwcm92aWRlZCBpZiB0aGUgY2xhc3Mgd2FzIGluaXRpYWxpemVkIHdpdGggYm90aCBwcm92aW5nIHNjaGVtZXNcbiAgICogQHJldHVybnMgcHJvb2Ygb2YgdmFsaWQgZXhlY3V0aW9uIG9mIHRoZSBjaXJjdWl0XG4gICAqL1xuICBhc3luYyBwcm92ZShcbiAgICB3aXRuZXNzOiBVaW50OEFycmF5LFxuICAgIHByb3ZpbmdCYWNrZW5kPzogUHJvdmluZ0JhY2tlbmRcbiAgKTogUHJvbWlzZTxQcm9vZkRhdGE+IHtcbiAgICBjb25zdCBiYWNrZW5kID0gdGhpcy5nZXRQcm92aW5nQmFja2VuZChwcm92aW5nQmFja2VuZD8udHlwZSk7XG4gICAgcmV0dXJuIGF3YWl0IGJhY2tlbmQuZ2VuZXJhdGVQcm9vZih3aXRuZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSB0aGUgd2l0bmVzcyBmb3IgYSBnaXZlbiBpbnB1dCBhbmQgZ2VuZXJhdGUgYSBwcm9vZlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSB0aGUgaW5wdXQgdGhhdCBzaG91bGQgcHJvZHVjZSBhIHNhdGlzZnlpbmcgd2l0bmVzcyBmb3IgdGhlIGNpcmN1aXRcbiAgICogQHBhcmFtIHByb3ZpbmdCYWNrZW5kIC0gb3B0aW9uYWxseSBwcm92aWRlZCBpZiB0aGUgY2xhc3Mgd2FzIGluaXRpYWxpemVkIHdpdGggYm90aCBwcm92aW5nIHNjaGVtZXNcbiAgICogQHJldHVybnMgcHJvb2Ygb2YgdmFsaWQgZXhlY3V0aW9uIG9mIHRoZSBjaXJjdWl0XG4gICAqL1xuICBhc3luYyBmdWxsUHJvdmUoXG4gICAgaW5wdXQ6IElucHV0TWFwLFxuICAgIHByb3ZpbmdCYWNrZW5kPzogUHJvdmluZ0JhY2tlbmRcbiAgKTogUHJvbWlzZTxQcm9vZkRhdGE+IHtcbiAgICBjb25zdCB7IHdpdG5lc3MgfSA9IGF3YWl0IHRoaXMuc2ltdWxhdGVXaXRuZXNzKGlucHV0KTtcbiAgICByZXR1cm4gdGhpcy5wcm92ZSh3aXRuZXNzLCBwcm92aW5nQmFja2VuZCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IGEgcHJvb2Ygb2YgYSBzYXRpc2Z5aW5nIGlucHV0IHRvIHRoZSBjaXJjdWl0IGZvciBhIGdpdmVuIHByb3Zpbmcgc2NoZW1lXG4gICAqXG4gICAqIEBwYXJhbSBwcm9vZiAtIHRoZSBwcm9vZiB0byB2ZXJpZnlcbiAgICogQHBhcmFtIHByb3ZpbmdCYWNrZW5kIC0gb3B0aW9uYWxseSBwcm92aWRlZCBpZiB0aGUgY2xhc3Mgd2FzIGluaXRpYWxpemVkIHdpdGggYm90aCBwcm92aW5nIHNjaGVtZXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvb2YgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5KFxuICAgIHByb29mOiBQcm9vZkRhdGEsXG4gICAgcHJvdmluZ0JhY2tlbmQ/OiBQcm92aW5nQmFja2VuZFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBiYWNrZW5kID0gdGhpcy5nZXRQcm92aW5nQmFja2VuZChwcm92aW5nQmFja2VuZD8udHlwZSk7XG4gICAgcmV0dXJuIGF3YWl0IGJhY2tlbmQudmVyaWZ5UHJvb2YocHJvb2YpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgcHJvdmVyIHdhc20gaW5zdGFuY2UocykgYW5kIGNsZWFuIHVwIHJlc291cmNlc1xuICAgKi9cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5wbG9uaykge1xuICAgICAgYXdhaXQgdGhpcy5wbG9uay5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhvbmspIHtcbiAgICAgIGF3YWl0IHRoaXMuaG9uay5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm92aW5nQmFja2VuZChiYWNrZW5kVHlwZT86IFByb3ZpbmdCYWNrZW5kWyd0eXBlJ10pIHtcbiAgICBsZXQgdHlwZTogJ3Bsb25rJyB8ICdob25rJztcbiAgICBpZiAoYmFja2VuZFR5cGUgPT09ICdwbG9uaycgfHwgdGhpcy5wcm92aW5nQmFja2VuZC50eXBlID09PSAncGxvbmsnKSB7XG4gICAgICB0eXBlID0gJ3Bsb25rJztcbiAgICB9IGVsc2UgaWYgKGJhY2tlbmRUeXBlID09PSAnaG9uaycgfHwgdGhpcy5wcm92aW5nQmFja2VuZC50eXBlID09PSAnaG9uaycpIHtcbiAgICAgIHR5cGUgPSAnaG9uayc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1NwZWNpZnkgYSBwcm92aW5nIGJhY2tlbmQgZnJvbSBlaXRoZXIgXCJwbG9ua1wiIG9yIFwiaG9ua1wiJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgYmFja2VuZDogVWx0cmFQbG9ua0JhY2tlbmQgfCBVbHRyYUhvbmtCYWNrZW5kO1xuICAgIGlmICh0eXBlID09PSAncGxvbmsnICYmIHRoaXMucGxvbmspIHtcbiAgICAgIGJhY2tlbmQgPSB0aGlzLnBsb25rO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2hvbmsnICYmIHRoaXMuaG9uaykge1xuICAgICAgYmFja2VuZCA9IHRoaXMuaG9uaztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aW5nIGJhY2tlbmQgJHt0eXBlfSBub3QgaW5pdGlhbGl6ZWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFja2VuZDtcbiAgfVxufVxuIl19