create-fhevm-example 1.3.1 → 1.4.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/contracts/advanced/BlindAuction.sol +255 -0
- package/contracts/advanced/EncryptedEscrow.sol +315 -0
- package/contracts/advanced/HiddenVoting.sol +231 -0
- package/contracts/advanced/PrivateKYC.sol +309 -0
- package/contracts/advanced/PrivatePayroll.sol +285 -0
- package/contracts/basic/decryption/PublicDecryptMultipleValues.sol +160 -0
- package/contracts/basic/decryption/PublicDecryptSingleValue.sol +142 -0
- package/contracts/basic/decryption/UserDecryptMultipleValues.sol +61 -0
- package/contracts/basic/decryption/UserDecryptSingleValue.sol +59 -0
- package/contracts/basic/encryption/EncryptMultipleValues.sol +72 -0
- package/contracts/basic/encryption/EncryptSingleValue.sol +44 -0
- package/contracts/basic/encryption/FHECounter.sol +54 -0
- package/contracts/basic/fhe-operations/FHEAdd.sol +51 -0
- package/contracts/basic/fhe-operations/FHEArithmetic.sol +99 -0
- package/contracts/basic/fhe-operations/FHEComparison.sol +116 -0
- package/contracts/basic/fhe-operations/FHEIfThenElse.sol +53 -0
- package/contracts/concepts/FHEAccessControl.sol +94 -0
- package/contracts/concepts/FHEAntiPatterns.sol +329 -0
- package/contracts/concepts/FHEHandles.sol +128 -0
- package/contracts/concepts/FHEInputProof.sol +104 -0
- package/contracts/gaming/EncryptedLottery.sol +298 -0
- package/contracts/gaming/EncryptedPoker.sol +337 -0
- package/contracts/gaming/RockPaperScissors.sol +213 -0
- package/contracts/openzeppelin/ERC7984.sol +85 -0
- package/contracts/openzeppelin/ERC7984ERC20Wrapper.sol +43 -0
- package/contracts/openzeppelin/SwapERC7984ToERC20.sol +110 -0
- package/contracts/openzeppelin/SwapERC7984ToERC7984.sol +48 -0
- package/contracts/openzeppelin/VestingWallet.sol +147 -0
- package/contracts/openzeppelin/mocks/ERC20Mock.sol +31 -0
- package/dist/scripts/commands/add-mode.d.ts.map +1 -0
- package/dist/scripts/{add-mode.js → commands/add-mode.js} +27 -61
- package/dist/scripts/commands/doctor.d.ts.map +1 -0
- package/dist/scripts/{doctor.js → commands/doctor.js} +2 -2
- package/dist/scripts/commands/generate-config.d.ts.map +1 -0
- package/dist/scripts/{generate-config.js → commands/generate-config.js} +3 -10
- package/dist/scripts/commands/generate-docs.d.ts.map +1 -0
- package/dist/scripts/{generate-docs.js → commands/generate-docs.js} +4 -3
- package/dist/scripts/commands/maintenance.d.ts.map +1 -0
- package/dist/scripts/{maintenance.js → commands/maintenance.js} +11 -10
- package/dist/scripts/index.js +63 -59
- package/dist/scripts/{builders.d.ts → shared/builders.d.ts} +2 -2
- package/dist/scripts/shared/builders.d.ts.map +1 -0
- package/dist/scripts/{builders.js → shared/builders.js} +49 -30
- package/dist/scripts/{config.d.ts → shared/config.d.ts} +0 -2
- package/dist/scripts/shared/config.d.ts.map +1 -0
- package/dist/scripts/{config.js → shared/config.js} +48 -59
- package/dist/scripts/shared/generators.d.ts +42 -0
- package/dist/scripts/shared/generators.d.ts.map +1 -0
- package/dist/scripts/{utils.js → shared/generators.js} +34 -271
- package/dist/scripts/shared/ui.d.ts.map +1 -0
- package/dist/scripts/{ui.js → shared/ui.js} +3 -2
- package/dist/scripts/{utils.d.ts → shared/utils.d.ts} +4 -27
- package/dist/scripts/shared/utils.d.ts.map +1 -0
- package/dist/scripts/shared/utils.js +228 -0
- package/fhevm-hardhat-template/.eslintignore +26 -0
- package/fhevm-hardhat-template/.eslintrc.yml +21 -0
- package/fhevm-hardhat-template/.github/workflows/main.yml +47 -0
- package/fhevm-hardhat-template/.github/workflows/manual-windows.yml +28 -0
- package/fhevm-hardhat-template/.github/workflows/manual.yml +28 -0
- package/fhevm-hardhat-template/.prettierignore +25 -0
- package/fhevm-hardhat-template/.prettierrc.yml +15 -0
- package/fhevm-hardhat-template/.solcover.js +4 -0
- package/fhevm-hardhat-template/.solhint.json +12 -0
- package/fhevm-hardhat-template/.solhintignore +3 -0
- package/fhevm-hardhat-template/.vscode/extensions.json +3 -0
- package/fhevm-hardhat-template/.vscode/settings.json +9 -0
- package/fhevm-hardhat-template/LICENSE +33 -0
- package/fhevm-hardhat-template/README.md +110 -0
- package/fhevm-hardhat-template/contracts/FHECounter.sol +46 -0
- package/fhevm-hardhat-template/deploy/deploy.ts +17 -0
- package/fhevm-hardhat-template/hardhat.config.ts +90 -0
- package/fhevm-hardhat-template/package-lock.json +10405 -0
- package/fhevm-hardhat-template/package.json +104 -0
- package/fhevm-hardhat-template/tasks/FHECounter.ts +184 -0
- package/fhevm-hardhat-template/tasks/accounts.ts +9 -0
- package/fhevm-hardhat-template/test/FHECounter.ts +104 -0
- package/fhevm-hardhat-template/test/FHECounterSepolia.ts +104 -0
- package/fhevm-hardhat-template/tsconfig.json +23 -0
- package/package.json +13 -10
- package/test/advanced/BlindAuction.ts +246 -0
- package/test/advanced/EncryptedEscrow.ts +295 -0
- package/test/advanced/HiddenVoting.ts +268 -0
- package/test/advanced/PrivateKYC.ts +382 -0
- package/test/advanced/PrivatePayroll.ts +253 -0
- package/test/basic/decryption/PublicDecryptMultipleValues.ts +254 -0
- package/test/basic/decryption/PublicDecryptSingleValue.ts +264 -0
- package/test/basic/decryption/UserDecryptMultipleValues.ts +107 -0
- package/test/basic/decryption/UserDecryptSingleValue.ts +97 -0
- package/test/basic/encryption/EncryptMultipleValues.ts +110 -0
- package/test/basic/encryption/EncryptSingleValue.ts +124 -0
- package/test/basic/encryption/FHECounter.ts +112 -0
- package/test/basic/fhe-operations/FHEAdd.ts +97 -0
- package/test/basic/fhe-operations/FHEArithmetic.ts +161 -0
- package/test/basic/fhe-operations/FHEComparison.ts +167 -0
- package/test/basic/fhe-operations/FHEIfThenElse.ts +97 -0
- package/test/concepts/FHEAccessControl.ts +154 -0
- package/test/concepts/FHEAntiPatterns.ts +111 -0
- package/test/concepts/FHEHandles.ts +156 -0
- package/test/concepts/FHEInputProof.ts +151 -0
- package/test/gaming/EncryptedLottery.ts +214 -0
- package/test/gaming/EncryptedPoker.ts +349 -0
- package/test/gaming/RockPaperScissors.ts +205 -0
- package/test/openzeppelin/ERC7984.ts +142 -0
- package/test/openzeppelin/ERC7984ERC20Wrapper.ts +71 -0
- package/test/openzeppelin/SwapERC7984ToERC20.ts +76 -0
- package/test/openzeppelin/SwapERC7984ToERC7984.ts +113 -0
- package/test/openzeppelin/VestingWallet.ts +89 -0
- package/dist/scripts/add-mode.d.ts.map +0 -1
- package/dist/scripts/builders.d.ts.map +0 -1
- package/dist/scripts/config.d.ts.map +0 -1
- package/dist/scripts/doctor.d.ts.map +0 -1
- package/dist/scripts/generate-config.d.ts.map +0 -1
- package/dist/scripts/generate-docs.d.ts.map +0 -1
- package/dist/scripts/maintenance.d.ts.map +0 -1
- package/dist/scripts/ui.d.ts.map +0 -1
- package/dist/scripts/utils.d.ts.map +0 -1
- /package/dist/scripts/{add-mode.d.ts → commands/add-mode.d.ts} +0 -0
- /package/dist/scripts/{doctor.d.ts → commands/doctor.d.ts} +0 -0
- /package/dist/scripts/{generate-config.d.ts → commands/generate-config.d.ts} +0 -0
- /package/dist/scripts/{generate-docs.d.ts → commands/generate-docs.d.ts} +0 -0
- /package/dist/scripts/{maintenance.d.ts → commands/maintenance.d.ts} +0 -0
- /package/dist/scripts/{ui.d.ts → shared/ui.d.ts} +0 -0
|
@@ -46,31 +46,39 @@ const fs = __importStar(require("fs"));
|
|
|
46
46
|
const path = __importStar(require("path"));
|
|
47
47
|
const config_1 = require("./config");
|
|
48
48
|
const utils_1 = require("./utils");
|
|
49
|
+
const generators_1 = require("./generators");
|
|
49
50
|
// =============================================================================
|
|
50
51
|
// Helper Functions
|
|
51
52
|
// =============================================================================
|
|
52
53
|
/**
|
|
53
|
-
*
|
|
54
|
+
* Copies contract dependencies from package to output directory
|
|
54
55
|
*/
|
|
55
|
-
|
|
56
|
+
function copyDependencies(dependencies, outputDir) {
|
|
57
|
+
const rootDir = (0, utils_1.getRootDir)();
|
|
56
58
|
for (const depPath of dependencies) {
|
|
59
|
+
const sourcePath = path.join(rootDir, depPath);
|
|
57
60
|
const relativePath = depPath.replace(/^contracts\//, "");
|
|
58
61
|
const depDestPath = path.join(outputDir, "contracts", relativePath);
|
|
59
62
|
const depDestDir = path.dirname(depDestPath);
|
|
60
63
|
if (!fs.existsSync(depDestDir)) {
|
|
61
64
|
fs.mkdirSync(depDestDir, { recursive: true });
|
|
62
65
|
}
|
|
63
|
-
|
|
66
|
+
if (fs.existsSync(sourcePath)) {
|
|
67
|
+
fs.copyFileSync(sourcePath, depDestPath);
|
|
68
|
+
}
|
|
64
69
|
}
|
|
65
70
|
}
|
|
66
71
|
/**
|
|
67
72
|
* Initializes git repository (optional, fails silently)
|
|
68
73
|
*/
|
|
69
|
-
|
|
74
|
+
function initGitRepo(outputDir) {
|
|
70
75
|
try {
|
|
71
|
-
|
|
76
|
+
require("child_process").execSync("git init", {
|
|
77
|
+
cwd: outputDir,
|
|
78
|
+
stdio: "ignore",
|
|
79
|
+
});
|
|
72
80
|
}
|
|
73
|
-
catch
|
|
81
|
+
catch {
|
|
74
82
|
// Git init is optional
|
|
75
83
|
}
|
|
76
84
|
}
|
|
@@ -80,54 +88,65 @@ async function initGitRepo(outputDir) {
|
|
|
80
88
|
/**
|
|
81
89
|
* Creates a single example project from the template
|
|
82
90
|
*/
|
|
83
|
-
|
|
91
|
+
function createSingleExample(exampleName, outputDir) {
|
|
84
92
|
const example = config_1.EXAMPLES[exampleName];
|
|
85
93
|
if (!example) {
|
|
86
94
|
throw new Error(`Unknown example: ${exampleName}`);
|
|
87
95
|
}
|
|
88
|
-
const
|
|
96
|
+
const rootDir = (0, utils_1.getRootDir)();
|
|
97
|
+
const templateDir = (0, utils_1.getTemplateDir)();
|
|
89
98
|
const contractName = (0, utils_1.getContractName)(example.contract);
|
|
90
99
|
if (!contractName) {
|
|
91
100
|
throw new Error("Could not extract contract name");
|
|
92
101
|
}
|
|
93
102
|
// 1. Copy template and clean up
|
|
94
103
|
(0, utils_1.copyDirectoryRecursive)(templateDir, outputDir);
|
|
95
|
-
(0,
|
|
96
|
-
// 2.
|
|
97
|
-
|
|
104
|
+
(0, generators_1.cleanupTemplate)(outputDir);
|
|
105
|
+
// 2. Copy example contract from package
|
|
106
|
+
const contractSource = path.join(rootDir, example.contract);
|
|
107
|
+
fs.copyFileSync(contractSource, path.join(outputDir, "contracts", `${contractName}.sol`));
|
|
108
|
+
// 3. Copy dependencies
|
|
98
109
|
if (example.dependencies) {
|
|
99
|
-
|
|
110
|
+
copyDependencies(example.dependencies, outputDir);
|
|
100
111
|
}
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
(
|
|
106
|
-
|
|
112
|
+
// 4. Copy test file
|
|
113
|
+
const testSource = path.join(rootDir, example.test);
|
|
114
|
+
fs.copyFileSync(testSource, path.join(outputDir, "test", path.basename(example.test)));
|
|
115
|
+
// 5. Update deploy script and package.json
|
|
116
|
+
fs.writeFileSync(path.join(outputDir, "deploy", "deploy.ts"), (0, generators_1.generateDeployScript)(contractName));
|
|
117
|
+
(0, generators_1.updateProjectPackageJson)(outputDir, `fhevm-example-${exampleName}`, example.description, example.npmDependencies);
|
|
118
|
+
initGitRepo(outputDir);
|
|
107
119
|
}
|
|
108
120
|
/**
|
|
109
121
|
* Creates a category project with multiple examples
|
|
110
122
|
*/
|
|
111
|
-
|
|
123
|
+
function createCategoryProject(categoryName, outputDir) {
|
|
112
124
|
const category = config_1.CATEGORIES[categoryName];
|
|
113
125
|
if (!category) {
|
|
114
126
|
throw new Error(`Unknown category: ${categoryName}`);
|
|
115
127
|
}
|
|
116
|
-
const
|
|
128
|
+
const rootDir = (0, utils_1.getRootDir)();
|
|
129
|
+
const templateDir = (0, utils_1.getTemplateDir)();
|
|
117
130
|
// 1. Copy template and clean up
|
|
118
131
|
(0, utils_1.copyDirectoryRecursive)(templateDir, outputDir);
|
|
119
|
-
(0,
|
|
120
|
-
// 2.
|
|
132
|
+
(0, generators_1.cleanupTemplate)(outputDir);
|
|
133
|
+
// 2. Copy all contracts and tests from package
|
|
121
134
|
for (const item of category.contracts) {
|
|
122
135
|
const contractName = (0, utils_1.getContractName)(item.sol);
|
|
123
136
|
if (contractName) {
|
|
124
|
-
|
|
137
|
+
const contractSource = path.join(rootDir, item.sol);
|
|
138
|
+
if (fs.existsSync(contractSource)) {
|
|
139
|
+
fs.copyFileSync(contractSource, path.join(outputDir, "contracts", `${contractName}.sol`));
|
|
140
|
+
}
|
|
125
141
|
}
|
|
126
142
|
if (item.test) {
|
|
127
|
-
|
|
143
|
+
const testSource = path.join(rootDir, item.test);
|
|
144
|
+
if (fs.existsSync(testSource)) {
|
|
145
|
+
fs.copyFileSync(testSource, path.join(outputDir, "test", path.basename(item.test)));
|
|
146
|
+
}
|
|
128
147
|
}
|
|
129
148
|
}
|
|
130
|
-
// 3. Collect and
|
|
149
|
+
// 3. Collect and copy dependencies
|
|
131
150
|
const allDependencies = new Set();
|
|
132
151
|
const allNpmDependencies = {};
|
|
133
152
|
for (const [exampleName, exampleConfig] of Object.entries(config_1.EXAMPLES)) {
|
|
@@ -146,11 +165,11 @@ async function createCategoryProject(categoryName, outputDir, tempRepoPath) {
|
|
|
146
165
|
}
|
|
147
166
|
}
|
|
148
167
|
if (allDependencies.size > 0) {
|
|
149
|
-
|
|
168
|
+
copyDependencies(Array.from(allDependencies), outputDir);
|
|
150
169
|
}
|
|
151
170
|
// 4. Update package.json
|
|
152
|
-
(0,
|
|
153
|
-
|
|
171
|
+
(0, generators_1.updateProjectPackageJson)(outputDir, `fhevm-examples-${categoryName}`, undefined, allNpmDependencies);
|
|
172
|
+
initGitRepo(outputDir);
|
|
154
173
|
}
|
|
155
174
|
// =============================================================================
|
|
156
175
|
// Specialized Builders
|
|
@@ -163,7 +182,7 @@ async function createLocalTestProject(exampleNames, outputDir) {
|
|
|
163
182
|
const templateDir = (0, utils_1.getTemplateDir)();
|
|
164
183
|
// 1. Setup base project from local template
|
|
165
184
|
(0, utils_1.copyDirectoryRecursive)(templateDir, outputDir);
|
|
166
|
-
(0,
|
|
185
|
+
(0, generators_1.cleanupTemplate)(outputDir);
|
|
167
186
|
const allNpmDeps = {};
|
|
168
187
|
const allContractDeps = new Set();
|
|
169
188
|
// 2. Copy local example files
|
|
@@ -203,7 +222,7 @@ async function createLocalTestProject(exampleNames, outputDir) {
|
|
|
203
222
|
}
|
|
204
223
|
}
|
|
205
224
|
// 4. Finalize project
|
|
206
|
-
(0,
|
|
225
|
+
(0, generators_1.updateProjectPackageJson)(outputDir, "fhevm-test-project", `Testing ${exampleNames.length} examples`, Object.keys(allNpmDeps).length > 0 ? allNpmDeps : undefined);
|
|
207
226
|
const typesPath = path.join(outputDir, "test", "types.ts");
|
|
208
227
|
if (!fs.existsSync(typesPath)) {
|
|
209
228
|
fs.writeFileSync(typesPath, utils_1.TEST_TYPES_CONTENT);
|
|
@@ -31,8 +31,6 @@ export interface CategoryConfig {
|
|
|
31
31
|
test?: string;
|
|
32
32
|
}>;
|
|
33
33
|
}
|
|
34
|
-
export declare const REPO_URL = "https://github.com/NecipAkgz/fhevm-example-factory";
|
|
35
|
-
export declare const REPO_BRANCH = "main";
|
|
36
34
|
export declare const EXAMPLES: Record<string, ExampleConfig>;
|
|
37
35
|
export declare const CATEGORIES: Record<string, CategoryConfig>;
|
|
38
36
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../scripts/shared/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,SAAS,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAMD,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA+QlD,CAAC;AAMF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAoJrD,CAAC;AAMF;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
|
@@ -6,18 +6,13 @@
|
|
|
6
6
|
* Run 'npm run generate:config' to regenerate
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.CATEGORIES = exports.EXAMPLES =
|
|
9
|
+
exports.CATEGORIES = exports.EXAMPLES = void 0;
|
|
10
10
|
exports.getExampleNames = getExampleNames;
|
|
11
11
|
exports.getCategoryNames = getCategoryNames;
|
|
12
12
|
exports.getExample = getExample;
|
|
13
13
|
exports.getCategory = getCategory;
|
|
14
14
|
exports.getDocsFileName = getDocsFileName;
|
|
15
15
|
// =============================================================================
|
|
16
|
-
// GitHub Repository Configuration
|
|
17
|
-
// =============================================================================
|
|
18
|
-
exports.REPO_URL = "https://github.com/NecipAkgz/fhevm-example-factory";
|
|
19
|
-
exports.REPO_BRANCH = "main";
|
|
20
|
-
// =============================================================================
|
|
21
16
|
// Example Configurations
|
|
22
17
|
// =============================================================================
|
|
23
18
|
exports.EXAMPLES = {
|
|
@@ -27,7 +22,7 @@ exports.EXAMPLES = {
|
|
|
27
22
|
description: "Blind Auction with encrypted bids - only the winning price is revealed",
|
|
28
23
|
category: "Advanced",
|
|
29
24
|
docsOutput: "docs/advanced/blind-auction.md",
|
|
30
|
-
title: "Blind Auction"
|
|
25
|
+
title: "Blind Auction",
|
|
31
26
|
},
|
|
32
27
|
"encrypted-escrow": {
|
|
33
28
|
contract: "contracts/advanced/EncryptedEscrow.sol",
|
|
@@ -35,7 +30,7 @@ exports.EXAMPLES = {
|
|
|
35
30
|
description: "Encrypted Escrow service - amounts hidden until release!",
|
|
36
31
|
category: "Advanced",
|
|
37
32
|
docsOutput: "docs/advanced/encrypted-escrow.md",
|
|
38
|
-
title: "Encrypted Escrow"
|
|
33
|
+
title: "Encrypted Escrow",
|
|
39
34
|
},
|
|
40
35
|
"hidden-voting": {
|
|
41
36
|
contract: "contracts/advanced/HiddenVoting.sol",
|
|
@@ -43,7 +38,7 @@ exports.EXAMPLES = {
|
|
|
43
38
|
description: "Hidden Voting with encrypted ballots and homomorphic tallying",
|
|
44
39
|
category: "Advanced",
|
|
45
40
|
docsOutput: "docs/advanced/hidden-voting.md",
|
|
46
|
-
title: "Hidden Voting"
|
|
41
|
+
title: "Hidden Voting",
|
|
47
42
|
},
|
|
48
43
|
"private-kyc": {
|
|
49
44
|
contract: "contracts/advanced/PrivateKYC.sol",
|
|
@@ -51,7 +46,7 @@ exports.EXAMPLES = {
|
|
|
51
46
|
description: "Private KYC - verify identity without revealing personal data!",
|
|
52
47
|
category: "Advanced",
|
|
53
48
|
docsOutput: "docs/advanced/private-kyc.md",
|
|
54
|
-
title: "Private KYC"
|
|
49
|
+
title: "Private KYC",
|
|
55
50
|
},
|
|
56
51
|
"private-payroll": {
|
|
57
52
|
contract: "contracts/advanced/PrivatePayroll.sol",
|
|
@@ -59,7 +54,7 @@ exports.EXAMPLES = {
|
|
|
59
54
|
description: "Private Payroll system - salaries stay encrypted, only employees see their own!",
|
|
60
55
|
category: "Advanced",
|
|
61
56
|
docsOutput: "docs/advanced/private-payroll.md",
|
|
62
|
-
title: "Private Payroll"
|
|
57
|
+
title: "Private Payroll",
|
|
63
58
|
},
|
|
64
59
|
"public-decrypt-multiple-values": {
|
|
65
60
|
contract: "contracts/basic/decryption/PublicDecryptMultipleValues.sol",
|
|
@@ -67,7 +62,7 @@ exports.EXAMPLES = {
|
|
|
67
62
|
description: "Implements a simple 8-sided Die Roll game demonstrating public, permissionless decryption",
|
|
68
63
|
category: "Basic - Decryption",
|
|
69
64
|
docsOutput: "docs/basic/decryption/public-decrypt-multiple-values.md",
|
|
70
|
-
title: "Public Decrypt Multiple Values"
|
|
65
|
+
title: "Public Decrypt Multiple Values",
|
|
71
66
|
},
|
|
72
67
|
"public-decrypt-single-value": {
|
|
73
68
|
contract: "contracts/basic/decryption/PublicDecryptSingleValue.sol",
|
|
@@ -75,7 +70,7 @@ exports.EXAMPLES = {
|
|
|
75
70
|
description: "Implements a simple Heads or Tails game demonstrating public, permissionless decryption",
|
|
76
71
|
category: "Basic - Decryption",
|
|
77
72
|
docsOutput: "docs/basic/decryption/public-decrypt-single-value.md",
|
|
78
|
-
title: "Public Decrypt Single Value"
|
|
73
|
+
title: "Public Decrypt Single Value",
|
|
79
74
|
},
|
|
80
75
|
"user-decrypt-multiple-values": {
|
|
81
76
|
contract: "contracts/basic/decryption/UserDecryptMultipleValues.sol",
|
|
@@ -83,7 +78,7 @@ exports.EXAMPLES = {
|
|
|
83
78
|
description: "Demonstrates user decryption of multiple encrypted values",
|
|
84
79
|
category: "Basic - Decryption",
|
|
85
80
|
docsOutput: "docs/basic/decryption/user-decrypt-multiple-values.md",
|
|
86
|
-
title: "User Decrypt Multiple Values"
|
|
81
|
+
title: "User Decrypt Multiple Values",
|
|
87
82
|
},
|
|
88
83
|
"user-decrypt-single-value": {
|
|
89
84
|
contract: "contracts/basic/decryption/UserDecryptSingleValue.sol",
|
|
@@ -91,7 +86,7 @@ exports.EXAMPLES = {
|
|
|
91
86
|
description: "Demonstrates the FHE decryption mechanism and highlights common pitfalls",
|
|
92
87
|
category: "Basic - Decryption",
|
|
93
88
|
docsOutput: "docs/basic/decryption/user-decrypt-single-value.md",
|
|
94
|
-
title: "User Decrypt Single Value"
|
|
89
|
+
title: "User Decrypt Single Value",
|
|
95
90
|
},
|
|
96
91
|
"encrypt-multiple-values": {
|
|
97
92
|
contract: "contracts/basic/encryption/EncryptMultipleValues.sol",
|
|
@@ -99,7 +94,7 @@ exports.EXAMPLES = {
|
|
|
99
94
|
description: "Encrypting and handling multiple values in a single transaction efficiently.",
|
|
100
95
|
category: "Basic - Encryption",
|
|
101
96
|
docsOutput: "docs/basic/encryption/encrypt-multiple-values.md",
|
|
102
|
-
title: "Encrypt Multiple Values"
|
|
97
|
+
title: "Encrypt Multiple Values",
|
|
103
98
|
},
|
|
104
99
|
"encrypt-single-value": {
|
|
105
100
|
contract: "contracts/basic/encryption/EncryptSingleValue.sol",
|
|
@@ -107,7 +102,7 @@ exports.EXAMPLES = {
|
|
|
107
102
|
description: "FHE encryption mechanism with single values, including common pitfalls and best practices for developers.",
|
|
108
103
|
category: "Basic - Encryption",
|
|
109
104
|
docsOutput: "docs/basic/encryption/encrypt-single-value.md",
|
|
110
|
-
title: "Encrypt Single Value"
|
|
105
|
+
title: "Encrypt Single Value",
|
|
111
106
|
},
|
|
112
107
|
"fhe-counter": {
|
|
113
108
|
contract: "contracts/basic/encryption/FHECounter.sol",
|
|
@@ -115,7 +110,7 @@ exports.EXAMPLES = {
|
|
|
115
110
|
description: "Confidential counter implementation using FHEVM, compared with a standard counter to highlight encryption benefits.",
|
|
116
111
|
category: "Basic - Encryption",
|
|
117
112
|
docsOutput: "docs/basic/encryption/fhe-counter.md",
|
|
118
|
-
title: "FHE Counter"
|
|
113
|
+
title: "FHE Counter",
|
|
119
114
|
},
|
|
120
115
|
"fhe-add": {
|
|
121
116
|
contract: "contracts/basic/fhe-operations/FHEAdd.sol",
|
|
@@ -123,7 +118,7 @@ exports.EXAMPLES = {
|
|
|
123
118
|
description: "Simple example: adding two encrypted values (a + b)",
|
|
124
119
|
category: "Basic - FHE Operations",
|
|
125
120
|
docsOutput: "docs/basic/fhe-operations/fhe-add.md",
|
|
126
|
-
title: "FHE Add"
|
|
121
|
+
title: "FHE Add",
|
|
127
122
|
},
|
|
128
123
|
"fhe-arithmetic": {
|
|
129
124
|
contract: "contracts/basic/fhe-operations/FHEArithmetic.sol",
|
|
@@ -131,7 +126,7 @@ exports.EXAMPLES = {
|
|
|
131
126
|
description: "Demonstrates all FHE arithmetic operations on encrypted integers",
|
|
132
127
|
category: "Basic - FHE Operations",
|
|
133
128
|
docsOutput: "docs/basic/fhe-operations/fhe-arithmetic.md",
|
|
134
|
-
title: "FHE Arithmetic"
|
|
129
|
+
title: "FHE Arithmetic",
|
|
135
130
|
},
|
|
136
131
|
"fhe-comparison": {
|
|
137
132
|
contract: "contracts/basic/fhe-operations/FHEComparison.sol",
|
|
@@ -139,7 +134,7 @@ exports.EXAMPLES = {
|
|
|
139
134
|
description: "Demonstrates all FHE comparison operations on encrypted integers",
|
|
140
135
|
category: "Basic - FHE Operations",
|
|
141
136
|
docsOutput: "docs/basic/fhe-operations/fhe-comparison.md",
|
|
142
|
-
title: "FHE Comparison"
|
|
137
|
+
title: "FHE Comparison",
|
|
143
138
|
},
|
|
144
139
|
"fhe-if-then-else": {
|
|
145
140
|
contract: "contracts/basic/fhe-operations/FHEIfThenElse.sol",
|
|
@@ -147,7 +142,7 @@ exports.EXAMPLES = {
|
|
|
147
142
|
description: "Demonstrates conditional logic: max(a, b) using encrypted comparison",
|
|
148
143
|
category: "Basic - FHE Operations",
|
|
149
144
|
docsOutput: "docs/basic/fhe-operations/fhe-if-then-else.md",
|
|
150
|
-
title: "FHE If Then Else"
|
|
145
|
+
title: "FHE If Then Else",
|
|
151
146
|
},
|
|
152
147
|
"fhe-access-control": {
|
|
153
148
|
contract: "contracts/concepts/FHEAccessControl.sol",
|
|
@@ -155,7 +150,7 @@ exports.EXAMPLES = {
|
|
|
155
150
|
description: "Critical access control patterns in FHEVM: FHE.allow, FHE.allowThis, FHE.allowTransient. Includes common mistakes and correct implementations.",
|
|
156
151
|
category: "Concepts",
|
|
157
152
|
docsOutput: "docs/concepts/fhe-access-control.md",
|
|
158
|
-
title: "FHE Access Control"
|
|
153
|
+
title: "FHE Access Control",
|
|
159
154
|
},
|
|
160
155
|
"fhe-anti-patterns": {
|
|
161
156
|
contract: "contracts/concepts/FHEAntiPatterns.sol",
|
|
@@ -163,7 +158,7 @@ exports.EXAMPLES = {
|
|
|
163
158
|
description: "Common FHE mistakes and their correct alternatives. Covers: branching, permissions, require/revert, re-encryption, loops, noise, and deprecated APIs.",
|
|
164
159
|
category: "Concepts",
|
|
165
160
|
docsOutput: "docs/concepts/fhe-anti-patterns.md",
|
|
166
|
-
title: "FHE Anti Patterns"
|
|
161
|
+
title: "FHE Anti Patterns",
|
|
167
162
|
},
|
|
168
163
|
"fhe-handles": {
|
|
169
164
|
contract: "contracts/concepts/FHEHandles.sol",
|
|
@@ -171,7 +166,7 @@ exports.EXAMPLES = {
|
|
|
171
166
|
description: "Understanding FHE handles: creation, computation, immutability, and symbolic execution in mock mode.",
|
|
172
167
|
category: "Concepts",
|
|
173
168
|
docsOutput: "docs/concepts/fhe-handles.md",
|
|
174
|
-
title: "FHE Handles"
|
|
169
|
+
title: "FHE Handles",
|
|
175
170
|
},
|
|
176
171
|
"fhe-input-proof": {
|
|
177
172
|
contract: "contracts/concepts/FHEInputProof.sol",
|
|
@@ -179,7 +174,7 @@ exports.EXAMPLES = {
|
|
|
179
174
|
description: "Explains input proof validation in FHEVM: what proofs are, why they are needed, and how to use them correctly with single and batched inputs.",
|
|
180
175
|
category: "Concepts",
|
|
181
176
|
docsOutput: "docs/concepts/fhe-input-proof.md",
|
|
182
|
-
title: "FHE Input Proof"
|
|
177
|
+
title: "FHE Input Proof",
|
|
183
178
|
},
|
|
184
179
|
"encrypted-lottery": {
|
|
185
180
|
contract: "contracts/gaming/EncryptedLottery.sol",
|
|
@@ -187,7 +182,7 @@ exports.EXAMPLES = {
|
|
|
187
182
|
description: "Encrypted Lottery with private ticket numbers - fair and verifiable!",
|
|
188
183
|
category: "Gaming",
|
|
189
184
|
docsOutput: "docs/gaming/encrypted-lottery.md",
|
|
190
|
-
title: "Encrypted Lottery"
|
|
185
|
+
title: "Encrypted Lottery",
|
|
191
186
|
},
|
|
192
187
|
"encrypted-poker": {
|
|
193
188
|
contract: "contracts/gaming/EncryptedPoker.sol",
|
|
@@ -195,7 +190,7 @@ exports.EXAMPLES = {
|
|
|
195
190
|
description: "Encrypted Poker - Texas Hold'em with hidden hole cards!",
|
|
196
191
|
category: "Gaming",
|
|
197
192
|
docsOutput: "docs/gaming/encrypted-poker.md",
|
|
198
|
-
title: "Encrypted Poker"
|
|
193
|
+
title: "Encrypted Poker",
|
|
199
194
|
},
|
|
200
195
|
"rock-paper-scissors": {
|
|
201
196
|
contract: "contracts/gaming/RockPaperScissors.sol",
|
|
@@ -203,80 +198,74 @@ exports.EXAMPLES = {
|
|
|
203
198
|
description: "Rock-Paper-Scissors game with encrypted moves - fair play guaranteed!",
|
|
204
199
|
category: "Gaming",
|
|
205
200
|
docsOutput: "docs/gaming/rock-paper-scissors.md",
|
|
206
|
-
title: "Rock Paper Scissors"
|
|
201
|
+
title: "Rock Paper Scissors",
|
|
207
202
|
},
|
|
208
|
-
|
|
203
|
+
erc7984: {
|
|
209
204
|
contract: "contracts/openzeppelin/ERC7984.sol",
|
|
210
205
|
test: "test/openzeppelin/ERC7984.ts",
|
|
211
206
|
npmDependencies: {
|
|
212
207
|
"@openzeppelin/contracts": "^5.4.0",
|
|
213
|
-
"@openzeppelin/confidential-contracts": "^0.3.0"
|
|
208
|
+
"@openzeppelin/confidential-contracts": "^0.3.0",
|
|
214
209
|
},
|
|
215
210
|
description: "Confidential token using OpenZeppelin's ERC7984 standard",
|
|
216
211
|
category: "Openzeppelin",
|
|
217
212
|
docsOutput: "docs/openzeppelin/erc7984.md",
|
|
218
|
-
title: "ERC7984"
|
|
213
|
+
title: "ERC7984",
|
|
219
214
|
},
|
|
220
215
|
"erc7984-erc20-wrapper": {
|
|
221
216
|
contract: "contracts/openzeppelin/ERC7984ERC20Wrapper.sol",
|
|
222
217
|
test: "test/openzeppelin/ERC7984ERC20Wrapper.ts",
|
|
223
218
|
npmDependencies: {
|
|
224
219
|
"@openzeppelin/contracts": "^5.4.0",
|
|
225
|
-
"@openzeppelin/confidential-contracts": "^0.3.0"
|
|
220
|
+
"@openzeppelin/confidential-contracts": "^0.3.0",
|
|
226
221
|
},
|
|
227
|
-
dependencies: [
|
|
228
|
-
"contracts/openzeppelin/mocks/ERC20Mock.sol"
|
|
229
|
-
],
|
|
222
|
+
dependencies: ["contracts/openzeppelin/mocks/ERC20Mock.sol"],
|
|
230
223
|
description: "Wraps ERC20 tokens into confidential ERC7984 tokens",
|
|
231
224
|
category: "Openzeppelin",
|
|
232
225
|
docsOutput: "docs/openzeppelin/erc7984-erc20-wrapper.md",
|
|
233
|
-
title: "ERC7984 ERC20 Wrapper"
|
|
226
|
+
title: "ERC7984 ERC20 Wrapper",
|
|
234
227
|
},
|
|
235
228
|
"swap-erc7984-to-erc20": {
|
|
236
229
|
contract: "contracts/openzeppelin/SwapERC7984ToERC20.sol",
|
|
237
230
|
test: "test/openzeppelin/SwapERC7984ToERC20.ts",
|
|
238
231
|
npmDependencies: {
|
|
239
232
|
"@openzeppelin/contracts": "^5.4.0",
|
|
240
|
-
"@openzeppelin/confidential-contracts": "^0.3.0"
|
|
233
|
+
"@openzeppelin/confidential-contracts": "^0.3.0",
|
|
241
234
|
},
|
|
242
235
|
dependencies: [
|
|
243
236
|
"contracts/openzeppelin/mocks/ERC20Mock.sol",
|
|
244
|
-
"contracts/openzeppelin/ERC7984.sol"
|
|
237
|
+
"contracts/openzeppelin/ERC7984.sol",
|
|
245
238
|
],
|
|
246
239
|
description: "Swap confidential ERC7984 tokens to regular ERC20 tokens",
|
|
247
240
|
category: "Openzeppelin",
|
|
248
241
|
docsOutput: "docs/openzeppelin/swap-erc7984-to-erc20.md",
|
|
249
|
-
title: "Swap ERC7984 To ERC20"
|
|
242
|
+
title: "Swap ERC7984 To ERC20",
|
|
250
243
|
},
|
|
251
244
|
"swap-erc7984-to-erc7984": {
|
|
252
245
|
contract: "contracts/openzeppelin/SwapERC7984ToERC7984.sol",
|
|
253
246
|
test: "test/openzeppelin/SwapERC7984ToERC7984.ts",
|
|
254
247
|
npmDependencies: {
|
|
255
|
-
"@openzeppelin/confidential-contracts": "^0.3.0"
|
|
248
|
+
"@openzeppelin/confidential-contracts": "^0.3.0",
|
|
256
249
|
},
|
|
257
|
-
dependencies: [
|
|
258
|
-
"contracts/openzeppelin/ERC7984.sol"
|
|
259
|
-
],
|
|
250
|
+
dependencies: ["contracts/openzeppelin/ERC7984.sol"],
|
|
260
251
|
description: "Fully confidential swap between two ERC7984 tokens",
|
|
261
252
|
category: "Openzeppelin",
|
|
262
253
|
docsOutput: "docs/openzeppelin/swap-erc7984-to-erc7984.md",
|
|
263
|
-
title: "Swap ERC7984 To ERC7984"
|
|
254
|
+
title: "Swap ERC7984 To ERC7984",
|
|
264
255
|
},
|
|
265
256
|
"vesting-wallet": {
|
|
266
257
|
contract: "contracts/openzeppelin/VestingWallet.sol",
|
|
267
258
|
test: "test/openzeppelin/VestingWallet.ts",
|
|
268
259
|
npmDependencies: {
|
|
269
260
|
"@openzeppelin/contracts": "^5.4.0",
|
|
270
|
-
"@openzeppelin/confidential-contracts": "^0.3.0"
|
|
261
|
+
"@openzeppelin/confidential-contracts": "^0.3.0",
|
|
271
262
|
},
|
|
272
|
-
dependencies: [
|
|
273
|
-
"contracts/openzeppelin/ERC7984.sol"
|
|
274
|
-
],
|
|
263
|
+
dependencies: ["contracts/openzeppelin/ERC7984.sol"],
|
|
275
264
|
description: "Linear vesting wallet for ERC7984 tokens - amounts stay encrypted!",
|
|
276
265
|
category: "Openzeppelin",
|
|
277
266
|
docsOutput: "docs/openzeppelin/vesting-wallet.md",
|
|
278
|
-
title: "Vesting Wallet"
|
|
279
|
-
}
|
|
267
|
+
title: "Vesting Wallet",
|
|
268
|
+
},
|
|
280
269
|
};
|
|
281
270
|
// =============================================================================
|
|
282
271
|
// Category Configurations
|
|
@@ -304,7 +293,7 @@ exports.CATEGORIES = {
|
|
|
304
293
|
{
|
|
305
294
|
sol: "contracts/advanced/PrivatePayroll.sol",
|
|
306
295
|
test: "test/advanced/PrivatePayroll.ts",
|
|
307
|
-
}
|
|
296
|
+
},
|
|
308
297
|
],
|
|
309
298
|
},
|
|
310
299
|
basicdecryption: {
|
|
@@ -325,7 +314,7 @@ exports.CATEGORIES = {
|
|
|
325
314
|
{
|
|
326
315
|
sol: "contracts/basic/decryption/UserDecryptSingleValue.sol",
|
|
327
316
|
test: "test/basic/decryption/UserDecryptSingleValue.ts",
|
|
328
|
-
}
|
|
317
|
+
},
|
|
329
318
|
],
|
|
330
319
|
},
|
|
331
320
|
basicencryption: {
|
|
@@ -342,7 +331,7 @@ exports.CATEGORIES = {
|
|
|
342
331
|
{
|
|
343
332
|
sol: "contracts/basic/encryption/FHECounter.sol",
|
|
344
333
|
test: "test/basic/encryption/FHECounter.ts",
|
|
345
|
-
}
|
|
334
|
+
},
|
|
346
335
|
],
|
|
347
336
|
},
|
|
348
337
|
basicfheoperations: {
|
|
@@ -363,7 +352,7 @@ exports.CATEGORIES = {
|
|
|
363
352
|
{
|
|
364
353
|
sol: "contracts/basic/fhe-operations/FHEIfThenElse.sol",
|
|
365
354
|
test: "test/basic/fhe-operations/FHEIfThenElse.ts",
|
|
366
|
-
}
|
|
355
|
+
},
|
|
367
356
|
],
|
|
368
357
|
},
|
|
369
358
|
concepts: {
|
|
@@ -384,7 +373,7 @@ exports.CATEGORIES = {
|
|
|
384
373
|
{
|
|
385
374
|
sol: "contracts/concepts/FHEInputProof.sol",
|
|
386
375
|
test: "test/concepts/FHEInputProof.ts",
|
|
387
|
-
}
|
|
376
|
+
},
|
|
388
377
|
],
|
|
389
378
|
},
|
|
390
379
|
gaming: {
|
|
@@ -401,7 +390,7 @@ exports.CATEGORIES = {
|
|
|
401
390
|
{
|
|
402
391
|
sol: "contracts/gaming/RockPaperScissors.sol",
|
|
403
392
|
test: "test/gaming/RockPaperScissors.ts",
|
|
404
|
-
}
|
|
393
|
+
},
|
|
405
394
|
],
|
|
406
395
|
},
|
|
407
396
|
openzeppelin: {
|
|
@@ -426,9 +415,9 @@ exports.CATEGORIES = {
|
|
|
426
415
|
{
|
|
427
416
|
sol: "contracts/openzeppelin/VestingWallet.sol",
|
|
428
417
|
test: "test/openzeppelin/VestingWallet.ts",
|
|
429
|
-
}
|
|
418
|
+
},
|
|
430
419
|
],
|
|
431
|
-
}
|
|
420
|
+
},
|
|
432
421
|
};
|
|
433
422
|
// =============================================================================
|
|
434
423
|
// Helper Functions
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generators - Template processing and code generation utilities.
|
|
3
|
+
*
|
|
4
|
+
* Contains functions for scaffolding templates, generating deploy scripts,
|
|
5
|
+
* and creating documentation.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Cleans up the template directory after copying
|
|
9
|
+
*/
|
|
10
|
+
export declare function cleanupTemplate(outputDir: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Generates a deploy script for a contract
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateDeployScript(contractName: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generates GitBook-compatible markdown documentation
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateGitBookMarkdown(description: string, contractContent: string, testContent: string, contractName: string, testFileName: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Updates package.json with project name and dependencies
|
|
21
|
+
*/
|
|
22
|
+
export declare function updateProjectPackageJson(outputDir: string, projectName: string, description?: string, npmDependencies?: Record<string, string>): void;
|
|
23
|
+
/**
|
|
24
|
+
* Runs a command and returns the output
|
|
25
|
+
*/
|
|
26
|
+
export declare function runCommand(cmd: string, args: string[], cwd: string): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Runs a command and returns success status with output
|
|
29
|
+
*/
|
|
30
|
+
export declare function runCommandWithStatus(cmd: string, args: string[], cwd: string): Promise<{
|
|
31
|
+
success: boolean;
|
|
32
|
+
output: string;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Extracts test results from command output
|
|
36
|
+
*/
|
|
37
|
+
export declare function extractTestResults(output: string): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* Extracts error messages from command output
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractErrorMessage(output: string): string;
|
|
42
|
+
//# sourceMappingURL=generators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../../scripts/shared/generators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAiDvD;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAkCjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,MAAM,CA2BR;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,IAAI,CAiBN;AAMD;;GAEG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAchE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4B1D"}
|