@aztec/bb-prover 0.41.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bb/cli.d.ts.map +1 -1
- package/dest/bb/cli.js +24 -2
- package/dest/bb/execute.d.ts +30 -1
- package/dest/bb/execute.d.ts.map +1 -1
- package/dest/bb/execute.js +252 -60
- package/dest/config.d.ts +9 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +2 -0
- package/dest/index.d.ts +2 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +3 -1
- package/dest/mappings/mappings.d.ts +1 -0
- package/dest/mappings/mappings.d.ts.map +1 -1
- package/dest/mappings/mappings.js +27 -8
- package/dest/prover/bb_native_proof_creator.d.ts +2 -8
- package/dest/prover/bb_native_proof_creator.d.ts.map +1 -1
- package/dest/prover/bb_native_proof_creator.js +37 -79
- package/dest/prover/bb_prover.d.ts +33 -32
- package/dest/prover/bb_prover.d.ts.map +1 -1
- package/dest/prover/bb_prover.js +231 -162
- package/dest/stats.d.ts.map +1 -1
- package/dest/stats.js +8 -2
- package/dest/test/index.d.ts +1 -0
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +2 -1
- package/dest/test/test_circuit_prover.d.ts +9 -7
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +32 -16
- package/dest/test/test_verifier.d.ts +7 -0
- package/dest/test/test_verifier.d.ts.map +1 -0
- package/dest/test/test_verifier.js +10 -0
- package/dest/verification_key/verification_key_data.d.ts +8 -0
- package/dest/verification_key/verification_key_data.d.ts.map +1 -0
- package/dest/verification_key/verification_key_data.js +24 -0
- package/dest/verifier/bb_verifier.d.ts +18 -0
- package/dest/verifier/bb_verifier.d.ts.map +1 -0
- package/dest/verifier/bb_verifier.js +90 -0
- package/dest/verifier/index.d.ts +2 -0
- package/dest/verifier/index.d.ts.map +1 -0
- package/dest/verifier/index.js +2 -0
- package/package.json +6 -6
- package/src/bb/cli.ts +36 -1
- package/src/bb/execute.ts +340 -67
- package/src/config.ts +9 -0
- package/src/index.ts +2 -0
- package/src/mappings/mappings.ts +38 -12
- package/src/prover/bb_native_proof_creator.ts +49 -91
- package/src/prover/bb_prover.ts +396 -221
- package/src/stats.ts +7 -1
- package/src/test/index.ts +1 -0
- package/src/test/test_circuit_prover.ts +85 -23
- package/src/test/test_verifier.ts +12 -0
- package/src/verification_key/verification_key_data.ts +35 -0
- package/src/verifier/bb_verifier.ts +156 -0
- package/src/verifier/index.ts +1 -0
- package/dest/prover/verification_key_data.d.ts +0 -16
- package/dest/prover/verification_key_data.d.ts.map +0 -1
- package/dest/prover/verification_key_data.js +0 -5
- package/src/prover/verification_key_data.ts +0 -16
package/dest/bb/execute.js
CHANGED
|
@@ -2,6 +2,7 @@ import { sha256 } from '@aztec/foundation/crypto';
|
|
|
2
2
|
import { Timer } from '@aztec/foundation/timer';
|
|
3
3
|
import * as proc from 'child_process';
|
|
4
4
|
import * as fs from 'fs/promises';
|
|
5
|
+
import { basename, dirname, join } from 'path';
|
|
5
6
|
export const VK_FILENAME = 'vk';
|
|
6
7
|
export const VK_FIELDS_FILENAME = 'vk_fields.json';
|
|
7
8
|
export const PROOF_FILENAME = 'proof';
|
|
@@ -24,8 +25,19 @@ export var BB_RESULT;
|
|
|
24
25
|
export function executeBB(pathToBB, command, args, logger, resultParser = (code) => code === 0) {
|
|
25
26
|
return new Promise(resolve => {
|
|
26
27
|
// spawn the bb process
|
|
28
|
+
const { HARDWARE_CONCURRENCY: _, ...envWithoutConcurrency } = process.env;
|
|
29
|
+
const env = process.env.HARDWARE_CONCURRENCY ? process.env : envWithoutConcurrency;
|
|
30
|
+
logger(`Executing BB with: ${command} ${args.join(' ')}`);
|
|
27
31
|
const bb = proc.spawn(pathToBB, [command, ...args], {
|
|
28
|
-
|
|
32
|
+
env,
|
|
33
|
+
});
|
|
34
|
+
bb.stdout.on('data', data => {
|
|
35
|
+
const message = data.toString('utf-8').replace(/\n$/, '');
|
|
36
|
+
logger(message);
|
|
37
|
+
});
|
|
38
|
+
bb.stderr.on('data', data => {
|
|
39
|
+
const message = data.toString('utf-8').replace(/\n$/, '');
|
|
40
|
+
logger(message);
|
|
29
41
|
});
|
|
30
42
|
bb.on('close', (exitCode, signal) => {
|
|
31
43
|
if (resultParser(exitCode)) {
|
|
@@ -37,7 +49,6 @@ export function executeBB(pathToBB, command, args, logger, resultParser = (code)
|
|
|
37
49
|
});
|
|
38
50
|
}).catch(_ => ({ status: BB_RESULT.FAILURE, exitCode: -1, signal: undefined }));
|
|
39
51
|
}
|
|
40
|
-
const bytecodeHashFilename = 'bytecode_hash';
|
|
41
52
|
const bytecodeFilename = 'bytecode';
|
|
42
53
|
/**
|
|
43
54
|
* Used for generating either a proving or verification key, will exit early if the key already exists
|
|
@@ -59,34 +70,85 @@ export async function generateKeyForNoirCircuit(pathToBB, workingDirectory, circ
|
|
|
59
70
|
// The bytecode is written to e.g. /workingDirectory/pk/BaseParityArtifact/bytecode
|
|
60
71
|
// The bytecode is removed after the key is generated, leaving just the hash file
|
|
61
72
|
const circuitOutputDirectory = `${workingDirectory}/${key}/${circuitName}`;
|
|
62
|
-
const bytecodeHashPath = `${circuitOutputDirectory}/${bytecodeHashFilename}`;
|
|
63
|
-
const bytecodePath = `${circuitOutputDirectory}/${bytecodeFilename}`;
|
|
64
|
-
const bytecodeHash = sha256(bytecode);
|
|
65
73
|
const outputPath = `${circuitOutputDirectory}`;
|
|
74
|
+
const bytecodeHash = sha256(bytecode);
|
|
66
75
|
// ensure the directory exists
|
|
67
76
|
await fs.mkdir(circuitOutputDirectory, { recursive: true });
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
.
|
|
72
|
-
.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
const res = await fsCache(circuitOutputDirectory, bytecodeHash, log, force, async () => {
|
|
78
|
+
const binaryPresent = await fs
|
|
79
|
+
.access(pathToBB, fs.constants.R_OK)
|
|
80
|
+
.then(_ => true)
|
|
81
|
+
.catch(_ => false);
|
|
82
|
+
if (!binaryPresent) {
|
|
83
|
+
return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
|
|
84
|
+
}
|
|
85
|
+
// We are now going to generate the key
|
|
86
|
+
try {
|
|
87
|
+
const bytecodePath = `${circuitOutputDirectory}/${bytecodeFilename}`;
|
|
88
|
+
// Write the bytecode to the working directory
|
|
89
|
+
await fs.writeFile(bytecodePath, bytecode);
|
|
90
|
+
// args are the output path and the input bytecode path
|
|
91
|
+
const args = ['-o', `${outputPath}/${VK_FILENAME}`, '-b', bytecodePath];
|
|
92
|
+
const timer = new Timer();
|
|
93
|
+
let result = await executeBB(pathToBB, `write_${key}`, args, log);
|
|
94
|
+
// If we succeeded and the type of key if verification, have bb write the 'fields' version too
|
|
95
|
+
if (result.status == BB_RESULT.SUCCESS && key === 'vk') {
|
|
96
|
+
const asFieldsArgs = ['-k', `${outputPath}/${VK_FILENAME}`, '-o', `${outputPath}/${VK_FIELDS_FILENAME}`, '-v'];
|
|
97
|
+
result = await executeBB(pathToBB, `vk_as_fields`, asFieldsArgs, log);
|
|
98
|
+
}
|
|
99
|
+
const duration = timer.ms();
|
|
100
|
+
if (result.status == BB_RESULT.SUCCESS) {
|
|
101
|
+
return {
|
|
102
|
+
status: BB_RESULT.SUCCESS,
|
|
103
|
+
duration,
|
|
104
|
+
pkPath: key === 'pk' ? outputPath : undefined,
|
|
105
|
+
vkPath: key === 'vk' ? outputPath : undefined,
|
|
106
|
+
proofPath: undefined,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
110
|
+
return {
|
|
111
|
+
status: BB_RESULT.FAILURE,
|
|
112
|
+
reason: `Failed to generate key. Exit code: ${result.exitCode}. Signal ${result.signal}.`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
if (!res) {
|
|
81
120
|
return {
|
|
82
121
|
status: BB_RESULT.ALREADY_PRESENT,
|
|
83
122
|
duration: 0,
|
|
84
123
|
pkPath: key === 'pk' ? outputPath : undefined,
|
|
85
124
|
vkPath: key === 'vk' ? outputPath : undefined,
|
|
86
|
-
proofPath: undefined,
|
|
87
125
|
};
|
|
88
126
|
}
|
|
89
|
-
|
|
127
|
+
return res;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Used for generating proofs of noir circuits.
|
|
131
|
+
* It is assumed that the working directory is a temporary and/or random directory used solely for generating this proof.
|
|
132
|
+
* @param pathToBB - The full path to the bb binary
|
|
133
|
+
* @param workingDirectory - A working directory for use by bb
|
|
134
|
+
* @param circuitName - An identifier for the circuit
|
|
135
|
+
* @param bytecode - The compiled circuit bytecode
|
|
136
|
+
* @param inputWitnessFile - The circuit input witness
|
|
137
|
+
* @param log - A logging function
|
|
138
|
+
* @returns An object containing a result indication, the location of the proof and the duration taken
|
|
139
|
+
*/
|
|
140
|
+
export async function generateProof(pathToBB, workingDirectory, circuitName, bytecode, inputWitnessFile, log) {
|
|
141
|
+
// Check that the working directory exists
|
|
142
|
+
try {
|
|
143
|
+
await fs.access(workingDirectory);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
return { status: BB_RESULT.FAILURE, reason: `Working directory ${workingDirectory} does not exist` };
|
|
147
|
+
}
|
|
148
|
+
// The bytecode is written to e.g. /workingDirectory/BaseParityArtifact-bytecode
|
|
149
|
+
const bytecodePath = `${workingDirectory}/${circuitName}-bytecode`;
|
|
150
|
+
// The proof is written to e.g. /workingDirectory/proof
|
|
151
|
+
const outputPath = `${workingDirectory}`;
|
|
90
152
|
const binaryPresent = await fs
|
|
91
153
|
.access(pathToBB, fs.constants.R_OK)
|
|
92
154
|
.then(_ => true)
|
|
@@ -94,37 +156,29 @@ export async function generateKeyForNoirCircuit(pathToBB, workingDirectory, circ
|
|
|
94
156
|
if (!binaryPresent) {
|
|
95
157
|
return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
|
|
96
158
|
}
|
|
97
|
-
// We are now going to generate the key
|
|
98
159
|
try {
|
|
99
160
|
// Write the bytecode to the working directory
|
|
100
161
|
await fs.writeFile(bytecodePath, bytecode);
|
|
101
|
-
|
|
102
|
-
const args = ['-o', outputPath, '-b', bytecodePath];
|
|
162
|
+
const args = ['-o', outputPath, '-b', bytecodePath, '-w', inputWitnessFile, '-v'];
|
|
103
163
|
const timer = new Timer();
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
result = await executeBB(pathToBB, `vk_as_fields`, asFieldsArgs, log);
|
|
109
|
-
}
|
|
164
|
+
const logFunction = (message) => {
|
|
165
|
+
log(`${circuitName} BB out - ${message}`);
|
|
166
|
+
};
|
|
167
|
+
const result = await executeBB(pathToBB, 'prove_output_all', args, logFunction);
|
|
110
168
|
const duration = timer.ms();
|
|
111
|
-
// Cleanup the bytecode file
|
|
112
|
-
await fs.rm(bytecodePath, { force: true });
|
|
113
169
|
if (result.status == BB_RESULT.SUCCESS) {
|
|
114
|
-
// Store the bytecode hash so we don't need to regenerate at a later time
|
|
115
|
-
await fs.writeFile(bytecodeHashPath, bytecodeHash);
|
|
116
170
|
return {
|
|
117
171
|
status: BB_RESULT.SUCCESS,
|
|
118
172
|
duration,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
173
|
+
proofPath: `${outputPath}`,
|
|
174
|
+
pkPath: undefined,
|
|
175
|
+
vkPath: `${outputPath}`,
|
|
122
176
|
};
|
|
123
177
|
}
|
|
124
178
|
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
125
179
|
return {
|
|
126
180
|
status: BB_RESULT.FAILURE,
|
|
127
|
-
reason: `Failed to generate
|
|
181
|
+
reason: `Failed to generate proof. Exit code ${result.exitCode}. Signal ${result.signal}.`,
|
|
128
182
|
};
|
|
129
183
|
}
|
|
130
184
|
catch (error) {
|
|
@@ -132,17 +186,15 @@ export async function generateKeyForNoirCircuit(pathToBB, workingDirectory, circ
|
|
|
132
186
|
}
|
|
133
187
|
}
|
|
134
188
|
/**
|
|
135
|
-
* Used for generating proofs
|
|
189
|
+
* Used for generating AVM proofs.
|
|
136
190
|
* It is assumed that the working directory is a temporary and/or random directory used solely for generating this proof.
|
|
137
191
|
* @param pathToBB - The full path to the bb binary
|
|
138
192
|
* @param workingDirectory - A working directory for use by bb
|
|
139
|
-
* @param
|
|
140
|
-
* @param bytecode - The compiled circuit bytecode
|
|
141
|
-
* @param inputWitnessFile - The circuit input witness
|
|
193
|
+
* @param bytecode - The AVM bytecode for the public function to be proven (expected to be decompressed)
|
|
142
194
|
* @param log - A logging function
|
|
143
195
|
* @returns An object containing a result indication, the location of the proof and the duration taken
|
|
144
196
|
*/
|
|
145
|
-
export async function
|
|
197
|
+
export async function generateAvmProof(pathToBB, workingDirectory, input, log) {
|
|
146
198
|
// Check that the working directory exists
|
|
147
199
|
try {
|
|
148
200
|
await fs.access(workingDirectory);
|
|
@@ -150,36 +202,66 @@ export async function generateProof(pathToBB, workingDirectory, circuitName, byt
|
|
|
150
202
|
catch (error) {
|
|
151
203
|
return { status: BB_RESULT.FAILURE, reason: `Working directory ${workingDirectory} does not exist` };
|
|
152
204
|
}
|
|
153
|
-
//
|
|
154
|
-
const bytecodePath =
|
|
205
|
+
// Paths for the inputs
|
|
206
|
+
const bytecodePath = join(workingDirectory, 'avm_bytecode.bin');
|
|
207
|
+
const calldataPath = join(workingDirectory, 'avm_calldata.bin');
|
|
208
|
+
const publicInputsPath = join(workingDirectory, 'avm_public_inputs.bin');
|
|
209
|
+
const avmHintsPath = join(workingDirectory, 'avm_hints.bin');
|
|
155
210
|
// The proof is written to e.g. /workingDirectory/proof
|
|
156
|
-
const outputPath =
|
|
157
|
-
const
|
|
158
|
-
.access(
|
|
211
|
+
const outputPath = workingDirectory;
|
|
212
|
+
const filePresent = async (file) => await fs
|
|
213
|
+
.access(file, fs.constants.R_OK)
|
|
159
214
|
.then(_ => true)
|
|
160
215
|
.catch(_ => false);
|
|
216
|
+
const binaryPresent = await filePresent(pathToBB);
|
|
161
217
|
if (!binaryPresent) {
|
|
162
218
|
return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
|
|
163
219
|
}
|
|
164
220
|
try {
|
|
165
|
-
// Write the
|
|
166
|
-
await fs.writeFile(bytecodePath, bytecode);
|
|
167
|
-
|
|
221
|
+
// Write the inputs to the working directory.
|
|
222
|
+
await fs.writeFile(bytecodePath, input.bytecode);
|
|
223
|
+
if (!filePresent(bytecodePath)) {
|
|
224
|
+
return { status: BB_RESULT.FAILURE, reason: `Could not write bytecode at ${bytecodePath}` };
|
|
225
|
+
}
|
|
226
|
+
await fs.writeFile(calldataPath, input.calldata.map(fr => fr.toBuffer()));
|
|
227
|
+
if (!filePresent(calldataPath)) {
|
|
228
|
+
return { status: BB_RESULT.FAILURE, reason: `Could not write calldata at ${calldataPath}` };
|
|
229
|
+
}
|
|
230
|
+
// public inputs are used directly as a vector of fields in C++,
|
|
231
|
+
// so we serialize them as such here instead of just using toBuffer
|
|
232
|
+
await fs.writeFile(publicInputsPath, input.publicInputs.toFields().map(fr => fr.toBuffer()));
|
|
233
|
+
if (!filePresent(publicInputsPath)) {
|
|
234
|
+
return { status: BB_RESULT.FAILURE, reason: `Could not write publicInputs at ${publicInputsPath}` };
|
|
235
|
+
}
|
|
236
|
+
await fs.writeFile(avmHintsPath, input.avmHints.toBuffer());
|
|
237
|
+
if (!filePresent(avmHintsPath)) {
|
|
238
|
+
return { status: BB_RESULT.FAILURE, reason: `Could not write avmHints at ${avmHintsPath}` };
|
|
239
|
+
}
|
|
240
|
+
const args = [
|
|
241
|
+
'--avm-bytecode',
|
|
242
|
+
bytecodePath,
|
|
243
|
+
'--avm-calldata',
|
|
244
|
+
calldataPath,
|
|
245
|
+
'--avm-public-inputs',
|
|
246
|
+
publicInputsPath,
|
|
247
|
+
'--avm-hints',
|
|
248
|
+
avmHintsPath,
|
|
249
|
+
'-o',
|
|
250
|
+
outputPath,
|
|
251
|
+
];
|
|
168
252
|
const timer = new Timer();
|
|
169
253
|
const logFunction = (message) => {
|
|
170
|
-
log(
|
|
254
|
+
log(`AvmCircuit (prove) BB out - ${message}`);
|
|
171
255
|
};
|
|
172
|
-
const result = await executeBB(pathToBB, '
|
|
256
|
+
const result = await executeBB(pathToBB, 'avm_prove', args, logFunction);
|
|
173
257
|
const duration = timer.ms();
|
|
174
|
-
// cleanup the bytecode
|
|
175
|
-
await fs.rm(bytecodePath, { force: true });
|
|
176
258
|
if (result.status == BB_RESULT.SUCCESS) {
|
|
177
259
|
return {
|
|
178
260
|
status: BB_RESULT.SUCCESS,
|
|
179
261
|
duration,
|
|
180
|
-
proofPath:
|
|
262
|
+
proofPath: join(outputPath, PROOF_FILENAME),
|
|
181
263
|
pkPath: undefined,
|
|
182
|
-
vkPath:
|
|
264
|
+
vkPath: outputPath,
|
|
183
265
|
};
|
|
184
266
|
}
|
|
185
267
|
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
@@ -201,6 +283,29 @@ export async function generateProof(pathToBB, workingDirectory, circuitName, byt
|
|
|
201
283
|
* @returns An object containing a result indication and duration taken
|
|
202
284
|
*/
|
|
203
285
|
export async function verifyProof(pathToBB, proofFullPath, verificationKeyPath, log) {
|
|
286
|
+
return await verifyProofInternal(pathToBB, proofFullPath, verificationKeyPath, 'verify', log);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Used for verifying proofs of the AVM
|
|
290
|
+
* @param pathToBB - The full path to the bb binary
|
|
291
|
+
* @param proofFullPath - The full path to the proof to be verified
|
|
292
|
+
* @param verificationKeyPath - The full path to the circuit verification key
|
|
293
|
+
* @param log - A logging function
|
|
294
|
+
* @returns An object containing a result indication and duration taken
|
|
295
|
+
*/
|
|
296
|
+
export async function verifyAvmProof(pathToBB, proofFullPath, verificationKeyPath, log) {
|
|
297
|
+
return await verifyProofInternal(pathToBB, proofFullPath, verificationKeyPath, 'avm_verify', log);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Used for verifying proofs with BB
|
|
301
|
+
* @param pathToBB - The full path to the bb binary
|
|
302
|
+
* @param proofFullPath - The full path to the proof to be verified
|
|
303
|
+
* @param verificationKeyPath - The full path to the circuit verification key
|
|
304
|
+
* @param command - The BB command to execute (verify/avm_verify)
|
|
305
|
+
* @param log - A logging function
|
|
306
|
+
* @returns An object containing a result indication and duration taken
|
|
307
|
+
*/
|
|
308
|
+
async function verifyProofInternal(pathToBB, proofFullPath, verificationKeyPath, command, log) {
|
|
204
309
|
const binaryPresent = await fs
|
|
205
310
|
.access(pathToBB, fs.constants.R_OK)
|
|
206
311
|
.then(_ => true)
|
|
@@ -211,7 +316,7 @@ export async function verifyProof(pathToBB, proofFullPath, verificationKeyPath,
|
|
|
211
316
|
try {
|
|
212
317
|
const args = ['-p', proofFullPath, '-k', verificationKeyPath];
|
|
213
318
|
const timer = new Timer();
|
|
214
|
-
const result = await executeBB(pathToBB,
|
|
319
|
+
const result = await executeBB(pathToBB, command, args, log);
|
|
215
320
|
const duration = timer.ms();
|
|
216
321
|
if (result.status == BB_RESULT.SUCCESS) {
|
|
217
322
|
return { status: BB_RESULT.SUCCESS, duration };
|
|
@@ -265,10 +370,11 @@ export async function writeVkAsFields(pathToBB, verificationKeyPath, verificatio
|
|
|
265
370
|
* @param pathToBB - The full path to the bb binary
|
|
266
371
|
* @param proofPath - The directory containing the binary proof
|
|
267
372
|
* @param proofFileName - The filename of the proof
|
|
373
|
+
* @param vkFileName - The filename of the verification key
|
|
268
374
|
* @param log - A logging function
|
|
269
375
|
* @returns An object containing a result indication and duration taken
|
|
270
376
|
*/
|
|
271
|
-
export async function writeProofAsFields(pathToBB, proofPath, proofFileName, log) {
|
|
377
|
+
export async function writeProofAsFields(pathToBB, proofPath, proofFileName, vkFilePath, log) {
|
|
272
378
|
const binaryPresent = await fs
|
|
273
379
|
.access(pathToBB, fs.constants.R_OK)
|
|
274
380
|
.then(_ => true)
|
|
@@ -277,7 +383,7 @@ export async function writeProofAsFields(pathToBB, proofPath, proofFileName, log
|
|
|
277
383
|
return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
|
|
278
384
|
}
|
|
279
385
|
try {
|
|
280
|
-
const args = ['-p', `${proofPath}/${proofFileName}`, '-v'];
|
|
386
|
+
const args = ['-p', `${proofPath}/${proofFileName}`, '-k', vkFilePath, '-v'];
|
|
281
387
|
const timer = new Timer();
|
|
282
388
|
const result = await executeBB(pathToBB, 'proof_as_fields', args, log);
|
|
283
389
|
const duration = timer.ms();
|
|
@@ -294,4 +400,90 @@ export async function writeProofAsFields(pathToBB, proofPath, proofFileName, log
|
|
|
294
400
|
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
295
401
|
}
|
|
296
402
|
}
|
|
297
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYi9leGVjdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHaEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDO0FBRXpELE1BQU0sQ0FBTixJQUFZLFNBSVg7QUFKRCxXQUFZLFNBQVM7SUFDbkIsK0NBQU8sQ0FBQTtJQUNQLCtDQUFPLENBQUE7SUFDUCwrREFBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxTQUFTLEtBQVQsU0FBUyxRQUlwQjtBQXVCRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixJQUFjLEVBQ2QsTUFBYSxFQUNiLGVBQWUsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDO0lBRTNDLE9BQU8sSUFBSSxPQUFPLENBQWUsT0FBTyxDQUFDLEVBQUU7UUFDekMsdUJBQXVCO1FBQ3ZCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFDbEQsS0FBSyxFQUFFLE1BQU07U0FDZCxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsRUFBRSxDQUFDLE9B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
|
|
403
|
+
export async function generateContractForVerificationKey(pathToBB, vkFilePath, contractPath, log) {
|
|
404
|
+
const binaryPresent = await fs
|
|
405
|
+
.access(pathToBB, fs.constants.R_OK)
|
|
406
|
+
.then(_ => true)
|
|
407
|
+
.catch(_ => false);
|
|
408
|
+
if (!binaryPresent) {
|
|
409
|
+
return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
|
|
410
|
+
}
|
|
411
|
+
const outputDir = dirname(contractPath);
|
|
412
|
+
const contractName = basename(contractPath);
|
|
413
|
+
// cache contract generation based on vk file and contract name
|
|
414
|
+
const cacheKey = sha256(Buffer.concat([Buffer.from(contractName), await fs.readFile(vkFilePath)]));
|
|
415
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
416
|
+
const res = await fsCache(outputDir, cacheKey, log, false, async () => {
|
|
417
|
+
try {
|
|
418
|
+
const args = ['-k', vkFilePath, '-o', contractPath, '-v'];
|
|
419
|
+
const timer = new Timer();
|
|
420
|
+
const result = await executeBB(pathToBB, 'contract', args, log);
|
|
421
|
+
const duration = timer.ms();
|
|
422
|
+
if (result.status == BB_RESULT.SUCCESS) {
|
|
423
|
+
return { status: BB_RESULT.SUCCESS, duration, contractPath };
|
|
424
|
+
}
|
|
425
|
+
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
426
|
+
return {
|
|
427
|
+
status: BB_RESULT.FAILURE,
|
|
428
|
+
reason: `Failed to write verifier contract. Exit code ${result.exitCode}. Signal ${result.signal}.`,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
if (!res) {
|
|
436
|
+
return {
|
|
437
|
+
status: BB_RESULT.ALREADY_PRESENT,
|
|
438
|
+
duration: 0,
|
|
439
|
+
contractPath,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
return res;
|
|
443
|
+
}
|
|
444
|
+
export async function generateContractForCircuit(pathToBB, workingDirectory, circuitName, compiledCircuit, contractName, log, force = false) {
|
|
445
|
+
const vkResult = await generateKeyForNoirCircuit(pathToBB, workingDirectory, circuitName, compiledCircuit, 'vk', log, force);
|
|
446
|
+
if (vkResult.status === BB_RESULT.FAILURE) {
|
|
447
|
+
return vkResult;
|
|
448
|
+
}
|
|
449
|
+
return generateContractForVerificationKey(pathToBB, join(vkResult.vkPath, VK_FILENAME), join(workingDirectory, 'contract', circuitName, contractName), log);
|
|
450
|
+
}
|
|
451
|
+
const CACHE_FILENAME = '.cache';
|
|
452
|
+
async function fsCache(dir, expectedCacheKey, logger, force, action) {
|
|
453
|
+
const cacheFilePath = join(dir, CACHE_FILENAME);
|
|
454
|
+
let run;
|
|
455
|
+
if (force) {
|
|
456
|
+
run = true;
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
try {
|
|
460
|
+
run = !expectedCacheKey.equals(await fs.readFile(cacheFilePath));
|
|
461
|
+
}
|
|
462
|
+
catch (err) {
|
|
463
|
+
if (err && 'code' in err && err.code === 'ENOENT') {
|
|
464
|
+
// cache file doesn't exist, swallow error and run
|
|
465
|
+
run = true;
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
throw err;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
let res;
|
|
473
|
+
if (run) {
|
|
474
|
+
logger(`Cache miss or forced run. Running operation in ${dir}...`);
|
|
475
|
+
res = await action();
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
logger(`Cache hit. Skipping operation in ${dir}...`);
|
|
479
|
+
}
|
|
480
|
+
try {
|
|
481
|
+
await fs.writeFile(cacheFilePath, expectedCacheKey);
|
|
482
|
+
}
|
|
483
|
+
catch (err) {
|
|
484
|
+
logger(`Couldn't write cache data to ${cacheFilePath}. Skipping cache...`);
|
|
485
|
+
// ignore
|
|
486
|
+
}
|
|
487
|
+
return res;
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYi9leGVjdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHaEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFDbkQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUN0QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxtQkFBbUIsQ0FBQztBQUV6RCxNQUFNLENBQU4sSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ25CLCtDQUFPLENBQUE7SUFDUCwrQ0FBTyxDQUFBO0lBQ1AsK0RBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSlcsU0FBUyxLQUFULFNBQVMsUUFJcEI7QUE4QkQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUN2QixRQUFnQixFQUNoQixPQUFlLEVBQ2YsSUFBYyxFQUNkLE1BQWEsRUFDYixlQUFlLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUUzQyxPQUFPLElBQUksT0FBTyxDQUFlLE9BQU8sQ0FBQyxFQUFFO1FBQ3pDLHVCQUF1QjtRQUN2QixNQUFNLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLEdBQUcscUJBQXFCLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQzFFLE1B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
|
package/dest/config.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;CAC9B"}
|
package/dest/config.js
ADDED
package/dest/index.d.ts
CHANGED
package/dest/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC"}
|
package/dest/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export * from './prover/index.js';
|
|
2
2
|
export * from './test/index.js';
|
|
3
|
-
|
|
3
|
+
export * from './verifier/index.js';
|
|
4
|
+
export * from './config.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxhQUFhLENBQUMifQ==
|
|
@@ -8,5 +8,6 @@ export type PublicKernelProvingOps = {
|
|
|
8
8
|
convertOutputs: (outputs: WitnessMap) => PublicKernelCircuitPublicInputs;
|
|
9
9
|
};
|
|
10
10
|
export type KernelTypeToArtifact = Record<PublicKernelType, PublicKernelProvingOps | undefined>;
|
|
11
|
+
export declare const SimulatedPublicKernelArtifactMapping: KernelTypeToArtifact;
|
|
11
12
|
export declare const PublicKernelArtifactMapping: KernelTypeToArtifact;
|
|
12
13
|
//# sourceMappingURL=mappings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mappings.d.ts","sourceRoot":"","sources":["../../src/mappings/mappings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,gCAAgC,EAAE,KAAK,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACjH,OAAO,EACL,KAAK,sBAAsB,
|
|
1
|
+
{"version":3,"file":"mappings.d.ts","sourceRoot":"","sources":["../../src/mappings/mappings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,gCAAgC,EAAE,KAAK,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACjH,OAAO,EACL,KAAK,sBAAsB,EAa5B,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,aAAa,EAAE,CAAC,MAAM,EAAE,gCAAgC,KAAK,UAAU,CAAC;IACxE,cAAc,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,+BAA+B,CAAC;CAC1E,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,SAAS,CAAC,CAAC;AAEhG,eAAO,MAAM,oCAAoC,EAAE,oBAkBlD,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,oBAkBzC,CAAC"}
|
|
@@ -1,22 +1,41 @@
|
|
|
1
1
|
import { PublicKernelType } from '@aztec/circuit-types';
|
|
2
|
-
import {
|
|
2
|
+
import { convertPublicInnerInputsToWitnessMap, convertPublicInnerOutputFromWitnessMap, convertPublicSetupInputsToWitnessMap, convertPublicSetupOutputFromWitnessMap, convertPublicTeardownInputsToWitnessMap, convertPublicTeardownOutputFromWitnessMap, convertSimulatedPublicInnerInputsToWitnessMap, convertSimulatedPublicInnerOutputFromWitnessMap, convertSimulatedPublicSetupInputsToWitnessMap, convertSimulatedPublicSetupOutputFromWitnessMap, convertSimulatedPublicTeardownInputsToWitnessMap, convertSimulatedPublicTeardownOutputFromWitnessMap, } from '@aztec/noir-protocol-circuits-types';
|
|
3
|
+
export const SimulatedPublicKernelArtifactMapping = {
|
|
4
|
+
[PublicKernelType.NON_PUBLIC]: undefined,
|
|
5
|
+
[PublicKernelType.APP_LOGIC]: {
|
|
6
|
+
artifact: 'PublicKernelAppLogicArtifact',
|
|
7
|
+
convertInputs: convertSimulatedPublicInnerInputsToWitnessMap,
|
|
8
|
+
convertOutputs: convertSimulatedPublicInnerOutputFromWitnessMap,
|
|
9
|
+
},
|
|
10
|
+
[PublicKernelType.SETUP]: {
|
|
11
|
+
artifact: 'PublicKernelSetupArtifact',
|
|
12
|
+
convertInputs: convertSimulatedPublicSetupInputsToWitnessMap,
|
|
13
|
+
convertOutputs: convertSimulatedPublicSetupOutputFromWitnessMap,
|
|
14
|
+
},
|
|
15
|
+
[PublicKernelType.TEARDOWN]: {
|
|
16
|
+
artifact: 'PublicKernelTeardownArtifact',
|
|
17
|
+
convertInputs: convertSimulatedPublicTeardownInputsToWitnessMap,
|
|
18
|
+
convertOutputs: convertSimulatedPublicTeardownOutputFromWitnessMap,
|
|
19
|
+
},
|
|
20
|
+
[PublicKernelType.TAIL]: undefined,
|
|
21
|
+
};
|
|
3
22
|
export const PublicKernelArtifactMapping = {
|
|
4
23
|
[PublicKernelType.NON_PUBLIC]: undefined,
|
|
5
24
|
[PublicKernelType.APP_LOGIC]: {
|
|
6
25
|
artifact: 'PublicKernelAppLogicArtifact',
|
|
7
|
-
convertInputs:
|
|
8
|
-
convertOutputs:
|
|
26
|
+
convertInputs: convertPublicInnerInputsToWitnessMap,
|
|
27
|
+
convertOutputs: convertPublicInnerOutputFromWitnessMap,
|
|
9
28
|
},
|
|
10
29
|
[PublicKernelType.SETUP]: {
|
|
11
30
|
artifact: 'PublicKernelSetupArtifact',
|
|
12
|
-
convertInputs:
|
|
13
|
-
convertOutputs:
|
|
31
|
+
convertInputs: convertPublicSetupInputsToWitnessMap,
|
|
32
|
+
convertOutputs: convertPublicSetupOutputFromWitnessMap,
|
|
14
33
|
},
|
|
15
34
|
[PublicKernelType.TEARDOWN]: {
|
|
16
35
|
artifact: 'PublicKernelTeardownArtifact',
|
|
17
|
-
convertInputs:
|
|
18
|
-
convertOutputs:
|
|
36
|
+
convertInputs: convertPublicTeardownInputsToWitnessMap,
|
|
37
|
+
convertOutputs: convertPublicTeardownOutputFromWitnessMap,
|
|
19
38
|
},
|
|
20
39
|
[PublicKernelType.TAIL]: undefined,
|
|
21
40
|
};
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFwcGluZ3MvbWFwcGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUVMLG9DQUFvQyxFQUNwQyxzQ0FBc0MsRUFDdEMsb0NBQW9DLEVBQ3BDLHNDQUFzQyxFQUN0Qyx1Q0FBdUMsRUFDdkMseUNBQXlDLEVBQ3pDLDZDQUE2QyxFQUM3QywrQ0FBK0MsRUFDL0MsNkNBQTZDLEVBQzdDLCtDQUErQyxFQUMvQyxnREFBZ0QsRUFDaEQsa0RBQWtELEdBQ25ELE1BQU0scUNBQXFDLENBQUM7QUFZN0MsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQXlCO0lBQ3hFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsU0FBUztJQUN4QyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzVCLFFBQVEsRUFBRSw4QkFBOEI7UUFDeEMsYUFBYSxFQUFFLDZDQUE2QztRQUM1RCxjQUFjLEVBQUUsK0NBQStDO0tBQ2hFO0lBQ0QsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN4QixRQUFRLEVBQUUsMkJBQTJCO1FBQ3JDLGFBQWEsRUFBRSw2Q0FBNkM7UUFDNUQsY0FBYyxFQUFFLCtDQUErQztLQUNoRTtJQUNELENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDM0IsUUFBUSxFQUFFLDhCQUE4QjtRQUN4QyxhQUFhLEVBQUUsZ0RBQWdEO1FBQy9ELGNBQWMsRUFBRSxrREFBa0Q7S0FDbkU7SUFDRCxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVM7Q0FDbkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUF5QjtJQUMvRCxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVM7SUFDeEMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUM1QixRQUFRLEVBQUUsOEJBQThCO1FBQ3hDLGFBQWEsRUFBRSxvQ0FBb0M7UUFDbkQsY0FBYyxFQUFFLHNDQUFzQztLQUN2RDtJQUNELENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEIsUUFBUSxFQUFFLDJCQUEyQjtRQUNyQyxhQUFhLEVBQUUsb0NBQW9DO1FBQ25ELGNBQWMsRUFBRSxzQ0FBc0M7S0FDdkQ7SUFDRCxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQzNCLFFBQVEsRUFBRSw4QkFBOEI7UUFDeEMsYUFBYSxFQUFFLHVDQUF1QztRQUN0RCxjQUFjLEVBQUUseUNBQXlDO0tBQzFEO0lBQ0QsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTO0NBQ25DLENBQUMifQ==
|