nano-pow 1.2.4 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.min.js CHANGED
@@ -1,36 +1,77 @@
1
1
  // src/shaders/compute.wgsl
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;}";
2
+ var compute_default = "struct UBO{blockhash:array<vec4<u32>,2>,seed: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_IV_0=vec2(0xF2BDC900u,0x6A09E667u);const Z=vec2(0u);const CARRY=vec4(1u,0u,1u,0u);const ROTATE_1=vec4(1u);const ROTATE_8=vec4(8u);const ROTATE_16=vec4(16u);const ROTATE_24=vec4(24u);const ROTATE_31=vec4(31u);var<workgroup> found:bool;@compute @workgroup_size(32)fn search(@builtin(global_invocation_id)global_id:vec3<u32>,@builtin(local_invocation_id)local_id:vec3<u32>){found=(local_id.x==0u&&atomicLoad(&work.found)!=0u);workgroupBarrier();if(found){return;}main(global_id);}@compute @workgroup_size(1)fn validate(@builtin(global_invocation_id)global_id:vec3<u32>){main(global_id);}fn main(id:vec3<u32>){let m0:vec2<u32>=ubo.seed ^ id.xy;let m1:vec2<u32>=ubo.blockhash[0u].xy;let m2:vec2<u32>=ubo.blockhash[0u].zw;let m3:vec2<u32>=ubo.blockhash[1u].xy;let m4:vec2<u32>=ubo.blockhash[1u].zw;var v01:vec4<u32>=vec4(BLAKE2B_IV_0,0x84CAA73Bu,0xBB67AE85u);var v23:vec4<u32>=vec4(0xFE94F82Bu,0x3C6EF372u,0x5F1D36F1u,0xA54FF53Au);var v45:vec4<u32>=vec4(0xADE682D1u,0x510E527Fu,0x2B3E6C1Fu,0x9B05688Cu);var v67:vec4<u32>=vec4(0xFB41BD6Bu,0x1F83D9ABu,0x137E2179u,0x5BE0CD19u);var v89:vec4<u32>=vec4(0xF3BCC908u,0x6A09E667u,0x84CAA73Bu,0xBB67AE85u);var vAB:vec4<u32>=vec4(0xFE94F82Bu,0x3C6EF372u,0x5F1D36F1u,0xA54FF53Au);var vCD:vec4<u32>=vec4(0xADE682F9u,0x510E527Fu,0x2B3E6C1Fu,0x9B05688Cu);var vEF:vec4<u32>=vec4(0x04BE4294u,0xE07C2654u,0x137E2179u,0x5BE0CD19u);var v56:vec4<u32>;var vFC:vec4<u32>;var v74:vec4<u32>;var vDE:vec4<u32>;var s0:vec4<u32>;var s1:vec4<u32>;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m0,m2);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;v23+=vec4(m4,Z);v23.y+=u32(v23.x<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m3);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m4);v01.w+=u32(v01.z<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m0);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m2);v01.w+=u32(v01.z<m2.x);v23+=vec4(Z,m3);v23.w+=u32(v23.z<m3.x);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(Z,m0);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+vec4(m2,Z);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01.z+=m3.x;v01.w+=m3.y+u32(v01.z<m3.x);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m1,m4)+vec4(0u,u32(v23.x+vec4(m1,m4).x<v23.x),0u,u32(v23.z+vec4(m1,m4).z<v23.z));vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m3)+vec4(Z,0u,u32(v01.z+vec4(Z,m3).z<v01.z));vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m1)+vec4(Z,0u,u32(v01.z+vec4(Z,m1).z<v01.z));vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m2,Z)+vec4(0u,u32(v01.x+vec4(m2,Z).x<v01.x),Z);v23+=vec4(m4,Z)+vec4(0u,u32(v23.x+vec4(m4,Z).x<v23.x),Z);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m0,Z)+vec4(0u,u32(v23.x+vec4(m0,Z).x<v23.x),Z);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(m2,Z);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m0,Z)+vec4(0u,u32(v01.x+vec4(m0,Z).x<v01.x),Z);v23+=vec4(m4,Z)+vec4(0u,u32(v23.x+vec4(m4,Z).x<v23.x),Z);vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(Z,m3);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m1,Z)+vec4(0u,u32(v01.x+vec4(m1,Z).x<v01.x),Z);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m2,Z)+vec4(0u,u32(v01.x+vec4(m2,Z).x<v01.x),Z);v23+=vec4(m0,Z)+vec4(0u,u32(v23.x+vec4(m0,Z).x<v23.x),Z);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(Z,m3);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m4,Z)+vec4(0u,u32(v01.x+vec4(m4,Z).x<v01.x),Z);v23+=vec4(Z,m1)+vec4(Z,0u,u32(v23.z+vec4(Z,m1).z<v23.z));vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m1)+vec4(Z,0u,u32(v01.z+vec4(Z,m1).z<v01.z));v23+=vec4(Z,m4)+vec4(Z,0u,u32(v23.z+vec4(Z,m4).z<v23.z));vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m0,Z)+vec4(0u,u32(v01.x+vec4(m0,Z).x<v01.x),Z);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m3)+vec4(Z,0u,u32(v01.z+vec4(Z,m3).z<v01.z));s1=v23+vec4(m2,Z);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s1=v23+vec4(Z,m3);v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m1,Z)+vec4(0u,u32(v23.x+vec4(m1,Z).x<v23.x),Z);vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m2)+vec4(Z,0u,u32(v23.z+vec4(Z,m2).z<v23.z));vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m0,m4)+vec4(0u,u32(v01.x+vec4(m0,m4).x<v01.x),0u,u32(v01.z+vec4(m0,m4).z<v01.z));vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m0);v23.w+=u32(v23.z<m0.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m3,Z)+vec4(0u,u32(v23.x+vec4(m3,Z).x<v23.x),Z);vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m1,Z)+vec4(0u,u32(v23.x+vec4(m1,Z).x<v23.x),Z);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(m2,Z)+vec4(0u,u32(v01.x+vec4(m2,Z).x<v01.x),Z);v23+=vec4(m4,Z)+vec4(0u,u32(v23.x+vec4(m4,Z).x<v23.x),Z);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m1);v23.w+=u32(v23.z<m1.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m2,m4);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(m3,Z);v23.y+=u32(v23.x<m3.x);vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v23+=vec4(Z,m0);v23.w+=u32(v23.z<m0.x);vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m0,m2);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;v23+=vec4(m4,Z);v23.y+=u32(v23.x<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m3);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vFC ^=v01;vFC=(vFC>>ROTATE_16)|(vFC<<ROTATE_16).yxwz;vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_31).yxwz|(v56<<ROTATE_1);v74 ^=v89;v74=(v74>>ROTATE_31).yxwz|(v74<<ROTATE_1);v45=vec4(v74.zw,v56.xy);v67=vec4(v56.zw,v74.xy);vCD=vec4(vFC.zw,vDE.xy);vEF=vec4(vDE.zw,vFC.xy);s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m4);v01.w+=u32(v01.z<m4.x);vCD=(vCD ^ v01).yxwz;vEF=(vEF ^ v23).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_24)|(v45<<ROTATE_8).yxwz;v67 ^=vAB;v67=(v67>>ROTATE_24)|(v67<<ROTATE_8).yxwz;s0=v01+v45;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v67;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;vCD ^=v01;vCD=(vCD>>ROTATE_16)|(vCD<<ROTATE_16).yxwz;vEF ^=v23;vEF=(vEF>>ROTATE_16)|(vEF<<ROTATE_16).yxwz;s0=v89+vCD;v89=s0+(vec4<u32>(s0<v89)&CARRY).yxwz;s1=vAB+vEF;vAB=s1+(vec4<u32>(s1<vAB)&CARRY).yxwz;v45 ^=v89;v45=(v45>>ROTATE_31).yxwz|(v45<<ROTATE_1);v67 ^=vAB;v67=(v67>>ROTATE_31).yxwz|(v67<<ROTATE_1);v56=vec4(v45.zw,v67.xy);v74=vec4(v67.zw,v45.xy);vFC=vec4(vEF.zw,vCD.xy);vDE=vec4(vCD.zw,vEF.xy);s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;s0=v01+vec4(m1,m0);v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;vFC=(vFC ^ v01).yxwz;vDE=(vDE ^ v23).yxwz;s0=vAB+vFC;vAB=s0+(vec4<u32>(s0<vAB)&CARRY).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89)&CARRY).yxwz;v56 ^=vAB;v56=(v56>>ROTATE_24)|(v56<<ROTATE_8).yxwz;v74 ^=v89;v74=(v74>>ROTATE_24)|(v74<<ROTATE_8).yxwz;s0=v01+v56;v01=s0+(vec4<u32>(s0<v01)&CARRY).yxwz;s1=v23+v74;v23=s1+(vec4<u32>(s1<v23)&CARRY).yxwz;v01+=vec4(Z,m2);v01.w+=u32(v01.z<m2.x);v23+=vec4(Z,m3);v23.w+=u32(v23.z<m3.x);vDE ^=v23;vDE=(vDE>>ROTATE_16)|(vDE<<ROTATE_16).yxwz;s1=v89+vDE;v89=s1+(vec4<u32>(s1<v89).yxwz&CARRY);if((BLAKE2B_IV_0.y ^ v01.y ^ v89.y)>ubo.threshold&&atomicLoad(&work.found)==0u){atomicStore(&work.found,1u);work.nonce=m0;}return;}";
3
3
 
4
- // src/shaders/gl-fragment.ts
5
- var NanoPowGlFragmentShader = `#version 300 es
4
+ // src/shaders/gl-downsample.ts
5
+ var NanoPowGlDownsampleShader = `#version 300 es
6
6
  #pragma vscode_glsllint_stage: frag
7
+ #ifdef GL_FRAGMENT_PRECISION_HIGH
7
8
  precision highp float;
9
+ #else
10
+ precision mediump float;
11
+ #endif
8
12
  precision highp int;
9
13
 
10
- in vec2 uv_pos;
11
- out vec4 fragColor;
14
+ out uvec4 nonce;
12
15
 
13
- // blockhash - array of precalculated block hash components
16
+ // source texture to be downsampled
17
+ uniform highp usampler2D src;
18
+
19
+ void main() {
20
+ nonce = uvec4(0u);
21
+ vec2 inputSize = vec2(textureSize(src, 0));
22
+ vec2 texel = vec2(1.0) / inputSize;
23
+ vec2 blockCoord = (floor(gl_FragCoord.xy) * 2.0 + vec2(0.5)) / inputSize;
24
+
25
+ uvec4 pixel = texture(src, blockCoord);
26
+ nonce = pixel.x == 0u ? nonce : pixel;
27
+
28
+ pixel = texture(src, blockCoord + vec2(texel.x, 0.0));
29
+ nonce = pixel.x == 0u ? nonce : pixel;
30
+
31
+ pixel = texture(src, blockCoord + vec2(0.0, texel.y));
32
+ nonce = pixel.x == 0u ? nonce : pixel;
33
+
34
+ pixel = texture(src, blockCoord + vec2(texel.x, texel.y));
35
+ nonce = pixel.x == 0u ? nonce : pixel;
36
+ }
37
+ `;
38
+
39
+ // src/shaders/gl-draw.ts
40
+ var NanoPowGlDrawShader = `#version 300 es
41
+ #pragma vscode_glsllint_stage: frag
42
+ #ifdef GL_FRAGMENT_PRECISION_HIGH
43
+ precision highp float;
44
+ #else
45
+ precision mediump float;
46
+ #endif
47
+
48
+ out uvec4 nonce;
49
+
50
+ // blockhash - Array of precalculated block hash components
14
51
  // threshold - 0xfffffff8 for send/change blocks, 0xfffffe00 for all else
15
- // workload - Defines canvas size
52
+ // search - Checks all pixels if true, else only checks 1 pixel to validate
16
53
  layout(std140) uniform UBO {
17
54
  uint blockhash[8];
18
55
  uint threshold;
19
- float workload;
56
+ bool search;
20
57
  };
21
58
 
22
- // Random work values
23
- // First 2 bytes will be overwritten by texture pixel position
24
- // Second 2 bytes will be modified if the canvas size is greater than 256x256
25
- // Last 4 bytes remain as generated externally
59
+ // Random work seed values
26
60
  layout(std140) uniform WORK {
27
- uvec4 work[2];
61
+ uvec2 seed;
28
62
  };
29
63
 
30
- // Defined separately from uint v[32] below as the original value is required
64
+ // Defined separately from uint v[0].y below as the original value is required
31
65
  // to calculate the second uint32 of the digest for threshold comparison
32
66
  const uint BLAKE2B_IV32_1 = 0x6A09E667u;
33
67
 
68
+ // Used during G for vector bit rotations
69
+ const uvec4 ROTATE_1 = uvec4(1u);
70
+ const uvec4 ROTATE_8 = uvec4(8u);
71
+ const uvec4 ROTATE_16 = uvec4(16u);
72
+ const uvec4 ROTATE_24 = uvec4(24u);
73
+ const uvec4 ROTATE_31 = uvec4(31u);
74
+
34
75
  // Both buffers represent 16 uint64s as 32 uint32s
35
76
  // because that's what GLSL offers, just like Javascript
36
77
 
@@ -39,168 +80,165 @@ const uint BLAKE2B_IV32_1 = 0x6A09E667u;
39
80
  // OUTLEN is constant 8 bytes
40
81
  // v[0] ^= 0x01010000u ^ uint(OUTLEN);
41
82
  // INLEN is constant 40 bytes: work value (8) + block hash (32)
42
- // v[24] ^= uint(INLEN);
83
+ // v[12] ^= uint(INLEN);
43
84
  // It's always the "last" compression at this INLEN
44
- // v[28] = ~v[28];
45
- // v[29] = ~v[29];
46
- uint v[32] = uint[32](
47
- 0xF2BDC900u, 0x6A09E667u, 0x84CAA73Bu, 0xBB67AE85u,
48
- 0xFE94F82Bu, 0x3C6EF372u, 0x5F1D36F1u, 0xA54FF53Au,
49
- 0xADE682D1u, 0x510E527Fu, 0x2B3E6C1Fu, 0x9B05688Cu,
50
- 0xFB41BD6Bu, 0x1F83D9ABu, 0x137E2179u, 0x5BE0CD19u,
51
- 0xF3BCC908u, 0x6A09E667u, 0x84CAA73Bu, 0xBB67AE85u,
52
- 0xFE94F82Bu, 0x3C6EF372u, 0x5F1D36F1u, 0xA54FF53Au,
53
- 0xADE682F9u, 0x510E527Fu, 0x2B3E6C1Fu, 0x9B05688Cu,
54
- 0x04BE4294u, 0xE07C2654u, 0x137E2179u, 0x5BE0CD19u
55
- );
56
- // Input data buffer
57
- uint m[32];
58
-
59
- // These are offsets into the input data buffer for each mixing step.
60
- // They are multiplied by 2 from the original SIGMA values in
61
- // the C reference implementation, which refered to uint64s.
62
- const uint SIGMA82[192] = uint[192](
63
- 0u,2u,4u,6u,8u,10u,12u,14u,16u,18u,20u,22u,24u,26u,28u,30u,
64
- 28u,20u,8u,16u,18u,30u,26u,12u,2u,24u,0u,4u,22u,14u,10u,6u,
65
- 22u,16u,24u,0u,10u,4u,30u,26u,20u,28u,6u,12u,14u,2u,18u,8u,
66
- 14u,18u,6u,2u,26u,24u,22u,28u,4u,12u,10u,20u,8u,0u,30u,16u,
67
- 18u,0u,10u,14u,4u,8u,20u,30u,28u,2u,22u,24u,12u,16u,6u,26u,
68
- 4u,24u,12u,20u,0u,22u,16u,6u,8u,26u,14u,10u,30u,28u,2u,18u,
69
- 24u,10u,2u,30u,28u,26u,8u,20u,0u,14u,12u,6u,18u,4u,16u,22u,
70
- 26u,22u,14u,28u,24u,2u,6u,18u,10u,0u,30u,8u,16u,12u,4u,20u,
71
- 12u,30u,28u,18u,22u,6u,0u,16u,24u,4u,26u,14u,2u,8u,20u,10u,
72
- 20u,4u,16u,8u,14u,12u,2u,10u,30u,22u,18u,28u,6u,24u,26u,0u,
73
- 0u,2u,4u,6u,8u,10u,12u,14u,16u,18u,20u,22u,24u,26u,28u,30u,
74
- 28u,20u,8u,16u,18u,30u,26u,12u,2u,24u,0u,4u,22u,14u,10u,6u
85
+ // v[14] = ~v[14];
86
+ const uvec2 blake2b_iv[16] = uvec2[16](
87
+ uvec2(0xF2BDC900u, 0x6A09E667u),
88
+ uvec2(0x84CAA73Bu, 0xBB67AE85u),
89
+ uvec2(0xFE94F82Bu, 0x3C6EF372u),
90
+ uvec2(0x5F1D36F1u, 0xA54FF53Au),
91
+ uvec2(0xADE682D1u, 0x510E527Fu),
92
+ uvec2(0x2B3E6C1Fu, 0x9B05688Cu),
93
+ uvec2(0xFB41BD6Bu, 0x1F83D9ABu),
94
+ uvec2(0x137E2179u, 0x5BE0CD19u),
95
+ uvec2(0xF3BCC908u, 0x6A09E667u),
96
+ uvec2(0x84CAA73Bu, 0xBB67AE85u),
97
+ uvec2(0xFE94F82Bu, 0x3C6EF372u),
98
+ uvec2(0x5F1D36F1u, 0xA54FF53Au),
99
+ uvec2(0xADE682F9u, 0x510E527Fu),
100
+ uvec2(0x2B3E6C1Fu, 0x9B05688Cu),
101
+ uvec2(0x04BE4294u, 0xE07C2654u),
102
+ uvec2(0x137E2179u, 0x5BE0CD19u)
75
103
  );
76
104
 
77
- // G mixing function
78
- void G (uint ix, uint iy, uint a, uint b, uint c, uint d) {
79
- bool carry;
80
- uint o0;
81
- uint o1;
82
- uint xor0;
83
- uint xor1;
84
-
85
- // a = a + b;
86
- o0 = v[a] + v[b];
87
- o1 = v[a+1u] + v[b+1u];
88
- carry = o0 < v[a];
89
- o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
90
- v[a] = o0;
91
- v[a+1u] = o1;
92
-
93
- // a = a + m[sigma[r][2*i+0]];
94
- o0 = v[a] + m[ix];
95
- o1 = v[a+1u] + m[ix+1u];
96
- carry = o0 < v[a];
97
- o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
98
- v[a] = o0;
99
- v[a+1u] = o1;
100
-
101
- // d = rotr64(d ^ a, 32);
102
- xor0 = v[d] ^ v[a];
103
- xor1 = v[d+1u] ^ v[a+1u];
104
- v[d] = xor1;
105
- v[d+1u] = xor0;
106
-
107
- // c = c + d;
108
- o0 = v[c] + v[d];
109
- o1 = v[c+1u] + v[d+1u];
110
- carry = o0 < v[c];
111
- o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
112
- v[c] = o0;
113
- v[c+1u] = o1;
114
-
115
- // b = rotr64(b ^ c, 24);
116
- xor0 = v[b] ^ v[c];
117
- xor1 = v[b+1u] ^ v[c+1u];
118
- v[b] = (xor0 >> 24u) ^ (xor1 << 8u);
119
- v[b+1u] = (xor1 >> 24u) ^ (xor0 << 8u);
120
-
121
- // a = a + b;
122
- o0 = v[a] + v[b];
123
- o1 = v[a+1u] + v[b+1u];
124
- carry = o0 < v[a];
125
- o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
126
- v[a] = o0;
127
- v[a+1u] = o1;
128
-
129
- // a = a + m[sigma[r][2*i+1]];
130
- o0 = v[a] + m[iy];
131
- o1 = v[a+1u] + m[iy+1u];
132
- carry = o0 < v[a];
133
- o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
134
- v[a] = o0;
135
- v[a+1u] = o1;
136
-
137
- // d = rotr64(d ^ a, 16)
138
- xor0 = v[d] ^ v[a];
139
- xor1 = v[d+1u] ^ v[a+1u];
140
- v[d] = (xor0 >> 16u) ^ (xor1 << 16u);
141
- v[d+1u] = (xor1 >> 16u) ^ (xor0 << 16u);
142
-
143
- // c = c + d;
144
- o0 = v[c] + v[d];
145
- o1 = v[c+1u] + v[d+1u];
146
- carry = o0 < v[c];
147
- o1 = o1 + uint(mix(0.0, 1.0, float(carry)));
148
- v[c] = o0;
149
- v[c+1u] = o1;
150
-
151
- // b = rotr64(b ^ c, 63)
152
- xor0 = v[b] ^ v[c];
153
- xor1 = v[b+1u] ^ v[c+1u];
154
- v[b] = (xor1 >> 31u) ^ (xor0 << 1u);
155
- v[b+1u] = (xor0 >> 31u) ^ (xor1 << 1u);
105
+ // Iterated initialization vector
106
+ uvec2 v[16];
107
+
108
+ // Input data buffer
109
+ uvec2 m[16];
110
+
111
+ // G mixing function, compressing two subprocesses into one
112
+ void G (
113
+ uint a0, uint b0, uint c0, uint d0, uvec2 x0, uvec2 y0,
114
+ uint a1, uint b1, uint c1, uint d1, uvec2 x1, uvec2 y1
115
+ ) {
116
+ uvec4 a = uvec4(v[a0], v[a1]);
117
+ uvec4 b = uvec4(v[b0], v[b1]);
118
+ uvec4 c = uvec4(v[c0], v[c1]);
119
+ uvec4 d = uvec4(v[d0], v[d1]);
120
+ uvec4 mx = uvec4(x0, x1);
121
+ uvec4 my = uvec4(y0, y1);
122
+
123
+ a = a + b + uvec4(0u, uint(a.x + b.x < a.x), 0u, uint(a.z + b.z < a.z));
124
+ a = a + mx + uvec4(0u, uint(a.x + mx.x < a.x), 0u, uint(a.z + mx.z < a.z));
125
+ d = (d ^ a).yxwz;
126
+ c = c + d + uvec4(0u, uint(c.x + d.x < c.x), 0u, uint(c.z + d.z < c.z));
127
+ b = ((b ^ c) >> ROTATE_24) | ((b ^ c) << ROTATE_8).yxwz;
128
+ a = a + b + uvec4(0u, uint(a.x + b.x < b.x), 0u, uint(a.z + b.z < b.z));
129
+ a = a + my + uvec4(0u, uint(a.x + my.x < a.x), 0u, uint(a.z + my.z < a.z));
130
+ d = ((d ^ a) >> ROTATE_16) | ((d ^ a) << ROTATE_16).yxwz;
131
+ c = c + d + uvec4(0u, uint(c.x + d.x < c.x), 0u, uint(c.z + d.z < c.z));
132
+ b = ((b ^ c) >> ROTATE_31).yxwz | ((b ^ c) << ROTATE_1);
133
+
134
+ v[a0] = a.xy;
135
+ v[b0] = b.xy;
136
+ v[c0] = c.xy;
137
+ v[d0] = d.xy;
138
+ v[a1] = a.zw;
139
+ v[b1] = b.zw;
140
+ v[c1] = c.zw;
141
+ v[d1] = d.zw;
156
142
  }
157
143
 
158
144
  void main() {
159
- int i;
160
- uvec4 u_work0 = work[0u];
161
- uvec4 u_work1 = work[1u];
162
- uint uv_x = uint(uv_pos.x * workload);
163
- uint uv_y = uint(uv_pos.y * workload);
164
- uint x_pos = uv_x % 256u;
165
- uint y_pos = uv_y % 256u;
166
- uint x_index = (uv_x - x_pos) / 256u;
167
- uint y_index = (uv_y - y_pos) / 256u;
168
-
169
- // First 2 work bytes are the x,y pos within the 256x256 area, the next
170
- // two bytes are modified from the random generated value, XOR'd with
171
- // the x,y area index of where this pixel is located
172
- m[0u] = (x_pos ^ (y_pos << 8u) ^ ((u_work0.b ^ x_index) << 16u) ^ ((u_work0.a ^ y_index) << 24u));
173
-
174
- // Remaining bytes are un-modified from the random generated value
175
- m[1u] = (u_work1.r ^ (u_work1.g << 8u) ^ (u_work1.b << 16u) ^ (u_work1.a << 24u));
145
+ // Initialize fragment output
146
+ nonce = uvec4(0u);
176
147
 
177
- // Block hash
178
- for (uint i = 0u; i < 8u; i = i + 1u) {
179
- m[i+2u] = blockhash[i];
180
- }
148
+ // Nonce uniquely differentiated by pixel location
149
+ m[0u] = seed ^ uvec2(gl_FragCoord);
181
150
 
182
- // twelve rounds of mixing
183
- for(uint i = 0u; i < 12u; i = i + 1u) {
184
- G(SIGMA82[i * 16u + 0u], SIGMA82[i * 16u + 1u], 0u, 8u, 16u, 24u);
185
- G(SIGMA82[i * 16u + 2u], SIGMA82[i * 16u + 3u], 2u, 10u, 18u, 26u);
186
- G(SIGMA82[i * 16u + 4u], SIGMA82[i * 16u + 5u], 4u, 12u, 20u, 28u);
187
- G(SIGMA82[i * 16u + 6u], SIGMA82[i * 16u + 7u], 6u, 14u, 22u, 30u);
188
- G(SIGMA82[i * 16u + 8u], SIGMA82[i * 16u + 9u], 0u, 10u, 20u, 30u);
189
- G(SIGMA82[i * 16u + 10u], SIGMA82[i * 16u + 11u], 2u, 12u, 22u, 24u);
190
- G(SIGMA82[i * 16u + 12u], SIGMA82[i * 16u + 13u], 4u, 14u, 16u, 26u);
191
- G(SIGMA82[i * 16u + 14u], SIGMA82[i * 16u + 15u], 6u, 8u, 18u, 28u);
151
+ // Block hash
152
+ m[1u] = uvec2(blockhash[0u], blockhash[1u]);
153
+ m[2u] = uvec2(blockhash[2u], blockhash[3u]);
154
+ m[3u] = uvec2(blockhash[4u], blockhash[5u]);
155
+ m[4u] = uvec2(blockhash[6u], blockhash[7u]);
156
+
157
+ // Reset v
158
+ v = blake2b_iv;
159
+
160
+ // Twelve rounds of G mixing
161
+
162
+ // Round 0
163
+ G(0u, 4u, 8u, 12u, m[0u], m[1u], 1u, 5u, 9u, 13u, m[2u], m[3u]);
164
+ G(2u, 6u, 10u, 14u, m[4u], m[5u], 3u, 7u, 11u, 15u, m[6u], m[7u]);
165
+ G(0u, 5u, 10u, 15u, m[8u], m[9u], 1u, 6u, 11u, 12u, m[10u], m[11u]);
166
+ G(2u, 7u, 8u, 13u, m[12u], m[13u], 3u, 4u, 9u, 14u, m[14u], m[15u]);
167
+
168
+ // Round 1
169
+ G(0u, 4u, 8u, 12u, m[14u], m[10u], 1u, 5u, 9u, 13u, m[4u], m[8u]);
170
+ G(2u, 6u, 10u, 14u, m[9u], m[15u], 3u, 7u, 11u, 15u, m[13u], m[6u]);
171
+ G(0u, 5u, 10u, 15u, m[1u], m[12u], 1u, 6u, 11u, 12u, m[0u], m[2u]);
172
+ G(2u, 7u, 8u, 13u, m[11u], m[7u], 3u, 4u, 9u, 14u, m[5u], m[3u]);
173
+
174
+ // Round 2
175
+ G(0u, 4u, 8u, 12u, m[11u], m[8u], 1u, 5u, 9u, 13u, m[12u], m[0u]);
176
+ G(2u, 6u, 10u, 14u, m[5u], m[2u], 3u, 7u, 11u, 15u, m[15u], m[13u]);
177
+ G(0u, 5u, 10u, 15u, m[10u], m[14u], 1u, 6u, 11u, 12u, m[3u], m[6u]);
178
+ G(2u, 7u, 8u, 13u, m[7u], m[1u], 3u, 4u, 9u, 14u, m[9u], m[4u]);
179
+
180
+ // Round 3
181
+ G(0u, 4u, 8u, 12u, m[7u], m[9u], 1u, 5u, 9u, 13u, m[3u], m[1u]);
182
+ G(2u, 6u, 10u, 14u, m[13u], m[12u], 3u, 7u, 11u, 15u, m[11u], m[14u]);
183
+ G(0u, 5u, 10u, 15u, m[2u], m[6u], 1u, 6u, 11u, 12u, m[5u], m[10u]);
184
+ G(2u, 7u, 8u, 13u, m[4u], m[0u], 3u, 4u, 9u, 14u, m[15u], m[8u]);
185
+
186
+ // Round 4
187
+ G(0u, 4u, 8u, 12u, m[9u], m[0u], 1u, 5u, 9u, 13u, m[5u], m[7u]);
188
+ G(2u, 6u, 10u, 14u, m[2u], m[4u], 3u, 7u, 11u, 15u, m[10u], m[15u]);
189
+ G(0u, 5u, 10u, 15u, m[14u], m[1u], 1u, 6u, 11u, 12u, m[11u], m[12u]);
190
+ G(2u, 7u, 8u, 13u, m[6u], m[8u], 3u, 4u, 9u, 14u, m[3u], m[13u]);
191
+
192
+ // Round 5
193
+ G(0u, 4u, 8u, 12u, m[2u], m[12u], 1u, 5u, 9u, 13u, m[6u], m[10u]);
194
+ G(2u, 6u, 10u, 14u, m[0u], m[11u], 3u, 7u, 11u, 15u, m[8u], m[3u]);
195
+ G(0u, 5u, 10u, 15u, m[4u], m[13u], 1u, 6u, 11u, 12u, m[7u], m[5u]);
196
+ G(2u, 7u, 8u, 13u, m[15u], m[14u], 3u, 4u, 9u, 14u, m[1u], m[9u]);
197
+
198
+ // Round 6
199
+ G(0u, 4u, 8u, 12u, m[12u], m[5u], 1u, 5u, 9u, 13u, m[1u], m[15u]);
200
+ G(2u, 6u, 10u, 14u, m[14u], m[13u], 3u, 7u, 11u, 15u, m[4u], m[10u]);
201
+ G(0u, 5u, 10u, 15u, m[0u], m[7u], 1u, 6u, 11u, 12u, m[6u], m[3u]);
202
+ G(2u, 7u, 8u, 13u, m[9u], m[2u], 3u, 4u, 9u, 14u, m[8u], m[11u]);
203
+
204
+ // Round 7
205
+ G(0u, 4u, 8u, 12u, m[13u], m[11u], 1u, 5u, 9u, 13u, m[7u], m[14u]);
206
+ G(2u, 6u, 10u, 14u, m[12u], m[1u], 3u, 7u, 11u, 15u, m[3u], m[9u]);
207
+ G(0u, 5u, 10u, 15u, m[5u], m[0u], 1u, 6u, 11u, 12u, m[15u], m[4u]);
208
+ G(2u, 7u, 8u, 13u, m[8u], m[6u], 3u, 4u, 9u, 14u, m[2u], m[10u]);
209
+
210
+ // Round 8
211
+ G(0u, 4u, 8u, 12u, m[6u], m[15u], 1u, 5u, 9u, 13u, m[14u], m[9u]);
212
+ G(2u, 6u, 10u, 14u, m[11u], m[3u], 3u, 7u, 11u, 15u, m[0u], m[8u]);
213
+ G(0u, 5u, 10u, 15u, m[12u], m[2u], 1u, 6u, 11u, 12u, m[13u], m[7u]);
214
+ G(2u, 7u, 8u, 13u, m[1u], m[4u], 3u, 4u, 9u, 14u, m[10u], m[5u]);
215
+
216
+ // Round 9
217
+ G(0u, 4u, 8u, 12u, m[10u], m[2u], 1u, 5u, 9u, 13u, m[8u], m[4u]);
218
+ G(2u, 6u, 10u, 14u, m[7u], m[6u], 3u, 7u, 11u, 15u, m[1u], m[5u]);
219
+ G(0u, 5u, 10u, 15u, m[15u], m[11u], 1u, 6u, 11u, 12u, m[9u], m[14u]);
220
+ G(2u, 7u, 8u, 13u, m[3u], m[12u], 3u, 4u, 9u, 14u, m[13u], m[0u]);
221
+
222
+ // Round 10
223
+ G(0u, 4u, 8u, 12u, m[0u], m[1u], 1u, 5u, 9u, 13u, m[2u], m[3u]);
224
+ G(2u, 6u, 10u, 14u, m[4u], m[5u], 3u, 7u, 11u, 15u, m[6u], m[7u]);
225
+ G(0u, 5u, 10u, 15u, m[8u], m[9u], 1u, 6u, 11u, 12u, m[10u], m[11u]);
226
+ G(2u, 7u, 8u, 13u, m[12u], m[13u], 3u, 4u, 9u, 14u, m[14u], m[15u]);
227
+
228
+ // Round 11
229
+ G(0u, 4u, 8u, 12u, m[14u], m[10u], 1u, 5u, 9u, 13u, m[4u], m[8u]);
230
+ G(2u, 6u, 10u, 14u, m[9u], m[15u], 3u, 7u, 11u, 15u, m[13u], m[6u]);
231
+ G(0u, 5u, 10u, 15u, m[1u], m[12u], 1u, 6u, 11u, 12u, m[0u], m[2u]);
232
+ G(2u, 7u, 8u, 13u, m[11u], m[7u], 3u, 4u, 9u, 14u, m[5u], m[3u]);
233
+
234
+ // Pixel data set from work seed values
235
+ // Finalize digest from high bits, low bits can be safely ignored
236
+ if ((BLAKE2B_IV32_1 ^ v[0u].y ^ v[8u].y) >= threshold && (search || uvec2(gl_FragCoord) == uvec2(0u))) {
237
+ nonce = uvec4(1u, m[0u].y, m[0u].x, (uint(gl_FragCoord.x) << 16u) | uint(gl_FragCoord.y));
192
238
  }
193
239
 
194
- // Pixel data is multipled by threshold test result (0 or 1)
195
- // First 4 bytes insignificant, only calculate digest of second 4 bytes
196
- if ((BLAKE2B_IV32_1 ^ v[1u] ^ v[17u]) > threshold) {
197
- fragColor = vec4(
198
- float(x_index + 1u)/255.0, // +1 to distinguish from 0 (unsuccessful) pixels
199
- float(y_index + 1u)/255.0, // Same as previous
200
- float(x_pos)/255.0, // Return the 2 custom bytes used in work value
201
- float(y_pos)/255.0 // Second custom byte
202
- );
203
- } else {
240
+ // Valid nonce not found
241
+ if (nonce.x == 0u) {
204
242
  discard;
205
243
  }
206
244
  }
@@ -209,152 +247,257 @@ void main() {
209
247
  // src/shaders/gl-vertex.ts
210
248
  var NanoPowGlVertexShader = `#version 300 es
211
249
  #pragma vscode_glsllint_stage: vert
250
+ #ifdef GL_FRAGMENT_PRECISION_HIGH
212
251
  precision highp float;
213
- layout (location=0) in vec4 position;
214
- layout (location=1) in vec2 uv;
252
+ #else
253
+ precision mediump float;
254
+ #endif
215
255
 
216
- out vec2 uv_pos;
256
+ layout (location=0) in vec4 position;
217
257
 
218
258
  void main() {
219
- uv_pos = uv;
220
259
  gl_Position = position;
221
260
  }
222
261
  `;
223
262
 
224
263
  // src/classes/gl.ts
225
264
  var NanoPowGl = class _NanoPowGl {
226
- /** Used to set canvas size. Must be a multiple of 256. */
227
- static #WORKLOAD = 256 * Math.max(1, Math.floor(navigator.hardwareConcurrency));
228
- static #hexify(arr) {
229
- let out = "";
230
- for (let i = arr.length - 1; i >= 0; i--) {
231
- out += arr[i].toString(16).padStart(2, "0");
232
- }
233
- return out;
265
+ static #busy = false;
266
+ static #debug = false;
267
+ static #raf = 0;
268
+ /** Used to set canvas size. */
269
+ static #cores = Math.max(1, Math.floor(navigator.hardwareConcurrency));
270
+ static #WORKLOAD = 256 * this.#cores;
271
+ static #canvas = new OffscreenCanvas(this.#WORKLOAD, this.#WORKLOAD);
272
+ static get size() {
273
+ return this.#gl?.drawingBufferWidth;
234
274
  }
235
275
  static #gl;
236
- static #program;
276
+ static #drawProgram;
277
+ static #downsampleProgram;
237
278
  static #vertexShader;
238
- static #fragmentShader;
279
+ static #drawShader;
280
+ static #downsampleShader;
239
281
  static #positionBuffer;
240
- static #uvBuffer;
282
+ static #drawFbo;
283
+ static #downsampleFbos = [];
284
+ static #downsampleSrcLocation;
241
285
  static #uboBuffer;
242
- static #workBuffer;
286
+ static #uboView = new DataView(new ArrayBuffer(144));
287
+ static #seedBuffer;
288
+ static #seed = new BigUint64Array(1);
243
289
  static #query;
244
290
  static #pixels;
245
291
  /**Vertex Positions, 2 triangles */
246
292
  static #positions = new Float32Array([
247
293
  -1,
248
294
  -1,
249
- 0,
250
- -1,
251
- 1,
252
- 0,
253
- 1,
254
- 1,
255
- 0,
256
295
  1,
257
296
  -1,
258
- 0,
259
297
  1,
260
298
  1,
261
- 0,
262
299
  -1,
263
- -1,
264
- 0
265
- ]);
266
- /** Texture Positions */
267
- static #uvPosArray = new Float32Array([
268
- 1,
269
- 1,
270
- 1,
271
- 0,
272
- 0,
273
- 0,
274
- 0,
275
- 1,
276
- 0,
277
- 0,
278
- 1,
279
300
  1
280
301
  ]);
281
302
  /** Compile */
282
303
  static async init() {
283
- this.#gl = new OffscreenCanvas(this.#WORKLOAD, this.#WORKLOAD).getContext("webgl2");
284
- if (this.#gl == null) throw new Error("WebGL 2 is required");
285
- this.#gl.clearColor(0, 0, 0, 1);
286
- this.#program = this.#gl.createProgram();
287
- if (this.#program == null) throw new Error("Failed to create shader program");
288
- this.#vertexShader = this.#gl.createShader(this.#gl.VERTEX_SHADER);
289
- if (this.#vertexShader == null) throw new Error("Failed to create vertex shader");
290
- this.#gl.shaderSource(this.#vertexShader, NanoPowGlVertexShader);
291
- this.#gl.compileShader(this.#vertexShader);
292
- if (!this.#gl.getShaderParameter(this.#vertexShader, this.#gl.COMPILE_STATUS))
293
- throw new Error(this.#gl.getShaderInfoLog(this.#vertexShader) ?? `Failed to compile vertex shader`);
294
- this.#fragmentShader = this.#gl.createShader(this.#gl.FRAGMENT_SHADER);
295
- if (this.#fragmentShader == null) throw new Error("Failed to create fragment shader");
296
- this.#gl.shaderSource(this.#fragmentShader, NanoPowGlFragmentShader);
297
- this.#gl.compileShader(this.#fragmentShader);
298
- if (!this.#gl.getShaderParameter(this.#fragmentShader, this.#gl.COMPILE_STATUS))
299
- throw new Error(this.#gl.getShaderInfoLog(this.#fragmentShader) ?? `Failed to compile fragment shader`);
300
- this.#gl.attachShader(this.#program, this.#vertexShader);
301
- this.#gl.attachShader(this.#program, this.#fragmentShader);
302
- this.#gl.linkProgram(this.#program);
303
- if (!this.#gl.getProgramParameter(this.#program, this.#gl.LINK_STATUS))
304
- throw new Error(this.#gl.getProgramInfoLog(this.#program) ?? `Failed to link program`);
305
- this.#gl.useProgram(this.#program);
306
- const triangleArray = this.#gl.createVertexArray();
307
- this.#gl.bindVertexArray(triangleArray);
308
- this.#positionBuffer = this.#gl.createBuffer();
309
- this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#positionBuffer);
310
- this.#gl.bufferData(this.#gl.ARRAY_BUFFER, this.#positions, this.#gl.STATIC_DRAW);
311
- this.#gl.vertexAttribPointer(0, 3, this.#gl.FLOAT, false, 0, 0);
312
- this.#gl.enableVertexAttribArray(0);
313
- this.#uvBuffer = this.#gl.createBuffer();
314
- this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#uvBuffer);
315
- this.#gl.bufferData(this.#gl.ARRAY_BUFFER, this.#uvPosArray, this.#gl.STATIC_DRAW);
316
- this.#gl.vertexAttribPointer(1, 2, this.#gl.FLOAT, false, 0, 0);
317
- this.#gl.enableVertexAttribArray(1);
318
- this.#uboBuffer = this.#gl.createBuffer();
319
- this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#uboBuffer);
320
- this.#gl.bufferData(this.#gl.UNIFORM_BUFFER, 144, this.#gl.DYNAMIC_DRAW);
321
- this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
322
- this.#gl.bindBufferBase(this.#gl.UNIFORM_BUFFER, 0, this.#uboBuffer);
323
- this.#gl.uniformBlockBinding(this.#program, this.#gl.getUniformBlockIndex(this.#program, "UBO"), 0);
324
- this.#workBuffer = this.#gl.createBuffer();
325
- this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#workBuffer);
326
- this.#gl.bufferData(this.#gl.UNIFORM_BUFFER, 32, this.#gl.STREAM_DRAW);
327
- this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
328
- this.#gl.bindBufferBase(this.#gl.UNIFORM_BUFFER, 1, this.#workBuffer);
329
- this.#gl.uniformBlockBinding(this.#program, this.#gl.getUniformBlockIndex(this.#program, "WORK"), 1);
330
- this.#pixels = new Uint8Array(this.#gl.drawingBufferWidth * this.#gl.drawingBufferHeight * 4);
331
- this.#query = this.#gl.createQuery();
304
+ if (this.#busy) return;
305
+ this.#busy = true;
306
+ try {
307
+ this.#canvas.addEventListener("webglcontextlost", (event) => {
308
+ event.preventDefault();
309
+ console.warn("WebGL context lost. Waiting for it to be restored...");
310
+ cancelAnimationFrame(this.#raf);
311
+ }, false);
312
+ this.#canvas.addEventListener("webglcontextrestored", (event) => {
313
+ console.warn("WebGL context restored. Reinitializing...");
314
+ _NanoPowGl.init();
315
+ }, false);
316
+ this.#gl = this.#canvas.getContext("webgl2");
317
+ if (this.#gl == null) throw new Error("WebGL 2 is required");
318
+ this.#drawProgram = this.#gl.createProgram();
319
+ if (this.#drawProgram == null) throw new Error("Failed to create shader program");
320
+ this.#vertexShader = this.#gl.createShader(this.#gl.VERTEX_SHADER);
321
+ if (this.#vertexShader == null) throw new Error("Failed to create vertex shader");
322
+ this.#gl.shaderSource(this.#vertexShader, NanoPowGlVertexShader);
323
+ this.#gl.compileShader(this.#vertexShader);
324
+ if (!this.#gl.getShaderParameter(this.#vertexShader, this.#gl.COMPILE_STATUS))
325
+ throw new Error(this.#gl.getShaderInfoLog(this.#vertexShader) ?? `Failed to compile vertex shader`);
326
+ this.#drawShader = this.#gl.createShader(this.#gl.FRAGMENT_SHADER);
327
+ if (this.#drawShader == null) throw new Error("Failed to create fragment shader");
328
+ this.#gl.shaderSource(this.#drawShader, NanoPowGlDrawShader);
329
+ this.#gl.compileShader(this.#drawShader);
330
+ if (!this.#gl.getShaderParameter(this.#drawShader, this.#gl.COMPILE_STATUS))
331
+ throw new Error(this.#gl.getShaderInfoLog(this.#drawShader) ?? `Failed to compile fragment shader`);
332
+ this.#gl.attachShader(this.#drawProgram, this.#vertexShader);
333
+ this.#gl.attachShader(this.#drawProgram, this.#drawShader);
334
+ this.#gl.linkProgram(this.#drawProgram);
335
+ if (!this.#gl.getProgramParameter(this.#drawProgram, this.#gl.LINK_STATUS))
336
+ throw new Error(this.#gl.getProgramInfoLog(this.#drawProgram) ?? `Failed to link program`);
337
+ this.#downsampleProgram = this.#gl.createProgram();
338
+ if (this.#downsampleProgram == null) throw new Error("Failed to create downsample program");
339
+ this.#downsampleShader = this.#gl.createShader(this.#gl.FRAGMENT_SHADER);
340
+ if (this.#downsampleShader == null) throw new Error("Failed to create downsample shader");
341
+ this.#gl.shaderSource(this.#downsampleShader, NanoPowGlDownsampleShader);
342
+ this.#gl.compileShader(this.#downsampleShader);
343
+ if (!this.#gl.getShaderParameter(this.#downsampleShader, this.#gl.COMPILE_STATUS))
344
+ throw new Error(this.#gl.getShaderInfoLog(this.#downsampleShader) ?? `Failed to compile downsample shader`);
345
+ this.#gl.attachShader(this.#downsampleProgram, this.#vertexShader);
346
+ this.#gl.attachShader(this.#downsampleProgram, this.#downsampleShader);
347
+ this.#gl.linkProgram(this.#downsampleProgram);
348
+ if (!this.#gl.getProgramParameter(this.#downsampleProgram, this.#gl.LINK_STATUS))
349
+ throw new Error(this.#gl.getProgramInfoLog(this.#downsampleProgram) ?? `Failed to link program`);
350
+ this.#gl.useProgram(this.#drawProgram);
351
+ const triangleArray = this.#gl.createVertexArray();
352
+ this.#gl.bindVertexArray(triangleArray);
353
+ this.#positionBuffer = this.#gl.createBuffer();
354
+ this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, this.#positionBuffer);
355
+ this.#gl.bufferData(this.#gl.ARRAY_BUFFER, this.#positions, this.#gl.STATIC_DRAW);
356
+ this.#gl.vertexAttribPointer(0, 2, this.#gl.FLOAT, false, 0, 0);
357
+ this.#gl.enableVertexAttribArray(0);
358
+ this.#gl.bindBuffer(this.#gl.ARRAY_BUFFER, null);
359
+ const texture = this.#gl.createTexture();
360
+ this.#gl.bindTexture(this.#gl.TEXTURE_2D, texture);
361
+ this.#gl.texImage2D(this.#gl.TEXTURE_2D, 0, this.#gl.RGBA32UI, this.#gl.drawingBufferWidth, this.#gl.drawingBufferHeight, 0, this.#gl.RGBA_INTEGER, this.#gl.UNSIGNED_INT, null);
362
+ this.#gl.texParameteri(this.#gl.TEXTURE_2D, this.#gl.TEXTURE_MIN_FILTER, this.#gl.NEAREST);
363
+ this.#gl.texParameteri(this.#gl.TEXTURE_2D, this.#gl.TEXTURE_MAG_FILTER, this.#gl.NEAREST);
364
+ const framebuffer = this.#gl.createFramebuffer();
365
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, framebuffer);
366
+ this.#gl.framebufferTexture2D(this.#gl.FRAMEBUFFER, this.#gl.COLOR_ATTACHMENT0, this.#gl.TEXTURE_2D, texture, 0);
367
+ if (this.#gl.checkFramebufferStatus(this.#gl.FRAMEBUFFER) !== this.#gl.FRAMEBUFFER_COMPLETE)
368
+ throw new Error(`Failed to create drawing framebuffer`);
369
+ this.#drawFbo = { texture, framebuffer, size: { x: this.#gl.drawingBufferWidth, y: this.#gl.drawingBufferHeight } };
370
+ for (let i = 1; i <= 4; i++) {
371
+ const width = this.#gl.drawingBufferWidth / 2 ** i;
372
+ const height = this.#gl.drawingBufferHeight / 2 ** i;
373
+ const texture2 = this.#gl.createTexture();
374
+ this.#gl.bindTexture(this.#gl.TEXTURE_2D, texture2);
375
+ this.#gl.texImage2D(this.#gl.TEXTURE_2D, 0, this.#gl.RGBA32UI, width, height, 0, this.#gl.RGBA_INTEGER, this.#gl.UNSIGNED_INT, null);
376
+ this.#gl.texParameteri(this.#gl.TEXTURE_2D, this.#gl.TEXTURE_MIN_FILTER, this.#gl.NEAREST);
377
+ this.#gl.texParameteri(this.#gl.TEXTURE_2D, this.#gl.TEXTURE_MAG_FILTER, this.#gl.NEAREST);
378
+ const framebuffer2 = this.#gl.createFramebuffer();
379
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, framebuffer2);
380
+ this.#gl.framebufferTexture2D(this.#gl.FRAMEBUFFER, this.#gl.COLOR_ATTACHMENT0, this.#gl.TEXTURE_2D, texture2, 0);
381
+ if (this.#gl.checkFramebufferStatus(this.#gl.FRAMEBUFFER) !== this.#gl.FRAMEBUFFER_COMPLETE)
382
+ throw new Error(`Failed to create downsampling framebuffer ${i}`);
383
+ this.#downsampleFbos.push({ texture: texture2, framebuffer: framebuffer2, size: { x: width, y: height } });
384
+ }
385
+ this.#downsampleSrcLocation = this.#gl.getUniformLocation(this.#downsampleProgram, "src");
386
+ this.#gl.bindTexture(this.#gl.TEXTURE_2D, null);
387
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, null);
388
+ this.#uboBuffer = this.#gl.createBuffer();
389
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#uboBuffer);
390
+ this.#gl.bufferData(this.#gl.UNIFORM_BUFFER, 144, this.#gl.DYNAMIC_DRAW);
391
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
392
+ this.#gl.bindBufferBase(this.#gl.UNIFORM_BUFFER, 0, this.#uboBuffer);
393
+ this.#gl.uniformBlockBinding(this.#drawProgram, this.#gl.getUniformBlockIndex(this.#drawProgram, "UBO"), 0);
394
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
395
+ this.#seedBuffer = this.#gl.createBuffer();
396
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#seedBuffer);
397
+ this.#gl.bufferData(this.#gl.UNIFORM_BUFFER, 16, this.#gl.DYNAMIC_DRAW);
398
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
399
+ this.#gl.bindBufferBase(this.#gl.UNIFORM_BUFFER, 1, this.#seedBuffer);
400
+ this.#gl.uniformBlockBinding(this.#drawProgram, this.#gl.getUniformBlockIndex(this.#drawProgram, "WORK"), 1);
401
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
402
+ this.#query = this.#gl.createQuery();
403
+ this.#pixels = new Uint32Array(this.#gl.drawingBufferWidth * this.#gl.drawingBufferHeight * 4);
404
+ console.log(`NanoPow WebGL initialized at ${this.#gl.drawingBufferWidth}x${this.#gl.drawingBufferHeight}. Maximum nonces checked per frame: ${this.#gl.drawingBufferWidth * this.#gl.drawingBufferHeight}`);
405
+ } catch (err) {
406
+ throw new Error("WebGL initialization failed.", { cause: err });
407
+ } finally {
408
+ this.#busy = false;
409
+ }
410
+ }
411
+ static reset() {
412
+ cancelAnimationFrame(_NanoPowGl.#raf);
413
+ _NanoPowGl.#gl?.deleteQuery(_NanoPowGl.#query);
414
+ _NanoPowGl.#query = null;
415
+ _NanoPowGl.#gl?.deleteBuffer(_NanoPowGl.#seedBuffer);
416
+ _NanoPowGl.#seedBuffer = null;
417
+ _NanoPowGl.#gl?.deleteBuffer(_NanoPowGl.#uboBuffer);
418
+ _NanoPowGl.#uboBuffer = null;
419
+ for (const fbo of _NanoPowGl.#downsampleFbos) {
420
+ _NanoPowGl.#gl?.deleteFramebuffer(fbo.framebuffer);
421
+ _NanoPowGl.#gl?.deleteTexture(fbo.texture);
422
+ }
423
+ _NanoPowGl.#downsampleFbos = [];
424
+ _NanoPowGl.#gl?.deleteShader(_NanoPowGl.#downsampleShader);
425
+ _NanoPowGl.#downsampleShader = null;
426
+ _NanoPowGl.#gl?.deleteProgram(_NanoPowGl.#downsampleProgram);
427
+ _NanoPowGl.#downsampleProgram = null;
428
+ _NanoPowGl.#gl?.deleteFramebuffer(_NanoPowGl.#drawFbo?.framebuffer ?? null);
429
+ _NanoPowGl.#drawFbo = null;
430
+ _NanoPowGl.#gl?.deleteTexture(_NanoPowGl.#drawFbo);
431
+ _NanoPowGl.#drawFbo = null;
432
+ _NanoPowGl.#gl?.deleteBuffer(_NanoPowGl.#positionBuffer);
433
+ _NanoPowGl.#positionBuffer = null;
434
+ _NanoPowGl.#gl?.deleteShader(_NanoPowGl.#drawShader);
435
+ _NanoPowGl.#drawShader = null;
436
+ _NanoPowGl.#gl?.deleteShader(_NanoPowGl.#vertexShader);
437
+ _NanoPowGl.#vertexShader = null;
438
+ _NanoPowGl.#gl?.deleteProgram(_NanoPowGl.#drawProgram);
439
+ _NanoPowGl.#drawProgram = null;
440
+ _NanoPowGl.#gl = null;
441
+ _NanoPowGl.#busy = false;
442
+ _NanoPowGl.init();
443
+ }
444
+ static #logAverages(times) {
445
+ let count = times.length, sum = 0, reciprocals = 0, logarithms = 0, truncated = 0, min = 65535, max = 0, rate = 0;
446
+ times.sort();
447
+ for (let i = 0; i < count; i++) {
448
+ sum += times[i];
449
+ reciprocals += 1 / times[i];
450
+ logarithms += Math.log(times[i]);
451
+ min = Math.min(min, times[i]);
452
+ max = Math.max(max, times[i]);
453
+ if (count < 3 || i > count * 0.1 && i < count * 0.9) truncated += times[i];
454
+ }
455
+ const averages = {
456
+ "Count (frames)": count,
457
+ "Total (ms)": sum,
458
+ "Rate (f/s)": 1e3 * count * 0.8 / (truncated || sum),
459
+ "Minimum (ms)": min,
460
+ "Maximum (ms)": max,
461
+ "Arithmetic Mean (ms)": sum / count,
462
+ "Truncated Mean (ms)": truncated / count,
463
+ "Harmonic Mean (ms)": count / reciprocals,
464
+ "Geometric Mean (ms)": Math.exp(logarithms / count)
465
+ };
466
+ console.log(`Averages: ${JSON.stringify(averages)}`);
467
+ console.table(averages);
332
468
  }
333
- static #draw(work) {
469
+ static #draw(seed) {
334
470
  if (this.#gl == null || this.#query == null) throw new Error("WebGL 2 is required to draw and query pixels");
335
- if (this.#workBuffer == null) throw new Error("Work buffer is required to draw");
336
- this.#gl.clear(this.#gl.COLOR_BUFFER_BIT);
337
- this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#workBuffer);
338
- this.#gl.bufferSubData(this.#gl.UNIFORM_BUFFER, 0, Uint32Array.from(work));
471
+ if (this.#drawFbo == null) throw new Error("FBO is required to draw");
472
+ if (this.#seed[0] == null || this.#seedBuffer == null) throw new Error("Seed is required to draw");
473
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#seedBuffer);
474
+ this.#gl.bufferSubData(this.#gl.UNIFORM_BUFFER, 0, seed);
339
475
  this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
476
+ this.#gl.useProgram(this.#drawProgram);
477
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, this.#drawFbo.framebuffer);
478
+ this.#gl.activeTexture(this.#gl.TEXTURE0);
479
+ this.#gl.bindTexture(this.#gl.TEXTURE_2D, this.#drawFbo.texture);
340
480
  this.#gl.beginQuery(this.#gl.ANY_SAMPLES_PASSED_CONSERVATIVE, this.#query);
341
- this.#gl.drawArrays(this.#gl.TRIANGLES, 0, 6);
481
+ this.#gl.viewport(0, 0, this.#drawFbo.size.x, this.#drawFbo.size.y);
482
+ this.#gl.drawArrays(this.#gl.TRIANGLES, 0, 4);
483
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, null);
342
484
  this.#gl.endQuery(this.#gl.ANY_SAMPLES_PASSED_CONSERVATIVE);
343
485
  }
344
486
  static async #checkQueryResult() {
345
- if (this.#gl == null || this.#query == null) throw new Error("WebGL 2 is required to check query results");
346
- if (this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT_AVAILABLE)) {
347
- return !!this.#gl.getQueryParameter(this.#query, this.#gl.QUERY_RESULT);
348
- }
349
487
  return new Promise((resolve, reject) => {
350
- try {
351
- requestAnimationFrame(async () => {
352
- const result = await _NanoPowGl.#checkQueryResult();
353
- resolve(result);
354
- });
355
- } catch (err) {
356
- reject(err);
488
+ function check() {
489
+ try {
490
+ if (_NanoPowGl.#gl == null || _NanoPowGl.#query == null) throw new Error("WebGL 2 is required to check query results");
491
+ if (_NanoPowGl.#gl.getQueryParameter(_NanoPowGl.#query, _NanoPowGl.#gl.QUERY_RESULT_AVAILABLE)) {
492
+ resolve(!!_NanoPowGl.#gl.getQueryParameter(_NanoPowGl.#query, _NanoPowGl.#gl.QUERY_RESULT));
493
+ } else {
494
+ _NanoPowGl.#raf = requestAnimationFrame(check);
495
+ }
496
+ } catch (err) {
497
+ reject(err);
498
+ }
357
499
  }
500
+ check();
358
501
  });
359
502
  }
360
503
  /**
@@ -362,21 +505,41 @@ var NanoPowGl = class _NanoPowGl {
362
505
  * byte, converts the subsequent 3 pixels with the nonce byte values to a hex
363
506
  * string, and returns the result.
364
507
  *
365
- * @param work - Buffer with the original random nonce value
508
+ * @param workHex - Original nonce if provided for a validation call
366
509
  * @returns Nonce as an 8-byte (16-char) hexadecimal string
367
510
  */
368
- static #readResult(work) {
511
+ static #readResult(workHex) {
369
512
  if (this.#gl == null) throw new Error("WebGL 2 is required to read pixels");
370
- this.#gl.readPixels(0, 0, this.#gl.drawingBufferWidth, this.#gl.drawingBufferHeight, this.#gl.RGBA, this.#gl.UNSIGNED_BYTE, this.#pixels);
371
- for (let i = 0; i < this.#pixels.length; i += 4) {
513
+ if (this.#drawFbo == null) throw new Error("Source FBO is required to downsample");
514
+ let source = this.#drawFbo;
515
+ let pixelCount;
516
+ const start = performance.now();
517
+ if (workHex != null) {
518
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, source.framebuffer);
519
+ this.#gl.readPixels(0, 0, 1, 1, this.#gl.RGBA_INTEGER, this.#gl.UNSIGNED_INT, this.#pixels);
520
+ pixelCount = 4;
521
+ } else {
522
+ this.#gl.useProgram(this.#downsampleProgram);
523
+ for (const fbo of this.#downsampleFbos) {
524
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, fbo.framebuffer);
525
+ this.#gl.activeTexture(this.#gl.TEXTURE0);
526
+ this.#gl.bindTexture(this.#gl.TEXTURE_2D, source.texture);
527
+ this.#gl.uniform1i(this.#downsampleSrcLocation, 0);
528
+ this.#gl.viewport(0, 0, fbo.size.x, fbo.size.y);
529
+ this.#gl.drawArrays(this.#gl.TRIANGLES, 0, 4);
530
+ source = fbo;
531
+ }
532
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, source.framebuffer);
533
+ this.#gl.readPixels(0, 0, source.size.x, source.size.y, this.#gl.RGBA_INTEGER, this.#gl.UNSIGNED_INT, this.#pixels);
534
+ pixelCount = source.size.x * source.size.y * 4;
535
+ }
536
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, null);
537
+ for (let i = 0; i < pixelCount; i += 4) {
372
538
  if (this.#pixels[i] !== 0) {
373
- const hex = this.#hexify(work.subarray(4, 8)) + this.#hexify([
374
- this.#pixels[i + 2],
375
- this.#pixels[i + 3],
376
- work[2] ^ this.#pixels[i] - 1,
377
- work[3] ^ this.#pixels[i + 1] - 1
378
- ]);
379
- return hex;
539
+ if (this.#debug) console.log(`readResults (${performance.now() - start} ms)`);
540
+ if (this.#debug) console.log(`Pixel: rgba(${this.#pixels[i]}, ${this.#pixels[i + 1]}, ${this.#pixels[i + 2]}, ${this.#pixels[i + 3].toString(16).padStart(8, "0")})`);
541
+ const hex = `${this.#pixels[i + 1].toString(16).padStart(8, "0")}${this.#pixels[i + 2].toString(16).padStart(8, "0")}`;
542
+ if (workHex == null || workHex == hex) return hex;
380
543
  }
381
544
  }
382
545
  throw new Error("Query reported result but nonce value not found");
@@ -387,31 +550,64 @@ var NanoPowGl = class _NanoPowGl {
387
550
  * @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
388
551
  * @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
389
552
  */
390
- static async search(hash, threshold = 4294967288) {
391
- if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
553
+ static async search(hash, options) {
554
+ if (this.#busy) {
555
+ console.log("NanoPowGl is busy. Retrying search...");
556
+ return new Promise((resolve) => {
557
+ setTimeout(async () => {
558
+ const result = this.search(hash, options);
559
+ resolve(result);
560
+ }, 100);
561
+ });
562
+ }
563
+ this.#busy = true;
392
564
  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}`);
565
+ const threshold = typeof options?.threshold !== "number" || options.threshold < 0 || options.threshold > 4294967295 ? 4294967288 : options.threshold;
566
+ const effort = typeof options?.effort !== "number" || options.effort < 1 || options.effort > 32 ? this.#cores : options.effort;
567
+ this.#debug = !!options?.debug;
568
+ if (this.#WORKLOAD !== 256 * effort) {
569
+ this.#WORKLOAD = 256 * effort;
570
+ this.#canvas.height = this.#WORKLOAD;
571
+ this.#canvas.width = this.#WORKLOAD;
572
+ this.reset();
573
+ }
574
+ if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
394
575
  if (this.#gl == null) throw new Error("WebGL 2 is required");
395
- const uboView = new DataView(new ArrayBuffer(144));
576
+ if (this.#drawFbo == null) throw new Error("WebGL framebuffer is required");
577
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, this.#drawFbo.framebuffer);
578
+ this.#gl.clearBufferuiv(this.#gl.COLOR, 0, [0, 0, 0, 0]);
579
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, null);
580
+ for (let i = 0; i < this.#uboView.byteLength; i++) this.#uboView.setUint8(i, 0);
396
581
  for (let i = 0; i < 64; i += 8) {
397
582
  const uint32 = hash.slice(i, i + 8);
398
- uboView.setUint32(i * 2, parseInt(uint32, 16));
583
+ this.#uboView.setUint32(i * 2, parseInt(uint32, 16));
399
584
  }
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);
585
+ this.#uboView.setUint32(128, threshold, true);
586
+ this.#uboView.setUint32(132, 1, true);
587
+ if (this.#debug) console.log("UBO", this.#uboView.buffer.slice(0));
588
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#uboBuffer);
589
+ this.#gl.bufferSubData(this.#gl.UNIFORM_BUFFER, 0, this.#uboView);
590
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
591
+ let times = [];
592
+ let start = performance.now();
405
593
  let nonce = null;
406
- const seed = new Uint8Array(8);
594
+ if (this.#debug) console.groupCollapsed("Seeds (click to view)");
407
595
  while (nonce == null) {
408
- crypto.getRandomValues(seed);
409
- this.#draw(seed);
596
+ start = performance.now();
597
+ const random0 = Math.floor(Math.random() * 4294967295);
598
+ const random1 = Math.floor(Math.random() * 4294967295);
599
+ this.#seed[0] = BigInt(random0) << 32n | BigInt(random1);
600
+ if (this.#debug) console.log("Seed", this.#seed);
601
+ this.#draw(this.#seed);
410
602
  const found = await this.#checkQueryResult();
603
+ times.push(performance.now() - start);
411
604
  if (found) {
412
- nonce = this.#readResult(seed);
605
+ if (this.#debug) console.groupEnd();
606
+ nonce = this.#readResult();
413
607
  }
414
608
  }
609
+ this.#busy = false;
610
+ if (this.#debug) this.#logAverages(times);
415
611
  return nonce;
416
612
  }
417
613
  /**
@@ -421,31 +617,51 @@ var NanoPowGl = class _NanoPowGl {
421
617
  * @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
422
618
  * @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
423
619
  */
424
- static async validate(work, hash, threshold = 4294967288) {
425
- if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
620
+ static async validate(work, hash, options) {
621
+ if (this.#busy) {
622
+ console.log("NanoPowGl is busy. Retrying validate...");
623
+ return new Promise((resolve) => {
624
+ setTimeout(async () => {
625
+ const result = this.validate(work, hash, options);
626
+ resolve(result);
627
+ }, 100);
628
+ });
629
+ }
630
+ this.#busy = true;
426
631
  if (!/^[A-Fa-f0-9]{16}$/.test(work)) throw new Error(`Invalid work ${work}`);
427
632
  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}`);
633
+ const threshold = typeof options?.threshold !== "number" || options.threshold < 0 || options.threshold > 4294967295 ? 4294967288 : options.threshold;
634
+ this.#debug = !!options?.debug;
635
+ if (_NanoPowGl.#gl == null) throw new Error("WebGL 2 is required");
429
636
  if (this.#gl == null) throw new Error("WebGL 2 is required");
430
- const uboView = new DataView(new ArrayBuffer(144));
637
+ if (this.#drawFbo == null) throw new Error("WebGL framebuffer is required");
638
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, this.#drawFbo.framebuffer);
639
+ this.#gl.clearBufferuiv(this.#gl.COLOR, 0, [0, 0, 0, 0]);
640
+ this.#gl.bindFramebuffer(this.#gl.FRAMEBUFFER, null);
641
+ for (let i = 0; i < this.#uboView.byteLength; i++) this.#uboView.setUint8(i, 0);
431
642
  for (let i = 0; i < 64; i += 8) {
432
643
  const uint32 = hash.slice(i, i + 8);
433
- uboView.setUint32(i * 2, parseInt(uint32, 16));
644
+ this.#uboView.setUint32(i * 2, parseInt(uint32, 16));
434
645
  }
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);
646
+ this.#uboView.setUint32(128, threshold, true);
647
+ this.#uboView.setUint32(132, 0, true);
648
+ if (this.#debug) console.log("UBO", this.#uboView.buffer.slice(0));
649
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, this.#uboBuffer);
650
+ this.#gl.bufferSubData(this.#gl.UNIFORM_BUFFER, 0, this.#uboView);
651
+ this.#gl.bindBuffer(this.#gl.UNIFORM_BUFFER, null);
440
652
  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();
653
+ this.#seed[0] = BigInt(`0x${work}`);
654
+ if (this.#debug) console.log("Work", this.#seed);
655
+ this.#draw(this.#seed);
656
+ let found = await this.#checkQueryResult();
446
657
  if (found) {
447
- nonce = this.#readResult(seed);
658
+ try {
659
+ nonce = this.#readResult(work);
660
+ } catch (err) {
661
+ found = false;
662
+ }
448
663
  }
664
+ this.#busy = false;
449
665
  if (found && nonce !== work) throw new Error(`Nonce found but does not match work`);
450
666
  return found;
451
667
  }
@@ -455,18 +671,22 @@ var NanoPowGl = class _NanoPowGl {
455
671
  var NanoPowGpu = class _NanoPowGpu {
456
672
  // Initialize WebGPU
457
673
  static #busy = false;
674
+ static #debug = false;
458
675
  static #device = null;
459
- static #uboBuffer;
676
+ static #gpuBufferReset = new BigUint64Array([0n, 0n]);
460
677
  static #gpuBuffer;
461
678
  static #cpuBuffer;
679
+ static #uboBuffer;
680
+ static #uboView;
462
681
  static #bindGroupLayout;
463
- static #pipeline;
682
+ static #searchPipeline;
683
+ static #validatePipeline;
464
684
  // Initialize WebGPU
465
685
  static async init() {
466
686
  if (this.#busy) return;
467
687
  this.#busy = true;
468
- if (navigator.gpu == null) throw new Error("WebGPU is not supported in this browser.");
469
688
  try {
689
+ if (navigator.gpu == null) throw new Error("WebGPU is not supported in this browser.");
470
690
  const adapter = await navigator.gpu.requestAdapter();
471
691
  if (adapter == null) throw new Error("WebGPU adapter refused by browser.");
472
692
  const device = await adapter.requestDevice();
@@ -475,17 +695,13 @@ var NanoPowGpu = class _NanoPowGpu {
475
695
  this.#device = device;
476
696
  this.setup();
477
697
  } catch (err) {
478
- throw new Error(`WebGPU initialization failed. ${err}`);
698
+ throw new Error("WebGPU initialization failed.", { cause: err });
479
699
  } finally {
480
700
  this.#busy = false;
481
701
  }
482
702
  }
483
703
  static setup() {
484
704
  if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
485
- this.#uboBuffer = this.#device.createBuffer({
486
- size: 48,
487
- usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
488
- });
489
705
  this.#gpuBuffer = this.#device.createBuffer({
490
706
  size: 16,
491
707
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC
@@ -494,6 +710,11 @@ var NanoPowGpu = class _NanoPowGpu {
494
710
  size: 16,
495
711
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
496
712
  });
713
+ this.#uboBuffer = this.#device.createBuffer({
714
+ size: 48,
715
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
716
+ });
717
+ this.#uboView = new DataView(new ArrayBuffer(48));
497
718
  this.#bindGroupLayout = this.#device.createBindGroupLayout({
498
719
  entries: [
499
720
  {
@@ -508,17 +729,28 @@ var NanoPowGpu = class _NanoPowGpu {
508
729
  }
509
730
  ]
510
731
  });
511
- this.#pipeline = this.#device.createComputePipeline({
732
+ const shaderModule = this.#device.createShaderModule({
733
+ code: compute_default
734
+ });
735
+ this.#searchPipeline = this.#device.createComputePipeline({
736
+ layout: this.#device.createPipelineLayout({
737
+ bindGroupLayouts: [this.#bindGroupLayout]
738
+ }),
739
+ compute: {
740
+ entryPoint: "search",
741
+ module: shaderModule
742
+ }
743
+ });
744
+ this.#validatePipeline = this.#device.createComputePipeline({
512
745
  layout: this.#device.createPipelineLayout({
513
746
  bindGroupLayouts: [this.#bindGroupLayout]
514
747
  }),
515
748
  compute: {
516
- entryPoint: "main",
517
- module: this.#device.createShaderModule({
518
- code: compute_default
519
- })
749
+ entryPoint: "validate",
750
+ module: shaderModule
520
751
  }
521
752
  });
753
+ console.log(`NanoPow WebGPU initialized. Recommended effort: ${Math.max(1, Math.floor(navigator.hardwareConcurrency / 2))}`);
522
754
  }
523
755
  static reset() {
524
756
  console.warn(`GPU device lost. Reinitializing...`);
@@ -528,17 +760,49 @@ var NanoPowGpu = class _NanoPowGpu {
528
760
  _NanoPowGpu.#busy = false;
529
761
  _NanoPowGpu.init();
530
762
  }
531
- static async #dispatch(seed, hash, threshold, passes) {
763
+ static #logAverages(times) {
764
+ let count = times.length, truncatedCount = 0, truncated = 0, sum = 0, reciprocals = 0, logarithms = 0, min = Number.MAX_SAFE_INTEGER, max = 0, median = 0, rate = 0;
765
+ times.sort();
766
+ for (let i = 0; i < count; i++) {
767
+ sum += times[i];
768
+ reciprocals += 1 / times[i];
769
+ logarithms += Math.log(times[i]);
770
+ min = Math.min(min, times[i]);
771
+ max = Math.max(max, times[i]);
772
+ if (i === Math.ceil(count / 2)) {
773
+ median = times[i];
774
+ }
775
+ if (count < 3 || i > 0.1 * count && i < 0.9 * (count - 1)) {
776
+ truncated += times[i];
777
+ truncatedCount++;
778
+ }
779
+ }
780
+ const averages = {
781
+ "Count (dispatches)": count,
782
+ "Total (ms)": sum,
783
+ "Rate (d/s)": 1e3 * truncatedCount / (truncated || sum),
784
+ "Minimum (ms)": min,
785
+ "Maximum (ms)": max,
786
+ "Median (ms)": median,
787
+ "Arithmetic Mean (ms)": sum / count,
788
+ "Truncated Mean (ms)": truncated / truncatedCount,
789
+ "Harmonic Mean (ms)": count / reciprocals,
790
+ "Geometric Mean (ms)": Math.exp(logarithms / count)
791
+ };
792
+ console.table(averages);
793
+ }
794
+ static async #dispatch(pipeline, seed, hash, threshold, passes) {
532
795
  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));
796
+ for (let i = 0; i < this.#uboView.byteLength; i++) this.#uboView.setUint8(i, 0);
797
+ for (let i = 0; i < 64; i += 16) {
798
+ const u64 = hash.slice(i, i + 16);
799
+ this.#uboView.setBigUint64(i / 2, BigInt(`0x${u64}`));
537
800
  }
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]));
801
+ this.#uboView.setBigUint64(32, seed, true);
802
+ this.#uboView.setUint32(40, threshold, true);
803
+ if (this.#debug) console.log("UBO", this.#uboView);
804
+ this.#device.queue.writeBuffer(this.#uboBuffer, 0, this.#uboView);
805
+ this.#device.queue.writeBuffer(this.#gpuBuffer, 0, this.#gpuBufferReset);
542
806
  const bindGroup = this.#device.createBindGroup({
543
807
  layout: this.#bindGroupLayout,
544
808
  entries: [
@@ -558,7 +822,7 @@ var NanoPowGpu = class _NanoPowGpu {
558
822
  });
559
823
  const commandEncoder = this.#device.createCommandEncoder();
560
824
  const passEncoder = commandEncoder.beginComputePass();
561
- passEncoder.setPipeline(this.#pipeline);
825
+ passEncoder.setPipeline(pipeline);
562
826
  passEncoder.setBindGroup(0, bindGroup);
563
827
  passEncoder.dispatchWorkgroups(passes, passes);
564
828
  passEncoder.end();
@@ -572,8 +836,9 @@ var NanoPowGpu = class _NanoPowGpu {
572
836
  this.#cpuBuffer.unmap();
573
837
  } catch (err) {
574
838
  console.warn(`Error getting data from GPU. ${err}`);
575
- return this.#dispatch(seed, hash, threshold, passes);
839
+ return this.#dispatch(pipeline, seed, hash, threshold, passes);
576
840
  }
841
+ if (this.#debug) console.log("gpuBuffer data", data);
577
842
  if (data == null) throw new Error(`Failed to get data from buffer.`);
578
843
  return data;
579
844
  }
@@ -581,35 +846,48 @@ var NanoPowGpu = class _NanoPowGpu {
581
846
  * Finds a nonce that satisfies the Nano proof-of-work requirements.
582
847
  *
583
848
  * @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
584
- * @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
849
+ * @param {NanoPowOptions} options - Used to configure search execution
585
850
  */
586
- static async search(hash, threshold = 4294967288) {
851
+ static async search(hash, options) {
852
+ if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new TypeError(`Invalid hash ${hash}`);
587
853
  if (this.#busy) {
854
+ console.log("NanoPowGpu is busy. Retrying search...");
588
855
  return new Promise((resolve) => {
589
856
  setTimeout(async () => {
590
- const result = this.search(hash, threshold);
857
+ const result = this.search(hash, options);
591
858
  resolve(result);
592
859
  }, 100);
593
860
  });
594
861
  }
595
862
  this.#busy = true;
596
- if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new TypeError(`Invalid hash ${hash}`);
597
- if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
863
+ const threshold = typeof options?.threshold !== "number" || options.threshold < 0 || options.threshold > 4294967295 ? 4294967288 : options.threshold;
864
+ const effort = typeof options?.effort !== "number" || options.effort < 1 || options.effort > 32 ? 2048 : options.effort * 256;
865
+ this.#debug = !!options?.debug;
598
866
  let loads = 0;
599
867
  while (this.#device == null && loads < 20) {
600
868
  await new Promise((resolve) => {
601
869
  setTimeout(resolve, 500);
602
870
  });
603
871
  }
604
- if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
872
+ if (this.#device == null) {
873
+ this.#busy = false;
874
+ throw new Error(`WebGPU device failed to load.`);
875
+ }
876
+ let times = [];
877
+ let start = performance.now();
605
878
  let nonce = 0n;
606
879
  do {
607
- const random = Math.floor(Math.random() * 4294967295);
608
- const seed = BigInt(random) << 32n | BigInt(random);
609
- const data = await this.#dispatch(seed, hash, threshold, 1024);
880
+ start = performance.now();
881
+ const random0 = Math.floor(Math.random() * 4294967295);
882
+ const random1 = Math.floor(Math.random() * 4294967295);
883
+ const seed = BigInt(random0) << 32n | BigInt(random1);
884
+ if (this.#debug) console.log(`seed: ${seed}`);
885
+ const data = await this.#dispatch(this.#searchPipeline, seed, hash, threshold, effort);
610
886
  nonce = data.getBigUint64(0, true);
611
887
  this.#busy = !data.getUint32(8);
888
+ times.push(performance.now() - start);
612
889
  } while (this.#busy);
890
+ if (this.#debug) this.#logAverages(times);
613
891
  return nonce.toString(16).padStart(16, "0");
614
892
  }
615
893
  /**
@@ -617,34 +895,41 @@ var NanoPowGpu = class _NanoPowGpu {
617
895
  *
618
896
  * @param {string} work - Hexadecimal proof-of-work value to validate
619
897
  * @param {string} hash - Hexadecimal hash of previous block, or public key for new accounts
620
- * @param {number} [threshold=0xfffffff8] - Difficulty of proof-of-work calculation
898
+ * @param {NanoPowOptions} options - Options used to configure search execution
621
899
  */
622
- static async validate(work, hash, threshold = 4294967288) {
900
+ static async validate(work, hash, options) {
901
+ if (!/^[A-Fa-f0-9]{16}$/.test(work)) throw new TypeError(`Invalid work ${work}`);
902
+ if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new TypeError(`Invalid hash ${hash}`);
623
903
  if (this.#busy) {
904
+ console.log("NanoPowGpu is busy. Retrying validate...");
624
905
  return new Promise((resolve) => {
625
906
  setTimeout(async () => {
626
- const result = this.validate(work, hash, threshold);
907
+ const result = this.validate(work, hash, options);
627
908
  resolve(result);
628
909
  }, 100);
629
910
  });
630
911
  }
631
912
  this.#busy = true;
632
- if (!/^[A-Fa-f0-9]{16}$/.test(work)) throw new TypeError(`Invalid work ${work}`);
633
- if (!/^[A-Fa-f0-9]{64}$/.test(hash)) throw new TypeError(`Invalid hash ${hash}`);
634
- if (typeof threshold !== "number") throw new TypeError(`Invalid threshold ${threshold}`);
913
+ this.#debug = !!options?.debug;
914
+ const threshold = typeof options?.threshold !== "number" || options.threshold < 0 || options.threshold > 4294967295 ? 4294967288 : options.threshold;
635
915
  let loads = 0;
636
916
  while (this.#device == null && loads < 20) {
637
917
  await new Promise((resolve) => {
638
918
  setTimeout(resolve, 500);
639
919
  });
640
920
  }
641
- if (this.#device == null) throw new Error(`WebGPU device failed to load.`);
921
+ if (this.#device == null) {
922
+ this.#busy = false;
923
+ throw new Error(`WebGPU device failed to load.`);
924
+ }
642
925
  const seed = BigInt(`0x${work}`);
643
- const data = await this.#dispatch(seed, hash, threshold, 1);
926
+ if (this.#debug) console.log(`work: ${work}`);
927
+ const data = await this.#dispatch(this.#validatePipeline, seed, hash, threshold, 1);
644
928
  const nonce = data.getBigUint64(0, true).toString(16).padStart(16, "0");
929
+ if (this.#debug) console.log(`nonce: ${nonce}`);
645
930
  const found = !!data.getUint32(8);
646
931
  this.#busy = false;
647
- if (found && work !== nonce) throw new Error(`Nonce found but does not match work`);
932
+ if (found && work !== nonce) throw new Error(`Nonce (${nonce}) found but does not match work (${work})`);
648
933
  return found;
649
934
  }
650
935
  };
@@ -652,20 +937,20 @@ var NanoPowGpu = class _NanoPowGpu {
652
937
  // src/classes/index.ts
653
938
  var isGlSupported;
654
939
  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
940
  try {
663
941
  await NanoPowGpu.init();
664
942
  isGpuSupported = true;
665
943
  } catch (err) {
666
- console.warn(`WebGPU is not supported in this environment.`);
944
+ console.warn("WebGPU is not supported in this environment.\n", err);
667
945
  isGpuSupported = false;
668
946
  }
947
+ try {
948
+ await NanoPowGl.init();
949
+ isGlSupported = true;
950
+ } catch (err) {
951
+ console.warn("WebGL is not supported in this environment.\n", err);
952
+ isGlSupported = false;
953
+ }
669
954
  var NanoPow = isGpuSupported ? NanoPowGpu : isGlSupported ? NanoPowGl : null;
670
955
 
671
956
  // src/main.ts