Compare commits

...

44 Commits

Author SHA1 Message Date
Vivian Plasencia
d99c5644c9 fix(website): update nextjs version 2025-12-13 17:11:55 +01:00
Vivian Plasencia
1dc597a175 chore: v4.14.0 2025-10-27 11:21:28 +01:00
Lautaro Di Sanza
b55bf7fd4d feat(data): add semaphore event listeners (#1054)
* feat(data): add semaphore event listeners

add listeners for groups and members

re #326

* feat(data): add semaphore event listeners

add listeners for ProoValidated and GroupAdminUpdated events

re #326

* feat(data): add semaphore event listeners

* feat(data): feat(data): add semaphore event listeners

the onMember method is separated and some names are adjusted

BREAKING CHANGE: N

re #326

* feat(data): feat(data): add semaphore event listeners

the onMember method is separated and some names are adjusted

BREAKING CHANGE: N

re #326

* feat(data): feat(data) add semaphore event listeners

add missing merkleTreeRoot element in onMember events

re #326

* feat(data): feat(data) add semaphore event listeners

fix name listener of GroupAdminUpdated event

re #326

* feat(data): feat(data) add semaphore event listeners

add groupId param to listener onGroupAdminUpdated

re #326

* feat(data): feat(data) add semaphore event listeners

Update method description

re #326

* feat(data): feat(data) add semaphore event listeners

fix descriptions

re #326

* feat(data): feat(data) add semaphore event listeners

Add short descriptions to off listeners methods

re #326
2025-10-24 00:13:58 +02:00
Cristian
496e18ecab fix(scripts): replaced map with foreach func (#1061)
fix: fix(scripts): replaced map with foreach func

re #1056
2025-10-23 12:46:53 +02:00
Vivian Plasencia
d4fb23a7af chore: update roadmap website and license year (#1060)
* chore(website): update roadmap

* chore(website): update license year 2024 -> 2025

re #947
2025-10-23 00:39:16 +02:00
Vivian Plasencia
411667f5c7 Dev (#1059)
* docs(proof): add documentation on terminating the bn128 curve to prevent resource leaks (#998)

* style(proof): format code with prettier

---------

Co-authored-by: VolodymyrBg <aqdrgg19@gmail.com>
2025-10-23 00:23:55 +02:00
bigbear
87709224a3 docs: fix incorrect default value in chunkArray JSDoc (#1038) 2025-10-22 11:14:46 +02:00
Fibonacci747
0e20c6884f docs(identity): correct @returns to bigint for secretScalar and commitment (#1028) 2025-10-22 11:12:23 +02:00
radik878
e1e893004d fix(data/ethers): correct MembersAdded map type to string[] (#1033) 2025-10-22 10:52:09 +02:00
Luciano Lupo
2e6bef51d4 docs(website): added Bring ID data to projects list (#1055)
re #1001
2025-10-22 10:32:30 +02:00
Vivian Plasencia
9e7b2900cf chore: v4.13.2 2025-10-13 10:31:58 +02:00
Vivian Plasencia
cd02f49173 feat: support gnosis-chiado and gnosis networks
re #1051
2025-10-12 21:25:10 -05:00
Vivian Plasencia
a8787bd1fc docs(website): add poll.cc (#1050)
docs(website): add poll.cc to website
2025-10-04 00:13:10 +02:00
Vivian Plasencia
2c6f7846d7 docs: update benachmarks page (#1045)
* docs(docs): update benchmarks page

re #1044

* docs(docs): update browser benchmarks

* docs(docs): update contracts image size

* docs(docs): update solidity benchmark info
2025-09-09 23:54:54 +02:00
Vivian Plasencia
8c359ad594 chore: v4.13.1 2025-09-08 15:02:57 +02:00
Vivian Plasencia
7ccb14d362 feat: deploy contracts (#1041) 2025-09-08 14:13:44 +02:00
Vivian Plasencia
7e60446268 docs: remove trusted setup from docs and website (#1039)
* docs(docs): remove trusted setup announcement from docs

* docs(website): remove trusted setup announcement from website
2025-09-02 15:45:47 +02:00
Vivian Plasencia
5dcba7fb2e chore: v4.13.0 2025-08-27 11:09:58 +02:00
Vivian Plasencia
0394caf2f7 feat: add production semaphore v4 zk artifacts (#1037) 2025-08-27 11:00:09 +02:00
Galoretka
820f34ac90 fix: improve error handling in toBigInt function (#1025)
* fix: improve error handling in toBigInt function

* Update packages/proof/src/to-bigint.ts

Co-authored-by: John Guilding <54913924+JohnGuilding@users.noreply.github.com>

---------

Co-authored-by: John Guilding <54913924+JohnGuilding@users.noreply.github.com>
2025-08-07 14:47:56 +02:00
Micke
81dbf8631c fix: optimize BigInt usage in hash function (#1003) 2025-08-06 23:13:58 +02:00
Vivian Plasencia
4e084b0589 docs(website): add noircon2 presentation video 2025-08-05 18:03:39 -05:00
Vivian Plasencia
210fed4a50 docs: update ceremony end date 2025-08-05 18:01:58 -05:00
Ocenka
53f41879d1 Fix invalid components in Chakra UI (#964)
* Update page.tsx

* Update page.tsx

* Update SectionBlock.tsx

* Update InfoCard.tsx

* Update ProjectsList.tsx

* Update Carousel.tsx

* Update InfoCard.tsx

* Update InfoCard.tsx
2025-08-05 22:26:25 +02:00
Vivian Plasencia
4089bbedc7 docs(docs): update ceremony closing time (#1021) 2025-08-04 23:37:12 +02:00
Vivian Plasencia
6a2b28c34e docs(docs): update deploy contracts command (#1019)
re #1018
2025-07-28 14:21:29 +02:00
Vivian Plasencia
dce9813c8e feat(docs): add trusted setup ceremony to docs (#1016)
* feat(docs): add trusted setup ceremony announcement to banner and new page with contribution steps

re #1014

* docs(docs): update ceremony settings section in trusted-setup file
2025-07-23 10:33:11 -05:00
Vivian Plasencia
aba32d83b1 feat(website): add trusted setup ceremony to website (#1015)
* feat(website): add trusted setup ceremony announcement to banner and events

re #1014

* docs(docs): update trusted setup ceremomy year in events

* docs(website): add exclamation mark to the banner
2025-07-23 10:08:51 -05:00
Vivian Plasencia
520a02698f chore: v4.13.0-beta.1 2025-07-23 14:07:30 +02:00
Vivian Plasencia
128cbcee13 refactor(contracts): update solidity version in contracts (#1013) 2025-07-23 12:55:00 +02:00
Wesley
a224f95d77 docs(docs): add llm setup docs (#993)
* docs(docs): add llm setup docs

* docs(docs): updated llms.txt to v4

updated llms.txt to only include Semaphore v4

---------

Co-authored-by: wslyvh <wslyvh@users.noreply.github.com>
2025-07-23 11:09:06 +02:00
Vivian Plasencia
bb089c5544 chore: v4.13.0-beta.0 2025-07-22 23:06:14 +02:00
Vivian Plasencia
88004d9092 fix: under constrained bug binary merkle root (#1012)
* Fix/update binary merkle root circuit version (#1000)

* fix(circuits)!: update binary merkle root circuit version

re #999

* chore: update snarkjs version from 0.7.4 to 0.7.5

* refactor: update the proof package and smart contracts  (#1011)

refactor: update the proof package and smart contracts with new zk artifacts
2025-07-22 23:02:00 +02:00
Vivian Plasencia
e7ca1d9487 chore: v4.12.1 2025-07-21 23:45:40 +02:00
Vivian Plasencia
1b82dcdded chore(group): update lean-imt version 2.2.3 -> 2.2.4 (#1010) 2025-07-21 16:36:43 -05:00
Vivian Plasencia
cd04b0c5c7 chore: v4.12.0 2025-07-17 16:38:26 +02:00
aritra
b6a7a9883b refactor: transport selection logic (#1007) 2025-07-17 16:30:04 +02:00
aritra
fc1fe4d086 Allow injecting existing PublicClient into SemaphoreViem (#1006)
* refactor: allow injecting existing PublicClient into SemaphoreViem

* fix: remove comment
2025-07-17 13:48:13 +02:00
Vivian Plasencia
feb8c9c97d docs(website): add ethdam video recording (#996) 2025-06-09 15:50:00 +02:00
César Henrique
b56e9690a8 Test(data): add test coverage for getEvents utility (#989)
test(data): add test coverage for getEvents utility

re #986
2025-05-26 19:10:24 +02:00
Vivian Plasencia
c973bab503 cocs: add new issue link (#988)
* docs: update contributing file

* docs: update pull request template

* docs: add new issue link to contributing
2025-05-25 23:14:11 +02:00
Vivian Plasencia
27aee4bf43 Docs/update contributing (#987)
* docs: update contributing file

* docs: update pull request template
2025-05-25 22:54:29 +02:00
Vivian Plasencia
ea62310df6 chore: v4.11.1 2025-05-21 16:49:07 +02:00
Vivian Plasencia
6bc415f4d5 fix(data): fix semaphore viem class (#985)
re #984
2025-05-21 16:44:38 +02:00
96 changed files with 2334 additions and 1588 deletions

View File

@@ -37,4 +37,4 @@
- [ ] New and existing unit tests pass locally with my changes
> [!IMPORTANT]
> We do not accept minor grammatical fixes (e.g., correcting typos, rewording sentences) unless they significantly improve clarity in technical documentation. These contributions, while appreciated, are not a priority for merging. If there is a grammatical error feel free to message the team.
> We do not accept pull requests for minor grammatical fixes (e.g., correcting typos, rewording sentences) or for fixing broken links, unless they significantly improve clarity or functionality. These contributions, while appreciated, are not a priority for merging. If you notice any of these issues, please create a [GitHub Issue](https://github.com/semaphore-protocol/semaphore/issues/new?template=BLANK_ISSUE) to report them so they can be properly tracked and addressed.

View File

@@ -31,7 +31,7 @@ Pull requests are great if you want to add a feature or fix a bug. Here's a quic
7. Push to your fork and submit a pull request on our `main` branch. Please provide us with some explanation of why you made the changes you made. For new features make sure to explain a standard use case to us.
> [!IMPORTANT]
> We do not accept minor grammatical fixes (e.g., correcting typos, rewording sentences) unless they significantly improve clarity in technical documentation. These contributions, while appreciated, are not a priority for merging. If there is a grammatical error feel free to message the team.
> We do not accept pull requests for minor grammatical fixes (e.g., correcting typos, rewording sentences) or for fixing broken links, unless they significantly improve clarity or functionality. These contributions, while appreciated, are not a priority for merging. If you notice any of these issues, please create a [GitHub Issue](https://github.com/semaphore-protocol/semaphore/issues/new?template=BLANK_ISSUE) to report them so they can be properly tracked and addressed.
## CI (Github Actions) Tests

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 KiB

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -19,7 +19,7 @@
"@docusaurus/core": "3.5.2",
"@docusaurus/preset-classic": "3.5.2",
"@mdx-js/react": "^3.0.0",
"@semaphore-protocol/utils": "4.11.0",
"@semaphore-protocol/utils": "4.14.0",
"@svgr/webpack": "^5.5.0",
"clsx": "^1.2.1",
"docusaurus-plugin-sass": "^0.2.5",

196
apps/docs/static/llms.txt vendored Normal file
View File

@@ -0,0 +1,196 @@
# Semaphore V4 - llms.txt
> Zero-knowledge protocol for anonymous group membership and signaling
## Quick Reference
### Core Concept
Semaphore allows users to cast messages (votes, endorsements) as provable group members without revealing identity, with built-in double-signaling prevention.
**Key Components:**
- **Identity**: User's cryptographic identity (private key, public key, commitment)
- **Group**: Merkle tree of identity commitments
- **Proof**: Zero-knowledge proof of group membership + message
- **Nullifier**: Unique identifier preventing double-signaling
- **Scope**: Topic/context that limits one proof per user
### Essential Packages
```bash
# Core functionality
npm install @semaphore-protocol/core
# Individual packages
npm install @semaphore-protocol/identity
npm install @semaphore-protocol/group
npm install @semaphore-protocol/proof
npm install @semaphore-protocol/contracts
```
## Common Patterns
### 1. Identity Management
```javascript
import { Identity } from "@semaphore-protocol/identity"
// Random identity
const identity = new Identity()
const { privateKey, publicKey, commitment } = identity
// Deterministic identity (from secret)
const deterministicIdentity = new Identity("secret-value")
// Sign/verify messages
const message = "Hello World"
const signature = identity.signMessage(message)
const isValid = Identity.verifySignature(message, signature, identity.publicKey)
// Export/import
const exported = identity.export() // base64 private key
const imported = Identity.import(exported)
```
### 2. Group Operations
```javascript
import { Group } from "@semaphore-protocol/group"
// Create group
const group = new Group()
const groupWithMembers = new Group([commitment1, commitment2])
// Manage members
group.addMember(identity.commitment)
group.addMembers([commitment1, commitment2])
group.removeMember(0) // sets to 0, doesn't change size
group.updateMember(0, newCommitment)
// Generate Merkle proof
const merkleProof = group.generateMerkleProof(0)
```
### 3. Proof Generation & Verification
```javascript
import { generateProof, verifyProof } from "@semaphore-protocol/proof"
// Generate proof
const scope = group.root // or any unique scope
const message = 1
const proof = await generateProof(identity, group, message, scope)
// Verify proof
const isValid = await verifyProof(proof)
```
### 4. On-Chain Integration
```solidity
// Contract setup
import "@semaphore-protocol/contracts/interfaces/ISemaphore.sol";
contract YourContract {
ISemaphore public semaphore;
uint256 public groupId;
constructor(ISemaphore _semaphore) {
semaphore = _semaphore;
groupId = semaphore.createGroup();
}
// Validate proof on-chain
function validateProof(ISemaphore.SemaphoreProof calldata proof) external {
semaphore.validateProof(groupId, proof);
}
}
```
## Configuration Reference
### Circuit Parameters
- **MAX_DEPTH**: 1-32 (Merkle tree depth)
- **Default proof validity**: 1 hour for old Merkle roots
### Key Security Settings
- **Identity reuse warning**: Same identity across groups compromises all groups
- **Nullifier uniqueness**: Prevents double-signaling within same scope
- **Message tampering**: Circuit calculates dummy square to prevent tampering
## Troubleshooting
### Common Issues
**"Proof verification failed"**
- Check group contains identity commitment
- Verify scope matches between generation and verification
- Ensure Merkle proof is current (within validity window)
**"Nullifier already exists"**
- User already submitted proof with this scope
- Use different scope or implement nullifier tracking
**"Identity commitment not found"**
- Add identity to group before generating proof
- Verify correct group is being used
## Architecture Overview
### Circuit Structure
The Semaphore circuit proves three things:
1. **Membership**: User belongs to group (Merkle proof verification)
2. **Authorization**: Same user created message and proof (nullifier check)
3. **Message integrity**: Message hasn't been tampered with
### Contract Architecture
- **SemaphoreVerifier.sol**: Groth16 proof verification
- **SemaphoreGroups.sol**: Group management (abstract)
- **Semaphore.sol**: Complete implementation with proof validation
## Extended Resources
### 📚 Complete Guides
- [Getting Started Tutorial](https://docs.semaphore.pse.dev/getting-started) - Full project setup with CLI
- [Identities Deep Dive](https://docs.semaphore.pse.dev/guides/identities) - Advanced identity management
- [Groups Management](https://docs.semaphore.pse.dev/guides/groups) - Comprehensive group operations
- [Proof Generation](https://docs.semaphore.pse.dev/guides/proofs) - Detailed proof workflows
### 🔧 Technical References
- [Semaphore V4 Specification](https://github.com/zkspecs/zkspecs/blob/main/specs/3/README.md) - Protocol specification
- [Circuit Documentation](https://docs.semaphore.pse.dev/technical-reference/circuits) - Circuit internals
- [Contract Reference](https://docs.semaphore.pse.dev/technical-reference/contracts) - Solidity implementation details
- [Deployed Contracts](https://docs.semaphore.pse.dev/deployed-contracts) - Network addresses
### 🛠️ Development Tools
- [GitHub Repository](https://github.com/semaphore-protocol/semaphore) - Source code and examples
- [CLI Templates](https://github.com/semaphore-protocol/semaphore/tree/main/packages/cli) - Project boilerplates
- [Boilerplate App](https://github.com/semaphore-protocol/boilerplate) - Complete example application
### 🔐 Security & Audits
- [Trusted Setup Ceremony](https://ceremony.pse.dev/projects/Semaphore%20V4%20Ceremony) - 400+ participants, July 2024
- [Security Audits](https://docs.semaphore.pse.dev/#audits) - PSE and Veridise audit reports
- [Best Practices Guide](https://docs.semaphore.pse.dev/) - Security considerations section
### 🌐 Community & Support
- [Documentation](https://docs.semaphore.pse.dev/) - Complete documentation
- [GitHub Discussions](https://github.com/semaphore-protocol/semaphore/discussions) - Community support
- [PSE Website](https://pse.dev/) - Privacy & Scaling Explorations team
### 📊 Data & Indexing
- [@semaphore-protocol/data](https://github.com/semaphore-protocol/semaphore/tree/main/packages/data) - On-chain data fetching
- [Subgraph Templates](https://github.com/semaphore-protocol/semaphore/tree/main/packages/cli-template-monorepo-subgraph) - Graph Protocol integration
## Quick Start Commands
```bash
# Create new project
npx @semaphore-protocol/cli create my-app --template monorepo-ethers
# Get on-chain groups
semaphore get-groups --network sepolia
# Deploy contract
yarn deploy --semaphore <address> --group <id> --network sepolia
```
## Use Cases
- **Private Voting**: Anonymous ballots with double-vote prevention
- **Whistleblowing**: Anonymous reporting with verified membership
- **Anonymous DAOs**: Governance without identity disclosure
- **Mixers**: Privacy-preserving value transfers
- **Anonymous Authentication**: Prove membership without revealing identity

View File

@@ -42,13 +42,13 @@ Chip: Apple M2 Pro
Memory (RAM): 16 GB
Operating System: macOS Sequoia version 15.0.1
Operating System: macOS Sequoia version 15.6.1
**Software environment**
Node.js version: 20.18.0
Node.js version: 23.10.0
Browser: Google Chrome Version 130.0.6723.92 (Official Build) (arm64)
Browser: Google Chrome Version 139.0.7258.156 (Official Build) (arm64)
## Running the benchmarks
@@ -60,6 +60,8 @@ GitHub repository to the run Node.js, browser and Circom benchmarks: https://git
GitHub repository to run the Solidity benchmarks: https://github.com/semaphore-protocol/semaphore
Semaphore V3 benchmarks were obtained using the code from the latest v3 Git tag (`v3.15.2`), with the Solidity optimizer enabled.
## Node.js benchmarks
### Identities
@@ -98,6 +100,8 @@ Main functions used in the browser.
## Circuit benchmarks
Tree depth = 20
### Semaphore V3
<img
@@ -119,7 +123,7 @@ style={{ width: '300px', height: 'auto' }}
<img
src={require('../../assets/img-benchmarks/contracts/contract-benchmarks.png').default}
alt="Contract Benchmarks"
style={{ width: '590px', height: 'auto' }}
style={{ width: '560px', height: 'auto' }}
/>
### Semaphore V3 gas report

View File

@@ -1,5 +1,5 @@
---
sidebar_position: 13
sidebar_position: 14
---
# Credits

View File

@@ -1,5 +1,5 @@
---
sidebar_position: 12
sidebar_position: 13
---
# FAQ

View File

@@ -118,7 +118,7 @@ In the project root folder:
2. Go to the `apps/contracts` folder and deploy your contract.
```bash
yarn deploy --semaphore <semaphore-address> --group <group-id> --network sepolia
yarn deploy --semaphore <semaphore-address> --network sepolia
```
:::note

View File

@@ -0,0 +1,55 @@
---
sidebar_position: 11
---
# Code editors and LLM setup
LLMs often rely on outdated or generic information. Use this guide to help set up your code editor to pull in more accurate, up-to-date documentation and examples. It will help provide better answers and generate more accurate Semaphore code using LLMs (large language models) and MCP (Model Context Protocol) servers.
## Quick use
[llms.txt](https://docs.semaphore.pse.dev/llms.txt) is a compact, text version of the Semaphore docs.
Add this link directly to your chat window for enhanced context.
## Permanent setup
Depending on your IDE, you can add custom docs to VS Code, Cursor or others.
Example for Cursor...
1. Press `CMD + Shift + P` (unix), `Ctrl + Shift + P` (Windows)
1. Type `Add new custom docs`.
1. Add https://docs.semaphore.pse.dev/llms.txt
1. In chat you can know `@docs` and choose `semaphore` to provide additional context.
Refer to the documentation of your IDE to properly set it up.
## MCP Server
Depending on your IDE, you can add a MCP server to communicate your docs to the AI model.
- [Context7 MCP server](https://github.com/upstash/context7) is a server that provides many libraries, incl. Semaphore.
Example for Cursor...
1. Press `CMD + Shift + J` (unix), `Ctrl + Shift + J` (Windows)
1. Click on `MCP` on the sidebar
1. Click `Add new global MCP server`
1. Add the following code to `mcp.json`
```
{
"mcpServers": {
"Context7": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@upstash/context7-mcp@latest"]
}
}
}
```
You can now prompt anything about Semaphore and write `use context7` at the end of your prompt. E.g. `create a new Semaphore identity in TypeScript. use context`. This will call the MCP tool and automatically fetch the latest documentation.
Refer to the documentation of your IDE to properly set it up.

View File

@@ -1,5 +1,5 @@
---
sidebar_position: 11
sidebar_position: 12
---
import Tabs from "@theme/Tabs"

View File

@@ -42,7 +42,7 @@
## Networks
You can access any subgraph supported by Semaphore with the following URL: `https://api.studio.thegraph.com/query/14377/semaphore-<network-name>/v4.2.0`.
You can access any subgraph supported by Semaphore with the following URL: `https://api.studio.thegraph.com/query/14377/semaphore-<network-name>/v4.5.0`.
Supported networks:
@@ -59,6 +59,8 @@ Supported networks:
- `linea-sepolia`
- `linea`
- `scroll-sepolia`
- `gnosis-chiado`
- `gnosis`
## 🛠 Install

View File

@@ -14,7 +14,7 @@
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
"framer-motion": "^10.16.4",
"next": "13.5.5",
"next": "14.2.35",
"react": "^18",
"react-code-blocks": "^0.1.4",
"react-dom": "^18"

View File

@@ -40,6 +40,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
href="https://github.com/semaphore-protocol/semaphore/releases/tag/v4.0.0"
ml="1"
isExternal
color="primary.500"
>
<b>Semaphore V4</b>
</Link>{" "}

View File

@@ -131,7 +131,7 @@ export default function Home() {
>
1
</Heading>
<VStack align="left">
<VStack align="start">
<Text
fontSize={{ base: "18px", md: "20px" }}
fontFamily={sora.style.fontFamily}
@@ -152,7 +152,7 @@ export default function Home() {
>
3
</Heading>
<VStack align="left">
<VStack align="start">
<Text
fontSize={{ base: "18px", md: "20px" }}
fontFamily={sora.style.fontFamily}
@@ -181,7 +181,7 @@ export default function Home() {
>
2
</Heading>
<VStack align="left">
<VStack align="start">
<Text
fontSize={{ base: "18px", md: "20px" }}
fontFamily={sora.style.fontFamily}
@@ -203,7 +203,7 @@ export default function Home() {
>
4
</Heading>
<VStack align="left">
<VStack align="start">
<Text
fontSize={{ base: "18px", md: "20px" }}
fontFamily={sora.style.fontFamily}
@@ -287,10 +287,10 @@ export default function Home() {
Upcoming Events
</Heading>
<VStack align="left" spacing="10" maxH="600px" overflowY="auto">
<VStack align="start" spacing="10" maxH="600px" overflowY="auto">
{events.map((event) => (
<Link href={event.link} key={event.name} isExternal>
<VStack align="left">
<VStack align="start">
<Heading fontSize={{ base: "20px", md: "24px" }}>
{event.date} | {event.name}
</Heading>

View File

@@ -5,7 +5,7 @@ import ProjectsList from "../../components/ProjectsList"
export default function Projects() {
return (
<>
<VStack pt="170px" pb="56px" w="100%" justify="end" align="left" spacing="40" position="relative">
<VStack pt="170px" pb="56px" w="100%" justify="end" align="start" spacing="40" position="relative">
<Box
zIndex="-1"
top="0"
@@ -25,7 +25,7 @@ export default function Projects() {
/>
</Box>
<VStack align="left" spacing="4" pb="16">
<VStack align="start" spacing="4" pb="16">
<Heading fontSize={{ base: "40px", sm: "46px", md: "72px" }}>Built with Semaphore</Heading>
<Text fontSize={{ base: "16px", sm: "18px", md: "20px" }}>
@@ -35,7 +35,7 @@ export default function Projects() {
</VStack>
</VStack>
<ProjectsList w="100%" align="left" pt="16" spacing="14" />
<ProjectsList w="100%" align="start" pt="16" spacing="14" />
<VStack my="128px">
<ActionCard

View File

@@ -46,7 +46,7 @@ export default function Carousel({ title, sizes, type, ...props }: CarouselProps
}, [index, size])
return (
<VStack align="left" w="full" spacing="16" {...props}>
<VStack align="start" w="full" spacing="16" {...props}>
<HStack justify={type === "projects" ? "center" : "space-between"}>
<Heading fontSize={{ base: "30px", md: "44px" }}>{title}</Heading>

View File

@@ -23,9 +23,9 @@ export default function InfoCard({ texts }: InfoCardProps) {
height={{ base: "auto", md: "474px" }}
>
<CardBody padding="0">
<VStack align="left" spacing="10" maxH="500" overflowY="auto">
<VStack align="start" spacing="10" maxH="500" overflowY="auto">
{texts.map((text) => (
<VStack key={text.title} align="left">
<VStack key={text.title} align="start">
<Heading textAlign="left" fontSize={{ base: "20px", md: "24px" }}>
{text.title}
</Heading>

View File

@@ -52,7 +52,7 @@ export default function ProjectsList(props: any) {
return (
<VStack {...props}>
<VStack align="left" spacing="6">
<VStack align="start" spacing="6">
<Text fontSize="20">Projects created by</Text>
<HStack spacing="4" flexWrap="wrap">
@@ -83,7 +83,7 @@ export default function ProjectsList(props: any) {
</HStack>
</VStack>
<VStack align="left" spacing="6" ref={viewToScrollRef}>
<VStack align="start" spacing="6" ref={viewToScrollRef}>
<Text fontSize="20">Category</Text>
<HStack spacing="3" flexWrap="wrap">
{getProjectCategories(sortedProjects).map((category) => (

View File

@@ -23,7 +23,7 @@ export default function SectionBlock({ title, description, linkText, linkUrl, co
return (
<VStack w="full">
<Flex flexDir={{ base: "column", lg: "row" }} gap="52px" w="full">
<VStack align="left" gap="32px" flex="1">
<VStack align="start" gap="32px" flex="1">
<Text fontSize={{ base: "40px", md: "44px" }} fontWeight={{ base: "400", md: "500" }}>
{title}
</Text>

View File

@@ -586,5 +586,26 @@
"github": "https://github.com/jimmychu0807/semaphore-msa-modules",
"website": "https://semaphore-msa-modules.jimmychu0807.hk"
}
},
{
"name": "Poll.cc",
"categories": ["Voting", "Social"],
"tagline": "Public online voting on social and political issues. Semaphore is used for anonymous voting while proving you're a real human verified by KYC.",
"pse": false,
"icon": "",
"links": {
"website": "https://poll.cc"
}
},
{
"name": "BringID",
"tagline": "Privacy-preserving proof of humanity using verifiable Internet credentials",
"categories": ["Identity", "Authenticity", "Trust"],
"pse": false,
"icon": "",
"links": {
"website": "https://www.bringid.org",
"github": "https://github.com/BringID/whitepaper"
}
}
]

View File

@@ -20,7 +20,7 @@
"done": true
},
{
"name": "Support more Testnets/Mainnets",
"name": "Support more Testnets & Mainnets",
"done": true
},
{
@@ -37,10 +37,14 @@
},
{
"name": "Semaphore Noir Implementation",
"done": false
"done": true
},
{
"name": "Scaling Semaphore with PIR",
"done": true
},
{
"name": "Maintenance",
"done": false
}
]

View File

@@ -118,5 +118,21 @@
"speakers": ["Vivian Plasencia"],
"url": "https://youtu.be/ux5Xy_lpiYk",
"thumbnail": "https://img.youtube.com/vi/ux5Xy_lpiYk/0.jpg"
},
{
"title": "Scaling Semaphore",
"eventName": "ETHDam",
"date": "2025-05-10",
"speakers": ["Vivian Plasencia"],
"url": "https://youtu.be/IkYtKSQLR-A",
"thumbnail": "https://img.youtube.com/vi/IkYtKSQLR-A/0.jpg"
},
{
"title": "Scaling Semaphore: Noir in Action",
"eventName": "NoirCon2",
"date": "2025-06-19",
"speakers": ["Vivian Plasencia"],
"url": "https://youtu.be/vfL7z74jGyU",
"thumbnail": "https://img.youtube.com/vi/vfL7z74jGyU/0.jpg"
}
]

View File

@@ -2,7 +2,7 @@
* This function takes an array and divides it into smaller arrays,
* or "chunks", each containing a specified number of elements.
* @param array The array to be split into chunks.
* @param size The size of each chunk. The default size is 10.
* @param size The size of each chunk. The default size is 15.
* @returns An array containing smaller subarrays (chunks), each with a length defined by the size.
*/
export function chunkArray(array: any[], size = 15): any[] {

View File

@@ -80,7 +80,7 @@
"prettier": "^3.2.5",
"rimraf": "^5.0.5",
"semver": "^7.6.2",
"snarkjs": "0.7.4",
"snarkjs": "0.7.5",
"ts-jest": "^29.1.2",
"ts-node": "^10.9.2",
"tslib": "^2.6.2",

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/circuits",
"version": "4.11.0",
"version": "4.14.0",
"description": "Semaphore Circom circuits to generate zero-knowledge proofs.",
"license": "MIT",
"files": [
@@ -24,14 +24,14 @@
"access": "public"
},
"dependencies": {
"@zk-kit/binary-merkle-root.circom": "1.0.0",
"@zk-kit/binary-merkle-root.circom": "2.0.0",
"circomlib": "2.0.5"
},
"devDependencies": {
"@semaphore-protocol/core": "workspace:^",
"@types/mocha": "^10.0.6",
"@zk-kit/baby-jubjub": "1.0.3",
"circomkit": "0.0.19",
"circomkit": "0.3.3",
"mocha": "^10.2.0",
"poseidon-lite": "^0.3.0"
}

View File

@@ -27,7 +27,7 @@ template Semaphore(MAX_DEPTH) {
// See the Semaphore identity package to know more about how the identity is generated:
// https://github.com/semaphore-protocol/semaphore/tree/main/packages/identity.
signal input secret;
signal input merkleProofLength, merkleProofIndices[MAX_DEPTH], merkleProofSiblings[MAX_DEPTH];
signal input merkleProofLength, merkleProofIndex, merkleProofSiblings[MAX_DEPTH];
signal input message;
signal input scope;
@@ -58,7 +58,7 @@ template Semaphore(MAX_DEPTH) {
// the circuit through the inputs of the Merkle proof.
// See https://github.com/privacy-scaling-explorations/zk-kit.circom/blob/main/packages/binary-merkle-root/src/binary-merkle-root.circom
// to know more about how the 'BinaryMerkleRoot' template works.
merkleRoot <== BinaryMerkleRoot(MAX_DEPTH)(identityCommitment, merkleProofLength, merkleProofIndices, merkleProofSiblings);
merkleRoot <== BinaryMerkleRoot(MAX_DEPTH)(identityCommitment, merkleProofLength, merkleProofIndex, merkleProofSiblings);
// Nullifier generation.
// The nullifier is a value that essentially identifies the proof generated in a specific scope

View File

@@ -12,21 +12,18 @@ export const circomkit = new Circomkit({
})
export function generateMerkleProof(group: Group, _index: number, maxDepth: number) {
const { siblings: merkleProofSiblings, index } = group.generateMerkleProof(_index)
const { siblings: merkleProofSiblings, index: merkleProofIndex } = group.generateMerkleProof(_index)
// The index must be converted to a list of indices, 1 for each tree level.
// The circuit tree depth is 20, so the number of siblings must be 20, even if
// the tree depth is actually 3. The missing siblings can be set to 0, as they
// won't be used to calculate the root in the circuit.
const merkleProofIndices: number[] = []
// For example, if the circuit expects a Merkle tree of depth 20,
// the input must always include 20 sibling nodes, even if the actual
// tree depth is smaller (e.g., 3). The unused sibling positions can be
// filled with 0, as they won't affect the root calculation in the circuit.
for (let i = 0; i < maxDepth; i += 1) {
merkleProofIndices.push((index >> i) & 1)
if (merkleProofSiblings[i] === undefined) {
merkleProofSiblings[i] = BigInt(0)
}
}
return { merkleProofSiblings, merkleProofIndices }
return { merkleProofSiblings, merkleProofIndex }
}

View File

@@ -12,7 +12,7 @@ const r = 2188824287183927522224640574525727508854836440041603434369820418657580
describe("semaphore", () => {
let circuit: WitnessTester<
["secret", "merkleProofLength", "merkleProofIndices", "merkleProofSiblings", "scope", "message"],
["secret", "merkleProofLength", "merkleProofIndex", "merkleProofSiblings", "scope", "message"],
["nullifier", "merkleRoot"]
>
@@ -36,12 +36,12 @@ describe("semaphore", () => {
const group = new Group([commitment, 2n, 3n])
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
const INPUT = {
secret,
merkleProofLength: group.depth,
merkleProofIndices,
merkleProofIndex,
merkleProofSiblings,
scope,
message
@@ -61,12 +61,12 @@ describe("semaphore", () => {
const commitment = poseidon2(mulPointEscalar(Base8, secret))
const group = new Group([commitment, 2n, 3n])
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
const INPUT = {
secret,
merkleProofLength: group.depth,
merkleProofIndices,
merkleProofIndex,
merkleProofSiblings,
scope,
message
@@ -81,12 +81,12 @@ describe("semaphore", () => {
const commitment = poseidon2(mulPointEscalar(Base8, secret))
const group = new Group([commitment, 2n, 3n])
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
const INPUT = {
secret,
merkleProofLength: group.depth,
merkleProofIndices,
merkleProofIndex,
merkleProofSiblings,
scope,
message
@@ -100,12 +100,12 @@ describe("semaphore", () => {
const group = new Group([commitment, 2n, 3n])
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
const INPUT = {
secret,
merkleProofLength: group.depth,
merkleProofIndices,
merkleProofIndex,
merkleProofSiblings,
scope,
message

View File

@@ -1,10 +1,10 @@
{
"name": "@semaphore-protocol/cli-template-contracts-foundry",
"version": "4.11.0",
"version": "4.14.0",
"description": "Semaphore Foundry template.",
"license": "Unlicense",
"devDependencies": {
"@semaphore-protocol/contracts": "4.11.0",
"@semaphore-protocol/contracts": "4.14.0",
"@zk-kit/lean-imt.sol": "2.0.1",
"forge-std": "github:foundry-rs/forge-std#v1.9.4",
"poseidon-solidity": "0.0.5",

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/cli-template-contracts-hardhat",
"version": "4.11.0",
"version": "4.14.0",
"description": "Semaphore Hardhat template.",
"license": "Unlicense",
"files": [
@@ -42,9 +42,9 @@
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
"@nomicfoundation/hardhat-verify": "^2.0.0",
"@semaphore-protocol/core": "4.11.0",
"@semaphore-protocol/hardhat": "4.11.0",
"@semaphore-protocol/utils": "4.11.0",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/hardhat": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"@typechain/ethers-v6": "^0.5.0",
"@typechain/hardhat": "^9.0.0",
"@types/chai": "^4.2.0",
@@ -72,7 +72,7 @@
"typescript": "^5.3.3"
},
"dependencies": {
"@semaphore-protocol/contracts": "4.11.0"
"@semaphore-protocol/contracts": "4.14.0"
},
"packageManager": "yarn@4.1.0"
}

View File

@@ -20,9 +20,9 @@
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
"@nomicfoundation/hardhat-verify": "^2.0.0",
"@semaphore-protocol/core": "4.11.0",
"@semaphore-protocol/hardhat": "4.11.0",
"@semaphore-protocol/utils": "4.11.0",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/hardhat": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"@typechain/ethers-v6": "^0.5.0",
"@typechain/hardhat": "^9.0.0",
"@types/chai": "^4.2.0",
@@ -50,7 +50,7 @@
"typescript": "^5.3.3"
},
"dependencies": {
"@semaphore-protocol/contracts": "4.11.0"
"@semaphore-protocol/contracts": "4.14.0"
},
"packageManager": "yarn@4.1.0"
}

View File

@@ -9,9 +9,9 @@
"lint": "next lint"
},
"dependencies": {
"@semaphore-protocol/core": "4.11.0",
"@semaphore-protocol/data": "4.11.0",
"@semaphore-protocol/utils": "4.11.0",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/data": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"ethers": "^6.13.4",
"next": "14.1.0",
"next-pwa": "^5.6.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/cli-template-monorepo-ethers",
"version": "4.11.0",
"version": "4.14.0",
"description": "Semaphore Hardhat + Next.js + SemaphoreEthers template.",
"license": "Unlicense",
"files": [

View File

@@ -20,9 +20,9 @@
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
"@nomicfoundation/hardhat-toolbox": "^4.0.0",
"@nomicfoundation/hardhat-verify": "^2.0.0",
"@semaphore-protocol/core": "4.11.0",
"@semaphore-protocol/hardhat": "4.11.0",
"@semaphore-protocol/utils": "4.11.0",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/hardhat": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"@typechain/ethers-v6": "^0.5.0",
"@typechain/hardhat": "^9.0.0",
"@types/chai": "^4.2.0",
@@ -50,7 +50,7 @@
"typescript": "^5.3.3"
},
"dependencies": {
"@semaphore-protocol/contracts": "4.11.0"
"@semaphore-protocol/contracts": "4.14.0"
},
"packageManager": "yarn@4.1.0"
}

View File

@@ -9,9 +9,9 @@
"lint": "next lint"
},
"dependencies": {
"@semaphore-protocol/core": "4.11.0",
"@semaphore-protocol/data": "4.11.0",
"@semaphore-protocol/utils": "4.11.0",
"@semaphore-protocol/core": "4.14.0",
"@semaphore-protocol/data": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"ethers": "^6.13.4",
"next": "14.1.0",
"next-pwa": "^5.6.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/cli-template-monorepo-subgraph",
"version": "4.11.0",
"version": "4.14.0",
"description": "Semaphore Hardhat + Next.js + SemaphoreSubgraph template.",
"license": "Unlicense",
"files": [

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,7 +1,7 @@
{
"name": "@semaphore-protocol/cli",
"type": "module",
"version": "4.11.0",
"version": "4.14.0",
"description": "A command line tool to set up your Semaphore project and get group data.",
"license": "MIT",
"bin": {
@@ -41,8 +41,8 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"dependencies": {
"@semaphore-protocol/data": "4.11.0",
"@semaphore-protocol/utils": "4.11.0",
"@semaphore-protocol/data": "4.14.0",
"@semaphore-protocol/utils": "4.14.0",
"axios": "^1.6.7",
"boxen": "^7.1.1",
"chalk": "^5.3.0",

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.23 <=0.8.28;
pragma solidity >=0.8.23 <0.9.0;
import {ISemaphore} from "./interfaces/ISemaphore.sol";
import {ISemaphoreVerifier} from "./interfaces/ISemaphoreVerifier.sol";

View File

@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.23 <=0.8.28;
pragma solidity >=0.8.23 <0.9.0;
/// @dev Minimum supported tree depth.
uint8 constant MIN_DEPTH = 1;

View File

@@ -1,5 +1,5 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.23 <=0.8.28;
pragma solidity >=0.8.23 <0.9.0;
import {ISemaphoreGroups} from "../interfaces/ISemaphoreGroups.sol";
import {InternalLeanIMT, LeanIMTData} from "@zk-kit/lean-imt.sol/InternalLeanIMT.sol";

View File

@@ -1,7 +1,7 @@
// SPDX-License-Identifier: MIT
// Part of this file was generated with [snarkJS](https://github.com/iden3/snarkjs).
pragma solidity >=0.8.23 <=0.8.28;
pragma solidity >=0.8.23 <0.9.0;
import {MAX_DEPTH} from "./Constants.sol";
import {SemaphoreVerifierKeyPts} from "./SemaphoreVerifierKeyPts.sol";

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: MIT
// Part of this file was generated with [snarkJS](https://github.com/iden3/snarkjs).
pragma solidity >=0.8.23 <=0.8.28;
pragma solidity >=0.8.23 <0.9.0;
library SemaphoreVerifierKeyPts {
error Semaphore__VKPtBytesMaxDepthInvariantViolated(uint256 actual, uint256 expected);
@@ -10,454 +10,454 @@ library SemaphoreVerifierKeyPts {
// It allows to use the same verifier to verify proofs for all the tree depths supported by Semaphore.
uint256 private constant SET_SIZE = 14;
bytes private constant VK_POINT_BYTES =
hex"289691d7705934b5504ae4bd7be283f3465af66f62fc7f1e66f03876b445efdd"
hex"22a0bebada6ba60c3e190e9e8c2b1420244a14c9e02868b862c7945667416f9a"
hex"036ab5249fee75e0644ed259d45fbbd0142b638e421b948f5dc00cf3ff14a530"
hex"1bcf8d4f8bf886d2c7960badc94b3abf6beb4e43571d2b4b0f14928c10e0d594"
hex"2d8c51b7fa4ea9ea16765377aaae4ae0a416a89b600fc0b8ec35e9e6e5621976"
hex"1f2c636b4954a865946d69fed3ecd2bb60a61af38fa31f2a290ae28915d1f6e1"
hex"0b412b14d9dddf3f9031ffb51eb3f73602b9e49cfa9bec4a02ec9c0e3020ccc3"
hex"0ae9889ae5f4f6021af9e16dd1f2c445ed863fd6a374b329337f2fef4715350d"
hex"07f75b300b401d2435b96459d2b64f6f848411f246d8478199dd2351a35c1b5e"
hex"195a26806d907b6d9a9a9c235e09a48e94f8eb8da80f0d40bc4143e3d006e6d2"
hex"2d0006337513747c51f8f3e87364d2852113a83e586ef629c88cee6d4cbd422f"
hex"257aeaec24103ea15e4592c32d0ad9846ff1a2f3a836e0c19947980912b9006b"
hex"294bead7a3378f80183af735f6bc8529ddc73d9e0a35d594dcf93524403c9e3e"
hex"0cf84e9163744a9a65520f4b8cbb4ca35c428d1c4a5789e11f42636c6d197473"
hex"21f43b1ffa301d565dbc37ef1eb2ef669b8a1876e3754b79657b26fe43c845ce"
hex"1e558b2ca618dfa02f0d640fdd45f56492a577154989cd09523829b5e15f2d62"
hex"04db437b7b4fa0f6eea95403dd25c6a674b3e81be98ad4532affe8507ec05380"
hex"20376c16b97ad98b8dfaa6f10d42a3c5e264c56018d32b0e8af528db157eb60d"
hex"234219fd49f941520883c13c1f01ff7b2f7f512a3046f91d33cdc3900ffb9de9"
hex"1d754d84438f79e6b701f7d665d59755a7bcd0b63f7c2da94b737606c16de1d3"
hex"287a08af195521f756271ec64bdc4ca8a7a95fae892c0fd2cf0c148d6c0cb653"
hex"0e16af35936b356d5974b385528f6d9a873568eda614ed0e54be4494c2acdefd"
hex"0fae7f745efa5884dc82f1595b5c10d931ed6da07b5dc4bd6f99dd5318c7c2a8"
hex"21f41494c6685503d748b45672c65d059260bb205113882458c86f6da7ea3813"
hex"1ec11e919c80981c8a905161c48caab360994e8f31cfe88536c5ad8b2c360039"
hex"14f32ba1f584bafc3aa283f79d5d65e97a6a280c7c51cec192ee9e48d593a2be"
hex"0cec3b3618ebb60152be2987b910940e79a421d666a71764f25ded99159de90f"
hex"075a80d650b5c6f8a0b3261ae5ec4c5a1b53762f30c559aaa6c501e207c2514f"
hex"026c5d81cf4e6cbade3622323c4ee3b4568333e79504044d2ad4d2ba01abefc5"
hex"286bacad6fb92895c85483e837d7c821d3f7bd612ddd932c16d618455ee62a45"
hex"11a11b68cb7aa85f42325a3d0fa45e0887719f05c9cd472183b1c7c78eabd0ef"
hex"0674f14710e453bc1f9255babc8d2aeb3b2e321c68e6871b54c285e71456be4d"
hex"11bf8be1878d5dee6820ec405b079360da81da7b79f29aa54096ae195ea1108d"
hex"2a02d0a645dcfcafb2235e7f9ed37df27c3f7cbd5ad11ee831fa17cb36881d3f"
hex"1e2338342dcdeec5d3ebd82d4b767ed93989d9147ac711dd07d8aebac0962c20"
hex"174c21361611783b0dc90d87a6128cd4d7e427cca10db1d713495d8281ce3dac"
hex"22654673d8af40026294acb3c0e51f0f367576d83a554bd9ad72de06a796095e"
hex"08f410159146e32feb7a585ad437c4a48ff2109d7f74f58e709b66c292e1c690"
hex"160928e9343db00c99255a53ea3948b547d0bb68332069c2d5ca632156a53ac8"
hex"1b8e0ca895ea976f5d42029c964ea52d622388e90f947cba08b3924b470d84a0"
hex"2f21e5bcc52e6d794afbf44a0dcb938554c7c94fbde66c1b7965ebb2d266d6be"
hex"106d51a9231260949c37fcb7c8296c246566259829e98ef52683900a433ad7d7"
hex"1f0691902d412d4afe6e49f546ad03d739f42a159af9530d717c01a3e9bc86b7"
hex"26c15552cf455e161693ea7f01601fed166f79653153fb5beec9e8393c1efde5"
hex"0223f9fa8192ae6be752d29b47e8b8a75e2172fbd4c89cfec400a9766e1430a8"
hex"100341a4e94a5cfffa3c6cfa1be6ac3bf6b0c4fe578f8c99cc4f67e4d7bf4886"
hex"1a9194b8c654ebf4f3cbb607c8bff2ddebaff87b8bdec06745ad4ed802728a6f"
hex"0a7e869e75859fe47e51b3b79ad155670af4e6780d3edd3c13812db0197854d3"
hex"0ef4a576b0bef4d037549aa24282378e13b438fc9bf49efcfd65cf3aa8935d28"
hex"199af24c0e98e72c37d87bfb9386003c2a0192ccf015be777c4305d5eaaf0e81"
hex"06e7f2d897f05617580ccc132040f3b83f3fe1a496354b33f39d27b15fb2a5fe"
hex"07968d5b67877cf32da7858c85479a891164a19b1ddc26fdb2772d294addf3b6"
hex"1b4dc215f06081e276803f1650d67324801c0a4f48d4b4fac9f6650d2fcd901c"
hex"0c5a5f0969147d312118768cd73a762e53d3984088be93e46d8433d129939427"
hex"1a948b5fcbf5918fad1f3c69d9d58c2df72cd9a15ff57a35c86c9e5082ee4090"
hex"0532f7499522ad56592a815a303b33b648fe170e0c2f47d831255298200cd775"
hex"22cce52f921a79b56993baaa1854b37ea74caf7e6f2d957048fe5e5d1e536ce2"
hex"1ca9ca03dcd6b6539118fc036663b6deae0bdb0df258f18e23613f4e80bd5bca"
hex"2f7a2d324bace30583592592d82bb970ed33f9753d03dcd3b54a44af04a0f1c0"
hex"0f6008b6f13bcf8f2663e7392e2538406a7cdf15ad387e2eda92bb1de03f74f0"
hex"06e30762808351c935656ddd7ac3499a2b497991d02f54c178277fce024ce89b"
hex"1a087e883f78b0e1ecbc92dbe9d82258e4c91baac53d71836902953f8e5a6961"
hex"0d35fd011b125ac12fd1d7c655fbb7b1ebc9eb47008676c750907f7768f6d644"
hex"183a077e1a0a2dba1ffcf7e2a490859a5f60d5d04b3599506249b6d534848ba2"
hex"24230c1864237bf6dc8d6b3e40bb277c02dab92e86aa515aaa62b1ad496b8290"
hex"075a995ae152c5f9737f6848a2d5ef93a8e7809981a06834ef8b684390456011"
hex"2dcfb2766574efd57331146186055ee967cdd14d5efac43389a29605d13d561c"
hex"05a4a1353e53e1b5622a2200ee1fb2e1a8e224a8ec5554bb670bb377505cb615"
hex"064cb205829acdaf1af3d45060ffa3433c02d3a7ae61b66ece50967b97e1f04a"
hex"1af278018cfd4d2edc11dd77454ed0cc4ef3ca1dba5b0ba96bb2bdc43f1e8ef0"
hex"23e7488f10d910e129d466443a7adb99fad7ac0b0bb37a51c9d0f1b7c527a98d"
hex"29594b068af04ce6fe6b248aeb06051d6f66a39d9f3d13cdde5b343f31ec16ea"
hex"1e63fabe17ec748ba86bf78cd84029d23ca6c543ee800179dad25964fae41cca"
hex"2acc46fb9f4ba2abecc49ddb33c0314c7a940bfa021c07d44a73614599995ea1"
hex"0d520400f15c87d18376ebfc03c8ed06b9ed713a654a0024cf310b64175d1064"
hex"188ef3fd8a2134f2d4237dd7657f410ba5172ae081a6ca117dc21c7ffe71d6bf"
hex"06a71b093737f1ebae5924f2d5f47b8b14526c4831c50f9e9c7c032dc011e511"
hex"175921f58fb9fd90e2a1d2cf951ad606104a1676c9d2e6fc8fee6ea105239035"
hex"236859cb45dff68ffa2524619936a9cb457d2c0defe59b5863607e439369f316"
hex"28e0e101f6b62767f587d7dd8e0a4d4e32fbed3fc65c940d8aa8509bd826e33f"
hex"0158d4f5cd5085c6e4ae2fd1330a52435eb0745d54c7c8a6ad5b7a3cf5333a7a"
hex"05dfca18855acba1a5409f714a77297952277658af5e7d5e3a05bacd0b8005d1"
hex"1edb9f2871655c1418f9c7b5851dd8b1713d1f9d7d78c9b915b2d3ecb62e7569"
hex"10d33c3349ddff796b66b2c800a9fdf51d44235d14d74def1b2c112bf88647d0"
hex"0e55341297ed43dfa1312685a260ec51b42ed6c24e46b79900549fd023441282"
hex"0a1654efc1b702b4ffbcd21a9e0e3323a40e4a136bfa0cf81cf01bd89d433c56"
hex"148f5bd214818a2b59ed67a8d79e54a048f357989e2046b3e7b587dc4893896b"
hex"24d21716ac3c7fa8d8945b7b04479a0b397b8fe46e3424c0db7e1d7d824e40de"
hex"2830e9e432e9bc3e8dc48c98c12ee9081273f5be246347769d0a34e2f0e7ec3f"
hex"012e850e98e970f096522ef6f4f537529f296f7f3ec9ade921780c45fca74e57"
hex"1eb45ad2eccb950133aec7d4da6d03c301cebe782ba71e3533d5a0879bd6d0c7"
hex"1ce082f6108befc4c6133865cdf1b35a587868b99c36f59811bd3771a75c3753"
hex"21d1d3327b86bcb2514eac6f11a77867856f5a2cb24ff4f72f65742854baa0a3"
hex"072a1c2e8d55ba7a49807bbf09ad71e000d67b09bba8ea2ec6009086342753a7"
hex"1c9b7142435f0c29a9ad5549dcb9ac289104f48d39d4e196025268dfa1b6a255"
hex"00e7f5e830053d6bd9dbd5a2546f2b38820b7ec18b55b638f189c2cb86598288"
hex"0ab8a2d0b81f7a40ac8a6a8bed4df0643df2a4dd4606194c8508595e116f39f3"
hex"166b4f313145815f8ab8a09e6fac91e3cfa404438c8c430dda4d121eef70a9bc"
hex"0937ff264a4c22904c66b8466165d9302052f5687326970486277a54f458717b"
hex"23d014ce251eb044d74105355f1ae0b5dcdf0ef73fece10777328b86b0bb4d07"
hex"276c1c219fdc62892dd095536db3525c18d0409121171197c99bdd8a95eb2f5a"
hex"235d6ab6cef9830493b2c71bacd3782d67eeffacf4aed5bc07c2524203344cd3"
hex"1ad0bb296be4e478c61149c736ad66168c2d0ba4410e05513c1af1ebe644b076"
hex"0360722094dd4a26a16d8f12264b25accafdc6a3f55736f0de1e55dbdb28d02a"
hex"088b276813522c901c6ac134a1ffa00cd61276e1221bbd7ff377d1dba5e1beb1"
hex"243cd531b8f9fcb0cd9e8d9418c6e9306b89d96e0136eeaa66ebdb248bfd08f4"
hex"02a12915178a6e7d4a612dbc3a878db9ce7153bdc9130d3df7308c13b2e97fb0"
hex"05819bfdd569b0009e9bd1f9a41c7eb23ec33d8cd37d5d05b705b4511dc09f0e"
hex"05d2260582a4a391c8180a17189b98a53b831ebced724333194f2f6809571401"
hex"185017332cad227b54dca48915a4a78875967f8ed352fd96d5446946a64b4297"
hex"08192db4386fcba811f000733a6f28b929be4f9aa1d2140ccc3f9616f82f34cc"
hex"1281dc4a2838c70842102a997a6bc26a737209d42266e815738ec3943516e150"
hex"279e9dd39bd768a08ad9ceca41993b8e8408d025affd64237b5985ed9a37d52a"
hex"11bee6efbee9ff1ffe2f060d79bd751d43bfdec4d5fa5e323582f8d735f44c7b"
hex"1bb75e2ad0bf3e1f255a9e983428b9baa96cfae8bf71d1aa4d3a786235e21065"
hex"28941f264db478bce46c697bc574a5dc0b956d033eb29194de103a9a70bccdeb"
hex"19d5cfb9c2ace7ec529ea27438d22668f09c2acbdc9c099bbd5554a6f3ae145a"
hex"29fbde88fcb5e46ca563fad42cc7e26ddbdc0e655f88057a8a8f6e51354f74db"
hex"1dd99423b0d860b8ee34e292b4616f7c870094c265f52cc450f98a575323872e"
hex"2400a80de9d38f539c9b0b9580ccb9ae2e382f3092a657ff50a83ea03a4ba7d6"
hex"20a5b9553d48bdf8ff66139e723e6a1655823b62add790b62e605d90044bec0e"
hex"196df524c0987fe4b832add37f546b835dd259e7c03de7226a43a6a062b4e61c"
hex"2ea4e4d02236497c570aeac4ea1896e1e3a19343f6e50eadb273cb5a7becdad2"
hex"0800ed797700c5e269e0c1edf4947c65348976d4a67e16ee547c6c870c36e3d7"
hex"09df4796e7cc0d89f1fc722c7d967d4c0baa823f93f9c4d6c7913edd185bc11c"
hex"23442bab611ff64c7eb49ab07f32f52008673d80ba54e04bbc5c61ca1f0c3836"
hex"2f5baea6ca93f7a41762a2b4f5b6c31c4e0d140e422fbe379f2686522dccb035"
hex"288e0e05b537a48d5470921b9d724c26fb8d2900dc7d6f0741ba2c1a35138c17"
hex"24584003a84247aeb78b30e2d8fb4cf7147785647ddeb68a7df6a79ff84fb008"
hex"219b35214df5048253b823fcaf329a45a2ae7f959af6539ae7753e3554d28996"
hex"21795fa4312815b80472036b9f35c1495378f172c7157a9440e62ee46692ace6"
hex"1052d93c57b9902620b22e1c29b9106ad076f25f69fed4106736de133d72ecb7"
hex"1948cc83425a81e7f7c6486e0f08b4b412724759ce41f950d65fa5283c31a4c2"
hex"26769518d0ab71ba583b0022557cddceec3566637a6c1c519999523b44d953ba"
hex"13a68997032013798fc580d466367a6a04502f500f7dcf4c2e6e03e777484908"
hex"2668cc07461b1088861db6bf4c03528227a20d2b473e088aff34daa78be83800"
hex"0bed18cab0f02716c9ee5e68f2434a241e6784ba03ca69df0edd97dd72038b6c"
hex"2e04d93cc4f54309390fe572d6affd4cbb1989ddcf410fb476e3a8681656efaf"
hex"18b0b7c0a137e1454dd3ca510d220987b5aaa51124e157fa372ec6099a03a714"
hex"0354150d34ffc1b4ea2bcc2d705f72e2bfac4619f6ba35de7a5c08d5d7ec34b7"
hex"12c1195df5fc75284ebe217430760ab4862de0255f75dbe24f4fe60f90c3419d"
hex"03630b0da0e292c1088354c075dd1e00694fc14db1878a5cfacf2b7b797742e5"
hex"16d451a52d64de482f4bf60beb30fa565a4e29904042fe36288002bb84325d5a"
hex"0664003075b0ef9bfd1573f70b84f7b75ce76563169be92df533d5aeb47ffbe7"
hex"0b41ef4deb720d4d2fe7dc11b4483b3d0b226ef5cfd8ba9a4e46bea1018fbb64"
hex"298c7227e27ecf7291ff64ebbab81169202697e8e76afbe9fe1504243b4077b3"
hex"0cddb62d67cbb120c38a93a9d10466381bcc71a202ee0a75f1bf952ac1c61a00"
hex"1f251e0231fb968a4b39bd089704ca99438b645cfc29920e0f8f4988f77e9597"
hex"0ec2e8e1aa9376bd31702a93e024f654ed26a324bf744d53271e510a1f7cc2ff"
hex"1155f64822affa2c0d2fcd555aa5dad8698731fca61bd3a3d072cf33c1a8d9f8"
hex"15699cea496017d4bf9fcf96e5a384e7c105d2ac074571e600afd0e9b4e7e8b2"
hex"1e85323381cf7d3ba3431e64e894ce4d693f0c463b6d104dd33dedd7f1b9f081"
hex"004b64f1d7c848aa7c28d6a815b7ec34ff2bb76d2d8c25f93265ad8b20b7140b"
hex"0dd34779b2145df8b131bfb71ffed5c835d2b696299ed813bb472be2f3a880ea"
hex"0e1abda56faf0df6daf6b166c95c5edc97bac1f73d539a4e419e36cae7ee1d92"
hex"11c1659cf668bedf75fe21edb2ff2b1fc695bbd538c1331845f24839897b6200"
hex"21bdf685c361d30014b4396b358599cefdc9d5f3b464d67a54c9cb2978925710"
hex"1b7153446f1040fd153236c214b0b502ccb8c202c54ddfa527132962133d3988"
hex"19a23ee53b40796801a094627b87364921ae981e57f9f478ddb3fe9e3050dbf3"
hex"0c3793885e6423402d09a54736d9a0fab9f8e5edf858b7be1710b5ee2a46c8ae"
hex"1dad8846162762182f95a6360199cd0ccad756cea2e4fbb6f17bf7bb643cc6ea"
hex"0185b530295447254ce398130e4f1bac6a4135c8b9be462422bb6ed88d7d8156"
hex"0cc09061f82989f499b935c855c6446ee4c02f2b5ec74205bb2681a3d39cae95"
hex"1e785e3c3ce8c5a93d9a16f466e1df548f855d70d18613fe8dd861f3e4f486c6"
hex"04715136d512b998cab28f4cada627caf8da082e1b11e2438ae4f8ed17b259ec"
hex"16b21b75881cfd9f0ae30c2ebb472bcfafd4c09ff390f3a381e2098d9b057cf1"
hex"1ce1a91c61b317ca6f871105d6034a1ae73832671555965c2deeb24c5da51ce2"
hex"1382891a3df8d5ba54ddcbd4a9061a4574b0a4813c7d5fd49797bcd8ebbda4b6"
hex"28b1699345f2327ed7e3a35dbcac11e9704a2d019568e273b2ddbbdda61b96f1"
hex"1875cf03eaefd3c4a503d2499a9524ba9c8e8b1906511a4a85800ee21ad424b3"
hex"2d1b12c661616bf91e9616cf0dd1823f5e33799035dd1bcb92bbb8bd7b9fb5cd"
hex"1764a79b21973a65541bb9bf58bae57a63de6e20a207369f85b0ece77b1da388"
hex"22852209e2034dac637154e40c26004c7d2f8d6b0f2f649fe920d916a0b9608b"
hex"19bad11fd19291c1d7aba146796c8bc076303184293b05257a2e95aa1b35be93"
hex"017ede6c3a4fadb0c3b384fc1bb3ba2515ede2ddf470bbc5279817dccba8486f"
hex"20dc05e84fe2b3674dbf6cfbc4ea1888a95c385a682b198665ea24fe875f9182"
hex"0c6eb30738c6c686153cef7a45b97d5da153ed62a67f725af666c8f545414326"
hex"1b2e0303ea261450c0505cdcf6d8c5a1fe7c840287ff532d632de4cd4b899b07"
hex"25d247a3eaf394fba18917bc67089efdf773445090ab333538b9db6dd2aa34bc"
hex"0189a235ce7315920cc9633d5dc1c072cad0ebe0e95a07a0a7f6152bb14345c5"
hex"118ec9dfcdb51980db3cdbc0b4917ecc57a03dd0c8586ed23145fb8af86e64f9"
hex"2af16757fe4fb59efbf68b60493d51df19d06df73ff34828b9b0805b3a12512c"
hex"0649e85e611b0ea226cd5195e88f479ca348748e3aceb994208fdeca397d1c93"
hex"0d13a131ca0eb5a309eed385c046002c368bc570ea227bb02cc92be5e30820fd"
hex"2444558ba0ba9ab3e990299dc09f450bae4c4c92829a42c6943c451cc858e346"
hex"24e06233837107b33fc5cb27ac7baf78d48735d71cabebf68bbe8437ec15e57a"
hex"1f5903dfda34ef89110f00cc07959025cf325ee02f81046cc48105d3e5930bfc"
hex"20093ac8cbfca0030d78cc010018beb1b3e689d52956baa0c54ceaf858488e22"
hex"2ee9cc8d4c5e47162bf7386e4325e3a513e6d4f4458f5e01fc343e340124c0fd"
hex"1e2f5897ab3f2279bc761e37a8c20cf48a6bb27fb6da5bf0a5f67fca6ad93e1a"
hex"0e9ae19d75c9f500b45f68de80244090eb66f42dab81886a78645cb1bfb27931"
hex"0f78e982ab46a572920bb2e18383e1427da1df92db1f3665498c719a7af869d2"
hex"22c0107166bb0aa5b0885983712566f8e0b4471e69d88ebdb7d0173345a2cee8"
hex"0d8d1c4837d9de3b2d429fe96aa4f29fce440e52141ae4571cb1f1d7735af86c"
hex"07240e3b2aa1472c3c81dbc49bfb3e866b43f778158a3fd6641a773da5241474"
hex"037cb0fc644b2a88c90ee66cc4ddb962336347ccaecd1f4fa8eb567c04544655"
hex"11badee113262abf691cc75f28c0236812d76537940e970f4488fbce2ccb46e7"
hex"0e0fec7749cda728fb17b5b1ff968bd3b6433dd6dd6cc619e8ab2eae099ffb48"
hex"28f906c82568287d2256b56129e8b83944f9ee180627afbc9d510fdb7b392458"
hex"129e691ecb7b6fe77c01d70bf2628fe69e5f6e962f1029ce626a0d1888624145"
hex"2f8d1c3dddbd8cb59cbec15b623aa1309d12221f7c62d956815c924114ec8677"
hex"27db4f836bee8aa950940cc1732aa52d0e741ae355a8c3621ad068c043f77cff"
hex"2005b28ce7c5532ebf6b7e51d10c344c9a9b00836e4fc37f7eb1176d640c1906"
hex"0aa65efff54d1d497ece96910f6661001fb199d24c3cf997ce1e401788a382ac"
hex"17dbdc878bd81276bd23b35fe31d93f4d7cb65b722e65d58fe039d126524bb4b"
hex"26dadd32b90572e617c96576afcb2fcd9605b1d898b2366fd9a7cd0c23769da9"
hex"2e46b7b8c48234c4466b0be922a9525a8896b2d6cc9651b2f6f291cf2bd72b85"
hex"04523ff71405a30800020b61ac9a1e6b61ca68f9859f6bf1106f2a0fb66d5da3"
hex"05a3e48cdcb56d89222f017078cf35af105ab2b2e2cdb7adc3d71de732d2f220"
hex"08d6aec49dcb622b4b6033438a7b990f6e08a2d41909392a890d6ab2970c4fcb"
hex"2de53850b4466695b93e50172ffcc6ff47c882aa9444bb09652ee9f5a4f43e82"
hex"19963fd677971a8f8f1fe5d09bd27ad0676c59c6b99cc2c46d8a886716e16a0a"
hex"2b0e85311370de1c8442d4216cb8ccff3d36a6765addb8a188408eff04a488a6"
hex"30620acc22c938e923607f077ab953afc8412ab4cd325b812e18b36db9ea03c2"
hex"1a2fd212df4bf20f8e47cfe5c5285a3706f8ab9863ea128054bafa1fe192afc2"
hex"28dad5eeef0e864876e671e4a960e451d5cb11204eb0f7dedb1d1bea322aeaad"
hex"09ce122c5b6d149f0192436aeccf959f73db3968cbe69f6c2dc955c1a8644eff"
hex"00b33c6fe57db259f1f62f8df50692e8d8c36a22c77234e0d81dea745254adbf"
hex"2b5b16738d4e4e8f30d8073c01e34d8a784bc6b41ec8e2afa5c8d2347b145ed4"
hex"0ce970cfdbc28f9bb3195dd2fb274f9895a29a996aadbdaa4cee11b546cfdfdb"
hex"0822416fe28cab89c713f9ab14d28a3d22a7033c1ada634ce7928681369e9b61"
hex"15d6ee8f939ad0609d6eb842084c6ca07a055e83ae2d1a0109498f8b7ee9bbf0"
hex"24cd8f5ffaa9da4f482d9efec43b3e1c77e8eab2f44007269b14614c932ebdd0"
hex"2093e404029042625197d41362d07884031eb192890e18ac0b1e4237afe74020"
hex"06c7641b87a6aff30a7828f5a61b6b79949489013a23ae8f138bb6458a727980"
hex"11945363118e8c1728e09565b5ba8e9c322b281d50c81d9ff94a18612ac41f7e"
hex"1e0557a57f3b98074694b3bc37edf005f0129ba8ab7aeef1346dc1b94cc283ef"
hex"2be1c91a0c0747ed6b472d5a6103ca79844f6fac466e756e51599951b0ad1c8b"
hex"0f4dca5aaa01292e52a8a19a994dfb8ae96163872353ec485ccf1a2c6bf2b0a3"
hex"16be623636b1118ec0511c5c0aa630833c542c80ca87898c8d8a0c9c6432f920"
hex"0dfe1f87f83f760e4779993ebb87b600763a78a1e0022f2a3c083730c09930e2"
hex"185bb62bd0f1e1ec17991ed4246cbcadc9d17af7f85d2583b555b293b85cb3ba"
hex"103959d3005c53566ecf636f2d99b94266ae10f20d7941d94ab52b1e66c99a2a"
hex"24903de01d4c24236f18e0a72f1485b8e8e0eba5385dd2ccf3da36f42f29f29c"
hex"0b5c24e7cd6e5d92ca2e92b79c3cd608a0cbfe8b2940aca50db477bbbf676188"
hex"191656e0acf10df4d56c25255747160742762fc2d37e507e563b9c2b2158231c"
hex"24fda5b8762d28c2cb390432cce54693def5c5d8cf3f1a820bff33763673116e"
hex"0bb80254eea5b1630deb61300db47c2e3e9d43c0ae79ac6d8d8e5dacb30b421c"
hex"0e88460520595dd83aefc1ea925bc7b76faabbd79339a6862c8b8ae500e61ad9"
hex"244cffc3946a184f713d5239638a2e1d795aeee5ee445c9f9aab6409e735b88f"
hex"021554cd4ee080447d929f96556906a5504df942919385bc5e64cedbf2ae394d"
hex"27ace9d675fc4a5fbaa1418f1420ae54e57c8343a69843ac97c5ebcc81782032"
hex"0e5d6c9eda47e171d3f5a2edb52448f00acda78580b066fc588b39aa09638a85"
hex"0a2a0dcb9dd824a85d72255623c47308a71ac9c4b4f6bda9d273b1c1f88b629c"
hex"2d80cf2b46f3ac5285aad169e96b067b01de824253f4156311196ba6e4bc2104"
hex"0cf1b3cc75b68e63af37eb275714561af525bfbb82497cd4730215975d8a3cd6"
hex"1df43394141f318ee9571c1ed93198d282288da8bcb5b33e3c6f1e9269a76304"
hex"1064a0d92da154a1b43895e1833b6bac67e096996e0db5bc1447c30bbdcb5bc3"
hex"0253f837b9e9f89777891e37357c8654e1a5d5ea0262afd58136f1c1c969d395"
hex"0173e90b1dc6b589a510c7364be31128cacd0baf495fbb9161024b880c18e97e"
hex"2a3395c5515973f8ebbdf18b8fb573eb46a4e8fc88c2f159cc6be94c7aa35e0d"
hex"1be4bfc35f47cd93bee0e1adc16a0957f824a9e24f31a32c372e97b6a2f9a71d"
hex"147f33857a0febcfe896dc770f9a2a86a7089b55a396afffe4bb21d5321e1d7a"
hex"1230faf580d4ac8a0a7d8f3fcf457f63ab27cc54c5820739bf6437bc43eaecbb"
hex"2cbf7af588268ced22cad9f5a9254d95c5f47127387655ee36dc94d70d139296"
hex"0825e78b37cc551183bcb25b98363522c0a801206000c6ded60985718b46ab24"
hex"00ad0b22c9addd5f71d90a7578913c0da692d7bb9230c78d6f6273114df69d73"
hex"210957b327089cd3495ba001efc730c8f84d824fdf9448c277d02379b694d0bd"
hex"1a4012ba18c18efb60b94d7fb0fb750ba948a5c73e55ffe464ebf7acbd04fb81"
hex"24a0432f67e42bc4409433b85588fa6d16dc93432fb633ec1170e1de3d258e7e"
hex"287d7479896cec61832a3e7e5e257209609c6af97c315bb08473de27be705f83"
hex"1301c5336b7f37607888212f40b73bd0aea535cc7148be0f9cddeef1f397b8dc"
hex"1c1bd11368695d776b6d4f51d8b9a3ff091dc23b438ad3a8e00f435768543c95"
hex"20ed4fde81fe5b8cde1b1b005cc5a470003b8a12d74d4178d03351cfd620c9a4"
hex"1861979a4209de561feab4faa20b540fafe14a2f47815d1d6f756882735645e3"
hex"0f50fe0714b48545aad0aa47edf4cf85b77edef8420cadbb2ab055537896841d"
hex"009bb5d21aeb5bf32e1a0a2c6d2f7a0044c7bae33fa95f6264135534b5aa1a17"
hex"10398fce470a822d6e5bf4a572fc5aa091e664335a8f0e5f4b82ba80dbd25d8d"
hex"050d8d517b496e2067860366e267a33cceafe24e53584565511927952e43f160"
hex"218634834c0bd7a41a100548c68c54d6d47e30ba6841925ce0afeb3aea683856"
hex"00156ed62144c5a67173008b02d76e28126ca00a2819c0bb3eb4cc92c196f893"
hex"2b0efd5fccfbbd5f77198a0d800e01d63679db7ee5dc4213c4a1e82b47ce07ca"
hex"040540c023f617d52c1ccbd2d9e825d8f60a2f6cc6c7e0230f8c259659cdc082"
hex"11739844b03202e6faab271c897dfa7bef337a5b0672ab13ebe547f572a089fe"
hex"304aeed0c9d0c871f87128dbbb634322c5449164a13028e7f8e46ea7eaf5861a"
hex"1eb1cdadf95c5ae983ef642bfb86f103558afc4571483cb7585a00715580fdd8"
hex"06c4f741b7246e5655a575e85661422ec7b71e79535db2ab86ca6105124a2f14"
hex"28d9f82f7cf626d8bf29d5a074bf2e8a64a11e8b415465ec3366cc0e4af15eb0"
hex"0af3afb40024843ffe9126a492594cff90682e2c4afa7237bc901e70a081e68a"
hex"01e0d9ee7d4bfb5b07b2d9102409de25c281bbbdd10f2bbdb04adf4a2e467df3"
hex"108a7206cd0ab67ebc298481ce73bbff082a5434b01e26d8ec53ea69f7dddf6b"
hex"08619279b0aa0c5e4f7e0ba18b37dfcb3ab7762debd778e1675539e2023fe000"
hex"26df8a6518857f2cf15a8dd27eb05fd4854710b80ae479cc3dbb4963dbb61401"
hex"29ebe07739ab8b1f23d828751d533ea3630788c03835c7ade9de2fc725639be6"
hex"27448ecbcaa51b958aee7c6415c041b815de8940e427fe2152c77639f3c5e7db"
hex"0699e2a03a056f4a0323541d174c4d8c1d71a7b04c664aeea06aaf2f97849623"
hex"1f2c0d82e6d3dbd8f29d81dcba037666a0567564fed3a90a34f4c2a0864fe6a1"
hex"18678798666318a2f6c93fc93d788c258f01c5aa450b65f4927ba6308f7a99ab"
hex"0fae315f1aa96516b51b9a35b0bf04a303290f7a4b0f107434e88c9b897d8ef3"
hex"2dbea8b90191f27ec6c6a71c3b576ccc10b6945a2d651b526b36c86929d7dab3"
hex"195b1cd7777a95a1dccfab7ad95d9815d143fc6d86f974cd07417038811e143f"
hex"157f37337b54b492a344d0bdd2d2dfd3f27a74d529898ae3243bd532983b58d2"
hex"2337c69e87af024d6cb0d8f29c96ee48114d2e7b2c1535ad6b00e178977380bb"
hex"17569028d04252e77d46764676068c2e1d43bee814688c6881424210bee531ef"
hex"156682b6b037656dd8a82fd83ca1924074f752a207b2585ae4c9ea6f4c78c75d"
hex"1ed96542fc65f19260e0a755919c2e24659105c4c9df00ded15f93f442f6887c"
hex"12fadbd7a3c4fe425a3f30f0ddb2f375e471a373f27e43c8a494d9678e8e6093"
hex"1292950805f2f6b9f28b3182436c2a975dd365a59195dc4df585e87395c7c3a4"
hex"236a0085c40b7af8c4448e830057b33fe8df95a33647c37c55b225bd5f8b1c59"
hex"1db855703240e2f49d63e43c62f8c30b2a39b67bea6e9a9481146c046af276d6"
hex"11b6ed9c39e7cc8f66dc7f9b386ba00528af573aea6d008433d39881470fb564"
hex"29fde8616fbc9e483e1222d447832cb7bc58170c7ec86e8f4de9070e07eacaf6"
hex"08aaaf73c42c827990cd0c64687ae8cfa0b373da849a767ef3b63ca08327663a"
hex"0c85a554dd2ecef748e891cbd90386b5737d945603b56c887986f9a306d7de4b"
hex"18564645c2a77acd8cde744455ead6f28819282b59f662f7da89dec13b7623df"
hex"1b44633048278c6435e1449517b0235bc9f4c2cf39aaf34908726c3dd3a07a1b"
hex"29aa41f4a0e91cec6a4481c3280a94398f6ff1b0b07b39ab0e6668dde4383082"
hex"09a6e0f5ddbfbb30481e978e215f67468f31eaf930dca350f0fc53bee83f988b"
hex"04310eb11496a8955d0a91b51aead8dcd1703cdc4b0e7f2f4674ae3e588b595b"
hex"2a10a00f88b3abcfdb5d1c8dc9f8727d16373ae7fd05b239f7e5bc22909682d9"
hex"0901653987feda97752895523e956cffbcaa8d3f088d280cb19cf4d71f010a67"
hex"1d8b1d6227e7d72dbea884042ee1324bd31a5fbb7ed49b79f04e834245a552b5"
hex"157fdd0e905e98e890291c69bdcdf6307771876bb8288809b44e63bdc934710e"
hex"039909b2ef090b39137e7420aa7ef195656037f3482b4fc10e554341d68ec93d"
hex"2294fcb6a8d69542b31f9942a59c4f4503e188912dd1cff39640cc2217e1cc87"
hex"1865202fa3c02e817f2fcf395c446a3eecac5d97950a44ffe1e8d299e064e551"
hex"2aab2c1581a7dde08e01d9efd6c7fdc561b8c7e6fa75020b9534f2d3b35afc0b"
hex"0e550b117eb8b4be6223be3b32b3367819c099e5cee581ef44a2cc483073514b"
hex"0c317541eccfeb5a470e62a4a7183b1b22839e1a1c23bf58b6ee43d1fe87fa10"
hex"0c1bba8cab5dc7f68592841c2f9cee4e068d6791e55f4dd54edf7ecf336cef35"
hex"10f331f64e0bfe4a9226e772e395f992634eeb6219cc239dd5d8e03cbe1f4581"
hex"0bd16714d1d83b871586d6c721608db6150796aa7d942a7d6b7f37e1fe54d591"
hex"0ff184c75453103ce3e832ab21e3f16110827890bdeaef035641417fcb9b2c3c"
hex"142549f5302f25b6f4fd1abb1b586555dec7abb108c3d988222356f8845157a9"
hex"1a934f239cf4d919aa5a54e5706f63ccaedaa2a523aa75b6cb425fccd9b30276"
hex"0f63efea5bb28d9047c8ef3d06ef698f6eb8d69cc2968256b56ba2c6b1aa3250"
hex"07ccc054bd8707ae6a7e1136a7d734ca437bc91640e819bdb1161db6285b8482"
hex"09f695c935d12262fc81ea65c312cab7c604cebf8a7a8e32199912d3fc172f2d"
hex"0c39e4c9610d79d226d090265c7f961ce63aeab2e824e029ce1b89601913496a"
hex"0dc3486866c4ae74c9f7227bb2bc821fe2ea1a265a34e961cfe8e0548f0b2ff6"
hex"29b111d35a7ba7b41a2e65e5412dcceb796b31d0d87b9f1a4d24b028f2377d52"
hex"01ebd6d03eef5c45e78c52247c3282fcf64558e43ff15e1d39533389bd7a86f4"
hex"037518906b748ee732531e22b29338f4a4f42a0f216226011632c4fc7a592872"
hex"08482ad4d100cefeb5679cb8b4f6af5aa6b87f87d0a7815aebb30da0d927d3e6"
hex"13ba71984e13a4480217ff47b1055dbef0ed7333ff8403935f10785b4d212031"
hex"267080070a80b5f94ea5c4363d2d971036e8446f2c055ca49495145eca1ae9fe"
hex"2992670c4c90a20991d63058dd4a885b9ec25f2307e6dfb364be99f0ab596b56"
hex"0e91d00167f0fcdc484e4510cea659d39a58ea6d94188082c301d82be3a5beaa"
hex"06007fd0fb2de248dbc4fe010a14285eb1c67ab1035575cfe2c4a46e7169be02"
hex"24093f309708216779d4be610fbad6c37027359a6cd9af3253023c94bab25009"
hex"27dca5e53ccf2bcfabd9f056b2381845a855bf7947d600e6f85117b69e57ab64"
hex"124efae3d5bf327ab6ba6d4526a495aa613a1c141b4ccbe97dce4d2174af4975"
hex"1a32d049a2624f7c385673c88d7fea82a5c517b7fac655774c395cdce73099b6"
hex"0602b40c9255dbac3b084808ab31e76a1f050751bb6775dbada5d84691d27653"
hex"27ca9346b73ccb979a8d2890fd43bf51eedcd0a78af072f64ee41abb954bacfb"
hex"0b59bbaf1fcc4321f763a03b112189c055a31078afd0954b7d7ccf311615d3d0"
hex"1712fa34ac64c32e7ba17168f04876190ff32077be969a20cf83be9d04ecc5ba"
hex"2287f65a7cb3a473300d133636ba395a1cfe1b9cfbe68f106f114d46d453ac6e"
hex"058d32c610ee7b8e0025aa2f8fa532b3a6a45214fd7df4c35ad5112f545fbde3"
hex"14772040257c0366286283200970b7ee56d048cf3f6725fc8d9651a8234a6594"
hex"149de5e4a643c98e7261b75a27baeb89147605258f470c0291bf22880e6a9006"
hex"12c1e251dddced6445c3dcdcfcccc1c36736068f9e1f7bbc4063895df782b115"
hex"10427a865028d998dcea094cc2f8d0fa2efbd0040d0b118e4415dae71c92cfa3"
hex"1dced774d8572bfb42107f480682ff1c5ef95f657787a06997f53061d44cee6b"
hex"2033fe9a65b025cd7e27764e34562fbc6391cf8d31623f31b68f03d6a1d1404d"
hex"04b8c60cbb003fd65b2886da9263ee92021683e1af25189631d1725df8c16357"
hex"2d5f76b195591eca401fbd5d43e2992245ea9a4009a8ed600fcb0962ea5b845a"
hex"18cd73d9f8a31eab2560b9f00b08cc4517309f7100c34df4c3aeccbb3df8eb49"
hex"244478321b4748aef75677808a6a5d92a6964f298eb5e5337621398b0c1a4355"
hex"0700ca5f97215da057c3a4a16a260471ca887e12ab3a9fbaac6a61c67c38fb9b"
hex"1c8b2eec6c0535832e1ea214b890bcc72682c5bddb39f4ddf34500a5cb9a81aa"
hex"2d3d9f09f802a02b7324b79e9681debd2833f6238b22ae6622ba1a64e744f790"
hex"29e3aef42dc679892840c82352fa28d9140106d6c2ba6ada66fae52bff965eb4"
hex"0eb54e3e94c92cd24f6ec52eab577e80d8c8e9f2d39d6b8d69503967d9809fd2"
hex"1036bd833a94dd6a85559c519bb7a2769b6486b00d34996da228c08994f285b2"
hex"2f7362c30b976680185fcb2d6c1a9fc47ce47e77d3af5b773534e2ce7c2063dc"
hex"0f148ba271ab4c9b17837d44c14d231fe85b7644462249299a68b506bff87f4d"
hex"23eee74e2f9b8ee256ebaa6e03b545afa196f22ef7e96d7255f5e79bbb786c1c"
hex"165a455c205655a47926176b91f2d2c02ac5c00ad29b467bfdbd51b0768b3529"
hex"0d4bbf22a70348d22efdd5235eb6e682385197b4e17330c46c44ca6d5dfc6791"
hex"2841ddb730006e521446f952117b78effc601d10372438c4ba4f6e2608e9a510"
hex"21960d7a065af49c4c06053d32596d990c1a43cac1658dad807ae48de098e417"
hex"2a749e9fc0fea8a55e57cdb05166ad9692c00bf103ac30881c6ea8c6b86c244a"
hex"0792663fbe195bacf4bffe700777c5fb07db9bcf94404ce90d0ed74a50febf9e"
hex"2b4d7bb4c6dae168809b1e8687e2e668d2680f40733b7d6877b27eaaa2021daa"
hex"212f5c9650237c6013810fbf50f8c160395a487a5cd535ddcc85437383d7fd40"
hex"1e42318881baf153d5c6a0f3ae7c933daff9cd10c89c0f7d9c1253e65995e7af"
hex"082ba05d83761cb163b4ca9d55e5dbb43c74bf3f456988438da2b3e62a90097a"
hex"188bb1d3cfb110267f28a328777328ee715c575923e5517216a551b7e4bca464"
hex"26c9def697692dbd245316df1b3d3ebc23d2e7f26282bb8c3c77383b633d1fee"
hex"09e269116a30414bd9701c5e0878caadf29773b5e4c010a7f519d6c8ed4ab64a"
hex"0b0dd617d9c5b993d32b538129fa4404c7371453aec2448ad60caedef2521774"
hex"2955e9b0087cc084f3750b6474cf9ccc1b91b93088093fb9b65512bb41c7fe13"
hex"25742cb05d49c540c0db2fe8cecba3202fa75c3652f8a0632c901284718de2f0"
hex"197e4469bc4e63f957318e61dfc0b47f3612c833faa62fbbc758bea7747a919c"
hex"10434862eebeac7e95316632cb2a81e786f3148d551e82d4b5f3952dac0e84a8"
hex"1a35b2d833ae99e441f064acd0efe3ec75d0180f0dc898edb2ec4e6104c43d91"
hex"21095529dcc976329670baf3bc91051208b4d62984741144c2795189811c35d4"
hex"1cb3ed4bbd682aa625880beac8855c5fea04d41e00eab4f0d06318c229f650e1"
hex"0fdb194388dbc4bbbe4e95fd302d9cf15deba158f7c686da98f0c51b56a9c3bf"
hex"2355c510225e1b58ab2af9314c08bd8adff1ada7c9a457c0c1deb47b814f2c2f"
hex"2c04d7711fd02ba586d4a50ad99a1723e5bf2916b4b5ecba863947a98fbbbb30"
hex"0bbfceff43f6717beb8ca8fcefb59c672661fb46da69df22870a4c52fa4cd0f2"
hex"2bcca13d376d46c173fc2901c265dc09ad688e67b9726845e03944ee966ec01b"
hex"285bd066f7c5357304cec840041d33e776badbda4e0007a505004e070b9520ed"
hex"0794a82f878b218f741d0cb293956b5273b429c885d893d1113d73aa26c1d423"
hex"271b72ec18a3db9d3d0e838edd70c2ce3869f8dfa7a2990839b8dd9e1172e87b"
hex"0a636a0eaaf2172cf943d025179ff1617471d89f89258b34a3bbca00641a9cd8"
hex"1a528d6c2a802448da3ad3d59f777313c16a671482e39b8cb7da9ac35c1ff2d8"
hex"18c053d772d3b5a8a648244ccc209c808ebe141ba2f9d5650d0da14819aadde1"
hex"1048336a6121c302669d43eec43639872901bf281af7a1688aa3d3928ebdd907"
hex"12c4211198d7728995d57f5bcc090cf7beca8045d513deb1b175ebb36796f0e4"
hex"1834db39abc7b5ecd1a514dcb9228530e81361aea5811ca208a650daf968e6d8"
hex"10ec1c14ddd45f0d5cc72b4bb6c9b567381cd3f8ff34d9591c48f845ea50846b"
hex"056e828c137df3632d6225d8c3c7df355ea62f2e0d113a7e36852b6764afb9f1"
hex"1759ab5b4dc7063a18dd2b491a4a3d073bfdf8f4d33df3f339a83e3ba2953d7f"
hex"09876c8f4e48e48b158ea3f41eb7f19716f44512bf7cdaaeb3915798ce22707b"
hex"1a45579944f3cb644003ac2430ac63799964bce8f0125b487e5e84f986f46a83"
hex"14921030ad6e51af6e9a654d191b8562e8acab6542844de111650de2ce37659f"
hex"29baa8a03a66a40d48856ec10f47f554e884258e4eff26ce0f15c6b5171f9581"
hex"2f14a2b03d6b68f4bf5be1acb77702105951d5f13a423c1b21960b0c129fa99d"
hex"1a8dc9e0aba8f76e0f8bf6db5523758d5ec321d0857a2df1134b5dae2faccf3b"
hex"2373925e13c17f70c80783a3664e984c082f251bbe3c4698dff5daf3c70e5fdf"
hex"14c66f792e18c3133a0ec195583065986f5d8f297f5750ed78aee7b7fb6efaa1"
hex"1546abb4feb014cf7206953bcb52e5f16ac8d232723683674bc02854efa9c811"
hex"2dd9d7b31522a6b7fb653afd18e987a926fbd5377b5b0e415cf2614bdf0c2635"
hex"0102b6d8a26892985e76fd744ab01d06b524f57d634fc0b69a5d91355398d6ac"
hex"1ec5b7588982ece0b103edde74a6f327e6ccf694bc534195fe0effc7483f13a1"
hex"2b278acb099ad84fbc96b27d36269ba06a660e2bc9093059a2acb1998cf3f1fe"
hex"129253e64f00669a4cf7480180edd5c242544581499b9a233f0ce088acf1e4db"
hex"14f35ce5d343461157dbe0adb07355d95d2cd5aa6dba222b6a702af1e325d2bc"
hex"2d106ec5d71809dff7aec68762661bdfd5dbfe456cba5a7c150c73da2510f752"
hex"16ed7e6f631af32c7e9c7884b0ab0cf71a834ddc4c825748eb5d35451d809240"
hex"2dd68235d74c633a111bd167dec9a6371b137ae89530106a928c87743b38be3d"
hex"0076cc22cae0c2544d7e6d49cb00182253dab5dfcf6cbdb378f56b0714b9d4bf"
hex"2af75f56bee1cdbf00f1a0af44ee6ca3d7f8b3b42d38f87bf1da869240dc6477"
hex"092f4b09a0af31220825e29d275eeb08977e8d3a6a934cc16a6d562b2eca001a"
hex"04cb8d5ffe9fe85b21a785e261721288e9b5b75b400545a31d0d53270608b104"
hex"08287f21c644121d27ec9aa9f50ccbce17e7ebe37a9858da78ca1d207bd9d637"
hex"08d64375d1c8b872172ed0e50612b60c4b049e807f23d6fa8f4e61e06d52047a"
hex"034d11c3fb63ed48fc75af072a1084b3d0982b796c9dbb70c295e4c938688dd6"
hex"03457e18852f8480e869f8aa0665890d85a78c5458b77f682cbde6b7954b55d8"
hex"2cdc590f35d097cd61fc65b0dbaac9cd05916c807ec0e318de09c55d6facb637"
hex"0f2b077d67767da3df753109cb25329348253b3bb8a474b8f2383d269e7af7d3"
hex"1188362ee1c47b51ae57ee87cdc133d212b205f43ad871011e82684b3251a168"
hex"17b80922192c7ef6e95042838827e749bc017d1a96c6e69f4d945f6a40c80678"
hex"09380df1270bf5638a0dd4f2c7b7af4a5798b4280a4c98abd97c99272b34488d"
hex"055c100b6e332bb5d2bf6ba8f3f5945bd877926df3eaab055c5d42be090db0bf"
hex"02cc36716e8608d8ddd908e019707e77d50ecaae8f83a61fac66303fe0d98038"
hex"1913d591367d4749326ea822b20c1f015974fcd5ec6d659aedeac7b56f6fb789"
hex"1706e619141f6b4a93840023bb2342e759da6438e07ed974a5f1e3d506144c96"
hex"0bbe067b718cb861fe927716cba85cfc466eed0e9d2c1067bc7f9e356bc5d23c"
hex"1094541933220c2bef5ec7afe91782ec245208d58f93a08ec25eb59710a73623"
hex"03daf04d7a256119a10ba5f6653564dff54f8eb78577360ac477abab5ce87bf7"
hex"0cce5000e4686fab8ca621f1c65dda94eb8b5892b1aff79a9a5eb0a2e65efd53"
hex"14e0969768884cab782cafd4b81555a818559c4835fb6821ec46fd08ea418ac6"
hex"1ff343732becbc72450b2faedef7112b951edf2ee03bebe4b71365755e6d5518"
hex"10e06fbbc2176bff93433750bcbfec05aea120f193a1e4c5bf5993e098916f96";
hex"15fd0f19bff5521edae5f6d895f4730c241ccc3d415eef6c9485d21914188c1d"
hex"2446d537b3dbf1feba740b7657dc394b17e890cc1db8c77a1df7ddbf00c956cc"
hex"0e8e971b94bc8945665a5a61d013e62406abdad7c304284ab3981bb120ddf221"
hex"2bc9b3a8075e8affb419233bae1329c8b5a36dd5849d426b61896d79e5ace369"
hex"2fad2a9783fc2ba49001eacd3a33e34c302753636d3c46357636dae6c8b2024b"
hex"19c6002888dcd3e33699c10634a806d2aae224c3d7e59cec5a9b8719b066d264"
hex"0c3bc3c927533404b7618b19082e24eb2ca334e7bf9dceb958bd3551e9fe7f57"
hex"270e9bcc58594f6192a2b99d2846f622de39b5937b2a7323cc45e25fcb2093d0"
hex"1e7d1a66aaffd026340c02261fd998650c044a8b0c7fd711e04213a1cd2cd351"
hex"2424444f3b3621df8c36b258f3554a9c5e2a21a5331717c8aba346c7ac63c976"
hex"16e036c1a88f983c82227849b01847266a1175919ac332c27799549ce18d36ee"
hex"0b0ca3b0483c8e42c91944242fc36b40ca910518f9d85a25be8e4a7ef43663ad"
hex"110cf5e0d819a05a811f7a0c166628530ba6f6d353e8e6a433c064d6fadf060c"
hex"19bce756e115841dd94ff44541d5ad78130187d67f3c560c2a590bd093765709"
hex"09257a78bf2bdbaec4a20392ebaef666111a0013e0d145e3b8538bf21c631b78"
hex"054754fba6cbe53da1b0e9c8e6694c94e5c5784962cd792416d2e2a69c666d20"
hex"1afd103f745dc8bd51a5433a7ac8419f1dedaafbcadd19048e9009d4c6241613"
hex"245cd94a309bfb79ae8f5255803fc1fbdb80bb78ac6d5f68dd031a464a87ebf4"
hex"14faebe5560369ec0b8807a88ecfa006f7f9795caf1bfcfe261555534cf4e78d"
hex"0c962615261ca9c1f65cd755e00bc013abf1533a12e81b80b32fc41b0d1fa86d"
hex"2792793df783c78305175c60e000c53fd96ee07ceb78e470a6c64a1b477c5534"
hex"2096d8bc28b6870f36fc685e6509823ed594339011cb6dde0e8f8d7cc1cc582e"
hex"109542c42e7879d5f2509059905ece1bd8860e7c820343aa1b30461df91eae95"
hex"1eea6862ae37a2a4392c5801737849adb507f0a3137699241517a3f1ebbb3a48"
hex"093d3e06748b6704617f4cffeeab1a9c5b788923f7fe09a498749dd9ac9f3253"
hex"2e5f917fa4593965b59fbd36e7644390ba01391b8379a4a204c1c29fd1d17cde"
hex"2a0dccfc2e6d40de5187062a63a944a907d0d7bb6eb30533a3454057778ed3af"
hex"1b8f89159c77020c893f3cb7a2a4cc3085dafdab413391192963d2d6f8a71b7d"
hex"241b04a42762b5922f9e96652279d739459c63ba99921d36047868be961392e4"
hex"1f9a885deeb4ea645ceddc1b496d41a8b765b09c9fa5dd267644335f50b78827"
hex"0903ca28b792a69f59d7499ed7e261840c1e20951bf0036cd34057859ea07c98"
hex"0cf286f5af05fa35173dcabd94e3c7fb591b74607d58c397469cf09759e89b56"
hex"1a465001f19b05dc38a491b248c97ec7920c03da29e69d805df6dae9ad29c6b8"
hex"0ed2c6a0818f6e04bd3aa8e1a17b0d67c6815feeb8bfe9b3a575bde437ab7114"
hex"1cb929c4998d91a32baae52fc164831ff6bd12474cd8c91189b69f1e8cdb7164"
hex"0c5be902277c48337d1db6b1fb81c89e8689cb10b7ee6af8b9fc5975a730f6eb"
hex"2dd837a46f2ba2ee8ea9442a9eebd87ed57f594f044c7860b39595eae6ce4d0e"
hex"119bc8b722e52ff60236302b2e6f4a139f15e63aa0641ae765f3e71c32fb759d"
hex"25214f618153620b583fbd2abc2eef9a26789f3b5296e90551877a37d362dc95"
hex"013c611347b3d133ed9045be2c36f8689a0120c4078d12d8cd28c006bc61dda2"
hex"2f0a9559eca7cc75db51c369b05e74c952d5a8ae39b06ed01c8698f4d74d58dc"
hex"0fee282026bc113cc251580beab7bfbddf2209056fce08c4e356b1a06f1bc944"
hex"14393956732c8d80c3f60ae0a275b3968c22c40e9054b3ad662671f4326f208e"
hex"1ce66ceaedec3b13ac33cf1dacc63e7e68e3e7fdee08e91a54075cc0758a805a"
hex"1abc1b6362a1a276f723f806d4a51d3b7ab592ac8f39e198cb5efcceaf0e48c1"
hex"23f70ead154fd51f42a3de0ac2b61621f01a8b0899f46d2d9da1a8d620b88e98"
hex"28358bc8e9b03c31481e07909d86cc8386494aa0c6b1fddb6e83911200d2d5bf"
hex"21309d93ca7e97b55d43c9396f92716ff1ad99b73dc929c566de6c6c721bd048"
hex"08666e4182c159d4cfd305e1f6f5cfe4ce9243ab5388c2a5a0ab74b600e4bd5e"
hex"28cfb007611bda022f417d399841a00e543b14076672113b21e9bdf4942eb3fc"
hex"1281dff49430dbc9d0748814312f5356a1024539516ae19e8b6eb6379421cc83"
hex"243dc2b640abc1728422276ba4ad24cab39fc7d1ef6cf3d82fe82c9f89efaa7b"
hex"005cff4d9542e3250c36bf32561e274f8fa928dd3a8d11f4f76c36a4cdeb5e64"
hex"20b886f89543b54f0403091d51cd88895fbd55aea86d19db8b89cfd55255f803"
hex"0c0aa8002fb14fb9b4feda737c210d4289d62a014e4bdbf708ad21b53ef62d96"
hex"25e79b70d1ee02eb3f6c25bfaa7b9a4e1566b0fa70c6c0ca072191897838a360"
hex"27218c7dc6af590ab65620d6f31dd4cbdf1eb86058151118bbdb80b8d96d0d80"
hex"053653ac15a867afa2931d75116318a810d5512d871b71f4654c86acabde8c91"
hex"1c48420d5581f37e60b15a6dfe652b9ce46e2de3414d252b18df5b1b8df2a818"
hex"21fbada5ab40ee0640b13756b26a7fcfeb5f81de884fbb889f3ccba3fd64cce7"
hex"0d6670f5a24582a747e1d1ae1e0e8da63d7d202210d96dd5078fa58eccd43e36"
hex"1fe26476a17c1dda8d2d1b630ccd263ecd5644529afc3e2973f6961ff3f87126"
hex"27464f05a8ebb85e8e465599614ced7bec41fcda74ec9f51ae39c392672bc724"
hex"2ab9a6d1c669a478ceb584e3bc6e1635e3202ec53cbb6f3cc42bbfd7659607c0"
hex"0dd63e17922e2e955c38d47347fd269336d27cb9b9c7a3218c3808507bbc994d"
hex"19593a3350d5604598530c93362e2836f90f7daa675f73b40bc04d67b0625e3d"
hex"1682034112be41166846a800dec3f04dc45f7878bd2c5493e443f44efc5c08af"
hex"0828e223ee37c2d4dfa133c8df747c3ddd415da67e911f2f5cb609a58df64bd0"
hex"127bfd549e5e8dcf4b22291715f2ad5668cd6c711c2a39c3ffebe93243df40b0"
hex"0dc2c61595d602f4f7b03af6a919263956b5943cb3f5f890bde70de733623387"
hex"1eecc3f4d0cf71749bb70475ee20a3d479719fcb7c7bea429059f6c1d18dd57e"
hex"2d94c63811c0f21889beeecc4d7797f0fa87f0cd40fb84ac72f5537942b5bd7a"
hex"07573806d926b6e92313c06ba464ac035746e0dc96b3d40db4020f72dbbf7153"
hex"06fdd2c03d7f271f2969d465c7e86763751e29fa622a2715694c534b5e171b25"
hex"19546a1616aca8f207e875ebf37977f96c1dfa32ddf16d7eaded9047ab15142f"
hex"1953bcaad2e145cb2a759cdd65eb7cf493b281b71b0faa6010e30a38b5127519"
hex"2fdb1ef3113503a9db688b32a0b79f3a8125d7967b3962373fb886332a135f77"
hex"06d774b685f236c190a046ec7fc6147a84260794c543230c4d3f90cc091d0e60"
hex"2cb5b76f44713c49cc24cb3e1715ba081787296b94dbe25ab57742ebf6553df4"
hex"05159d91bd6a0a9c639b0cc27cc39dae457f45225c4bb554264af8e229a52524"
hex"115001b9e8d8b1463cd86a016c3610f87fc2a10f63bdfcc00cfa99353a4c1a52"
hex"125537cf6072615205c38045b8ad31d155bdd8acf80c7dc627a7506e642a177c"
hex"2e83916c6303325ed9513361098830271102ac5dbf285e2645915eeda77a5693"
hex"1ce67dd1edcaac1b03358eb6b2ad3780bd1cd201b91d4bb2e603e01279351fd1"
hex"26e90bd7b6f903b9e517a0f77a7e4048033cb873b1da8cf190080e75cd1dfd6b"
hex"1cf426585573250eb3432a5e80fc194c307c58c814ac37bde84125a5aef222a7"
hex"10fe5c50f8fe71b1fb44251e5dcc90bd0d64844451329dcb49e241585406ef8b"
hex"0c273841cf7228666b689b24a7022bc402815f77f71b43c1862f64853b6a47ca"
hex"1255c43af69be48744c759de67f363030b809ea5be5de707545d1f29dbfcd272"
hex"110b2f7ac7d7b3f94893762fca13700b74cec691bc57d216ba04e992bd0dc947"
hex"0652c5b2ba7b972dd68bf8c271556b57ad4521c067a072d75ee09268562cea9d"
hex"1e6db4b3e0185f2add0d49d60e16168c2f3ea91e2cb05678f2c9d9abe232b340"
hex"0a96b6eed42e7041c98baa152253971225378ac4cd9589c80cea28c06b570678"
hex"2650ef83382c54ccfabafaec8096c519ab5670c7d4dea2535c64db2b7dfcb553"
hex"1664dbfaf0f45d6ce2782683f87e6c9e9b7176f08511ac1663869adf9337eef0"
hex"212ae8907761700bdea4b480f20f788dd08ca4126dcf4ea462e890f302634476"
hex"0e50a74cf13a9f5c3eac33a38c6f9e8d3c2638bee309a4180afd6097c52766e4"
hex"1377037809e690222f9afca6e1ee39ba95846bbe912379a938f6ffcb493f5cbc"
hex"094a2af179f583a4155dc7f2b191c036df4330c0eb75e1e70d2487431bb4b51f"
hex"2b1bc223925afd7f4f7cdd038d39183e1364d1665dcb17cfc2e30da2edbda339"
hex"019a6052e1c5cf66ec396956467e791a97506bb3291d1a149d863d9cc25d660d"
hex"1f709b744826f4ce03d2ae0eb2a86613bc33b2bbed5e9ac6198f7e8df1afa8b2"
hex"10cee567471a2b01cfa286f3095713ffe5855c06f17158e33e9ebfdc1c792a88"
hex"239ea34b3e8a5d1d26599fcf453537fb16a91f9520317a01c7de1bb5a768d725"
hex"09b3a1bb0c0be55876c4b91957b7e86412654bf272b7b9c52f2217e9713c7dcc"
hex"2cea70065cb1bf0b68c86a3592a5134384be8b10de004c31233b783577694dc6"
hex"13aa1864f9d5017a46cb107be441f821a85315b79f39968d6407f343a2c61998"
hex"0005f278bae49a9a15a54132c50388e69f4211ceddee99195f07736b502fadee"
hex"0302a786d79c25a2be297edd39eaee413dc553146ff7d83bbbb8bc71447b6605"
hex"2eaf36a4dae40401cfa571b55ad8b5fbced37e67860085bc6afc5412d809ce8a"
hex"166d04b67debdf8e674bd6074bf67031d3b4c558647dc4a3c5443eba23086683"
hex"232f97fa7f391323e066175feb3572aed60c343c3e3c11ed309c00ffa29cdd37"
hex"08f1791a609f8714b38f03cfeeb1a149adf524a946a397191b0986869458bb8a"
hex"20e9ad3d16db1563e84154a169db5e81d0117d4914800772d4bf624317e32b36"
hex"17a525ede8962fdfd05af9ba5ef109bd2f5de02524454aa25c696b7c6fb0757d"
hex"0d71a275a14cfaa4f987cf2d2552add13d13fc7141c544a0ab457103e4b2d502"
hex"1ff842cd59778fb6c75d197511f3158ecac8fafd21db5fa652725be434580ff9"
hex"21095e6eefdda8f7648172826e435e08a93109b1f040d88ec1b01ce3e2dfa592"
hex"02746d05612699c335d4031f388561fa2c6b3a4c224df74140c58c5dd7391459"
hex"182427fdf7ec0b8c5a7003e3ae6c19d8da47804a75d62ba4a1f8ce1835d7eb66"
hex"0dcfad648630a6037241a73af244b1612eb375d852712a10182e1339d176471f"
hex"24611b2e7aad1a1fba1f1eb3193a87a0261e98dbe77fb30944edc6ef5726acda"
hex"2df51df9c66f51695783648873bc167bc8199afdcf98a6a39dfc14933634cc25"
hex"00ba85a4d757b2bb24f2686c8fc2b20d23f68ecc5bbd889d70db8222f9c94eeb"
hex"2a615fc377bd707e1d297df70f60076d184ea30144439d2a02827ccc4b74d6d5"
hex"083ff5f9b4474040e1db95e7dd4ac08bc49f0df5e04b1601e531087a66e1a9a0"
hex"300192ff2b9358b371328362eab85f10b3b256562986b0222f90fde6285b2031"
hex"2b9b6d2f72c215474b76c58be1bc8113aed21efc4bfeb76d432fadd1a143ae55"
hex"1afc92793b1e3c7bc0fff4d51b34c751d6fd4f0b684fd36a5eb31f2e7d59bd08"
hex"27a4788df73ad8b0a3db6dd0366131faff0cf443fdbe689b1811275524fe4f5b"
hex"26e306f7f4400a8b466a46f73b1bb30628e8f53ae183179a89ea09bcab1abe8c"
hex"1903a292e81db108e9af23cd1c7249087803195ef86af9d7aef43f671bbe28d5"
hex"05c92b5167e06202018a4b1c482dde448604793a2b6d734c3a59f599b457794f"
hex"109890a7f2fcb50131c7e510faf117da23344b6e50403670b103e8b1b0fea27f"
hex"1fb6977c76473f7a1d148b69a5526768ac7032ce91f0e138973b3e4d30745fdf"
hex"22846c8fc4704252020b4a141726ef713f5eda605ded818ee69d101490d5a8b6"
hex"079b1bc515838f1ad835d87623adef3b1673ca9735ab72d8fc938e206a524e58"
hex"20d47a675b313cd4b857527f3e6ddd2b5646e5fd9f206aad5bcfaae6cb0958e6"
hex"064e79c61f6d53a00688e7f217a0c8579ba3daf9d4df5dec16f013a124413f15"
hex"2383c6f75c1a392e6e1375277f1130c2274d8668773addb783207cf58cf4c0b6"
hex"0f693e2f20b43eac0691b48a00fadf42143af8e21b080d41d1e71c8a02142da7"
hex"264fba8810c9e1c00b512aab1d355bd7ccab52089768376d8a925cf1c3f927a1"
hex"01c6986291edd61bf9888d6bbc0d0f802bbc4186a811b8107fcf306a557f0af6"
hex"26cdd05df967801d477b1c344754c15f7a30b0bd75bb98985a0c2fff9ec80c06"
hex"0c5e61cdfabe2eb8188f70cac4d7b7cdeed9b964792d7dfb6fc0b228a7270e54"
hex"2a586a34c5b50461b05614cbf3ce228c130522513793ec263f9afa96e23f4e5a"
hex"25ccf30168e9ef4fd1cb902c95ca8d67a13580dd07994094b221708f8c7d6797"
hex"107dfa97fd9047fae9cf80f48b206884949b324e4ab03212f3298c4818987696"
hex"1cff7a1fcb4f40c410ceb353cb8ab907a0f6b2821dbf82766ec762967ba23944"
hex"20b8533e0ab744d5db86e30a3e73a80bf621a2b5d8555b0fc416389d5cf53265"
hex"0c9d9b203b72e7887fbc30ac7978146860ea4aa1ff0d96dca2c65666304cacbb"
hex"1b84d4afa11231f3a4a3c62a0029a39f5ea31d907a92070494990427e7ca6f88"
hex"14107581ede64e20dce54fffbc6443cec3ca1cb0054c5142187cd21bcb166b79"
hex"16737e84151e0282876e43177c3830524e3b6ac2eab243a067de3319f8d0b8b4"
hex"2037cd61979b667fb80288588d2b095f0c4c34312d7c75a074beda537909cfa1"
hex"04afc04e3f13c2d80fcfa1aa6e946499406ce541ca84527b75dd29881c09e6a1"
hex"20a42ab93cae3bb2a7ac65c4952fcafa2b58f3d3c3b292246e292dc1d10ead44"
hex"2294e0ac633d4e59ac74082946c67653dfd3b17220d05953f214328d778d6256"
hex"019e150e3d992f5175dd609d7b7468a978428a5bbf291b77f900d1c682cba1bf"
hex"2c04f3db93c0870db5a439e9ff0f2ac65d19edda31f6bf64e9f827516b3f68e7"
hex"2e6c4ce5c33d2f1d00d4c7c691e5d39dfea1c0eb590de777e5fe64365545646f"
hex"01879179e76aed29e2392a6df0ac85ea6a285e0d3a1112e8593c23c3e33df5a2"
hex"086975bbb71f10a74a76f43bcb0035481860c6478f23fe914df449b50e56c492"
hex"2c6feb5c47ad32b1054c98e31df1659881f884939536961bedeff8cfbb6e1282"
hex"0549855c647dcdf03d05c6a490d5541098d6d83bae7da0112a822e0abcece250"
hex"20f9c4e3fcfa0d305a923e4fb0d9ef583cb141debfeb931c909ef1d4fdf6eac9"
hex"05a3b3663e889c49eb5920e769bbfe9f9dfc905554300bb2b4285c6a5889b274"
hex"1f9e528d112bd8a059eaa510cbd9a7458598d27775bcf6d851a0d359ebb81dec"
hex"15608ad6b67162915e05d6af1ba4b32eb4693f775ffc0a66485c3e5617dd37e0"
hex"1bd2e26efa4fb0a842e03142af573fa9c16623542451b3e4e0af1970cd7e2b0a"
hex"2b417cad2430c3018499a10488fedf9e5399ce6cf93819469c802bed6386d7b9"
hex"230d363d8bacdd978d08dfbc44f1c3bbd3b2bc1e2aabc5c3759db87f8f895eab"
hex"2f83002ed31eaca2531766a09552eb1667a9419192ca335b08d93693e5584abc"
hex"0feccdb53345bdae7349c42b119570c762f1f5497eaf898e4ba2d378d9d8d20d"
hex"18d01d38cb6ac78d93961c1ecbfaadd4b0cf999b972ce4900cee9faacdf8298a"
hex"1f31cefa55f5f930d149b63b7a33e385a688aa8a4ff3ff8d88e501dd7466b475"
hex"1a02607dc91fd27ebb066b51f8dca8d64dec062d3f8ea6a3e2859d139c17e9f2"
hex"25bce5f60cf5c72fe58b511983c067ecab88071786feb4f6cf83e1b5ac35878e"
hex"199ea7d2467ea66b53853f7ba20a91bb44a4a5f621404375051cbac31997a366"
hex"1641e4ce35beb44e3d00fd9b7a3bd47e118fcb21c62281b148dfe4097c147e11"
hex"227cf6075dbc7987ebce58711ed50e2b6a94c1478db414a834345cb2b5c21cb5"
hex"252bdf93e4bc24d639e1ebd80550001fa9aa1e7d6abcba326c2b2feade8fd8d9"
hex"073103523d7b0ce327314d3474aa6b77824a75862d0cbaa5af6e1d2cead16b9f"
hex"050f7090cc1ece4b5217a0419fe3066d81ea2e19dc6c5410c770740c16875066"
hex"2a4801a2483187073a17cd04890165ff19b24180cc8ed16870cfe0f2ccd82183"
hex"24e27258b0e61cf13892a8b7abb13e0cc19faff40bbdd680a389f4918f63d9e2"
hex"0f03cbd30fb82d7807479517b4e29b3da4950b96a023a331e52c721c66f5e229"
hex"2bb6d910684eb13c86f172f66f59a093f8a002333c8767bd594ceb63e9c6a2c4"
hex"1f32b4847858f72bc734df639c032604ae71ff65afbbdcf42acc7ec195f3a39c"
hex"2a0f1adf6230de3995bce023cdfc6af1e85d9121f84de4a34b9c7fc4ff920c76"
hex"17fa977e81dac861e637d8d9e4636487afa55618f35f7455af8321f8d6d50d6e"
hex"09f9221e154ad381a5b58d1c8771be1f47f3aae8a9769151cd84c1434fabcb9b"
hex"0ea204dbfbd3e404128c8252d607169ef5305bb12a59e44ac4be9147055a6f20"
hex"0d2547a25e17e027bda4423048f3c6c595d6f83124767da34e0e4b96c26f5c94"
hex"0cbd5f2d0cea7678b80aeed4b0de78259c86a2c207dc0f28fcbe22a1252e5d3c"
hex"1a9b6c59c30e6d1e3c5efae27acc27e9b7bd23af3dd7963a0aa8361b4df2f243"
hex"0cc761b549af62069ba3e0fa7ce6c75c9f6defed91e8f3314c4b1ed7a5e0c83c"
hex"30264e78dcb1adb0d7503f80507ed4bf90271624d70dfca454d1990a2f755988"
hex"28d55e9071501cbb4ae790279f996622466c1c9f131d667e8baf7bdbd5d9a455"
hex"11ff42ce9d42c89d7687d469625b18c59b883833298af76480817907af2294a7"
hex"04645153c868372f37d106c5c4bfba4e2f73309d53390894a6b2338810da3f0d"
hex"103e33717f00caddc108323574de85c6887720561ad0c9946bc510bd3954ad4d"
hex"264461fb0d2dea03b815969e1b2bbeb995d30f774fa49411323d20ea4f4f1652"
hex"161a104ad60c9b35ef38783a9f951bd969e107846affc11754708b694168ab99"
hex"22ae691abdea5ac8f12f90a1a147b5ac63088f4c3de32e81d38e79a93612d9f9"
hex"1286d17dc13dcabf49975e2a37743d997ebc56d11b71c2e430890eb9fb7c7d3b"
hex"1411153db07129358c9ebfd849d1a12de7ff39ec458b616a3e6885bee7114f7a"
hex"0a98b996681afa7f3a7ea25fc6d9f2b48af7c5d8c8db0d55892bb64461752f93"
hex"2838a60cc9aa8717f4308e6074996b7b71f077a1fd9d8353af5c086aebed16b7"
hex"0ca941047448572c947a8308b479f74524a74c384d926e4be36e8068bc635df6"
hex"10b06f989dfd1d445b6c4bbc386c1915d9c6775df42fd040826a8a95deb11561"
hex"234bc8dba2ee31ad5b1dddb6946dbf1f2d9a2f7d71bbb45d94d7f9ff47afe936"
hex"03b28511d097183cceb1250dd00dd4501789b25bb547cfe66eed09bec1871c59"
hex"2d06d2e4acc30f60e54c1bec9442b8aa70137c37b798d2dd8dbeeea514f7907b"
hex"08037905d11e86a5a9d3b03cbe3094e9468d3fb3c1a20738c08877269a69147e"
hex"1f79d21604dcfb2ca75a44e38aa87cf8f3f56f639c8501d336f2e72a87486695"
hex"20898e9f4eab7b0f918e10b9fc35a024f4d0578c0e46463cbf360606fa47ade4"
hex"09b99372d699342f4c7e3c807a133ee3be1c92422cf2f0e5492136e815061041"
hex"142ad77d8e80c9a778bc04e8a62e550908c55974693603d8670bf9205553bf7f"
hex"22f3a31aa3f9f3c040048df27710a8e485049abfabb71b51cbbd87126e83cf24"
hex"03459743b0ca82a0801415ea160bad9d326888db19ea8b86bbcfacb48ac3c412"
hex"0491b8939d07f0074c444ee02f79917f5ded067d7e0529b0437b71fe6355170e"
hex"2bcf73774c5976acfbc99b1116384b11930bca6187dac5e662bb9250487f0845"
hex"244615cb6c1b8f74aad86d9f900ceff74ee731a9dffebc26096a1e6a772680f7"
hex"23a077e52b600cefbef77eb273ea0d5d2d7b18099b4832772b56c6e822df0794"
hex"227f9d7399bc220483caa969a8892901b894de900a1a20da29328343ce7cea1a"
hex"1679302001981320168e8d8e921756f2ec22d21fd130d719eceaae1b19354bae"
hex"118d5af95d648cf620249c405d77c7743089d9d262e29860cab3c292def4ffe4"
hex"2284c84a005818061688fe45ff37d6fa24b4f99587fc5e9a1208b3edf4d060d0"
hex"0cfc0f918b739604150598b74b981255a70d772a67f23f51c34212958b45a035"
hex"2537c964c421601b62787e6eb7307b99a9d6eefd0286f927fb25f22e7e9eaf95"
hex"1e30310e4606c228e2f5c3df3eea02457bb4777af8546fb61bb1434221d99884"
hex"0f5caab9c8ada0b5a094dd9129eea5421c1320ae7a666b56c960be0dd4c1eddc"
hex"1dd1def16e2a0ffc68a449be9d160b00ca35599e7ad7cd1afdae000cbc76dea8"
hex"2ae0eb79a34fa9a3c73bd9f1eca8731aea913ca7d138958a32c09c1c521df6a2"
hex"28ff689e68fdc639c190119604c98a1845806a317af901568ec8dc47593915f1"
hex"1bd5a5860f93500e39351520da5f095ec6557f54e0d5628fe9cf1a20d52c426c"
hex"021f0968bcefd07ac634d7e6e02d45eb6afa85d28b307f5d2e3f2cd6d744fb44"
hex"1c0c5c153df6045c88bdc5d09dfc813cf8546d7344c70d194fcfd29f92f4b696"
hex"1ca6c68abb475da1475efc1300855db5fd7374a5b92b4f90f49952a05aaf92ca"
hex"2bda409f3445270ea3a6d128b46a5cd5cb245b5339a66fdf814f2b83f4c123d3"
hex"05a71c398107a0314772fcd210e0c1d3ea35d99444a378e1213a9e10e6768daf"
hex"11fdba29cb4c24bb0e770eb1d4e5c23d9a51a3cc86c7d41b35312fc5c943f965"
hex"05f0e7da79e615a61755ed4526892b42ce1e80b5b027537bf53f0b536d4bbc0b"
hex"1eb2f81535a276e50897a2baf3bbfd981468b91fccfbec6cec8bdc988f002350"
hex"15d6ce1db45302f8e286e96e26e4f64ef5534ab8a55a9ffe215f896d7ae7bffd"
hex"1315122998316a3bb389bfa1146d940d7e2718edb570f12cdcc57377f8ca2378"
hex"023f10e9f89b3f0a2c44497c8a7b705786220397dce0083335027a9ce9839f60"
hex"234a05bd730e143866824a0e9b7672adaa64b679dfdd86c8e54fb2df83438c20"
hex"2d23c1a987db7a304a2d504e5c4573592c119fcda1ccfe5a07d5643c4a9c0633"
hex"029b04e14de53677bf90dc7badde802e588fdca2b9081ba20f4712e662c12adb"
hex"263f5e4fd893704c5f229914cd8f37bdc3f9409e617507850604f2f59d390fe6"
hex"21c9780ceccc597c37b49b8742654a6d34f71cb32d1555e72c06004d06f6f5b2"
hex"011c1683c09a02f63b38549eb958115f326fdc2bf0aa81247acfb1cc8554493f"
hex"26430030fb83d387a990d785f38ef4669b2fc53ff8ebc2537009c8648232996f"
hex"1247fe42d335f9252cf1f570316ae986b553044b0c81e635f764ab9915e11294"
hex"1386af604cbb138efe8dda480060758e274bdf502d2bcf9b5210e31798b08adc"
hex"06adec496d6a730820969cfbf60ab07a2a8f7cfcfcf2020d4cac60d127fefafe"
hex"06c39f25af1748848c37d1eabbd6a84a9a735afce06a5922e8a80af1bfc7eb5f"
hex"213dbb816f4ac87aa15aef8541b1abe3fb4d11d8b0b082989a0fff41ad9bdb2c"
hex"1e41cbe348a7f3d5e2408d19b26817183d1f6d3b51f27a915274efd9598ff18a"
hex"1568510b7bb366f4387eea8fd2b20fdd95fb6a612958b5c25262c32ab3eed75c"
hex"08521336bddf41556b79cee9b90b0c1cb4d36245c25a7f8b248567fb4248313d"
hex"2d0893b893b14eaf3aed6820ae987b88da0cba5dad3c5b267c9012405514767b"
hex"01540a25e982ae7e1c98d06b14cc56241ab9b09543440957bfbeb9c384a74b65"
hex"1744fc2b7ca4e19a45031fc838edb3805964d6533a4a5583ac57d9a9f6e6da65"
hex"1230a42b5aa82168743e9817923ea3ebd1d3a55ef1bd91a89eacc55663a02640"
hex"1673e455967762f96f57b413424631198e09e7bb1bb06844068fe44f307a8d59"
hex"061d9c5b1f377adc54722ccaf3601332ebc07660fec4d89b5c8213031f0aa8b7"
hex"2e92f89b6bd8472ef679fa5d617805180e6e0605423cac37fc15f281939770a7"
hex"2d3c9778d5cb3ab0bfe4b296e2ed90ed19619b8b353c1043b40e03b568a049a4"
hex"17276cb455cc5d461db37b0b4f6b34f1bb429a76968726205617095e1d39b92d"
hex"09dae1c6d2e4114c5439c81baa28594cc0ab76e7f32c25c4f780c9e9d6e46a5a"
hex"0a23d3bedfe1b14bff3eec36492bb9329f56ddbf7f5e1f122838e96dcfe98c46"
hex"13a1149cf273a308c777146d7f4be2160aac12980d97661fad18cf682b7c5e24"
hex"2b74aaa132494d280ca444d5d2a99cd2bd426ff82d443e2b44b8441733bd450d"
hex"29b8403a3843d4a77b6c70539d8965e57af369d6f32feab13450f3fa985aed18"
hex"142569f4ef08c2a1947dcb6e99b5ac52cdd5876c50f02bd6afd62fc810a75511"
hex"0f47bd52a43c690f658374e9f7c2bc4285c641c7116a4ccd2c94f684cbeb7f2a"
hex"17a29f16b646ebe94c4b2e2c4bc375cd7b002111dd55c4d212e9360cec88c188"
hex"10416d05ee2eed34165a50f6648eb3e10f77247f711398a14fc77bd5711fc0fa"
hex"046641ee77bf1c3c58b848252da5a88038a20ab22b0723c37de4753f40a110b4"
hex"04c68b3d094b4cc491c55531f7ba1bbae0b554816f0c8bc3099061c83099f6fe"
hex"0e3661a824f5e440eaf439395c1047754ec3e22f44a0f81d73a4dae283cbdf1a"
hex"0f7226bcc9aed34857296ce6dd82b82f1d086ac24d3b9e51ec3c767a89e0e0d1"
hex"0fdee6a4513d6ec8f9e2d416c8b87b0c1deaf66702ef14b11f42f9754ae688c2"
hex"20151e7e27c0331111bf9346db0f4a36d000ac49d03c561a45e23383a0b61d27"
hex"17cf331edb43a227be4cc3ae2dd0999e07593a95e62cb170d4e11787ca9032a4"
hex"11b76e488a5eb5703a63e3c43341cd111141c3353d6c634422e63a8ee3a948e6"
hex"2aaa17be5319a2c4b81597c87a78dd744742127d8f4c942e30a6884a7c40c05a"
hex"1ceb38f341d5107f31308f3985d72707ee4cc450aeb79b3122d18ab3a811ca32"
hex"26dbf8986be11183f7bd4bcfc17db4b68fe9a92cc4921fe17aa0352f57787186"
hex"01a871c9a11ac0eac37adf26c0e380d9e4d4d4c1441bcd52438332f3ec1bce2c"
hex"1dbda7ce884258ecbf26f6e40029d770ebbe895ac8ce51007d38939c48cf3ed3"
hex"07109ce5258042b89a7e1969e498b5039080ea3912e326b5ed2cb2c484f1c873"
hex"2aad746945530cbb6595e6f4038d89e1e0c0f978532ec02e5e12bc9115174a69"
hex"01576cfa7df9b87f6b6685eaebb7ab84d90e036f352b9a3f32edc2d8fad897f6"
hex"0a7ed0f5907aa3135577a8bd38c02250ce339b3e500000a8c0bc4dbcb58fae3e"
hex"14b8a5528c397ee0565c1d305c4679583c7a2273a4263fd7c0e4c0c3cd1593d7"
hex"0f1645829fddd22d3b28fe608eba622b2dd67dc8282192da3762413ba678ab7f"
hex"0908dffa0610ac0133c5f7bdfe3469934c78bcb4177d2c1fc618bbac6c2ede6a"
hex"05c83ee4f9ca0f735c449b31ebaf60e184880a7ce6053dbe5c6abf673b02bc22"
hex"13ecf7b788d4fab17371a424493bb49447855cfb413af131de52bd75a50b706d"
hex"0602afc4587fbcbe9da6daf807c3efc632bb8fbc8a3ccadaf73b827542745fa8"
hex"28bd99e6ae097936294db584bb7eefa8dd7b63144064f7114041a88e69d6e9c6"
hex"053751ef135a8f6549527e22bfc0580a02a7dd72e9eb6b6a6e73b3f6ec269025"
hex"1c32a5e4b55b022f9cc73fd585424afedcd1ffbf7e46d2a8e3a86b52a937a629"
hex"1abff8ffde1de3add8b76c0a6f372e2b921d601c5f3128e5851706eb60ae7b28"
hex"152769798bc48f6622fdc54ec7efbe576bc6b263ade79359db0db98ee57d465d"
hex"202fc4613d2f1988d409fce47fb6bf1adba6a9e18b97aae41f82dad5632fdb9f"
hex"1c9d65765d702a6d24efe251836e629ffc2881d0c218e89cc6467cacec7b1cf7"
hex"0b0cb3219a1c4f34ef384b4b972c7b045c4b931fd84b41ad619836b6d30b00cd"
hex"2d79b8879e27e7000430adcd96d6f7c67fcf386a473752668e64c09b2f8010a3"
hex"0475cfbf8a76a0346f7df43a3eba83f47f139060103130b1a484e7814623d854"
hex"13be6b6d4ca7746460f0466a5068d54dc9378ec2e46cda7d08deb8a254260e27"
hex"01edcd7cedeaae1c11de85b2fd1e5dab42fa36e547682937ff684364921b513f"
hex"1f570a240fd09cbc6fdd1ffb9183668427b376483f723438dee5cc5a6eb961a1"
hex"2eadf23a07b9fefd2e17ee0d74db1ef80caa7745b9c9f7685fec9b02e5ebb13b"
hex"2f668953cf91fefe0b441ff07a2f2938f468bc7efd380bef43a030e5fdc41a71"
hex"118eac608ef4b794efe03a23dd034f13156c02f2762e6e8772b11c7dcf8ddff3"
hex"2b942a6404366c746c10e3065f1f7932e240446c85c3f8ee5aab85b7727506fb"
hex"03f113eb05dac7306c758fb6565545232934cfe1a99a5fc63945a4b6d1a652d0"
hex"2a6d353d3bafac324754fe1a00d57e7f020dbea17231f87d83307bf940e6d676"
hex"1e7913c116465bfcf367aa331571c24cced6a4992e39ea9c482fc56383625971"
hex"19111380fafd9f08783dd2497d64685aabb25f5acb60204fd378e0fb0e6da0da"
hex"22b45e152cd7c40740eefe2d3fec07ea31872401ecbdb762cace9e92e7cbe34e"
hex"1192d39b9a603bba160da80fda0469b41c2255ac4d0a46402a2844225ffd2539"
hex"2f46658280ce7b17e40eefb529673a2b3d8f6e25757e9a445e44c7a7149bece4"
hex"01de74823933559559239322e9363220d322cea2ddba2f6d5610fe883885986d"
hex"15c53cfddb0f8bccedaee3a4492f2ac1be55d6f0b2f1e7af5f4caff10177904f"
hex"2ba1a14949b45d15d45e07b4b3c206ed751f86b5f37d70a24a4d8a7dc389aaf7"
hex"1839769f1f11e18063e3bc10c490bc546d8b35242a93ec4d6b61cacee4f1d4b0"
hex"1800f7c3137ebc9ac731f7b4d6375c01a874f29000c1b3f4727b65c77a2d5105"
hex"1bfcdece5c62826292caa2da6ec16b9974d2eb7fd3c2c20d1863db12ef1440be"
hex"09c696e6067fa41ad890ee8388c0290186e494cbc202e7667d19b56353cece99"
hex"092b1d93eed7d26456f285906aa196059ebbbc157fbde72b8acab6be8efce28d"
hex"2fafe0589f5c826f419b1ec3ac176a42c52360e7b3edf90cd4c77c915e47ef06"
hex"282d48bd742d9e20a5b8dc88aba0744a9124930cc1cc7d692decc7f0ee8a86d5"
hex"06f42f74816d65e974086055ade94ff76a6fe5d14bd64a069b89b867989d12c8"
hex"15b575413874cb060adc4fbde9da6215b08bd3c72b9f817bd4e227b818f70235"
hex"225265caca14dccb262c43230defa44d79efbf96195b8852817b9c2a1a0cee7b"
hex"065a720651f4d30a03b23445d588a657ec81881b38a6ca7c96ae7d30a228eda7"
hex"2f8f278929640191de8b4c95a163f7b35d9fc5f38dd11499e2f3f0484fee4d4e"
hex"2e67e80ed738c79c531bb034d0e3f7703ae1cd93d0334f8cce0e6fd7bbeeb9cd"
hex"1a4ba16824f4df329914baf49fe4ae2e518d85cd88bc2a4d7511486305611aa9"
hex"01d1333f199a38fc9c772c5b6dde72d9d9ef90dbe2a7ff20cb9685c2b30ef80c"
hex"066995da220811544bd79b867d6a45c5f9d5f81246ee7bd867bae77ce1f1a5fd"
hex"1347a12ac6258ea35211b6ba1a86831915843d88896e58f458f0d5765917c35e"
hex"035fed90d06219d345c5ec7d3a0ae95883cede928acb380f8ef8b4b6859ef965"
hex"2abcbb767e6e79b2dd22e5978eed3edd65fc15f583b875d14e2dc2f2a0d8543c"
hex"2991e9e9d1214bf2bc8020c1c18d861b8fb8829af660a7dfd350321256775ca6"
hex"13561a0b30e623640fa05d8a5f9540530ec9270d46c5f6607690c93e6e82655d"
hex"295a4d3659bd1a055dd3f4bb626752a2d06759cdbbcd1bc79b83086649d106e5"
hex"0ff647b8fb279b8ec301487a755b63b15410d9583977381e2060e794dde87459"
hex"217e540739dd851a21e60d671a6dba94845f42487c32ec098a9c4c0c19819843"
hex"1b389bd1a4d6c9f88d6fbb6beb8c25a7f86151da3048fb29ce506076f3b73397"
hex"01f60ddbcde529f2adcdebd2bf02940c1a9a378e0488c29a0ac38a17a9118bc5"
hex"165cea4c3361c2b7edc485fb90f788d1b4ecf249b38701ce1ef0472003d9dba7"
hex"0bcbbc1e5599b61380fae8aa7c48f7dc2c543713ffc9a72a801e1a77f9f37c81"
hex"0cf8a31e0bb5eb4cdb46f2fc5fca97133ad03ab9cf53883b270a01260c7c534a"
hex"0e20cd40e05e747fb3bdc07b3cfc50b3ceac18f059ef4f65565f447208335fb8"
hex"28df7cb07583a984136302cd3baf3b3d9f9177ef97f584b0daab7f0493d25773"
hex"26d35e5c2e4f1092a1339918cbdbfcb5b1dda82c318103401d4a9e8fc3218159"
hex"09daf60bcb32e37020e105d8b9bc3aa31900cd3459046ab97eb228675846b691"
hex"268db848b42be0e8d96f73d79c16df5175b29d4c3e0351a24ee103d2cfe7c283"
hex"1e4edc4d7bb561c29aafc6662191bcae8aebd4d5113e331b9b537f4fa8598905"
hex"2d3c39a939554f2b9e6230e96a78c24be4d942154f765e6d4af53a8c4db9407a"
hex"188b721b564daf9ebf33a146bccea52cbbcdcbfb50740e921f91f7e5672e5e7c"
hex"2e59d3453f983dff90e45f917cd74501a646319fd22c952f3152b077d5655840"
hex"1f0bf595db464070ab32553b095f4421524c20568df7ac803a3d299b3dab568d"
hex"0b68d795eb7b68b11c333b381a2838bd9398fe371f08d48f2ded24e60e02654f"
hex"18b33a4cd6eeb86b9fafe856f33753ca1cc6756dc4f843e03039dfde879a76b7"
hex"15e0ee169afa10d37a8062aece61391764ffc6d4dc6ddcb56f35880bb13c7056"
hex"25c616a97b05678348ce1d52718bb1d8521cff5a3d2ce5b37f7c190dc4786228"
hex"26a0882f49d8c0fd3be124ef75a7a107778ff66b5be2b66c0b64c2084809ede3"
hex"070dbc7e5de51ff90466ae52b47a293b4cff6f0cb064b6dde4e00650a68b1541"
hex"29426faa9a237e4bf88eb59b094786cf49a96fdc54cf6c819e1b67e2b0d68707"
hex"0f1bd148d0b2faf46659e6db194bfdd5d037aea060737952bc30026f8547737d"
hex"1d861f4c7a0c0e5c99cd91e2869215dbde6c4fffe1ad1d8744f257aba5b503cb"
hex"004ace6be69932572926930019040107ca38207eca80735d5de083cd596395ee"
hex"154d83576e1821b8ecb4f1931ad7721cce29bc17fc237974322e248ada7c23f9"
hex"2fe852eba0f03f71cdfc34e6193561d3423087aaac643a9edfe25fa2d7f3263c"
hex"0ada5d6553e357275b59357fc2213e1faf714a22eee3d5d3d502838fcde32e54"
hex"2e73f204baf6916a3af968db423019f558a87c104c514bd8f164d03d3deba7e8"
hex"1d29d896aae409cad919a995cc8717b7a078c623bd3af80c056dc1716d043539"
hex"03644e9c312415bd756683697eb1ba4fea32c710d0f0129ae756984b52611993"
hex"255a0912167ac123d1a2c9b10380a309d7f3b067b628e9da5085d98b90b0cd85"
hex"2d54cf1e2971b4c37d511fbd55ca08e2b56ee7fb91386192555f1757dde45860"
hex"1ce287c5e5b611ff5fb58751b3eb8335a8b5cde2fd2873522cea0e9bf6f5c556"
hex"0ca0091a58ee20042ac02237bf01843886e4439d859a785362913c0cead1e469"
hex"1f47e5ac7ec132d0c7136a9487fb0c6cf292b07e5515eb2ae942d4aaef2dfc7f"
hex"29b08f57557514cdeac066d9eea594a5c5388e8f1064dcf19fe4be16d57b0d41"
hex"0f27f0132545e917cc90595e93c252a720b8d24b70bcfa0de03a6d3f5d50ef84"
hex"0404810250839299f6b794c6e9f00432b60d7ca2dc6d754029cfac5b964f09aa"
hex"0aca49db30da75f002bfb2ee498ac70a5b0f98245a1c2ee6da8c0dd3c59c0207"
hex"30231cd053a7783a3ab43400f056f622b99507f09e1e16377e2d02c0c39faae9"
hex"164f1b6eb4908f591b45bc4d4385a161cf46bc1b287369a5eecdfcfd140b62e0"
hex"188576c886eecbe7191a7406798f0fb4bfa0c7182c135ef595ef570294f7aec7"
hex"1396e7b28ab67accf1c37de37ebc942bed502f53651a61fc62a1dcfc29d1ce5e"
hex"11aa2dd7e1659029917e203cc816abc533dca943664bfe41e3d298abf64dc30d"
hex"0bd1ec3ca032b7d27b8bf71a2e76ccd0c4a313642b6aad073167b8b133ce7679"
hex"0a7414fcd29c4f31df7e37573a174b7c889dd737f94b684a8b25d89723558978"
hex"02e3d9093c471054ebfe17ab81c9b7c3ba9691693fe99c34802330498b1ed8fd"
hex"2602a9d7085929301c5121009e4b9187a06c767ef9aceab2202d20926e03c1ef"
hex"01e3862f91f2e868c1e148e0f7dc7297989c352cd6e56879888e7e21c0948f52"
hex"29075542292ff5d8f4d6bf02b27e289f82bc3934ec7bcf5d4ce5d7aa9dbf2f5f"
hex"11ea16238aa5d188eba8553b6ea4af29ca37201f1b9c9bf7ba44f78264aadabd"
hex"0504068c9c7063a776872824e1ab4b34178621279772ca089c5ba6d7d4c0d4f5"
hex"097cd8eccb72c01dc41c17197a0f4216ca4a0d3a476df762e4b3d4f87c8ff926"
hex"2ce6d1e2f8c9185bd860b2b021b44db3713b420599d990195f8fe82dfaca2fc9"
hex"305bc541a04645fb6f733b27d7950a233599ced31ad97e8d3297094dba4abd6f"
hex"295be8a9589ac33d6f04a426390f6e6cd70aec289a6d1ef3264c887280ad42a8"
hex"103c52bb2708e2a6917efb3fd9145bd1729c2c9fa67f01aba05ab47c56441cdf"
hex"0816a0b76cabc81cc9f6bae4de63668f12ae669284b5aeca54be6780354b726e"
hex"0a7bff238cb5cb4c216fcf0f507f40d3679c0acbaef83dd4b5b0db2a9e52c3a6"
hex"048f17c79c4a7abafdff1d3f955b5da5e0816d44f817b705f484c771f1bac294"
hex"28973b30874c1236177adc709f0a6b2d32745835162f5ed9ce69f36f156031e4"
hex"0b2e26c32addc2ceb297648d3fc271a548b9bf788bff4b2023cab820c4a4ee8f"
hex"201bbb92dcd070b78863668016c24160c2c053dadb24001af4042a1e51246033"
hex"07507505dd11a39d879137103f9972ad0f6d79ea24cc16610e1c9dd1984cda87"
hex"1f891703a5676db0633371eca0abacf30d3f4313fc807fbd98d613bef1b3854b"
hex"16cbd386e41f6c4a173a1312f68148cbb308289a209c213fa51dbc31874fe1ee"
hex"1e5c8047a5c0c014f7000ea5d3ca333306adef5755efff735059bc055bed75d7"
hex"1fbb39800b056717d62e76315c4d3e05185e7ee2ece00adefba77bd5b1f4d7bb"
hex"23fde2d94ad2036e9a94304bc121f6c1845a1327d89a6f55bb9ca81eb91e07cd"
hex"0f43871c3ac1f1e37bd2755613ed7b3a3ec11a3eb8fff749ab22f92446f62f85"
hex"152339e3e373c4e4ad9b657f5e665676790ca0bf8e005767aedd4269d107d4f1"
hex"1e6b4bc7a2e4217c1c3cc2e298e450d010fd622c47e2cd7880e64b2e6b2e6fdf"
hex"28958ca1ae65967871544bd1afd71c06b4b39318d5a076091a1266627ad1b40f"
hex"0ceb66234377758d63f8c56e66c0af644ead06b4e987bde957467e75938f1404"
hex"0e31fe264d2cc1f55a3fce3ce86a68196d2a06336102c14d0cc892fc871d6f42"
hex"19b29228092e58a02047d8debf48ba1442ea38aceb82605e8bfa7460c49af496"
hex"0e0528ae6d904bb6c6379fef10cb1d1bc6e867054acf978041ce99becefb2193"
hex"22efa15c26a14170452119318cb1073b15b978fd05c40a5001560edf21df4aac"
hex"2aeea52c33986c164976c52dfb73b8524b9e12650cc2e6614eb1efd1d3134f58"
hex"25ca08820ba2a38dcd2561640ae9935ef47b5da8a801641a7066f7dbc52ff365"
hex"1d8489971cf0f77a525cae847acd5056502177b00ca5b72b3f0fb32e0bb85bb8"
hex"16d389fa12477aa6c862499500c516228cd9ae7c652c3f61f641b6590b800671"
hex"16569eaf77c8ec57e85b52ee30cd6212133a17ca3a4e87bcfd7507598616214d"
hex"0e2b188f173ee86cce1a411c0d2ff80e1ead326474358dbf412f8e540c01aa91"
hex"173f752e069ecc268a7427e0935db3acd27fb7bc097e2b2c58d5a6acdd1fb4c1"
hex"0ef703b9687c4c6f9deddc9c9d3ef5ba1d9a87529d0a7387bc569c6c642913c4"
hex"25fa7538cb83e2a689d5caeac55b325d3597547ef6c8dc122a2a6d000c344eec"
hex"023e56786b482a73477d0fd36701f0eddd08298e43913144c3f7b879d0988761"
hex"2efec260abd0d45688e61558f0288cbddd8b5774e48466f164d5e522b5441314"
hex"14d6f2fe1a75dc3f898674bca43b786b3eebb0e2ac53ea6336d2d0496f23399c"
hex"133eef87007a5128b3f86d3ff94bdd1a0143b28d4b72e7b02b2022147764b03a"
hex"20a11d5fb29aa2ab37f2917d0b42ef10170b5f8614bc6e4decda4186dfafba37";
function getPts(uint256 merkleTreeDepth) internal pure returns (uint256[SET_SIZE] memory pts) {
bytes memory ptBytes = VK_POINT_BYTES;

View File

@@ -1,5 +1,5 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.23 <=0.8.28;
pragma solidity >=0.8.23 <0.9.0;
/// @title Semaphore contract interface.
interface ISemaphore {

View File

@@ -1,5 +1,5 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.23 <=0.8.28;
pragma solidity >=0.8.23 <0.9.0;
/// @title SemaphoreGroups contract interface.
interface ISemaphoreGroups {

View File

@@ -1,5 +1,5 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.23 <=0.8.28;
pragma solidity >=0.8.23 <0.9.0;
/// @title SemaphoreVerifier contract interface.
interface ISemaphoreVerifier {

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/contracts",
"version": "4.11.0",
"version": "4.14.0",
"description": "Semaphore contracts to manage groups and broadcast anonymous signals.",
"license": "MIT",
"files": [

View File

@@ -72,6 +72,22 @@ const hardhatConfig: HardhatUserConfig = {
apiURL: "https://api-sepolia.scrollscan.com/api",
browserURL: "https://sepolia.scrollscan.com"
}
},
{
network: "gnosis-chiado",
chainId: 10200,
urls: {
apiURL: "https://gnosis-chiado.blockscout.com/api",
browserURL: "https://gnosis-chiado.blockscout.com"
}
},
{
network: "gnosis",
chainId: 100,
urls: {
apiURL: "https://api.etherscan.io/v2/api?chainid=100",
browserURL: "https://gnosisscan.io"
}
}
]
},

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/core",
"version": "4.11.0",
"version": "4.14.0",
"description": "Core library for the essential Semaphore features.",
"type": "module",
"license": "MIT",
@@ -42,8 +42,8 @@
"access": "public"
},
"dependencies": {
"@semaphore-protocol/group": "4.11.0",
"@semaphore-protocol/identity": "4.11.0",
"@semaphore-protocol/proof": "4.11.0"
"@semaphore-protocol/group": "4.14.0",
"@semaphore-protocol/identity": "4.14.0",
"@semaphore-protocol/proof": "4.14.0"
}
}

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -173,10 +173,10 @@ const admin = await semaphoreEthers.getGroupAdmin("42")
const members = await semaphoreEthers.getGroupMembers("42")
```
**Fetch Verified Proofs**
**Fetch Validated Proofs**
```typescript
const verifiedProofs = await semaphoreEthers.getGroupVerifiedProofs("42")
const verifiedProofs = await semaphoreEthers.getGroupValidatedProofs("42")
```
**Check Group Membership**

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/data",
"version": "4.11.0",
"version": "4.14.0",
"description": "A library for querying Semaphore smart contract.",
"type": "module",
"license": "MIT",
@@ -37,7 +37,7 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"dependencies": {
"@semaphore-protocol/utils": "4.11.0",
"@semaphore-protocol/utils": "4.14.0",
"@zk-kit/utils": "1.3.0",
"axios": "1.6.6",
"ethers": "6.13.4",

View File

@@ -208,7 +208,7 @@ export default class SemaphoreEthers {
const membersAddedEvents = await getEvents(this._contract, "MembersAdded", [groupId], this._options.startBlock)
const membersAddedEventsMap = new Map<string, [string]>()
const membersAddedEventsMap = new Map<string, string[]>()
for (const [, startIndex, identityCommitments] of membersAddedEvents) {
membersAddedEventsMap.set(
@@ -295,4 +295,156 @@ export default class SemaphoreEthers {
return this._contract.hasMember(groupId, member)
}
/**
* Listens to the GroupCreated event.
* @param callback Called with the groupId of the newly created group.
*/
onGroupCreated(callback: (groupId: string, event: any) => void): void {
this._contract.on("GroupCreated", (groupId, event) => {
callback(groupId.toString(), event)
})
}
/**
* Removes all listeners for the GroupCreated event.
* Stop receiving group creation notifications.
*/
offGropupCreated(): void {
this._contract.removeAllListeners("GroupCreated")
}
/**
* Listens to MemberAdded events.
* @param callback Receives the groupId, identityCommitment and event metadata.
*/
onMemberAdded(
callback: (groupId: string, identityCommitment: string, merkleTreeRoot: string, event: any) => void
): void {
this._contract.on("MemberAdded", (groupId, _index, identityCommitment, merkleTreeRoot, event) => {
callback(groupId.toString(), identityCommitment.toString(), merkleTreeRoot.toString(), event)
})
}
/**
* Removes all listeners for the MemberAdded event.
* Stop tracking when new members are added.
*/
offMemberAdded(): void {
this._contract.removeAllListeners("MemberAdded")
}
/**
* Listens to MemberUpdated events.
* @param callback Receives the groupId, old identityCommitment, new identityCommitment, and event metadata.
*/
onMemberUpdated(
callback: (
groupId: string,
oldIdentityCommitment: string,
newIdentityCommitment: string,
merkleTreeRoot: string,
event: any
) => void
): void {
this._contract.on(
"MemberUpdated",
(groupId, _index, oldIdentityCommitment, newIdentityCommitment, merkleTreeRoot, event) => {
callback(
groupId.toString(),
oldIdentityCommitment.toString(),
newIdentityCommitment.toString(),
merkleTreeRoot.toString(),
event
)
}
)
}
/**
* Removes all listeners for the MemberUpdated event.
* Stop receiving updates when members change their commitment.
*/
offMemberUpdated(): void {
this._contract.removeAllListeners("MemberUpdated")
}
/**
* Listens to MemberRemoved events.
* @param callback Receives the groupId, identityCommitment and event metadata.
*/
onMemberRemoved(
callback: (groupId: string, identityCommitment: string, merkleTreeRoot: string, event: any) => void
): void {
this._contract.on("MemberRemoved", (groupId, _index, identityCommitment, merkleTreeRoot, event) => {
callback(groupId.toString(), identityCommitment.toString(), merkleTreeRoot.toString(), event)
})
}
/**
* Removes all listeners for the MemberRemoved event.
* Stop listening for member removals.
*/
offMemberRemoved(): void {
this._contract.removeAllListeners("MemberRemoved")
}
/**
* Listens to the ProofValidated event.
* @param callback Called with proof parameters and event metadata.
*/
onProofValidated(
callback: (proof: {
groupId: string
merkleTreeDepth: number
merkleTreeRoot: string
nullifier: string
message: string
scope: string
points: string[]
event: any
}) => void
): void {
this._contract.on(
"ProofValidated",
(groupId, merkleTreeDepth, merkleTreeRoot, nullifier, message, scope, points, event) => {
callback({
groupId: groupId.toString(),
merkleTreeDepth: Number(merkleTreeDepth),
merkleTreeRoot: merkleTreeRoot.toString(),
nullifier: nullifier.toString(),
message: message.toString(),
scope: scope.toString(),
points: points.map((p: any) => p.toString()),
event
})
}
)
}
/**
* Removes all listeners for the ProofValidated event.
* Stop receiving proof validation notifications.
*/
offProofValidated(): void {
this._contract.removeAllListeners("ProofValidated")
}
/**
* Listens to the GroupAdminUpdated event.
* @param callback Receives the groupId, old admin and new admin addresses and event metadata.
*/
onGroupAdminUpdated(callback: (groupId: string, oldAdmin: string, newAdmin: string, event: any) => void): void {
this._contract.on("GroupAdminUpdated", (groupId, oldAdmin, newAdmin, event) => {
callback(groupId.toString(), oldAdmin.toString(), newAdmin.toString(), event)
})
}
/**
* Removes all listeners for the GroupAdminUpdated event.
* Stop tracking when a group's admin is updated.
*/
offGroupAdminUpdated(): void {
this._contract.removeAllListeners("GroupAdminUpdated")
}
}

View File

@@ -12,5 +12,5 @@ export default function getURL(supportedNetwork: SupportedNetwork): string {
throw new TypeError(`Network '${supportedNetwork}' is not supported`)
}
return `https://api.studio.thegraph.com/query/14377/semaphore-${supportedNetwork}/v4.3.0`
return `https://api.studio.thegraph.com/query/14377/semaphore-${supportedNetwork}/v4.5.0`
}

View File

@@ -1,4 +1,4 @@
import { Chain, Transport } from "viem"
import { Chain, PublicClient, Transport } from "viem"
export type EthersNetwork =
| "mainnet"
@@ -65,4 +65,5 @@ export type ViemOptions = {
transport?: Transport // Transport from viem
chain?: Chain // Chain from viem
apiKey?: string
publicClient?: PublicClient
}

View File

@@ -93,13 +93,6 @@ export default class SemaphoreViem {
constructor(networkOrEthereumURL: ViemNetwork | string = defaultNetwork, options: ViemOptions = {}) {
requireString(networkOrEthereumURL, "networkOrEthereumURL")
if (options.transport) {
// Transport is provided directly
} else if (!networkOrEthereumURL.startsWith("http")) {
// Default to http transport if no transport is provided and network is not a URL
options.transport = http()
}
if (options.apiKey) {
requireString(options.apiKey, "apiKey")
}
@@ -108,7 +101,7 @@ export default class SemaphoreViem {
const { address, startBlock } = getDeployedContract(networkOrEthereumURL as SupportedNetwork)
options.address ??= address
options.startBlock ??= BigInt(startBlock || 0)
options.startBlock ??= BigInt(startBlock)
} else {
options.startBlock ??= 0n
}
@@ -117,13 +110,12 @@ export default class SemaphoreViem {
throw new Error(`Network '${networkOrEthereumURL}' needs a Semaphore contract address`)
}
// Create the public client
let transport: Transport
if (options.transport) {
transport = options.transport
} else if (!networkOrEthereumURL.startsWith("http")) {
transport = http()
} else {
// If no transport is provided, use http transport with the URL
transport = http(networkOrEthereumURL)
}
@@ -131,10 +123,12 @@ export default class SemaphoreViem {
this._options = options
// Create the public client
this._client = createPublicClient({
transport,
chain: options.chain as Chain
})
this._client =
options.publicClient ??
createPublicClient({
transport,
chain: options.chain as Chain
})
// Create the contract instance
this._contract = getContract({
@@ -244,7 +238,7 @@ export default class SemaphoreViem {
abi: SemaphoreABI,
eventName: "MemberRemoved",
args: {
groupId
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as MemberRemovedLog[]
@@ -255,7 +249,7 @@ export default class SemaphoreViem {
abi: SemaphoreABI,
eventName: "MemberUpdated",
args: {
groupId
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as MemberUpdatedLog[]
@@ -287,7 +281,7 @@ export default class SemaphoreViem {
abi: SemaphoreABI,
eventName: "MembersAdded",
args: {
groupId
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as MembersAddedLog[]
@@ -309,7 +303,7 @@ export default class SemaphoreViem {
abi: SemaphoreABI,
eventName: "MemberAdded",
args: {
groupId
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as MemberAddedLog[]
@@ -328,12 +322,10 @@ export default class SemaphoreViem {
index += identityCommitments.length
} else {
const currentIndex = index // Create a closure to capture the current index value
const event = memberAddedEvents.find((e) => e.args.index && Number(e.args.index) === currentIndex)
const event = memberAddedEvents.find((e) => Number(e.args.index) === currentIndex)
if (event && event.args.identityCommitment) {
members.push(event.args.identityCommitment.toString())
} else {
members.push("0") // Placeholder for missing member
}
index += 1
@@ -372,7 +364,7 @@ export default class SemaphoreViem {
abi: SemaphoreABI,
eventName: "ProofValidated",
args: {
groupId
groupId: BigInt(groupId)
},
fromBlock: BigInt(this._options.startBlock || 0)
})) as ProofValidatedLog[]

View File

@@ -257,4 +257,140 @@ describe("SemaphoreEthers", () => {
expect(isMember).toBeFalsy()
})
})
describe("Event listeners", () => {
let mockOn: jest.Mock
let mockRemove: jest.Mock
beforeEach(() => {
mockOn = jest.fn()
mockRemove = jest.fn()
ContractMocked.mockImplementation(
() =>
({
on: mockOn,
removeAllListeners: mockRemove
}) as any
)
})
it("onGroupCreated should call the callback with groupId and event", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onGroupCreated(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "GroupCreated")![1]
const fakeEvent = { blockNumber: 123 }
handler("42", fakeEvent)
expect(cb).toHaveBeenCalledWith("42", fakeEvent)
expect(mockOn).toHaveBeenCalledWith("GroupCreated", expect.any(Function))
})
it("offGroupCreated should remove all listeners for GroupCreated", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
semaphore.offGropupCreated()
expect(mockRemove).toHaveBeenCalledWith("GroupCreated")
})
it("onMemberAdded should call callback with groupId, identityCommitment and event", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onMemberAdded(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "MemberAdded")![1]
const fakeEvent = { txHash: "0xabc" }
handler("group1", 0, "identity123", "root111", fakeEvent)
expect(cb).toHaveBeenCalledWith("group1", "identity123", "root111", fakeEvent)
})
it("onMemberUpdated should call callback with groupId, old and new identity commitments", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onMemberUpdated(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "MemberUpdated")![1]
const fakeEvent = { blockNumber: 200 }
handler("groupX", 1, "old123", "new456", "root111", fakeEvent)
expect(cb).toHaveBeenCalledWith("groupX", "old123", "new456", "root111", fakeEvent)
})
it("onMemberRemoved should call callback with groupId, identityCommitment and event", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onMemberRemoved(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "MemberRemoved")![1]
const fakeEvent = { txHash: "0xdeadbeef" }
handler("groupZ", 2, "identity999", "root111", fakeEvent)
expect(cb).toHaveBeenCalledWith("groupZ", "identity999", "root111", fakeEvent)
})
it("offMemberAdded/Updated/Removed should remove all corresponding listeners", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
semaphore.offMemberAdded()
semaphore.offMemberUpdated()
semaphore.offMemberRemoved()
expect(mockRemove).toHaveBeenCalledWith("MemberAdded")
expect(mockRemove).toHaveBeenCalledWith("MemberUpdated")
expect(mockRemove).toHaveBeenCalledWith("MemberRemoved")
})
it("onProofValidated should call callback with proof object", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onProofValidated(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "ProofValidated")![1]
const fakeEvent = { blockNumber: 400 }
handler("group1", 3, "root123", "nullifierXYZ", "msg1", "scope1", ["p1", "p2"], fakeEvent)
expect(cb).toHaveBeenCalledWith({
groupId: "group1",
merkleTreeDepth: 3,
merkleTreeRoot: "root123",
nullifier: "nullifierXYZ",
message: "msg1",
scope: "scope1",
points: ["p1", "p2"],
event: fakeEvent
})
})
it("offProofValidated should remove all ProofValidated listeners", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
semaphore.offProofValidated()
expect(mockRemove).toHaveBeenCalledWith("ProofValidated")
})
it("onGroupAdminUpdated should call callback with groupId, oldAdmin, newAdmin and event", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
const cb = jest.fn()
semaphore.onGroupAdminUpdated(cb)
const handler = mockOn.mock.calls.find(([e]) => e === "GroupAdminUpdated")![1]
const fakeEvent = { txHash: "0xbeef" }
handler("group1", "0xOLD", "0xNEW", fakeEvent)
expect(cb).toHaveBeenCalledWith("group1", "0xOLD", "0xNEW", fakeEvent)
})
it("offGroupAdminUpdated should remove all GroupAdminUpdated listeners", () => {
const semaphore = new SemaphoreEthers("sepolia", { address: "0x0000" })
semaphore.offGroupAdminUpdated()
expect(mockRemove).toHaveBeenCalledWith("GroupAdminUpdated")
})
})
})

View File

@@ -0,0 +1,108 @@
import { Contract, EventLog } from "ethers/contract"
import getEvents from "../src/getEvents"
jest.mock("ethers/contract", () => ({
__esModule: true,
Contract: jest.fn(),
EventLog: jest.fn()
}))
describe("getEvents", () => {
let mockContract: jest.Mocked<Contract>
beforeEach(() => {
mockContract = {
filters: {
TestEvent: jest.fn()
},
queryFilter: jest.fn()
} as any
})
describe("# getEvents", () => {
it("should fetch events with basic parameters", async () => {
const mockEvents = [
{
args: ["arg1", "arg2"],
blockNumber: 123
},
{
args: ["arg3", "arg4"],
blockNumber: 124
}
] as EventLog[]
mockContract.queryFilter.mockResolvedValueOnce(mockEvents)
const result = await getEvents(mockContract, "TestEvent")
expect(mockContract.filters.TestEvent).toHaveBeenCalled()
expect(mockContract.queryFilter).toHaveBeenCalled()
expect(result).toEqual([
["arg1", "arg2", 123],
["arg3", "arg4", 124]
])
})
it("should handle filter arguments", async () => {
const filterArgs = ["arg1", "arg2"]
const mockEvents = [
{
args: ["arg1", "arg2"],
blockNumber: 123
}
] as EventLog[]
mockContract.queryFilter.mockResolvedValueOnce(mockEvents)
await getEvents(mockContract, "TestEvent", filterArgs)
expect(mockContract.filters.TestEvent).toHaveBeenCalledWith(...filterArgs)
})
it("should use startBlock parameter", async () => {
const startBlock = 1000
const mockEvents = [
{
args: ["arg1"],
blockNumber: 1001
}
] as EventLog[]
mockContract.queryFilter.mockResolvedValueOnce(mockEvents)
await getEvents(mockContract, "TestEvent", [], startBlock)
expect(mockContract.queryFilter).toHaveBeenCalledWith(undefined, startBlock)
})
it("should handle empty events array", async () => {
mockContract.queryFilter.mockResolvedValueOnce([])
const result = await getEvents(mockContract, "TestEvent")
expect(result).toEqual([])
})
it("should handle undefined filterArgs gracefully", async () => {
const mockEvents = [
{
args: ["arg1"],
blockNumber: 101
}
] as EventLog[]
mockContract.queryFilter.mockResolvedValueOnce(mockEvents)
await getEvents(mockContract, "TestEvent", undefined)
expect(mockContract.filters.TestEvent).toHaveBeenCalledWith()
})
it("should handle contract errors", async () => {
mockContract.queryFilter.mockRejectedValue(new Error("Contract error"))
await expect(getEvents(mockContract, "TestEvent")).rejects.toThrow("Contract error")
})
})
})

View File

@@ -186,6 +186,7 @@ describe("SemaphoreViem", () => {
const groupIds = await semaphoreViem.getGroupIds()
expect(groupIds).toContain("42")
expect(groupIds).toHaveLength(2)
expect(mockGetContractEvents).toHaveBeenCalledWith(
expect.objectContaining({
eventName: "GroupCreated"
@@ -268,102 +269,34 @@ describe("SemaphoreViem", () => {
})
describe("# getGroupMembers", () => {
it("should return a list of group members", async () => {
it("should return all the existing groups members", async () => {
const semaphoreViem = createSemaphoreViem()
// Create a custom implementation for the getGroupMembers method
// @ts-ignore - Mocking the implementation
semaphoreViem.getGroupMembers = jest
.fn()
.mockResolvedValue(["0", "113", "114", "0", "209", "210", "310", "312"])
const members = await semaphoreViem.getGroupMembers("42")
// Verify results
expect(members).toHaveLength(8)
expect(members[0]).toBe("0") // Default value for missing member
expect(members[1]).toBe("113") // From MemberUpdated
expect(members[2]).toBe("114") // From MemberAdded
expect(members[3]).toBe("0") // Removed member (MemberRemoved)
expect(members[4]).toBe("209") // From MembersAdded
expect(members[5]).toBe("210") // From MembersAdded
expect(members[6]).toBe("310") // From MemberAdded
expect(members[7]).toBe("312") // From MemberAdded
})
it("should handle edge cases in event data", async () => {
const semaphoreViem = createSemaphoreViem()
// Mock the contract read methods
// @ts-ignore - Mocking the contract read methods
semaphoreViem.contract.read.getMerkleTreeSize = jest.fn().mockReturnValue(BigInt(5))
// Mock the getContractEvents method with incomplete/missing data
const mockGetContractEvents = jest.fn().mockImplementation((params) => {
if (params.eventName === "MemberRemoved") {
return [
{
// Missing args.index to test that branch
args: {
groupId: "42"
},
blockNumber: BigInt(1000)
},
{
// Missing blockNumber to test that branch
args: {
groupId: "42",
index: BigInt(1)
}
}
]
// Mock the getContractEvents method
const mockGetContractEvents = jest.fn().mockResolvedValue([
{
eventName: "MemberAdded",
args: { groupId: "42", index: BigInt(0), identityCommitment: "1" }
},
{
eventName: "MemberAdded",
args: { groupId: "42", index: BigInt(1), identityCommitment: "2" }
}
if (params.eventName === "MemberUpdated") {
return [
{
// Missing newIdentityCommitment to test that branch
args: {
groupId: "42",
index: BigInt(2)
},
blockNumber: BigInt(900)
},
{
// Missing blockNumber to test that branch
args: {
groupId: "42",
index: BigInt(3),
newIdentityCommitment: "333"
}
}
]
}
if (params.eventName === "MembersAdded") {
return [
{
// Missing identityCommitments to test that branch
args: {
groupId: "42",
startIndex: BigInt(0)
}
}
]
}
if (params.eventName === "MemberAdded") {
return []
}
return []
})
])
// @ts-ignore - Mocking the client's getContractEvents method
semaphoreViem.client.getContractEvents = mockGetContractEvents
const members = await semaphoreViem.getGroupMembers("42")
semaphoreViem.contract.read.getMerkleTreeSize = jest.fn().mockReturnValue(BigInt(2))
// Just verify that the method completes without errors
expect(members).toBeDefined()
expect(Array.isArray(members)).toBe(true)
expect(members).toHaveLength(5)
const groupMembers = await semaphoreViem.getGroupMembers("42")
expect(groupMembers).toHaveLength(2)
expect(mockGetContractEvents).toHaveBeenCalledWith(
expect.objectContaining({
eventName: "MemberAdded"
})
)
})
it("should handle all event types and update paths correctly", async () => {
@@ -394,7 +327,7 @@ describe("SemaphoreViem", () => {
args: {
groupId: "42",
index: BigInt(1),
newIdentityCommitment: "999"
newIdentityCommitment: "111"
},
blockNumber: BigInt(1000)
},
@@ -416,19 +349,43 @@ describe("SemaphoreViem", () => {
args: {
groupId: "42",
startIndex: BigInt(5),
identityCommitments: ["501", "502", "503"]
identityCommitments: ["6", "7", "8"]
}
}
]
}
if (params.eventName === "MemberAdded") {
return [
{
// Valid member added event - individual addition at index 2
args: {
groupId: "42",
index: BigInt(0),
identityCommitment: "1"
}
},
{
// Valid member added event - individual addition at index 2
args: {
groupId: "42",
index: BigInt(1),
identityCommitment: "2"
}
},
{
// Valid member added event - individual addition at index 2
args: {
groupId: "42",
index: BigInt(2),
identityCommitment: "222"
identityCommitment: "3"
}
},
{
// Valid member added event - individual addition at index 2
args: {
groupId: "42",
index: BigInt(3),
identityCommitment: "4"
}
},
{
@@ -436,7 +393,7 @@ describe("SemaphoreViem", () => {
args: {
groupId: "42",
index: BigInt(4),
identityCommitment: "444"
identityCommitment: "5"
}
},
{
@@ -444,7 +401,7 @@ describe("SemaphoreViem", () => {
args: {
groupId: "42",
index: BigInt(8),
identityCommitment: "888"
identityCommitment: "9"
}
}
]
@@ -458,17 +415,16 @@ describe("SemaphoreViem", () => {
const members = await semaphoreViem.getGroupMembers("42")
// Verify the results cover all the branches
expect(members).toHaveLength(10)
expect(members[0]).toBe("0") // Default placeholder (no event)
expect(members[1]).toBe("999") // From MemberUpdated
expect(members[2]).toBe("222") // From MemberAdded
expect(members).toHaveLength(9)
expect(members[0]).toBe("1")
expect(members[1]).toBe("111") // From MemberUpdated
expect(members[2]).toBe("3") // From MemberAdded
expect(members[3]).toBe("0") // From MemberRemoved (overriding MemberUpdated)
expect(members[4]).toBe("444") // From MemberAdded
expect(members[5]).toBe("501") // From MembersAdded (batch)
expect(members[6]).toBe("502") // From MembersAdded (batch)
expect(members[7]).toBe("503") // From MembersAdded (batch)
expect(members[8]).toBe("888") // From MemberAdded
expect(members[9]).toBe("0") // Default placeholder (no event)
expect(members[4]).toBe("5") // From MemberAdded
expect(members[5]).toBe("6") // From MembersAdded (batch)
expect(members[6]).toBe("7") // From MembersAdded (batch)
expect(members[7]).toBe("8") // From MembersAdded (batch)
expect(members[8]).toBe("9") // From MemberAdded
})
it("should throw an error if the group does not exist", async () => {
@@ -1029,151 +985,6 @@ describe("SemaphoreViem", () => {
// Should have undefined timestamp
expect(proofs[0].timestamp).toBeUndefined()
})
// Additional test for line 111 - startBlock initialization with defined startBlock
it("should handle defined startBlock from getDeployedContract", () => {
// Create a new instance with a supported network
const semaphoreViem = new SemaphoreViem("sepolia")
// @ts-ignore - accessing private property for testing
expect(semaphoreViem._options.startBlock).not.toBe(0n)
})
// Additional test for lines 249-260 - memberUpdatedEvents with valid args
it("should handle memberUpdatedEvents with valid args", async () => {
const semaphoreViem = createSemaphoreViem()
// Mock getContractEvents to return valid memberUpdatedEvents
const mockGetContractEvents = jest.fn().mockImplementation(({ eventName }) => {
if (eventName === "MemberUpdated") {
return [
{
args: {
groupId: "1",
index: 0n,
newIdentityCommitment: 123n
},
blockNumber: 123n,
address: "0x1234" as `0x${string}`,
blockHash: "0xabc" as `0x${string}`,
data: "0x" as `0x${string}`,
logIndex: 0,
transactionHash: "0xdef" as `0x${string}`,
transactionIndex: 0,
removed: false,
topics: ["0x"],
eventName: "MemberUpdated"
}
]
}
return []
})
// Mock contract read methods
const mockContract = {
read: {
getGroupAdmin: jest.fn().mockResolvedValue("0x1234"),
getMerkleTreeRoot: jest.fn().mockResolvedValue("root"),
getMerkleTreeDepth: jest.fn().mockResolvedValue(20n),
getMerkleTreeSize: jest.fn().mockResolvedValue(1n)
}
}
// @ts-ignore - Replace client and contract with mocks
semaphoreViem._client = {
getContractEvents: mockGetContractEvents
}
// @ts-ignore
semaphoreViem._contract = mockContract
const members = await semaphoreViem.getGroupMembers("1")
// Should include the updated member - actual value is "0"
expect(members).toEqual(["0"])
})
// Additional test for line 292 - membersAddedEvents with valid args
it("should handle membersAddedEvents with valid args", async () => {
const semaphoreViem = createSemaphoreViem()
// Mock getContractEvents to return valid membersAddedEvents
const mockGetContractEvents = jest.fn().mockImplementation(({ eventName }) => {
if (eventName === "MembersAdded") {
return [
{
args: {
groupId: "1",
startIndex: 0n,
identityCommitments: ["123", "456"]
},
address: "0x1234" as `0x${string}`,
blockHash: "0xabc" as `0x${string}`,
blockNumber: 123n,
data: "0x" as `0x${string}`,
logIndex: 0,
transactionHash: "0xdef" as `0x${string}`,
transactionIndex: 0,
removed: false,
topics: ["0x"],
eventName: "MembersAdded"
}
]
}
return []
})
// Mock contract read methods
const mockContract = {
read: {
getGroupAdmin: jest.fn().mockResolvedValue("0x1234"),
getMerkleTreeRoot: jest.fn().mockResolvedValue("root"),
getMerkleTreeDepth: jest.fn().mockResolvedValue(20n),
getMerkleTreeSize: jest.fn().mockResolvedValue(2n)
}
}
// @ts-ignore - Replace client and contract with mocks
semaphoreViem._client = {
getContractEvents: mockGetContractEvents
}
// @ts-ignore
semaphoreViem._contract = mockContract
const members = await semaphoreViem.getGroupMembers("1")
// Should include the batch-added members - actual values are "0", "0"
expect(members).toEqual(["0", "0"])
})
// Additional test for line 314 - non-zero merkleTreeSize
it("should handle non-zero merkleTreeSize", async () => {
const semaphoreViem = createSemaphoreViem()
// Mock contract read methods
const mockContract = {
read: {
getGroupAdmin: jest.fn().mockResolvedValue("0x1234"),
getMerkleTreeRoot: jest.fn().mockResolvedValue("root"),
getMerkleTreeDepth: jest.fn().mockResolvedValue(20n),
getMerkleTreeSize: jest.fn().mockResolvedValue(3n)
}
}
// Mock client with empty events
const mockGetContractEvents = jest.fn().mockResolvedValue([])
// @ts-ignore - Replace client and contract with mocks
semaphoreViem._client = {
getContractEvents: mockGetContractEvents
}
// @ts-ignore
semaphoreViem._contract = mockContract
const members = await semaphoreViem.getGroupMembers("1")
// Should return array with empty strings for each index
expect(members).toEqual(["0", "0", "0"])
})
})
describe("# Branch coverage for startBlock fallbacks", () => {

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/group",
"version": "4.11.0",
"version": "4.14.0",
"description": "A library to create and manage Semaphore groups.",
"type": "module",
"license": "MIT",
@@ -36,7 +36,7 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"dependencies": {
"@zk-kit/lean-imt": "2.2.3",
"@zk-kit/lean-imt": "2.2.4",
"@zk-kit/utils": "1.3.0",
"poseidon-lite": "0.3.0"
}

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/hardhat",
"version": "4.11.0",
"version": "4.14.0",
"description": "A Hardhat plugin to deploy Semaphore contracts.",
"type": "module",
"license": "MIT",
@@ -41,7 +41,7 @@
},
"dependencies": {
"@nomicfoundation/hardhat-ethers": "^3.0.0",
"@semaphore-protocol/contracts": "4.11.0",
"@semaphore-protocol/contracts": "4.14.0",
"ethers": "^6.13.4",
"hardhat-dependency-compiler": "^1.1.3"
}

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/identity",
"version": "4.11.0",
"version": "4.14.0",
"description": "A library to create Semaphore identities.",
"type": "module",
"license": "MIT",

View File

@@ -62,7 +62,7 @@ export class Identity {
/**
* Returns the secret scalar.
* @returns The secret scalar as a string.
* @returns The secret scalar as a bigint.
*/
public get secretScalar(): bigint {
return this._secretScalar
@@ -78,7 +78,7 @@ export class Identity {
/**
* Returns the commitment hash of the public key.
* @returns The commitment as a string.
* @returns The commitment as a bigint.
*/
public get commitment(): bigint {
return this._commitment

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -116,3 +116,25 @@ import { verifyProof } from "@semaphore-protocol/proof"
await verifyProof(proof1)
```
## Resource management: Terminating the bn128 curve
When using the Semaphore proof library in Node.js environments, especially in tests or scripts that create and use the `bn128` curve (for example, via `getCurveFromName("bn128")` from the `ffjavascript` package), it is important to properly release resources associated with the curve after use. Failing to do so can result in leaked handles (such as `MessagePort` handles), which may prevent Node.js from exiting cleanly. This is particularly relevant when running test suites.
**How to terminate the bn128 curve:**
If you create a curve instance using `getCurveFromName("bn128")`, you should call its `terminate()` method when you are done with it. For example:
```typescript
import { getCurveFromName } from "ffjavascript"
let curve
beforeAll(async () => {
curve = await getCurveFromName("bn128")
})
afterAll(async () => {
await curve.terminate()
})
```
This ensures that all resources are properly released and Node.js can exit cleanly after your script or tests finish.

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/proof",
"version": "4.11.0",
"version": "4.14.0",
"description": "A library to generate and verify Semaphore proofs.",
"type": "module",
"license": "MIT",
@@ -47,14 +47,14 @@
"rollup-plugin-cleanup": "^3.2.1"
},
"peerDependencies": {
"@semaphore-protocol/group": "4.11.0",
"@semaphore-protocol/identity": "4.11.0"
"@semaphore-protocol/group": "4.14.0",
"@semaphore-protocol/identity": "4.14.0"
},
"dependencies": {
"@semaphore-protocol/utils": "4.11.0",
"@zk-kit/artifacts": "1.8.0",
"@semaphore-protocol/utils": "4.14.0",
"@zk-kit/artifacts": "2.0.1",
"@zk-kit/utils": "1.3.0",
"ethers": "6.13.4",
"snarkjs": "0.7.4"
"snarkjs": "0.7.5"
}
}

View File

@@ -86,18 +86,14 @@ export default async function generateProof(
// If the Snark artifacts are not defined they will be automatically downloaded.
snarkArtifacts ??= await maybeGetSnarkArtifacts(Project.SEMAPHORE, {
parameters: [merkleTreeDepth],
version: "4.0.0"
version: "4.13.0"
})
const { wasm, zkey } = snarkArtifacts
// The index must be converted to a list of indices, 1 for each tree level.
// The missing siblings can be set to 0, as they won't be used in the circuit.
const merkleProofIndices = []
const merkleProofSiblings = merkleProof.siblings
for (let i = 0; i < merkleTreeDepth; i += 1) {
merkleProofIndices.push((merkleProof.index >> i) & 1)
if (merkleProofSiblings[i] === undefined) {
merkleProofSiblings[i] = 0n
}
@@ -107,7 +103,7 @@ export default async function generateProof(
{
secret: identity.secretScalar,
merkleProofLength,
merkleProofIndices,
merkleProofIndex: merkleProof.index,
merkleProofSiblings,
scope: hash(scope),
message: hash(message)

View File

@@ -9,5 +9,5 @@ import { NumericString } from "snarkjs"
* @returns The message digest.
*/
export default function hash(message: BigNumberish): NumericString {
return (BigInt(keccak256(toBeHex(message, 32))) >> BigInt(8)).toString()
return (BigInt(keccak256(toBeHex(message, 32))) >> 8n).toString()
}

View File

@@ -15,6 +15,6 @@ export default function toBigInt(value: BigNumberish | Uint8Array | string): big
return _toBigInt(encodeBytes32String(value))
}
throw TypeError(error.message)
throw TypeError(error instanceof Error ? error.message : error.toString())
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2024 Ethereum Foundation
Copyright (c) 2025 Ethereum Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,6 +1,6 @@
{
"name": "@semaphore-protocol/utils",
"version": "4.11.0",
"version": "4.14.0",
"description": "A library to provide utility functions to the other Semaphore packages.",
"type": "module",
"license": "MIT",

View File

@@ -4,18 +4,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 8263690
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 9118042
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 8263690
"startBlock": 9118042
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 8263690
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 9118042
}
]
},
@@ -24,18 +24,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 22424592
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 23311418
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 22424592
"startBlock": 23311418
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 22424592
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 23311418
}
]
},
@@ -44,18 +44,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 149903019
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 190173122
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 149903019
"startBlock": 190173122
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 149903019
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 190173122
}
]
},
@@ -64,18 +64,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 27341051
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 32508911
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 27341051
"startBlock": 32508911
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 27341051
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 32508911
}
]
},
@@ -84,18 +84,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 21308099
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 25915415
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 21308099
"startBlock": 25915415
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 21308099
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 25915415
}
]
},
@@ -104,18 +104,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 333645515
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 376612967
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 333645515
"startBlock": 376612967
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 333645515
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 376612967
}
]
},
@@ -124,18 +124,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 71158898
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 76162950
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 71158898
"startBlock": 76162950
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 71158898
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 76162950
}
]
},
@@ -144,18 +144,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 135443119
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 140821423
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 135443119
"startBlock": 140821423
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 135443119
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 140821423
}
]
},
@@ -164,18 +164,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 25358716
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 30526193
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 25358716
"startBlock": 30526193
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 25358716
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 30526193
}
]
},
@@ -184,18 +184,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 12757656
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 17778088
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 12757656
"startBlock": 17778088
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 12757656
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 17778088
}
]
},
@@ -204,18 +204,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 29848242
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 35226469
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 29848242
"startBlock": 35226469
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 29848242
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 35226469
}
]
},
@@ -224,18 +224,18 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 18707811
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 23030579
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 18707811
"startBlock": 23030579
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 18707811
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 23030579
}
]
},
@@ -244,18 +244,58 @@
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x6C42599435B82121794D835263C846384869502d",
"startBlock": 9604960
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 11979239
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 9604960
"startBlock": 11979239
},
{
"name": "Semaphore",
"address": "0x697c80d1F2654e88d52B16154929EB976568DB04",
"startBlock": 9604960
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 11979239
}
]
},
{
"network": "gnosis-chiado",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 18246899
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 18246899
},
{
"name": "Semaphore",
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 18246899
}
]
},
{
"network": "gnosis",
"contracts": [
{
"name": "SemaphoreVerifier",
"address": "0x4DeC9E3784EcC1eE002001BfE91deEf4A48931f8",
"startBlock": 42592252
},
{
"name": "PoseidonT3",
"address": "0xB43122Ecb241DD50062641f089876679fd06599a",
"startBlock": 42592252
},
{
"name": "Semaphore",
"address": "0x8A1fd199516489B0Fb7153EB5f075cDAC83c693D",
"startBlock": 42592252
}
]
}

View File

@@ -76,5 +76,17 @@ export default {
url: "https://sepolia-rpc.scroll.io",
chainId: 534351,
explorer: "https://sepolia.scrollscan.com"
},
"gnosis-chiado": {
name: "Gnosis Chiado",
url: "https://rpc.chiadochain.net",
chainId: 10200,
explorer: "https://blockscout.com/gnosis/chiado"
},
gnosis: {
name: "Gnosis",
url: "https://rpc.gnosischain.com",
chainId: 100,
explorer: "https://gnosisscan.io"
}
}

File diff suppressed because one or more lines are too long

View File

@@ -20,7 +20,9 @@ async function main() {
.filter((file) => file.isDirectory())
.map((dir) => dir.name)
folders.map((app) => gitIgnored.map((f) => rmSync(`${folderName}/${app}/${f}`, { recursive: true, force: true })))
folders.forEach((app) =>
gitIgnored.forEach((f) => rmSync(`${folderName}/${app}/${f}`, { recursive: true, force: true }))
)
}
main()

View File

@@ -14,8 +14,8 @@ const gitIgnored = [
const folders = ["cli-template-monorepo-ethers", "cli-template-monorepo-subgraph"]
async function main() {
folders.map((pkg) =>
gitIgnored.map((f) => rmSync(`${folderName}/${pkg}/apps/${f}`, { recursive: true, force: true }))
folders.forEach((pkg) =>
gitIgnored.forEach((f) => rmSync(`${folderName}/${pkg}/apps/${f}`, { recursive: true, force: true }))
)
}

View File

@@ -10,7 +10,9 @@ async function main() {
.filter((file) => file.isDirectory())
.map((dir) => dir.name)
folders.map((app) => gitIgnored.map((f) => rmSync(`${folderName}/${app}/${f}`, { recursive: true, force: true })))
folders.forEach((app) =>
gitIgnored.forEach((f) => rmSync(`${folderName}/${app}/${f}`, { recursive: true, force: true }))
)
rmSync(`${folderName}/circuit/main`, { recursive: true, force: true })
rmSync(`${folderName}/circuit/test`, { recursive: true, force: true })

594
yarn.lock

File diff suppressed because it is too large Load Diff