nano-pow 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -14
- package/dist/global.min.js +146 -105
- package/dist/main.min.js +149 -92
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -16,28 +16,58 @@ proof-of-work equation defined by Nano, see
|
|
|
16
16
|
https://docs.nano.org/integration-guides/work-generation/#work-calculation-details
|
|
17
17
|
|
|
18
18
|
## Installation
|
|
19
|
-
|
|
20
19
|
```console
|
|
21
20
|
npm i nano-pow
|
|
22
21
|
```
|
|
23
22
|
|
|
24
23
|
## Usage
|
|
24
|
+
### Import
|
|
25
|
+
The easiest way to use NanoPow is to import it directly. Based on the features
|
|
26
|
+
available in the environment, NanoPow will try to use its most performant API.
|
|
27
|
+
|
|
28
|
+
The following two import statements are equivalent, and both are provided to
|
|
29
|
+
accomodate project style preferences:
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
import { NanoPow } from 'nano-pow'
|
|
33
|
+
// OR
|
|
34
|
+
import NanoPow from 'nano-pow'
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
A specific API can be explicitly imported:
|
|
25
38
|
|
|
26
39
|
```javascript
|
|
27
40
|
import { NanoPowGpu, NanoPowGl } from 'nano-pow'
|
|
41
|
+
```
|
|
28
42
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
43
|
+
Any of these options can also be imported into the global namespace by targeting
|
|
44
|
+
`dist/global.min.js`. For example:
|
|
45
|
+
```html
|
|
46
|
+
<script type="module" src="https://cdn.jsdelivr.net/npm/nano-pow@latest/dist/global.min.js"></script>
|
|
47
|
+
<script type="module">
|
|
48
|
+
console.log(NanoPow)
|
|
49
|
+
</script>
|
|
34
50
|
```
|
|
35
51
|
|
|
36
|
-
|
|
52
|
+
### Search
|
|
53
|
+
```javascript
|
|
54
|
+
// `hash` is a 64-char hex string
|
|
55
|
+
const hash = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'
|
|
56
|
+
// `threshold` is optional and defaults to "0xFFFFFFF8" for send/change blocks
|
|
57
|
+
const work = await NanoPow.search(hash, threshold)
|
|
58
|
+
// Result is a 16-char hex string
|
|
59
|
+
```
|
|
37
60
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
61
|
+
### Validate
|
|
62
|
+
```javascript
|
|
63
|
+
// `work` is a 16-char hex string
|
|
64
|
+
const work = 'fedcba0987654321'
|
|
65
|
+
// `hash` is a 64-char hex string
|
|
66
|
+
const hash = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'
|
|
67
|
+
// `threshold` is optional and defaults to "0xFFFFFFF8" for send/change blocks
|
|
68
|
+
const isValid = await NanoPow.validate(work, hash, threshold)
|
|
69
|
+
// Result is a boolean
|
|
70
|
+
```
|
|
41
71
|
|
|
42
72
|
## Notes
|
|
43
73
|
The `work` field in a Nano transaction block contains an 8-byte nonce that
|
|
@@ -54,9 +84,8 @@ hash of the most recent block in the account chain for all other accounts.
|
|
|
54
84
|
for receive/open/epoch blocks.
|
|
55
85
|
|
|
56
86
|
The threshold is implemented in code as only the first 32 bits due to WGSL only
|
|
57
|
-
supporting u32 integer types, but the result is the same. For example, if
|
|
58
|
-
|
|
59
|
-
6, you automatically know it is greather than 55.
|
|
87
|
+
supporting u32 integer types, but the result is the same. For example, if checking whether a two-digit number xx > 55, and it is known that the first digit is
|
|
88
|
+
6, it is also automatically known that xx is greater than 55.
|
|
60
89
|
|
|
61
90
|
The default threshold used is the send/change difficulty. Any other threshold
|
|
62
91
|
can be specified in practice. Also, NanoPow technically compares the nonce to see if it is only greater than, and not necessarily equal to, the threshold, but the difference is trivial for a range of 2⁶⁴-1 nonces.
|
|
@@ -71,7 +100,17 @@ performance out of it.
|
|
|
71
100
|
speed of this tool. Feel free to check out how your system fares.
|
|
72
101
|
|
|
73
102
|
## Building
|
|
74
|
-
|
|
103
|
+
1. Clone source
|
|
104
|
+
1. Enter the directory
|
|
105
|
+
1. Install dev dependencies
|
|
106
|
+
1. Compile, minify, and bundle
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
git clone https://zoso.dev/nano-pow.git
|
|
110
|
+
cd nano-pow
|
|
111
|
+
npm i
|
|
112
|
+
npm run build
|
|
113
|
+
```
|
|
75
114
|
|
|
76
115
|
## Donations
|
|
77
116
|
If you find this package helpful, please consider tipping the developer.
|
package/dist/global.min.js
CHANGED
|
@@ -1,16 +1,3 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __export = (target, all) => {
|
|
3
|
-
for (var name in all)
|
|
4
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
// build/main.js
|
|
8
|
-
var main_exports = {};
|
|
9
|
-
__export(main_exports, {
|
|
10
|
-
NanoPowGl: () => NanoPowGl,
|
|
11
|
-
NanoPowGpu: () => NanoPowGpu
|
|
12
|
-
});
|
|
13
|
-
|
|
14
1
|
// src/shaders/compute.wgsl
|
|
15
2
|
var compute_default = "struct UBO{blockhash:array<vec4<u32>,2>,random:vec2<u32>,threshold:u32};@group(0)@binding(0)var<uniform> ubo:UBO;struct WORK{nonce:vec2<u32>,found:atomic<u32>};@group(0)@binding(1)var<storage,read_write>work:WORK;const BLAKE2B_IV32_1:u32=0x6A09E667u;@compute @workgroup_size(256)fn main(@builtin(global_invocation_id)id:vec3<u32>){if(atomicLoad(&work.found)!=0u){return;}let threshold:u32=ubo.threshold;var m0:u32=ubo.random.x ^ id.x;var m1:u32=ubo.random.y ^ id.y;var m2:u32=ubo.blockhash[0u].x;var m3:u32=ubo.blockhash[0u].y;var m4:u32=ubo.blockhash[0u].z;var m5:u32=ubo.blockhash[0u].w;var m6:u32=ubo.blockhash[1u].x;var m7:u32=ubo.blockhash[1u].y;var m8:u32=ubo.blockhash[1u].z;var m9:u32=ubo.blockhash[1u].w;var v0:u32=0xF2BDC900u;var v1:u32=0x6A09E667u;var v2:u32=0x84CAA73Bu;var v3:u32=0xBB67AE85u;var v4:u32=0xFE94F82Bu;var v5:u32=0x3C6EF372u;var v6:u32=0x5F1D36F1u;var v7:u32=0xA54FF53Au;var v8:u32=0xADE682D1u;var v9:u32=0x510E527Fu;var v10:u32=0x2B3E6C1Fu;var v11:u32=0x9B05688Cu;var v12:u32=0xFB41BD6Bu;var v13:u32=0x1F83D9ABu;var v14:u32=0x137E2179u;var v15:u32=0x5BE0CD19u;var v16:u32=0xF3BCC908u;var v17:u32=0x6A09E667u;var v18:u32=0x84CAA73Bu;var v19:u32=0xBB67AE85u;var v20:u32=0xFE94F82Bu;var v21:u32=0x3C6EF372u;var v22:u32=0x5F1D36F1u;var v23:u32=0xA54FF53Au;var v24:u32=0xADE682F9u;var v25:u32=0x510E527Fu;var v26:u32=0x2B3E6C1Fu;var v27:u32=0x9B05688Cu;var v28:u32=0x04BE4294u;var v29:u32=0xE07C2654u;var v30:u32=0x137E2179u;var v31:u32=0x5BE0CD19u;var o0:u32;var o1:u32;var xor0:u32;var xor1:u32;o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m4;o1=v3+m5;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m8;o1=v3+m9;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m0;o1=v3+m1;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m4;o1=v3+m5;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m0;o1=v3+m1;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m4;o1=v5+m5;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m2;o1=v5+m3;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m8;o1=v7+m9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m2;o1=v3+m3;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m4;o1=v1+m5;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m0;o1=v5+m1;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m4;o1=v5+m5;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m4;o1=v1+m5;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m0;o1=v5+m1;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m8;o1=v1+m9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m2;o1=v7+m3;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m2;o1=v3+m3;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m8;o1=v7+m9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m4;o1=v5+m5;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m2;o1=v5+m3;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m8;o1=v3+m9;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m4;o1=v7+m5;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m6;o1=v5+m7;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m0;o1=v7+m1;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m4;o1=v1+m5;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m2;o1=v5+m3;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m4;o1=v1+m5;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m8;o1=v3+m9;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m2;o1=v7+m3;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m6;o1=v5+m7;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m0;o1=v7+m1;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m0;o1=v1+m1;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m4;o1=v3+m5;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m6;o1=v3+m7;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;o0=v4+m8;o1=v5+m9;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=xor1;v25=xor0;o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v0+v8;o1=v1+v9;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v24 ^ v0;xor1=v25 ^ v1;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v16+v24;o1=v17+v25;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v8 ^ v16;xor1=v9 ^ v17;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m8;o1=v3+m9;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=xor1;v27=xor0;o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v2+v10;o1=v3+v11;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v26 ^ v2;xor1=v27 ^ v3;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v18+v26;o1=v19+v27;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v10 ^ v18;xor1=v11 ^ v19;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=xor1;v29=xor0;o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v4+v12;o1=v5+v13;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v28 ^ v4;xor1=v29 ^ v5;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v20+v28;o1=v21+v29;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v12 ^ v20;xor1=v13 ^ v21;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=xor1;v31=xor0;o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v6+v14;o1=v7+v15;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v30 ^ v6;xor1=v31 ^ v7;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v22+v30;o1=v23+v31;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v14 ^ v22;xor1=v15 ^ v23;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;o0=v0+m2;o1=v1+m3;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=xor1;v31=xor0;o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor0>>24u)^(xor1<<8u);v11=(xor1>>24u)^(xor0<<8u);o0=v0+v10;o1=v1+v11;o1=o1+select(0u,1u,o0<v0);v0=o0;v1=o1;xor0=v30 ^ v0;xor1=v31 ^ v1;v30=(xor0>>16u)^(xor1<<16u);v31=(xor1>>16u)^(xor0<<16u);o0=v20+v30;o1=v21+v31;o1=o1+select(0u,1u,o0<v20);v20=o0;v21=o1;xor0=v10 ^ v20;xor1=v11 ^ v21;v10=(xor1>>31u)^(xor0<<1u);v11=(xor0>>31u)^(xor1<<1u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m0;o1=v3+m1;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=xor1;v25=xor0;o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor0>>24u)^(xor1<<8u);v13=(xor1>>24u)^(xor0<<8u);o0=v2+v12;o1=v3+v13;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;o0=v2+m4;o1=v3+m5;o1=o1+select(0u,1u,o0<v2);v2=o0;v3=o1;xor0=v24 ^ v2;xor1=v25 ^ v3;v24=(xor0>>16u)^(xor1<<16u);v25=(xor1>>16u)^(xor0<<16u);o0=v22+v24;o1=v23+v25;o1=o1+select(0u,1u,o0<v22);v22=o0;v23=o1;xor0=v12 ^ v22;xor1=v13 ^ v23;v12=(xor1>>31u)^(xor0<<1u);v13=(xor0>>31u)^(xor1<<1u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=xor1;v27=xor0;o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor0>>24u)^(xor1<<8u);v15=(xor1>>24u)^(xor0<<8u);o0=v4+v14;o1=v5+v15;o1=o1+select(0u,1u,o0<v4);v4=o0;v5=o1;xor0=v26 ^ v4;xor1=v27 ^ v5;v26=(xor0>>16u)^(xor1<<16u);v27=(xor1>>16u)^(xor0<<16u);o0=v16+v26;o1=v17+v27;o1=o1+select(0u,1u,o0<v16);v16=o0;v17=o1;xor0=v14 ^ v16;xor1=v15 ^ v17;v14=(xor1>>31u)^(xor0<<1u);v15=(xor0>>31u)^(xor1<<1u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=xor1;v29=xor0;o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor0>>24u)^(xor1<<8u);v9=(xor1>>24u)^(xor0<<8u);o0=v6+v8;o1=v7+v9;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;o0=v6+m6;o1=v7+m7;o1=o1+select(0u,1u,o0<v6);v6=o0;v7=o1;xor0=v28 ^ v6;xor1=v29 ^ v7;v28=(xor0>>16u)^(xor1<<16u);v29=(xor1>>16u)^(xor0<<16u);o0=v18+v28;o1=v19+v29;o1=o1+select(0u,1u,o0<v18);v18=o0;v19=o1;xor0=v8 ^ v18;xor1=v9 ^ v19;v8=(xor1>>31u)^(xor0<<1u);v9=(xor0>>31u)^(xor1<<1u);if((BLAKE2B_IV32_1 ^ v1 ^ v17)>threshold&&atomicLoad(&work.found)==0u){atomicStore(&work.found,1u);work.nonce.x=m0;work.nonce.y=m1;}return;}";
|
|
16
3
|
|
|
@@ -291,7 +278,8 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
291
278
|
1,
|
|
292
279
|
1
|
|
293
280
|
]);
|
|
294
|
-
|
|
281
|
+
/** Compile */
|
|
282
|
+
static async init() {
|
|
295
283
|
this.#gl = new OffscreenCanvas(this.#WORKLOAD, this.#WORKLOAD).getContext("webgl2");
|
|
296
284
|
if (this.#gl == null) throw new Error("WebGL 2 is required");
|
|
297
285
|
this.#gl.clearColor(0, 0, 0, 1);
|
|
@@ -342,43 +330,10 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
342
330
|
this.#pixels = new Uint8Array(this.#gl.drawingBufferWidth * this.#gl.drawingBufferHeight * 4);
|
|
343
331
|
this.#query = this.#gl.createQuery();
|
|
344
332
|
}
|
|
345
|
-
|
|
346
|
-
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
347
|
-
*
|
|
348
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
349
|
-
* @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
|
|
350
|
-
*/
|
|
351
|
-
static async search(hash, threshold = 4294967288) {
|
|
352
|
-
if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
|
|
353
|
-
if (!/^[A-F-a-f0-9]{64}$/.test(hash)) throw new Error(`invalid_hash ${hash}`);
|
|
354
|
-
if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
|
|
355
|
-
if (this.#gl == null) throw new Error("WebGL 2 is required");
|
|
356
|
-
const uboView = new DataView(new ArrayBuffer(144));
|
|
357
|
-
for (let i = 0; i < 64; i += 8) {
|
|
358
|
-
const uint32 = hash.slice(i, i + 8);
|
|
359
|
-
uboView.setUint32(i * 2, parseInt(uint32, 16));
|
|
360
|
-
}
|
|
361
|
-
uboView.setUint32(128, threshold, true);
|
|
362
|
-
uboView.setFloat32(132, _NanoPowGl.#WORKLOAD - 1, true);
|
|
363
|
-
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, _NanoPowGl.#uboBuffer);
|
|
364
|
-
_NanoPowGl.#gl.bufferSubData(_NanoPowGl.#gl.UNIFORM_BUFFER, 0, uboView);
|
|
365
|
-
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, null);
|
|
366
|
-
let nonce = null;
|
|
367
|
-
const work = new Uint8Array(8);
|
|
368
|
-
while (nonce == null) {
|
|
369
|
-
this.draw(work);
|
|
370
|
-
const found = await this.checkQueryResult();
|
|
371
|
-
if (found) {
|
|
372
|
-
nonce = this.readResult(work);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
return nonce;
|
|
376
|
-
}
|
|
377
|
-
static draw(work) {
|
|
333
|
+
static #draw(work) {
|
|
378
334
|
if (this.#gl == null || this.#query == null) throw new Error("WebGL 2 is required to draw and query pixels");
|
|
379
335
|
if (this.#workBuffer == null) throw new Error("Work buffer is required to draw");
|
|
380
336
|
this.#gl.clear(this.#gl.COLOR_BUFFER_BIT);
|
|
381
|
-
crypto.getRandomValues(work);
|
|
382
337
|
this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#workBuffer);
|
|
383
338
|
this.#gl.bufferSubData(this.#gl.UNIFORM_BUFFER, 0, Uint32Array.from(work));
|
|
384
339
|
this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
|
|
@@ -386,15 +341,15 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
386
341
|
this.#gl.drawArrays(this.#gl.TRIANGLES, 0, 6);
|
|
387
342
|
this.#gl.endQuery(this.#gl.ANY_SAMPLES_PASSED_CONSERVATIVE);
|
|
388
343
|
}
|
|
389
|
-
static async checkQueryResult() {
|
|
344
|
+
static async #checkQueryResult() {
|
|
390
345
|
if (this.#gl == null || this.#query == null) throw new Error("WebGL 2 is required to check query results");
|
|
391
346
|
if (this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT_AVAILABLE)) {
|
|
392
|
-
return this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT);
|
|
347
|
+
return !!this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT);
|
|
393
348
|
}
|
|
394
349
|
return new Promise((resolve, reject) => {
|
|
395
350
|
try {
|
|
396
351
|
requestAnimationFrame(async () => {
|
|
397
|
-
const result = await _NanoPowGl
|
|
352
|
+
const result = await _NanoPowGl.#checkQueryResult();
|
|
398
353
|
resolve(result);
|
|
399
354
|
});
|
|
400
355
|
} catch (err) {
|
|
@@ -410,7 +365,7 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
410
365
|
* @param work - Buffer with the original random nonce value
|
|
411
366
|
* @returns Nonce as an 8-byte (16-char) hexadecimal string
|
|
412
367
|
*/
|
|
413
|
-
static readResult(work) {
|
|
368
|
+
static #readResult(work) {
|
|
414
369
|
if (this.#gl == null) throw new Error("WebGL 2 is required to read pixels");
|
|
415
370
|
this.#gl.readPixels(0, 0, this.#gl.drawingBufferWidth, this.#gl.drawingBufferHeight, this.#gl.RGBA, this.#gl.UNSIGNED_BYTE, this.#pixels);
|
|
416
371
|
for (let i = 0; i < this.#pixels.length; i += 4) {
|
|
@@ -426,6 +381,74 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
426
381
|
}
|
|
427
382
|
throw new Error("Query reported result but nonce value not found");
|
|
428
383
|
}
|
|
384
|
+
/**
|
|
385
|
+
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
386
|
+
*
|
|
387
|
+
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
388
|
+
* @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
|
|
389
|
+
*/
|
|
390
|
+
static async search(hash, threshold = 4294967288) {
|
|
391
|
+
if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
|
|
392
|
+
if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new Error(`Invalid hash ${hash}`);
|
|
393
|
+
if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
|
|
394
|
+
if (this.#gl == null) throw new Error("WebGL 2 is required");
|
|
395
|
+
const uboView = new DataView(new ArrayBuffer(144));
|
|
396
|
+
for (let i = 0; i < 64; i += 8) {
|
|
397
|
+
const uint32 = hash.slice(i, i + 8);
|
|
398
|
+
uboView.setUint32(i * 2, parseInt(uint32, 16));
|
|
399
|
+
}
|
|
400
|
+
uboView.setUint32(128, threshold, true);
|
|
401
|
+
uboView.setFloat32(132, _NanoPowGl.#WORKLOAD - 1, true);
|
|
402
|
+
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, _NanoPowGl.#uboBuffer);
|
|
403
|
+
_NanoPowGl.#gl.bufferSubData(_NanoPowGl.#gl.UNIFORM_BUFFER, 0, uboView);
|
|
404
|
+
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, null);
|
|
405
|
+
let nonce = null;
|
|
406
|
+
const seed = new Uint8Array(8);
|
|
407
|
+
while (nonce == null) {
|
|
408
|
+
crypto.getRandomValues(seed);
|
|
409
|
+
this.#draw(seed);
|
|
410
|
+
const found = await this.#checkQueryResult();
|
|
411
|
+
if (found) {
|
|
412
|
+
nonce = this.#readResult(seed);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return nonce;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Validates that a nonce satisfies Nano proof-of-work requirements.
|
|
419
|
+
*
|
|
420
|
+
* @param {string} work - Hexadecimal proof-of-work value to validate
|
|
421
|
+
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
422
|
+
* @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
|
|
423
|
+
*/
|
|
424
|
+
static async validate(work, hash, threshold = 4294967288) {
|
|
425
|
+
if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
|
|
426
|
+
if (!/^[A-Fa-f0-9]{16}$/.test(work)) throw new Error(`Invalid work ${work}`);
|
|
427
|
+
if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new Error(`Invalid hash ${hash}`);
|
|
428
|
+
if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
|
|
429
|
+
if (this.#gl == null) throw new Error("WebGL 2 is required");
|
|
430
|
+
const uboView = new DataView(new ArrayBuffer(144));
|
|
431
|
+
for (let i = 0; i < 64; i += 8) {
|
|
432
|
+
const uint32 = hash.slice(i, i + 8);
|
|
433
|
+
uboView.setUint32(i * 2, parseInt(uint32, 16));
|
|
434
|
+
}
|
|
435
|
+
uboView.setUint32(128, threshold, true);
|
|
436
|
+
uboView.setFloat32(132, _NanoPowGl.#WORKLOAD - 1, true);
|
|
437
|
+
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, _NanoPowGl.#uboBuffer);
|
|
438
|
+
_NanoPowGl.#gl.bufferSubData(_NanoPowGl.#gl.UNIFORM_BUFFER, 0, uboView);
|
|
439
|
+
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, null);
|
|
440
|
+
let nonce = null;
|
|
441
|
+
const data = new DataView(new ArrayBuffer(8));
|
|
442
|
+
data.setBigUint64(0, BigInt(`0x${work}`), true);
|
|
443
|
+
const seed = new Uint8Array(data.buffer);
|
|
444
|
+
this.#draw(seed);
|
|
445
|
+
const found = await this.#checkQueryResult();
|
|
446
|
+
if (found) {
|
|
447
|
+
nonce = this.#readResult(seed);
|
|
448
|
+
}
|
|
449
|
+
if (found && nonce !== work) throw new Error(`Nonce found but does not match work`);
|
|
450
|
+
return found;
|
|
451
|
+
}
|
|
429
452
|
};
|
|
430
453
|
|
|
431
454
|
// src/classes/gpu.ts
|
|
@@ -438,9 +461,6 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
438
461
|
static #cpuBuffer;
|
|
439
462
|
static #bindGroupLayout;
|
|
440
463
|
static #pipeline;
|
|
441
|
-
static {
|
|
442
|
-
this.init();
|
|
443
|
-
}
|
|
444
464
|
// Initialize WebGPU
|
|
445
465
|
static async init() {
|
|
446
466
|
if (this.#busy) return;
|
|
@@ -508,6 +528,55 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
508
528
|
_NanoPowGpu.#busy = false;
|
|
509
529
|
_NanoPowGpu.init();
|
|
510
530
|
}
|
|
531
|
+
static async #dispatch(seed, hash, threshold, passes) {
|
|
532
|
+
if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
|
|
533
|
+
const uboView = new DataView(new ArrayBuffer(48));
|
|
534
|
+
for (let i = 0; i < 64; i += 8) {
|
|
535
|
+
const uint32 = hash.slice(i, i + 8);
|
|
536
|
+
uboView.setUint32(i / 2, parseInt(uint32, 16));
|
|
537
|
+
}
|
|
538
|
+
uboView.setBigUint64(32, seed, true);
|
|
539
|
+
uboView.setUint32(40, threshold, true);
|
|
540
|
+
this.#device.queue.writeBuffer(this.#uboBuffer, 0, uboView);
|
|
541
|
+
this.#device.queue.writeBuffer(this.#gpuBuffer, 0, new Uint32Array([0, 0, 0]));
|
|
542
|
+
const bindGroup = this.#device.createBindGroup({
|
|
543
|
+
layout: this.#bindGroupLayout,
|
|
544
|
+
entries: [
|
|
545
|
+
{
|
|
546
|
+
binding: 0,
|
|
547
|
+
resource: {
|
|
548
|
+
buffer: this.#uboBuffer
|
|
549
|
+
}
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
binding: 1,
|
|
553
|
+
resource: {
|
|
554
|
+
buffer: this.#gpuBuffer
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
]
|
|
558
|
+
});
|
|
559
|
+
const commandEncoder = this.#device.createCommandEncoder();
|
|
560
|
+
const passEncoder = commandEncoder.beginComputePass();
|
|
561
|
+
passEncoder.setPipeline(this.#pipeline);
|
|
562
|
+
passEncoder.setBindGroup(0, bindGroup);
|
|
563
|
+
passEncoder.dispatchWorkgroups(passes, passes);
|
|
564
|
+
passEncoder.end();
|
|
565
|
+
commandEncoder.copyBufferToBuffer(this.#gpuBuffer, 0, this.#cpuBuffer, 0, 12);
|
|
566
|
+
this.#device.queue.submit([commandEncoder.finish()]);
|
|
567
|
+
let data = null;
|
|
568
|
+
try {
|
|
569
|
+
await this.#cpuBuffer.mapAsync(GPUMapMode.READ);
|
|
570
|
+
await this.#device.queue.onSubmittedWorkDone();
|
|
571
|
+
data = new DataView(this.#cpuBuffer.getMappedRange().slice(0));
|
|
572
|
+
this.#cpuBuffer.unmap();
|
|
573
|
+
} catch (err) {
|
|
574
|
+
console.warn(`Error getting data from GPU. ${err}`);
|
|
575
|
+
return this.#dispatch(seed, hash, threshold, passes);
|
|
576
|
+
}
|
|
577
|
+
if (data == null) throw new Error(`Failed to get data from buffer.`);
|
|
578
|
+
return data;
|
|
579
|
+
}
|
|
511
580
|
/**
|
|
512
581
|
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
513
582
|
*
|
|
@@ -578,56 +647,28 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
578
647
|
if (found && work !== nonce) throw new Error(`Nonce found but does not match work`);
|
|
579
648
|
return found;
|
|
580
649
|
}
|
|
581
|
-
static async #dispatch(seed, hash, threshold, passes) {
|
|
582
|
-
if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
|
|
583
|
-
const uboView = new DataView(new ArrayBuffer(48));
|
|
584
|
-
for (let i = 0; i < 64; i += 8) {
|
|
585
|
-
const uint32 = hash.slice(i, i + 8);
|
|
586
|
-
uboView.setUint32(i / 2, parseInt(uint32, 16));
|
|
587
|
-
}
|
|
588
|
-
uboView.setBigUint64(32, seed, true);
|
|
589
|
-
uboView.setUint32(40, threshold, true);
|
|
590
|
-
this.#device.queue.writeBuffer(this.#uboBuffer, 0, uboView);
|
|
591
|
-
this.#device.queue.writeBuffer(this.#gpuBuffer, 0, new Uint32Array([0, 0, 0]));
|
|
592
|
-
const bindGroup = this.#device.createBindGroup({
|
|
593
|
-
layout: this.#bindGroupLayout,
|
|
594
|
-
entries: [
|
|
595
|
-
{
|
|
596
|
-
binding: 0,
|
|
597
|
-
resource: {
|
|
598
|
-
buffer: this.#uboBuffer
|
|
599
|
-
}
|
|
600
|
-
},
|
|
601
|
-
{
|
|
602
|
-
binding: 1,
|
|
603
|
-
resource: {
|
|
604
|
-
buffer: this.#gpuBuffer
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
]
|
|
608
|
-
});
|
|
609
|
-
const commandEncoder = this.#device.createCommandEncoder();
|
|
610
|
-
const passEncoder = commandEncoder.beginComputePass();
|
|
611
|
-
passEncoder.setPipeline(this.#pipeline);
|
|
612
|
-
passEncoder.setBindGroup(0, bindGroup);
|
|
613
|
-
passEncoder.dispatchWorkgroups(passes, passes);
|
|
614
|
-
passEncoder.end();
|
|
615
|
-
commandEncoder.copyBufferToBuffer(this.#gpuBuffer, 0, this.#cpuBuffer, 0, 12);
|
|
616
|
-
this.#device.queue.submit([commandEncoder.finish()]);
|
|
617
|
-
let data = null;
|
|
618
|
-
try {
|
|
619
|
-
await this.#cpuBuffer.mapAsync(GPUMapMode.READ);
|
|
620
|
-
await this.#device.queue.onSubmittedWorkDone();
|
|
621
|
-
data = new DataView(this.#cpuBuffer.getMappedRange().slice(0));
|
|
622
|
-
this.#cpuBuffer.unmap();
|
|
623
|
-
} catch (err) {
|
|
624
|
-
console.warn(`Error getting data from GPU. ${err}`);
|
|
625
|
-
return this.#dispatch(seed, hash, threshold, passes);
|
|
626
|
-
}
|
|
627
|
-
if (data == null) throw new Error(`Failed to get data from buffer.`);
|
|
628
|
-
return data;
|
|
629
|
-
}
|
|
630
650
|
};
|
|
631
651
|
|
|
652
|
+
// src/classes/index.ts
|
|
653
|
+
var isGlSupported;
|
|
654
|
+
var isGpuSupported = false;
|
|
655
|
+
try {
|
|
656
|
+
await NanoPowGl.init();
|
|
657
|
+
isGlSupported = true;
|
|
658
|
+
} catch (err) {
|
|
659
|
+
console.warn(`WebGL is not supported in this environment.`);
|
|
660
|
+
isGlSupported = false;
|
|
661
|
+
}
|
|
662
|
+
try {
|
|
663
|
+
await NanoPowGpu.init();
|
|
664
|
+
isGpuSupported = true;
|
|
665
|
+
} catch (err) {
|
|
666
|
+
console.warn(`WebGPU is not supported in this environment.`);
|
|
667
|
+
isGpuSupported = false;
|
|
668
|
+
}
|
|
669
|
+
var NanoPow = isGpuSupported ? NanoPowGpu : isGlSupported ? NanoPowGl : null;
|
|
670
|
+
|
|
632
671
|
// build/global.js
|
|
633
|
-
globalThis.NanoPow ??=
|
|
672
|
+
globalThis.NanoPow ??= NanoPow;
|
|
673
|
+
globalThis.NanoPowGl ??= NanoPowGl;
|
|
674
|
+
globalThis.NanoPowGpu ??= NanoPowGpu;
|
package/dist/main.min.js
CHANGED
|
@@ -278,7 +278,8 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
278
278
|
1,
|
|
279
279
|
1
|
|
280
280
|
]);
|
|
281
|
-
|
|
281
|
+
/** Compile */
|
|
282
|
+
static async init() {
|
|
282
283
|
this.#gl = new OffscreenCanvas(this.#WORKLOAD, this.#WORKLOAD).getContext("webgl2");
|
|
283
284
|
if (this.#gl == null) throw new Error("WebGL 2 is required");
|
|
284
285
|
this.#gl.clearColor(0, 0, 0, 1);
|
|
@@ -329,43 +330,10 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
329
330
|
this.#pixels = new Uint8Array(this.#gl.drawingBufferWidth * this.#gl.drawingBufferHeight * 4);
|
|
330
331
|
this.#query = this.#gl.createQuery();
|
|
331
332
|
}
|
|
332
|
-
|
|
333
|
-
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
334
|
-
*
|
|
335
|
-
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
336
|
-
* @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
|
|
337
|
-
*/
|
|
338
|
-
static async search(hash, threshold = 4294967288) {
|
|
339
|
-
if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
|
|
340
|
-
if (!/^[A-F-a-f0-9]{64}$/.test(hash)) throw new Error(`invalid_hash ${hash}`);
|
|
341
|
-
if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
|
|
342
|
-
if (this.#gl == null) throw new Error("WebGL 2 is required");
|
|
343
|
-
const uboView = new DataView(new ArrayBuffer(144));
|
|
344
|
-
for (let i = 0; i < 64; i += 8) {
|
|
345
|
-
const uint32 = hash.slice(i, i + 8);
|
|
346
|
-
uboView.setUint32(i * 2, parseInt(uint32, 16));
|
|
347
|
-
}
|
|
348
|
-
uboView.setUint32(128, threshold, true);
|
|
349
|
-
uboView.setFloat32(132, _NanoPowGl.#WORKLOAD - 1, true);
|
|
350
|
-
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, _NanoPowGl.#uboBuffer);
|
|
351
|
-
_NanoPowGl.#gl.bufferSubData(_NanoPowGl.#gl.UNIFORM_BUFFER, 0, uboView);
|
|
352
|
-
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, null);
|
|
353
|
-
let nonce = null;
|
|
354
|
-
const work = new Uint8Array(8);
|
|
355
|
-
while (nonce == null) {
|
|
356
|
-
this.draw(work);
|
|
357
|
-
const found = await this.checkQueryResult();
|
|
358
|
-
if (found) {
|
|
359
|
-
nonce = this.readResult(work);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
return nonce;
|
|
363
|
-
}
|
|
364
|
-
static draw(work) {
|
|
333
|
+
static #draw(work) {
|
|
365
334
|
if (this.#gl == null || this.#query == null) throw new Error("WebGL 2 is required to draw and query pixels");
|
|
366
335
|
if (this.#workBuffer == null) throw new Error("Work buffer is required to draw");
|
|
367
336
|
this.#gl.clear(this.#gl.COLOR_BUFFER_BIT);
|
|
368
|
-
crypto.getRandomValues(work);
|
|
369
337
|
this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#workBuffer);
|
|
370
338
|
this.#gl.bufferSubData(this.#gl.UNIFORM_BUFFER, 0, Uint32Array.from(work));
|
|
371
339
|
this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
|
|
@@ -373,15 +341,15 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
373
341
|
this.#gl.drawArrays(this.#gl.TRIANGLES, 0, 6);
|
|
374
342
|
this.#gl.endQuery(this.#gl.ANY_SAMPLES_PASSED_CONSERVATIVE);
|
|
375
343
|
}
|
|
376
|
-
static async checkQueryResult() {
|
|
344
|
+
static async #checkQueryResult() {
|
|
377
345
|
if (this.#gl == null || this.#query == null) throw new Error("WebGL 2 is required to check query results");
|
|
378
346
|
if (this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT_AVAILABLE)) {
|
|
379
|
-
return this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT);
|
|
347
|
+
return !!this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT);
|
|
380
348
|
}
|
|
381
349
|
return new Promise((resolve, reject) => {
|
|
382
350
|
try {
|
|
383
351
|
requestAnimationFrame(async () => {
|
|
384
|
-
const result = await _NanoPowGl
|
|
352
|
+
const result = await _NanoPowGl.#checkQueryResult();
|
|
385
353
|
resolve(result);
|
|
386
354
|
});
|
|
387
355
|
} catch (err) {
|
|
@@ -397,7 +365,7 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
397
365
|
* @param work - Buffer with the original random nonce value
|
|
398
366
|
* @returns Nonce as an 8-byte (16-char) hexadecimal string
|
|
399
367
|
*/
|
|
400
|
-
static readResult(work) {
|
|
368
|
+
static #readResult(work) {
|
|
401
369
|
if (this.#gl == null) throw new Error("WebGL 2 is required to read pixels");
|
|
402
370
|
this.#gl.readPixels(0, 0, this.#gl.drawingBufferWidth, this.#gl.drawingBufferHeight, this.#gl.RGBA, this.#gl.UNSIGNED_BYTE, this.#pixels);
|
|
403
371
|
for (let i = 0; i < this.#pixels.length; i += 4) {
|
|
@@ -413,6 +381,74 @@ var NanoPowGl = class _NanoPowGl {
|
|
|
413
381
|
}
|
|
414
382
|
throw new Error("Query reported result but nonce value not found");
|
|
415
383
|
}
|
|
384
|
+
/**
|
|
385
|
+
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
386
|
+
*
|
|
387
|
+
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
388
|
+
* @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
|
|
389
|
+
*/
|
|
390
|
+
static async search(hash, threshold = 4294967288) {
|
|
391
|
+
if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
|
|
392
|
+
if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new Error(`Invalid hash ${hash}`);
|
|
393
|
+
if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
|
|
394
|
+
if (this.#gl == null) throw new Error("WebGL 2 is required");
|
|
395
|
+
const uboView = new DataView(new ArrayBuffer(144));
|
|
396
|
+
for (let i = 0; i < 64; i += 8) {
|
|
397
|
+
const uint32 = hash.slice(i, i + 8);
|
|
398
|
+
uboView.setUint32(i * 2, parseInt(uint32, 16));
|
|
399
|
+
}
|
|
400
|
+
uboView.setUint32(128, threshold, true);
|
|
401
|
+
uboView.setFloat32(132, _NanoPowGl.#WORKLOAD - 1, true);
|
|
402
|
+
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, _NanoPowGl.#uboBuffer);
|
|
403
|
+
_NanoPowGl.#gl.bufferSubData(_NanoPowGl.#gl.UNIFORM_BUFFER, 0, uboView);
|
|
404
|
+
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, null);
|
|
405
|
+
let nonce = null;
|
|
406
|
+
const seed = new Uint8Array(8);
|
|
407
|
+
while (nonce == null) {
|
|
408
|
+
crypto.getRandomValues(seed);
|
|
409
|
+
this.#draw(seed);
|
|
410
|
+
const found = await this.#checkQueryResult();
|
|
411
|
+
if (found) {
|
|
412
|
+
nonce = this.#readResult(seed);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return nonce;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Validates that a nonce satisfies Nano proof-of-work requirements.
|
|
419
|
+
*
|
|
420
|
+
* @param {string} work - Hexadecimal proof-of-work value to validate
|
|
421
|
+
* @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
|
|
422
|
+
* @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
|
|
423
|
+
*/
|
|
424
|
+
static async validate(work, hash, threshold = 4294967288) {
|
|
425
|
+
if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
|
|
426
|
+
if (!/^[A-Fa-f0-9]{16}$/.test(work)) throw new Error(`Invalid work ${work}`);
|
|
427
|
+
if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new Error(`Invalid hash ${hash}`);
|
|
428
|
+
if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
|
|
429
|
+
if (this.#gl == null) throw new Error("WebGL 2 is required");
|
|
430
|
+
const uboView = new DataView(new ArrayBuffer(144));
|
|
431
|
+
for (let i = 0; i < 64; i += 8) {
|
|
432
|
+
const uint32 = hash.slice(i, i + 8);
|
|
433
|
+
uboView.setUint32(i * 2, parseInt(uint32, 16));
|
|
434
|
+
}
|
|
435
|
+
uboView.setUint32(128, threshold, true);
|
|
436
|
+
uboView.setFloat32(132, _NanoPowGl.#WORKLOAD - 1, true);
|
|
437
|
+
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, _NanoPowGl.#uboBuffer);
|
|
438
|
+
_NanoPowGl.#gl.bufferSubData(_NanoPowGl.#gl.UNIFORM_BUFFER, 0, uboView);
|
|
439
|
+
_NanoPowGl.#gl.bindBuffer(_NanoPowGl.#gl.UNIFORM_BUFFER, null);
|
|
440
|
+
let nonce = null;
|
|
441
|
+
const data = new DataView(new ArrayBuffer(8));
|
|
442
|
+
data.setBigUint64(0, BigInt(`0x${work}`), true);
|
|
443
|
+
const seed = new Uint8Array(data.buffer);
|
|
444
|
+
this.#draw(seed);
|
|
445
|
+
const found = await this.#checkQueryResult();
|
|
446
|
+
if (found) {
|
|
447
|
+
nonce = this.#readResult(seed);
|
|
448
|
+
}
|
|
449
|
+
if (found && nonce !== work) throw new Error(`Nonce found but does not match work`);
|
|
450
|
+
return found;
|
|
451
|
+
}
|
|
416
452
|
};
|
|
417
453
|
|
|
418
454
|
// src/classes/gpu.ts
|
|
@@ -425,9 +461,6 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
425
461
|
static #cpuBuffer;
|
|
426
462
|
static #bindGroupLayout;
|
|
427
463
|
static #pipeline;
|
|
428
|
-
static {
|
|
429
|
-
this.init();
|
|
430
|
-
}
|
|
431
464
|
// Initialize WebGPU
|
|
432
465
|
static async init() {
|
|
433
466
|
if (this.#busy) return;
|
|
@@ -495,6 +528,55 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
495
528
|
_NanoPowGpu.#busy = false;
|
|
496
529
|
_NanoPowGpu.init();
|
|
497
530
|
}
|
|
531
|
+
static async #dispatch(seed, hash, threshold, passes) {
|
|
532
|
+
if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
|
|
533
|
+
const uboView = new DataView(new ArrayBuffer(48));
|
|
534
|
+
for (let i = 0; i < 64; i += 8) {
|
|
535
|
+
const uint32 = hash.slice(i, i + 8);
|
|
536
|
+
uboView.setUint32(i / 2, parseInt(uint32, 16));
|
|
537
|
+
}
|
|
538
|
+
uboView.setBigUint64(32, seed, true);
|
|
539
|
+
uboView.setUint32(40, threshold, true);
|
|
540
|
+
this.#device.queue.writeBuffer(this.#uboBuffer, 0, uboView);
|
|
541
|
+
this.#device.queue.writeBuffer(this.#gpuBuffer, 0, new Uint32Array([0, 0, 0]));
|
|
542
|
+
const bindGroup = this.#device.createBindGroup({
|
|
543
|
+
layout: this.#bindGroupLayout,
|
|
544
|
+
entries: [
|
|
545
|
+
{
|
|
546
|
+
binding: 0,
|
|
547
|
+
resource: {
|
|
548
|
+
buffer: this.#uboBuffer
|
|
549
|
+
}
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
binding: 1,
|
|
553
|
+
resource: {
|
|
554
|
+
buffer: this.#gpuBuffer
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
]
|
|
558
|
+
});
|
|
559
|
+
const commandEncoder = this.#device.createCommandEncoder();
|
|
560
|
+
const passEncoder = commandEncoder.beginComputePass();
|
|
561
|
+
passEncoder.setPipeline(this.#pipeline);
|
|
562
|
+
passEncoder.setBindGroup(0, bindGroup);
|
|
563
|
+
passEncoder.dispatchWorkgroups(passes, passes);
|
|
564
|
+
passEncoder.end();
|
|
565
|
+
commandEncoder.copyBufferToBuffer(this.#gpuBuffer, 0, this.#cpuBuffer, 0, 12);
|
|
566
|
+
this.#device.queue.submit([commandEncoder.finish()]);
|
|
567
|
+
let data = null;
|
|
568
|
+
try {
|
|
569
|
+
await this.#cpuBuffer.mapAsync(GPUMapMode.READ);
|
|
570
|
+
await this.#device.queue.onSubmittedWorkDone();
|
|
571
|
+
data = new DataView(this.#cpuBuffer.getMappedRange().slice(0));
|
|
572
|
+
this.#cpuBuffer.unmap();
|
|
573
|
+
} catch (err) {
|
|
574
|
+
console.warn(`Error getting data from GPU. ${err}`);
|
|
575
|
+
return this.#dispatch(seed, hash, threshold, passes);
|
|
576
|
+
}
|
|
577
|
+
if (data == null) throw new Error(`Failed to get data from buffer.`);
|
|
578
|
+
return data;
|
|
579
|
+
}
|
|
498
580
|
/**
|
|
499
581
|
* Finds a nonce that satisfies the Nano proof-of-work requirements.
|
|
500
582
|
*
|
|
@@ -565,57 +647,32 @@ var NanoPowGpu = class _NanoPowGpu {
|
|
|
565
647
|
if (found && work !== nonce) throw new Error(`Nonce found but does not match work`);
|
|
566
648
|
return found;
|
|
567
649
|
}
|
|
568
|
-
static async #dispatch(seed, hash, threshold, passes) {
|
|
569
|
-
if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
|
|
570
|
-
const uboView = new DataView(new ArrayBuffer(48));
|
|
571
|
-
for (let i = 0; i < 64; i += 8) {
|
|
572
|
-
const uint32 = hash.slice(i, i + 8);
|
|
573
|
-
uboView.setUint32(i / 2, parseInt(uint32, 16));
|
|
574
|
-
}
|
|
575
|
-
uboView.setBigUint64(32, seed, true);
|
|
576
|
-
uboView.setUint32(40, threshold, true);
|
|
577
|
-
this.#device.queue.writeBuffer(this.#uboBuffer, 0, uboView);
|
|
578
|
-
this.#device.queue.writeBuffer(this.#gpuBuffer, 0, new Uint32Array([0, 0, 0]));
|
|
579
|
-
const bindGroup = this.#device.createBindGroup({
|
|
580
|
-
layout: this.#bindGroupLayout,
|
|
581
|
-
entries: [
|
|
582
|
-
{
|
|
583
|
-
binding: 0,
|
|
584
|
-
resource: {
|
|
585
|
-
buffer: this.#uboBuffer
|
|
586
|
-
}
|
|
587
|
-
},
|
|
588
|
-
{
|
|
589
|
-
binding: 1,
|
|
590
|
-
resource: {
|
|
591
|
-
buffer: this.#gpuBuffer
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
]
|
|
595
|
-
});
|
|
596
|
-
const commandEncoder = this.#device.createCommandEncoder();
|
|
597
|
-
const passEncoder = commandEncoder.beginComputePass();
|
|
598
|
-
passEncoder.setPipeline(this.#pipeline);
|
|
599
|
-
passEncoder.setBindGroup(0, bindGroup);
|
|
600
|
-
passEncoder.dispatchWorkgroups(passes, passes);
|
|
601
|
-
passEncoder.end();
|
|
602
|
-
commandEncoder.copyBufferToBuffer(this.#gpuBuffer, 0, this.#cpuBuffer, 0, 12);
|
|
603
|
-
this.#device.queue.submit([commandEncoder.finish()]);
|
|
604
|
-
let data = null;
|
|
605
|
-
try {
|
|
606
|
-
await this.#cpuBuffer.mapAsync(GPUMapMode.READ);
|
|
607
|
-
await this.#device.queue.onSubmittedWorkDone();
|
|
608
|
-
data = new DataView(this.#cpuBuffer.getMappedRange().slice(0));
|
|
609
|
-
this.#cpuBuffer.unmap();
|
|
610
|
-
} catch (err) {
|
|
611
|
-
console.warn(`Error getting data from GPU. ${err}`);
|
|
612
|
-
return this.#dispatch(seed, hash, threshold, passes);
|
|
613
|
-
}
|
|
614
|
-
if (data == null) throw new Error(`Failed to get data from buffer.`);
|
|
615
|
-
return data;
|
|
616
|
-
}
|
|
617
650
|
};
|
|
651
|
+
|
|
652
|
+
// src/classes/index.ts
|
|
653
|
+
var isGlSupported;
|
|
654
|
+
var isGpuSupported = false;
|
|
655
|
+
try {
|
|
656
|
+
await NanoPowGl.init();
|
|
657
|
+
isGlSupported = true;
|
|
658
|
+
} catch (err) {
|
|
659
|
+
console.warn(`WebGL is not supported in this environment.`);
|
|
660
|
+
isGlSupported = false;
|
|
661
|
+
}
|
|
662
|
+
try {
|
|
663
|
+
await NanoPowGpu.init();
|
|
664
|
+
isGpuSupported = true;
|
|
665
|
+
} catch (err) {
|
|
666
|
+
console.warn(`WebGPU is not supported in this environment.`);
|
|
667
|
+
isGpuSupported = false;
|
|
668
|
+
}
|
|
669
|
+
var NanoPow = isGpuSupported ? NanoPowGpu : isGlSupported ? NanoPowGl : null;
|
|
670
|
+
|
|
671
|
+
// build/main.js
|
|
672
|
+
var main_default = NanoPow;
|
|
618
673
|
export {
|
|
674
|
+
NanoPow,
|
|
619
675
|
NanoPowGl,
|
|
620
|
-
NanoPowGpu
|
|
676
|
+
NanoPowGpu,
|
|
677
|
+
main_default as default
|
|
621
678
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nano-pow",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Proof-of-work generation and validation with WebGPU/WebGL for Nano cryptocurrency.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nemo",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"AUTHORS.md",
|
|
31
31
|
"package.json.license"
|
|
32
32
|
],
|
|
33
|
-
"main": "dist/main.js",
|
|
33
|
+
"main": "dist/main.min.js",
|
|
34
34
|
"browser": {
|
|
35
35
|
"dist/main.min.js": true,
|
|
36
36
|
"node:worker_threads": false
|