From 855154988c2d8c6b2b17a948e124a495a93fbc76 Mon Sep 17 00:00:00 2001 From: gusiri Date: Fri, 21 Nov 2025 14:36:01 +0900 Subject: [PATCH 01/36] update constraints to osaka (beta-v5.0-integration-test-wo-secp256r1) --- constraints | 2 +- prover/Makefile | 2 +- prover/zkevm/arithmetization/zkevm.bin | Bin 987986 -> 1016800 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/constraints b/constraints index 0e0b4e9a71..7f8b4e98f7 160000 --- a/constraints +++ b/constraints @@ -1 +1 @@ -Subproject commit 0e0b4e9a71bc6c4b9c2562dc2d6370abb901951a +Subproject commit 7f8b4e98f727ab54e2c08a4561d3282ebe345adc diff --git a/prover/Makefile b/prover/Makefile index a7029682e5..eac76d2af7 100644 --- a/prover/Makefile +++ b/prover/Makefile @@ -40,7 +40,7 @@ go-corset: ## Build and bundle the go-corset trace-expander dependency ## zkevm/arithmetization/zkevm.bin: go-corset - cd ../constraints && $(GO_CORSET) make zkevm_prague.bin && mv zkevm_prague.bin ../prover/zkevm/arithmetization/zkevm.bin + cd ../constraints && $(GO_CORSET) make zkevm_osaka.bin && mv zkevm_osaka.bin ../prover/zkevm/arithmetization/zkevm.bin ## ## Generate the setup for all provers job for sepolia (to be run with S3 access) diff --git a/prover/zkevm/arithmetization/zkevm.bin b/prover/zkevm/arithmetization/zkevm.bin index 40c8a26ad6d4b780f9dce156916e7d95c21cfa1d..84a86b5a9732659e86d16d0210972aa101e6b091 100644 GIT binary patch delta 123331 zcmcG%34D~*xj&xs&XP$o*~l`JJs|-?NXQ-n2xLeC1hP-U5|&AX2$3ahD&i8*wpw>Q z>Zuz-Z(D8Mu-0M~5!-5erB>*@-PLOE($(!QZEstd-}gD^T_>^kUjO&c=fjzIp65Bw zdCv1Z=Q+<=-pLQXbkW;4ES@;H{o=7*BYUrmONgU?_g^)A^Z3r4WBaEsm_F~4=8GFf z=Qm$6uWsJR#f=T4b(?FNM;aQNYPZzaHP?+^JX+t-II?B)^vdb`N4D-mjf+S3k5paW zIJc&1Y}fwLt$RoIkB#rD+CRE)f7KP^RXfMGj2_rswQqFu?z+aNy|q-YVr(a{BRhAa z_OiWW#dWpC-Q$-R*VWWD7T44*sBc`*Fu%CBt9Vs-;Hd+*X&FEKWAwU@*bhHs8gsc_ zT3j59@Eq6Sjpzi^AzFaBJG#RIj4>ZzK9@I+;Xgt~ll%+qG{$&>H?T&0y{ZD+s_m4yY%NX`5>RivGm`hd}OqV+ThkRfwkw zBwI`cA1b(ZY^~#m+?f-u{X2Jq1bwp!kQm1T(81!1$M#1KjF0S!Tm}`dCpBy&G6!u^ z91BjSg>E9XL@f1UW9@g6Z_s%Yece>_$#E@RYP(%&AQiZ~^XrAt|^+&>D5c}ZiI zpER8s$5IH+3km`m1W1cxX_Bi>_?9<&VR{_PB%*y|TX&5f*gv{!%X(5Pwc|9zv`K{2 z5U=*er)CgSivd6H%S@y8GUHe>@!l~GwO?=tc9oPmyhg-Y#UPu-GU?o{7|BHj88(**iilip^Ym1Tuat!stCVh=%o55ot>bF z6zKf{IHBHqYrv)HJ$I>|yWk|KY>hM*Kkv$FBP_b;YF`=#)@!SS&bi`=gz@pm+=V+S;il*m7Hm*6R$ z=XeTyL{-c6SJ`BVUJVAb=C&NR?6n@MzM?R(UbDkbs0(Zr&H4o#O^`QdX?(-26~{7IX7^;%9PyijRLgep;Rfv~V_$ z9I@bJnZrYot%2|sujrqsF==c<7?I7AkDwlYcz!1H@IGITm%hixiNil(0bbsi0_Z)y z87NQrW~2O9Uj@qa1cJ;-D^VqUDO@jmk3P3x2I?M+88h#C<(1Z z278zF_c#Wmm!D6}fjqxUEI^r%RMd#GD#81UN!4De58ry@9afk~B1%Jex#ph>f?9tq%FTX7mKi4w{gRdOQ+~g! zmK7(S{3V-_>=5V9WU5%5T#Yi4T#oX_h= zWAS`(N^l+_q3+mDNq;09oW!XNh2giR6oUO@DS0Trn^J)CUsIZyj~AsDY>`tZOglbK zvl$d9>kt$McaM*6Js_p9z!1Q_W$cnm6t%7yqDSk#@m-^lriT67fLuWJq}qJ^SZW|Z zB}!(2+=bpvjjQn68M3% zYL>_!Nz3;nf|l{(!+E*%L@vBz{0gdc$gGseFQf&B35^c8w~cKj;fF0W5R^b%Ok&7? zQf{KhtU{BMZKijtX(+|ad@$oneJ1f2;&bwnP-*H2kR)>(!lP&LBYU^jM&vAElar8S zV2PBoOAHcH60&Z}nrK)dr>coT=SBRRP?J^+TTDKLoRVuo94m1sz?S&b)-_L&_)ss9 zBu$^H)&%8CRL#tRVno4UpR%I8p3H?}>LCymI~uelMbw_26ivibOLp29lpkwfKe`2K z8QW#z2>+6XCxqSP)P#v3f3!`r6EsAqg3||D$m^uj5zgrXPMp&NoH(ZgIB`zTl=jK&eydhf!^c`Z8U3+a9gL)H32ryK9d6m&4wV+4Fo%7yX>wxaG`SP!G`SP! zG`SO}n_P`}9W{Zrs6B_toz-A+n?jo!Y!k$No*a{-o-%h}8g@pN-LtJth9<4=9v$C^6@V%g0NM$+5_x0~Azx6EyaItMtibveM{ zf5ggZZUd=sPIEhPPIEhP4s$zEmbFR$PMp)+^>sFL*G{#pCGnl+j;&*w+u4w`_Jlc= zPE|{q+gZzL?)o~LxgnlzZf6ynx#g_UWV7~!+O06=?9>=@gOM~h!R_X@!!2{$p-yvK zDLiqqS)26lL^{pw#5v9F#5v6EL|NvZ)Y=5hZ5uwdO*V5+HJ6k4u(mBA#8fej?GypV zp0dsarhhg0OItfD!PW)V(5`K=+1i}Ioi)hRNmiAQpS;s_Lr+L~m0F~w31PQ1_?vLc z(sroR(r)llGdFRvSsGv`P8u5VUr*kgNT;QpIESU3D2Jt;C>YwNOk>`b@o%bmo1}-K zZN6btp)q8evz@KL&VRFtw6d)V%|9@6zRhMfE1T1`tp+N@Soz~8>vRy?qc_+{V-j2$ zc>+6W$}%Rxva+4rX=Q6yk61aa?8G^Tvl9m)CTtnH6X~$B6Xme76XmqBeXgErs!n%d z{&8B_S;ZX9&Q_dOo?Jy**;&PDK53yfEyl`VBaKOL`%t#S z4I?A|+QCjM(@<7pnOHfk?8G^(?8G^TvJ)3Sp|7;$63vNoSlNk!mDTRH6AVix?z?Pf z1S>+7Wqm@&`<6{%UwP~i<)C?gk%{bxEjO+=mWS|!; zEDXIk>7bW1)e(bEs>K?ISv_b4dXcWwgfOVMO;QU9W2(hmpIBN!vr+@uJXDu4kqzp} zdLZajdLX#rG1PnIF$A^g#Y&+GVd=#QS9~nyoi|=F&dVC7We^4QpJk(VlOsc8lJO0FsKoZW(bZg}DmBn*dF2B5ZPBIZfOy-k^mc_I319=X{ z#z|Wqf2TM*g>WX@Vt&WW0M9Q;gjQyiRG{pa|i14n*Fl`DddM|1-yiWI7e4%0i2iEv2T@@ z<5(}gY!)lx)n!?oMW8hMX~j?io7|mXtNUanHE4(&?H%cn?b+!0*UHM#(wk+oI*LJK z`505{}=NQH}biGn(YLKV?+$-fBPJ zQR(Abs*7YVN^N|t2v$nH$RV873rtPA=1cjB%z3Po|2nhIOEkVX@nND?%AaUX0kl7> zhJUxlpI~@(ne0WG>_wTaH8(G=RlP{7b!S=aSTj)>PtKmlfz@yr`g*EX!nbGpaXNP( zyNRIutJzh&rOwYcRQvcqo$AjFTML$R&yf8goYjssFlO*e1M_@@MTjlrdjk3Va|=`1 z4F1DF6H0%uhCf^HH^;(E*`b-#AvTk850p?B$|qs2nfyD!c_^d7I`2%dgmO}Ip`4+d z6hOyvYS=8A+xeOXCGaepz?Rd^B90NlSpr)wPH-4o1<7koyAT*XP*KeZ#vI|=IYvpT zjSIgtcb=CjCB})OBCU*{%}tQslj6jxBFOwvZVIIJ=hg7DjedS=nU9rI-&d5Q4n~S= zhjedCYJy`(=)v1M^(HtbL?xItR?6wdftQe8jN|XItbBcr##&HMp{==iHvcFuP(K^Q z7`iTXMr=f1fPzjtBjE$M4l4i~z;ml^NNK;8O3#;V!&YJ5b5>K2+xmYXU zzn$ghM=$d7zs{P$s%TCLRsm}&!wMl)yr(=nhme-EmcLfQbsK~3gX+?Y!fDx1q!&CcQF!Aw54#h+lfUNsGr`f60P28zu_gdmA_#!e8`bncx` zXgF!i+(J-{l&i)O32`mNN8jO@dE%OJqyTFgQ#}On@f$0uJbRS_h~vT6WFx8zFP zm|bc}!aBm(Bs@dPkt_#~oVsj!qGf?Rb>Fvb2U6C^Ww@;t%wx5Dq%s2~$yW<9n|yDZauC9juh@cLmci^u$#Nd-qnQc<6fqf2=CVcV%T})#00=KV$gS zk$h!@vB~#=DF-2R`S?hCCjU%)Y9YZ4sjLx6P|_NIVQ#)iJFI!hxE_MW^XKNy_0khW z>p2Y3e(Xz0qwjXj@zdEQte&vRl8q!%KnxJsHGoL}Q zE2>HH(sx+&!_UB?_b>Fz?~tzG2AVGdDIUTn@CRy?<2B%$p*Um2H%K7~V-xbPrs4=; z32CXRK{_5`4I!zK4*`69 zu)a<{CGcD7D_IjQg;BzoxlO>^h_l@l3L$eFB<^gDE-3UnY zh+7U}h?|N#bV{WJoX2099n2#v=INNQLr{4;t&pCeW_B^vqkl3|5L9+)abu21eL(kL zg8KNv#yK8(O5ocYtL0N7f2c9Yx6IDWY6jep(g;e;BxNCCEGeTenoSYHMfq+XJsF}} z0f?YdREeJ~D&gb#ZB6w)dO}iE$d5GT^M7ed^$;L||5sC;d`jds^MbsyGLy}h!Dv3o z)j1zDHo1Ob%0&qB36&68!HD37lvWrbsFISNCQC`scwW?8@1-XUuD2e67hl=z_t5tQ zep7Rud`jdmH7ivv0NhZe5uX-FkqKiH`F&GlLRcbOGbX_ek*&c;P$e=wO%|D;@%+U6 zdM`aeRku|o2-8{WhI0qs};8h zZpdmyEP^Uo>1nd81dZpRh4o%~f~?1$QL)TJ-x2f|)@9R^T~-++>iNdmd07_$W$4-n zX%|WP31gGrx}i=8OMXkM1UKZj0trE-{Q2}WS$={dw4HmN($B^eFMUTZ*eUd)a*^Ld z-xK(vMRoEik?&tr$rj1Twur>UGgdBvMWBLAa;%f0)mUC6*ByjI5Yye+l8oSxN9Fg| zSd{=q0Ek_85cO2+jzxUW;vl5BY4JQS(I7FN_@=)4pzr=T@#r`8)yE=Uxuk|Imho`0 zRPtg_kdkB99t1~!^tFfOI|PT0W7i%8mP!uL(_|$tzO!X+))Jr$Qyar-34cEn@DN6$ zmBl7{qIP5N_z|4ijorv1I86|jLw&Y{kiaB`^Q2=5-5d824vH+`#i1bggfiF?o)enu zB`_8lFMS_&-xcx$dR3?v<>R3$)*^>h3&|R60Uc=!8-jY9GO2Chg-f&N64Dg2#WX2_ z4JmC<{&sa1cta?Zw=Jzf`QlP)?cJrdD2rOFQTDXX$qJ#qp*dragh-n8gt4RnZz&8x zO)VCiVi4Gr&IvZ8vq3p)%VHrZU5Hn;RpWVMTP4by+GQJZ`s!fDIago4iM64-i|w0mj%|OoTdD`?bRs%)L!W$YV5D(^Vi$6`O;+> zUIM`9U-)M%WDYFzgY47G=CD@jK74H#yGL0TYv(Vl3KS3?d=u!^h_#Wf5Z&YU!Dy0@f4C|Dx`fVRlog$2 zD0@0fQSR%Uj`E()B9ve6EJ67bDxdyy=Vr#1@lD;?najYKmQAe#;OLSKFXK0M7XbaG z?!p2>L-2%-aHM;%YpHxKg9xeJW&EA)BG9oOqAu#mM|qJf*Yy;8sAi%#evoBKCfK4* zYVGOhUK$FwM^<#0y2K=C7?r*(uAbW%-ya-&ot^BaRE= zute)!m&Y5|Wq1g%kiWe)DDF7mN~TjI`A_DHXrTqox5j22`Pl4fZ+ z8r`Z@-ZzvTPY7&Z33jQgi2q`JJhX84&`gx4hGt46&UwTgdt6z(cS91uiR%ejyS@r# zWPK&dTjcX|^7&U1o3epu8fCd*gJP2nHZ}WP`F;q7f6_Ns@TWEqhqpEmH~+@m86-_E zl(cl+KzpREy>lQ0T4NDI$UNHd7~bIuW-slaz=D5@6>t~<5|`&}K z6c6oi#hXm;+(eDf-BgQmc++f@H*F%JPHrkj`IAj0DF3{v0A(;jKC&WGT}+acW4x_t z?TsC8gqqE3E)9b8L?j>OYqI=pBtM66RTuzNO&Ab(ejFwK*#tOfoP04ooFRLG@6x9IJlD2_mq3AK0hj-U%P~8K9n?pt%Zfe74I4PL#?fm z-cUz>NB44i?Z{vp-dYawtG5Oli4bvgYO@m(vD7}15GYF=Zozv_zt~zJo>+=EVO-mC z!L4vx9?AvVNWh_OB+j+lNc;!3%|`jkwyJol3s(@uYu$6FNe5CMMDQZOhu69t4z!Yw zjFrn;CBTNl?#%42L3&vb|D@|t#p!W4GCVSt!CxDjhIZZ_t3jE5DM?g$X+Fx1OY=QM zIE$Z;1m#mXe=iaQ=GdhHl+Rw8FRe6(qWIc@Sg%^iKagyaw-d99?fDCdSv96UB1XV< z##=(xSjc+EM6;3~mRyc*CsjSSJx|)HL2uZ2)7M3t?>_KZ`SibU54ib`J^AIU@D*O? z>gl9umPvmk7%1)5S;bH62{sY}J~zcoM;L@J9b=zgR`HMalX20Ob3j2;o)AL2ya{WP}UJdx}OV zTE!pQ7m&RVh{ZK5yMSneCJ%ZY#p018_JBkRfqN5EOYK7N-u+5M zj07E9XVpcs7zs+mrLyOih)4Ga@<}cX27`cFwFu7dSA8fIc;QP4Sf)49>JTCSG9}BZqQN8e+83GUkm=lI0cj8fUxT2@PJsT* z)urf*5JuNC&%0d7h`}V))E8;AVY_u~or!I*VGm!fRE&|O*L8Y9qa_S=+|uCdmn#j< z6E9Zi8f-Rs*t~$}UZJEza-z3jcYrP(dy$UqcWD366-v6rCf25X=wpc?U4M)NeE$k1 zT}Ygs!?H0H*#QM;6(8c_gfv>4NULND+Ab<9S*~>DWr#>L9OS$%J>O9C?FS0M=!pY) zC|^BLD0!?DFM)?N{3=716;l0{ri!mrcI~nV$O0w-`q8cTZ$-pzo9$OB&GnjCn{D_} z9ouhWZMxy-uT+{FFtIk9pv6H;7^j;S9aPe;F$g-Oui2$ttMgPCLp_%sRMHNaSi2WK zsAD&nSbI;;9aPe8GO@OvLfVKWjMEDXuTsh%u?VQ2rnJ28D%G9M7J;L`V7|p{)b5xM zT&22miH=<HwQ@q@7Vr{Ab{4&g);)8nRiPvAVl6CU$ zUz69^2{@vLr@N=SRW4Tb^*F&1H4-E|(%rrW(zh5mUU+RT>d(Kn&_i_1;@Aia%%I2l z*mZ5~X=|5@4!v5jQ4RP7;{7cwN7h;>l1Et%*qpnzg_nVrx(x%R!}?o1m4O2DqG4qGy^RyIW!yP*r8ICw;r11qgD|;(mDH7 zCO>z`2k=i1%|gizld|#;7ooi9Fp&=*E<`yY%cBzV&BJAY{OWKqO5b%<&c2T5J7hU_ z-EurXbzN~DH9|uZTN(X5Jp&Hmet%sa)xMt8Fz0$|r{{VS@yhFo_tEQTND=4J(&V8V zJ$Zcm`UJo~xPA`G{7+S(T=}VTl>0taA}PbvnVN58^E1ai1=KKRhQ!uTXJ^ECb>A=z z|Hn@i`-uW^A%!UT@lR)fQ|70OB_{-gY2xrqPX_P#v@e$k5emG6z1Yi;b~N?7=hGzo zU3xWygIqrTTp@q|Q4hdxe|p(Gs!I{Lt7~wQU4eo{eO+rOEtER>#?RzRlXrk1JTRF6 zbz6aIM_oNDRV#;1{@7>o=2NQ}Byg7Ah}?gnF==!jIOx>E(P%bsciuoI$-f~_b{Y;Y z1&?W=?*{UZ9XI68(p8v9y$cPljo3EQ2nC-`CzLoHU;$Kl`3BO~uWy*Xny`rHlDod# zFP14YAz;T8s@C7WEYh=VS-73t#zL>es>wh*>+<0nOQhj38l+6L2_UCvqksJ9jd{{0 z7?}yg1RDZ!Kfq#-gdvGAv=b8^?6R8XAKVyhBKa`&Nu$AVv?FK@!WODZDsS)Y>{%DK zaD4G+X^2E*c}SMWKU-W(%n<04sSfodQtMcZbn3n$#UJz zih7Tonr0nSrAH*)IONGm&dVG@@aCb{=wFPj-GB1s7))X zd!2!Lb!U=Sg0ABq9hoV%XM)MCoLc(RkrtHm@1!8S@y-P(KX>N>Rs9B3 z=f`6q&!(|hD1^#Rts}V<*cxrU+_wrV7e3R1{xWH+eD7>o#Wy@Xk zJbV|K^V+*;PP|{1&)!9pKfR0k{inNVN-Dm)q*O|N4`KuMIkDFqjx4W@bcJbv;-4!4 zuF%Q1+)aExBg;qbCd-_^o9h49-Q`NO2XL}|kLD>P$rR*41F+gQquQ_ zob&$s30o{-k4xAo9kvFr0Kaf=lB8Hm-~9Gz zgV)|S6D-!=NB(-%edI+C$?{wG=`tMUY4>N|c|VDebU)#%@7FP3Aq?LkQCHkw+$7EX zm>krhfsR&+0_eX!yFtH{QqxMw$ddGt`P%(KIcLe`PDghvI(mPwfvkg>Awi}D&g#H~ zz_+z$QpHsdh zq*yuFWligD#jE5&B3mfS!3RqlC9$CCrl&2YU2;b_vk&`iF&O^%gEXMdKA5vW)<1?B z1_wB;tNKG-F{H%gZZHWC^u%Cz;ZX{;3y$XINhUXgYGAERJ4)d3qdCnI4|jAVGO9zw z|A-8{(v+soRpm3Xi8qesZY9eg(@AV=S9X=Facf@fv!fc|4HgPXkSElMSsXxX2Eh#N zF?Yz#yy6PcvKfnTYOGmA@Q4nIhw7Kh4qS)Lvhbjs&y8q8(%(ejo=M=_u`Omy{{}fv zKNiT5yzT_Hzpd3#i-(TUBkdDIC0|G8g`;zI!1}q zPmfWU`^zyJ%f-j3Y(GwsX!Lj+N-UG)T!0KPou7Cq%d0!#uO*G|^F&$xd5T%fWqHZx z3uP*@5RM`<d-F%Rj1+-n z6T8ObI<5ALBy#T;XUZuZ12{pB-+{HQblz*E2}iz2qvgpj2Bi)V1rjLlK;|gVP+BZU zenRZLloiAqX+zSNa?}L!WE{&BE#oO!Rg_am*Cx+70RzXLsZx&`ZA%WhjKsu{($S4= zRC65);jHtMJWAfU>(Ly!u1g0infB`^>z2Kz z0n^sgHK~zPkCG@ql3f1tQ5r76$7or<__0#ico2<0^hbBD)$UD?(WLy;V`b7RUN_Kcp^BHB&@`+!U}S*yA2dLC6sPusksW` z9r`af?xsKKgCz5wq>;1XNs0vrpCn7&`y{#gGf$F^fBqy%`_YpmfAI;jX6Qt5rHu8@ zqM4D+yOEIET~lM483?`+$1+BETggW?D;&b0uXLm?({vP@wajd-{yC|>f!YZt> ziDaiZi&rVdk!_wVe)c3S462^4L^<@do^^gdj^&6Kw|R2p!qTY7PdrUs`uWpyQ6_$k z1giKN3EJ~D>fXMu!9yt|{t&mLOFV&iT{--DiT;HwUC)#zN}``)S8arkd@Ea5*Q#fT z$M`dPy7&e^_e`F6bGj#)pLvGT$+OSQL+ScD$yp=IjbESXm#p5wHqPeFyZPJCQl$IJ z*Ga!;zfQXQ&DSYtrk^B3*PJAH-$~kfy6Pl#~#IIchKEd2+2e&(m}F^VI5oS>7khGtbW~?DTl!E-*I+)99|t;W@pu+z5hM zA_h?>cb_8d%#h`>Q)JZbrzou4d5Ty*b7~gr;%}bHMfoQ{x_I6T1*Ki6=>o&vp591p zU3~++^9Y7?VoE5qmCQGt&H?phFBE$TgnRVwd_Ez+(n*L*87cerZ--E=-I3m&H8`el zvtol2|ECv9!6N>2Im(*T#VGqu&qR4ZmJgjKalR?be>pu}HiI9#Ecrr01}}aw5x6-o zl0N!gq>k)=vDBwDkqnyI9{e&ewk%97oOzK9^XnIB#3i1gvhvKVGF1TqJ7wQg5kM*M ziZi6Hqq2NimcN%}#!CcWAj^@L$Po{{G(AzV#7&MYG4i04f~A>KyoOUBEa6_7rIQs> z=5hQ%PbOdTO&YALzDb*+SALVMbo85LNs1W)aoRq9>}%Qbha%AniBJ9(QPq8`Oz-y0 zI8j?E$EFhdYKcGotunnW1mZF&5oKK*Ud_dDOFQSEt|)LQkj(V;qoN^$&Y?7P1B3U%n3mr2zR$?~O_NngKy zd8XbNGQ;%!yx=AB@1|D>xA7IDGYfDDcrJcm_t-1m38e(&wzGQsdsesiM>;w?+n3{- z(LjHwJB)b++fUfB8)$DGXm7(jL+)>?T#k*4uq*RFsEc~!<+7Ku-XhGA1N^C1a^jT? zi=RIK%8Es-TjaV~Zhkl1o*`N<3w3pLu8UxWM-1dN+bw!Q0mAJDA%=`Whzl|{!sCkY z6h0ObM+_N*a8)~XMdt_0$Z!81t~{__#%V`?7}> z@;B;RqL<~xQ^ObqqUE`S9JSc!7OT9h2-MrXEVr5PSx95`*28N;wk`mN`%i|@ zojvk`o-Wl3URD4mKSv`i!~_@p3??f=oigK4l)&X$-RtPaGDhx2TfNWY3!f~WASU@! zEJ!Id5v~AHi_$W4rD`BB)Vu^#cOA?|ktZoIZLnL76&qmMB(cCH;)n5U+6rn2gVN(% zw-U5;(z=zPWl#^T0L;x0mBn<6YM-=7ulm^IW5EWZFUQP4=Pm66gZ*-5FvZ0n_5maJ zF)Yc%3qEP9Hx-`?K2`>$mnN_>AF-PYHx`FQQifsLZ3(O>hcGqBn!&DjFucOX?O1~J zp;HO0p7n?i=v$BQC$gOU9@L>UUhZ|vyMCyqI@2RUi7Z$|6!7%~Nugii^GNXt;}M4= zEGq-!#=Oa;($^kwERoe0^nwO!h@{ZcaD+B1aCsIDD3V_BK_ax(E7FtD*sOo7O732Pt=-^!LSua45?L>-w4%d)=s>sx zJI;0((<|PF91!QP_>f$1JxAw)14TM4)mOH}1?vk7=it)omt1z>qlhTephJ1^<2WE8 zOuD=sj255A?;_yiC-_)Mh)ghtF);umYvlz5v@P#&5fY=Q2M#A%%45*Q(qz!ci-V7OI$hrFg8 zioqZe(J>BIqA-Q!1c@UoP1^_&s;DcwPxPd)Y>7ocl~`)f#9ouaa_3Q9*foLbF4c2s zg94~T9n~6x65mf@!Ca~gQ+wr=91_e}`t;qC%7U`x6tpaFNZDJiN!8_og(cP@*QQk1 zv`<`>3QzA752%k9)W=(?7}kBlmBz~Asdbo3oO?SVGYM_G=)X6vPjmr0m$0yoTlXEi znh|7UZr1jRhtgR72-QJgmG_tJr)C64Q1#Mjn(cIuz!Xw3N5z5>QcX8fV~mK4MJR|f z#6HoGjyb7MtVw5c5($BjnbQ##p|7$adV+t_XZysHAOPLZ)kpj^`K?}kM5eI{;BK16 zW_gH5g?MKg60Wn;SUSLODy%PqmEcv zS)hR0oev+A9;Am#i{yAF%Lxz(5+Cc1o-X(KOqMl7NMtD16+MLn6q|bzYVEWV?GhbI z*K5?2M$i^O$w_UIs!!lO4>fp}>R5^x#?TPEfX%16ZIGU_dU}P-QU6#L%dI1dW$-9# z@vb5DAV;>Olj%Geg;0nJNjgf7 zPZ#7f`HW=45dGqCHkG#-k{PyjCS4&93nbI|ATG>hwfN}GW!dXUYK#q6Sl+QUVjMxypewwT z4&#itNKkCUx&|iELUz}HlUBT#%d+aJ3ijV=stQxD^ax8}D1*S1z1qRGD#C?DQ63Al z6JgV2#RG~l8yiiD7*QfNnuf(yc`ScEVJk43;_qRY8<#e5fWcjf4qSFHwjvFrI0s3j zRxyy&`z4SW|73^_-;=L92r?)avN<4%&8l;OlvOcyJV44@`WAW<&=VvWk|s~jpt?eA zc`T+?38fszf?`IMP>LoN6q~XVO3})KVs4dC>oOp=>h<0Fp<%P^+;hax@Q zo%X*C6Bh5Iokk*SO`UvYQXImX)bY5U$5aQ?f3A9|QiJXq`_)|$X zaR)>Sy{JWaxZf04^9RHd{F0i72$JMmX!PV)cku@VE`tOlE`=Z7o52Re3*{^~he+T+ z@&$K_PjQ8%iF1jtl?9e!AYQ!l=PLAfB(#g(klwsrux2Hqh@GX!1&hu0hKN zx&-&IWxH45EG>DprAb5$j zdtHQ1W5LqkN;sr}$r6W~l0Dt(kE5A*@lSJ+<_!u@H7m*^YQ(51;=-UrK9SD^YxfPQBunS#YBPaZG(cG#q1?e`65(-mzV~{j#^!8EE8qJ_7`LZ z#X~?#eH5E$D{@gAW>`^c6SEERE~JohV&$l$aK17#D2nS4K8eQ+K7M7k)SVGaR@h?r zpx9og%V@+B`_LH_M-4O<0Q%UlhT@<&4|Fp%V+4&AcFhBhTo&&PE5D35U+EkarS(YY z21Qprn-Nb;kco;r`jdji`j{aY690I5KTGX{#mjtWP&`%7&gZWN8o8GvY1eD67DpRc zFpnsZaZTaytHt>SI6M*frNh%xvYH52i=sv({RDxhdgvu-E9qY?RyDFlwptu+WWi>l zflp4cRY@3{{%8)TD;qRKr0|5u6z}+u&94^kHDZ;vTBJ0wGAT(7iL3+gW?p+>P)6-8mnp#w@7Ed;@?0CZB$4&UV{dwY7O)O2y2qh$_8@+f( z(;*5NCFx5v=gr;KqI#Z`v2z~Foljgb!KzKoTF1Q_LSZx*T!hL&vUxFnDFjr!@wtJ|%$GF&JR-yfQG1!c8 zxmt`hvjx&O(E0d*e*Cpbc`OgT$WXmnoNmU#mKdU;9FcZ^k~%9k@km(bj1V4NJ!Axm zfhA^JNEi|%RNpqUFc|5c)<~Cam8grIAfY4?l$E(Hr^RZf7EfN>7f>EL}H-c3HN+8Sw)|RmaMp~J?lTHG|t?k{R{tlUU z>zfKx4IwFB;*~fCM%=Q16{E$+7f6?RRek%N`sQ0mxRbLNvKG(88ZeRFp|zI!*$4tL zyEqmY-Sf&lU7wBIx$6r7z_0Jx+F*7zrVca8WxSmzTS%R8#NwiWM&I4FvjVr{fWELe(# zH4$RgqyX01-|l=hgmB2u38!xPIk?=u6rpR4cycL{u{GlR;JKPAVCIz3u%oxV%f5aj z90EuZn9-ko9q1UaFT@B-Gb*s{tvH`>w6v%d-n>SvZIvxu(aMVBi5{a&M1Po+ZA^=6 z#Hm&((i`gIuOLLVf;Lu)4=iR&6RFw^Y=m`$`HO1;UR`51x5;Xcs*khk<9F&Ksh!P~ z)sQe#wKwh#CP@>56XrZo^W&r(OMr=XDd~OqkS3@`m+aSGO(UIa$42%V@t^HT&en*) zGAU`Z`dFtv4yup)<;TfW%h-sUtrdluR?CWPW*KhhWI*>(}~-SM2(SR zyWL2-StsCdLCJ~&Y#67UjtOI(xVDo8)>CC{e8?RiM@xWHYN_uB>zyNNWR_Z|-P;L> z5#rrN>j;X$Y9?GKKImjwvH{xpFgAtMAsW@e(3rF*OK?o(9%5x*ix3cC1jfWbxiK-qKj~-$#({;*W)w3++HZ9s0U|U8kNDtbe^8xLt`o`K z_*)-C;?`~~`iFp@3EK_y+ipOUx`)J>ZtNotiMQ0pU%OdeGf^XDlRNq{F4+Pl;o!~| zj)J91PKHEJ4_tUiT#AnZBE)jfBD4j=A#uD1{xBq70A(XlB2!DC7pPkGt#oyMMi{ID zO$^DQV}!pKyE8<9wVp{p0a{ISL!zaZ+60DDvd#I6%1jDt<74(P|U(6L+scB$n z&4-)jwjUxQdRp-TYIoxyaiouB`3T!WcU+=h@@FMjUHe`in`bneXW+Uc5d!d--$fuO#I*1C6ooxW!6n%EeK8z`hkYBo+>^Txnh!(?FB6gDL(g zzGC+PD~2pb1~BOjiAM)mRXlOSxD~~J=QmHJhQx&dY^f6pgVYU9{dP70WBZA~6lUx-r)w){FPRxsj0YzIY{{J)9DTrWb{= z``>!8cpcIwBEbBj6UeP^-E4%x45MS@_P2o%x2(g75)r@~ZF7W*NbAL!b@;t5LStev zwJoi*Ui=PK=Mj!}DLT4)^&^4kAwvT|VJ6X0B(a4Oi-wRhP-Qr#PN7m&qcT6-5rm>| z8Dc>X(FMgjSF=n&P6Lul5V)P~9Mh;LJ^+4#@K||CyvmIYJP=rSNrbaOAmEeoJth6r zP2FN4R>-|v&ec3Yiy=C#)$Owz!As(%O`0Uvi+k5g&v|A&E0P_@R%oI!rsKlLdhx+} z4Bho2aRWv=v71F2nl#eaizOSRM{WXLDbZp6^C^b%FjEagLSXX4bujVa29_oUP?P@#v2zn^%A?A(6i`1KXP-tkh|`-`P6ZL5y1qPCleI37TVFdE3|R!Db%V%{ z;B1me$dSVW*_!PF)p9~3``2?DJ<}o}v|tTj)k{FLFzX~uUTr@Dad0!{&5h!|&FK0@aSE?@6%adw1X?%IBCrj=V+bjg18fxkzL_<#O;Rm+ zn?MQu;{~BM^-~aLZ#IctTQKVofr~$JJm8}zC`-Osl`PFm5QJsxhZHu6-)+I{y-6gD z%8yy2tT8hJD)@l?$0j54$0h@Wp}h#F8YAKX{M^heVo1ojuH{?T*79`Y8a-E`zP^db^C>@rgG@A%8N}VHeSX6FfITsNQ(ce$k z1o{Sh20GLfud+}=Vjw2#cLM!Os;QWO15N(t$`vZbNUkovI{JxUQ46G7~2Wj220s7tA4XZx}NT$=V% zK4(-GC${6-%dq&-c2+WvSj~Z1r+CARP_&CnsJi*}_Ece5%-zAVJw#E-&paFu!#kK; zey!r~Je((==5qE(KAQQ`4ypg|?2y*@)efv!s2k6boJI6VJSO`BCCp`@`q4N>^RW1@amgWPH!E68br62c7xK&=QYLD= zj%NZX7U9*sWu$Wxh)_g_c?0&9*08u^H_NIZ?wBK7{hhs3#n3mPm?P{b`@`b(-8e`Z z7XJ#NW>7Uu4>522>G?Myao;7C-*F;awCsT#1i|@biTGeFr9|x9gQ<2{T)77UepsB? z!y2U_{9p-5?kVTUBPyxB-zR8b+QAPr~G310XEE%#UlsU7M3E?FGE`mS7H*z zs^ChtilvG7u4JX+wJYJ^sr1~+(nZ}twvdg;L(Jd^dWBgjHU$`=-w{9D?-;G$tAq8P*6)0IYLInIIz+%7@M}$g2JK_%_($M!M2f3 zyozZYOYoZ^zX$IWoC17o1^jsYp|qZQ+6-9A~Xt|t0^rN2W0;aD5j0k!*2AiE_#dX zW_|QNrIXs|4FqqF-bf$wqc=%(ZS+6utSCp_-$&N#>2wyQEgIJBhw*l`3t%RMOPe z?pL(6^YMcj_{j#G&|YLTLtl0(vWDmvNJS0Nk6%tp>3k^~duO-3!LG9>& z#w*R#6}ZBo{s#Fo9k`-9*uH?&DL1{w73ZcalmHFUo29UI(IZmWy2ZBMlO)jxlmhFc zQGa-%y>l5Y0q7@(;@xy@ETHxDyInBwI$Sw{G|}rwzxC0FRIR4fZdx`(KPQ>bpN6}l z152&nLyt(M)LgD)sgH6=*0A1ZtTpPqJ^dZaJGz_vWS+JO-6W&3UX#y@vl<8yf)dp) zwD)_Jw?{ukVl<{}%Li7#rR2}D4|s4m zt&!&t?cs2}mzszEqZhC_0*!XGX)gS1NT$}_m*eX08Hj#{+M5@>TXvvnc~Tgf(p`DC zYH8kOs+V=q>xs4@daG=(A^LAVVoq)_PxTU=B+a*a)i2jaKTY&a3Er;3iB9x3(S;ig z(K}>Iwb47}XFYR46&bGZ@_`K=+_4R{MITfaXlOK<5_r(7&eEdyD|B7-IC)rYKE_gi zu{*pXRKLa}kNZZXp6aetQa4>qpX*oD%|{LkacZMS6@$iXSE#!!=vv#;-zBvy9E0{J6JOmeJn1Zsnv}Sp)?zR@)^4dgS11p3zl-RvHJOd( ztVb3TOO{T}ikb>7e|w6Q0DpU!1l+aJ(d{(JO~=VU`D^cCCe^h5dhdGDnzMckg*fsP zmNhGbnA)mIzPj!7-r|q=>=G}WWx3M!KRe6roA^xhYjJM%*L}>cAwzYMMU$xTQ<02> z8Xs6p7=J4s7cMjcrBacm&{#Rz{&X|;cO=C$qR3Db$a>uLM|rV|kPNeO)n|5`Kl%(Z z=;+t+LU3H%R(#G9>94WP>o2fdqtBMQ{7K$8Gv$Sg2C?8?-6fCLBN!pf7nfYIb7b@0 z@wpwBEFa%L9({KDq&flo>b6k_Rg%P5qX2n7TMonE$m*g=li%*aimY%I4}B> z=&NJwf1!V=HkatTfY(0KevWn15;6X-Y`VDiw^%6D^h1o_y{gS9@^(eP%}kwy_K{yi zPZcR`yO~&Zj^(r{g|&|C*b#j-di^JpB3EqurIu@J{`vPH!_I$Wsd;8=Nfo09cJH0r zI*x!5{cgObY2u}GEVKUqyvd9IMw2dv+fzxpll=eHXYt}&ES`D9+m~wrapJqULVjbO zHcd4AfaTYe#I(K%e}S0(HaX(Ml!Hm6zlm2}Cw>D%gR5UWSEXgxc&41z^6O{B@El?P z?Fb~c)5ZJ$pv@45sp7@$Zz1UBiu1qMvfLP5rQ*FGF#O>;eUKVsRDC9hJ&myVhkLbL zEs=>6=h@7>dC^zunKs$ZQLIEq&cpk!Ytw>wKhEeu=#O}(ZO6Yc+|c|5tDvW}1l$g! zNa12);yn;w7RB$J5<-lJvFw#~@7Mxm{%*bI_x%@5V56697PaZFE6bk11eU1bk1njH zJ1A`!W0*j+c={g3NN+)x@J_=c?&(dk2{hE&-qESZBt&Cg{2AH^{_K;iYKP%ZM74$G!9>3WhfSA6F;Fu;#5z!cr1TA6zi@T6mBhG!79ro;|tU|2*dv@i?KmI+tSxc=@UBIi5)SRFGcyKmi;?JtJqLqm> zx9;1vmj*-0|6txwJf@g7(oe!R?b=M&x#+7n3ir}%1D-K$$Eo`9f>47W>u1s!a^fDMut&SB@}esb1Z&toL{ z#69QPbNEKq#K*NiV1=1ebxSPxHOw!^NREjAHD;NQe!vn^V+Nk6ZPliWgXb}2k+M(T z_z&!imsN}N`?M^v>1WK3&86dS!s>_UdEUuef5vue3ZE;2Z?YQ|{xDFbZ?QBl!qU6v zF!omcGj?};VhN@Wf5OhOT~Jh{sevV&yz`$KB8j3pne?yh^Vm)xvLf-?uh=>e%=$G8 z;Q03>VE>fN;!c+SiTzyDJmGu(!Va-J#o@oO&$_gWYX$oc_C-j2eyz4py!%)7b@sY= z?{iuKltm7S4>)pAcrLINuA|XcMBgh~9w~Hba8dNTr7RaeGKU)l_`OQ}ic`n(!Jfge zc&Re0fx#g2*hF#p zw=k!@{X6X<_L>;~vDPjo^0Z7E@;)_VdqreA9C7y#H2kHKK5bK>wkY~4{#K&Rb`E~U zFCzo>QS8mcueoTs_k35&of99MU;K9r5-bKPi>m$_LiNwTs5P^1%jrUk-Xqek)C$Dl zhX^tc^=tK_t6a+$hmL7MEdjqv^r|*D(@ma!!8_CLYT_4-+BFjw*uEH7i_<*PFuIo2 zw>rDdvDF5>+94V&x{31$0Xo{-HD}R+DQ$+oCKo@*Vc~B1z-Z3mo+s^;gdEO zuAPV_*L~8?-A+FhIULeXUS#5@8d0=b8(FJ013YPjSi7+lg0vw1;NgUuuB z>!$EXoBvAUokmavweFC1-m&B{)bK|;b)ns@Z0-o&(jALsaGdOe^>r-ellx$GtPk4R zeG(s>RR3@I;Iq09-W2152#_ECQk!Lj#h@M*gLVguTvlHvMqbknPJFBjO6?jhXsKFv zK?`7WLF|4^p08tp(gjT*&9>yN(gjT@fQAcBg24stFq;e3*V$aKcB;)Vn@{P)+f_aS zYTX6xyeE@8sNsTkYMTqz*V$YUyrm1KeT)m%HnG%C?t)dZE@)@>NnCJJ{lDRYU)Npm z##k3j7H|Aon_;+MKzG43rwi7K;n%dQCboTC5R}R_JkZj#?tvD-=7ILzLo*1*0;LC< zK!*pKP@4x%g24mrFq_?L?aAL%nWD{G4ce`8^S0UWKRf3ssBOe>KRa=O6#;9TZ0@J0 zhd$|jd6jY!PO@m5;lrOWH_X>6qOV@X*woyn^1a!Urr^I_{cpJ5Gt%|M-gmVkTT=KB z?@so*#1wy=T|^c4wtSq|Nu3&AXDL|sItyU)I`>p@FBT}h&ICHV&V<^$ZW0V$XNTF$ zZO;X#N(F5WYLafofkA`eb9TN{5u3DdIXi8>&5djxr)PlfkMXz${D9LZ_PE)x9%tkB zNjxsL`rq)luj#?=GtOYQ0NWZPXS94H*k$X%F2?P|I}5Zck@9`4-$}(9erIV}_d5$< z^E+BI+m{x#w7iW4O25;AF)5#&)R=E4!Qgjxn9c9(8Q)Y1pUstY(ouC#W%!+)?_^>d zE&R?-YxBDXo8RfFp7t?*SI4IPANrk*+b8k6*y^9a??lU}<`JW3CapD+{>>ioMBfpt zfLjsn(rsHU=K5Fa)o?pY$-3KF0Gr#<2G1n7iv>!zGl7n9XF_e^ZW0V`XNS=ds{MQ7 zzRPw-kT=G9ya{)@Z42{kuAzM*I}guhxy|GR)euJ~h=!Hgz{`;vc7@fuCr_d-jNy$VCH)lz?Ea_6 zC0Cgnf9f!BGQCUD)6rg*Je%`gV8htI7NMK4wUZ={{6L!}x9&yBukdGiu)jkKX;Tnm z%Mm{dCO5Mkd*}1ShqJIt6ZxeUoKF|4KlwJ~#K&zzUSQqPbNV*1Pi{me$vsH54>?tf z26cj@_S>nAqf?_((N|Qja1`^KpJGR9+RwBKEgCZcEU}Nl>e=qsr#f(KR-wm7I!dD= zRUH^*Mem5d61^Ee8E!jrkOw0TE~r_Y`lU8or2bmVZJR>p(Z>|m1Y(#%MY5s(@MRZI z#n&_kXeIMma=$H`j5Eok`@}mx)iTmgBlzmlbzQb2`aS(X1UqqQ9y-F*o*SOAgs9$O~Pm1}KKHhkBI5oY!Pm74IWGz0?R&bPUN5jV9tZELGM!oKDkrKq|f7B*YqvtTOBx>#}#`kWauD83@b-(pwI zo?EnnIZ8G5y%eb$J3w|8`(>i&O)Y0mni5hf23uQDjD3cdKGlSj2x_YrZ=Gd#+tq@- zrR-0r7FqRwsTQNosNYfxHl660+M$?Y@#Yb`Vy-FF3Obcy>`Q#97&|~JhIVmi{4}j6 z2XyYoNL_(IT>H;jc8b&u?aN5=Nj`&J58PAupAII6&&aC(OXV1KMw48nhR?|DkSmkB z;4~h6K&6TI%XHlYl}haEPpJ~Mt`~Rw2aJnzomFCSwl+_^KT}H)!|Sy5?rV&*d6Bjn z;aOfG`2L@9Tx*Q_0`b*9vnFw<4fEUmVJ#^wes8ir&USrCu9x%PhFGbZ?c$m)BJNd* z6GAKO_wJ97ZXJ6PY`^2S7b4@uj@-(PBf0&!Ct{85pmlFcT^|c)*&x&aPS|2^kp(Og zX zHfnf%o&X0={;*Ly%~+mJnm=DlgC=aG3$(BT92BoF(flV7!k=I#&ur8_%LJ&C-H2%U zwhC+sDoDV=lc?|Dp%VfjKq#Sv0HOCLAP`Wo(-b(OB49<7W*dq$yHW%@C{0A^MFkZx`OnPW zy0bxi@BMrq*}139nKLtI`pgmhpntoEtdg9SokASNzAE6M7{q-pHpT$O!ira%vmmu1 zt{!iijgxYN!kiUIk%9IXYI)?PTOCI$%N7deFl52~S% zV4`S%vF@u%Sra|@26$|TvC;tIi^%rs&U~j(8?MFSid^)!*gHGi&)E`AJ?S(^akR6w zVB%8PvbE_APn~wwAWdSO+dQ}txZ9;~EzJLkaJrT=t3v6Y0iMc%obooOMObwHMSWG@{=&V4G#&e z;I$;&mc|zJtI$nWZJ^w@sPU3>*llck%GqIMGiSA^qvm|t)FRV+Q*RO&V^!S3=Udxn zy~S|cn-$zcoEKcJO|^U@k}%VI;8`IyK9talOslol;fuP&TyfguN=P$Siu@XzX8rT6FQsR z9N_#+5b9IaAt%C0v4Lh}lqXgfoqAVcL`koZPh4m}X1k5H#jYGp^ z46Q#zbdd0iWQ-$~1N* z!I_+D)iHxHpPq!nZgk&czCd4k#qAsq(JPz^*2Pp>z`Fo$ji>-vQfoqHDfV-*zpuh~ ztI%dO!=0hwd7iBrQ%8-%yeydRVXF@NVx5VCXA=e8SmfV7K_ymp$`3=+Y0gKSrMFE* z>&jk5D^7P72twN3D%u!HEsB=kkL}>UDC%MJDC${PXNvlk)IEwm0Pfj7Mbk}Vo|{c| zY;d| z#fEpQVk0EAsMzG+RP^w8RP-#$F%`}AIFA7rz=nkZDrP_EtVys)770S5yVb5Cl3KKD z{BPQMcuehJ>Sa8r#`2f0*?2UY5BEG4pjp;VZyD_MI5l4S-Ky6BNiFK7|C@Rq9*^-n zb3AM(X*pQ%6)Ixp?|f*tEI`FUHM}a;e1fXj`0iBHknq1Mm}c_u3Yrta3%|nROLZh6 z;M|9syy5ewu}>t!wF%C2^87Q-2?F*faHnKNczqJKh9_Olj)=wWUaWO6y$-ey>y|s` z8HIHJDfJ$V!_!7yqx)N_=MlD+KStM0VAp;mME2>);i~7cn$$mP#Ks*nzz%byz{(svVisVza^!y z$??BSibu%5B;|#dZIZI^6@OA#|A;1q6t1UfY5pJ6l5TSR@6zHC@-JzTHrk}+=Z*ff z;JjB&U}<@86HQBt|Cp9WCddCSEgm6vOv~e3>FV^BKN-{sn#qWJne@sS0ljDDv z43CgICZjQYwB064*6;AAg}P0GS#pnnoxuNAOB$FQ|GQ*(g#1e~688otgDCr)o9_RR{JZI_nF6L*~ogjwj*aL2B%I<#J`IQ-N zPEdArQE2C(?>fdyzvmaEZ)eg!aL)OK8TLf--FfF#Dd9`HTk|V?`uPh7o~%4V&rp7Y z3j_bStF=IIjS@i--MDTL^Q3D&jKAts!;VshW61EG!_l|&TUfha&yB#aLqaGXW&57u ze_%)1q|zTqSb1@UV9TUarV?XN=`jci7bAoYkQgr3!cTU%7>A!p;bLq|2h1lS4)4Tq z)Rbu6CF?t^>RoF2*4B*XHMsa4{LL1t^~{B_gnUMe&2M4o2y5nygb8 zomP4RVk(KptUzK^7OOd}P)M&THsgQ=gNyF*gp zfokH<;lV~nvo>2r=2jQMX={0wT_uel!3=9sSyJ5&sY_0`j%dw}uqaxrj_W9|MT<4? z^I5bQg`c0J#hNWC9&-YhjjBs@u^Ds1dzzkdnpj-FswUC7M8tXyu`{umF=90oG&n|# z#!qpK7>S>!@#FF^R(CkM!=4z7&ItuQLaQPiC;#K{8aIaswPMATazhY6Ax-cvlQ}F_ zOz>ni^cY~sN*rGD;80-F3K2J^$BHe(I$Cl*Do*Tc1(F4EVsEDv3X}BEhOlN+2woQQ z4=#q5YbnYkCqbMoS}DnQb;NgheqY{xQ(t_@$^%;_xRPOQu}gyIlEjxe^y%I1l$FIU zjXau+yJk2vlGc5T~z{4sI-_2Vp$b zB?Z>zV&VL{vG@dsp3%f24SC2PO~h$J5Gjpgb~CYG5Rg@ZX5uIg*sr-bodf>RTwKQi zg=RY5;#*IZV17tgT?lU}*0HDATdGLVx}&%lO1q0OFyW@006DG2>Kygy4q^(~&>9P> z6-AD=5oHbvlmV(`iVLjtK1?0hn!4CPk1Wth=UOevG5 zE_f4_1zTPhB`9bw5=u05K7%^?_omuuc{~TW&Shh#on* z1P>1sALG!mgTxL&K%WD8We~QvR%z6g!r|#?!#5AfLUn zZY(O$y?kga#1)7QIhvvZaX$w{-B}2rn9QC|qm_(#` zAqYbgvUG-&4ikookH*%QxDTmoNLQIFm;o^h#n6|}IJX9_c-?m4Gjj*Ue zBSVpAIdZ1K*^y#94m0GqgsG>sdh{r9M2+C$hW&}NSJ^IzaZ`sEPAjCn!3B67n^;$< zN>+^)uPC(K?&u(T&%EVY9t@vgkt0 zt0uwW$zl@zDlxh0O<}+KPhm11oWf*mG(TUNpTEsd>{LeCV=AMZYyNs|Dt19S!zcL5 z8)-H8e5x2tpMXInIzz2#Vwx9KgQBXy;c22CiaW6=-c+=v55Z==JHs2ug>rwICf31E z=yVomi|N>YbcTV`v2WTL=1s>=RcCm1x|o8W1Lo)UbTQH!TOHUsLyUkXGsJRUP^t-9 zJIfDBqad6rnI(pym<=<;RQ!BDLu`njuzSQ7`008NOZhDPcm*|q`S*x5;PM<%^Mab1 zpf+S9gXhGsS6Poh`L~ z@+`3p2i!AD%;12bv&Fp}@c3-;Jr20(UNM&ghR(qPY>j=09qWTJ(+bB=N*YG*izu8h zY*td?@Zq?yJv9k;KhjbdY;?Qz3t#5gvs0dEsv! z#PNqEA}D!KT-4x(TG{OgpHVnr^wd$KCyY$OdjqByO-&j$jn~W}(I%tqtK=77!CiJw`4q{8!JhQdJ$*NY)MbnYfmb4A!%E8HC~!sKtZTtVqFrtS?p^- zmk)3NU?C^PABc5i4oW^1|KyTEb{`O9cr~tkA)Yii2|pYc`*9MW-6K=n zem~fCL7c&1P{zA3QAS57T@qj9&?xOCsF{f)mcq+oTYC%qrPhVDb6ts`UJ+wB2~Dnu zYs%((?(Gl-BCeJp`qY+?y0A0>9olnO#T{1B1hcfOP$8gGSR#Ccb9^DNthIDlI1TQk z&`*RPAvZpxP5J!Wr9YMkPq6n9Xy+mo*2RasE1ZGB2_ZYff5J@xf|NOBBwjc1Gfv3$ zFFgzO6GL)Ce`Yg=CC-;ie<~3+!oK+-pWr6f!kgkp!a0bl6OxXfwYS7W_(}Rx{2}zm z5?tNVs2jllX=WTh!K7qqzn^g8-;6LonFg@0Au4ko<~0i035Sn`x-nwx-c}GwFO-!3 z3)c&B6Q!NPPmo!G2?}c@(HJL->{DKlKJep?$X1;4Qwa`=WXKGasMa2WwYYm$xCqHv zAv>#HvLwGm-CTO9L|6_&l=Pl*8MnNaZinmrLbmr5O0Q5_xesk(h0<%NWo+qHBv3ny zD;i%kVH$-Yf&b^PNK&Qrx&?+8d}t0w>Fv@hkhvt}8mjfTfvLCzdtK6pf)AKh6M+|) z{j_r`+qV%5F^xk$MuufE(h1|ol5#(r_J%#>q`gQxzdU|?mI?{CTEma?7{XO0(28rS zG7Ecf%_GrBR;B(&nqtWiOMNAyk+)==s?VY;Zh-Lwr_*5R)IF)L;DBX6hJGC^1#cOq zW%wuXNI6>j?xdjAyt+Wm`pjIs9%$i~DaE->k;xfU2!rC=nar?5?MRd1@-n zey>W2aD76^CtlfAOxb}Z{JcZiCcM;{nQ&(pYie5FF*SR-F}B6srSELVuy&zvmpmDjEvUinF13q^O81^4GkaY7cnk|)LE=U^Ug_soLJc~T61 z!uqgZDSg&xWM?8^i`+gGZNz#V<1I{5jiuatzJ3jL%u`03eCs*j)Ieo}4x ztT#VLOkhbrDHVY!{iR6!WSO6${!*OMm3H`bINc{S3U<2m5SY|O){$m!f2ju!9Wzhh zoOhdisZm%~@EC?J$fQ83g40D+2S|fpbG|eTrVo(HM_33wUE4U^WtZs`q-$bNq{DhvL54;W+#M_%x{}d_P)>3b(Nl>z%Q+tfph6!S>d#fKSnGGZM|& z`lWd|l~+1O>c_=6Vyv`)1Ku1fJ#QN?>$tFatE1zjT#m2Vcxf01d~Lk6kpo&1dU=A> z;?6WV=5*QaiPAqoguY?)-;<=sJD7eLGZ!uoCBoIeaL?%R$x>vHAUc$aDhzD{Fdciy zQ>REZI5ZmwADV)7-ijiBO~q<%g@SLAlMI?J)e6RYCNGy+nMmqA(u^`{6y|AKE1cr~ zd8X9G$_H2~cW^*7emY!UB!)nj*-|ElUNu{~p93y^K}vy1wL+7V~ILvF$OW$xnv=a|R8MpW9XCWs*{IiptH0pl)uorEQ>ix20(S|-;X5F> zs8GXZ!@%{;(hmDw1|3m!kp%kA(z4)2Lq zi^HdHf>9=O={9UPyF%o4DY6=sfrODkg!qm-i=_urAmP{m!e|R&DkEHH622Qim=HvW z53Mu8$+51AD!!@CeuV6hB3U9(f%-w@xdpg*!fcADWD6>tF%L#&&7*w-xE|vQ_ok(h zh2Bi`W~9foe1;z{Ve=ruo@Sy~?qqaP`0>(ZSm;dcb9YKLP~armY+7T)VV_5qN&WAzZ)z1{wvv>b zAo;p7@Jlah3N$+Aj)yisNC|N1duhA9pdkq^1CQVP^NXH(P zeo87Y+M?k8GuSr_%mivCCa>d9(idgO%llbs9-IqaE;w*bT52zE)p=>OY()`_>JQsk z`jQFPrRT+{fEgs*8-}~gr2QXLKR#;uP`0M1HQR-UVM_4a%FNNB@o@Bp%vz&nKyJ41O+{A9otVHA<6X5!g3Pu8E&}(iq9AG&vrB?Maj4 zYI@YE?cMq1c|fqBcQ#8X2o2KkcYAhGw=TKw$OZ+_FM1C4St(r2DznU^3JDSOZ5LmUj{26}EG?!Q4XI2ZjEq>l@ zA!p-9Zz=c2&)}AFAN;)CQl5gJ+O6b#{M_G4?vJ12t>hN?iD)h7;b&rNxfg!kZ!HhR zPjnkbGP{l3H_Vg3M;(qqQg=7bJ5-jl=?2kkNX?L2A@PI^IRihNGnfLuX2=ckS3;(o zj-P?%=ZQ=?4S#)L{<@VZH^E;G+R7d9GqbJS20z={%I)#cJNF5rx!)SW1G96qJxkm;a)*(-Ww7}8mm)a*bpPj{AMhm>x2#<(3dcsWTU zCQeBz8a;`9u zj7nMZMEoqwVnv5!$=&eMd%3IpF#->EmCp!0U~9IVgTI7sSjBq5Q{Cjj`0I~u@+zS> zEbA`U$6qWe27{oy>h zIt}1m8k71dyCPcUMK*c-|WRwTD`a251*!-(VOwE>McKuljeN6gGcf( zQ3_KRPQ~E%kZV0;H%^nuQK*34M;?VIUg%~~{PkELEagMU!9Hlwa8`U+_Qu9J@bF@s z(3<4*lM4m!4hE0WLi4fu6hdykoaiZXPFiy7!mIi6B@Y5+?;aq(7?vH-x4{OIOdg0@ zSfPN>25>UPs0cM{YvthjAbGDHO)|MMSl(*Oo(zam$d5zhPs+g4z7e@NRG#WY-GpO! z?rC|Ed<~PhaD@DlvvRhiI7;WcOMj#Luz$zfxp7hsk0NG_mcO;CLK4QvHN`5Hq?yxf z_`1Q7d*u3Xtv1ffJw9H3f@4maAlKkjB>5BN;~W$an*PeBX|ez*` zp4_=C{U?n@f4$|+P#N-y<>6&f?e$UpT`WIm8?PUzU&|<1ng83*>%f5o{TU zHA=fr9?eBC|2~`Qfk4mR=#YhSeX{X>?3UPZnnVPN&Xs|ulOCk;L-L#6ib85WDvuT` z(e^busDfx%K~^u4Np;)eU^rb)oU!;DCNGt1!>YydcB?+5a0&KaIB30P@>mWE2<-!h z2WTpBJ}KjU`er32J(tV(2{yVZsN4A!^21i?Fn^`|mL0G;%mw*3D~1$5CC~I40+ODQ z5244n{fzvzVCOMh80jyo~nI^qc6zCya0rzlV@L% zLwJU5>*a@?RxyzCntV1QFt@PoJ2Y%6@a#NxVz$14IhA@rj)9f0%cD5%kd5*j4*1kY z8zZM|lAq-$k8P4~bHL24atf)q#l|NBq8w9ZXirW?6wzyZMp?HTK9Iizldc-Hy8*$zip%jmjM-v~)P) zovbHW18)OpSz3xOcTxb(G9tjSn07{%<1+Y4HNoxh4+2}2J#@T7WY{B&3Bd^PAqBlE ztdG)TA`${sh!a}j@u+Xrwr)oo`1}Jo78dQ1ql4^9TdH^W$nOUMX-k#n)_1{`uXO|R z_Q`{+XtHk~E~#Z89 z<2Sh>)cIIm!ZFT&M@@!FLo^Bg`dI#(Lx=q(?=uh8eEO-4mw=MbY<%0k{qk#^q>SUZ zq4CuN^2_#^MU{0Gp8i9A970-(8YCW~!@c103QPo>aoTf8o@zyt%+KW&&TtD8E#!cU zPf1Yu3wex{2Qc{!pyUP)-_Cwv(}BRONhbGvDGRo_=Glmi+o5Wi6ZgLrYPE>`wfv~W zMTC-Y?eqyvB1ewOI4@*TlU)BnZpuNS+}~OXWZaK)Y-3N!$I4FIsZ(-1Y&b2qx5}l3 z3-kAiS{t@pmUS5TqmA#}dse;%XU@nYIBtgNe3tJL5X5v8YFSd@^OfbXs<&oUnw}Hg zE58m`M;IEM_(fjF#lbAI>zsU^!_dOFa=fIGc^BkLd=8*-8p78X<)=ADmS{XxqQgU% zag4q9q+5Z~i`dA>m*tlB)XX|a{T_#=T9AmVa=9`z7<)~Agkxew)nBHUt_)S+v+Ht} zeIK5-Egf-nuJ^BH1HQnD3m*oZQLA5NnTkGSG{UD6|Nztkqw32yK&HxBr4zC zSWICoHUXduB7l9BXlw3Jf_u$ORKd+ z7*a{$$7hVDW4o9L+@u`G8=R(f+ZYj5j#m%wX^Oim;#(Ok9y z;>`w*v`JGmUIT_Nw@0fB8LbsJ44R<2Nmz4bmsoA|xN%8Sie?l|p~np@O@v=8V8-K` zOlu{?$NL%I0k>a(8e(7YgKt=O?!pQ6|$*=QkRGR(ouPZ z7e&oP4s=nvySP{;_f@JT~xHYpjZ;ASZ+L+)^;KgU3}k5DRcP$-$9 zOdwrHE4O8<7=~igGoMaW9T!(uMD$FC-q*iu?^Y%qB4(<389ObqU89?%6?~=o#`WQDGTYTas{$BDEq8Y0*YBg z6Qn>!mL5m24IHPGL6nbcF2~Id@|i+V*j(PeR0A?( zw_-Ec()I-?R|lTns}xuxCP*`c7s@zO2Wxn_%6kguZOPvEm03I!Lc6l2fxw4~&N(7L zd{3IZ&tU(je9w`hyRsZ6OFpx!Fbt0gT>|5dtI_b~0fnF0?|x9>`-BMWM%EruzUNh@ zC_q#yJD)>BjwrM5Kt#g7R6gJvOs|k81QXZ#4*X{M#nf#j7r$5V_7ICp1Fxi1py?!? zPbz6*5j2kwsD3goa>*1}N%4$2t7PQjvGh2)?dN{76PMU%3wD6ZrCHD$f z0iF9gc>5L~13?)@RdUNE4D7J&Xf3w|k8_>s9Uh83sP zV`WD`6sOv&4E@-;)AORrPu8)xK~hWX1UG}@vigS|Cf#faYpQD1GNNP#pRbjraq3J% zrL9O9yrru}Tol(Ut5Kw#q1sdoM73w#19IG@@*P@WcozGt5cP#LPvsw~o`hT5PE)-9c}F7B_X^3xw|w)FMsN-cUPQX(wP$LY>qF*cb^X2+^{ zKZ~_iEJ;v@lBEx77X@gapzE^17&j6$! zz4AV-K3UpI#cKs@#4$7=I-aCtsGr)?kV$P-g_k}t2Mg#g?d_^DMM3vYnhGCvvT;pl zrjal|LDOK#2CW`^)miP&DaTA%+(q4GkHMVBZU0onjx6&g977Xx9K=@)sdaHx@$h`(hz%_DQfy(Qn^1WgU&GKv&&m%p7lX92)s*iEe`l!jZergv!##sZ^ z4rEcj%5Qxkh{FA2)&f;-i24ESC{X#a6k=2^0+LXuw&S5QhpL@;=%HaMo{O`@NGcbp zt%Pb8sAsL#&DKhx+%nUdq`|IdlzGr`B<}*rmXYdxT)&xQj#cmHpg1I@T{r&1_dlAtOsO#-8 zBcRnnm7CKdDEC`lO_sp!5357$BoT9Je&!?Ucsuk+81SgdZwA1KM#5u{sr)1s!|Zrm zz28pS2pGIZ8A>WHR$Fs*fuOZ*hH5Mi*2dwUeVl0O1M8nq-{2%Onk7zbu5av<IbxHn?S zzZ`{*|L{vHv2p?voUs6nm->oLP9u5%>AhaXQ-T(!0b^fNhrp1jxGpmm15d?jyN277cm)5u8WdvP-RDOXpiTQ6YOb?~lmJ-8P;d)_$ty z!@!DKcj&!WeTWlG*AakKlj{3aem)7g`_TOXczfx4Y80PD#OJY*_m>~2coN2%)0CY& z{E=$27Q!TZJ!~5E{ZwskWhY3JY#V1E^VB7J*LpDYfXWX;sa|l;K{eAVliDMXPL|h! zjG;Ia*Y%Lf&#^EXTtiae!Ra^%$En-eF!pnmp8!C@KFoR~;jrEKiwXMdh}z0t4II=d zF!>7=?9r_MGwDn9QF}Dw9{v^ICnL?jRx9(FQSgm=(kh8``&RvvCq-yWvh=9hk+(jg zTAAx}i9e`&c-C=e)s}2rNhc>hfZHe33~Qu-G_9xukjUdFRhuo26i?cnR&8c=nRw=- ztDaFiaOx4npXQa?cmbOox>ygmSU(6Rexxa+bx&=v0Nc;24LSXgd<;G_gPrQ*%hCN! zyP(#!qdCX{yIsX$1FnMCrGr2fDt1+?LF-Fu7mkoAWNu)XgQsf!!=N`VtDWtsaXFk@ z+9w#{P0k2lCijpouUw;b1^qX*jh)Cbu%sKN?$h7YMs{fI)qCfnY4fA3d|knPEx+3g zGFYm&-mvLl<=#}!aIz8DiQTjf~L3CH|;n(LdHKf ze$3BUB5Ls~PvGLognw{aWn+oG)}C0PROME_!7po+94ISH(DW#^DV0735x3E3!3OC(>BgL|arxbBi_#i6_L+PThfs zAkijUd?!Hpbw@KUdVxTrBdQsWy5 zhGreB1GU{T&?idk!4*hGb0JFWV~4rT0hun#t808ul?i&ZhK(TPIc*h0PS(`g@JU5z z^OenTpt?9#<7SqCV(CnR0$UonVjv|>OSQ^{oLX8N*chihX~hu4xVYj=Mki_qxqKiU z>S$LvC@f3T(n&-#mO$v2r11_H@zbo)Ql_Tx`B8LZy_2rbLtc*eo_m;R|Ax2^RncYBhig4 zt&6J*uXfbyw-d3G8etweC1TE7?!!uoMYBeJqf=wsP&9X5B zL$h{qVFM$UB?)j6DQ@LrTm`@0Rpa;XQ1yyvOWVX=an{Le(OrAm4qXIYa+z6r05=bAo~PAf8(StmuCX&@;jq7lHiZ+gxv%yp`6gHUl`rlTWlkuL z>Z@@(TL_|U))^4`F6`*9723uGL-Y_8cIIpR4mTDX9%dP7$G8N(9;oq??2L!*&mqQO z?IpgjF+6Pms=1)|7#rV9(adRtbyek+W3~32Is9?$7^{6?haN_*jni_<(9*l|d_?ctI^LRJRqW1S{{Fs2DS!KO+ zuf{DSm~yQSX0A=I1?AX`nh^RHedR%hwZE&_>)5E&gPd%f5^ycBX|nv(hYsVNp2hcR z`#2MvK7}5j#$v4(91O?46n*P}M5Su)3Gl)~jhi+GFZunn7+2S8Zig?k^HNkK1^eCBR-w0;AiwQhTAyNK86B?~4c9!k^OkY2#pl0a+8fO5^8+ z7`3;!KS!L;;49;HagTtR&)U>aWFKLA6*dOmyIOnR%1w~wXN2=Y+Mv$X;VRoH>aGCgTpWdMnXL0EaEHX~kI3$0Um6W@`f3F3@yRfJ5~qS?&pFdY$<066DX8{U3{@4ykH*~ym%guV@_?_#fS`P&+| z^9z_@tm(BO=Ly_ach8$zH*?kE>^s_r_NGEllR!^e^kmJ>)7xyCM3nlLIo*tB8D`ol zW#WOJb)f3;!#|%4vldL=rTt*1&szj7(v2He(F_<$4!x%>;9L(G{Gpb_GaxizDq8zg zi{qm6k$63~4x2yKYTDBI+yhRaex|kKXs&+~?EmVn*T%q}12!I+QL@d})Qv(rKUT;n%cpv2*DH5I$WH3?Sg#kFu?kaO5xqG!8B##}sYIN*p) z6U5ZRLOswm)d`yeuHqtJn_4T2?{KMe+*#;lm7P zm2tCoBFHGi1x~_+AC#75PCyv0%v~H8U#`J z&X?l}!16b=M)Xcy1xEa?jkhN&9|BwH+e&x|?|7JZLu+=ICfES?-_%ZUX`A$i#&@~c z9c&x^v`IBP4E)bPeDCh}zcl^^0D4;WM{67ePXl)2bCR9iT>6hzY^C=e^2Hus&l0<_ zAUj#fh6mCNcif7KI@cw6d!63cskFu$i|FCg4xx|1UQMq@o)q;l!HUqs-ELXu`w=r` zopT8wDEd*`6S!ec{e9S?>TS5RWR}MxRJ%01V!4^7^Fx6pn*I#OgNLWnsKN$J({+A$ zy0wZ|q|?xOpUkX7kHEomhJKS1{(?*AEKcz3xXnPC6$5rNLmRw}5l)8Mq>nvD#c1Y) z*(lS>2u*=&?QxDXqY)0cT9nhdX%1i}+EPxxkJA+~=Qtpm%yV3QOa*rho@{@W zL^z&}h6Sa1tvc+Gv_LOHz_ZeLPeBcl-iF}4n2Ftl70VFp0t1SK+g0_^_I2KK;uUx@lcm5^7fhfICLwny# zuUoi_WKday6-WH$|%Y?`9z4NJ<@czezZJCQDxhtkx8Rx?2JLI=+;lmaTT`!IMpMM+3CxPo`3C%*7=3pI z(_yjLFi1-UEhTaAYAhcqWX9|1=DjIR<8*%26VZ*yM{zp8C5j-*=8y(uze^Iv6tTb@ zTjbQ!`KA9LIsEDndsvk1anY0XQNa$Ls*d=4I8}su5KkuSukd)U_@B5$BW8g)iW%8J zf8HL=?q*osQ0KR=B6lM`HmWVbBcr7}3T-?9RyNhS9xy>BesKqw*>H!eMn<&IU+3fz z#M^XXDHr*)jc&71-D`<>zzmBgXWHt6_zoh|vUr)A1mAYh`3=xaDOQelbkzCrdvFwH zfxF#FpTHTH7C3gU6VHUKgIQhle2xTV4K#O{vQ>nUS^6c8hM9Y3SKa13AxlX2ZZ=IU zV&3H>G4hOAcuC2j?lwFzIXb_I5P`|Cw-4_5{yj%u&WU7bwy^wZ5B)_en#{@7`3+FO zm`?3-)drU8-+Su2tehSidXxCCz4R4vww{_kbd_kfJk%?0=&e6$Pgo(uO4x`EoA6

OOj-yX7pwH=Wr7rDu90d)K~t&ji~z!`-y$ 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

})GVuCxixjvv#TZuE0yITe0AVf; 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 vp3+fP1=AYkY%%y?;C%kHxh(C!5Oyg}QRee! Date: Fri, 21 Nov 2025 14:36:20 +0900 Subject: [PATCH 02/36] bump go-corset to v1.1.28 --- go-corset | 2 +- prover/go.mod | 2 +- prover/go.sum | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go-corset b/go-corset index 93c23f2395..fb1aebd7f5 160000 --- a/go-corset +++ b/go-corset @@ -1 +1 @@ -Subproject commit 93c23f239542f79c1db60eb5b8250ab20e30f046 +Subproject commit fb1aebd7f532e8940bc18feeedf3600d4bb5006f diff --git a/prover/go.mod b/prover/go.mod index 6a7843a772..407012b7db 100644 --- a/prover/go.mod +++ b/prover/go.mod @@ -7,7 +7,7 @@ require ( github.com/consensys/compress v0.2.5 github.com/consensys/gnark v0.12.1-0.20250501002417-facdd9882b80 github.com/consensys/gnark-crypto v0.17.1-0.20251006135912-abd34dcc6005 - github.com/consensys/go-corset v1.1.23 + github.com/consensys/go-corset v1.1.28 github.com/crate-crypto/go-kzg-4844 v1.1.0 github.com/dlclark/regexp2 v1.7.0 github.com/dnlo/struct2csv v0.0.0-20190928115744-2f584471b24e diff --git a/prover/go.sum b/prover/go.sum index a72956cd14..28fb91f0c5 100644 --- a/prover/go.sum +++ b/prover/go.sum @@ -80,8 +80,8 @@ github.com/consensys/gnark v0.12.1-0.20250501002417-facdd9882b80 h1:JwI7un1xgbRM github.com/consensys/gnark v0.12.1-0.20250501002417-facdd9882b80/go.mod h1:+EaICVL6Ks4qCnIYBa1biEaFBxqaPjyl1w11O7le3Nw= github.com/consensys/gnark-crypto v0.17.1-0.20251006135912-abd34dcc6005 h1:hLawixMM6FMv9r0XYiktR4n5DzqCRYngUfl7biPhy+g= github.com/consensys/gnark-crypto v0.17.1-0.20251006135912-abd34dcc6005/go.mod h1:uV1HwfBwGRj50DGK3LbDLeCvq0RX/vFXST3CRSAu0Fs= -github.com/consensys/go-corset v1.1.23 h1:KAT7I/L7zFWE18SDYC9ArvX12B3yLO7OCRmhQzCI4I0= -github.com/consensys/go-corset v1.1.23/go.mod h1:vIZh7T0k/hmDd2Aj73XJb/FaQedZB3BCcv3CUX9c9DQ= +github.com/consensys/go-corset v1.1.28 h1:4vaaIFAWCzEgGTz6YGm8rt7+0F6mHDT8DS2u+WWslFw= +github.com/consensys/go-corset v1.1.28/go.mod h1:vIZh7T0k/hmDd2Aj73XJb/FaQedZB3BCcv3CUX9c9DQ= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= From 7aef551f2a6b48710a17d66f6934f707d00c73f9 Mon Sep 17 00:00:00 2001 From: gusiri Date: Fri, 21 Nov 2025 15:49:34 +0900 Subject: [PATCH 03/36] add new internal moduels and missing limitless advice for Osaka Co-authored-by: Bogdan Ursu --- prover/config/config_default.go | 32 ++++++++++++++++++++++++++++++++ prover/config/traces_limit.go | 17 +++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/prover/config/config_default.go b/prover/config/config_default.go index c2369adf8e..2e115df4b7 100644 --- a/prover/config/config_default.go +++ b/prover/config/config_default.go @@ -185,6 +185,22 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits.U24", 131072) viper.SetDefault("traces_limits.U23", 131072) viper.SetDefault("traces_limits.U20", 131072) + // Start of new modules for Osaka + viper.SetDefault("traces_limits.BIT_XOAN_U2", 131072) + viper.SetDefault("traces_limits.BIT_XOAN_U4", 131072) + viper.SetDefault("traces_limits.BIT_XOAN_U8", 131072) + viper.SetDefault("traces_limits.BIT_XOAN_U16", 131072) + viper.SetDefault("traces_limits.BIT_XOAN_U32", 131072) + viper.SetDefault("traces_limits.BIT_XOAN_U64", 131072) + viper.SetDefault("traces_limits.BIT_XOAN_U128", 131072) + viper.SetDefault("traces_limits.BIT_XOAN_U256", 131072) + viper.SetDefault("traces_limits.BYTE_16", 131072) + viper.SetDefault("traces_limits.BYTE_32", 131072) + viper.SetDefault("traces_limits.BYTE_64", 131072) + viper.SetDefault("traces_limits.BYTE_128", 131072) + viper.SetDefault("traces_limits.BYTE_256", 131072) + viper.SetDefault("traces_limits.SIGNEXTEND", 131072) + // End of new modules for Osaka viper.SetDefault("traces_limits.PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS", 0) viper.SetDefault("traces_limits.PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS", 0) viper.SetDefault("traces_limits.PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS", 0) @@ -335,6 +351,22 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits_large.U24", 262144) viper.SetDefault("traces_limits_large.U23", 262144) viper.SetDefault("traces_limits_large.U20", 262144) + // Start of new modules for Osaka + viper.SetDefault("traces_limits_large.BIT_XOAN_U2", 262144) + viper.SetDefault("traces_limits_large.BIT_XOAN_U4", 262144) + viper.SetDefault("traces_limits_large.BIT_XOAN_U8", 262144) + viper.SetDefault("traces_limits_large.BIT_XOAN_U16", 262144) + viper.SetDefault("traces_limits_large.BIT_XOAN_U32", 262144) + viper.SetDefault("traces_limits_large.BIT_XOAN_U64", 262144) + viper.SetDefault("traces_limits_large.BIT_XOAN_U128", 262144) + viper.SetDefault("traces_limits_large.BIT_XOAN_U256", 262144) + viper.SetDefault("traces_limits_large.BYTE_16", 262144) + viper.SetDefault("traces_limits_large.BYTE_32", 262144) + viper.SetDefault("traces_limits_large.BYTE_64", 262144) + viper.SetDefault("traces_limits_large.BYTE_128", 262144) + viper.SetDefault("traces_limits_large.BYTE_256", 262144) + viper.SetDefault("traces_limits_large.SIGNEXTEND", 262144) + // End of new modules for Osaka viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS", 0) viper.SetDefault("traces_limits_large.PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS", 0) viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS", 0) diff --git a/prover/config/traces_limit.go b/prover/config/traces_limit.go index 177d01ba57..f7fe10cafa 100644 --- a/prover/config/traces_limit.go +++ b/prover/config/traces_limit.go @@ -125,6 +125,23 @@ type TracesLimits struct { U24 int `mapstructure:"U24" validate:"power_of_2" corset:"u24"` U23 int `mapstructure:"U23" validate:"power_of_2" corset:"u23"` U20 int `mapstructure:"U20" validate:"power_of_2" corset:"u20"` + // Start of new modules for Osaka + BIT_XOAN_U2 int `mapstructure:"BIT_XOAN_U2" validate:"power_of_2" corset:"bit_xoan_u2"` + BIT_XOAN_U4 int `mapstructure:"BIT_XOAN_U4" validate:"power_of_2" corset:"bit_xoan_u4"` + BIT_XOAN_U8 int `mapstructure:"BIT_XOAN_U8" validate:"power_of_2" corset:"bit_xoan_u8"` + BIT_XOAN_U16 int `mapstructure:"BIT_XOAN_U16" validate:"power_of_2" corset:"bit_xoan_u16"` + BIT_XOAN_U32 int `mapstructure:"BIT_XOAN_U32" validate:"power_of_2" corset:"bit_xoan_u32"` + BIT_XOAN_U64 int `mapstructure:"BIT_XOAN_U64" validate:"power_of_2" corset:"bit_xoan_u64"` + BIT_XOAN_U128 int `mapstructure:"BIT_XOAN_U128" validate:"power_of_2" corset:"bit_xoan_u128"` + BIT_XOAN_U256 int `mapstructure:"BIT_XOAN_U256" validate:"power_of_2" corset:"bit_xoan_u256"` + BYTE_16 int `mapstructure:"BYTE_16" validate:"power_of_2" corset:"byte16"` + BYTE_32 int `mapstructure:"BYTE_32" validate:"power_of_2" corset:"byte32"` + BYTE_64 int `mapstructure:"BYTE_64" validate:"power_of_2" corset:"byte64"` + BYTE_128 int `mapstructure:"BYTE_128" validate:"power_of_2" corset:"byte128"` + BYTE_256 int `mapstructure:"BYTE_256" validate:"power_of_2" corset:"byte256"` + SIGNEXTEND int `mapstructure:"SIGNEXTEND" validate:"power_of_2" corset:"signextend"` + // End of new modules for Osaka + // reference tables Binreftable int `mapstructure:"BIN_REFERENCE_TABLE" validate:"power_of_2" corset:"binreftable"` Instdecoder int `mapstructure:"INSTRUCTION_DECODER" validate:"power_of_2" corset:"instdecoder"` From 93a05ba68ea943f1f1870c9c41ff504d2f959871 Mon Sep 17 00:00:00 2001 From: gusiri Date: Fri, 21 Nov 2025 16:42:59 +0900 Subject: [PATCH 04/36] add new module limits for the test suite --- prover/config/traces_limit.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/prover/config/traces_limit.go b/prover/config/traces_limit.go index f7fe10cafa..ca9449902f 100644 --- a/prover/config/traces_limit.go +++ b/prover/config/traces_limit.go @@ -330,6 +330,22 @@ func (tl *TracesLimits) ScaleUp(by int) { tl.U24 *= by tl.U23 *= by tl.U20 *= by + // Start of new modules for Osaka + tl.BIT_XOAN_U2 *= by + tl.BIT_XOAN_U4 *= by + tl.BIT_XOAN_U8 *= by + tl.BIT_XOAN_U16 *= by + tl.BIT_XOAN_U32 *= by + tl.BIT_XOAN_U64 *= by + tl.BIT_XOAN_U128 *= by + tl.BIT_XOAN_U256 *= by + tl.BYTE_16 *= by + tl.BYTE_32 *= by + tl.BYTE_64 *= by + tl.BYTE_128 *= by + tl.BYTE_256 *= by + tl.SIGNEXTEND *= by + // End of new modules for Osaka // beta v4.0 tl.PrecompileBlsPointEvaluationEffectiveCalls *= by tl.PrecompilePointEvaluationFailureEffectiveCalls *= by @@ -486,6 +502,23 @@ func GetTestTracesLimits() *TracesLimits { U23: 131072, U20: 131072, + // Start of new modules for Osaka + BIT_XOAN_U2: 131072, + BIT_XOAN_U4: 131072, + BIT_XOAN_U8: 131072, + BIT_XOAN_U16: 131072, + BIT_XOAN_U32: 131072, + BIT_XOAN_U64: 131072, + BIT_XOAN_U128: 131072, + BIT_XOAN_U256: 131072, + BYTE_16: 131072, + BYTE_32: 131072, + BYTE_64: 131072, + BYTE_128: 131072, + BYTE_256: 131072, + SIGNEXTEND: 131072, + // End of new modules for Osaka + // beta v4.0 PrecompileBlsPointEvaluationEffectiveCalls: 0, PrecompilePointEvaluationFailureEffectiveCalls: 0, From 62308c09eeb0948add05ac72c2bb6d58cf9d2fdd Mon Sep 17 00:00:00 2001 From: Bogdan Ursu Date: Fri, 21 Nov 2025 09:01:05 +0100 Subject: [PATCH 05/36] feat: fix public-input support for conflations without any user tx (#1713) * feat: fix public-input support for conflations without any user transactions * minor(logs): adds info in the panic message when finding two global constraints with different domain size * fix: panic message for local openings on verifier cols * Revert "fix: panic message for local openings on verifier cols" This reverts commit 9551e4bc4592a98604f0e701c16b45a7257af0cd. * fix: make NBytes chain id not be a verifier col * reverting config files * fix: missing limitless advice for new ChainID fetcher --------- Co-authored-by: AlexandreBelling --- prover/protocol/compiler/globalcs/merging.go | 2 +- prover/zkevm/limitless.go | 2 +- .../execution_data_collector_test.go | 6 + .../chain_id_fetcher.go | 76 ++++++++++ .../chain_id_fetcher_test.go | 44 ++++++ .../rlp_txn_fetcher.go | 37 ----- .../rlp_txn_fetcher_test.go | 3 - .../zkevm/prover/publicInput/public_input.go | 11 +- .../publicInput/testdata/blockdata_mock.csv | 130 +++++++++--------- 9 files changed, 202 insertions(+), 109 deletions(-) create mode 100644 prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher.go create mode 100644 prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher_test.go diff --git a/prover/protocol/compiler/globalcs/merging.go b/prover/protocol/compiler/globalcs/merging.go index aaf49cb819..f3ed9aeb0d 100644 --- a/prover/protocol/compiler/globalcs/merging.go +++ b/prover/protocol/compiler/globalcs/merging.go @@ -78,7 +78,7 @@ func accumulateConstraints(comp *wizard.CompiledIOP) (mergingCtx, bool) { // This enforces the precondition that all the global constraint must // share the same domain. if cs.DomainSize != ctx.DomainSize { - utils.Panic("At this point in the compilation process, we expect all constraints to have the same domain") + utils.Panic("At this point in the compilation process, we expect all constraints to have the same domain, cs.DomainSize=%d, ctx.DomainSize=%d, cs.Name=%v", cs.DomainSize, ctx.DomainSize, cs.Name()) } // Mark the constraint as ignored, so that it does not get compiled a diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index c326200bef..cbddaae852 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -299,6 +299,7 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_ROLLING_MSG_EXTRACTED_HI"}, {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_ROLLING_HASH_EXTRACTED_HI"}, {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_ROLLING_SEL_EXISTS_MSG"}, + {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_CHAIN_ID_FETCHER_N_BYTES_CHAIN_ID"}, {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "BLOCK_TX_METADATA_BLOCK_ID"}, {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_TXN_DATA_FETCHER_ABS_TX_NUM"}, {BaseSize: 16384, Cluster: "TINY-STUFFS", Column: "STATE_SUMMARY_WORLD_STATE_ROOT"}, @@ -306,7 +307,6 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 32768, Cluster: "TINY-STUFFS", Column: "TABLE_rlputils.MACRO,rlputils.comptACC_xor_macroDATA_1,rlputils.comptARG_1_HI_xor_macroDATA_2,rlputils.comptARG_1_LO_xor_macroDATA_6,rlputils.comptARG_2_LO_xor_macroDATA_7,rlputils.comptINST_xor_macroDATA_8,rlputils.comptRES_xor_macroDATA_3,rlputils.comptSHF_ARG_xor_macroINST,rlputils.comptSHF_FLAG_xor_macroDATA_4,rlputils.macroDATA_5_0_LOGDERIVATIVE_M"}, {BaseSize: 65536, Cluster: "TINY-STUFFS", Column: "txndata.rlpTX_TYPE"}, {BaseSize: 131072, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_RLP_TXN_FETCHER_NBYTES"}, - {BaseSize: 131072, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_RLP_TXN_FETCHER_N_BYTES_CHAIN_ID"}, {BaseSize: 262144, Cluster: "TINY-STUFFS", Column: "EXECUTION_DATA_COLLECTOR_ABS_TX_ID"}, {BaseSize: 262144, Cluster: "TINY-STUFFS", Column: "CLEANING_EXECUTION_DATA_MIMC_CleanLimb"}, {BaseSize: 262144, Cluster: "TINY-STUFFS", Column: "EXECUTION_DATA_MIMC_TAGS_SPAGHETTI"}, diff --git a/prover/zkevm/prover/publicInput/execution_data_collector/execution_data_collector_test.go b/prover/zkevm/prover/publicInput/execution_data_collector/execution_data_collector_test.go index 9f77a27475..eebc2d9a05 100644 --- a/prover/zkevm/prover/publicInput/execution_data_collector/execution_data_collector_test.go +++ b/prover/zkevm/prover/publicInput/execution_data_collector/execution_data_collector_test.go @@ -25,6 +25,7 @@ func TestDefineAndAssignmentExecutionDataCollector(t *testing.T) { timestampFetcher *fetch.TimestampFetcher txnDataFetcher fetch.TxnDataFetcher rlpTxnFetcher fetch.RlpTxnFetcher + chainIDFetcher fetch.ChainIDFetcher txd *arith.TxnData bdc *arith.BlockDataCols rt *arith.RlpTxn @@ -47,6 +48,10 @@ func TestDefineAndAssignmentExecutionDataCollector(t *testing.T) { // constrain the fetcher fetch.DefineRlpTxnFetcher(b.CompiledIOP, &rlpTxnFetcher, "RLP_TXN_FETCHER_FROM_ARITH", rt) + // ChainIDFetcher + chainIDFetcher = fetch.NewChainIDFetcher(b.CompiledIOP, "PUBLIC_INPUT_CHAIN_ID_FETCHER", bdc) + fetch.DefineChainIDFetcher(b.CompiledIOP, &chainIDFetcher, "PUBLIC_INPUT_CHAIN_ID_FETCHER", bdc) + limbColSize := GetSummarySize(txd, rt) edc = NewExecutionDataCollector(b.CompiledIOP, "EXECUTION_DATA_COLLECTOR", limbColSize) DefineExecutionDataCollector(b.CompiledIOP, edc, "EXECUTION_DATA_COLLECTOR", timestampFetcher, btm, txnDataFetcher, rlpTxnFetcher) @@ -58,6 +63,7 @@ func TestDefineAndAssignmentExecutionDataCollector(t *testing.T) { fetch.AssignBlockTxnMetadata(run, btm, txd) fetch.AssignTxnDataFetcher(run, txnDataFetcher, txd) fetch.AssignRlpTxnFetcher(run, &rlpTxnFetcher, rt) + fetch.AssignChainIDFetcher(run, &chainIDFetcher, bdc) AssignExecutionDataCollector(run, edc, timestampFetcher, btm, txnDataFetcher, rlpTxnFetcher, blockHashList[:]) } diff --git a/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher.go b/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher.go new file mode 100644 index 0000000000..2d2ff4c17a --- /dev/null +++ b/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher.go @@ -0,0 +1,76 @@ +package fetchers_arithmetization + +import ( + "github.com/consensys/linea-monorepo/prover/maths/common/smartvectors" + "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/column" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + sym "github.com/consensys/linea-monorepo/prover/symbolic" + commonconstraints "github.com/consensys/linea-monorepo/prover/zkevm/prover/common/common_constraints" + arith "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput/arith_struct" + util "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput/utilities" +) + +const ( + // ChainIDOffset is the corresponding offset position for the chain ID + // since it is a shift, -1 means no offset. + ChainIDOffset = -3 +) + +// ChainIDFetcher is a struct used to fetch the chainIDs from the arithmetization's BlockDataCols +type ChainIDFetcher struct { + // chainID + ChainID ifaces.Column // a column used to fetch the ChainID. The implementation is currently unaligned with respect to the number of limbs. + NBytesChainID ifaces.Column // a column used to fetch the number of bytes of the ChainID limb data +} + +// NewTimestampFetcher returns a new TimestampFetcher with initialized columns that are not constrained. +func NewChainIDFetcher(comp *wizard.CompiledIOP, name string, bdc *arith.BlockDataCols) ChainIDFetcher { + size := bdc.Ct.Size() + res := ChainIDFetcher{ + ChainID: util.CreateCol(name, "CHAIN_ID", size, comp), + NBytesChainID: util.CreateCol(name, "N_BYTES_CHAIN_ID", size, comp), // 2 bytes for chainID, we will constrain it later + } + + return res +} + +// DefineTimestampFetcher specifies the constraints of the TimestampFetcher with respect to the BlockDataCols +func DefineChainIDFetcher(comp *wizard.CompiledIOP, fetcher *ChainIDFetcher, name string, bdc *arith.BlockDataCols) { + // constrain fetcher ChainID to contain the value of the last block's chainID + // we only populate the first entry of the ChainID column + comp.InsertLocal( + 0, + ifaces.QueryIDf("%s_%s", name, "LAST_LOCAL"), + sym.Sub( + fetcher.ChainID, // first position of the ChainID column + column.Shift(bdc.DataLo, ChainIDOffset), // corresponding position in the arithmetization's BlockDataCols + ), + ) + + // constrain the N_BYTES_CHAIN_ID to have only two BYTES + comp.InsertLocal( + 0, + ifaces.QueryIDf("%s_%s", name, "N_BYTES_CHAIN_ID_CONSTRAINT"), + sym.Sub( + fetcher.NBytesChainID, + 2, // hardcode 2 bytes for the N_BYTES_CHAIN_ID + ), + ) + + // require this to be a constant column + commonconstraints.MustBeConstant(comp, fetcher.NBytesChainID) +} + +// AssignTimestampFetcher assigns the data in the TimestampFetcher using data fetched from the BlockDataCols +func AssignChainIDFetcher(run *wizard.ProverRuntime, fetcher *ChainIDFetcher, bdc *arith.BlockDataCols) { + size := bdc.Ct.Size() + var ( + chainID = make([]field.Element, size) + ) + fetchedChainID := bdc.DataLo.GetColAssignmentAt(run, size+ChainIDOffset) + chainID[0].Set(&fetchedChainID) + run.AssignColumn(fetcher.ChainID.GetColID(), smartvectors.NewConstant(chainID[0], size)) + run.AssignColumn(fetcher.NBytesChainID.GetColID(), smartvectors.NewConstant(field.NewElement(2), size)) +} diff --git a/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher_test.go b/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher_test.go new file mode 100644 index 0000000000..fe95665a8d --- /dev/null +++ b/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher_test.go @@ -0,0 +1,44 @@ +package fetchers_arithmetization + +import ( + "testing" + + "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + arith "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput/arith_struct" + util "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput/utilities" + "github.com/stretchr/testify/assert" +) + +// TestChainIDFetcher tests the fetching of the timestamp data +func TestChainIDFetcher(t *testing.T) { + + // initialize sample block data from a mock test data CSV file + ctBlockData := util.InitializeCsv("../testdata/blockdata_mock.csv", t) + var ( + bdc *arith.BlockDataCols + fetcher ChainIDFetcher + ) + + cmp := wizard.Compile(func(b *wizard.Builder) { + // register sample arithmetization columns + bdc, _, _ = arith.DefineTestingArithModules(b, ctBlockData, nil, nil) + // create a new timestamp fetcher + fetcher = NewChainIDFetcher(b.CompiledIOP, "CHAIN_ID_FETCHER_FROM_ARITH", bdc) + // constrain the timestamp fetcher + DefineChainIDFetcher(b.CompiledIOP, &fetcher, "CHAIN_ID_FETCHER_FROM_ARITH", bdc) + }, dummy.Compile) + proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) { + // assign the CSV columns + arith.AssignTestingArithModules(run, ctBlockData, nil, nil) + // assign the timestamp fetcher + AssignChainIDFetcher(run, &fetcher, bdc) + // two simple sanity checks based on the mock test data + assert.Equal(t, fetcher.ChainID.GetColAssignmentAt(run, 0), field.NewFromString("0xfefc0000000000000000000000000000"), "ChainID value is incorrect.") + }) + if err := wizard.Verify(cmp, proof); err != nil { + t.Fatal("proof failed", err) + } + t.Log("proof succeeded") +} diff --git a/prover/zkevm/prover/publicInput/fetchers_arithmetization/rlp_txn_fetcher.go b/prover/zkevm/prover/publicInput/fetchers_arithmetization/rlp_txn_fetcher.go index 4750f02a32..1bdb131a70 100644 --- a/prover/zkevm/prover/publicInput/fetchers_arithmetization/rlp_txn_fetcher.go +++ b/prover/zkevm/prover/publicInput/fetchers_arithmetization/rlp_txn_fetcher.go @@ -9,7 +9,6 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/query" "github.com/consensys/linea-monorepo/prover/protocol/wizard" sym "github.com/consensys/linea-monorepo/prover/symbolic" - commonconstraints "github.com/consensys/linea-monorepo/prover/zkevm/prover/common/common_constraints" arith "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput/arith_struct" util "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput/utilities" ) @@ -23,9 +22,6 @@ type RlpTxnFetcher struct { // prover action selectors SelectorDiffAbsTxId ifaces.Column // used to compute EndOfRlpSegment, lights up on active rows i for which AbsTxNum[i]!=AbsTxNum[i+1] ComputeSelectorDiffAbsTxId wizard.ProverAction - // chainID - ChainID ifaces.Column // a size 1 column used to fetch the ChainID. The implementation is currently unaligned with respect to the number of limbs. - NBytesChainID ifaces.Column // a size 1 column used to fetch the number of bytes of the ChainID limb data // SelectorChainID is a selector that only lights up when the ChainID column is non-zero SelectorZeroChainID ifaces.Column ComputeSelectorZeroChainID wizard.ProverAction @@ -40,8 +36,6 @@ func NewRlpTxnFetcher(comp *wizard.CompiledIOP, name string, rt *arith.RlpTxn) R NBytes: util.CreateCol(name, "NBYTES", size, comp), FilterFetched: util.CreateCol(name, "FILTER_FETCHED", size, comp), EndOfRlpSegment: util.CreateCol(name, "END_OF_RLP_SEGMENT", size, comp), - ChainID: util.CreateCol(name, "CHAIN_ID", size, comp), - NBytesChainID: util.CreateCol(name, "N_BYTES_CHAIN_ID", size, comp), } return res } @@ -53,35 +47,6 @@ func ConstrainChainID(comp *wizard.CompiledIOP, fetcher *RlpTxnFetcher, name str ifaces.ColumnAsVariable(rlpTxnArith.ChainID), ).GetColumnAndProverAction() - commonconstraints.MustBeConstant(comp, fetcher.ChainID) - commonconstraints.MustBeConstant(comp, fetcher.NBytesChainID) - - // constraint for the ChainID column - comp.InsertGlobal( - 0, - ifaces.QueryIDf("%s_CHAIN_ID_GLOBAL_CONSTRAINT", name), - sym.Mul( - rlpTxnArith.TxnPerspective, // must be 1 to fetch ChainID - sym.Sub( - 1, - fetcher.SelectorZeroChainID, // must be non-zero to only select non-zero ChainIDs - // there are legacy transactions that have a ChainID field of 0 - ), - sym.Sub( - rlpTxnArith.ChainID, - fetcher.ChainID, - ), - ), - ) - // Constraint for the NBytesChainID column - comp.InsertGlobal( - 0, - ifaces.QueryIDf("%s_N_BYTES_CHAIN_ID_GLOBAL_CONSTRAINT", name), - sym.Sub( - 2, // ChainID is always 2 bytes - fetcher.NBytesChainID, - ), - ) } func DefineRlpTxnFetcher(comp *wizard.CompiledIOP, fetcher *RlpTxnFetcher, name string, rlpTxnArith *arith.RlpTxn) { @@ -220,8 +185,6 @@ func AssignRlpTxnFetcher(run *wizard.ProverRuntime, fetcher *RlpTxnFetcher, rlpT run.AssignColumn(fetcher.NBytes.GetColID(), smartvectors.RightZeroPadded(nBytes[:counter], size)) run.AssignColumn(fetcher.FilterFetched.GetColID(), smartvectors.RightZeroPadded(filterFetched[:counter], size)) run.AssignColumn(fetcher.EndOfRlpSegment.GetColID(), smartvectors.NewRegular(endOfRlpSegment), wizard.DisableAssignmentSizeReduction) - run.AssignColumn(fetcher.ChainID.GetColID(), smartvectors.NewConstant(chainID, size)) - run.AssignColumn(fetcher.NBytesChainID.GetColID(), smartvectors.NewConstant(nBytesChainID, size)) fetcher.ComputeSelectorDiffAbsTxId.Run(run) fetcher.ComputeSelectorZeroChainID.Run(run) diff --git a/prover/zkevm/prover/publicInput/fetchers_arithmetization/rlp_txn_fetcher_test.go b/prover/zkevm/prover/publicInput/fetchers_arithmetization/rlp_txn_fetcher_test.go index 4651d94ba8..3b81b2088c 100644 --- a/prover/zkevm/prover/publicInput/fetchers_arithmetization/rlp_txn_fetcher_test.go +++ b/prover/zkevm/prover/publicInput/fetchers_arithmetization/rlp_txn_fetcher_test.go @@ -3,12 +3,10 @@ package fetchers_arithmetization import ( "testing" - "github.com/consensys/linea-monorepo/prover/maths/field" "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" "github.com/consensys/linea-monorepo/prover/protocol/wizard" arith "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput/arith_struct" util "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput/utilities" - "github.com/stretchr/testify/assert" ) // TestRlpTxnFetcher tests the fetching of the rlp txn data @@ -32,7 +30,6 @@ func TestRlpTxnFetcher(t *testing.T) { // assign the CSV columns arith.AssignTestingArithModules(run, nil, nil, ctRlpTxn) AssignRlpTxnFetcher(run, &fetcher, rt) - assert.Equal(t, field.NewFromString("0xccc00000000000000000000000000000"), fetcher.ChainID.GetColAssignmentAt(run, 0), "ChainID value is incorrect.") }) if err := wizard.Verify(cmp, proof); err != nil { t.Fatal("proof failed", err) diff --git a/prover/zkevm/prover/publicInput/public_input.go b/prover/zkevm/prover/publicInput/public_input.go index e9cfc4881d..031821008c 100644 --- a/prover/zkevm/prover/publicInput/public_input.go +++ b/prover/zkevm/prover/publicInput/public_input.go @@ -63,6 +63,7 @@ type AuxiliaryModules struct { BlockTxnMetadata fetch.BlockTxnMetadata TxnDataFetcher fetch.TxnDataFetcher RlpTxnFetcher fetch.RlpTxnFetcher + ChainIDFetcher fetch.ChainIDFetcher ExecDataCollector *edc.ExecutionDataCollector ExecDataCollectorPadding wizard.ProverAction ExecDataCollectorPacking pack.Packing @@ -199,6 +200,10 @@ func newPublicInput( execDataCollector := edc.NewExecutionDataCollector(comp, "EXECUTION_DATA_COLLECTOR", limbColSize) edc.DefineExecutionDataCollector(comp, execDataCollector, "EXECUTION_DATA_COLLECTOR", timestampFetcher, blockTxnMeta, txnDataFetcher, rlpFetcher) + // ChainIDFetcher + chainIDFetcher := fetch.NewChainIDFetcher(comp, "PUBLIC_INPUT_CHAIN_ID_FETCHER", inp.BlockData) + fetch.DefineChainIDFetcher(comp, &chainIDFetcher, "PUBLIC_INPUT_CHAIN_ID_FETCHER", inp.BlockData) + // ExecutionDataCollector: Padding importInp := importpad.ImportAndPadInputs{ Name: settings.Name, @@ -238,8 +243,8 @@ func newPublicInput( LogHasher: logHasherL2l1, ExecMiMCHasher: *mimcHasher, DataNbBytes: execDataCollector.FinalTotalBytesCounter, - ChainID: rlpFetcher.ChainID, - ChainIDNBytes: rlpFetcher.NBytesChainID, + ChainID: chainIDFetcher.ChainID, + ChainIDNBytes: chainIDFetcher.NBytesChainID, Inputs: *inp, Aux: AuxiliaryModules{ FetchedL2L1: fetchedL2L1, @@ -249,6 +254,7 @@ func newPublicInput( BlockTxnMetadata: blockTxnMeta, TxnDataFetcher: txnDataFetcher, RlpTxnFetcher: rlpFetcher, + ChainIDFetcher: chainIDFetcher, ExecDataCollector: execDataCollector, ExecDataCollectorPadding: padding, ExecDataCollectorPacking: *packingMod, @@ -284,6 +290,7 @@ func (pub *PublicInput) Assign(run *wizard.ProverRuntime, l2BridgeAddress common fetch.AssignBlockTxnMetadata(run, aux.BlockTxnMetadata, inp.TxnData) fetch.AssignTxnDataFetcher(run, aux.TxnDataFetcher, inp.TxnData) fetch.AssignRlpTxnFetcher(run, &aux.RlpTxnFetcher, inp.RlpTxn) + fetch.AssignChainIDFetcher(run, &aux.ChainIDFetcher, inp.BlockData) // assign the ExecutionDataCollector edc.AssignExecutionDataCollector(run, aux.ExecDataCollector, pub.TimestampFetcher, aux.BlockTxnMetadata, aux.TxnDataFetcher, aux.RlpTxnFetcher, blockHashList) aux.ExecDataCollectorPadding.Run(run) diff --git a/prover/zkevm/prover/publicInput/testdata/blockdata_mock.csv b/prover/zkevm/prover/publicInput/testdata/blockdata_mock.csv index 3420a2e76f..187bba7979 100644 --- a/prover/zkevm/prover/publicInput/testdata/blockdata_mock.csv +++ b/prover/zkevm/prover/publicInput/testdata/blockdata_mock.csv @@ -1,65 +1,65 @@ -REL_BLOCK,INST,CT,DATA_HI,DATA_LO,FIRST_BLOCK_NUMBER -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0x0,0,0,0,0 -1,0x41,0,0,0,1500 -1,0x42,0,0,0xa,1500 -1,0x43,0,0,0,1500 -1,0x44,0,0,0,1500 -1,0x45,0,0,0xa,1500 -1,0x46,0,0,0,1500 -1,0x48,0,0,0,1500 -2,0x41,0,0,0,1500 -2,0x42,0,0,0xab,1500 -2,0x43,0,0,0,1500 -2,0x44,0,0,0,1500 -2,0x45,0,0,0,1500 -2,0x46,0,0,0,1500 -2,0x48,0,0,0,1500 -3,0,0,0,0,1500 -3,0x42,0,0,0xbc,1500 -3,0,0,0,0,1500 -3,0,1,0,0,1500 -3,0,2,0,0,1500 -3,0,3,0,0,1500 -3,0,4,0,0,1500 -4,0,5,0,0,1500 -4,0x42,0,0,0xcd,1500 -4,0x42,1,0,0xcd,1500 -4,0x43,0,0,0xa,1105 -4,0x43,1,0,0xa,1105 -4,0x44,0,0,0xa,1200 -4,0x45,0,0,0xa,1500 -4,0x45,1,0,0xa,1500 -4,0x45,2,0,0xa,1500 -4,0x45,3,0,0xa,1500 -4,0x45,4,0,0xa,1500 -4,0x46,0,0,0xa,1500 -4,0x48,1,0,0xc,1500 \ No newline at end of file +REL_BLOCK,INST,CT,DATA_HI,DATA_LO,FIRST_BLOCK_NUMBER,IS_CHAINID +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0,0,0,0,0,0 +0,0x0,0,0,0,0,0 +1,0x41,0,0,0,1500,0 +1,0x42,0,0,0xa,1500,0 +1,0x43,0,0,0,1500,0 +1,0x44,0,0,0,1500,0 +1,0x45,0,0,0xa,1500,0 +1,0x46,0,0,0xfefc0000000000000000000000000000,1500,1 +1,0x48,0,0,0,1500,0 +2,0x41,0,0,0,1500,0 +2,0x42,0,0,0xab,1500,0 +2,0x43,0,0,0,1500,0 +2,0x44,0,0,0,1500,0 +2,0x45,0,0,0,1500,0 +2,0x46,0,0,0xfefc0000000000000000000000000000,1500,1 +2,0x48,0,0,0,1500,0 +3,0,0,0,0,1500,0 +3,0x42,0,0,0xbc,1500,0 +3,0,0,0,0,1500,0 +3,0,1,0,0,1500,0 +3,0,2,0,0,1500,0 +3,0,3,0,0,1500,0 +3,0,4,0,0,1500,0 +4,0,5,0,0,1500,0 +4,0x42,0,0,0xcd,1500,0 +4,0x42,1,0,0xcd,1500,0 +4,0x43,0,0,0xa,1105,0 +4,0x43,1,0,0xa,1105,0 +4,0x44,0,0,0xa,1200,0 +4,0x45,0,0,0xa,1500,0 +4,0x45,1,0,0xa,1500,0 +4,0x45,2,0,0xa,1500,0 +4,0x45,3,0,0xa,1500,0 +4,0x46,0,0,0xfefc0000000000000000000000000000,1500,1 +4,0x45,4,0,0xa,1500,0 +4,0x48,1,0,0xc,1500,0 From f3478bd69c8232bf625683fd8e8c8fc80bd31945 Mon Sep 17 00:00:00 2001 From: gusiri Date: Fri, 21 Nov 2025 17:16:08 +0900 Subject: [PATCH 06/36] add new discovery advices for Osaka --- prover/zkevm/limitless.go | 47 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index cbddaae852..a7f3fef736 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -312,6 +312,53 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 262144, Cluster: "TINY-STUFFS", Column: "EXECUTION_DATA_MIMC_TAGS_SPAGHETTI"}, {BaseSize: 262144, Cluster: "TINY-STUFFS", Column: "MIMC_HASHER_STATE"}, {BaseSize: 262144, Cluster: "TINY-STUFFS", Column: "BLOCK_EXECUTION_DATA_MIMC_AccNumLane"}, + + // Start of new discovery advices for Osaka + // ARITH-OPS + {BaseSize: 131072, Cluster: "ARITH-OPS", Column: "TABLE_bin.ARGUMENT_1'0,bin.ARGUMENT_1'1,bin.ARGUMENT_2'0,bin.ARGUMENT_2'1,bin.INST,bin.RES'0,bin.RES'1_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "bit_sar256_u1.lsw"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "bit_shr256_u1.lsw"}, + + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_bit_xoan_u2.ARG_1,bit_xoan_u2.ARG_2,bit_xoan_u2.INST,bit_xoan_u2.RES_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "bit_xoan_u2.c0"}, + + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_bit_xoan_u4.$ret,bit_xoan_u4.ARG_1,bit_xoan_u4.ARG_2,bit_xoan_u4.INST,bit_xoan_u4.RES_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_bit_xoan_u8.$ret,bit_xoan_u8.ARG_1,bit_xoan_u8.ARG_2,bit_xoan_u8.INST,bit_xoan_u8.RES_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_bit_xoan_u16.$ret,bit_xoan_u16.ARG_1,bit_xoan_u16.ARG_2,bit_xoan_u16.INST,bit_xoan_u16.RES_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_bit_xoan_u32.$ret,bit_xoan_u32.ARG_1,bit_xoan_u32.ARG_2,bit_xoan_u32.INST,bit_xoan_u32.RES_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_bit_xoan_u64.$ret,bit_xoan_u64.ARG_1,bit_xoan_u64.ARG_2,bit_xoan_u64.INST,bit_xoan_u64.RES_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_bit_xoan_u128.$ret,bit_xoan_u128.ARG_1,bit_xoan_u128.ARG_2,bit_xoan_u128.INST,bit_xoan_u128.RES_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_bit_xoan_u256.$ret,bit_xoan_u256.ARG_1'0,bit_xoan_u256.ARG_1'1,bit_xoan_u256.ARG_2'0,bit_xoan_u256.ARG_2'1,bit_xoan_u256.INST,bit_xoan_u256.RES'0,bit_xoan_u256.RES'1_0_LOGDERIVATIVE_M"}, + + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_byte16.n,byte16.res,byte16.word_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_byte32.n,byte32.res,byte32.word_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_byte64.n,byte64.res,byte64.word_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_byte128.n,byte128.res,byte128.word_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_byte256.n,byte256.res,byte256.word'0,byte256.word'1_0_LOGDERIVATIVE_M"}, + + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_signextend.res'0,signextend.res'1,signextend.size,signextend.word'0,signextend.word'1_0_LOGDERIVATIVE_M"}, + + {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7873,MIMC_STACKED_NEW_STATES_0_7874,MIMC_STACKED_OLD_STATES_0_7872_0_LOGDERIVATIVE_M"}, + + // HUB-KECCAK (EUCLIDEAN variants) + {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT,euc.REMAINDER_0_LOGDERIVATIVE_M"}, + {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT_0_LOGDERIVATIVE_M"}, + {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT,euc.REMAINDER_0_LOGDERIVATIVE_M"}, + {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT_0_LOGDERIVATIVE_M"}, + + // STATIC (REPEATED_PATTERN tables) + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_3066_64_PATTERN,REPEATED_PATTERN_3066_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_5392_24_PATTERN,REPEATED_PATTERN_5392_24_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 128, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7337_128_PATTERN,REPEATED_PATTERN_7337_128_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 256, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7345_256_PATTERN,REPEATED_PATTERN_7345_256_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7353_512_PATTERN,REPEATED_PATTERN_7353_512_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 16, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7394_16_PATTERN,REPEATED_PATTERN_7394_16_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7402_64_PATTERN,REPEATED_PATTERN_7402_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7410_64_PATTERN,REPEATED_PATTERN_7410_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7541_20_PATTERN,REPEATED_PATTERN_7541_20_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7553_64_PATTERN,REPEATED_PATTERN_7553_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + + // End of new discovery advices for Osaka } // NewLimitlessZkEVM returns a new LimitlessZkEVM object. From 18f555506067b89621b55894aac2db9a431f1730 Mon Sep 17 00:00:00 2001 From: gusiri Date: Mon, 24 Nov 2025 16:05:19 +0900 Subject: [PATCH 07/36] bump constraints to beta-v4.4-rc1 (023539d) --- constraints | 2 +- prover/zkevm/arithmetization/zkevm.bin | Bin 1016800 -> 1043914 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/constraints b/constraints index 7f8b4e98f7..023539d3b6 160000 --- a/constraints +++ b/constraints @@ -1 +1 @@ -Subproject commit 7f8b4e98f727ab54e2c08a4561d3282ebe345adc +Subproject commit 023539d3b660b8d6501b58096f7295044b5c924c diff --git a/prover/zkevm/arithmetization/zkevm.bin b/prover/zkevm/arithmetization/zkevm.bin index 84a86b5a9732659e86d16d0210972aa101e6b091..723a8b092fcdb716d0598ad7ab899c98875cabde 100644 GIT binary patch delta 120905 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%0DAh6J3{!g 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 z zfKvVMPwcQe2=?Mi0!=zyF7IrTxKK$RBO#db zNpDTt9)~tIZLS(aAAN`^FMv2)1bhUo$lgulu)V95gDo0w;ABv4oU@h8V{xV$N5zK} zC(Gm~jKJKy5|n(LrPIR=(I0!hV-0D+aaN#Zizik?(c(bN7SBuAvboo@B>beGV5yXs zU^QUqDd_(dpP(zRq7@s6A#4_bH=dKKx4>6oN7{LkrTG;H)Q2F?(Wh9ZU$yf;`MW#q zvyY)(`r1`w@V9l^bDy%-fyA%A)9A=&7^||&;y!1+0_mktL9FQix)`hfS3lrMqJk3^ zhYjn1-WLq~;7>|inB*|bo{KG$&aMbfq(1R#EB79rTL%$=9zOULG(I20p{bMT zbiA4n9Mphum(^ZI+q)lQHa7#xU&V6l)NTud1-EV<27&Ob*Zmu|7@V>98|b3Gj%)qx z|AI3}Ij1HzC>EvkAIWpSgT=-wX%A#p_g#SO82$a#W%lP>f7fZ&&YM$10%7y`+=4om z%rM`e0WlnT%Pk~bI97N2JkFH$An1%5Q>8zmK(40eUPy}c-#5|^x%Sro& z=U7KS;pr=fcqk%14W6Qc=;S$ATiywQ&8qq)cNoR|;dIgIKb)~*io@EDzk#TBtc2k!^s|eo^rke8*h1B4JG{o<_y6L)qhw;SatzAYc@T7fg4@C^YMr}q!BaP z6=r*BU*n}nb4ELJ0Tu?a`F-g)db$qw4`047*|4O$+G)&J-3C&|`Ad&-8y;>7$RLT{ zazF})*wsQmfZ;g1l(ZzuZBH-YGQ~`?IDF4P=gmj+faUcmC@o*HN|6hc`_I@!`wD% zV_MQeZ7Q3%I796wN6DWlV76P`aW+PaGSvi!8zSWG&sd^4{bB&)fSH&Z`H;rkcs4UM zk-kk<@ytMs+Q}~q(ScVq$BPc+b9}fE!+g;Mb?&00nJ1e;-9!1CP*f{bEI}d(qN7?c@ai(;7_ub<5pu8qvblPztQ{Pp~-{w0yNI zQA#YK3&hjmNgk&yi!$DYUVu7wq90ZSClDStilguZa9K@jzJh74HlXqhwQXRjTvD>; zCJH%sHo?+z8tnJPJF)c2AX@^SHiO4RC;e0nUHvSMvN%vun$^N7U%^c0D2cS!2DvH@ z^g5DMoIp-z!UCH1B&#kcFtJ~`ML|2#gY&SbJ@*3kakoB>u{W@_ z+R77Z`>#bh^^H58y0lSEIrCR-ov{zvdOG1JUammIm#ElkJv7daifpsvViPYo_l1^D z1*i=4FF+IN=M=PI&$iIShT^#pTDKd0^42hq8?Alc2-(_cq^GJ2MYA}C9)a3nV>?xC zj|qhn0r$QAs3Vp}q*;US((;B{yn!Y4-leVtM>_vl<4JI&@kMq=PXbmPvnI26TL|rN zn8gM2pIw3->oh7zg$F7yhl>s^P+~FB)!D%!#m$^fw04GrrFi6upaU&B=1z2X4DxVg zK+jOS$Wd$Y#u#hL%7_LZWCwW~P{t;V*04TmhEO0!wO5Pf;5pnL{QZ9)nzVBZjvEio zLP>;V1zA{{`MT@s#-u6iL?PeoU^O(TWd*YP-#ZA+7Ul{$%i@RZt!74y9F{b!liG^z z?V`>it+Sf#CnQg{_Y;zB>NUL6*YH>;V|dfHXwWI`qCPg_WzRGgR9Z26QffsxzrZ%P zWcr+vse_2B+TZugXF>D+_WB&3 z4q-2N>hkruBL2F}y3XoizOF-U9HI*XGn$ux$xFkB`-W z-VsLeT1>P~VN=NX)yaph!^c7Gf$lA$a?!Tc(}V>@qKNcns2b_lMmo)U2g@bcz?#vK zV6D|vtBXQ;N|DneSDu1`{Bpxtu}RZPCtaU9J7-dAS!L?YrL)Vq5enBrIKy2&^DEL$ zysA~C%v!FMF5238VpvdfUeS8ZcS&CSK#U7pczF5gbT73{Be^gP;Spl_!NsMinx!{X zhsidBnXAL!rJ`^-7)Mdzs?Qqpf0l#Q5o(^dq*+2^;H&=l{~t0iE_e@bO7JD^oeERN z*eLZ@$ z29a&EC!S_DQ&)J$T{$%K>gMVP)FDqbZ6jdahO{aVjPPgj(O*qPT;mOzMA|v~o~v3hLFRKaOU?Ak<$iz|@1DX+o#k!ccWw#=8cn`QB=W z^9r_;eY9nOnp{u1P=|r)z`vlCkPnU2xBNX(peEIPfL-b1dHh*F{~3cJmoqri zhhvRU(xr(38sUNhwXe2L;TtsWil7#pELF~+a1@5~G*6suWg zr*Xr1oHOR4eH@)CR{gD>qWSrSgkTI9F|`oae1g$&4KQ@za}Hu$p1&1t>4mu)$8qE2 zaL=8nW{Jf@Y^I(}7w4hLxEN3|SYx%m4yUfw1;~-G3-(B++%p|6U(Ni&YUx& zbaqKq`D~u?tT}x5b8cB>`Rw{d_zU(q^NQO^eDB4_pBgCtmuApU0iH} zw9yD5DjGxTAVLwb1I@QP6BmLF-&3AE7Su}=mC~+LgB4!ZS#!#(%1UQa_v>Ka5$dY9 ziLP?bMlKPdy@;H}E)KWRguHgq9^%PiLEU{h(^u0W@qL2}oRvbo6U9!{pV(;3&B)|f?8c#8nHIwZ56OK@)bnv(_Enp_fD?nVhkJ)sa^M( zxWB`P8@CsfOc!PVZ!guadHHnaqKT7Su^2`0j1mb`7JkmD$&qN&lFPKI-!iNCMzy0{ zaeUPqT`Jb7WB9Gc+6s3ZiDz7Xn5`y5T-&9n<#Je;YeozYDTe9nt!jjE=oa-CM>Bp6 z7cGcm2=d$v&Jgt|Z zsi8Kyej~y?7psHFxrv!>RGwI@9;EOkEW)_sAL?`)PaQ?d67_`|?zQ9i61AO8(rL9+ z{Zb%G&nV09l5G}B1$U|s_yI25sXj)X?nX}H2JX}UM0T7$Mck$K)lItNR4%{WuKDcs`DCQBpBqRR;b(m8Rv%wpd-Q9cmgh9F2+QN)2 zq;_{kiddTyjbpb3_aEFR@7f9ZfRgPobw}iAM5BxFPhQ%<1pvg1rq>@+TQxR;XytIH ziv`*9`RTCHWLu$zH!)%0Pq<4gor#B2Z<3`zlyjLG9qAX%4>O~dtJKCw8?_3Hj?vU@mB@JH zDs=y7x^*6g8qBz07%c-}b_Y8GB{qhC|*_jVjr!jPw zI?f#!?&NrOpNjh@d0o-IQTx@;U6N*_H&l346OF=sBpKOnsxfBq#j#<$zJz1L0xp`g zMU|dl1RqvQ{UhhsxZ{nDZ>!63f|&P+H~=>4UG-Ob?lgkp-h0^*b*Eo2`>6VoUr_%a z^#z#=`tW(${u&E09)C~WVG_Llef1V9{T#GJtBF^c(>_oO(Lur!%!&`Nc_*^|{sXl_ zVpbkge-zcFc^{&6IFxq~^*gS%m)+jxBXzjI74fyFusnL_BX9!G$U-Gaw)hjAqB(b5 zeM1J%gzFwUenKtt;fmyso>a#LVx&;dQ)=G;vOn zCOO&6D}_#ff?A4J$oW)V?$;^bf2yuBv*oU^#-GH|FJ!tCKdKYVboj)x<9vuL z`9=M~S4jH)9CqaSv2DU}z9jncSM?iNS6&4Uy<5_H;5YS%MF;v&t2n?tlsbTk6y@R^|+4zY8YReK~Ph0Z+e zj;9`qHdMxi=~^e_n4&#sw(3$t6~z=Y2%qo1xtU`~$!^|@hMra6>FPwsD|&2>gL*3n{Bi)w59ftC(sS1 zN527XFl|d|b#Luo#v936tq#QNJ8AcD&zCO6^nCezckTI57pLEsJICy7GoIKxiHw=hrK#u`J#wOVus69I><{1N!gOA~?vbN-Ml4xz0`+R;S7d0Ke@UDD1Q z%ujurFlc>#{>Zp~H-;|MYEex%9NHgFnESy+uGDU|78Pm2n^;N}*HQGXaiwjsU zuF;;eaR7ht>fUwQ_Yx`6SpK-yfCF#~tTDatgm%02J!-wS#QOeay`Us;mOTk38Y5kJ z{raS~j3+bQ9yj&DtOQd%G4zPj1ml z@y)NS(dk3j%sjY7OQKm@wHVtNadA!FRII{Qw|I8&kFCJBjWLiI?;J=JVRw0AhxU+v zc)?TJ0T31~F!pKfU!tPCd}%wic^vQ`tiE2^sr9kGSElJHH1t`mH6ldOFjd9T&S$kO z8PT}L(3YE@wAs*R;oI^cg9`IknzHt4@pQ*7tq>sLGwi@~TC&k}H=4nWF%Ywc`%V-& zVD^hQp4h8(;Waw7PdnqZ(7ryPX?BYW0?BmxIXt5%?o;3Wr50!0{)YCeMU>wBMN6dT z4{EEe6ghlrhVsEQmcIEzYX&Vf_`H^cpY-z> zT4O2yycUa}ndh~}%uEV}y6%4Zprzi_EgTtngd?M7P)vmZgX^VZp{7bL6=xXWN|y?1 zLK7Rt1vTI}kPu>_2Zu>?_j&N@wc@4&a(VT5l4xpS#{cVCXqTVhrYZYakV2@{PG$4 zdKuzw6%krUZ`<_c^yBS782UbQ63zma^I#Nr&*>!1fh(bH7Q@gq*`XJCNxJEXL(lXp zPK;CU=NDY$)DP0|yD)hj_Gqq}5Lh(Z9EIi5aAB9-Kfbl()C9M_G$1~i&bsyM1EY*u zkB)iBKlup}s_E)+8o!6=jRJwmbW+pX8;ceF6$#*Y1iVf(zZrDmdk?5C>a62Ss4(rC z>V?!z(~ARgNH#!Ziz6V;Nn0A$E1ZbJQsQZ-eUlpLTkGLhMWEiokI?9FeUaIW;re89 z-NqLi-1S3wgg(J98#>d}YP3$#D5AI49N=rUHh3seZ(koOWK3!ZOv^&zl{e9ExGV~) z{J0NbfO22ICX_jetBwns>!a)j#pu7;z`FOf()R|;_miF8$)5h1={opqqQ2RKW#5)m zJuzk+#t7y+Os4WSKW3z%MTPw)^vM56J{_BFVA^}3b97eawUCNpGpc(bt}FduM`{eCT!Bc{FF~w*RH*Nw0S=T2mOhof`NG+j zDn^1iJVkmFi6@MY-HLPvjC{y|ufbU$Yhd?Lbr{y&wWCl5 zkq-HV&@ZF(7XyRY6f#C1A>*pX=sRuS8EwYuaW?Askt5tF8K>Xx$ti{wFwdOrG1+rZ zyv4Fpu@I0}zGmFo1uMWsfK0$WFh-gj%uQ>;10x!RU(4mkLa~nN5rk=^4b7jar_;I_`lA6+ zhy3u7JfF)fC!PKd>acj>_INq;2;>lHbg$5xz{Nk$%yLsw?Uxv4rX~SstZin6@o;kkxANnnUfcb$zZ0g;vKPKa9 zm*^Yh*Wry=Exmb{-iX@WY0X0`@4!?m@~8)0vD7MG0N}^VA`4F{H~bSa?J}flYH-T^ z_Pg|Ufk3lMEb7^EUR-~-zBv%D3vKU%?%cFY?-2+vQ}nn;UmFPMLbXf5k6rK8rv(DC zvCw&)jg8B7mp_gesy5Q!lm+29)a)UsM^=A#HjY1}zvoNRg}bQ?CibX) z(Tiio-GAPhKuaFe&({aMze4}RFRpey7_Idx{ggK@$Cyy7pYmnWnQ|JTtshw9SCAYU zyH-EoO=6rK~LJ~R{zG9y}WUo{)!*6XmG^Aez{$L$P4IVpjk2N z`N}Gqx&PDpX>Xi|YIj1@6M%=G(ZBHl3;?iqVkH)c-DuE{cu_sw(ARkZJt%3HB`(lj zU8IfEwp-ufMd@7goL78uW;jy~Q!6UB#fL%8e_^F$Wd@WKO!WKy1zpn@x2-h9MN3|= zgwDYitbRCj25Rwy7xhUdG8Z}@y$IPU(n92Kprx5Ql+1Qe7laHNzDIw=4>@G7{;!jwDpXtG>_510IDh^L8>VXRu)amy_r-*a3H|!p>K0xSn?K~z*!GvjZI72OEL``n zyuzaV;oQLpa&ci*=M7Bdp}rQ#jXj-2{R>Cu4I5%caNNFLFc0N> zL*YXP=RJ`7dPHAj-gE?7Ah%b39^ixf!Vt=C7fU>3KPf4o&F^efI5Sok@^g)cZW0W9+tVE6>9NJs#8>vdmyxL+D^)@X9+ zq;l?OgO|W(6mNmIRHfw*9b_Io5m&;|`q0*C#hs3J&HpP(+h}pn$aGyOJmPZCBO)tq z?Dp_eUswu|Ulv=a_5o<8Jmh5L}P+h7%KNMWJQBwHhz#Y5qA>K*)GjSjCI_8?7o z=jaur3-^?u17jz5AR)}1C^TZQwrK&s?&92xU*UNTz{J8*deJ_KPCV>rYAX@ecbh^5 z2XJ>gC&U>{-yUGUa>FO17Y@LBu!Vn(=);oSXxX?RI34W6Qr&1xG^zNeZjU%529-bJ z2-XWc++qKeve`J%HM{%<3d_@blj~g;jm#{sdcrD{Ni*Mt7dyn7F7oc9XPtUnbkNP7 z1}sRkoC!-8C9K3! zJEx+e6vqzBXHFK>dEsm-l{lRVT3DusyZxVDQdu=j)}d(%KZb3s7%$q_cp9^yMiXzU zDxJW2X+}kPr8r4d>Fs8_y8-2XiYs$xp4MC*3@@Z_MrUJ{)*;R6>coJP2=3;*H6!Wl zG*^}rqs>fKam4BJV2mMI3z5v$f)*CQufw*F0l*LgprxeOlG8(snX>kn>hfTy0U<^r z#Bc<}m>I_M44cy4GFMhJjJ%7E-J(qf?OY-AqIwL=R zqSzGz^dqgB=jJ#+&|!RpG^#rbno%ZAu>ad2ji0+8bEE_7qDAR~Md`dn=?{z2?}Ach zqq^Tf2?CH8g%gF$$qs&N%t&rH8F<@g*^gO-{YBjf+|j{;h>V(>7-LXVCgNK|8vW4uy6zj69?6< z4lyl&YgdOP)3Rk)Cmx=}g0qDSolrN52RBvLC1t@0(z!zmlQIzSI)%6afX^7pc~MKH zNuS{8TyY9>HLwbRp(#2X7A=l2yUaw;tda;3h*w|tYH-q13&k&M6TE)lI%j;ti}vS) zH=x<2m2;+x0VKqN-P4d}-J!Hm#cim#Ajo0}UdlMCrr;Q0Funb%JE0{%Mk@hQ5TO*_ zC`bv)Z4WJ4SU}SbY92KJOnYC}S_>e*a0NEA9dgID_9lmn=b|kji68Yi%6&FiCXeIE zQKmmd4Z<$a$rdmZ=0qqiCRhVZf%cTOX!~FCJ From 47f945f7d877ac38b32be9003172e51227599e0b Mon Sep 17 00:00:00 2001 From: gusiri Date: Mon, 24 Nov 2025 17:05:58 +0900 Subject: [PATCH 08/36] add new modules: MAX3_U128 and MAXLOG --- prover/config/config_default.go | 4 ++++ prover/config/traces_limit.go | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/prover/config/config_default.go b/prover/config/config_default.go index 2e115df4b7..3156c7597e 100644 --- a/prover/config/config_default.go +++ b/prover/config/config_default.go @@ -200,6 +200,8 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits.BYTE_128", 131072) viper.SetDefault("traces_limits.BYTE_256", 131072) viper.SetDefault("traces_limits.SIGNEXTEND", 131072) + viper.SetDefault("traces_limits.MAX3_U128", 131072) + viper.SetDefault("traces_limits.MAXLOG", 131072) // End of new modules for Osaka viper.SetDefault("traces_limits.PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS", 0) viper.SetDefault("traces_limits.PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS", 0) @@ -366,6 +368,8 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits_large.BYTE_128", 262144) viper.SetDefault("traces_limits_large.BYTE_256", 262144) viper.SetDefault("traces_limits_large.SIGNEXTEND", 262144) + viper.SetDefault("traces_limits_large.MAX3_U128", 262144) + viper.SetDefault("traces_limits_large.MAXLOG", 262144) // End of new modules for Osaka viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS", 0) viper.SetDefault("traces_limits_large.PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS", 0) diff --git a/prover/config/traces_limit.go b/prover/config/traces_limit.go index ca9449902f..ad53dbdadc 100644 --- a/prover/config/traces_limit.go +++ b/prover/config/traces_limit.go @@ -140,6 +140,8 @@ type TracesLimits struct { BYTE_128 int `mapstructure:"BYTE_128" validate:"power_of_2" corset:"byte128"` BYTE_256 int `mapstructure:"BYTE_256" validate:"power_of_2" corset:"byte256"` SIGNEXTEND int `mapstructure:"SIGNEXTEND" validate:"power_of_2" corset:"signextend"` + MAX3_U128 int `mapstructure:"MAX3_U128" validate:"power_of_2" corset:"max3_u128"` + MAXLOG int `mapstructure:"MAXLOG" validate:"power_of_2" corset:"maxlog"` // End of new modules for Osaka // reference tables @@ -345,6 +347,8 @@ func (tl *TracesLimits) ScaleUp(by int) { tl.BYTE_128 *= by tl.BYTE_256 *= by tl.SIGNEXTEND *= by + tl.MAX3_U128 *= by + tl.MAXLOG *= by // End of new modules for Osaka // beta v4.0 tl.PrecompileBlsPointEvaluationEffectiveCalls *= by @@ -517,6 +521,8 @@ func GetTestTracesLimits() *TracesLimits { BYTE_128: 131072, BYTE_256: 131072, SIGNEXTEND: 131072, + MAX3_U128: 131072, + MAXLOG: 131072, // End of new modules for Osaka // beta v4.0 From d6118ecd3b8273b3268e80537820885b85a29896 Mon Sep 17 00:00:00 2001 From: gusiri Date: Mon, 24 Nov 2025 17:41:08 +0900 Subject: [PATCH 09/36] add missing discovery advices for beta 4.4-rc1 --- prover/zkevm/limitless.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index a7f3fef736..35c46c2cf9 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -337,8 +337,12 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_byte256.n,byte256.res,byte256.word'0,byte256.word'1_0_LOGDERIVATIVE_M"}, {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_signextend.res'0,signextend.res'1,signextend.size,signextend.word'0,signextend.word'1_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_max3_u128.arg1,max3_u128.arg2,max3_u128.arg3,max3_u128.res_0_LOGDERIVATIVE_M"}, + {BaseSize: 32768, Cluster: "ARITH-OPS", Column: "TABLE_maxlog.inst,maxlog.res,maxlog.x,maxlog.y,maxlog.z_0_LOGDERIVATIVE_M"}, + {BaseSize: 262144, Cluster: "ARITH-OPS", Column: "TABLE_wcp.ARG_1'0,wcp.ARG_1'1,wcp.ARG_2'0,wcp.ARG_2'1,wcp.INST,wcp.RES_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7873,MIMC_STACKED_NEW_STATES_0_7874,MIMC_STACKED_OLD_STATES_0_7872_0_LOGDERIVATIVE_M"}, + {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7883,MIMC_STACKED_NEW_STATES_0_7884,MIMC_STACKED_OLD_STATES_0_7882_0_LOGDERIVATIVE_M"}, // HUB-KECCAK (EUCLIDEAN variants) {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT,euc.REMAINDER_0_LOGDERIVATIVE_M"}, @@ -357,7 +361,17 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7410_64_PATTERN,REPEATED_PATTERN_7410_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7541_20_PATTERN,REPEATED_PATTERN_7541_20_PATTERNPOS_0_LOGDERIVATIVE_M"}, {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7553_64_PATTERN,REPEATED_PATTERN_7553_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, - + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_3076_64_PATTERN,REPEATED_PATTERN_3076_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_5402_24_PATTERN,REPEATED_PATTERN_5402_24_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 128, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7347_128_PATTERN,REPEATED_PATTERN_7347_128_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 256, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7355_256_PATTERN,REPEATED_PATTERN_7355_256_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7363_512_PATTERN,REPEATED_PATTERN_7363_512_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7371_64_PATTERN,REPEATED_PATTERN_7371_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 16, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7404_16_PATTERN,REPEATED_PATTERN_7404_16_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7412_64_PATTERN,REPEATED_PATTERN_7412_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7420_64_PATTERN,REPEATED_PATTERN_7420_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7551_20_PATTERN,REPEATED_PATTERN_7551_20_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7563_64_PATTERN,REPEATED_PATTERN_7563_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, // End of new discovery advices for Osaka } From 87fd7c6161c00ba411c3e8948429caebb8fcb761 Mon Sep 17 00:00:00 2001 From: gusiri Date: Mon, 24 Nov 2025 13:00:12 +0000 Subject: [PATCH 10/36] fix(limitless-prover): skip module size reduction for single-submodule clusters Single-submodule clusters like MODEXP_LARGE should preserve their BaseSize from discovery advice, as the reduction algorithm is meant to balance multiple submodules, not optimize a single one. This fixes panic "nbPub=256 data-size=2 name=MODEXP_LARGE" when the MODEXP_LARGE module was incorrectly reduced from 256 to 2 rows. --- prover/protocol/distributed/module_discovery_standard.go | 7 +++++++ prover/zkevm/limitless.go | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/prover/protocol/distributed/module_discovery_standard.go b/prover/protocol/distributed/module_discovery_standard.go index d2fe17e304..3eaa187762 100644 --- a/prover/protocol/distributed/module_discovery_standard.go +++ b/prover/protocol/distributed/module_discovery_standard.go @@ -195,6 +195,13 @@ func (disc *StandardModuleDiscoverer) analyzeWithAdvices(comp *wizard.CompiledIO // weight. for i := range disc.Modules { + // If there's only one submodule, keep the BaseSize from advice as-is. + // The reduction algorithm is meant to balance multiple submodules, but with + // a single submodule, the BaseSize specification is already the answer. + if len(disc.Modules[i].SubModules) == 1 { + continue + } + // weightTotalInitial is the weight of the module using the initial // number of rows. weightTotalInitial := 0 diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index 35c46c2cf9..e0136981c1 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -44,7 +44,7 @@ var LimitlessCompilationParams = distributed.CompilationParams{ FixedNbPublicInput: 1 << 10, InitialCompilerSize: 1 << 18, InitialCompilerSizeConglo: 1 << 13, - ColumnProfileMPTS: []int{17, 317, 30, 3, 4, 15, 0, 1}, + ColumnProfileMPTS: []int{17, 335, 37, 3, 5, 15, 0, 1}, ColumnProfileMPTSPrecomputed: 22, } From 65da196e35833edb79682bc96af630756800c1b6 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Mon, 24 Nov 2025 12:55:22 +0000 Subject: [PATCH 11/36] feat: BLS glue (#915) commit c5117f95f1f1ecdbe78b2e670116e0cd977bc0e1 Author: Ivo Kubjas Date: Wed Nov 19 02:48:12 2025 +0000 feat: add default circuit sizes commit 439b91138cadcd41a738f3f8097a385978d1d3ff Author: Ivo Kubjas Date: Sun Nov 16 21:08:48 2025 +0000 fix: more unique constraint names commit be09cf79d8fb0f1d1c884c496935e62e881d710b Author: Ivo Kubjas Date: Sun Nov 16 20:52:05 2025 +0000 fix: incorrect limb count for scalar commit 206ee014a61e0f38744994ac20efc133a47e13df Author: Ivo Kubjas Date: Sun Nov 16 20:48:05 2025 +0000 fix: ensure unique constraints commit afbfaee9e3ee70872dfe4b491d6a5c4a00031575 Author: Ivo Kubjas Date: Sun Nov 16 20:43:31 2025 +0000 fix: store new rangechecker commit dd4e1eb257bd7a375f6772c1f49a6f22ca2f7559 Author: Ivo Kubjas Date: Sun Nov 16 20:20:59 2025 +0000 chore: clarify error message commit f76c7c46e3836960f5e31ec13467e76bc71c3c37 Author: Ivo Kubjas Date: Sun Nov 16 20:18:36 2025 +0000 chore: remove excessive logging commit b83d78c6add1c455e3bb4579add803ac01047ee7 Author: Ivo Kubjas Date: Sun Nov 16 20:14:15 2025 +0000 fix: compilation errors commit 6f60e01ad3cb150107ed5a6879d73edf33145eb4 Merge: 5fdb03972 cbf344e13 Author: Ivo Kubjas Date: Sun Nov 16 20:12:33 2025 +0000 Merge branch 'main' into feat/bls-glue commit 5fdb039726a9031eefefdf27ec306aeee188cbbe Author: Ivo Kubjas Date: Fri Sep 26 08:14:18 2025 +0000 test: make source local commit 4d526edd0300f146eab0f1f2733f24d1beb24a26 Author: Ivo Kubjas Date: Mon Sep 29 22:18:09 2025 +0000 feat: integrate BLS precompile with zkevm commit 81a88769d995f780224a79bc3bdce7ba5845cb58 Author: Ivo Kubjas Date: Mon Sep 29 22:17:48 2025 +0000 docs: limits documentation commit a102526835b0abbaaece8e659d82a02df1b83d69 Author: Ivo Kubjas Date: Mon Sep 29 22:17:26 2025 +0000 feat: precise bls source getters commit d312c3d161a23db88ee600f18d4753c221f6ffa8 Author: Ivo Kubjas Date: Mon Sep 29 13:14:35 2025 +0000 test: regenerate testdata commit b392c30ce900044aa4ff7039ae82f154cd459611 Author: Ivo Kubjas Date: Mon Sep 29 11:36:29 2025 +0000 fix: align G2 tower order with gnark commit e823165a8e619f44d93c84003a86ccb04ec82628 Author: Ivo Kubjas Date: Fri Sep 26 13:09:09 2025 +0000 feat: remove circuit number limits commit 152d2a0bee5188adb8e6b229c0159a89e34249ac Author: Ivo Kubjas Date: Wed Sep 24 11:28:54 2025 +0000 test: update included test files commit 3bf1ff6087be1d93f805f0590b2f47d3cf87ce5d Author: Ivo Kubjas Date: Wed Sep 24 10:49:29 2025 +0000 fix: change ordering of serialized values commit c1bb5b6bcd606678ebf3aa74bee966026277015a Author: Ivo Kubjas Date: Thu Sep 18 09:36:56 2025 +0000 chore: go mod tidy commit 9b138df0d01a157f1cbdde06fec5f31a6efc4773 Author: Ivo Kubjas Date: Fri Sep 5 11:37:24 2025 +0000 test: add BLS testdata generator commit 44d925150597f3ebed53178f8fe911cfa9c42469 Author: Ivo Kubjas Date: Tue Sep 2 11:05:12 2025 +0000 test: include minimal number of test files commit 81d4abf18c7d950915841a395dfbcf646cc7b0e1 Author: Ivo Kubjas Date: Fri Aug 29 15:09:24 2025 +0000 feat: add BLS precompile glue commit 6902d280a653c917f9f8a7e4202794c2759eab4d Author: Ivo Kubjas Date: Fri Aug 29 15:09:01 2025 +0000 feat: csvtraces fill up to column size commit ae6bc69b9f0ff0d53a80291fc457959476b52b0d Author: Ivo Kubjas Date: Fri Aug 29 15:07:38 2025 +0000 fix: gnark schema walker field commit 896ba9858725f0ea01e7e3156fa4e8866e9fd8fd Author: Ivo Kubjas Date: Fri Aug 29 15:07:17 2025 +0000 fix: typed builder commit af228c75f4ae28f818d0466b0ac80b132d93bfd2 Author: Ivo Kubjas Date: Fri Aug 29 15:06:50 2025 +0000 fix: remove unused test engine option commit 8bbd5ba8aec4446b5488ff6aca3f63f6a196c97a Author: Ivo Kubjas Date: Fri Aug 29 15:06:38 2025 +0000 fix: gnark logderiv interface change commit 2d1d55ee5305a8047dfbc5163c0324312568d48d Author: Ivo Kubjas Date: Fri Aug 29 15:05:50 2025 +0000 chore: cherry pick gkr changes from smallfield commit b6a374a4913e89bde2434876ec534d12982ddd12 Author: Ivo Kubjas Date: Thu Sep 18 09:35:46 2025 +0000 chore: gnark dependency update --- .gitignore | 8 +- prover/circuits/aggregation/circuit.go | 2 +- .../v0/compress/internal/io.go | 5 +- .../v0/compress/lzss/snark.go | 2 +- prover/circuits/blobdecompression/v1/snark.go | 2 +- prover/circuits/internal/utils.go | 8 +- prover/circuits/prove.go | 3 +- prover/crypto/mimc/factories.go | 6 +- prover/crypto/mimc/gkrmimc/finalgates.go | 104 - prover/crypto/mimc/gkrmimc/gkrcircuit.go | 167 +- prover/crypto/mimc/gkrmimc/normalgates.go | 88 - prover/crypto/mimc/msethash_test.go | 3 +- prover/crypto/vortex/commitment.go | 2 +- prover/crypto/vortex/opening_verifier.go | 2 +- prover/go.mod | 28 +- prover/go.sum | 65 +- .../plonkinternal/external_rangechecker.go | 6 +- prover/utils/csvtraces/csvtraces.go | 6 +- prover/utils/gnarkutil/var_counting.go | 3 +- prover/zkevm/full.go | 34 + prover/zkevm/prover/bls/bls.go | 71 + prover/zkevm/prover/bls/circuits_add.go | 73 + prover/zkevm/prover/bls/circuits_element.go | 202 + prover/zkevm/prover/bls/circuits_maps.go | 95 + .../zkevm/prover/bls/circuits_membership.go | 112 + prover/zkevm/prover/bls/circuits_msm.go | 85 + .../zkevm/prover/bls/circuits_pairingcheck.go | 101 + prover/zkevm/prover/bls/circuits_pointeval.go | 114 + prover/zkevm/prover/bls/input_fillers.go | 250 + prover/zkevm/prover/bls/limits.go | 108 + prover/zkevm/prover/bls/module_add.go | 103 + prover/zkevm/prover/bls/module_add_test.go | 91 + prover/zkevm/prover/bls/module_map.go | 83 + prover/zkevm/prover/bls/module_map_test.go | 91 + prover/zkevm/prover/bls/module_msm.go | 446 ++ prover/zkevm/prover/bls/module_msm_test.go | 106 + prover/zkevm/prover/bls/module_pair.go | 636 +++ prover/zkevm/prover/bls/module_pair_test.go | 90 + prover/zkevm/prover/bls/module_pointeval.go | 97 + .../zkevm/prover/bls/module_pointeval_test.go | 86 + prover/zkevm/prover/bls/native_ops.go | 166 + .../prover/bls/testdata/bls_g1_add_inputs.csv | 385 ++ .../prover/bls/testdata/bls_g1_map_inputs.csv | 25 + .../bls/testdata/bls_g1_msm_inputs-0.csv | 2681 +++++++++ .../prover/bls/testdata/bls_g2_add_inputs.csv | 769 +++ .../prover/bls/testdata/bls_g2_map_inputs.csv | 97 + .../bls/testdata/bls_g2_msm_inputs-0.csv | 4985 +++++++++++++++++ .../bls/testdata/bls_pairing_inputs-0.csv | 2117 +++++++ .../bls/testdata/bls_pointeval_inputs-0.csv | 801 +++ prover/zkevm/prover/bls/testdata/main.go | 59 + .../prover/bls/testdata/testdata_generate.go | 278 + .../bls/testdata/testdata_generate_add.go | 211 + .../bls/testdata/testdata_generate_map.go | 213 + .../bls/testdata/testdata_generate_msm.go | 270 + .../bls/testdata/testdata_generate_pair.go | 652 +++ .../testdata/testdata_generate_pointeval.go | 606 ++ .../testdata_generate_pointeval_trusted.go | 147 + .../testdata_generate_pointeval_types.go | 134 + .../prover/bls/testdata/testdata_test.go | 76 + prover/zkevm/prover/bls/zkevm_modules.go | 37 + prover/zkevm/settings.go | 2 + prover/zkevm/zkevm.go | 63 +- 62 files changed, 18018 insertions(+), 340 deletions(-) delete mode 100644 prover/crypto/mimc/gkrmimc/finalgates.go delete mode 100644 prover/crypto/mimc/gkrmimc/normalgates.go create mode 100644 prover/zkevm/prover/bls/bls.go create mode 100644 prover/zkevm/prover/bls/circuits_add.go create mode 100644 prover/zkevm/prover/bls/circuits_element.go create mode 100644 prover/zkevm/prover/bls/circuits_maps.go create mode 100644 prover/zkevm/prover/bls/circuits_membership.go create mode 100644 prover/zkevm/prover/bls/circuits_msm.go create mode 100644 prover/zkevm/prover/bls/circuits_pairingcheck.go create mode 100644 prover/zkevm/prover/bls/circuits_pointeval.go create mode 100644 prover/zkevm/prover/bls/input_fillers.go create mode 100644 prover/zkevm/prover/bls/limits.go create mode 100644 prover/zkevm/prover/bls/module_add.go create mode 100644 prover/zkevm/prover/bls/module_add_test.go create mode 100644 prover/zkevm/prover/bls/module_map.go create mode 100644 prover/zkevm/prover/bls/module_map_test.go create mode 100644 prover/zkevm/prover/bls/module_msm.go create mode 100644 prover/zkevm/prover/bls/module_msm_test.go create mode 100644 prover/zkevm/prover/bls/module_pair.go create mode 100644 prover/zkevm/prover/bls/module_pair_test.go create mode 100644 prover/zkevm/prover/bls/module_pointeval.go create mode 100644 prover/zkevm/prover/bls/module_pointeval_test.go create mode 100644 prover/zkevm/prover/bls/native_ops.go create mode 100644 prover/zkevm/prover/bls/testdata/bls_g1_add_inputs.csv create mode 100644 prover/zkevm/prover/bls/testdata/bls_g1_map_inputs.csv create mode 100644 prover/zkevm/prover/bls/testdata/bls_g1_msm_inputs-0.csv create mode 100644 prover/zkevm/prover/bls/testdata/bls_g2_add_inputs.csv create mode 100644 prover/zkevm/prover/bls/testdata/bls_g2_map_inputs.csv create mode 100644 prover/zkevm/prover/bls/testdata/bls_g2_msm_inputs-0.csv create mode 100644 prover/zkevm/prover/bls/testdata/bls_pairing_inputs-0.csv create mode 100644 prover/zkevm/prover/bls/testdata/bls_pointeval_inputs-0.csv create mode 100644 prover/zkevm/prover/bls/testdata/main.go create mode 100644 prover/zkevm/prover/bls/testdata/testdata_generate.go create mode 100644 prover/zkevm/prover/bls/testdata/testdata_generate_add.go create mode 100644 prover/zkevm/prover/bls/testdata/testdata_generate_map.go create mode 100644 prover/zkevm/prover/bls/testdata/testdata_generate_msm.go create mode 100644 prover/zkevm/prover/bls/testdata/testdata_generate_pair.go create mode 100644 prover/zkevm/prover/bls/testdata/testdata_generate_pointeval.go create mode 100644 prover/zkevm/prover/bls/testdata/testdata_generate_pointeval_trusted.go create mode 100644 prover/zkevm/prover/bls/testdata/testdata_generate_pointeval_types.go create mode 100644 prover/zkevm/prover/bls/testdata/testdata_test.go create mode 100644 prover/zkevm/prover/bls/zkevm_modules.go diff --git a/.gitignore b/.gitignore index adac324f1f..b707526579 100644 --- a/.gitignore +++ b/.gitignore @@ -106,7 +106,9 @@ __pycache__/ /jvm-libs/**/darwin-x86-64 /prover/**/*.csv -/prover/**/testdata/ +# Exclude files in testdata directories, but not the directories themselves to allow +# add exceptions (gitignore doesn't permit exceptions when root dir is excluded) +/prover/**/testdata/* # Testdata, otherwise that's 400MB of data downloaded /prover/**/integration-testing/testdata/prover-requests/ /prover/**/vendor/ @@ -147,4 +149,6 @@ __pycache__/ !prover/**/testdata/**/*.csv !prover/**/utils/profiling !prover/**/verifying_key.bin -!/sdk/src/lib/compressor/bin \ No newline at end of file +!/sdk/src/lib/compressor/bin +# Allow BLS glue testdata generators +!prover/zkevm/prover/bls/testdata/*.go diff --git a/prover/circuits/aggregation/circuit.go b/prover/circuits/aggregation/circuit.go index 65d33bb20f..532eb436f7 100644 --- a/prover/circuits/aggregation/circuit.go +++ b/prover/circuits/aggregation/circuit.go @@ -74,7 +74,7 @@ func (c *Circuit) Define(api frontend.API) error { } // create a lookup table of actual public inputs - actualPI := make([]*logderivlookup.Table, (emFr{}).NbLimbs()) + actualPI := make([]logderivlookup.Table, (emFr{}).NbLimbs()) for i := range actualPI { actualPI[i] = logderivlookup.New(api) } diff --git a/prover/circuits/blobdecompression/v0/compress/internal/io.go b/prover/circuits/blobdecompression/v0/compress/internal/io.go index 761860fe61..bb347a05ad 100644 --- a/prover/circuits/blobdecompression/v0/compress/internal/io.go +++ b/prover/circuits/blobdecompression/v0/compress/internal/io.go @@ -15,11 +15,11 @@ import ( // TODO Use std/rangecheck instead type RangeChecker struct { api frontend.API - tables map[uint]*logderivlookup.Table + tables map[uint]logderivlookup.Table } func NewRangeChecker(api frontend.API) *RangeChecker { - return &RangeChecker{api: api, tables: make(map[uint]*logderivlookup.Table)} + return &RangeChecker{api: api, tables: make(map[uint]logderivlookup.Table)} } func (r *RangeChecker) AssertLessThan(bound uint, c ...frontend.Variable) { @@ -36,6 +36,7 @@ func (r *RangeChecker) AssertLessThan(bound uint, c ...frontend.Variable) { cRangeTable, ok := r.tables[bound] if !ok { cRangeTable := logderivlookup.New(r.api) + r.tables[bound] = cRangeTable for i := uint(0); i < bound; i++ { cRangeTable.Insert(0) } diff --git a/prover/circuits/blobdecompression/v0/compress/lzss/snark.go b/prover/circuits/blobdecompression/v0/compress/lzss/snark.go index ae7fb5e4d2..90080e2ed0 100644 --- a/prover/circuits/blobdecompression/v0/compress/lzss/snark.go +++ b/prover/circuits/blobdecompression/v0/compress/lzss/snark.go @@ -126,7 +126,7 @@ func Decompress(api frontend.API, c []frontend.Variable, cLength frontend.Variab return dLength, nil } -func initAddrTable(api frontend.API, bytes, c []frontend.Variable, wordNbBits int, backrefs []lzss.BackrefType) *logderivlookup.Table { +func initAddrTable(api frontend.API, bytes, c []frontend.Variable, wordNbBits int, backrefs []lzss.BackrefType) logderivlookup.Table { for i := range backrefs { if backrefs[i].NbBitsLength != backrefs[0].NbBitsLength { panic("all backref types must have the same length size") diff --git a/prover/circuits/blobdecompression/v1/snark.go b/prover/circuits/blobdecompression/v1/snark.go index 6f0749bd56..82e7832314 100644 --- a/prover/circuits/blobdecompression/v1/snark.go +++ b/prover/circuits/blobdecompression/v1/snark.go @@ -180,7 +180,7 @@ func CheckBatchesSums(api frontend.API, hasher snarkHash.FieldHasher, nbBatches } var ( - partialSumsT *logderivlookup.Table + partialSumsT logderivlookup.Table partialSums []frontend.Variable ) // create a table of claimed sums and prove their correctness as we go through the payload diff --git a/prover/circuits/internal/utils.go b/prover/circuits/internal/utils.go index ea22a3927a..b65736e5c2 100644 --- a/prover/circuits/internal/utils.go +++ b/prover/circuits/internal/utils.go @@ -40,7 +40,7 @@ func AssertIsLessIf(api frontend.API, cond, a, b frontend.Variable) { api.AssertIsLessOrEqual(a_, b_) } -func SliceToTable(api frontend.API, slice []frontend.Variable) *logderivlookup.Table { +func SliceToTable(api frontend.API, slice []frontend.Variable) logderivlookup.Table { table := logderivlookup.New(api) for i := range slice { table.Insert(slice[i]) @@ -271,7 +271,7 @@ func (s VarSlice) Range(api frontend.API) *Range { func Concat(api frontend.API, maxLinearizedLength int, slices ...VarSlice) Slice[frontend.Variable] { res := Slice[frontend.Variable]{make([]frontend.Variable, maxLinearizedLength), 0} - var outT *logderivlookup.Table + var outT logderivlookup.Table { // hint inLen := 2 * len(slices) for i := range slices { @@ -414,7 +414,7 @@ func ChecksumSubSlices(api frontend.API, hsh snarkHash.FieldHasher, slice []fron lastElems[i] = plonk.EvaluateExpression(api, e, endpointsR.InRange[i], 0, -1-len(slice), 1, len(slice)) } - var lastElemsT *logderivlookup.Table + var lastElemsT logderivlookup.Table if len(slice) > 1 { lastElemsT = SliceToTable(api, lastElems) lastElemsT.Insert(len(slice)) // in case subEndPoints is tight @@ -730,7 +730,7 @@ func PartitionSlice(api frontend.API, s []frontend.Variable, selectors []fronten panic(err) } - subsT := make([]*logderivlookup.Table, len(subs)) + subsT := make([]logderivlookup.Table, len(subs)) for i := range subs { copy(subs[i], subsGlued[:len(subs[i])]) subsGlued = subsGlued[len(subs[i]):] diff --git a/prover/circuits/prove.go b/prover/circuits/prove.go index e8acad381d..d55b32ef5d 100644 --- a/prover/circuits/prove.go +++ b/prover/circuits/prove.go @@ -86,7 +86,8 @@ func ProveCheck(setup *Setup, assignment frontend.Circuit, opts ...any) (plonk.P assignment, assignment, setup.Circuit.Field(), - test.WithBackendProverOptions(proverOpts...), + // this test engine prover option was no-op before and it was removed + // test.WithBackendProverOptions(proverOpts...), ) return nil, fmt.Errorf("while running the plonk prover: %w", errDetail) } diff --git a/prover/crypto/mimc/factories.go b/prover/crypto/mimc/factories.go index dda6e170e8..bb6a1fecd2 100644 --- a/prover/crypto/mimc/factories.go +++ b/prover/crypto/mimc/factories.go @@ -65,7 +65,7 @@ type externalHashBuilderIFace interface { // storeCommitBuilder implements [frontend.Builder], [frontend.Committer] and // other methods useful to define a custom external hasher. type storeCommitBuilder interface { - frontend.Builder + frontend.Builder[constraint.U64] frontend.Committer SetKeyValue(key, value any) GetKeyValue(key any) (value any) @@ -168,8 +168,8 @@ func (h *ExternalHasher) compress(state, block frontend.Variable) frontend.Varia // taking part in each claim. func NewExternalHasherBuilder(addGateForHashCheck bool) (frontend.NewBuilder, func() [][3][2]int) { rcCols := make(chan [][3][2]int) - return func(field *big.Int, config frontend.CompileConfig) (frontend.Builder, error) { - b, err := scs.NewBuilder(field, config) + return func(field *big.Int, config frontend.CompileConfig) (frontend.Builder[constraint.U64], error) { + b, err := scs.NewBuilder[constraint.U64](field, config) if err != nil { return nil, fmt.Errorf("could not create new native builder: %w", err) } diff --git a/prover/crypto/mimc/gkrmimc/finalgates.go b/prover/crypto/mimc/gkrmimc/finalgates.go deleted file mode 100644 index 340125ca7c..0000000000 --- a/prover/crypto/mimc/gkrmimc/finalgates.go +++ /dev/null @@ -1,104 +0,0 @@ -package gkrmimc - -import ( - "github.com/consensys/gnark/frontend" - gGkr "github.com/consensys/gnark/std/gkr" - "github.com/consensys/linea-monorepo/prover/maths/field" - "github.com/consensys/linea-monorepo/prover/utils" -) - -// FinalRoundGate represents the last round in a gnark circuit -// -// It performs all the actions required to complete the compression function of -// MiMC; including (1) the last application of the S-box x^17 as in the -// intermediate rounds and then adds twice the initial state and once the block -// to the result before returning. -type FinalRoundGate struct { - Ark frontend.Variable -} - -// NewFinalRoundGateGnark creates a new FinalRoundGate using the provided -// round constant which should correspond to the final rounds's constant of -// MiMC. -func NewFinalRoundGateGnark(ark field.Element) FinalRoundGate { - return FinalRoundGate{ - Ark: ark, - } -} - -func (m FinalRoundGate) Evaluate(api gGkr.GateAPI, input ...frontend.Variable) frontend.Variable { - - if len(input) != 3 { - utils.Panic("expected fan-in of 3, got %v", len(input)) - } - - // Parse the inputs - initialState := input[0] - block := input[1] - currentState := input[2] - - // Compute the S-box function - sum := api.Add(currentState, initialState, m.Ark) - sumPow16 := api.Mul(sum, sum) // sum^2 - sumPow16 = api.Mul(sumPow16, sumPow16) // sum^4 - sumPow16 = api.Mul(sumPow16, sumPow16) // sum^8 - sumPow16 = api.Mul(sumPow16, sumPow16) // sum^16 - sum = api.Mul(sumPow16, sum) - - // And add back the last values, following the Miyaguchi-Preneel - // construction. - return api.Add(sum, initialState, initialState, block) -} - -func (m FinalRoundGate) Degree() int { - return 17 -} - -// FinalRoundGateCrypto represents the last round in the GKR circuit for MiMC. -// -// It performs all the actions required to complete the compression function of -// MiMC; including (1) the last application of the S-box x^17 as in the -// intermediate rounds and then adds twice the initial state and once the block -// to the result before returning. -type FinalRoundGateCrypto struct { - Ark field.Element -} - -// NewFinalRoundGateCrypto creates a new MiMCCipherGate with the given parameters -func NewFinalRoundGateCrypto(ark field.Element) FinalRoundGateCrypto { - return FinalRoundGateCrypto{ - Ark: ark, - } -} - -func (m FinalRoundGateCrypto) Evaluate(input ...field.Element) field.Element { - - if len(input) != 3 { - utils.Panic("expected fan-in of 3, got %v", len(input)) - } - - // Parse the inputs - initialState := input[0] - block := input[1] - curr := input[2] - - // Compute the S-box function - var sum, sumPow16 field.Element - sum.Add(&initialState, &curr).Add(&sum, &m.Ark) - sumPow16.Mul(&sum, &sum) - sumPow16.Mul(&sumPow16, &sumPow16) - sumPow16.Mul(&sumPow16, &sumPow16) - sumPow16.Mul(&sumPow16, &sumPow16) - sum.Mul(&sumPow16, &sum) - - // And add back the last values, following the Miyaguchi-Preneel - // construction. - sum.Add(&sum, &initialState) - sum.Add(&sum, &initialState) - sum.Add(&sum, &block) - return sum -} - -func (m FinalRoundGateCrypto) Degree() int { - return 17 -} diff --git a/prover/crypto/mimc/gkrmimc/gkrcircuit.go b/prover/crypto/mimc/gkrmimc/gkrcircuit.go index 0414ac9629..8764819baa 100644 --- a/prover/crypto/mimc/gkrmimc/gkrcircuit.go +++ b/prover/crypto/mimc/gkrmimc/gkrcircuit.go @@ -1,41 +1,35 @@ package gkrmimc import ( + "fmt" "strconv" "strings" - cGkr "github.com/consensys/gnark-crypto/ecc/bls12-377/fr/gkr" - "github.com/consensys/gnark/constraint" - cs "github.com/consensys/gnark/constraint/bls12-377" + "github.com/consensys/gnark-crypto/ecc" "github.com/consensys/gnark/constraint/solver" + "github.com/consensys/gnark/constraint/solver/gkrgates" "github.com/consensys/gnark/frontend" - gGkr "github.com/consensys/gnark/std/gkr" - "github.com/consensys/gnark/std/hash" - gmimc "github.com/consensys/gnark/std/hash/mimc" + "github.com/consensys/gnark/std/gkrapi" + "github.com/consensys/gnark/std/gkrapi/gkr" "github.com/consensys/gnark/std/multicommit" "github.com/consensys/linea-monorepo/prover/crypto/mimc" + "github.com/consensys/linea-monorepo/prover/maths/field" "github.com/consensys/linea-monorepo/prover/utils" ) var ( prefetchSize = 4 // all layers before the "actual" MiMc round layers numGates int = prefetchSize + len(mimc.Constants) - gateNames []string + gateNames []gkr.GateName ) func init() { // Registers the names of the GKR gates into the global GKR registry. createGateNames() - registerGates() - - // Registers the mimc hash function in the hash builder registry. - hash.Register("mimc", func(api frontend.API) (hash.FieldHasher, error) { - h, err := gmimc.NewMiMC(api) - return &h, err - }) + if err := registerGates(); err != nil { + panic(fmt.Errorf("failed to register gates: %w", err)) + } - // Registers the hasher to be used in the GKR prover - cs.RegisterHashBuilder("mimc", mimc.NewMiMC) solver.RegisterHint(mimcHintfunc) } @@ -56,7 +50,7 @@ func createGateNames() { nbDigits++ } - gateNames = make([]string, numGates) + gateNames = make([]gkr.GateName, numGates) gateNames[0] = "input" // no name necessary. will map to nil. this is just for clarity gateNames[1] = "input" @@ -67,49 +61,42 @@ func createGateNames() { var gateNameBuilder strings.Builder gateNameBuilder.WriteString("mimc") writePaddedHex(&gateNameBuilder, i, nbDigits) - gateNames[i] = gateNameBuilder.String() + gateNames[i] = gkr.GateName(gateNameBuilder.String()) } } -// registerGates instantiates and populates the cGkr and gGkr global variables +// registerGates instantiates and populates the cGkr and gkr global variables // which contains the "normal" and the "gnark" version of the GKR gates forming // the MiMC GKR circuit. -func registerGates() { - - var ( - cDegree17 = cGkr.WithDegree(17) - gDegree17 = gGkr.WithUnverifiedDegree(17) +func registerGates() error { + const ( + ROUND_GATE_NB_INPUTS = 2 // initial state and current state + FINAL_GATE_NB_INPUTS = 3 // initial state, block and current state + GATE_DEGREE = 17 // MiMC S-box degree for BLS12-377 ) - for i := 4; i < numGates-1; i++ { - - var ( - name = gateNames[i] - gateG = NewRoundGateGnark(mimc.Constants[i-prefetchSize]) - gateC = NewRoundGateCrypto(mimc.Constants[i-prefetchSize]) - ) - - if e := gGkr.RegisterGate(gGkr.GateName(name), gateG.Evaluate, 2, gDegree17); e != nil { - panic(e) - } - - if e := cGkr.RegisterGate(cGkr.GateName(name), gateC.Evaluate, 2, cDegree17); e != nil { - panic(e) + if err := gkrgates.Register( + RoundGate(mimc.Constants[i-prefetchSize]), + ROUND_GATE_NB_INPUTS, + gkrgates.WithName(gateNames[i]), + gkrgates.WithUnverifiedDegree(GATE_DEGREE), + gkrgates.WithCurves(ecc.BLS12_377), + ); err != nil { + return fmt.Errorf("failed to register gate %s: %v", gateNames[i], err) } } - var ( - name = gateNames[numGates-1] - gateG = NewFinalRoundGateGnark(mimc.Constants[len(mimc.Constants)-1]) - gateC = NewFinalRoundGateCrypto(mimc.Constants[len(mimc.Constants)-1]) - ) - - if e := gGkr.RegisterGate(gGkr.GateName(name), gateG.Evaluate, 3, gDegree17); e != nil { - panic(e) - } - if e := cGkr.RegisterGate(cGkr.GateName(name), gateC.Evaluate, 3, cDegree17); e != nil { - panic(e) + if err := gkrgates.Register( + FinalRoundGate(mimc.Constants[len(mimc.Constants)-1]), + FINAL_GATE_NB_INPUTS, + gkrgates.WithName(gateNames[numGates-1]), + gkrgates.WithUnverifiedDegree(GATE_DEGREE), + gkrgates.WithCurves(ecc.BLS12_377), + ); err != nil { + return fmt.Errorf("failed to register gate %s: %v", gateNames[numGates-1], err) } + + return nil } // gkrMiMC constructs and return the GKR circuit. The function is concretely @@ -119,25 +106,25 @@ func registerGates() { // The returned object symbolizees the last layer of the GKR circuit and formally // contains the result of the MiMC block compression as computed by the GKR // circuit. -func gkrMiMC(gkr *gGkr.API, initStates, blocks []frontend.Variable) (constraint.GkrVariable, error) { +func gkrMiMC(gkrapi *gkrapi.API, initStates, blocks []frontend.Variable) (gkr.Variable, error) { var err error - v := make([]constraint.GkrVariable, numGates-1) - if v[0], err = gkr.Import(initStates); err != nil { + v := make([]gkr.Variable, numGates-1) + if v[0], err = gkrapi.Import(initStates); err != nil { panic(err) } - if v[1], err = gkr.Import(blocks); err != nil { + if v[1], err = gkrapi.Import(blocks); err != nil { panic(err) } - v[2] = gkr.NamedGate("identity", v[0]) - v[3] = gkr.NamedGate("identity", v[1]) + v[2] = gkrapi.NamedGate("identity", v[0]) + v[3] = gkrapi.NamedGate("identity", v[1]) for i := 4; i < numGates-1; i++ { - v[i] = gkr.NamedGate(gGkr.GateName(gateNames[i]), v[2], v[i-1]) + v[i] = gkrapi.NamedGate(gateNames[i], v[2], v[i-1]) } - res := gkr.NamedGate(gGkr.GateName(gateNames[numGates-1]), v[2], v[3], v[numGates-2]) + res := gkrapi.NamedGate(gateNames[numGates-1], v[2], v[3], v[numGates-2]) return res, nil } @@ -151,7 +138,7 @@ func gkrMiMC(gkr *gGkr.API, initStates, blocks []frontend.Variable) (constraint. // instances are the inner indexes func checkWithGkr(api frontend.API, initStates, blocks, allegedNewState []frontend.Variable) { - gkr := gGkr.NewApi() + gkr := gkrapi.New() D, err := gkrMiMC(gkr, initStates, blocks) if err != nil { @@ -159,7 +146,7 @@ func checkWithGkr(api frontend.API, initStates, blocks, allegedNewState []fronte } // This creates a placeholder that will contain the GKR assignment - var solution gGkr.Solution + var solution gkrapi.Solution if solution, err = gkr.Solve(api); err != nil { panic(err) } @@ -174,9 +161,9 @@ func checkWithGkr(api frontend.API, initStates, blocks, allegedNewState []fronte api, func(api frontend.API, initialChallenge frontend.Variable) error { - // "mimc" means that we are using MiMC hashes to compute the FS challenges + // "MIMC" means that we are using MiMC hashes to compute the FS challenges // this part is responsible for verifying the GKR proof. - err = solution.Verify("mimc", initialChallenge) + err = solution.Verify("MIMC", initialChallenge) if err != nil { panic(err) } @@ -198,3 +185,61 @@ func checkWithGkr(api frontend.API, initStates, blocks, allegedNewState []fronte ) } + +// RoundGate represents a normal round of gkr (i.e. any round except for the +// first and last ones). It represents the computation of the S-box of MiMC +// +// (curr + init + ark)^17 +// +// This struct is meant to be used to represent the GKR gate within a gnark +// circuit and is used for the verifier part of GKR. +func RoundGate(ark field.Element) gkr.GateFunction { + return func(api gkr.GateAPI, input ...frontend.Variable) frontend.Variable { + if len(input) != 2 { + panic("mimc has fan-in 2") + } + + initialState := input[0] + curr := input[1] + + // Compute the s-box (curr + init + ark)^17 + sum := api.Add(curr, initialState, ark) + + sumPow16 := api.Mul(sum, sum) // sum^2 + sumPow16 = api.Mul(sumPow16, sumPow16) // sum^4 + sumPow16 = api.Mul(sumPow16, sumPow16) // sum^8 + sumPow16 = api.Mul(sumPow16, sumPow16) // sum^16 + return api.Mul(sumPow16, sum) + } +} + +// FinalRoundGate represents the last round in a gnark circuit +// +// It performs all the actions required to complete the compression function of +// MiMC; including (1) the last application of the S-box x^17 as in the +// intermediate rounds and then adds twice the initial state and once the block +// to the result before returning. +func FinalRoundGate(ark field.Element) gkr.GateFunction { + return func(api gkr.GateAPI, input ...frontend.Variable) frontend.Variable { + if len(input) != 3 { + utils.Panic("expected fan-in of 3, got %v", len(input)) + } + + // Parse the inputs + initialState := input[0] + block := input[1] + currentState := input[2] + + // Compute the S-box function + sum := api.Add(currentState, initialState, ark) + sumPow16 := api.Mul(sum, sum) // sum^2 + sumPow16 = api.Mul(sumPow16, sumPow16) // sum^4 + sumPow16 = api.Mul(sumPow16, sumPow16) // sum^8 + sumPow16 = api.Mul(sumPow16, sumPow16) // sum^16 + sum = api.Mul(sumPow16, sum) + + // And add back the last values, following the Miyaguchi-Preneel + // construction. + return api.Add(sum, initialState, initialState, block) + } +} diff --git a/prover/crypto/mimc/gkrmimc/normalgates.go b/prover/crypto/mimc/gkrmimc/normalgates.go deleted file mode 100644 index d8f4630cbf..0000000000 --- a/prover/crypto/mimc/gkrmimc/normalgates.go +++ /dev/null @@ -1,88 +0,0 @@ -package gkrmimc - -import ( - "github.com/consensys/gnark/frontend" - gGkr "github.com/consensys/gnark/std/gkr" - "github.com/consensys/linea-monorepo/prover/maths/field" -) - -// RoundGate represents a normal round of gkr (i.e. any round except for the -// first and last ones). It represents the computation of the S-box of MiMC -// -// (curr + init + ark)^17 -// -// This struct is meant to be used to represent the GKR gate within a gnark -// circuit and is used for the verifier part of GKR. -type RoundGate struct { - Ark frontend.Variable -} - -// NewRoundGateGnark creates a new RoundGate using the provided round constant -func NewRoundGateGnark(ark field.Element) *RoundGate { - return &RoundGate{ - Ark: ark, - } -} - -func (m RoundGate) Evaluate(api gGkr.GateAPI, input ...frontend.Variable) frontend.Variable { - - if len(input) != 2 { - panic("mimc has fan-in 2") - } - - initialState := input[0] - curr := input[1] - - // Compute the s-box (curr + init + ark)^17 - sum := api.Add(curr, initialState, m.Ark) - - sumPow16 := api.Mul(sum, sum) // sum^2 - sumPow16 = api.Mul(sumPow16, sumPow16) // sum^4 - sumPow16 = api.Mul(sumPow16, sumPow16) // sum^8 - sumPow16 = api.Mul(sumPow16, sumPow16) // sum^16 - return api.Mul(sumPow16, sum) -} - -func (m RoundGate) Degree() int { - return 17 -} - -// RoundGate represents a normal round of gkr (i.e. any round except for the -// first and last ones). It represents the computation of the S-box of MiMC -// -// (curr + init + ark)^17 -// -// This struct is meant to be used for the prover part of GKR -type RoundGateCrypto struct { - Ark field.Element -} - -// NewRoundGateCrypto construct a new instance of a [RoundGate] with the -// caller-supplied round constant `ark` -func NewRoundGateCrypto(ark field.Element) *RoundGateCrypto { - return &RoundGateCrypto{Ark: ark} -} - -func (m RoundGateCrypto) Evaluate(inputs ...field.Element) field.Element { - - if len(inputs) != 2 { - panic("mimc has fan-in 2") - } - - initialState := inputs[0] - curr := inputs[1] - - var sum, sumPow16 field.Element - sum.Add(&initialState, &curr).Add(&sum, &m.Ark) - sumPow16.Mul(&sum, &sum) - sumPow16.Mul(&sumPow16, &sumPow16) - sumPow16.Mul(&sumPow16, &sumPow16) - sumPow16.Mul(&sumPow16, &sumPow16) - sum.Mul(&sumPow16, &sum) - - return sum -} - -func (m RoundGateCrypto) Degree() int { - return 17 -} diff --git a/prover/crypto/mimc/msethash_test.go b/prover/crypto/mimc/msethash_test.go index 85bc4520ac..f1c8117863 100644 --- a/prover/crypto/mimc/msethash_test.go +++ b/prover/crypto/mimc/msethash_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/consensys/gnark-crypto/ecc" + "github.com/consensys/gnark/constraint" cs "github.com/consensys/gnark/constraint/bls12-377" "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/frontend/cs/scs" @@ -28,7 +29,7 @@ func TestMSetHash(t *testing.T) { circuit = &MsetOfSingletonGnarkTestCircuit{} assigned = &MsetOfSingletonGnarkTestCircuit{} blsField = ecc.BLS12_377.ScalarField() - builder = scs.NewBuilder + builder = scs.NewBuilder[constraint.U64] msg = [12]uint64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} msgField = []field.Element{} mset = mimc.MSetHash{} diff --git a/prover/crypto/vortex/commitment.go b/prover/crypto/vortex/commitment.go index 8b90b335f7..158f6e328d 100644 --- a/prover/crypto/vortex/commitment.go +++ b/prover/crypto/vortex/commitment.go @@ -154,7 +154,7 @@ func (p *Params) hashSisHash(colHashes []field.Element) (leaves []types.Bytes32) leaves = make([]types.Bytes32, numChunks) parallel.Execute(numChunks, func(start, stop int) { - hasher := mimc.NewMiMC() + hasher := mimc.NewFieldHasher() for chunkID := start; chunkID < stop; chunkID++ { startChunk := chunkID * chunkSize hasher.Reset() diff --git a/prover/crypto/vortex/opening_verifier.go b/prover/crypto/vortex/opening_verifier.go index 4785b57f47..4958fb2d77 100644 --- a/prover/crypto/vortex/opening_verifier.go +++ b/prover/crypto/vortex/opening_verifier.go @@ -214,7 +214,7 @@ func (v *VerifierInputs) checkColumnInclusion() error { } else { // We assume that HashFunc (to be used for Merkle Tree) and NoSisHashFunc() // (to be used for in place of SIS hash) are the same i.e. the MiMC hash function - hasher := mimc.NewMiMC() + hasher := mimc.NewFieldHasher() hasher.Reset() s := hasher.SumElements(selectedSubCol) leaf = s.Bytes() diff --git a/prover/go.mod b/prover/go.mod index 407012b7db..f869118835 100644 --- a/prover/go.mod +++ b/prover/go.mod @@ -3,15 +3,15 @@ module github.com/consensys/linea-monorepo/prover go 1.24.6 require ( - github.com/bits-and-blooms/bitset v1.20.0 + github.com/bits-and-blooms/bitset v1.24.0 github.com/consensys/compress v0.2.5 - github.com/consensys/gnark v0.12.1-0.20250501002417-facdd9882b80 - github.com/consensys/gnark-crypto v0.17.1-0.20251006135912-abd34dcc6005 + github.com/consensys/gnark v0.14.1-0.20251115181224-9c9cf0deb462 + github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19 github.com/consensys/go-corset v1.1.28 github.com/crate-crypto/go-kzg-4844 v1.1.0 github.com/dlclark/regexp2 v1.7.0 github.com/dnlo/struct2csv v0.0.0-20190928115744-2f584471b24e - github.com/fxamacker/cbor/v2 v2.7.0 + github.com/fxamacker/cbor/v2 v2.9.0 github.com/go-playground/assert/v2 v2.2.0 github.com/go-playground/validator/v10 v10.28.0 github.com/gofrs/flock v0.12.0 @@ -22,12 +22,12 @@ require ( github.com/pierrec/lz4/v4 v4.1.22 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.19.1 - github.com/rs/zerolog v1.33.0 + github.com/rs/zerolog v1.34.0 github.com/shirou/gopsutil v3.21.11+incompatible github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.8.1 + github.com/spf13/cobra v1.10.1 github.com/spf13/viper v1.19.0 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 golang.org/x/crypto v0.42.0 golang.org/x/net v0.43.0 golang.org/x/sync v0.17.0 @@ -39,7 +39,6 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/consensys/bavard v0.1.31-0.20250314194434-b30d4344e6d4 // indirect github.com/crate-crypto/go-eth-kzg v1.3.0 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect @@ -52,15 +51,14 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect + github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -71,13 +69,13 @@ require ( github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/ronanh/intcomp v1.1.0 // indirect + github.com/ronanh/intcomp v1.1.1 // indirect github.com/sagikazarmark/locafero v0.6.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/pflag v1.0.9 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/supranational/blst v0.3.14 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect @@ -88,16 +86,14 @@ require ( golang.org/x/text v0.29.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - rsc.io/tmplfunc v0.0.3 // indirect ) require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/ethereum/go-ethereum v1.15.11 - github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pkg/profile v1.7.0 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 + golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b golang.org/x/sys v0.36.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/prover/go.sum b/prover/go.sum index 28fb91f0c5..0ffb726416 100644 --- a/prover/go.sum +++ b/prover/go.sum @@ -50,8 +50,8 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= -github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.24.0 h1:H4x4TuulnokZKvHLfzVRTHJfFfnHEeSYJizujEZvmAM= +github.com/bits-and-blooms/bitset v1.24.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -72,21 +72,19 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/consensys/bavard v0.1.31-0.20250314194434-b30d4344e6d4 h1:0J+ppRic2ZXsQE+Y+Lr9miam+RQVcWqwqe3SeiggR6s= -github.com/consensys/bavard v0.1.31-0.20250314194434-b30d4344e6d4/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= github.com/consensys/compress v0.2.5 h1:gJr1hKzbOD36JFsF1AN8lfXz1yevnJi1YolffY19Ntk= github.com/consensys/compress v0.2.5/go.mod h1:pyM+ZXiNUh7/0+AUjUf9RKUM6vSH7T/fsn5LLS0j1Tk= -github.com/consensys/gnark v0.12.1-0.20250501002417-facdd9882b80 h1:JwI7un1xgbRMJuUoTNMzv6K6SyFnTGUcZzM4f78cv/I= -github.com/consensys/gnark v0.12.1-0.20250501002417-facdd9882b80/go.mod h1:+EaICVL6Ks4qCnIYBa1biEaFBxqaPjyl1w11O7le3Nw= -github.com/consensys/gnark-crypto v0.17.1-0.20251006135912-abd34dcc6005 h1:hLawixMM6FMv9r0XYiktR4n5DzqCRYngUfl7biPhy+g= -github.com/consensys/gnark-crypto v0.17.1-0.20251006135912-abd34dcc6005/go.mod h1:uV1HwfBwGRj50DGK3LbDLeCvq0RX/vFXST3CRSAu0Fs= +github.com/consensys/gnark v0.14.1-0.20251115181224-9c9cf0deb462 h1:X2GtytWZIH0PT0g4RfFWu/56Fhus9Uf08cEacDmbN+E= +github.com/consensys/gnark v0.14.1-0.20251115181224-9c9cf0deb462/go.mod h1:y3yL/y4fe6pg5Hakknn5r8ukr19T6l8OZq90+PHVM1o= +github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19 h1:uUbFaofcFwkv5T/zbR/Gyfm06v84Rua9a1xv9VZrPAA= +github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19/go.mod h1:OgCH7cSoJ46c+nOzvQuwOrIE9fawpXMYOQFzj22Vy3E= github.com/consensys/go-corset v1.1.28 h1:4vaaIFAWCzEgGTz6YGm8rt7+0F6mHDT8DS2u+WWslFw= github.com/consensys/go-corset v1.1.28/go.mod h1:vIZh7T0k/hmDd2Aj73XJb/FaQedZB3BCcv3CUX9c9DQ= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/crate-crypto/go-eth-kzg v1.3.0 h1:05GrhASN9kDAidaFJOda6A4BEvgvuXbazXg/0E3OOdI= github.com/crate-crypto/go-eth-kzg v1.3.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= @@ -127,8 +125,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0= github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -199,8 +197,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -218,10 +216,9 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -268,8 +265,6 @@ github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBD github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2 h1:B+aWVgAx+GlFLhtYjIaF0uGjU3rzpl99Wf9wZWt+Mq8= -github.com/ingonyama-zk/icicle-gnark/v3 v3.2.2/go.mod h1:CH/cwcr21pPWH+9GtK/PFaa4OGTv4CtfkCKro6GpbRE= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -297,8 +292,9 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -318,9 +314,6 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -363,11 +356,11 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/ronanh/intcomp v1.1.0 h1:i54kxmpmSoOZFcWPMWryuakN0vLxLswASsGa07zkvLU= -github.com/ronanh/intcomp v1.1.0/go.mod h1:7FOLy3P3Zj3er/kVrU/pl+Ql7JFZj7bwliMGketo0IU= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= -github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/ronanh/intcomp v1.1.1 h1:+1bGV/wEBiHI0FvzS7RHgzqOpfbBJzLIxkqMJ9e6yxY= +github.com/ronanh/intcomp v1.1.1/go.mod h1:7FOLy3P3Zj3er/kVrU/pl+Ql7JFZj7bwliMGketo0IU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -398,12 +391,12 @@ github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= @@ -421,8 +414,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= @@ -478,8 +471,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= -golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -845,5 +838,3 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/prover/protocol/internal/plonkinternal/external_rangechecker.go b/prover/protocol/internal/plonkinternal/external_rangechecker.go index 41d1d6862a..e5827e96fb 100644 --- a/prover/protocol/internal/plonkinternal/external_rangechecker.go +++ b/prover/protocol/internal/plonkinternal/external_rangechecker.go @@ -48,7 +48,7 @@ type externalRangeChecker struct { // storeCommitBuilder implements [frontend.Builder], [frontend.Committer] and // [kvstore.Store]. type storeCommitBuilder interface { - frontend.Builder + frontend.Builder[constraint.U64] frontend.Committer SetKeyValue(key, value any) GetKeyValue(key any) (value any) @@ -77,8 +77,8 @@ type storeCommitBuilder interface { // ``` func newExternalRangeChecker(addGateForRangeCheck bool) (frontend.NewBuilder, func() [][2]int) { rcCols := make(chan [][2]int) - return func(field *big.Int, config frontend.CompileConfig) (frontend.Builder, error) { - b, err := scs.NewBuilder(field, config) + return func(field *big.Int, config frontend.CompileConfig) (frontend.Builder[constraint.U64], error) { + b, err := scs.NewBuilder[constraint.U64](field, config) if err != nil { return nil, fmt.Errorf("could not create new native builder: %w", err) } diff --git a/prover/utils/csvtraces/csvtraces.go b/prover/utils/csvtraces/csvtraces.go index 12c72dfbb9..4ad95aac44 100644 --- a/prover/utils/csvtraces/csvtraces.go +++ b/prover/utils/csvtraces/csvtraces.go @@ -211,7 +211,11 @@ func (c *CsvTrace) Assign(run *wizard.ProverRuntime, names ...string) { length := utils.NextPowerOfTwo(c.nbRows) for _, k := range names { if v, ok := c.mapped[k]; ok { - sv := smartvectors.RightZeroPadded(v, length) + colLength := run.Spec.Columns.GetSize(ifaces.ColID(k)) + if colLength < length { + utils.Panic("column %s has size %d, but trace has %d (padded to %d) rows", k, colLength, c.nbRows, length) + } + sv := smartvectors.RightZeroPadded(v, colLength) run.AssignColumn(ifaces.ColID(k), sv) } else { utils.Panic("column not found %s", k) diff --git a/prover/utils/gnarkutil/var_counting.go b/prover/utils/gnarkutil/var_counting.go index 1efb6a363c..2820a50e81 100644 --- a/prover/utils/gnarkutil/var_counting.go +++ b/prover/utils/gnarkutil/var_counting.go @@ -5,6 +5,7 @@ import ( "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/frontend/schema" + "github.com/consensys/linea-monorepo/prover/maths/field" ) // CountVariables count the variables of a circuit without compiling it. It returns @@ -16,7 +17,7 @@ func CountVariables(circ any) (nbPublic, nbSecret int) { tVar = reflect.ValueOf(struct{ A frontend.Variable }{}).FieldByName("A").Type() ) - s, err := schema.Walk(circ, tVar, nil) + s, err := schema.Walk(field.Modulus(), circ, tVar, nil) if err != nil { panic(err) } diff --git a/prover/zkevm/full.go b/prover/zkevm/full.go index 1a6a02fa8c..927d935348 100644 --- a/prover/zkevm/full.go +++ b/prover/zkevm/full.go @@ -16,6 +16,7 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils" "github.com/consensys/linea-monorepo/prover/zkevm/arithmetization" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/bls" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecarith" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecdsa" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecpair" @@ -36,6 +37,23 @@ const ( NbInputPerInstanceModexp256 = 10 NbInputPerInstanceModexpLarge = 1 NbInputPerInstanceEcdsa = 4 + + NbInputPerInstanceBLSG1Add = 16 + NbInputPerInstanceBLSG2Add = 16 + NbInputPerInstanceBLSG1Msm = 8 + NbInputPerInstanceBLSG2Msm = 6 + NbInputPerInstanceBLSMillerLoop = 4 + NbInputPerInstanceBLSFinalExp = 4 + NbInputPerInstanceBLSG1Membership = 8 + NbInputPerInstanceBLSG2Membership = 6 + NbInputPerInstanceBLSG1Map = 16 + NbInputPerInstanceBLSG2Map = 5 + NbInputPerInstanceBLSC1Membership = 16 + NbInputPerInstanceBLSC2Membership = 16 + NbInputPerInstanceBLSPointEval = 2 + NbInputPerInstanceBLSPointEvalFailure = 2 + + NbInputPerInstanceP256Verify = 6 ) var ( @@ -216,6 +234,22 @@ func FullZKEVMWithSuite(tl *config.TracesLimits, suite CompilationSuite, cfg *co MaxNumSha2F: tl.PrecompileSha2Blocks, NbInstancesPerCircuitSha2Block: NbInputPerInstanceSha2Block, }, + Bls: bls.Limits{ + NbG1AddInputInstances: NbInputPerInstanceBLSG1Add, + NbG2AddInputInstances: NbInputPerInstanceBLSG2Add, + NbG1MulInputInstances: NbInputPerInstanceBLSG1Msm, + NbG2MulInputInstances: NbInputPerInstanceBLSG2Msm, + NbMillerLoopInputInstances: NbInputPerInstanceBLSMillerLoop, + NbFinalExpInputInstances: NbInputPerInstanceBLSFinalExp, + NbG1MembershipInputInstances: NbInputPerInstanceBLSG1Membership, + NbG2MembershipInputInstances: NbInputPerInstanceBLSG2Membership, + NbG1MapToInputInstances: NbInputPerInstanceBLSG1Map, + NbG2MapToInputInstances: NbInputPerInstanceBLSG2Map, + NbC1MembershipInputInstances: NbInputPerInstanceBLSC1Membership, + NbC2MembershipInputInstances: NbInputPerInstanceBLSC2Membership, + NbPointEvalInputInstances: NbInputPerInstanceBLSPointEval, + NbPointEvalFailureInputInstances: NbInputPerInstanceBLSPointEvalFailure, + }, } // Initialize the Full zkEVM arithmetization diff --git a/prover/zkevm/prover/bls/bls.go b/prover/zkevm/prover/bls/bls.go new file mode 100644 index 0000000000..a0521fd516 --- /dev/null +++ b/prover/zkevm/prover/bls/bls.go @@ -0,0 +1,71 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" +) + +const ( + moduleName = "blsdata" +) + +type group int + +const ( + G1 group = iota + G2 +) + +type membership int + +const ( + CURVE membership = iota + GROUP +) + +const ROUND_NR = 0 + +func (g group) String() string { + switch g { + case G1: + return "G1" + case G2: + return "G2" + default: + panic("unknown group") + } +} + +func (g group) StringCurve() string { + switch g { + case G1: + return "C1" + case G2: + return "C2" + default: + panic("unknown group") + } +} + +func (g group) StringMap() string { + switch g { + case G1: + return "FP" + case G2: + return "FP2" + default: + panic("unknown group") + } +} + +func createColFn(comp *wizard.CompiledIOP, rootName string, size int) func(name string) ifaces.Column { + return func(name string) ifaces.Column { + return comp.InsertCommit(ROUND_NR, ifaces.ColIDf("%s_%s", rootName, name), size) + } +} + +func colNameFn(colName string) ifaces.ColID { + return ifaces.ColID(fmt.Sprintf("%s.%s", moduleName, colName)) +} diff --git a/prover/zkevm/prover/bls/circuits_add.go b/prover/zkevm/prover/bls/circuits_add.go new file mode 100644 index 0000000000..88d8fe9b7f --- /dev/null +++ b/prover/zkevm/prover/bls/circuits_add.go @@ -0,0 +1,73 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/std/algebra/emulated/sw_bls12381" + "github.com/consensys/gnark/std/evmprecompiles" + "github.com/consensys/gnark/std/math/emulated" +) + +const ( + nbRowsPerG1Add = 3 * nbG1Limbs // 2 for the inputs, 1 for the output + nbRowsPerG2Add = 3 * nbG2Limbs // 2 for the inputs, 1 for the output +) + +func nbRowsPerAdd(g group) int { + switch g { + case G1: + return nbRowsPerG1Add + case G2: + return nbRowsPerG2Add + default: + panic(fmt.Sprintf("unknown group for BLS add circuit: %v", g)) + } +} + +type addInstance[C convertable[T], T element] struct { + InputLeft, InputRight C `gnark:",public"` + Res C `gnark:",public"` +} +type multiAddCircuit[C convertable[T], T element] struct { + Instances []addInstance[C, T] +} + +func (c *multiAddCircuit[C, T]) Define(api frontend.API) error { + f, err := emulated.NewField[sw_bls12381.BaseField](api) + if err != nil { + return fmt.Errorf("new field: %w", err) + } + nbInstances := len(c.Instances) + switch vv := any(c.Instances).(type) { + case []addInstance[g1ElementWizard, sw_bls12381.G1Affine]: + for i := 0; i < nbInstances; i++ { + left := vv[i].InputLeft.ToElement(api, f) + right := vv[i].InputRight.ToElement(api, f) + expected := vv[i].Res.ToElement(api, f) + evmprecompiles.ECAddG1BLS(api, left, right, expected) + } + case []addInstance[g2ElementWizard, sw_bls12381.G2Affine]: + for i := 0; i < nbInstances; i++ { + left := vv[i].InputLeft.ToElement(api, f) + right := vv[i].InputRight.ToElement(api, f) + expected := vv[i].Res.ToElement(api, f) + evmprecompiles.ECAddG2BLS(api, left, right, expected) + } + default: + return fmt.Errorf("unknown element type %T for bls add circuit", vv) + } + + return nil +} + +func newAddCircuit(g group, limits *Limits) frontend.Circuit { + switch g { + case G1: + return &multiAddCircuit[g1ElementWizard, sw_bls12381.G1Affine]{Instances: make([]addInstance[g1ElementWizard, sw_bls12381.G1Affine], limits.NbG1AddInputInstances)} + case G2: + return &multiAddCircuit[g2ElementWizard, sw_bls12381.G2Affine]{Instances: make([]addInstance[g2ElementWizard, sw_bls12381.G2Affine], limits.NbG2AddInputInstances)} + default: + panic(fmt.Sprintf("unknown group for bls add circuit: %v", g)) + } +} diff --git a/prover/zkevm/prover/bls/circuits_element.go b/prover/zkevm/prover/bls/circuits_element.go new file mode 100644 index 0000000000..ea21d85729 --- /dev/null +++ b/prover/zkevm/prover/bls/circuits_element.go @@ -0,0 +1,202 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/std/algebra/emulated/fields_bls12381" + "github.com/consensys/gnark/std/algebra/emulated/sw_bls12381" + "github.com/consensys/gnark/std/math/bitslice" + "github.com/consensys/gnark/std/math/emulated" +) + +const ( + nbBits = 128 // we use 128 bits limbs for the BLS12-381 field + nbBytes = nbBits / 8 // 128 bits = 16 bytes + + // BLS scalar field is 255 bits, and we use 2 limbs of 128 bits to represent + nbFrLimbs = 2 // (x_1, x_0) MSB order + + // BLS base field is 381 bits, and we use 4 limbs of 128 bits to represent + // it. However, the highest limb is always zero, but the arithmetization + // keeps it for nice alignment. We pass it to the circuit but check + // explicitly that its 0. + nbFpLimbs = 4 // (x_3, x_2, x_1, x_0) MSB order + + nbG1Limbs = 2 * nbFpLimbs // (Ax, Ay) + nbG2Limbs = 4 * nbFpLimbs // (BxIm, BxRe, ByIm, ByRe) + nbGtLimbs = 12 * nbFpLimbs // representation according to gnark - we don't use Gt in arithmetization, only in glue for accumulation +) + +func nbLimbs(g group) int { + switch g { + case G1: + return nbG1Limbs + case G2: + return nbG2Limbs + default: + panic("unknown group for bls nbLimbs") + } +} + +var fpParams sw_bls12381.BaseField +var frParams sw_bls12381.ScalarField + +type scalarElementWizard struct { + S [nbFrLimbs]frontend.Variable +} + +func (c scalarElementWizard) ToElement(api frontend.API, fr *emulated.Field[sw_bls12381.ScalarField]) *sw_bls12381.Scalar { + // gnark represents the BLS12-381 Fr element on 4 limbs of 64 bits. + Slimbs := make([]frontend.Variable, frParams.NbLimbs()) + Slimbs[2], Slimbs[3] = bitslice.Partition(api, c.S[0], 64, bitslice.WithNbDigits(128)) + Slimbs[0], Slimbs[1] = bitslice.Partition(api, c.S[1], 64, bitslice.WithNbDigits(128)) + return fr.NewElement(Slimbs) +} + +type baseElementWizard struct { + P [nbFpLimbs]frontend.Variable +} + +func (c baseElementWizard) ToElement(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField]) *emulated.Element[sw_bls12381.BaseField] { + // gnark represents the BLS12-381 Fp elements on 6 limbs of 64 bits. + Plimbs := make([]frontend.Variable, fpParams.NbLimbs()) + Plimbs[4], Plimbs[5] = bitslice.Partition(api, c.P[1], 64, bitslice.WithNbDigits(128)) + Plimbs[2], Plimbs[3] = bitslice.Partition(api, c.P[2], 64, bitslice.WithNbDigits(128)) + Plimbs[0], Plimbs[1] = bitslice.Partition(api, c.P[3], 64, bitslice.WithNbDigits(128)) + return fp.NewElement(Plimbs) +} + +type g1ElementWizard struct { + P [nbG1Limbs]frontend.Variable +} + +func (c g1ElementWizard) ToElement(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField]) *sw_bls12381.G1Affine { + PXlimbs := make([]frontend.Variable, fpParams.NbLimbs()) + PYlimbs := make([]frontend.Variable, fpParams.NbLimbs()) + + // gnark represents the BLS12-381 Fp element on 6 limbs of 64 bits. + // Arithmetization uses 4 limbs of 128 bits, but the MSB limb is always 0. + api.AssertIsEqual(c.P[0], 0) + api.AssertIsEqual(c.P[nbFpLimbs], 0) + for i := range nbFpLimbs - 1 { + PXlimbs[len(PXlimbs)-(2*i+2)], PXlimbs[len(PXlimbs)-(2*i+1)] = bitslice.Partition(api, c.P[i+1], 64, bitslice.WithNbDigits(128)) + PYlimbs[len(PYlimbs)-(2*i+2)], PYlimbs[len(PYlimbs)-(2*i+1)] = bitslice.Partition(api, c.P[nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + } + PX := fp.NewElement(PXlimbs) + PY := fp.NewElement(PYlimbs) + P := sw_bls12381.G1Affine{ + X: *PX, + Y: *PY, + } + return &P +} + +type g2ElementWizard struct { + Q [nbG2Limbs]frontend.Variable +} + +func (c g2ElementWizard) ToElement(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField]) *sw_bls12381.G2Affine { + QXAlimbs := make([]frontend.Variable, fpParams.NbLimbs()) + QXBlimbs := make([]frontend.Variable, fpParams.NbLimbs()) + QYAlimbs := make([]frontend.Variable, fpParams.NbLimbs()) + QYBlimbs := make([]frontend.Variable, fpParams.NbLimbs()) + + // assert that the MSB limb is 0 in arithmetization + for i := range 4 { + api.AssertIsEqual(c.Q[i*nbFpLimbs], 0) + } + + for i := range nbFpLimbs - 1 { + QXAlimbs[len(QXAlimbs)-(2*i+2)], QXAlimbs[len(QXAlimbs)-(2*i+1)] = bitslice.Partition(api, c.Q[i+1], 64, bitslice.WithNbDigits(128)) + QXBlimbs[len(QXBlimbs)-(2*i+2)], QXBlimbs[len(QXBlimbs)-(2*i+1)] = bitslice.Partition(api, c.Q[nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + QYAlimbs[len(QYAlimbs)-(2*i+2)], QYAlimbs[len(QYAlimbs)-(2*i+1)] = bitslice.Partition(api, c.Q[2*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + QYBlimbs[len(QYBlimbs)-(2*i+2)], QYBlimbs[len(QYBlimbs)-(2*i+1)] = bitslice.Partition(api, c.Q[3*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + } + QXA := fp.NewElement(QXAlimbs) + QXB := fp.NewElement(QXBlimbs) + QX := fields_bls12381.E2{ + A0: *QXA, + A1: *QXB, + } + QYA := fp.NewElement(QYAlimbs) + QYB := fp.NewElement(QYBlimbs) + QY := fields_bls12381.E2{ + A0: *QYA, + A1: *QYB, + } + var Q sw_bls12381.G2Affine + Q.P.X = QX + Q.P.Y = QY + + return &Q +} + +type gtElementWizard struct { + T [nbGtLimbs]frontend.Variable +} + +func (c gtElementWizard) ToElement(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField]) *sw_bls12381.GTEl { + A0Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A1Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A2Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A3Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A4Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A5Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A6Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A7Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A8Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A9Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A10Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + A11Limbs := make([]frontend.Variable, fpParams.NbLimbs()) + + // assert that the MSB limb is 0 in arithmetization + for i := range 12 { + api.AssertIsEqual(c.T[i*nbFpLimbs], 0) + } + + for i := range nbFpLimbs - 1 { + A0Limbs[len(A0Limbs)-(2*i+2)], A0Limbs[len(A0Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[i+1], 64, bitslice.WithNbDigits(128)) + A1Limbs[len(A1Limbs)-(2*i+2)], A1Limbs[len(A1Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A2Limbs[len(A2Limbs)-(2*i+2)], A2Limbs[len(A2Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[2*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A3Limbs[len(A3Limbs)-(2*i+2)], A3Limbs[len(A3Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[3*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A4Limbs[len(A4Limbs)-(2*i+2)], A4Limbs[len(A4Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[4*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A5Limbs[len(A5Limbs)-(2*i+2)], A5Limbs[len(A5Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[5*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A6Limbs[len(A6Limbs)-(2*i+2)], A6Limbs[len(A6Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[6*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A7Limbs[len(A7Limbs)-(2*i+2)], A7Limbs[len(A7Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[7*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A8Limbs[len(A8Limbs)-(2*i+2)], A8Limbs[len(A8Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[8*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A9Limbs[len(A9Limbs)-(2*i+2)], A9Limbs[len(A9Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[9*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A10Limbs[len(A10Limbs)-(2*i+2)], A10Limbs[len(A10Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[10*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + A11Limbs[len(A11Limbs)-(2*i+2)], A11Limbs[len(A11Limbs)-(2*i+1)] = bitslice.Partition(api, c.T[11*nbFpLimbs+i+1], 64, bitslice.WithNbDigits(128)) + } + + pairing, err := sw_bls12381.NewPairing(api) + if err != nil { + panic(fmt.Sprintf("new pairing: %v", err)) + } + T := pairing.Ext12.FromTower([12]*emulated.Element[sw_bls12381.BaseField]{ + fp.NewElement(A0Limbs), + fp.NewElement(A1Limbs), + fp.NewElement(A2Limbs), + fp.NewElement(A3Limbs), + fp.NewElement(A4Limbs), + fp.NewElement(A5Limbs), + fp.NewElement(A6Limbs), + fp.NewElement(A7Limbs), + fp.NewElement(A8Limbs), + fp.NewElement(A9Limbs), + fp.NewElement(A10Limbs), + fp.NewElement(A11Limbs), + }) + + return T +} + +type element interface { + sw_bls12381.G1Affine | sw_bls12381.G2Affine | sw_bls12381.GTEl +} + +type convertable[T element] interface { + g1ElementWizard | g2ElementWizard | gtElementWizard + ToElement(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField]) *T +} diff --git a/prover/zkevm/prover/bls/circuits_maps.go b/prover/zkevm/prover/bls/circuits_maps.go new file mode 100644 index 0000000000..2ed0dc08d0 --- /dev/null +++ b/prover/zkevm/prover/bls/circuits_maps.go @@ -0,0 +1,95 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/std/algebra/emulated/fields_bls12381" + "github.com/consensys/gnark/std/algebra/emulated/sw_bls12381" + "github.com/consensys/gnark/std/evmprecompiles" + "github.com/consensys/gnark/std/math/emulated" +) + +const ( + nbRowsPerG1Map = nbFpLimbs + nbG1Limbs // input is Fp element and expected output is G1 element + nbRowsPerG2Map = 2*nbFpLimbs + nbG2Limbs // input is Fp2 element and expected output is G2 element +) + +func nbRowsPerMap(g group) int { + switch g { + case G1: + return nbRowsPerG1Map + case G2: + return nbRowsPerG2Map + default: + panic("unknown group for nbRowsPerMap") + } +} + +type mapInstance[C convertable[T], T element] struct { + Input []baseElementWizard // len==1 for G1, len==2 for G2 + Mapped C +} +type multiMapCircuit[C convertable[T], T element] struct { + Instances []mapInstance[C, T] `gnark:",public"` +} + +func (c *multiMapCircuit[C, T]) Define(api frontend.API) error { + fp, err := emulated.NewField[sw_bls12381.BaseField](api) + if err != nil { + return fmt.Errorf("new field: %w", err) + } + switch vv := any(c.Instances).(type) { + case []mapInstance[g1ElementWizard, sw_bls12381.G1Affine]: + for i := range c.Instances { + if len(c.Instances[i].Input) != 1 { + return fmt.Errorf("instance %d expected 1 input for G1 map to G1, got %d", i, len(c.Instances[i].Input)) + } + toMap := vv[i].Input[0].ToElement(api, fp) + tMapped := vv[i].Mapped.ToElement(api, fp) + if err := evmprecompiles.ECMapToG1BLS(api, toMap, tMapped); err != nil { + return fmt.Errorf("instance %d map to G1: %w", i, err) + } + } + case []mapInstance[g2ElementWizard, sw_bls12381.G2Affine]: + for i := range c.Instances { + if len(c.Instances[i].Input) != 2 { + return fmt.Errorf("expected 2 inputs for G2 map to G1, got %d", len(c.Instances[i].Input)) + } + toMap := fields_bls12381.E2{ + A0: *c.Instances[i].Input[0].ToElement(api, fp), + A1: *c.Instances[i].Input[1].ToElement(api, fp), + } + tMapped := vv[i].Mapped.ToElement(api, fp) + if err := evmprecompiles.ECMapToG2BLS(api, &toMap, tMapped); err != nil { + return fmt.Errorf("instance %d map to G2: %w", i, err) + } + } + default: + return fmt.Errorf("unknown group %T for bls map to G1 circuit", vv) + } + return nil +} + +func NewMapCircuit(g group, limits *Limits) frontend.Circuit { + switch g { + case G1: + res := &multiMapCircuit[g1ElementWizard, sw_bls12381.G1Affine]{ + Instances: make([]mapInstance[g1ElementWizard, sw_bls12381.G1Affine], limits.NbG1MapToInputInstances), + } + for i := range res.Instances { + res.Instances[i].Input = make([]baseElementWizard, 1) + } + return res + case G2: + res := &multiMapCircuit[g2ElementWizard, sw_bls12381.G2Affine]{ + Instances: make([]mapInstance[g2ElementWizard, sw_bls12381.G2Affine], limits.NbG2MapToInputInstances), + } + for i := range res.Instances { + res.Instances[i].Input = make([]baseElementWizard, 2) + } + return res + default: + panic(fmt.Sprintf("unknown group %s for bls map to G1 circuit", g.String())) + } +} diff --git a/prover/zkevm/prover/bls/circuits_membership.go b/prover/zkevm/prover/bls/circuits_membership.go new file mode 100644 index 0000000000..e1a0dac19b --- /dev/null +++ b/prover/zkevm/prover/bls/circuits_membership.go @@ -0,0 +1,112 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/std/algebra/emulated/sw_bls12381" + "github.com/consensys/gnark/std/evmprecompiles" + "github.com/consensys/gnark/std/math/emulated" +) + +type nonCurveMembershipInstance[C convertable[T], T element] struct { + // P is the purported element + P C `gnark:",public"` +} + +func (c nonCurveMembershipInstance[C, T]) Check(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField], pairing *sw_bls12381.Pairing) error { + switch v := any(c.P).(type) { + case g1ElementWizard: + P := v.ToElement(api, fp) + res := pairing.IsOnCurve(P) + api.AssertIsEqual(res, 0) + return nil + case g2ElementWizard: + Q := v.ToElement(api, fp) + res := pairing.IsOnTwist(Q) + api.AssertIsEqual(res, 0) + return nil + default: + return fmt.Errorf("unsupported element type %T for on-curve check", c.P) + } +} + +type nonGroupMembershipInstance[C convertable[T], T element] struct { + // P is the purported element + P C `gnark:",public"` +} + +func (c nonGroupMembershipInstance[C, T]) Check(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField], pairing *sw_bls12381.Pairing) error { + switch v := any(c.P).(type) { + case g1ElementWizard: + P := v.ToElement(api, fp) + // We expect the element to be not on G1 + return evmprecompiles.ECPairBLSIsOnG1(api, P, 0) // 0 means we expect it to be not on G1 + case g2ElementWizard: + Q := v.ToElement(api, fp) + // We expect the element to be not on G2 + return evmprecompiles.ECPairBLSIsOnG2(api, Q, 0) // 0 means we expect it to be not on G2 + default: + return fmt.Errorf("unsupported element type %T for non-group membership check", c.P) + } +} + +// -- circuit which performs multiple checks + +type checkableInstance interface { + nonCurveMembershipInstance[g1ElementWizard, sw_bls12381.G1Affine] | nonCurveMembershipInstance[g2ElementWizard, sw_bls12381.G2Affine] | + nonGroupMembershipInstance[g1ElementWizard, sw_bls12381.G1Affine] | nonGroupMembershipInstance[g2ElementWizard, sw_bls12381.G2Affine] + Check(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField], pairing *sw_bls12381.Pairing) error +} + +type multiCheckableCircuit[T checkableInstance] struct { + Instances []T +} + +func (c *multiCheckableCircuit[T]) Define(api frontend.API) error { + fp, err := emulated.NewField[sw_bls12381.BaseField](api) + if err != nil { + return fmt.Errorf("new field emulation: %w", err) + } + pairing, err := sw_bls12381.NewPairing(api) + if err != nil { + return fmt.Errorf("new pairing: %w", err) + } + for i := range c.Instances { + if err := c.Instances[i].Check(api, fp, pairing); err != nil { + return fmt.Errorf("instance %d check: %w", i, err) + } + } + return nil +} + +func newMultiCheckableCircuit[T checkableInstance](nbInstances int) *multiCheckableCircuit[T] { + return &multiCheckableCircuit[T]{ + Instances: make([]T, nbInstances), + } +} + +func newCheckCircuit(g group, membership membership, limits *Limits) frontend.Circuit { + switch g { + case G1: + switch membership { + case CURVE: + return newMultiCheckableCircuit[nonCurveMembershipInstance[g1ElementWizard, sw_bls12381.G1Affine]](limits.NbC1MembershipInputInstances) + case GROUP: + return newMultiCheckableCircuit[nonGroupMembershipInstance[g1ElementWizard, sw_bls12381.G1Affine]](limits.NbG1MembershipInputInstances) + default: + panic(fmt.Sprintf("unknown membership type for G1: %v", membership)) + } + case G2: + switch membership { + case CURVE: + return newMultiCheckableCircuit[nonCurveMembershipInstance[g2ElementWizard, sw_bls12381.G2Affine]](limits.NbC2MembershipInputInstances) + case GROUP: + return newMultiCheckableCircuit[nonGroupMembershipInstance[g2ElementWizard, sw_bls12381.G2Affine]](limits.NbG2MembershipInputInstances) + default: + panic(fmt.Sprintf("unknown membership type for G2: %v", membership)) + } + default: + panic(fmt.Sprintf("unknown group for bls curve membership circuit: %v", g)) + } +} diff --git a/prover/zkevm/prover/bls/circuits_msm.go b/prover/zkevm/prover/bls/circuits_msm.go new file mode 100644 index 0000000000..e2256fed9a --- /dev/null +++ b/prover/zkevm/prover/bls/circuits_msm.go @@ -0,0 +1,85 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/std/algebra/emulated/sw_bls12381" + "github.com/consensys/gnark/std/evmprecompiles" + "github.com/consensys/gnark/std/math/emulated" +) + +const ( + nbRowsPerG1Mul = nbFrLimbs + 3*nbG1Limbs // 1 scalar, 1 point, 1 previous accumulator, 1 next accumulator + nbRowsPerG2Mul = nbFrLimbs + 3*nbG2Limbs // 1 scalar, 1 point, 1 previous accumulator, 1 next accumulator +) + +func nbRowsPerMul(g group) int { + switch g { + case G1: + return nbRowsPerG1Mul + case G2: + return nbRowsPerG2Mul + default: + panic(fmt.Sprintf("unknown group %s for nbRowsPerMul", g.String())) + } +} + +type mulInstance[C convertable[T], T element] struct { + CurrentAccumulator C `gnark:",public"` + Scalar scalarElementWizard `gnark:",public"` + Point C `gnark:",public"` + NextAccumulator C `gnark:",public"` +} + +type multiMulCircuit[C convertable[T], T element] struct { + Instances []mulInstance[C, T] +} + +func (c *multiMulCircuit[C, T]) Define(api frontend.API) error { + fp, err := emulated.NewField[sw_bls12381.BaseField](api) + if err != nil { + return fmt.Errorf("new field: %w", err) + } + fr, err := emulated.NewField[sw_bls12381.ScalarField](api) + if err != nil { + return fmt.Errorf("new scalar field: %w", err) + } + nbInstances := len(c.Instances) + switch vv := any(c.Instances).(type) { + case []mulInstance[g1ElementWizard, sw_bls12381.G1Affine]: + for i := range nbInstances { + tCurrent := vv[i].CurrentAccumulator.ToElement(api, fp) + tScalar := c.Instances[i].Scalar.ToElement(api, fr) + tPoint := vv[i].Point.ToElement(api, fp) + tNext := vv[i].NextAccumulator.ToElement(api, fp) + if err := evmprecompiles.ECG1ScalarMulSumBLS(api, tCurrent, tPoint, tScalar, tNext); err != nil { + return fmt.Errorf("instance %d scalar mul sum: %w", i, err) + } + } + case []mulInstance[g2ElementWizard, sw_bls12381.G2Affine]: + for i := range nbInstances { + tCurrent := vv[i].CurrentAccumulator.ToElement(api, fp) + tScalar := c.Instances[i].Scalar.ToElement(api, fr) + tPoint := vv[i].Point.ToElement(api, fp) + tNext := vv[i].NextAccumulator.ToElement(api, fp) + if err := evmprecompiles.ECG2ScalarMulSumBLS(api, tCurrent, tPoint, tScalar, tNext); err != nil { + return fmt.Errorf("instance %d scalar mul sum: %w", i, err) + } + } + default: + return fmt.Errorf("unknown group %T for bls msm circuit", vv) + } + return nil +} + +func newMulCircuit(g group, limits *Limits) frontend.Circuit { + switch g { + case G1: + return &multiMulCircuit[g1ElementWizard, sw_bls12381.G1Affine]{Instances: make([]mulInstance[g1ElementWizard, sw_bls12381.G1Affine], limits.NbG1MulInputInstances)} + case G2: + return &multiMulCircuit[g2ElementWizard, sw_bls12381.G2Affine]{Instances: make([]mulInstance[g2ElementWizard, sw_bls12381.G2Affine], limits.NbG2MulInputInstances)} + default: + panic(fmt.Sprintf("unknown group %s for bls msm circuit", g.String())) + } +} diff --git a/prover/zkevm/prover/bls/circuits_pairingcheck.go b/prover/zkevm/prover/bls/circuits_pairingcheck.go new file mode 100644 index 0000000000..118623c85c --- /dev/null +++ b/prover/zkevm/prover/bls/circuits_pairingcheck.go @@ -0,0 +1,101 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/std/algebra/emulated/sw_bls12381" + "github.com/consensys/gnark/std/evmprecompiles" + "github.com/consensys/gnark/std/math/emulated" +) + +const ( + nbRowsPerMillerLoop = 2*nbGtLimbs + nbG1Limbs + nbG2Limbs // current accumulator Gt, next accumulator Gt, G1 input G1 and G2 input G2 + nbRowsPerFinalExp = nbGtLimbs + nbG1Limbs + nbG2Limbs + 2 // current accumulator Gt, G1 input G1 and G2 input G2. PLus 2 for the expected result +) + +type multiMillerLoopMulCircuit struct { + Instances []millerLoopMulInstance `gnark:",public"` +} + +func newMultiMillerLoopMulCircuit(limits *Limits) *multiMillerLoopMulCircuit { + return &multiMillerLoopMulCircuit{ + Instances: make([]millerLoopMulInstance, limits.NbMillerLoopInputInstances), + } +} + +func (c *multiMillerLoopMulCircuit) Define(api frontend.API) error { + fp, err := emulated.NewField[sw_bls12381.BaseField](api) + if err != nil { + return fmt.Errorf("new field: %w", err) + } + pairing, err := sw_bls12381.NewPairing(api) + if err != nil { + return fmt.Errorf("new pairing: %w", err) + } + for i := range c.Instances { + if err := c.Instances[i].Check(api, fp, pairing); err != nil { + return fmt.Errorf("check instance %d: %w", i, err) + } + } + return nil +} + +type millerLoopMulInstance struct { + Prev gtElementWizard + P g1ElementWizard + Q g2ElementWizard + Current gtElementWizard +} + +func (c *millerLoopMulInstance) Check(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField], pairing *sw_bls12381.Pairing) error { + prev := c.Prev.ToElement(api, fp) + p := c.P.ToElement(api, fp) + q := c.Q.ToElement(api, fp) + current := c.Current.ToElement(api, fp) + + return evmprecompiles.ECPairBLSMillerLoopAndMul(api, prev, p, q, current) +} + +type multiMillerLoopFinalExpCircuit struct { + Instances []millerLoopFinalExpInstance `gnark:",public"` +} + +func newMultiMillerLoopFinalExpCircuit(limits *Limits) *multiMillerLoopFinalExpCircuit { + return &multiMillerLoopFinalExpCircuit{ + Instances: make([]millerLoopFinalExpInstance, limits.NbFinalExpInputInstances), + } +} + +func (c *multiMillerLoopFinalExpCircuit) Define(api frontend.API) error { + fp, err := emulated.NewField[sw_bls12381.BaseField](api) + if err != nil { + return fmt.Errorf("new field: %w", err) + } + pairing, err := sw_bls12381.NewPairing(api) + if err != nil { + return fmt.Errorf("new pairing: %w", err) + } + for i := range c.Instances { + if err := c.Instances[i].Check(api, fp, pairing); err != nil { + return fmt.Errorf("check instance %d: %w", i, err) + } + } + return nil +} + +type millerLoopFinalExpInstance struct { + Prev gtElementWizard + P g1ElementWizard + Q g2ElementWizard + Expected [2]frontend.Variable +} + +func (c *millerLoopFinalExpInstance) Check(api frontend.API, fp *emulated.Field[sw_bls12381.BaseField], pairing *sw_bls12381.Pairing) error { + prev := c.Prev.ToElement(api, fp) + p := c.P.ToElement(api, fp) + q := c.Q.ToElement(api, fp) + + api.AssertIsEqual(c.Expected[0], 0) + return evmprecompiles.ECPairBLSMillerLoopAndFinalExpCheck(api, prev, p, q, c.Expected[1]) +} diff --git a/prover/zkevm/prover/bls/circuits_pointeval.go b/prover/zkevm/prover/bls/circuits_pointeval.go new file mode 100644 index 0000000000..9bdddf6a38 --- /dev/null +++ b/prover/zkevm/prover/bls/circuits_pointeval.go @@ -0,0 +1,114 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/std/algebra/emulated/sw_bls12381" + "github.com/consensys/gnark/std/evmprecompiles" + "github.com/consensys/gnark/std/math/emulated" +) + +const ( + nbG1CompressedLimbs = 3 + nbVersionedHashLimbs = 2 + nbRowsPerPointEval = nbVersionedHashLimbs + 2*nbFrLimbs + 2*nbG1CompressedLimbs + 2 + nbFrLimbs +) + +type multiPointEvalCircuit struct { + Instances []pointEvalInstance `gnark:",public"` +} + +func newMultiPointEvalCircuit(limits *Limits) *multiPointEvalCircuit { + return &multiPointEvalCircuit{ + Instances: make([]pointEvalInstance, limits.NbPointEvalInputInstances), + } +} + +func (c *multiPointEvalCircuit) Define(api frontend.API) error { + fr, err := emulated.NewField[sw_bls12381.ScalarField](api) + if err != nil { + return fmt.Errorf("new field: %w", err) + } + for i := range c.Instances { + if err := c.Instances[i].Check(api, fr); err != nil { + return fmt.Errorf("check instance %d: %w", i, err) + } + } + return nil +} + +type pointEvalInstance struct { + VersionedHash [nbVersionedHashLimbs]frontend.Variable + EvaluationPoint scalarElementWizard + ClaimedValue scalarElementWizard + CommitmentCompressed [nbG1CompressedLimbs]frontend.Variable + ProofCompressed [nbG1CompressedLimbs]frontend.Variable + ExpectedBlobSize [2]frontend.Variable + ExpectedBlsModulus [nbFrLimbs]frontend.Variable +} + +func (c *pointEvalInstance) Check(api frontend.API, fr *emulated.Field[sw_bls12381.ScalarField]) error { + tEvaluationPoint := c.EvaluationPoint.ToElement(api, fr) + tClaimedValue := c.ClaimedValue.ToElement(api, fr) + + return evmprecompiles.KzgPointEvaluation( + api, + c.VersionedHash, + tEvaluationPoint, + tClaimedValue, + c.CommitmentCompressed, + c.ProofCompressed, + c.ExpectedBlobSize, + c.ExpectedBlsModulus, + ) +} + +type multiPointEvalFailureCircuit struct { + Instances []pointEvalFailureInstance `gnark:",public"` +} + +func newMultiPointEvalFailureCircuit(limits *Limits) *multiPointEvalFailureCircuit { + return &multiPointEvalFailureCircuit{ + Instances: make([]pointEvalFailureInstance, limits.NbPointEvalFailureInputInstances), + } +} + +func (c *multiPointEvalFailureCircuit) Define(api frontend.API) error { + fr, err := emulated.NewField[sw_bls12381.ScalarField](api) + if err != nil { + return fmt.Errorf("new field: %w", err) + } + for i := range c.Instances { + if err := c.Instances[i].Check(api, fr); err != nil { + return fmt.Errorf("check instance %d: %w", i, err) + } + } + return nil +} + +type pointEvalFailureInstance struct { + VersionedHash [nbVersionedHashLimbs]frontend.Variable + EvaluationPoint scalarElementWizard + ClaimedValue scalarElementWizard + CommitmentCompressed [nbG1CompressedLimbs]frontend.Variable + ProofCompressed [nbG1CompressedLimbs]frontend.Variable + ExpectedBlobSize [2]frontend.Variable + ExpectedBlsModulus [nbFrLimbs]frontend.Variable +} + +func (c *pointEvalFailureInstance) Check(api frontend.API, fr *emulated.Field[sw_bls12381.ScalarField]) error { + tEvaluationPoint := c.EvaluationPoint.ToElement(api, fr) + tClaimedValue := c.ClaimedValue.ToElement(api, fr) + + return evmprecompiles.KzgPointEvaluationFailure( + api, + c.VersionedHash, + tEvaluationPoint, + tClaimedValue, + c.CommitmentCompressed, + c.ProofCompressed, + c.ExpectedBlobSize, + c.ExpectedBlsModulus, + ) +} diff --git a/prover/zkevm/prover/bls/input_fillers.go b/prover/zkevm/prover/bls/input_fillers.go new file mode 100644 index 0000000000..fd752b635a --- /dev/null +++ b/prover/zkevm/prover/bls/input_fillers.go @@ -0,0 +1,250 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" +) + +const ( + millerLoopInputFillerKey = "bls12381-miller-loop-input-filler" + finalExpInputFillerKey = "bls12381-final-exp-input-filler" + pointEvalInputFillerKey = "bls12381-point-eval-input-filler" + pointEvalFailureInputFillerKey = "bls12381-point-eval-failure-input-filler" +) + +func init() { + plonk.RegisterInputFiller(membershipInputFillerKey(G1, CURVE), newMembershipInputFiller(G1, CURVE)) + plonk.RegisterInputFiller(membershipInputFillerKey(G2, CURVE), newMembershipInputFiller(G2, CURVE)) + plonk.RegisterInputFiller(membershipInputFillerKey(G1, GROUP), newMembershipInputFiller(G1, GROUP)) + plonk.RegisterInputFiller(membershipInputFillerKey(G2, GROUP), newMembershipInputFiller(G2, GROUP)) + plonk.RegisterInputFiller(millerLoopInputFillerKey, inputfillerMillerLoop) + plonk.RegisterInputFiller(finalExpInputFillerKey, inputFillerFinalExp) + plonk.RegisterInputFiller(mapToGroupInputFillerKey(G1), inputFillerMapToG1) + plonk.RegisterInputFiller(mapToGroupInputFillerKey(G2), inputFillerMapToG2) + plonk.RegisterInputFiller(pointEvalInputFillerKey, inputFillerPointEvaluation) + plonk.RegisterInputFiller(pointEvalFailureInputFillerKey, inputFillerPointEvaluationFailure) +} + +func membershipInputFillerKey(g group, m membership) string { + base := "bls12381-%s-membership-input-filler" + switch m { + case CURVE: + return fmt.Sprintf(base, g.StringCurve()) + case GROUP: + return fmt.Sprintf(base, g.String()) + default: + panic(fmt.Sprintf("unknown membership type %v for group %v", m, g)) + } +} + +func newMembershipInputFiller(g group, _ membership) plonk.InputFiller { + // we generate points not on curve --> also not in group + return func(circuitInstance, inputIndex int) field.Element { + nbL := nbLimbs(g) + if (inputIndex+1)%(nbL/2) == 0 { + return field.One() + } else { + return field.Zero() + } + } +} + +func inputfillerMillerLoop(circuitInstance, inputIndex int) field.Element { + // prev = 1 + // p = g1 gen + // q = g2 gen + // curr = e(p, q) + tbl := []string{ + // previous gt accumulator + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000001", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", "0x00000000000000000000000000000000", + // g1 point + "0x00000000000000000000000000000000", "0x09ece308f9d1f0131765212deca99697", "0xb112d61f9be9a5f1f3780a51335b3ff9", "0x81747a0b2ca2179b96d2c0c9024e5224", + "0x00000000000000000000000000000000", "0x032b80d3a6f5b09f8a84623389c5f80c", "0xa69a0cddabc3097f9d9c27310fd43be6", "0xe745256c634af45ca3473b0590ae30d1", + // g2 point + "0x00000000000000000000000000000000", "0x1638533957d540a9d2370f17cc7ed586", "0x3bc0b995b8825e0ee1ea1e1e4d00dbae", "0x81f14b0bf3611b78c952aacab827a053", + "0x00000000000000000000000000000000", "0x0a4edef9c1ed7f729f520e47730a124f", "0xd70662a904ba1074728114d1031e1572", "0xc6c886f6b57ec72a6178288c47c33577", + "0x00000000000000000000000000000000", "0x0468fb440d82b0630aeb8dca2b525678", "0x9a66da69bf91009cbfe6bd221e47aa8a", "0xe88dece9764bf3bd999d95d71e4c9899", + "0x00000000000000000000000000000000", "0x0f6d4552fa65dd2638b361543f887136", "0xa43253d9c66c411697003f7a13c308f5", "0x422e1aa0a59c8967acdefd8b6e36ccf3", + // next accumulator + "0x00000000000000000000000000000000", "0x0054feaed82ead3a41c8abcd0eb1041a", "0xd2fe424577338e88ed49793751ba1df5", "0xdf7c60cd929d96af536138d3622d1e1f", + "0x00000000000000000000000000000000", "0x1896860897a1550a11b7dcb8f08f0619", "0x793426fbf40eadcfa67b99f876d559a5", "0xbe8a7952f064f10a3c86c8b800db6dc7", + "0x00000000000000000000000000000000", "0x10d461b121b4e83cf39e5b92a88a7a0b", "0x7c6a12603d0819043839208b8fb7663a", "0x319ca57a82fb296dab959e53ab22c305", + "0x00000000000000000000000000000000", "0x1797037653cbd4555a3976fe14da01ad", "0x864be7cd23768280c62fcd99d6a69d87", "0x2d812f340e93220dfac5249fd74120c4", + "0x00000000000000000000000000000000", "0x166bbd6883f96dcf75478dc649ce1bac", "0xefe626b9d621a745ac1b84261e5e45a5", "0xb2f5f850ff43e59c6508dac5e911ac56", + "0x00000000000000000000000000000000", "0x04278944b14d0bc7418a84ee3b6cb806", "0xd5c9281b9c01c24b282071ef0b747eae", "0x49b7c7849fb878a58abb5c07b8d756d4", + "0x00000000000000000000000000000000", "0x11fd87ad49dd390187684da5873cee05", "0x118dac54854f7f02df937e785d5e1809", "0x586cba4165198e5dc57badf023fbd91a", + "0x00000000000000000000000000000000", "0x0a2308f392ecd05df00a38ab0b984eb7", "0xaf3ea84f4e11d03027de131c64cce348", "0x7dfb35c3daae32985c925cb71847b1ee", + "0x00000000000000000000000000000000", "0x084d5dbfdfc2953d8d78a31368165425", "0xcb1050b13b5dfc8b622f2f8399894e28", "0xa506a0c72860dc396fa012592aa80e35", + "0x00000000000000000000000000000000", "0x01ca8a8579f105b245b1507349805424", "0x8dc9e57b6398c68d14879a1b9bb843ce", "0x9d61f975640aba9e9405210e4483d304", + "0x00000000000000000000000000000000", "0x14de5c730ce2468dc697a70a258ada19", "0xb41dd83ac859e2e8b2486b55764972fe", "0x67b809992911999cdbd77ca7906b192f", + "0x00000000000000000000000000000000", "0x1891075ace9a85eed267d68f8e22e5d7", "0x93fd8cdd0c5603894509467df02ef6be", "0xc739546f6d55695a4d5bb24999e2fe20", + } + var res field.Element + _, err := res.SetString(tbl[inputIndex%nbRowsPerMillerLoop]) + if err != nil { + panic(fmt.Sprintf("failed to set string: %v", err)) + } + return res +} + +func inputFillerFinalExp(circuitInstance, inputIndex int) field.Element { + // accumulator e(-p, q) + // inputs e(p, q) + // result e(-p, q) * e(p, q) == 1 + tbl := []string{ + // gt accumulator + "0x00000000000000000000000000000000", "0x04b3b48125b06267a063738aaf1beb1e", "0x58d3f2eed52764ab0b0f13b89534d6c2", "0xeeed4072f2dcc304b29f01211e1a57af", + "0x00000000000000000000000000000000", "0x07175fb8c03924a24b0a90e8d1699192", "0xfeed2ffeb111a26cd5f4e1cf827775fe", "0xd936fe8155224f47906e4acf9ac75610", + "0x00000000000000000000000000000000", "0x06cebc0cdc06b36d985563ccc72c603d", "0x5023c322285f17f3a278d3c9b45a5812", "0xfbc778f080ed76059ae99da43d392cdc", + "0x00000000000000000000000000000000", "0x17808cef4c14fa8b87cba1a9b11df9bc", "0x7a6dc79882f1a149ce942919643a8925", "0xea9f0de06c0df24e6724ffe6bcac8c65", + "0x00000000000000000000000000000000", "0x0fe9b210a0c9b02109d7f37fa2cd3d6a", "0x19cd0dcb26709c86082e8eac8322afdb", "0x5acbb8a8794c04915daff76a9e1e5127", + "0x00000000000000000000000000000000", "0x00beff4984c303ebad04dd513688ee04", "0x20e5657e1ece66e135301a06a521c5c6", "0x981c529705c51c5a84843a869cbbecd9", + "0x00000000000000000000000000000000", "0x07764c0e8417987a6b20455bd4690b77", "0xf8a89c2a7fddf3e308e4ee23f7879512", "0x2bd6a0bedf2b7271b8497fc6b2098bce", + "0x00000000000000000000000000000000", "0x0640460556c7ca962f1f93f7a2039b07", "0xe23af083fb37f39b1b891d0894beb94c", "0x73e2892fda7847ee38bc58e3f3736367", + "0x00000000000000000000000000000000", "0x141226bd375096d522913873d05e915f", "0x5ef67111028ac9d8a228d28971fd1dfb", "0xf795428532359deccda0f3ff6934b2e8", + "0x00000000000000000000000000000000", "0x0d4688ae2f1a7d8878cab6a018776f83", "0x398aab761e4f2a1319940abff28bc5cf", "0x74a68bfe456383fbb4490033208da951", + "0x00000000000000000000000000000000", "0x0abc7896c3c3ef4c5f917102686c1fc7", "0xf8719f2301778c9124ca0b64e42cc95d", "0x265705397d0021c4b2ce8a1e8b6ad8c1", + "0x00000000000000000000000000000000", "0x06560beb7fbe9504134bb319c5d376a3", "0xf85b5c83690c0e8b23a90fbe7ac4580b", "0x3223f2a29590580eb6783a4338f095db", + // G1 + "0x00000000000000000000000000000000", "0x17f1d3a73197d7942695638c4fa9ac0f", "0xc3688c4f9774b905a14e3a3f171bac58", "0x6c55e83ff97a1aeffb3af00adb22c6bb", + "0x00000000000000000000000000000000", "0x08b3f481e3aaa0f1a09e30ed741d8ae4", "0xfcf5e095d5d00af600db18cb2c04b3ed", "0xd03cc744a2888ae40caa232946c5e7e1", + // G2 + "0x00000000000000000000000000000000", "0x024aa2b2f08f0a91260805272dc51051", "0xc6e47ad4fa403b02b4510b647ae3d177", "0x0bac0326a805bbefd48056c8c121bdb8", + "0x00000000000000000000000000000000", "0x13e02b6052719f607dacd3a088274f65", "0x596bd0d09920b61ab5da61bbdc7f5049", "0x334cf11213945d57e5ac7d055d042b7e", + "0x00000000000000000000000000000000", "0x0ce5d527727d6e118cc9cdc6da2e351a", "0xadfd9baa8cbdd3a76d429a695160d12c", "0x923ac9cc3baca289e193548608b82801", + "0x00000000000000000000000000000000", "0x0606c4a02ea734cc32acd2b02bc28b99", "0xcb3e287e85a763af267492ab572e99ab", "0x3f370d275cec1da1aaa9075ff05f79be", + // pairing check result + "0x0", "0x1", + } + var res field.Element + _, err := res.SetString(tbl[inputIndex%nbRowsPerFinalExp]) + if err != nil { + panic(fmt.Sprintf("failed to set string: %v", err)) + } + return res +} + +func mapToGroupInputFillerKey(g group) string { + return fmt.Sprintf("bls12381-map-%s-to-%s-input-filler", g.StringMap(), g.String()) +} + +func inputFillerMapToG1(circuitInstance, inputIndex int) field.Element { + // map of 0 + tbl := []string{ + // fp element + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + // g1 x + "0x00000000000000000000000000000000", + "0x11a9a0372b8f332d5c30de9ad14e5037", + "0x2a73fa4c45d5f2fa5097f2d6fb93bcac", + "0x592f2e1711ac43db0519870c7d0ea415", + // g1 y + "0x00000000000000000000000000000000", + "0x092c0f994164a0719f51c24ba3788de2", + "0x40ff926b55f58c445116e8bc6a47cd63", + "0x392fd4e8e22bdf9feaa96ee773222133", + } + var res field.Element + _, err := res.SetString(tbl[inputIndex%nbRowsPerG1Map]) + if err != nil { + panic(fmt.Sprintf("failed to set string: %v", err)) + } + return res +} + +func inputFillerMapToG2(circuitInstance, inputIndex int) field.Element { + // map of (0, 0) + tbl := []string{ + // fp2 element + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + // g2 x Re + "0x00000000000000000000000000000000", + "0x018320896ec9eef9d5e619848dc29ce2", + "0x66f413d02dd31d9b9d44ec0c79cd61f1", + "0x8b075ddba6d7bd20b7ff27a4b324bfce", + // g2 x Im + "0x00000000000000000000000000000000", + "0x0a67d12118b5a35bb02d2e86b3ebfa7e", + "0x23410db93de39fb06d7025fa95e96ffa", + "0x428a7a27c3ae4dd4b40bd251ac658892", + // g2 y Re + "0x00000000000000000000000000000000", + "0x0260e03644d1a2c321256b3246bad2b8", + "0x95cad13890cbe6f85df55106a0d33460", + "0x4fb143c7a042d878006271865bc35941", + // g2 y Im + "0x00000000000000000000000000000000", + "0x04c69777a43f0bda07679d5805e63f18", + "0xcf4e0e7c6112ac7f70266d199b4f76ae", + "0x27c6269a3ceebdae30806e9a76aadf5c", + } + var res field.Element + _, err := res.SetString(tbl[inputIndex%nbRowsPerG2Map]) + if err != nil { + panic(fmt.Sprintf("failed to set string: %v", err)) + } + return res +} + +func inputFillerPointEvaluation(circuitInstance, inputIndex int) field.Element { + tbl := []string{ + // versioned hash + "0x010657f37554c781402a22917dee2f75", + "0xdef7ab966d7b770905398eba3c444014", + // evaluation point + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + // claimed value + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + // commitment compressed + "0xc0000000000000000000000000000000", + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + // proof compressed + "0xc0000000000000000000000000000000", + "0x00000000000000000000000000000000", + "0x00000000000000000000000000000000", + // expected blob size + "0x00000000000000000000000000000000", + "0x00000000000000000000000000001000", + // expected bls modulus + "0x73eda753299d7d483339d80809a1d805", + "0x53bda402fffe5bfeffffffff00000001", + } + var res field.Element + _, err := res.SetString(tbl[inputIndex%nbRowsPerPointEval]) + if err != nil { + panic(fmt.Sprintf("failed to set string: %v", err)) + } + return res +} + +func inputFillerPointEvaluationFailure(circuitInstance, inputIndex int) field.Element { + var res field.Element + return res +} diff --git a/prover/zkevm/prover/bls/limits.go b/prover/zkevm/prover/bls/limits.go new file mode 100644 index 0000000000..ab27b6b7d1 --- /dev/null +++ b/prover/zkevm/prover/bls/limits.go @@ -0,0 +1,108 @@ +package bls + +type Limits struct { + // Number of G1 addition input instances. Single instance is approx 11000 + // PLONK constraints + NbG1AddInputInstances int + // Number of G2 addition input instances. Single instance is approx 25000 + // PLONK constraints. + NbG2AddInputInstances int + + // Number of G1 scalar multiplication input instances. Single instance is + // approx 596000 PLONK constraints + NbG1MulInputInstances int + // Number of G2 scalar multiplication input instances. Single instance is + // approx 1.2 million PLONK constraints + NbG2MulInputInstances int + + // Number of inputs per Miller loop circuits. Counted without the last + // Miller loop which is done in the final exponentiation part. Single + // instance is approx 1.68M PLONK constraints + NbMillerLoopInputInstances int + // Number of inputs per final exponentiation circuits. Single instance is + // approx 1.74M PLONK constraints. + NbFinalExpInputInstances int + + // Number of inputs per G1 subgroup membership circuits. Single instance is + // approx 317000 PLONK constraints. + NbG1MembershipInputInstances int + // Number of inputs per G2 subgroup membership circuits. Single instance is + // approx 378000 PLONK constraints. + NbG2MembershipInputInstances int + + // Number of G1 map to curve input instances. Single instance is approx + // 217000 PLONK constraints. + NbG1MapToInputInstances int + // Number of G2 map to curve input instances. Single instance is approx + // 797000 PLONK constraints. + NbG2MapToInputInstances int + + // Number of C1 membership input instances. Single instance is approx 4000 + // PLONK constraints + NbC1MembershipInputInstances int + // Number of C2 membership input instances. Single instance is approx 8000 + // PLONK constraints. + NbC2MembershipInputInstances int + + // Number of point evaluation input instances. Single instance is approx + // 3.19M PLONK constraints. + NbPointEvalInputInstances int + // Number of point evaluation failure input instances. Single instance is approx + // 5.34M PLONK constraints. + NbPointEvalFailureInputInstances int +} + +func (l *Limits) nbAddInputInstances(g group) int { + switch g { + case G1: + return l.NbG1AddInputInstances + case G2: + return l.NbG2AddInputInstances + default: + panic("unknown group for bls add input instances") + } +} + +func (l *Limits) nbMapInputInstances(g group) int { + switch g { + case G1: + return l.NbG1MapToInputInstances + case G2: + return l.NbG2MapToInputInstances + default: + panic("unknown group for bls map input instances") + } +} + +func (l *Limits) nbMulInputInstances(g group) int { + switch g { + case G1: + return l.NbG1MulInputInstances + case G2: + return l.NbG2MulInputInstances + default: + panic("unknown group for bls mul input instances") + } +} + +func (l *Limits) nbCurveMembershipInputInstances(g group) int { + switch g { + case G1: + return l.NbC1MembershipInputInstances + case G2: + return l.NbC2MembershipInputInstances + default: + panic("unknown group for bls curve membership input instances") + } +} + +func (l *Limits) nbGroupMembershipInputInstances(g group) int { + switch g { + case G1: + return l.NbG1MembershipInputInstances + case G2: + return l.NbG2MembershipInputInstances + default: + panic("unknown group for bls group membership input instances") + } +} diff --git a/prover/zkevm/prover/bls/module_add.go b/prover/zkevm/prover/bls/module_add.go new file mode 100644 index 0000000000..516d54b8b0 --- /dev/null +++ b/prover/zkevm/prover/bls/module_add.go @@ -0,0 +1,103 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" +) + +const ( + NAME_BLS_ADD = "BLS_ADD" +) + +type blsAddDataSource struct { + ID ifaces.Column + CsAdd ifaces.Column + CsCurveMembership ifaces.Column + Limb ifaces.Column + Index ifaces.Column + Counter ifaces.Column + IsData ifaces.Column + IsRes ifaces.Column +} + +func newAddDataSource(comp *wizard.CompiledIOP, g group) *blsAddDataSource { + return &blsAddDataSource{ + ID: comp.Columns.GetHandle(colNameFn("ID")), + CsAdd: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_BLS_" + g.String() + "_ADD")), + Limb: comp.Columns.GetHandle(colNameFn("LIMB")), + Index: comp.Columns.GetHandle(colNameFn("INDEX")), + Counter: comp.Columns.GetHandle(colNameFn("CT")), + CsCurveMembership: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_" + g.StringCurve() + "_MEMBERSHIP")), + IsData: comp.Columns.GetHandle(colNameFn("DATA_BLS_" + g.String() + "_ADD_FLAG")), + IsRes: comp.Columns.GetHandle(colNameFn("RSLT_BLS_" + g.String() + "_ADD_FLAG")), + } +} + +type BlsAdd struct { + *blsAddDataSource + alignedAddGnarkData *plonk.Alignment + alignedCurveMembershipGnarkData *plonk.Alignment + + *Limits + group +} + +func newAdd(_ *wizard.CompiledIOP, g group, limits *Limits, src *blsAddDataSource) *BlsAdd { + res := &BlsAdd{ + blsAddDataSource: src, + Limits: limits, + group: g, + } + + return res +} + +func (ba *BlsAdd) WithAddCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsAdd { + // the gnark circuit takes exactly the same rows as provided by the arithmetization. So + // to get the bound on the number of circuits we just need to divide by the size of the + // addition circuit input instances + maxNbInstances := ba.blsAddDataSource.CsAdd.Size() / nbRowsPerAdd(ba.group) + maxNbCircuits := maxNbInstances/ba.Limits.nbAddInputInstances(ba.group) + 1 + + toAlignAdd := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_%s_ALIGNMENT", NAME_BLS_ADD, ba.group.String()), + Round: ROUND_NR, + DataToCircuitMask: ba.blsAddDataSource.CsAdd, + DataToCircuit: ba.blsAddDataSource.Limb, + Circuit: newAddCircuit(ba.group, ba.Limits), + NbCircuitInstances: maxNbCircuits, + PlonkOptions: options, + } + ba.alignedAddGnarkData = plonk.DefineAlignment(comp, toAlignAdd) + return ba +} + +func (ba *BlsAdd) WithCurveMembershipCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsAdd { + maxNbCircuits := ba.blsAddDataSource.CsCurveMembership.Size() / ba.Limits.nbCurveMembershipInputInstances(ba.group) + + toAlignCurveMembership := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_%s_CURVE_MEMBERSHIP_ALIGNMENT", NAME_BLS_ADD, ba.group.StringCurve()), + Round: ROUND_NR, + DataToCircuitMask: ba.blsAddDataSource.CsCurveMembership, + DataToCircuit: ba.blsAddDataSource.Limb, + Circuit: newCheckCircuit(ba.group, CURVE, ba.Limits), + NbCircuitInstances: maxNbCircuits, + PlonkOptions: options, + InputFillerKey: membershipInputFillerKey(ba.group, CURVE), + } + ba.alignedCurveMembershipGnarkData = plonk.DefineAlignment(comp, toAlignCurveMembership) + return ba +} + +func (ba *BlsAdd) Assign(run *wizard.ProverRuntime) { + if ba.alignedAddGnarkData != nil { + ba.alignedAddGnarkData.Assign(run) + } + if ba.alignedCurveMembershipGnarkData != nil { + ba.alignedCurveMembershipGnarkData.Assign(run) + } +} diff --git a/prover/zkevm/prover/bls/module_add_test.go b/prover/zkevm/prover/bls/module_add_test.go new file mode 100644 index 0000000000..0e010ccfa7 --- /dev/null +++ b/prover/zkevm/prover/bls/module_add_test.go @@ -0,0 +1,91 @@ +package bls + +import ( + "errors" + "os" + "testing" + + "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/utils/csvtraces" +) + +func testBlsAdd(t *testing.T, withCircuit bool, g group, path string, limits *Limits) { + f, err := os.Open(path) + if errors.Is(err, os.ErrNotExist) { + t.Fatal("csv file does not exist, please run `go generate` to generate the test data") + } + if err != nil { + t.Fatal("failed to open csv file", err) + } + defer f.Close() + ct, err := csvtraces.NewCsvTrace(f) + if err != nil { + t.Fatal("failed to create csv trace", err) + } + var blsAdd *BlsAdd + cmp := wizard.Compile( + func(b *wizard.Builder) { + blsAddSource := &blsAddDataSource{ + CsAdd: ct.GetCommit(b, "CIRCUIT_SELECTOR_"+g.String()+"_ADD"), + Limb: ct.GetCommit(b, "LIMB"), + Index: ct.GetCommit(b, "INDEX"), + Counter: ct.GetCommit(b, "CT"), + CsCurveMembership: ct.GetCommit(b, "CIRCUIT_SELECTOR_"+g.StringCurve()+"_MEMBERSHIP"), + IsData: ct.GetCommit(b, "DATA_"+g.String()+"_ADD"), + IsRes: ct.GetCommit(b, "RSLT_"+g.String()+"_ADD"), + } + blsAdd = newAdd(b.CompiledIOP, g, limits, blsAddSource) + if withCircuit { + blsAdd = blsAdd. + WithAddCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)). + WithCurveMembershipCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)) + } + }, + dummy.Compile, + ) + + proof := wizard.Prove(cmp, + func(run *wizard.ProverRuntime) { + ct.Assign(run, "CIRCUIT_SELECTOR_"+g.String()+"_ADD", "LIMB", "INDEX", "CT", "CIRCUIT_SELECTOR_"+g.StringCurve()+"_MEMBERSHIP", "DATA_"+g.String()+"_ADD", "RSLT_"+g.String()+"_ADD") + blsAdd.Assign(run) + }) + + if err := wizard.Verify(cmp, proof); err != nil { + t.Fatal("proof failed", err) + } + t.Log("proof succeeded") +} + +func TestBlsG1AddNoCircuit(t *testing.T) { + limits := &Limits{ + NbG1AddInputInstances: 16, + NbC1MembershipInputInstances: 16, + } + testBlsAdd(t, false, G1, "testdata/bls_g1_add_inputs.csv", limits) +} + +func TestBlsG1AddWithCircuit(t *testing.T) { + limits := &Limits{ + NbG1AddInputInstances: 16, + NbC1MembershipInputInstances: 16, + } + testBlsAdd(t, true, G1, "testdata/bls_g1_add_inputs.csv", limits) +} + +func TestBlsG2AddNoCircuit(t *testing.T) { + limits := &Limits{ + NbG2AddInputInstances: 16, + NbC2MembershipInputInstances: 16, + } + testBlsAdd(t, false, G2, "testdata/bls_g2_add_inputs.csv", limits) +} + +func TestBlsG2AddWithCircuit(t *testing.T) { + limits := &Limits{ + NbG2AddInputInstances: 16, + NbC2MembershipInputInstances: 16, + } + testBlsAdd(t, true, G2, "testdata/bls_g2_add_inputs.csv", limits) +} diff --git a/prover/zkevm/prover/bls/module_map.go b/prover/zkevm/prover/bls/module_map.go new file mode 100644 index 0000000000..798bb504ba --- /dev/null +++ b/prover/zkevm/prover/bls/module_map.go @@ -0,0 +1,83 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" +) + +const ( + NAME_BLS_MAP = "BLS_MAP" +) + +type blsMapDataSource struct { + ID ifaces.Column + CsMap ifaces.Column + Limb ifaces.Column + Index ifaces.Column + Counter ifaces.Column + IsData ifaces.Column + IsRes ifaces.Column +} + +func newMapDataSource(comp *wizard.CompiledIOP, g group) *blsMapDataSource { + var mapString string + if g == G1 { + mapString = "MAP_FP_TO_G1" + } else { + mapString = "MAP_FP2_TO_G2" + } + return &blsMapDataSource{ + ID: comp.Columns.GetHandle(colNameFn("ID")), + CsMap: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_BLS_" + mapString)), + Index: comp.Columns.GetHandle(colNameFn("INDEX")), + Counter: comp.Columns.GetHandle(colNameFn("CT")), + Limb: comp.Columns.GetHandle(colNameFn("LIMB")), + IsData: comp.Columns.GetHandle(colNameFn("DATA_BLS_" + mapString + "_FLAG")), + IsRes: comp.Columns.GetHandle(colNameFn("RSLT_BLS_" + mapString + "_FLAG")), + } +} + +type BlsMap struct { + *blsMapDataSource + alignedGnarkData *plonk.Alignment + *Limits + group +} + +func newMap(_ *wizard.CompiledIOP, g group, limits *Limits, src *blsMapDataSource) *BlsMap { + res := &BlsMap{ + blsMapDataSource: src, + Limits: limits, + group: g, + } + return res +} + +func (bm *BlsMap) WithMapCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsMap { + // gnark circuits takes the inputs as is. To get the bound on the number of circuits we need + // to divide the maximum number of inputs instances with the number of instances per circuit + maxNbInstances := bm.blsMapDataSource.CsMap.Size() / nbRowsPerMap(bm.group) + maxNbCircuits := maxNbInstances/bm.Limits.nbMapInputInstances(bm.group) + 1 + toAlign := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_%s_ALIGNMENT", NAME_BLS_MAP, bm.group.String()), + Round: ROUND_NR, + DataToCircuitMask: bm.blsMapDataSource.CsMap, + DataToCircuit: bm.blsMapDataSource.Limb, + Circuit: NewMapCircuit(bm.group, bm.Limits), + NbCircuitInstances: maxNbCircuits, + InputFillerKey: mapToGroupInputFillerKey(bm.group), + PlonkOptions: options, + } + bm.alignedGnarkData = plonk.DefineAlignment(comp, toAlign) + return bm +} + +func (bm *BlsMap) Assign(run *wizard.ProverRuntime) { + if bm.alignedGnarkData != nil { + bm.alignedGnarkData.Assign(run) + } +} diff --git a/prover/zkevm/prover/bls/module_map_test.go b/prover/zkevm/prover/bls/module_map_test.go new file mode 100644 index 0000000000..965577ceb1 --- /dev/null +++ b/prover/zkevm/prover/bls/module_map_test.go @@ -0,0 +1,91 @@ +package bls + +import ( + "errors" + "os" + "testing" + + "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/utils/csvtraces" +) + +func testBlsMap(t *testing.T, withCircuit bool, g group, path string, limits *Limits) { + f, err := os.Open(path) + if errors.Is(err, os.ErrNotExist) { + t.Fatal("csv file does not exist, please run `go generate` to generate the test data") + } + if err != nil { + t.Fatal("failed to open csv file", err) + } + defer f.Close() + ct, err := csvtraces.NewCsvTrace(f) + if err != nil { + t.Fatal("failed to create csv trace", err) + } + var mapString string + if g == G1 { + mapString = "MAP_FP_TO_G1" + } else { + mapString = "MAP_FP2_TO_G2" + } + var blsMap *BlsMap + cmp := wizard.Compile( + func(b *wizard.Builder) { + blsMapSource := &blsMapDataSource{ + ID: ct.GetCommit(b, "ID"), + CsMap: ct.GetCommit(b, "CIRCUIT_SELECTOR_"+mapString), + Index: ct.GetCommit(b, "INDEX"), + Counter: ct.GetCommit(b, "CT"), + Limb: ct.GetCommit(b, "LIMB"), + IsData: ct.GetCommit(b, "DATA_"+mapString), + IsRes: ct.GetCommit(b, "RSLT_"+mapString), + } + blsMap = newMap(b.CompiledIOP, g, limits, blsMapSource) + if withCircuit { + blsMap = blsMap.WithMapCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)) + } + }, + dummy.Compile, + ) + + proof := wizard.Prove(cmp, + func(run *wizard.ProverRuntime) { + ct.Assign(run, "ID", "CIRCUIT_SELECTOR_"+mapString, "INDEX", "CT", "LIMB", "DATA_"+mapString, "RSLT_"+mapString) + blsMap.Assign(run) + }) + + if err := wizard.Verify(cmp, proof); err != nil { + t.Fatal("proof failed", err) + } + t.Log("proof succeeded") +} + +func TestBlsMapG1NoCircuit(t *testing.T) { + limits := &Limits{ + NbG1MapToInputInstances: 16, + } + testBlsMap(t, false, G1, "testdata/bls_g1_map_inputs.csv", limits) +} + +func TestBlsMapG1WithCircuit(t *testing.T) { + limits := &Limits{ + NbG1MapToInputInstances: 16, + } + testBlsMap(t, true, G1, "testdata/bls_g1_map_inputs.csv", limits) +} + +func TestBlsMapG2NoCircuit(t *testing.T) { + limits := &Limits{ + NbG2MapToInputInstances: 5, + } + testBlsMap(t, false, G2, "testdata/bls_g2_map_inputs.csv", limits) +} + +func TestBlsMapG2WithCircuit(t *testing.T) { + limits := &Limits{ + NbG2MapToInputInstances: 5, + } + testBlsMap(t, true, G2, "testdata/bls_g2_map_inputs.csv", limits) +} diff --git a/prover/zkevm/prover/bls/module_msm.go b/prover/zkevm/prover/bls/module_msm.go new file mode 100644 index 0000000000..afd3236bc9 --- /dev/null +++ b/prover/zkevm/prover/bls/module_msm.go @@ -0,0 +1,446 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/column" + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + sym "github.com/consensys/linea-monorepo/prover/symbolic" + "github.com/consensys/linea-monorepo/prover/utils" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" +) + +const ( + NAME_BLS_MSM = "BLS_MSM" + NAME_UNALIGNED_MSM = "UNALIGNED_BLS_MSM" +) + +type blsMsmDataSource struct { + ID ifaces.Column + CsMul ifaces.Column + CsMembership ifaces.Column + Limb ifaces.Column + Index ifaces.Column + Counter ifaces.Column + IsData ifaces.Column + IsRes ifaces.Column +} + +func newMsmDataSource(comp *wizard.CompiledIOP, g group) *blsMsmDataSource { + return &blsMsmDataSource{ + ID: comp.Columns.GetHandle(colNameFn("ID")), + CsMul: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_BLS_" + g.String() + "_MSM")), + CsMembership: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_" + g.String() + "_MEMBERSHIP")), + Limb: comp.Columns.GetHandle(colNameFn("LIMB")), + Index: comp.Columns.GetHandle(colNameFn("INDEX")), + Counter: comp.Columns.GetHandle(colNameFn("CT")), + IsData: comp.Columns.GetHandle(colNameFn("DATA_BLS_" + g.String() + "_MSM_FLAG")), + IsRes: comp.Columns.GetHandle(colNameFn("RSLT_BLS_" + g.String() + "_MSM_FLAG")), + } +} + +type BlsMsm struct { + *blsMsmDataSource + *unalignedMsmData + AlignedGnarkMsmData *plonk.Alignment + AlignedGnarkGroupMembershipData *plonk.Alignment + *Limits + group +} + +func newMsm(comp *wizard.CompiledIOP, g group, limits *Limits, src *blsMsmDataSource) *BlsMsm { + umsm := newUnalignedMsmData(comp, g, src) + + return &BlsMsm{ + blsMsmDataSource: src, + unalignedMsmData: umsm, + Limits: limits, + group: g, + } +} + +func (bm *BlsMsm) WithMsmCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsMsm { + nbCircuits := bm.maxNbMsmInputs/bm.Limits.nbMulInputInstances(bm.group) + 1 + toAlignMsm := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_%s_MSM", NAME_BLS_MSM, bm.group.String()), + Round: ROUND_NR, + DataToCircuitMask: bm.unalignedMsmData.GnarkIsActiveMsm, + DataToCircuit: bm.unalignedMsmData.GnarkDataMsm, + Circuit: newMulCircuit(bm.group, bm.Limits), + NbCircuitInstances: nbCircuits, + PlonkOptions: options, + } + + bm.AlignedGnarkMsmData = plonk.DefineAlignment(comp, toAlignMsm) + return bm +} + +func (bm *BlsMsm) WithGroupMembershipCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsMsm { + // compute the bound on the number of circuits we need. First we estimate a bound on the number of possible + // maximum number of G1/G2 points which could go to the membership circuit. + nbInputs := bm.blsMsmDataSource.CsMembership.Size() / nbLimbs(bm.group) + // and by knowing how many inputs every circuit takes, we can bound the number of circuits as well + nbCircuits := nbInputs/bm.Limits.nbGroupMembershipInputInstances(bm.group) + 1 + toAlignMembership := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_%s_GROUP_MEMBERSHIP", NAME_BLS_MSM, bm.group.String()), + Round: ROUND_NR, + DataToCircuitMask: bm.blsMsmDataSource.CsMembership, + DataToCircuit: bm.blsMsmDataSource.Limb, + Circuit: newCheckCircuit(bm.group, GROUP, bm.Limits), + NbCircuitInstances: nbCircuits, + InputFillerKey: membershipInputFillerKey(bm.group, GROUP), + PlonkOptions: options, + } + + bm.AlignedGnarkGroupMembershipData = plonk.DefineAlignment(comp, toAlignMembership) + return bm +} + +func (bm *BlsMsm) Assign(run *wizard.ProverRuntime) { + bm.unalignedMsmData.Assign(run) + if bm.AlignedGnarkMsmData != nil { + bm.AlignedGnarkMsmData.Assign(run) + } + if bm.AlignedGnarkGroupMembershipData != nil { + bm.AlignedGnarkGroupMembershipData.Assign(run) + } +} + +type unalignedMsmData struct { + *blsMsmDataSource + IsDataAndCsMul ifaces.Column // indicates if source is data and has CS_MSM set + IsResultAndCsMul ifaces.Column // indicates if source is result and has CS_MSM set + // this part is used to define the accumulators and indicate if the + IsActive ifaces.Column + IsFirstLine ifaces.Column + IsLastLine ifaces.Column + Scalar [nbFrLimbs]ifaces.Column + Point []ifaces.Column // length nbG1Limbs or nbG2Limbs + CurrentAccumulator []ifaces.Column // length nbG1Limbs or nbG2Limbs + NextAccumulator []ifaces.Column // length nbG1Limbs or nbG2Limbs + + // data which is projected from above columns going into the MSM circuit + GnarkIsActiveMsm ifaces.Column + GnarkDataMsm ifaces.Column + + group group + maxNbMsmInputs int +} + +func newUnalignedMsmData(comp *wizard.CompiledIOP, g group, src *blsMsmDataSource) *unalignedMsmData { + // obtain the maximum number of rows which are coming from the arithmetization. + maxNbRows := max(src.CsMul.Size(), src.IsData.Size(), src.IsRes.Size()) + // assuming the worst case where there is single long MSM. Then we have + // group element and scalar for every input. And we add one to avoid edge + // case with 0 size. + maxNbMsmInputs := src.CsMul.Size()/(nbLimbs(g)+nbFrLimbs) + 1 + // and all witness elements for the gnark circuits are expanded as we have interleaved with accumulators + maxNbRowsAligned := maxNbMsmInputs * nbRowsPerMul(g) + + createCol1 := createColFn(comp, fmt.Sprintf("UNALIGNED_%s_BLS_MSM", g.String()), utils.NextPowerOfTwo(maxNbMsmInputs)) + createCol2 := createColFn(comp, fmt.Sprintf("UNALIGNED_%s_BLS_MSM", g.String()), utils.NextPowerOfTwo(maxNbRowsAligned)) + res := &unalignedMsmData{ + blsMsmDataSource: src, + IsDataAndCsMul: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("UNALIGNED_%s_BLS_MSM_SRC_IS_DATA_AND_CS_MSM", g.String()), maxNbRows), + IsResultAndCsMul: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("UNALIGNED_%s_BLS_MSM_SRC_IS_RESULT_AND_CS_MSM", g.String()), maxNbRows), + IsActive: createCol1("IS_ACTIVE"), + Point: make([]ifaces.Column, nbLimbs(g)), + CurrentAccumulator: make([]ifaces.Column, nbLimbs(g)), + NextAccumulator: make([]ifaces.Column, nbLimbs(g)), + IsFirstLine: createCol1("IS_FIRST_LINE"), + IsLastLine: createCol1("IS_LAST_LINE"), + GnarkIsActiveMsm: createCol2("GNARK_IS_ACTIVE_MSM"), + GnarkDataMsm: createCol2("GNARK_DATA_MSM"), + group: g, + maxNbMsmInputs: maxNbMsmInputs, + } + + for i := range res.Scalar { + res.Scalar[i] = createCol1(fmt.Sprintf("SCALAR_%d", i)) + } + for i := range res.Point { + res.Point[i] = createCol1(fmt.Sprintf("POINT_%d", i)) + } + for i := range res.CurrentAccumulator { + res.CurrentAccumulator[i] = createCol1(fmt.Sprintf("CURRENT_ACCUMULATOR_%d", i)) + } + for i := range res.NextAccumulator { + res.NextAccumulator[i] = createCol1(fmt.Sprintf("NEXT_ACCUMULATOR_%d", i)) + } + + res.csInputMasks(comp) + // data projection + res.csProjectionData(comp) + // result projection + res.csProjectionResult(comp) + // first line accumulator zero + res.csAccumulatorInit(comp) + // accumulator consistency + res.csAccumulatorConsistency(comp) + + return res +} + +func (d *unalignedMsmData) csInputMasks(comp *wizard.CompiledIOP) { + // we need to compute the IS_DATA && CS_MUL column which is used for projection + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_IS_DATA_AND_CS_MUL", NAME_UNALIGNED_MSM, d.group.String()), sym.Sub(d.IsDataAndCsMul, sym.Mul(d.IsData, d.CsMul))) + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_IS_RESULT_AND_CS_MUL", NAME_UNALIGNED_MSM, d.group.String()), sym.Sub(d.IsResultAndCsMul, sym.Mul(d.IsRes, d.CsMul))) +} + +func (d *unalignedMsmData) csProjectionData(comp *wizard.CompiledIOP) { + // ensures that the data limbs from source are projected into columns of the + // unaligned module properly. It additionally constraints IsActive to + // correspond to the number of lines in the source. + nbL := nbLimbs(d.group) + + filtersB := make([]ifaces.Column, nbL+nbFrLimbs) + columnsB := make([][]ifaces.Column, nbL+nbFrLimbs) + for i := range nbL { + filtersB[i] = d.IsActive + columnsB[i] = []ifaces.Column{d.Point[i]} + } + for i := range nbFrLimbs { + filtersB[nbL+i] = d.IsActive + columnsB[nbL+i] = []ifaces.Column{d.Scalar[i]} + } + prj := query.ProjectionMultiAryInput{ + FiltersA: []ifaces.Column{d.IsDataAndCsMul}, + FiltersB: filtersB, + ColumnsA: [][]ifaces.Column{{d.blsMsmDataSource.Limb}}, + ColumnsB: columnsB, + } + comp.InsertProjection(ifaces.QueryIDf("%s_%s_PROJECTION_DATA", NAME_UNALIGNED_MSM, d.group.String()), prj) +} + +func (d *unalignedMsmData) csProjectionResult(comp *wizard.CompiledIOP) { + nbL := nbLimbs(d.group) + + filtersB := make([]ifaces.Column, nbL) + columnsB := make([][]ifaces.Column, nbL) + for i := range nbL { + filtersB[i] = d.IsLastLine + columnsB[i] = []ifaces.Column{d.NextAccumulator[i]} + } + prj := query.ProjectionMultiAryInput{ + FiltersA: []ifaces.Column{d.IsResultAndCsMul}, + FiltersB: filtersB, + ColumnsA: [][]ifaces.Column{{d.blsMsmDataSource.Limb}}, + ColumnsB: columnsB, + } + comp.InsertProjection(ifaces.QueryIDf("%s_%s_PROJECTION_RESULT", NAME_UNALIGNED_MSM, d.group.String()), prj) +} + +func (d *unalignedMsmData) csAccumulatorInit(comp *wizard.CompiledIOP) { + // ensures that the first line accumulator is zero + nbL := nbLimbs(d.group) + for i := range nbL { + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_ACCUMULATOR_INIT_%d", NAME_UNALIGNED_MSM, d.group.String(), i), sym.Mul(d.CurrentAccumulator[i], d.IsFirstLine)) + } +} + +func (d *unalignedMsmData) csAccumulatorConsistency(comp *wizard.CompiledIOP) { + // ensure that the current accumulator is equal to the next accumulator on previous line. + // we need to cancel out if current line is the first line where the current accumulator is zero + // (checked in [unalignedMsmData.csAccumulatorInit]) + nbL := nbLimbs(d.group) + for i := range nbL { + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_ACCUMULATOR_CONSISTENCY_%d", NAME_UNALIGNED_MSM, d.group.String(), i), + sym.Mul( + d.IsActive, + sym.Sub(1, d.IsFirstLine), + sym.Sub(d.CurrentAccumulator[i], column.Shift(d.NextAccumulator[i], -1)), + ), + ) + } +} + +func (d *unalignedMsmData) Assign(run *wizard.ProverRuntime) { + d.assignDataAndMul(run) + d.assignUnaligned(run) + d.assignGnarkData(run) +} + +func (d *unalignedMsmData) assignDataAndMul(run *wizard.ProverRuntime) { + var ( + srcLimb = d.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsData = d.IsData.GetColAssignment(run).IntoRegVecSaveAlloc() + srcCsMul = d.CsMul.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsRes = d.IsRes.GetColAssignment(run).IntoRegVecSaveAlloc() + ) + var ( + dstDataAndCs = common.NewVectorBuilder(d.IsDataAndCsMul) + dstIsResultAndCs = common.NewVectorBuilder(d.IsResultAndCsMul) + ) + // compute the IS_DATA && CS_MUL column which is used for projection + for ptr := range srcLimb { + dstDataAndCs.PushBoolean(srcIsData[ptr].IsOne() && srcCsMul[ptr].IsOne()) + dstIsResultAndCs.PushBoolean(srcIsRes[ptr].IsOne() && srcCsMul[ptr].IsOne()) + } + dstDataAndCs.PadAndAssign(run, field.Zero()) + dstIsResultAndCs.PadAndAssign(run, field.Zero()) +} + +func (d *unalignedMsmData) assignUnaligned(run *wizard.ProverRuntime) { + var ( + srcID = d.ID.GetColAssignment(run).IntoRegVecSaveAlloc() + srcLimb = d.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIndex = d.Index.GetColAssignment(run).IntoRegVecSaveAlloc() + srcCounter = d.Counter.GetColAssignment(run).IntoRegVecSaveAlloc() + srcCsMul = d.CsMul.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsData = d.IsData.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsRes = d.IsRes.GetColAssignment(run).IntoRegVecSaveAlloc() + ) + + nbL := nbLimbs(d.group) + var ( + dstIsActive = common.NewVectorBuilder(d.IsActive) + + dstIsFirstLine = common.NewVectorBuilder(d.IsFirstLine) + dstIsLastLine = common.NewVectorBuilder(d.IsLastLine) + dstScalar = make([]*common.VectorBuilder, nbFrLimbs) + dstPoint = make([]*common.VectorBuilder, nbL) + dstCurrentAccumulator = make([]*common.VectorBuilder, nbL) + dstNextAccumulator = make([]*common.VectorBuilder, nbL) + ) + for i := range dstScalar { + dstScalar[i] = common.NewVectorBuilder(d.Scalar[i]) + } + for i := range nbL { + dstPoint[i] = common.NewVectorBuilder(d.Point[i]) + dstCurrentAccumulator[i] = common.NewVectorBuilder(d.CurrentAccumulator[i]) + dstNextAccumulator[i] = common.NewVectorBuilder(d.NextAccumulator[i]) + } + + var ptr int + + for ptr < len(srcLimb) { + // first detect if it is a new MSM instance. + // We normally would only check is IsData=1 && Index=0 && Counter=0, but we also don't want to "open" + // new instance here if the circuit selector to MSM is not set as it indicates MSM with invalid inputs, in which + // case the invalid input will be sent to non-membership circuit. + if !(srcIsData[ptr].IsOne() && srcIndex[ptr].IsZero() && srcCounter[ptr].IsZero() && srcCsMul[ptr].IsOne()) { + ptr++ + continue + } + // we are now on the first line of a new MSM instance. Every MSM + // instance is ((P1, n1), (P2, n2), ..., (Pk, nk), R), where Pi, ni are + // the points and scalars and R is the result. + + // we get the current instance ID so that we know when to stop + currentID := srcID[ptr] + // MSM input index + idx := 0 + // we initialize the current accumulator for computing the running sum + currAccumulator := make([]field.Element, nbL) + var nextAccumulator []field.Element + + // now we copy the actual + for ptr < len(srcID) && currentID.Equal(&srcID[ptr]) { + // we either have input or result limbs. Switch to see if we need to + // copy point+scalar or only result limbs. + switch { + case srcIsData[ptr].IsOne(): + // copy the point limbs + for i := range nbL { + dstPoint[i].PushField(srcLimb[ptr+i]) + } + // copy the scalar limbs + for i := range nbFrLimbs { + dstScalar[i].PushField(srcLimb[ptr+nbL+i]) + } + dstIsLastLine.PushZero() + // compute the next accumulator + nextAccumulator = nativeScalarMulAndSum(d.group, currAccumulator, srcLimb[ptr:ptr+nbL], srcLimb[ptr+nbL:ptr+nbL+nbFrLimbs]) + for i := range nbL { + // copy the next accumulator limbs + dstNextAccumulator[i].PushField(nextAccumulator[i]) + // we also copy the current accumulator, which is the same as the next + dstCurrentAccumulator[i].PushField(currAccumulator[i]) + } + currAccumulator = nextAccumulator + ptr += nbL + nbFrLimbs + dstIsActive.PushOne() + if idx == 0 { + dstIsFirstLine.PushOne() + } else { + dstIsFirstLine.PushZero() + } + idx++ + case srcIsRes[ptr].IsOne(): + // if it is the last line then we don't need to copy the result limbs - we have already computed it. + // its consistency will be checked by gnark circuit and projection queries. + dstIsLastLine.Pop() + dstIsLastLine.PushOne() + ptr += nbL + } + } + } + + dstIsActive.PadAndAssign(run, field.Zero()) + dstIsFirstLine.PadAndAssign(run, field.Zero()) + dstIsLastLine.PadAndAssign(run, field.Zero()) + for i := range nbFrLimbs { + dstScalar[i].PadAndAssign(run, field.Zero()) + } + for i := range nbL { + dstPoint[i].PadAndAssign(run, field.Zero()) + dstCurrentAccumulator[i].PadAndAssign(run, field.Zero()) + dstNextAccumulator[i].PadAndAssign(run, field.Zero()) + } +} + +func (d *unalignedMsmData) assignGnarkData(run *wizard.ProverRuntime) { + nbL := nbLimbs(d.group) + + // we now need to transpose again the limbs into the gnark input format. + // This is essentially mapping the lines of current accumulator, point, + // scalar and next accumulator into column. + var ( + srcIsActive = d.IsActive.GetColAssignment(run).IntoRegVecSaveAlloc() + srcScalar = make([][]field.Element, nbFrLimbs) + srcPoint = make([][]field.Element, nbL) + srcCurrentAccumulator = make([][]field.Element, nbL) + srcNextAccumulator = make([][]field.Element, nbL) + ) + for i := range nbFrLimbs { + srcScalar[i] = d.Scalar[i].GetColAssignment(run).IntoRegVecSaveAlloc() + } + for i := range nbL { + srcPoint[i] = d.Point[i].GetColAssignment(run).IntoRegVecSaveAlloc() + srcCurrentAccumulator[i] = d.CurrentAccumulator[i].GetColAssignment(run).IntoRegVecSaveAlloc() + srcNextAccumulator[i] = d.NextAccumulator[i].GetColAssignment(run).IntoRegVecSaveAlloc() + } + + var ( + dstDataMsm = common.NewVectorBuilder(d.GnarkDataMsm) + dstDataIsActiveMsm = common.NewVectorBuilder(d.GnarkIsActiveMsm) + ) + for i := range srcIsActive { + if !srcIsActive[i].IsOne() { + continue + } + for j := range nbL { + dstDataMsm.PushField(srcCurrentAccumulator[j][i]) + dstDataIsActiveMsm.PushOne() + } + for j := range nbFrLimbs { + dstDataMsm.PushField(srcScalar[j][i]) + dstDataIsActiveMsm.PushOne() + } + for j := range nbL { + dstDataMsm.PushField(srcPoint[j][i]) + dstDataIsActiveMsm.PushOne() + } + for j := range nbL { + dstDataMsm.PushField(srcNextAccumulator[j][i]) + dstDataIsActiveMsm.PushOne() + } + } + + dstDataMsm.PadAndAssign(run, field.Zero()) + dstDataIsActiveMsm.PadAndAssign(run, field.Zero()) +} diff --git a/prover/zkevm/prover/bls/module_msm_test.go b/prover/zkevm/prover/bls/module_msm_test.go new file mode 100644 index 0000000000..0ec2f98d80 --- /dev/null +++ b/prover/zkevm/prover/bls/module_msm_test.go @@ -0,0 +1,106 @@ +package bls + +import ( + "os" + "path/filepath" + "testing" + + "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/utils/csvtraces" +) + +func testBlsMsm(t *testing.T, withCircuit bool, g group, path string, limits *Limits) { + files, err := filepath.Glob(path) + if err != nil { + t.Fatal(err) + } + switch len(files) { + case 0: + t.Fatal("no csv files found, please run `go generate` to generate the test data") + case 1: + t.Log("single CSV file found. For complete testing, generate all test files with `go generate`") + } + // we test all files found + var cmp *wizard.CompiledIOP + var blsMsm *BlsMsm + for _, file := range files { + t.Run(file, func(t *testing.T) { + f, err := os.Open(file) + if err != nil { + t.Fatal(err) + } + defer f.Close() + ct, err := csvtraces.NewCsvTrace(f) + if err != nil { + t.Fatal("failed to create csv trace", err) + } + if cmp == nil { + cmp = wizard.Compile( + func(b *wizard.Builder) { + blsMsmSource := &blsMsmDataSource{ + ID: ct.GetCommit(b, "ID"), + CsMul: ct.GetCommit(b, "CIRCUIT_SELECTOR_"+g.String()+"_MSM"), + CsMembership: ct.GetCommit(b, "CIRCUIT_SELECTOR_"+g.String()+"_MEMBERSHIP"), + Limb: ct.GetCommit(b, "LIMB"), + Index: ct.GetCommit(b, "INDEX"), + Counter: ct.GetCommit(b, "CT"), + IsData: ct.GetCommit(b, "DATA_"+g.String()+"_MSM"), + IsRes: ct.GetCommit(b, "RSLT_"+g.String()+"_MSM"), + } + blsMsm = newMsm(b.CompiledIOP, g, limits, blsMsmSource) + if withCircuit { + blsMsm = blsMsm. + WithGroupMembershipCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)). + WithMsmCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)) + } + }, + dummy.Compile, + ) + } + + proof := wizard.Prove(cmp, + func(run *wizard.ProverRuntime) { + ct.Assign(run, "ID", "CIRCUIT_SELECTOR_"+g.String()+"_MSM", "CIRCUIT_SELECTOR_"+g.String()+"_MEMBERSHIP", "LIMB", "INDEX", "CT", "DATA_"+g.String()+"_MSM", "RSLT_"+g.String()+"_MSM") + blsMsm.Assign(run) + }) + if err := wizard.Verify(cmp, proof); err != nil { + t.Fatal("proof failed", err) + } + t.Log("proof succeeded") + }) + } +} + +func TestBlsG1MsmNoCircuit(t *testing.T) { + limits := &Limits{ + NbG1MulInputInstances: 8, + NbG1MembershipInputInstances: 8, + } + testBlsMsm(t, false, G1, "testdata/bls_g1_msm_inputs-[0-9]*.csv", limits) +} + +func TestBlsG1MsmWithCircuit(t *testing.T) { + limits := &Limits{ + NbG1MulInputInstances: 6, + NbG1MembershipInputInstances: 6, + } + testBlsMsm(t, true, G1, "testdata/bls_g1_msm_inputs-[0-9]*.csv", limits) +} + +func TestBlsG2MsmNoCircuit(t *testing.T) { + limits := &Limits{ + NbG2MulInputInstances: 8, + NbG2MembershipInputInstances: 6, + } + testBlsMsm(t, false, G2, "testdata/bls_g2_msm_inputs-[0-9]*.csv", limits) +} + +func TestBlsG2MsmWithCircuit(t *testing.T) { + limits := &Limits{ + NbG2MulInputInstances: 8, + NbG2MembershipInputInstances: 6, + } + testBlsMsm(t, true, G2, "testdata/bls_g2_msm_inputs-[0-9]*.csv", limits) +} diff --git a/prover/zkevm/prover/bls/module_pair.go b/prover/zkevm/prover/bls/module_pair.go new file mode 100644 index 0000000000..2eaaeb8b05 --- /dev/null +++ b/prover/zkevm/prover/bls/module_pair.go @@ -0,0 +1,636 @@ +package bls + +import ( + "fmt" + + "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/column" + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + sym "github.com/consensys/linea-monorepo/prover/symbolic" + "github.com/consensys/linea-monorepo/prover/utils" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" +) + +const ( + NAME_BLS_PAIR = "BLS_PAIR" + NAME_UNALIGNED_PAIR = "UNALIGNED_BLS_PAIR" +) + +type blsPairDataSource struct { + ID ifaces.Column + CsPair ifaces.Column + CsG1Membership ifaces.Column + CsG2Membership ifaces.Column + IsData ifaces.Column + IsRes ifaces.Column + Index ifaces.Column + Counter ifaces.Column + Limb ifaces.Column + SuccessBit ifaces.Column +} + +func newPairDataSource(comp *wizard.CompiledIOP) *blsPairDataSource { + return &blsPairDataSource{ + ID: comp.Columns.GetHandle(colNameFn("ID")), + CsPair: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_BLS_PAIRING_CHECK")), + CsG1Membership: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_G1_MEMBERSHIP")), + CsG2Membership: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_G2_MEMBERSHIP")), + Limb: comp.Columns.GetHandle(colNameFn("LIMB")), + Index: comp.Columns.GetHandle(colNameFn("INDEX")), + Counter: comp.Columns.GetHandle(colNameFn("CT")), + IsData: comp.Columns.GetHandle(colNameFn("DATA_BLS_PAIRING_CHECK_FLAG")), + IsRes: comp.Columns.GetHandle(colNameFn("RSLT_BLS_PAIRING_CHECK_FLAG")), + SuccessBit: comp.Columns.GetHandle(colNameFn("SUCCESS_BIT")), + } +} + +type BlsPair struct { + *blsPairDataSource + *unalignedPairData + alignedMillerLoopData *plonk.Alignment + alignedFinalExpData *plonk.Alignment + alignedG1MembershipGnarkData *plonk.Alignment + alignedG2MembershipGnarkData *plonk.Alignment + *Limits +} + +func newPair(comp *wizard.CompiledIOP, limits *Limits, src *blsPairDataSource) *BlsPair { + ucmd := newUnalignedPairData(comp, src) + + res := &BlsPair{ + blsPairDataSource: src, + unalignedPairData: ucmd, + Limits: limits, + } + + return res +} + +func (bp *BlsPair) WithPairingCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsPair { + maxNbMlCircuits := bp.maxNbPairInputs/bp.Limits.NbMillerLoopInputInstances + 1 + maxNbFeCircuits := bp.maxNbPairInputs/bp.Limits.NbFinalExpInputInstances + 1 + toAlignMl := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_ML", NAME_BLS_PAIR), + Round: ROUND_NR, + DataToCircuitMask: bp.unalignedPairData.GnarkIsActiveMillerLoop, + DataToCircuit: bp.unalignedPairData.GnarkDataMillerLoop, + Circuit: newMultiMillerLoopMulCircuit(bp.Limits), + NbCircuitInstances: maxNbMlCircuits, + InputFillerKey: millerLoopInputFillerKey, + PlonkOptions: options, + } + toAlignFe := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_FE", NAME_BLS_PAIR), + Round: ROUND_NR, + DataToCircuitMask: bp.unalignedPairData.GnarkIsActiveFinalExp, + DataToCircuit: bp.unalignedPairData.GnarkDataFinalExp, + Circuit: newMultiMillerLoopFinalExpCircuit(bp.Limits), + NbCircuitInstances: maxNbFeCircuits, + InputFillerKey: finalExpInputFillerKey, + PlonkOptions: options, + } + bp.alignedMillerLoopData = plonk.DefineAlignment(comp, toAlignMl) + bp.alignedFinalExpData = plonk.DefineAlignment(comp, toAlignFe) + return bp +} + +func (bp *BlsPair) WithG1MembershipCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsPair { + maxNbInputs := bp.unalignedPairData.GnarkIsActiveG1Membership.Size() / nbG1Limbs + maxNbCircuits := maxNbInputs/bp.Limits.nbGroupMembershipInputInstances(G1) + 1 + toAlignG1Ms := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_G1_MEMBERSHIP", NAME_BLS_PAIR), + Round: ROUND_NR, + DataToCircuitMask: bp.unalignedPairData.GnarkIsActiveG1Membership, + DataToCircuit: bp.blsPairDataSource.Limb, + Circuit: newCheckCircuit(G1, GROUP, bp.Limits), + NbCircuitInstances: maxNbCircuits, + InputFillerKey: membershipInputFillerKey(G1, GROUP), + PlonkOptions: options, + } + bp.alignedG1MembershipGnarkData = plonk.DefineAlignment(comp, toAlignG1Ms) + return bp +} + +func (bp *BlsPair) WithG2MembershipCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsPair { + maxNbInputs := bp.unalignedPairData.GnarkIsActiveG2Membership.Size() / nbG2Limbs + maxNbCircuits := maxNbInputs/bp.Limits.nbGroupMembershipInputInstances(G2) + 1 + toAlignG2Ms := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_G2_MEMBERSHIP", NAME_BLS_PAIR), + Round: ROUND_NR, + DataToCircuitMask: bp.unalignedPairData.GnarkIsActiveG2Membership, + DataToCircuit: bp.blsPairDataSource.Limb, + Circuit: newCheckCircuit(G2, GROUP, bp.Limits), + NbCircuitInstances: maxNbCircuits, + InputFillerKey: membershipInputFillerKey(G2, GROUP), + PlonkOptions: options, + } + bp.alignedG2MembershipGnarkData = plonk.DefineAlignment(comp, toAlignG2Ms) + return bp +} + +func (bp *BlsPair) Assign(run *wizard.ProverRuntime) { + bp.unalignedPairData.Assign(run) + if bp.alignedMillerLoopData != nil { + bp.alignedMillerLoopData.Assign(run) + } + if bp.alignedFinalExpData != nil { + bp.alignedFinalExpData.Assign(run) + } + if bp.alignedG1MembershipGnarkData != nil { + bp.alignedG1MembershipGnarkData.Assign(run) + } + if bp.alignedG2MembershipGnarkData != nil { + bp.alignedG2MembershipGnarkData.Assign(run) + } +} + +type unalignedPairData struct { + *blsPairDataSource + IsActive ifaces.Column + IsFirstLine ifaces.Column + IsLastLine ifaces.Column + IsNotLastLine ifaces.Column + PointG1 [nbG1Limbs]ifaces.Column + PointG2 [nbG2Limbs]ifaces.Column + PrevAccumulator [nbGtLimbs]ifaces.Column + CurrentAccumulator [nbGtLimbs]ifaces.Column + ExpectedResult [2]ifaces.Column + + GnarkIsActiveG1Membership ifaces.Column + GnarkIsActiveG2Membership ifaces.Column + + // data which is project from above to columns going into the gnark pairing check circuit + GnarkIsActiveMillerLoop ifaces.Column + GnarkDataMillerLoop ifaces.Column + + GnarkIsActiveFinalExp ifaces.Column + GnarkDataFinalExp ifaces.Column + + maxNbPairInputs int +} + +func newUnalignedPairData(comp *wizard.CompiledIOP, src *blsPairDataSource) *unalignedPairData { + // for bounding the size of the alignment, we assume the worst case inputs where we have many pairing checks with + // a single input. A single pairing check input is G1 and G2 element + maxNbPairInputs := src.CsPair.Size()/(nbG1Limbs+nbG2Limbs) + 1 + + createColFnUa := createColFn(comp, NAME_UNALIGNED_PAIR, utils.NextPowerOfTwo(maxNbPairInputs)) + createColFnMl := createColFn(comp, NAME_UNALIGNED_PAIR, utils.NextPowerOfTwo(maxNbPairInputs*nbRowsPerMillerLoop)) + createColFnFe := createColFn(comp, NAME_UNALIGNED_PAIR, utils.NextPowerOfTwo(maxNbPairInputs*nbRowsPerFinalExp)) + ucmd := &unalignedPairData{ + blsPairDataSource: src, + IsActive: createColFnUa("IS_ACTIVE"), + IsFirstLine: createColFnUa("IS_FIRST_LINE"), + IsLastLine: createColFnUa("IS_LAST_LINE"), + IsNotLastLine: createColFnUa("IS_NOT_LAST_LINE"), + GnarkIsActiveMillerLoop: createColFnMl("GNARK_IS_ACTIVE_ML"), + GnarkDataMillerLoop: createColFnMl("GNARK_DATA_ML"), + GnarkIsActiveFinalExp: createColFnFe("GNARK_IS_ACTIVE_FE"), + GnarkDataFinalExp: createColFnFe("GNARK_DATA_FE"), + GnarkIsActiveG1Membership: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("%s_%s", NAME_BLS_PAIR, "GNARK_IS_ACTIVE_G1_MEMBERSHIP"), max(src.SuccessBit.Size(), src.CsG1Membership.Size())), + GnarkIsActiveG2Membership: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("%s_%s", NAME_BLS_PAIR, "GNARK_IS_ACTIVE_G2_MEMBERSHIP"), max(src.SuccessBit.Size(), src.CsG2Membership.Size())), + maxNbPairInputs: maxNbPairInputs, + } + + for i := range ucmd.PointG1 { + ucmd.PointG1[i] = createColFnUa(fmt.Sprintf("POINT_G1_%d", i)) + } + for i := range ucmd.PointG2 { + ucmd.PointG2[i] = createColFnUa(fmt.Sprintf("POINT_G2_%d", i)) + } + for i := range ucmd.PrevAccumulator { + ucmd.PrevAccumulator[i] = createColFnUa(fmt.Sprintf("PREV_ACCUMULATOR_%d", i)) + } + for i := range ucmd.CurrentAccumulator { + ucmd.CurrentAccumulator[i] = createColFnUa(fmt.Sprintf("CURRENT_ACCUMULATOR_%d", i)) + } + for i := range ucmd.ExpectedResult { + ucmd.ExpectedResult[i] = createColFnUa(fmt.Sprintf("EXPECTED_RESULT_%d", i)) + } + + // non-membership input mask + ucmd.csInputMask(comp) + // projection from source to unaligned + ucmd.csProjectionUnaligned(comp) + ucmd.csProjectionGnarkDataMillerLoop(comp) + ucmd.csProjectionGnarkDataFinalExp(comp) + // first line is correct + ucmd.csAccumulatorInit(comp) + // accumulator consistency + ucmd.csAccumulatorConsistency(comp) + + return ucmd +} + +func (d *unalignedPairData) csInputMask(comp *wizard.CompiledIOP) { + // assert that the GnarkIsActiveG1Membership and GnarkIsActiveG2Membership + // are set correctly. We only call the subgroup membership for + // non-membership checks (all membership checks are done inside Miller + // Loop/final exp circuits). Thus it is: + // GnarkIsActiveG?Membership = CsG?Membership AND !SuccessBit + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_G1_MEMBERSHIP_AND_UNSUCCESSFUL", NAME_UNALIGNED_PAIR), + sym.Sub( + d.GnarkIsActiveG1Membership, + sym.Mul( + d.CsG1Membership, + sym.Sub(1, d.SuccessBit), + ), + ), + ) + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_G2_MEMBERSHIP_AND_UNSUCCESSFUL", NAME_UNALIGNED_PAIR), + sym.Sub( + d.GnarkIsActiveG2Membership, + sym.Mul( + d.CsG2Membership, + sym.Sub(1, d.SuccessBit), + ), + ), + ) +} + +func (d *unalignedPairData) csProjectionUnaligned(comp *wizard.CompiledIOP) { + filtersB := make([]ifaces.Column, nbG1Limbs+nbG2Limbs+2) + columnsB := make([][]ifaces.Column, nbG1Limbs+nbG2Limbs+2) + for i := range nbG1Limbs { + filtersB[i] = d.IsActive + columnsB[i] = []ifaces.Column{d.PointG1[i]} + } + for i := range nbG2Limbs { + filtersB[nbG1Limbs+i] = d.IsActive + columnsB[nbG1Limbs+i] = []ifaces.Column{d.PointG2[i]} + } + for i := range 2 { + filtersB[nbG1Limbs+nbG2Limbs+i] = d.IsLastLine + columnsB[nbG1Limbs+nbG2Limbs+i] = []ifaces.Column{d.ExpectedResult[i]} + } + prj := query.ProjectionMultiAryInput{ + FiltersA: []ifaces.Column{d.SuccessBit}, + FiltersB: filtersB, + ColumnsA: [][]ifaces.Column{{d.blsPairDataSource.Limb}}, + ColumnsB: columnsB, + } + comp.InsertProjection(ifaces.QueryIDf("%s_PROJECTION_DATA", NAME_UNALIGNED_PAIR), prj) +} + +func (d *unalignedPairData) csProjectionGnarkDataMillerLoop(comp *wizard.CompiledIOP) { + // we map everything except the last input to the Miller loop circuit. We + // need to constrain the mask + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_NOT_LAST_LINE", NAME_UNALIGNED_PAIR), + sym.Mul( + d.IsActive, + sym.Sub(1, d.IsLastLine, d.IsNotLastLine)), + ) + + filtersA := make([]ifaces.Column, nbG1Limbs+nbG2Limbs+2*nbGtLimbs) + columnsA := make([][]ifaces.Column, nbG1Limbs+nbG2Limbs+2*nbGtLimbs) + for i := range nbGtLimbs { + filtersA[i] = d.IsNotLastLine + columnsA[i] = []ifaces.Column{d.PrevAccumulator[i]} + } + for i := range nbG1Limbs { + filtersA[nbGtLimbs+i] = d.IsNotLastLine + columnsA[nbGtLimbs+i] = []ifaces.Column{d.PointG1[i]} + } + for i := range nbG2Limbs { + filtersA[nbGtLimbs+nbG1Limbs+i] = d.IsNotLastLine + columnsA[nbGtLimbs+nbG1Limbs+i] = []ifaces.Column{d.PointG2[i]} + } + for i := range nbGtLimbs { + filtersA[nbGtLimbs+nbG1Limbs+nbG2Limbs+i] = d.IsNotLastLine + columnsA[nbGtLimbs+nbG1Limbs+nbG2Limbs+i] = []ifaces.Column{d.CurrentAccumulator[i]} + } + prj := query.ProjectionMultiAryInput{ + FiltersA: filtersA, + FiltersB: []ifaces.Column{d.GnarkIsActiveMillerLoop}, + ColumnsA: columnsA, + ColumnsB: [][]ifaces.Column{{d.GnarkDataMillerLoop}}, + } + comp.InsertProjection(ifaces.QueryIDf("%s_PROJECTION_ML_DATA", NAME_UNALIGNED_PAIR), prj) +} + +func (d *unalignedPairData) csProjectionGnarkDataFinalExp(comp *wizard.CompiledIOP) { + filtersA := make([]ifaces.Column, nbGtLimbs+nbG1Limbs+nbG2Limbs+2) + columnsA := make([][]ifaces.Column, nbGtLimbs+nbG1Limbs+nbG2Limbs+2) + for i := range nbGtLimbs { + filtersA[i] = d.IsLastLine + columnsA[i] = []ifaces.Column{d.PrevAccumulator[i]} + } + for i := range nbG1Limbs { + filtersA[nbGtLimbs+i] = d.IsLastLine + columnsA[nbGtLimbs+i] = []ifaces.Column{d.PointG1[i]} + } + for i := range nbG2Limbs { + filtersA[nbGtLimbs+nbG1Limbs+i] = d.IsLastLine + columnsA[nbGtLimbs+nbG1Limbs+i] = []ifaces.Column{d.PointG2[i]} + } + for i := range 2 { + filtersA[nbGtLimbs+nbG1Limbs+nbG2Limbs+i] = d.IsLastLine + columnsA[nbGtLimbs+nbG1Limbs+nbG2Limbs+i] = []ifaces.Column{d.ExpectedResult[i]} + } + prj := query.ProjectionMultiAryInput{ + FiltersA: filtersA, + FiltersB: []ifaces.Column{d.GnarkIsActiveFinalExp}, + ColumnsA: columnsA, + ColumnsB: [][]ifaces.Column{{d.GnarkDataFinalExp}}, + } + comp.InsertProjection(ifaces.QueryIDf("%s_PROJECTION_FE_DATA", NAME_UNALIGNED_PAIR), prj) +} + +func (d *unalignedPairData) csAccumulatorInit(comp *wizard.CompiledIOP) { + // ensures that the first line accumulator is zero in Gt + for i := range nbGtLimbs { + if i == 3 { + // the first line accumulator is zero in Gt + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_ACCUMULATOR_INIT_%d_ONE", NAME_UNALIGNED_PAIR, i), + sym.Mul(sym.Sub(1, d.PrevAccumulator[i]), d.IsFirstLine)) + } else { + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_ACCUMULATOR_INIT_%d_ZERO", NAME_UNALIGNED_PAIR, i), + sym.Mul(d.PrevAccumulator[i], d.IsFirstLine)) + } + } +} + +func (d *unalignedPairData) csAccumulatorConsistency(comp *wizard.CompiledIOP) { + // ensure that the current accumulator is equal to the next accumulator on previous line. + // we need to cancel out if current line is the first line where the current accumulator is zero + // (checked in [unalignedPairData.csAccumulatorInit]) + for i := range nbGtLimbs { + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_ACCUMULATOR_CONSISTENCY_%d", NAME_UNALIGNED_PAIR, i), + sym.Mul( + d.IsActive, + sym.Sub(1, d.IsFirstLine), + sym.Sub(d.PrevAccumulator[i], column.Shift(d.CurrentAccumulator[i], -1)), + ), + ) + } +} + +func (d *unalignedPairData) Assign(run *wizard.ProverRuntime) { + d.assignMembershipMask(run) + d.assignUnaligned(run) + d.assignGnarkData(run) +} + +func (d *unalignedPairData) assignMembershipMask(run *wizard.ProverRuntime) { + // assigns the masks (CS_G1_MEMBERSHIP AND !SUCCESS_BIT) and + // (CS_G2_MEMBERSHIP AND !SUCCESS_BIT) columns which are used for filtering + // the inputs going to group non-membership circuit. + var ( + srcCsG1Membership = d.CsG1Membership.GetColAssignment(run).IntoRegVecSaveAlloc() + srcCsG2Membership = d.CsG2Membership.GetColAssignment(run).IntoRegVecSaveAlloc() + srcSuccessBit = d.SuccessBit.GetColAssignment(run).IntoRegVecSaveAlloc() + ) + + var ( + dstG1Membership = common.NewVectorBuilder(d.GnarkIsActiveG1Membership) + dstG2Membership = common.NewVectorBuilder(d.GnarkIsActiveG2Membership) + ) + + for i := range srcCsG1Membership { + dstG1Membership.PushBoolean(srcCsG1Membership[i].IsOne() && srcSuccessBit[i].IsZero()) + } + for i := range srcCsG2Membership { + dstG2Membership.PushBoolean(srcCsG2Membership[i].IsOne() && srcSuccessBit[i].IsZero()) + } + + dstG1Membership.PadAndAssign(run, field.Zero()) + dstG2Membership.PadAndAssign(run, field.Zero()) +} + +func (d *unalignedPairData) assignUnaligned(run *wizard.ProverRuntime) { + var ( + srcID = d.ID.GetColAssignment(run).IntoRegVecSaveAlloc() + srcSuccessBit = d.SuccessBit.GetColAssignment(run).IntoRegVecSaveAlloc() + srcLimb = d.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIndex = d.Index.GetColAssignment(run).IntoRegVecSaveAlloc() + srcCounter = d.Counter.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsData = d.IsData.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsRes = d.IsRes.GetColAssignment(run).IntoRegVecSaveAlloc() + ) + + var ( + dstIsActive = common.NewVectorBuilder(d.IsActive) + dstIsFirstLine = common.NewVectorBuilder(d.IsFirstLine) + dstIsLastLine = common.NewVectorBuilder(d.IsLastLine) + dstIsNotLastLine = common.NewVectorBuilder(d.IsNotLastLine) + ) + + var dstPointG1 [nbG1Limbs]*common.VectorBuilder + var dstPointG2 [nbG2Limbs]*common.VectorBuilder + var dstPrevAccumulator [nbGtLimbs]*common.VectorBuilder + var dstCurrentAccumulator [nbGtLimbs]*common.VectorBuilder + var dstExpectedResult [2]*common.VectorBuilder + + for i := range d.PointG1 { + dstPointG1[i] = common.NewVectorBuilder(d.PointG1[i]) + } + for i := range d.PointG2 { + dstPointG2[i] = common.NewVectorBuilder(d.PointG2[i]) + } + for i := range d.PrevAccumulator { + dstPrevAccumulator[i] = common.NewVectorBuilder(d.PrevAccumulator[i]) + } + for i := range d.CurrentAccumulator { + dstCurrentAccumulator[i] = common.NewVectorBuilder(d.CurrentAccumulator[i]) + } + for i := range d.ExpectedResult { + dstExpectedResult[i] = common.NewVectorBuilder(d.ExpectedResult[i]) + } + + var ptr int + + for ptr < len(srcLimb) { + // we detect if we're in a new pairing check instance + if !(srcIsData[ptr].IsOne() && srcIndex[ptr].IsZero() && srcCounter[ptr].IsZero()) { + ptr++ + continue + } + // the inputs which go to the pairing circuit are: + // - valid nontrivial input (cs_pairing_check = 1) + // - valid half-trivial ((0,Q) or (P,0)) input (cs_pairing_check = 0 and cs_gN_membership = 1 and success_bit = 1) + // - valid trivial input (0,0) (cs_pairing_check=0, cs_gn_membership=0, success_bit = 1) + // in contrast, the inputs which go to the group membership circuit are: + // - invalid nontrivial input (cs_gN_membership = 1 and success_bit = 0) + // + // now, we don't do anything with the inputs going to the group + // membership circuits, they are passed directly to the gnark circuit. From the above it implies that we send all + // inputs with success_bit = 1 to here. + + // get the current ID to know when to stop + currentID := srcID[ptr] + // pair input index + idx := 0 + // we initialize the current accumulator to zero + prevAccumulator := nativeGtZero() + var currentAccumulator []field.Element + for ptr < len(srcID) && srcID[ptr].Equal(¤tID) { + // if we have success_bit = 0, then we advance the pointer to the + // next input. But we need to move the pointer according to if we + // are in data or result part. + if srcSuccessBit[ptr].IsZero() { + switch { + case srcIsData[ptr].IsOne(): + ptr += nbG1Limbs + nbG2Limbs + case srcIsRes[ptr].IsOne(): + ptr += 2 + default: + // otherwise, its not a given pairing instance. The input + // should have ended, but we scan through just in case. + ptr++ + } + continue + } + // now, the success_bit is 1. If we are in the data part, then we copy the point limbs, + // otherwise we copy the expected result limbs. + if srcIsData[ptr].IsOne() { + for i := range nbG1Limbs { + dstPointG1[i].PushField(srcLimb[ptr+i]) + } + for i := range nbG2Limbs { + dstPointG2[i].PushField(srcLimb[ptr+nbG1Limbs+i]) + } + dstIsLastLine.PushZero() + dstIsNotLastLine.PushOne() + // compute the next accumulator + currentAccumulator = nativeMillerLoopAndSum(prevAccumulator, srcLimb[ptr:ptr+nbG1Limbs], srcLimb[ptr+nbG1Limbs:ptr+nbG1Limbs+nbG2Limbs]) + // copy the accumulator limbs + for i := range nbGtLimbs { + dstPrevAccumulator[i].PushField(prevAccumulator[i]) + dstCurrentAccumulator[i].PushField(currentAccumulator[i]) + } + prevAccumulator = currentAccumulator + for i := range 2 { + dstExpectedResult[i].PushZero() + } + dstIsActive.PushOne() + if idx == 0 { + dstIsFirstLine.PushOne() + } else { + dstIsFirstLine.PushZero() + } + idx++ + ptr += nbG1Limbs + nbG2Limbs + } else if srcIsRes[ptr].IsOne() { + // we are in the result part. However, we don't add new line but reuse the last last line. + // thus we need to pop the data before pushing the expected result limbs. + dstIsLastLine.Pop() + dstIsLastLine.PushOne() + dstIsNotLastLine.Pop() + dstIsNotLastLine.PushZero() + for i := range 2 { + dstExpectedResult[i].Pop() + dstExpectedResult[i].PushField(srcLimb[ptr+i]) + } + // additionally, we have pushed the current accumulator in the data part, but we don't need it here. So we pop it. + for i := range nbGtLimbs { + dstCurrentAccumulator[i].Pop() + dstCurrentAccumulator[i].PushZero() + } + ptr += 2 + } + } + } + dstIsActive.PadAndAssign(run, field.Zero()) + dstIsFirstLine.PadAndAssign(run, field.Zero()) + dstIsLastLine.PadAndAssign(run, field.Zero()) + dstIsNotLastLine.PadAndAssign(run, field.Zero()) + for i := range d.PointG1 { + dstPointG1[i].PadAndAssign(run, field.Zero()) + } + for i := range d.PointG2 { + dstPointG2[i].PadAndAssign(run, field.Zero()) + } + for i := range d.PrevAccumulator { + dstPrevAccumulator[i].PadAndAssign(run, field.Zero()) + } + for i := range d.CurrentAccumulator { + dstCurrentAccumulator[i].PadAndAssign(run, field.Zero()) + } + for i := range d.ExpectedResult { + dstExpectedResult[i].PadAndAssign(run, field.Zero()) + } +} + +func (d *unalignedPairData) assignGnarkData(run *wizard.ProverRuntime) { + var ( + srcIsActive = d.IsActive.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsLastLine = d.IsLastLine.GetColAssignment(run).IntoRegVecSaveAlloc() + srcPointG1 = make([][]field.Element, nbG1Limbs) + srcPointG2 = make([][]field.Element, nbG2Limbs) + srcPrev = make([][]field.Element, nbGtLimbs) + srcCurrent = make([][]field.Element, nbGtLimbs) + srcExpected = make([][]field.Element, 2) + ) + + for i := range nbG1Limbs { + srcPointG1[i] = d.PointG1[i].GetColAssignment(run).IntoRegVecSaveAlloc() + } + for i := range nbG2Limbs { + srcPointG2[i] = d.PointG2[i].GetColAssignment(run).IntoRegVecSaveAlloc() + } + for i := range nbGtLimbs { + srcPrev[i] = d.PrevAccumulator[i].GetColAssignment(run).IntoRegVecSaveAlloc() + srcCurrent[i] = d.CurrentAccumulator[i].GetColAssignment(run).IntoRegVecSaveAlloc() + } + for i := range 2 { + srcExpected[i] = d.ExpectedResult[i].GetColAssignment(run).IntoRegVecSaveAlloc() + } + + var ( + dstGnarkIsActiveMillerLoop = common.NewVectorBuilder(d.GnarkIsActiveMillerLoop) + dstGnarkDataMillerLoop = common.NewVectorBuilder(d.GnarkDataMillerLoop) + dstGnarkIsActiveFinalExp = common.NewVectorBuilder(d.GnarkIsActiveFinalExp) + dstGnarkDataFinalExp = common.NewVectorBuilder(d.GnarkDataFinalExp) + ) + + for i := range srcIsActive { + if !srcIsActive[i].IsOne() { + continue + } + if srcIsLastLine[i].IsZero() { + // we need to pass data to the Miller loop circuit + for j := range nbGtLimbs { + dstGnarkDataMillerLoop.PushField(srcPrev[j][i]) + dstGnarkIsActiveMillerLoop.PushOne() + } + for j := range nbG1Limbs { + dstGnarkDataMillerLoop.PushField(srcPointG1[j][i]) + dstGnarkIsActiveMillerLoop.PushOne() + } + for j := range nbG2Limbs { + dstGnarkDataMillerLoop.PushField(srcPointG2[j][i]) + dstGnarkIsActiveMillerLoop.PushOne() + } + for j := range nbGtLimbs { + dstGnarkDataMillerLoop.PushField(srcCurrent[j][i]) + dstGnarkIsActiveMillerLoop.PushOne() + } + } else { + // we need to pass data to the final exponentiation circuit + for j := range nbGtLimbs { + dstGnarkDataFinalExp.PushField(srcPrev[j][i]) + dstGnarkIsActiveFinalExp.PushOne() + } + for j := range nbG1Limbs { + dstGnarkDataFinalExp.PushField(srcPointG1[j][i]) + dstGnarkIsActiveFinalExp.PushOne() + } + for j := range nbG2Limbs { + dstGnarkDataFinalExp.PushField(srcPointG2[j][i]) + dstGnarkIsActiveFinalExp.PushOne() + } + for j := range 2 { + dstGnarkDataFinalExp.PushField(srcExpected[j][i]) + dstGnarkIsActiveFinalExp.PushOne() + } + } + } + + dstGnarkIsActiveMillerLoop.PadAndAssign(run, field.Zero()) + dstGnarkDataMillerLoop.PadAndAssign(run, field.Zero()) + dstGnarkIsActiveFinalExp.PadAndAssign(run, field.Zero()) + dstGnarkDataFinalExp.PadAndAssign(run, field.Zero()) +} diff --git a/prover/zkevm/prover/bls/module_pair_test.go b/prover/zkevm/prover/bls/module_pair_test.go new file mode 100644 index 0000000000..fb0f777bc7 --- /dev/null +++ b/prover/zkevm/prover/bls/module_pair_test.go @@ -0,0 +1,90 @@ +package bls + +import ( + "os" + "path/filepath" + "testing" + + "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/utils/csvtraces" +) + +func testBlsPair(t *testing.T, withCircuit bool) { + limits := &Limits{ + NbMillerLoopInputInstances: 4, + NbFinalExpInputInstances: 4, + NbG1MembershipInputInstances: 4, + NbG2MembershipInputInstances: 4, + } + files, err := filepath.Glob("testdata/bls_pairing_inputs-[0-9]*.csv") + if err != nil { + t.Fatal(err) + } + switch len(files) { + case 0: + t.Fatal("no csv files found, please run `go generate` to generate the test data") + case 1: + t.Log("single CSV file found. For complete testing, generate all test files with `go generate`") + } + // we test all files found + var cmp *wizard.CompiledIOP + var blsPair *BlsPair + for _, file := range files { + t.Run(file, func(t *testing.T) { + f, err := os.Open(file) + if err != nil { + t.Fatal(err) + } + defer f.Close() + ct, err := csvtraces.NewCsvTrace(f) + if err != nil { + t.Fatal("failed to create csv trace", err) + } + if cmp == nil { + cmp = wizard.Compile( + func(b *wizard.Builder) { + blsPairSource := &blsPairDataSource{ + ID: ct.GetCommit(b, "ID"), + CsPair: ct.GetCommit(b, "CS_PAIRING_CHECK"), + CsG1Membership: ct.GetCommit(b, "CS_G1_MEMBERSHIP"), + CsG2Membership: ct.GetCommit(b, "CS_G2_MEMBERSHIP"), + Limb: ct.GetCommit(b, "LIMB"), + Index: ct.GetCommit(b, "INDEX"), + Counter: ct.GetCommit(b, "CT"), + IsData: ct.GetCommit(b, "DATA_PAIRING_CHECK"), + IsRes: ct.GetCommit(b, "RSLT_PAIRING_CHECK"), + SuccessBit: ct.GetCommit(b, "SUCCESS_BIT"), + } + blsPair = newPair(b.CompiledIOP, limits, blsPairSource) + if withCircuit { + blsPair = blsPair. + WithG1MembershipCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)). + WithG2MembershipCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)). + WithPairingCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)) + } + }, + dummy.Compile, + ) + } + proof := wizard.Prove(cmp, + func(run *wizard.ProverRuntime) { + ct.Assign(run, "ID", "CS_PAIRING_CHECK", "CS_G1_MEMBERSHIP", "CS_G2_MEMBERSHIP", "LIMB", "INDEX", "CT", "DATA_PAIRING_CHECK", "RSLT_PAIRING_CHECK", "SUCCESS_BIT") + blsPair.Assign(run) + }) + if err := wizard.Verify(cmp, proof); err != nil { + t.Fatal("proof failed", err) + } + t.Log("proof succeeded") + }) + } +} + +func TestBlsPairNoCircuit(t *testing.T) { + testBlsPair(t, false) +} + +func TestBlsPairWithCircuit(t *testing.T) { + testBlsPair(t, true) +} diff --git a/prover/zkevm/prover/bls/module_pointeval.go b/prover/zkevm/prover/bls/module_pointeval.go new file mode 100644 index 0000000000..93d85c09da --- /dev/null +++ b/prover/zkevm/prover/bls/module_pointeval.go @@ -0,0 +1,97 @@ +package bls + +import ( + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" +) + +const ( + NAME_BLS_POINTEVAL = "BLS_POINTEVAL" +) + +type blsPointEvalDataSource struct { + ID ifaces.Column + CsPointEval ifaces.Column + CsPointEvalInvalid ifaces.Column + Limb ifaces.Column + Index ifaces.Column + Counter ifaces.Column + IsData ifaces.Column + IsRes ifaces.Column +} + +func newPointEvalDataSource(comp *wizard.CompiledIOP) *blsPointEvalDataSource { + return &blsPointEvalDataSource{ + ID: comp.Columns.GetHandle(colNameFn("ID")), + CsPointEval: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_POINT_EVALUATION")), + CsPointEvalInvalid: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_POINT_EVALUATION_FAILURE")), + Limb: comp.Columns.GetHandle(colNameFn("LIMB")), + Index: comp.Columns.GetHandle(colNameFn("INDEX")), + Counter: comp.Columns.GetHandle(colNameFn("CT")), + IsData: comp.Columns.GetHandle(colNameFn("DATA_POINT_EVALUATION_FLAG")), + IsRes: comp.Columns.GetHandle(colNameFn("RSLT_POINT_EVALUATION_FLAG")), + } +} + +type BlsPointEval struct { + *blsPointEvalDataSource + alignedGnarkData *plonk.Alignment + alignedFailureGnarkData *plonk.Alignment + *Limits +} + +func newPointEval(_ *wizard.CompiledIOP, limits *Limits, src *blsPointEvalDataSource) *BlsPointEval { + res := &BlsPointEval{ + blsPointEvalDataSource: src, + Limits: limits, + } + return res +} + +func (bp *BlsPointEval) WithPointEvalCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsPointEval { + // the gnark circuit takes exactly the same rows as provided by the arithmetization. So + // to get the bound on the number of circuits we just need to divide by the size of the + // addition circuit input instances + maxNbInstances := bp.blsPointEvalDataSource.CsPointEval.Size() / nbRowsPerPointEval + maxNbCircuits := maxNbInstances/bp.Limits.NbPointEvalInputInstances + 1 + toAlign := &plonk.CircuitAlignmentInput{ + Name: NAME_BLS_POINTEVAL, + Round: ROUND_NR, + DataToCircuitMask: bp.blsPointEvalDataSource.CsPointEval, + DataToCircuit: bp.blsPointEvalDataSource.Limb, + Circuit: newMultiPointEvalCircuit(bp.Limits), + NbCircuitInstances: maxNbCircuits, + InputFillerKey: pointEvalInputFillerKey, + PlonkOptions: options, + } + bp.alignedGnarkData = plonk.DefineAlignment(comp, toAlign) + return bp +} + +func (bp *BlsPointEval) WithPointEvalFailureCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsPointEval { + maxNbInstances := bp.blsPointEvalDataSource.CsPointEvalInvalid.Size() / nbRowsPerPointEval + maxNbCircuits := maxNbInstances/bp.Limits.NbPointEvalFailureInputInstances + 1 + toAlign := &plonk.CircuitAlignmentInput{ + Name: NAME_BLS_POINTEVAL + "_FAILURE", + Round: ROUND_NR, + DataToCircuitMask: bp.blsPointEvalDataSource.CsPointEvalInvalid, + DataToCircuit: bp.blsPointEvalDataSource.Limb, + Circuit: newMultiPointEvalFailureCircuit(bp.Limits), + NbCircuitInstances: maxNbCircuits, + InputFillerKey: pointEvalFailureInputFillerKey, + PlonkOptions: options, + } + bp.alignedFailureGnarkData = plonk.DefineAlignment(comp, toAlign) + return bp +} + +func (bp *BlsPointEval) Assign(run *wizard.ProverRuntime) { + if bp.alignedGnarkData != nil { + bp.alignedGnarkData.Assign(run) + } + if bp.alignedFailureGnarkData != nil { + bp.alignedFailureGnarkData.Assign(run) + } +} diff --git a/prover/zkevm/prover/bls/module_pointeval_test.go b/prover/zkevm/prover/bls/module_pointeval_test.go new file mode 100644 index 0000000000..d7871887b2 --- /dev/null +++ b/prover/zkevm/prover/bls/module_pointeval_test.go @@ -0,0 +1,86 @@ +package bls + +import ( + "os" + "path/filepath" + "testing" + + "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/utils/csvtraces" +) + +func testPointEval(t *testing.T, withCircuit bool) { + limits := &Limits{ + NbPointEvalInputInstances: 2, + NbPointEvalFailureInputInstances: 2, + } + files, err := filepath.Glob("testdata/bls_pointeval_inputs-[0-9]*.csv") + if err != nil { + t.Fatal(err) + } + switch len(files) { + case 0: + t.Fatal("no csv files found, please run `go generate` to generate the test data") + case 1: + t.Log("single CSV file found. For complete testing, generate all test files with `go generate`") + } + // we test all files found + var cmp *wizard.CompiledIOP + var bp *BlsPointEval + for _, file := range files { + t.Run(file, func(t *testing.T) { + f, err := os.Open(file) + if err != nil { + t.Fatal(err) + } + defer f.Close() + ct, err := csvtraces.NewCsvTrace(f) + if err != nil { + t.Fatal("failed to create csv trace", err) + } + if cmp == nil { + cmp = wizard.Compile( + func(b *wizard.Builder) { + pointEvalSource := &blsPointEvalDataSource{ + ID: ct.GetCommit(b, "ID"), + CsPointEval: ct.GetCommit(b, "CIRCUIT_SELECTOR_POINT_EVALUATION"), + CsPointEvalInvalid: ct.GetCommit(b, "CIRCUIT_SELECTOR_POINT_EVALUATION_FAILURE"), + Limb: ct.GetCommit(b, "LIMB"), + Index: ct.GetCommit(b, "INDEX"), + Counter: ct.GetCommit(b, "CT"), + IsData: ct.GetCommit(b, "DATA_POINT_EVALUATION"), + IsRes: ct.GetCommit(b, "RSLT_POINT_EVALUATION"), + } + bp = newPointEval(b.CompiledIOP, limits, pointEvalSource) + if withCircuit { + bp = bp.WithPointEvalCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)) + bp = bp.WithPointEvalFailureCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)) + } + }, + dummy.Compile, + ) + } + + proof := wizard.Prove(cmp, + func(run *wizard.ProverRuntime) { + ct.Assign(run, "ID", "CIRCUIT_SELECTOR_POINT_EVALUATION", "CIRCUIT_SELECTOR_POINT_EVALUATION_FAILURE", "INDEX", "CT", "LIMB", "DATA_POINT_EVALUATION", "RSLT_POINT_EVALUATION") + bp.Assign(run) + }) + + if err := wizard.Verify(cmp, proof); err != nil { + t.Fatal("proof failed", err) + } + t.Log("proof succeeded") + }) + } +} + +func TestPointEvalNoCircuit(t *testing.T) { + testPointEval(t, false) +} + +func TestPointEvalWithCircuit(t *testing.T) { + testPointEval(t, true) +} diff --git a/prover/zkevm/prover/bls/native_ops.go b/prover/zkevm/prover/bls/native_ops.go new file mode 100644 index 0000000000..be05c9b932 --- /dev/null +++ b/prover/zkevm/prover/bls/native_ops.go @@ -0,0 +1,166 @@ +package bls + +import ( + "fmt" + "math/big" + + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" + "github.com/consensys/gnark-crypto/ecc/bls12-381/fp" + "github.com/consensys/linea-monorepo/prover/maths/field" +) + +func set(nbL int, q *fp.Element, limbs []field.Element) { + var buf []byte + for i := range nbL - 1 { + lbts := limbs[i+1].Bytes() + buf = append(buf, lbts[nbBytes:]...) + } + q.SetBytes(buf) +} + +func nativeScalarMulAndSum(g group, currentAccumulator []field.Element, point []field.Element, scalar []field.Element) (nextAccumulator []field.Element) { + nbL := nbLimbs(g) + if len(scalar) != nbFrLimbs { + panic(fmt.Sprintf("scalar must have exactly %d limbs, got %d", nbFrLimbs, len(scalar))) + } + if len(currentAccumulator) != nbL { + panic(fmt.Sprintf("currentAccumulator must have exactly %d limbs, got %d", nbL, len(currentAccumulator))) + } + if len(point) != nbL { + panic(fmt.Sprintf("point must have exactly %d limbs, got %d", nbL, len(point))) + } + var buf []byte + for i := range nbFrLimbs { + lbts := scalar[i].Bytes() + buf = append(buf, lbts[nbBytes:]...) + } + s := new(big.Int).SetBytes(buf) + + switch g { + case G1: + var C, P, N bls12381.G1Affine + set(nbL/2, &P.X, point[:nbL/2]) + set(nbL/2, &P.Y, point[nbL/2:]) + set(nbL/2, &C.X, currentAccumulator[:nbL/2]) + set(nbL/2, &C.Y, currentAccumulator[nbL/2:]) + N.ScalarMultiplication(&P, s) + N.Add(&C, &N) + NXBytes := N.X.Bytes() + NYBytes := N.Y.Bytes() + nextAccumulator = make([]field.Element, nbL) + nextAccumulator[0].SetZero() + nextAccumulator[nbL/2].SetZero() + for i := range nbL/2 - 1 { + nextAccumulator[i+1].SetBytes(NXBytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+nbL/2].SetBytes(NYBytes[i*nbBytes : (i+1)*nbBytes]) + } + case G2: + var C, P, N bls12381.G2Affine + set(nbL/4, &P.X.A0, point[:nbL/4]) + set(nbL/4, &P.X.A1, point[nbL/4:nbL/2]) + set(nbL/4, &P.Y.A0, point[nbL/2:3*nbL/4]) + set(nbL/4, &P.Y.A1, point[3*nbL/4:]) + set(nbL/4, &C.X.A0, currentAccumulator[:nbL/4]) + set(nbL/4, &C.X.A1, currentAccumulator[nbL/4:nbL/2]) + set(nbL/4, &C.Y.A0, currentAccumulator[nbL/2:3*nbL/4]) + set(nbL/4, &C.Y.A1, currentAccumulator[3*nbL/4:]) + N.ScalarMultiplication(&P, s) + N.Add(&C, &N) + NXA0Bytes := N.X.A0.Bytes() + NXA1Bytes := N.X.A1.Bytes() + NYA0Bytes := N.Y.A0.Bytes() + NYA1Bytes := N.Y.A1.Bytes() + nextAccumulator = make([]field.Element, nbL) + nextAccumulator[0].SetZero() + nextAccumulator[nbL/4].SetZero() + nextAccumulator[nbL/2].SetZero() + nextAccumulator[3*nbL/4].SetZero() + for i := range nbL/4 - 1 { + nextAccumulator[i+1].SetBytes(NXA0Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+nbL/4].SetBytes(NXA1Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+nbL/2].SetBytes(NYA0Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+3*nbL/4].SetBytes(NYA1Bytes[i*nbBytes : (i+1)*nbBytes]) + } + } + return nextAccumulator +} + +func nativeGtZero() []field.Element { + // C0.B0.A0 is 1, but its on four limbs MSB, so {0,0,0,1} + // rest are all zeroes. + ret := make([]field.Element, nbGtLimbs) + ret[3].SetOne() + return ret +} + +func nativeMillerLoopAndSum(prevAccumulator []field.Element, pointG1 []field.Element, pointG2 []field.Element) (nextAccumulator []field.Element) { + if len(prevAccumulator) != nbGtLimbs { + panic(fmt.Sprintf("currentAccumulator must have exactly %d limbs, got %d", nbGtLimbs, len(prevAccumulator))) + } + if len(pointG1) != nbG1Limbs { + panic(fmt.Sprintf("pointG1 must have exactly %d limbs, got %d", nbG1Limbs, len(pointG1))) + } + if len(pointG2) != nbG2Limbs { + panic(fmt.Sprintf("pointG2 must have exactly %d limbs, got %d", nbG2Limbs, len(pointG2))) + } + var prev bls12381.GT + var P bls12381.G1Affine + var Q bls12381.G2Affine + set(nbGtLimbs/12, &prev.C0.B0.A0, prevAccumulator[:nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C0.B0.A1, prevAccumulator[nbGtLimbs/12:2*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C0.B1.A0, prevAccumulator[2*nbGtLimbs/12:3*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C0.B1.A1, prevAccumulator[3*nbGtLimbs/12:4*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C0.B2.A0, prevAccumulator[4*nbGtLimbs/12:5*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C0.B2.A1, prevAccumulator[5*nbGtLimbs/12:6*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C1.B0.A0, prevAccumulator[6*nbGtLimbs/12:7*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C1.B0.A1, prevAccumulator[7*nbGtLimbs/12:8*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C1.B1.A0, prevAccumulator[8*nbGtLimbs/12:9*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C1.B1.A1, prevAccumulator[9*nbGtLimbs/12:10*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C1.B2.A0, prevAccumulator[10*nbGtLimbs/12:11*nbGtLimbs/12]) + set(nbGtLimbs/12, &prev.C1.B2.A1, prevAccumulator[11*nbGtLimbs/12:]) + set(nbG1Limbs/2, &P.X, pointG1[:nbG1Limbs/2]) + set(nbG1Limbs/2, &P.Y, pointG1[nbG1Limbs/2:]) + set(nbG2Limbs/4, &Q.X.A0, pointG2[:nbG2Limbs/4]) + set(nbG2Limbs/4, &Q.X.A1, pointG2[nbG2Limbs/4:nbG2Limbs/2]) + set(nbG2Limbs/4, &Q.Y.A0, pointG2[nbG2Limbs/2:3*nbG2Limbs/4]) + set(nbG2Limbs/4, &Q.Y.A1, pointG2[3*nbG2Limbs/4:]) + var next bls12381.GT + lines := bls12381.PrecomputeLines(Q) + mlres, err := bls12381.MillerLoopFixedQ( + []bls12381.G1Affine{P}, + [][2][len(bls12381.LoopCounter) - 1]bls12381.LineEvaluationAff{lines}) + if err != nil { + panic(fmt.Sprintf("failed to compute miller loop: %v", err)) + } + mlres.Conjugate(&mlres) + next.Mul(&prev, &mlres) + + nextAccumulator = make([]field.Element, nbGtLimbs) + for i := range nbGtLimbs/12 - 1 { + C0B0A0Bytes := next.C0.B0.A0.Bytes() + C0B0A1Bytes := next.C0.B0.A1.Bytes() + C0B1A0Bytes := next.C0.B1.A0.Bytes() + C0B1A1Bytes := next.C0.B1.A1.Bytes() + C0B2A0Bytes := next.C0.B2.A0.Bytes() + C0B2A1Bytes := next.C0.B2.A1.Bytes() + C1B0A0Bytes := next.C1.B0.A0.Bytes() + C1B0A1Bytes := next.C1.B0.A1.Bytes() + C1B1A0Bytes := next.C1.B1.A0.Bytes() + C1B1A1Bytes := next.C1.B1.A1.Bytes() + C1B2A0Bytes := next.C1.B2.A0.Bytes() + C1B2A1Bytes := next.C1.B2.A1.Bytes() + nextAccumulator[i+1].SetBytes(C0B0A0Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+nbGtLimbs/12].SetBytes(C0B0A1Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+2*nbGtLimbs/12].SetBytes(C0B1A0Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+3*nbGtLimbs/12].SetBytes(C0B1A1Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+4*nbGtLimbs/12].SetBytes(C0B2A0Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+5*nbGtLimbs/12].SetBytes(C0B2A1Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+6*nbGtLimbs/12].SetBytes(C1B0A0Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+7*nbGtLimbs/12].SetBytes(C1B0A1Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+8*nbGtLimbs/12].SetBytes(C1B1A0Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+9*nbGtLimbs/12].SetBytes(C1B1A1Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+10*nbGtLimbs/12].SetBytes(C1B2A0Bytes[i*nbBytes : (i+1)*nbBytes]) + nextAccumulator[i+1+11*nbGtLimbs/12].SetBytes(C1B2A1Bytes[i*nbBytes : (i+1)*nbBytes]) + } + return nextAccumulator +} diff --git a/prover/zkevm/prover/bls/testdata/bls_g1_add_inputs.csv b/prover/zkevm/prover/bls/testdata/bls_g1_add_inputs.csv new file mode 100644 index 0000000000..5729e9cdf4 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/bls_g1_add_inputs.csv @@ -0,0 +1,385 @@ +ID,DATA_G1_ADD,RSLT_G1_ADD,INDEX,CT,IS_FIRST_INPUT,IS_SECOND_INPUT,CIRCUIT_SELECTOR_G1_ADD,CIRCUIT_SELECTOR_C1_MEMBERSHIP,LIMB +0,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,10,2,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,11,3,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,12,4,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,13,5,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,14,6,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,15,7,0,1,1,0,0x00000000000000000000000000000000 +0,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +1,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +1,1,0,9,1,0,1,1,0,0x036837665e4416410785af92bb972a31 +1,1,0,10,2,0,1,1,0,0x2cc4fbca68234e552a6f6f3598d814c3 +1,1,0,11,3,0,1,1,0,0x523efb6ae37617f96b2f2b2008ed059e +1,1,0,12,4,0,1,1,0,0x00000000000000000000000000000000 +1,1,0,13,5,0,1,1,0,0x160ee571e89db9929244b3d024955133 +1,1,0,14,6,0,1,1,0,0x02c4e7c20983f131f2a7e3d7007baec4 +1,1,0,15,7,0,1,1,0,0x710d600291bd7a6d50579606827010b5 +1,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +1,0,1,1,1,0,0,1,0,0x036837665e4416410785af92bb972a31 +1,0,1,2,2,0,0,1,0,0x2cc4fbca68234e552a6f6f3598d814c3 +1,0,1,3,3,0,0,1,0,0x523efb6ae37617f96b2f2b2008ed059e +1,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +1,0,1,5,5,0,0,1,0,0x160ee571e89db9929244b3d024955133 +1,0,1,6,6,0,0,1,0,0x02c4e7c20983f131f2a7e3d7007baec4 +1,0,1,7,7,0,0,1,0,0x710d600291bd7a6d50579606827010b5 +2,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +2,1,0,9,1,0,1,1,0,0x03a7ab7827de144d68e94f9befa45853 +2,1,0,10,2,0,1,1,0,0x9df3b1078737a27b168ddc062193a90c +2,1,0,11,3,0,1,1,0,0x1b97a2e1d9da311d2daa3d695d54e29f +2,1,0,12,4,0,1,1,0,0x00000000000000000000000000000000 +2,1,0,13,5,0,1,1,0,0x0b8d9493ebfa5e30df0ffc3ae319bd3e +2,1,0,14,6,0,1,1,0,0xefb2878349b085cd6c69f5de07b6aea6 +2,1,0,15,7,0,1,1,0,0x3933165290d23c2ff14bfc5cda90d686 +2,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,1,1,0,0,1,0,0x03a7ab7827de144d68e94f9befa45853 +2,0,1,2,2,0,0,1,0,0x9df3b1078737a27b168ddc062193a90c +2,0,1,3,3,0,0,1,0,0x1b97a2e1d9da311d2daa3d695d54e29f +2,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,5,5,0,0,1,0,0x0b8d9493ebfa5e30df0ffc3ae319bd3e +2,0,1,6,6,0,0,1,0,0xefb2878349b085cd6c69f5de07b6aea6 +2,0,1,7,7,0,0,1,0,0x3933165290d23c2ff14bfc5cda90d686 +3,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,8,0,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,9,1,0,1,0,1,0x145e060d4f327846bf4df5fa17e0801b +3,1,0,10,2,0,1,0,1,0x10afe37812a4ff5d7b75202783e9cf3f +3,1,0,11,3,0,1,0,1,0x51cb8529f1078c3e4acc5f5c33b66140 +3,1,0,12,4,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,13,5,0,1,0,1,0x010f14f4ef69f618da468cf70be80c2f +3,1,0,14,6,0,1,0,1,0x4e761256c7e762db70959213d0ba32b6 +3,1,0,15,7,0,1,0,1,0x50da203b9e12dc207d2f1f22d88ba10f +3,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +4,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,1,1,1,0,1,0,0x0d811474ee5c4349469db5bc4504464c +4,1,0,2,2,1,0,1,0,0x15ff5fde2d582bd22cb609bcb2f11282 +4,1,0,3,3,1,0,1,0,0x2200a6ba4e5e3eb1c8d33487844631ab +4,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,5,5,1,0,1,0,0x1265e1c0fb6a4e148ce901e7b1226c22 +4,1,0,6,6,1,0,1,0,0x470f2bcdb476d44fe3e79cb864cfa708 +4,1,0,7,7,1,0,1,0,0x6311cccd0372eac0a4713373c7de83e2 +4,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,10,2,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,11,3,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,12,4,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,13,5,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,14,6,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,15,7,0,1,1,0,0x00000000000000000000000000000000 +4,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,1,1,0,0,1,0,0x0d811474ee5c4349469db5bc4504464c +4,0,1,2,2,0,0,1,0,0x15ff5fde2d582bd22cb609bcb2f11282 +4,0,1,3,3,0,0,1,0,0x2200a6ba4e5e3eb1c8d33487844631ab +4,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,5,5,0,0,1,0,0x1265e1c0fb6a4e148ce901e7b1226c22 +4,0,1,6,6,0,0,1,0,0x470f2bcdb476d44fe3e79cb864cfa708 +4,0,1,7,7,0,0,1,0,0x6311cccd0372eac0a4713373c7de83e2 +5,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +5,1,0,1,1,1,0,1,0,0x0c6431ca01cfefea3cf86a889b57816e +5,1,0,2,2,1,0,1,0,0x3e22974c92bf0df84a0ecef5cda3db23 +5,1,0,3,3,1,0,1,0,0xdc41735676ccaac8532431bf42c0c74a +5,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +5,1,0,5,5,1,0,1,0,0x126d24f1a4b94d5fe4e7f60fc81b7f6f +5,1,0,6,6,1,0,1,0,0x5c189bd85613451aca5f0d488b0fa36a +5,1,0,7,7,1,0,1,0,0x2f1c75e48e22d24641f5dc95323223ed +5,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +5,1,0,9,1,0,1,1,0,0x14d20155181d6e87ea2e4774689d2de9 +5,1,0,10,2,0,1,1,0,0x8b3958141b0ab31b191b41818d2f5c5c +5,1,0,11,3,0,1,1,0,0xca0caf54537b104243244f56a4126f83 +5,1,0,12,4,0,1,1,0,0x00000000000000000000000000000000 +5,1,0,13,5,0,1,1,0,0x050c7ff2cdbbc944f6995722d0785aa7 +5,1,0,14,6,0,1,1,0,0xc1f12133ceca9391dd5928daa190578f +5,1,0,15,7,0,1,1,0,0xe34c16d41da2368c7fe35c4811538845 +5,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +5,0,1,1,1,0,0,1,0,0x04fd4643b76442a6aca7f2dfa3111751 +5,0,1,2,2,0,0,1,0,0x32c6d7f89f5cf9358717d46efc81bcce +5,0,1,3,3,0,0,1,0,0x46a9f453587862789aa90645fbf9be31 +5,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +5,0,1,5,5,0,0,1,0,0x0b92a054153fbddd5b82e47117c66864 +5,0,1,6,6,0,0,1,0,0xa904939974540985e2fa7bd62181202c +5,0,1,7,7,0,0,1,0,0xeb6681df0294d816c0fb37b523ac2350 +6,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,1,1,1,0,1,0,0x0fdfb9e1334a56aad6b1994ade6bb18d +6,1,0,2,2,1,0,1,0,0x36c17d36c89cd9c237f7b60e24f481cd +6,1,0,3,3,1,0,1,0,0x0104330539aabd4e4600a4a70f0551c6 +6,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,5,5,1,0,1,0,0x1985ff1cb4ab60e3ffb91add341e7be6 +6,1,0,6,6,1,0,1,0,0x46e50a86571a7c7bd6923702e383aa56 +6,1,0,7,7,1,0,1,0,0x3e54ad74810ad041ecbb2de92285e7b8 +6,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +6,1,0,9,1,0,1,1,0,0x11c3c97730555d212809753ab198fb2f +6,1,0,10,2,0,1,1,0,0x145e8b99b243085376cdedb440995b38 +6,1,0,11,3,0,1,1,0,0x23aee1ab853cf8058003cd5cfa113a15 +6,1,0,12,4,0,1,1,0,0x00000000000000000000000000000000 +6,1,0,13,5,0,1,1,0,0x19f70d29fcb24c655848c7e4e0d747ac +6,1,0,14,6,0,1,1,0,0x1ef21110f6402c3c3b37d278887e4640 +6,1,0,15,7,0,1,1,0,0x24c9686ca97c20044b9872bc81df0d7f +6,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,1,1,0,0,1,0,0x074acb867204e49919c9b0c087013b82 +6,0,1,2,2,0,0,1,0,0xfd4178a7c7e4a0c5ce23d8a0b727c2f1 +6,0,1,3,3,0,0,1,0,0xe2fdea39dfc3bc571f849fd4b77b74c6 +6,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,5,5,0,0,1,0,0x073e9a9fc606a72102fef123bb3fd3bf +6,0,1,6,6,0,0,1,0,0x0dc93ac38a5f38761f5e03e8f3f40824 +6,0,1,7,7,0,0,1,0,0xfb11f56edbf7621a19f241a2b465e38e +7,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +7,1,0,1,1,1,0,0,0,0x01b963864ef95c1201c727c5832efd6c +7,1,0,2,2,1,0,0,0,0x1c75031ee39566d868fe620a11c858ea +7,1,0,3,3,1,0,0,0,0x9f06538def560842e5105215733e2b68 +7,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +7,1,0,5,5,1,0,0,0,0x11b2e82d34e7a223bc9361cb5c75888f +7,1,0,6,6,1,0,0,0,0x7c41ff23112ff2e55f538866221075ba +7,1,0,7,7,1,0,0,0,0xc1331613c8d48339b8383f89c3d61237 +7,1,0,8,0,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,9,1,0,1,0,1,0x171112066489c82e3b367047037d9ecb +7,1,0,10,2,0,1,0,1,0x0ced70f5ba501a194bff7ac8249788c9 +7,1,0,11,3,0,1,0,1,0xd93fd72ef7f8315b40437263e1448baf +7,1,0,12,4,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,13,5,0,1,0,1,0x0e0930918128151dac854d3c6ea05713 +7,1,0,14,6,0,1,0,1,0x6ff7cfd31feaa7af0f9650e376401c4e +7,1,0,15,7,0,1,0,1,0xe0d95e9fb38ed6f2c70a79e246902cc2 +7,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +8,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,1,1,1,0,1,0,0x090c7141dc0e0babfc99d63eed00eb97 +8,1,0,2,2,1,0,1,0,0x9fb6a6fa35c503d106c71d0aacb2fe96 +8,1,0,3,3,1,0,1,0,0x98f35dc8572d694775c4ca607ddaf71d +8,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,5,5,1,0,1,0,0x09b9a73159256ca62516d6496eb2388b +8,1,0,6,6,1,0,1,0,0xddab0b16b08a2904bac50075975d1ff0 +8,1,0,7,7,1,0,1,0,0xf9600ead0b3f06900fca76841fb66afd +8,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,10,2,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,11,3,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,12,4,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,13,5,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,14,6,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,15,7,0,1,1,0,0x00000000000000000000000000000000 +8,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,1,1,0,0,1,0,0x090c7141dc0e0babfc99d63eed00eb97 +8,0,1,2,2,0,0,1,0,0x9fb6a6fa35c503d106c71d0aacb2fe96 +8,0,1,3,3,0,0,1,0,0x98f35dc8572d694775c4ca607ddaf71d +8,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,5,5,0,0,1,0,0x09b9a73159256ca62516d6496eb2388b +8,0,1,6,6,0,0,1,0,0xddab0b16b08a2904bac50075975d1ff0 +8,0,1,7,7,0,0,1,0,0xf9600ead0b3f06900fca76841fb66afd +9,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +9,1,0,1,1,1,0,1,0,0x13cd341075b7db66d74bc71c56c31f35 +9,1,0,2,2,1,0,1,0,0x974a0483f451981cc0f3688368998165 +9,1,0,3,3,1,0,1,0,0xc301e7b9ce0dab57d60a52254ca1182a +9,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +9,1,0,5,5,1,0,1,0,0x0a86d7619f04a2bc5d3e4123b9c70562 +9,1,0,6,6,1,0,1,0,0x43ccfd4f9b0e8d380a5ee27b02d4a95f +9,1,0,7,7,1,0,1,0,0x087d02ce4a7756073a8c7948ae58aae1 +9,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +9,1,0,9,1,0,1,1,0,0x05965c63bd7e5f521d6ba4dd84af8be3 +9,1,0,10,2,0,1,1,0,0xf9b06b294b559a34beacc89e9cb4ffd5 +9,1,0,11,3,0,1,1,0,0x2c2adce2891aaa5ea7f6f9a9422cd6fe +9,1,0,12,4,0,1,1,0,0x00000000000000000000000000000000 +9,1,0,13,5,0,1,1,0,0x0930381cd748e03082322c10fb5613ef +9,1,0,14,6,0,1,1,0,0x1dc08ccc8c5485b81a2fff143bd1b19c +9,1,0,15,7,0,1,1,0,0xb1aa5a9c057ddc0113d8bd75c4093d15 +9,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +9,0,1,1,1,0,0,1,0,0x193f296a1f2f69189e85226fa76fe507 +9,0,1,2,2,0,0,1,0,0x12790abeb83ea430d4f6a5f6c6d3b312 +9,0,1,3,3,0,0,1,0,0xacb01901803b338d13dbf5ad4398421c +9,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +9,0,1,5,5,0,0,1,0,0x01daa30a9ad6e56dd33ebfa41d7937aa +9,0,1,6,6,0,0,1,0,0x4a2ae5657ba5520bbfd0b2f27a06bc70 +9,0,1,7,7,0,0,1,0,0x50b4e7c7235e08b9bf9bd6dd7e7eada9 +10,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,1,1,1,0,1,0,0x0623d49b8b3d52d1d3401240085f5e48 +10,1,0,2,2,1,0,1,0,0x501555f200ca1a8e79517d2120a384fc +10,1,0,3,3,1,0,1,0,0x76760495dbc359615ef43275a18d4579 +10,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,5,5,1,0,1,0,0x19bc5154930b333a4c19a5431b29f678 +10,1,0,6,6,1,0,1,0,0xf861744a1b82ac502a8750a40b1cdabe +10,1,0,7,7,1,0,1,0,0x7220fe22710445745f2256ccab096369 +10,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +10,1,0,9,1,0,1,1,0,0x183b0b3cdf055c1fc514c265cba1e011 +10,1,0,10,2,0,1,1,0,0x8eaa0e0844028e718429a2dd9ea01fb7 +10,1,0,11,3,0,1,1,0,0x245eb958caeec6e586998ad4bffdc438 +10,1,0,12,4,0,1,1,0,0x00000000000000000000000000000000 +10,1,0,13,5,0,1,1,0,0x17d0e39610e18095f4ae0439aeb707de +10,1,0,14,6,0,1,1,0,0xcbc645fbebd31d6059df843dd4936893 +10,1,0,15,7,0,1,1,0,0x919e95f5cd1b48eeffcb16a4dbd3eaa6 +10,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,1,1,0,0,1,0,0x05ae8641447a67d92b366ad9165d6ff9 +10,0,1,2,2,0,0,1,0,0xc5ade813c9c0580b9a0c82dfd0622394 +10,0,1,3,3,0,0,1,0,0xa1d6222c53c566b8df808ba56e0c477b +10,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,5,5,0,0,1,0,0x12bd57829e6ad66fe740dca11484c430 +10,0,1,6,6,0,0,1,0,0x48e71e4db07d6380647e7696c6c64643 +10,0,1,7,7,0,0,1,0,0xb269eef9e75043e8da2f25472a40bc7e +11,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +11,1,0,1,1,1,0,0,0,0x02a4d02e308de407a58de673bdccd2c3 +11,1,0,2,2,1,0,0,0,0xc101ec872b79abcb7321261848adb795 +11,1,0,3,3,1,0,0,0,0x06e855f97081409853244b0895e5b779 +11,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +11,1,0,5,5,1,0,0,0,0x0ee5142c7e1d8b904a306caa9e0a5ee8 +11,1,0,6,6,1,0,0,0,0xa2ce4478f6badc9d838d32325f814be5 +11,1,0,7,7,1,0,0,0,0x1c5e22a1a216bca7191a55188c8d7447 +11,1,0,8,0,0,1,0,1,0x00000000000000000000000000000000 +11,1,0,9,1,0,1,0,1,0x1204a632f5ea22c22945a4679df41a50 +11,1,0,10,2,0,1,0,1,0xd34f8356888f0161e118bd00cc86d374 +11,1,0,11,3,0,1,0,1,0x045eb5269e50cf9f6571fb1e77fb3401 +11,1,0,12,4,0,1,0,1,0x00000000000000000000000000000000 +11,1,0,13,5,0,1,0,1,0x165f264cb074d222806b13e202a1cb89 +11,1,0,14,6,0,1,0,1,0x5df978ec8779b60940bf1d67af1956d0 +11,1,0,15,7,0,1,0,1,0x686525e2cbb7586e40da62fbc7a3c263 +11,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +12,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +12,1,0,1,1,1,0,0,1,0x1668eaa97ed74ad60467e42d306c0fc1 +12,1,0,2,2,1,0,0,1,0x9cc7744744392f6337f978698fe979fd +12,1,0,3,3,1,0,0,1,0x7eb9cd35864bc10b58144d3322852beb +12,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +12,1,0,5,5,1,0,0,1,0x03e3b4463ecb1b56066ec6da78e1a56a +12,1,0,6,6,1,0,0,1,0x944bcb280a2fcfe64d88a882bf81682e +12,1,0,7,7,1,0,0,1,0x144e347f240722dc94b6ede82bac84c4 +12,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,10,2,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,11,3,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,12,4,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,13,5,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,14,6,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,15,7,0,1,0,0,0x00000000000000000000000000000000 +12,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +13,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,1,1,1,0,0,1,0x0dddfaca867ec08ca4b35c0d5ef15d73 +13,1,0,2,2,1,0,0,1,0xcc2c70ed1fa08ad0d55ff6b4f9e75403 +13,1,0,3,3,1,0,0,1,0x90407a32eb329433d7ff1030520256e4 +13,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,5,5,1,0,0,1,0x05895256b02a810063bd2ff2c73fa6af +13,1,0,6,6,1,0,0,1,0x2b5d7f1278a896dc0cac0a5f20346c54 +13,1,0,7,7,1,0,0,1,0x2dd6b297935d2f357c015d4adf179441 +13,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,9,1,0,1,0,0,0x0c63f12dc68e9b6d00c73adc0f33cd25 +13,1,0,10,2,0,1,0,0,0x6c6eb094d9253b078ce8552e87814db9 +13,1,0,11,3,0,1,0,0,0x44e87465b3b4824c4629234a09659b9b +13,1,0,12,4,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,13,5,0,1,0,0,0x114ec1cebb724805330032f828841ea1 +13,1,0,14,6,0,1,0,0,0x8351fcaa8952ce6a020af3cf42b08c98 +13,1,0,15,7,0,1,0,0,0xe95573c31222de13dfeb12595f3e23e5 +13,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +14,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +14,1,0,1,1,1,0,0,1,0x0d42dd429f4c75faa0648c672fd13f10 +14,1,0,2,2,1,0,0,1,0xbcea330c16d31d8f799dbda9bdbe7942 +14,1,0,3,3,1,0,0,1,0xc610fa32e4835eb5fb17b0938ce99834 +14,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +14,1,0,5,5,1,0,0,1,0x168f966a8e53880891d42248bb78fdbc +14,1,0,6,6,1,0,0,1,0x7b9485d82c6879eda12ebfd7039f487b +14,1,0,7,7,1,0,0,1,0xdc2195a6b3d6c1e81a916138393320c4 +14,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +14,1,0,9,1,0,1,0,0,0x10c0f0746f089fb695c7a5bc94be3f0e +14,1,0,10,2,0,1,0,0,0x6ff325d93080be3a9bd23f9831ca3fe0 +14,1,0,11,3,0,1,0,0,0xfbf8cc487aadd0b537dd3bdd5c35ba64 +14,1,0,12,4,0,1,0,0,0x00000000000000000000000000000000 +14,1,0,13,5,0,1,0,0,0x0f07bf10885ef0fc8eb778e1f83b4be7 +14,1,0,14,6,0,1,0,0,0xb854be184d9f49e5d3a297d2beefacbe +14,1,0,15,7,0,1,0,0,0xf72f617974d0f932de76843904651bae +14,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +15,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,1,1,1,0,0,1,0x13a696cee3f737a9209cfc3da50b0ad3 +15,1,0,2,2,1,0,0,1,0x8a3503b0e122436b7b9d9238152b4bd5 +15,1,0,3,3,1,0,0,1,0xd97b3db516caf550abe7e29260079fca +15,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,5,5,1,0,0,1,0x16fc66c4032197933c1d6cb05bbb2695 +15,1,0,6,6,1,0,0,1,0x0467fb6bfbffa68d3243f5223a40830f +15,1,0,7,7,1,0,0,1,0xeb2b267acdf0fba811c16e28a732f6d3 +15,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,9,1,0,1,0,0,0x0643bc4e54b9ba1cec75a0fb1def9281 +15,1,0,10,2,0,1,0,0,0x6bb858f3810a1344ca6039c33339c144 +15,1,0,11,3,0,1,0,0,0xa2a903f8093da8f5d9a1eaf2f3c15024 +15,1,0,12,4,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,13,5,0,1,0,0,0x0ae27a4e68798352f771cae0da9724ad +15,1,0,14,6,0,1,0,0,0x200f139ab67f91a0c195b0dd6a443794 +15,1,0,15,7,0,1,0,0,0x2aff4759951cf2549fd433df5cae3754 +15,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 diff --git a/prover/zkevm/prover/bls/testdata/bls_g1_map_inputs.csv b/prover/zkevm/prover/bls/testdata/bls_g1_map_inputs.csv new file mode 100644 index 0000000000..255200a097 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/bls_g1_map_inputs.csv @@ -0,0 +1,25 @@ +ID,DATA_MAP_FP_TO_G1,RSLT_MAP_FP_TO_G1,INDEX,CT,IS_FIRST_INPUT,IS_SECOND_INPUT,CIRCUIT_SELECTOR_MAP_FP_TO_G1,LIMB +0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +0,1,0,1,1,1,0,1,0x00000000000000000000000000000000 +0,1,0,2,2,1,0,1,0x00000000000000000000000000000000 +0,1,0,3,3,1,0,1,0x00000000000000000000000000000000 +0,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +0,0,1,1,1,0,0,1,0x11a9a0372b8f332d5c30de9ad14e5037 +0,0,1,2,2,0,0,1,0x2a73fa4c45d5f2fa5097f2d6fb93bcac +0,0,1,3,3,0,0,1,0x592f2e1711ac43db0519870c7d0ea415 +0,0,1,4,4,0,0,1,0x00000000000000000000000000000000 +0,0,1,5,5,0,0,1,0x092c0f994164a0719f51c24ba3788de2 +0,0,1,6,6,0,0,1,0x40ff926b55f58c445116e8bc6a47cd63 +0,0,1,7,7,0,0,1,0x392fd4e8e22bdf9feaa96ee773222133 +1,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +1,1,0,1,1,1,0,1,0x047c7bde61af5bfde2e234e99658ff1b +1,1,0,2,2,1,0,1,0xb75cbcea25de6f88b1e3f4f77d21351c +1,1,0,3,3,1,0,1,0xfe9af185b54f2dadeaa02a77faa5d9b9 +1,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +1,0,1,1,1,0,0,1,0x16c61d56dca322d67caccc3815ceb199 +1,0,1,2,2,0,0,1,0x14e8977bcddb785e4e2eeae8d407e383 +1,0,1,3,3,0,0,1,0x3703c019cc3b83fcd10eddee8fbd2f9d +1,0,1,4,4,0,0,1,0x00000000000000000000000000000000 +1,0,1,5,5,0,0,1,0x077a502b8db72ad5a8a36f98eb713f9b +1,0,1,6,6,0,0,1,0x90b28d8205694f46c152302cfa1a5de7 +1,0,1,7,7,0,0,1,0xeeeb6db19783e129431c848bda523ad8 diff --git a/prover/zkevm/prover/bls/testdata/bls_g1_msm_inputs-0.csv b/prover/zkevm/prover/bls/testdata/bls_g1_msm_inputs-0.csv new file mode 100644 index 0000000000..d0f7de3a7d --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/bls_g1_msm_inputs-0.csv @@ -0,0 +1,2681 @@ +ID,DATA_G1_MSM,RSLT_G1_MSM,INDEX,CT,IS_FIRST_INPUT,IS_SECOND_INPUT,CIRCUIT_SELECTOR_G1_MSM,CIRCUIT_SELECTOR_G1_MEMBERSHIP,LIMB +0,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +0,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +1,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +1,1,0,1,1,1,0,0,1,0x0196e8225b4d22c291ddd86e6905f487 +1,1,0,2,2,1,0,0,1,0x71b657051123e45850dd03039c8c3c8f +1,1,0,3,3,1,0,0,1,0x91333baaddc5413f8876627c5f3c844d +1,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +1,1,0,5,5,1,0,0,1,0x033e719c048639eeebac6083e08d1b57 +1,1,0,6,6,1,0,0,1,0xed6e30d928c62caea9c6fb1266793b27 +1,1,0,7,7,1,0,0,1,0x41c71f4a2c08a7b954348e08ef47b515 +1,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +1,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +1,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +2,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,1,1,1,0,1,0,0x07f4fd8001b602a139b9c0b870c2b222 +2,1,0,2,2,1,0,1,0,0x8ed6c1dd20a0b9cd0c957b8855d01848 +2,1,0,3,3,1,0,1,0,0x1e02b3d17e419a9d2112c7d483c636f7 +2,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,5,5,1,0,1,0,0x07196b63bea0087c1202f9bf908ace1c +2,1,0,6,6,1,0,1,0,0xcc2b0718226f122b4355566f9c698d16 +2,1,0,7,7,1,0,1,0,0x9d3b33803b7a85c8ec8e8a0e7a1121f4 +2,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +2,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +2,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +3,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +3,1,0,1,1,1,0,0,1,0x044f007be37a300aca541a6200bc813b +3,1,0,2,2,1,0,0,1,0x21d5053500c036336a5de9975cd940d0 +3,1,0,3,3,1,0,0,1,0xf36969ba064a497c4a4ee188704b0aab +3,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +3,1,0,5,5,1,0,0,1,0x0b8ece1c0ffb8e90d05bcc0287ef6a39 +3,1,0,6,6,1,0,0,1,0x4c5ff76335070739246c4ab2f3199f83 +3,1,0,7,7,1,0,0,1,0x14b03af10411b979ee85861eb8740cb6 +3,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +3,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +3,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +4,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,8,0,0,1,1,0,0x1ba620e1d33cf1ba3d3f2933682188f2 +4,1,0,9,1,0,1,1,0,0xf2239fcff8a559e8642a618923f1eb07 +4,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +5,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +5,1,0,1,1,1,0,0,1,0x12d69dea32f2b4e969292dc675ac3488 +5,1,0,2,2,1,0,0,1,0x884106779d214fcfdf8e35b07fc0818b +5,1,0,3,3,1,0,0,1,0xf6d4ed9c7a327cecf970d36ac64e4125 +5,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +5,1,0,5,5,1,0,0,1,0x19dd24d766c9a7dc9cfa17c9772b7477 +5,1,0,6,6,1,0,0,1,0x9e313494ff1e5e1c9e5e8a9caaa63ca5 +5,1,0,7,7,1,0,0,1,0xb7dfaa6d6eb21655baad5ce57387fd6e +5,1,0,8,0,0,1,0,0,0x5c7ee9098cc36b1e58831ac6c1d907fa +5,1,0,9,1,0,1,0,0,0x0d460fc998c667e739b502a63c20fe9e +5,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +6,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,1,1,1,0,1,0,0x09c2a7451c94799d3ac35416b1be9fdd +6,1,0,2,2,1,0,1,0,0x56a09e752716a478bc7e1441a4e02fd2 +6,1,0,3,3,1,0,1,0,0x2693dc7ae36dd502c65adeabaf84b373 +6,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,5,5,1,0,1,0,0x00d66ed360d76b96d066343b9442b42f +6,1,0,6,6,1,0,1,0,0xa25c6fa02593565a4739df7c47861cfa +6,1,0,7,7,1,0,1,0,0x49405a191e9e70e0d2c8d62d38c85d8a +6,1,0,8,0,0,1,1,0,0x04d4e66e65af9909ab03c472b02644c0 +6,1,0,9,1,0,1,1,0,0x2996a48baaa98de558ca26735bbab3dd +6,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,1,1,0,0,1,0,0x10ba196deb382385f65f1cfdcb8ba629 +6,0,1,2,2,0,0,1,0,0x47bca130c1e29659eb8f6b6ef8cd6359 +6,0,1,3,3,0,0,1,0,0x2757544c1d29cb549f1b7089ed25bd1b +6,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,5,5,0,0,1,0,0x02f76cf320d3c3989fd6fce4c81372fc +6,0,1,6,6,0,0,1,0,0x39b314101c2c3fe7a24644ee6ab260d4 +6,0,1,7,7,0,0,1,0,0xcab9c3d5311f50df959c5bb3f7b181aa +7,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +7,1,0,1,1,1,0,0,1,0x14af699da337e01f00a9f63412e3c9ca +7,1,0,2,2,1,0,0,1,0xe3f3425ef13e942df4e58e1687a6fe30 +7,1,0,3,3,1,0,0,1,0xff52aa88bb832bc846ee723ddf4a14b1 +7,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +7,1,0,5,5,1,0,0,1,0x0084d4bae51a72e85c1db1637ca6c340 +7,1,0,6,6,1,0,0,1,0x91fa2770eee5df553aea7844032cb90e +7,1,0,7,7,1,0,0,1,0x472422dc84361a87b238fdf8299dd08a +7,1,0,8,0,0,1,0,0,0x0adb1d2fde255c60a714c3e3a2019ce0 +7,1,0,9,1,0,1,0,0,0xaecfcf1810f4867e23a65dcb1ebea87e +7,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +8,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,8,0,0,1,1,0,0x79bb1e5f66dfaccb08b4f94df4ed4b20 +8,1,0,9,1,0,1,1,0,0x67f0bc8cfdf660442c1ad55162aebc19 +8,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +9,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +9,1,0,1,1,1,0,0,1,0x13eb351fa34e6ba67e4de4418bb934a2 +9,1,0,2,2,1,0,0,1,0x7c8fb3ed9c631c0822c08c029102e42b +9,1,0,3,3,1,0,0,1,0xe31eb52eaeedd4bab571815b7556f4e2 +9,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +9,1,0,5,5,1,0,0,1,0x03025262bdd4a9c3cfedfdda357c71fc +9,1,0,6,6,1,0,0,1,0x370309464924c4ab3b32db2c2154f5bc +9,1,0,7,7,1,0,0,1,0xe0d609eebfe7754f066bd507ca996cd9 +9,1,0,8,0,0,1,0,0,0x79edda89dbef4fc58dee0607a745975f +9,1,0,9,1,0,1,0,0,0x762ec24c29cf9cab229d4c4cadc0155d +9,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +10,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,1,1,1,0,1,0,0x0e61c4eb974cd767d6d8ed9d42047355 +10,1,0,2,2,1,0,1,0,0x427a97e0006b4092a8d929961682ab2a +10,1,0,3,3,1,0,1,0,0xf809d3269b73b1cff62b2ade5496afc5 +10,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,5,5,1,0,1,0,0x1069036312ce54859c2960019fe32e51 +10,1,0,6,6,1,0,1,0,0x45f4b14ec658584644f8978591724732 +10,1,0,7,7,1,0,1,0,0xcb1e19399b31d152f1a201575ae91771 +10,1,0,8,0,0,1,1,0,0x774d71971d2c1635eba14a09ea37f44f +10,1,0,9,1,0,1,1,0,0x4da2e0c8206621cd6aec5557cb36ec78 +10,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,1,1,0,0,1,0,0x06d2bcb2ef922704f71cc6b1a6004fd9 +10,0,1,2,2,0,0,1,0,0x312e580d600942cbbc3c40193bc50028 +10,0,1,3,3,0,0,1,0,0x522fe0642c56a28096fd771405beade7 +10,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,5,5,0,0,1,0,0x16ed44bb579ac54c6efe4ba6a9359426 +10,0,1,6,6,0,0,1,0,0xc507121f064621d297f08410af2166d9 +10,0,1,7,7,0,0,1,0,0x6a9af037011cb1a5d98fa5cdb4d6d9c3 +11,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +11,1,0,1,1,1,0,0,1,0x1784cf78b26518527d6d12828d09bc0a +11,1,0,2,2,1,0,0,1,0x23a643ca0c4e6cbdcde101156cb597f2 +11,1,0,3,3,1,0,0,1,0xc7ff3a2dcaf1304575c78e33c8df21c5 +11,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +11,1,0,5,5,1,0,0,1,0x00cefe59b68fe403946b6e3ed5bcceb6 +11,1,0,6,6,1,0,0,1,0x00d33be3a8cab95f0709e82d627589e2 +11,1,0,7,7,1,0,0,1,0x3adfd88701df9861a12aeeb40cef2672 +11,1,0,8,0,0,1,0,0,0x7f7ede469d262004240909d67f035867 +11,1,0,9,1,0,1,0,0,0x2f8251bce517c327ec0377b47438fc03 +11,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +12,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +12,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +12,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,18,0,0,1,1,0,0x00000000000000000000000000000000 +12,1,0,19,1,0,1,1,0,0x00000000000000000000000000000000 +12,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +13,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,11,1,1,0,0,1,0x070911756633b82d1aa9fa8e68e377ac +13,1,0,12,2,1,0,0,1,0x9ec95c512d4da437f74c5b23c7383196 +13,1,0,13,3,1,0,0,1,0xd929c6fc70e11754599cbf715529e1ab +13,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,15,5,1,0,0,1,0x18e1835a421c8fcb04a0cf20185f514f +13,1,0,16,6,1,0,0,1,0xe2cd31799fad372dedf7b94ad13db39b +13,1,0,17,7,1,0,0,1,0x22a156c85838969d5a510d5f58a0fa04 +13,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +13,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +14,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +14,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +14,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,11,1,1,0,1,0,0x119e3a8f4a6dbeb8802cbbebfe7fbb40 +14,1,0,12,2,1,0,1,0,0xd99d6e824ff1dc8e8743025fb46a815f +14,1,0,13,3,1,0,1,0,0x72ceae260b00e4ac5e5e1cce23341322 +14,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,15,5,1,0,1,0,0x02d470dc44017af568d95753fb5d57b6 +14,1,0,16,6,1,0,1,0,0x61d14ead3ff42dc45484ec80fa187b9e +14,1,0,17,7,1,0,1,0,0xa49b9051ea0c15574004f7c5af70c8f4 +14,1,0,18,0,0,1,1,0,0x00000000000000000000000000000000 +14,1,0,19,1,0,1,1,0,0x00000000000000000000000000000000 +14,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +15,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,11,1,1,0,0,1,0x151dc6a941584c44fc9b1ca9b15714ed +15,1,0,12,2,1,0,0,1,0x30e99a2ddd5ca076d7aa5af550eff672 +15,1,0,13,3,1,0,0,1,0xd71183816df15a68082b22ca30a4ee32 +15,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,15,5,1,0,0,1,0x02a9b93644e9aa5b101225a19090a023 +15,1,0,16,6,1,0,0,1,0x3a5b9733484f2ae51ab3e3cf25061f88 +15,1,0,17,7,1,0,0,1,0x0026743537eeb7907e80f57b86968988 +15,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +15,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +16,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +16,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +16,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,18,0,0,1,1,0,0x051dadd8ad2cf2be620ef47fb781515c +16,1,0,19,1,0,1,1,0,0xbd87b421b4d8a779bba216a980506d31 +16,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +17,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +17,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +17,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +17,1,0,11,1,1,0,0,1,0x02d3ce1f23db9581f5f67d1a45d4e1d8 +17,1,0,12,2,1,0,0,1,0xe98bd12f7683160402bcf9b6e0699dfb +17,1,0,13,3,1,0,0,1,0xc1deda857b4c265b222efaef7e5e4b7f +17,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +17,1,0,15,5,1,0,0,1,0x16d95e66225ca3aecd8cf0f58240acc4 +17,1,0,16,6,1,0,0,1,0xc2e0c5f6ed2d34b142a6459ed8960531 +17,1,0,17,7,1,0,0,1,0x758c5f69a182d1a0f02d3a9bd7365678 +17,1,0,18,0,0,1,0,0,0x0a5f84ba7ee7ef219f51740f047b2598 +17,1,0,19,1,0,1,0,0,0x553daca4166e18577c8ab4bb7881fabc +17,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +18,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +18,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +18,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,11,1,1,0,1,0,0x0e9bc182bcbfd9401624434ddc52181f +18,1,0,12,2,1,0,1,0,0x5fa62d3fdde2a2044d3481f036e96921 +18,1,0,13,3,1,0,1,0,0xbd160cbe065e949000728ccc43192c9c +18,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,15,5,1,0,1,0,0x0083cbf82d21fc1fd08b569620bf55f0 +18,1,0,16,6,1,0,1,0,0x296b6beeb7cb7261712da35b18fd4a42 +18,1,0,17,7,1,0,1,0,0x7de0e241ea0459aa4072b89745123842 +18,1,0,18,0,0,1,1,0,0x6c2f7b5aba92a97647c124bb820815f6 +18,1,0,19,1,0,1,1,0,0x2e04cce246599aaac9f7aaa0b3fe3a87 +18,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +18,0,1,1,1,0,0,1,0,0x017ca8b2d3eaa0849c82dbb8dafa595c +18,0,1,2,2,0,0,1,0,0x4761b6bb14a6e87f9189eda17a9d9329 +18,0,1,3,3,0,0,1,0,0x67d74abdc21fe7645ffdd395603605e9 +18,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +18,0,1,5,5,0,0,1,0,0x0fb544dd1f0cf86d79ac2e1e12d53aad +18,0,1,6,6,0,0,1,0,0xc00164f0f8358abdf3667cc3958c87fa +18,0,1,7,7,0,0,1,0,0x9b601478a28a13880b0f907be0ce77f2 +19,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +19,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +19,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +19,1,0,11,1,1,0,0,1,0x0e3f714da679a8ef5fac9c67b44483b2 +19,1,0,12,2,1,0,0,1,0x5defdba0f8de68ebcc7baeae677d4441 +19,1,0,13,3,1,0,0,1,0x88537042733d13026f1b60e69124026a +19,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +19,1,0,15,5,1,0,0,1,0x119d0ac218d63b8b9e3d4af085698101 +19,1,0,16,6,1,0,0,1,0x8d6ec8cb96a398cc861c9d6e09a6b33c +19,1,0,17,7,1,0,0,1,0xb8ac7c305fd6905958a6477477c3313c +19,1,0,18,0,0,1,0,0,0x4fbfd955fa760822d4fa77acf77d4edd +19,1,0,19,1,0,1,0,0,0x28c56adc39179aaf406341c295477406 +19,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +20,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +20,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +20,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,18,0,0,1,1,0,0x761672166e4516091fc366c9a9052a8e +20,1,0,19,1,0,1,1,0,0x7a0e41d05bb5ec288af52aaccc73bf7e +20,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +21,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +21,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +21,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +21,1,0,11,1,1,0,0,1,0x1656b570d911b5ed00a7e85c2047d1ee +21,1,0,12,2,1,0,0,1,0x26a93eac7014cc1ebf1265c34cbf5117 +21,1,0,13,3,1,0,0,1,0xa8e9ea7924a8d924d59bfadce3699b5a +21,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +21,1,0,15,5,1,0,0,1,0x182a5d1495615f6c68c804ca96e6e399 +21,1,0,16,6,1,0,0,1,0xf7ca2f040fdae3a763fecbc8884fae63 +21,1,0,17,7,1,0,0,1,0xdc2371d249d31a614625bf5410f0d541 +21,1,0,18,0,0,1,0,0,0x7524b7eacc609e5f6739e5d3a47af652 +21,1,0,19,1,0,1,0,0,0xceb26c3a1e882ae6fa253906bde35903 +21,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +22,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +22,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +22,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,11,1,1,0,1,0,0x14343f9f4ed87b18907663720d6a0e04 +22,1,0,12,2,1,0,1,0,0xad72b6a37bebfbdcd6ee48f284c890de +22,1,0,13,3,1,0,1,0,0x3cec0d011165fb5a1276523a8ba44580 +22,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,15,5,1,0,1,0,0x02992b468e98c8007c14eb28699ef85c +22,1,0,16,6,1,0,1,0,0x9c827cafc0ec9a3bb2069ef271382a0b +22,1,0,17,7,1,0,1,0,0x196f9ae24b7c762fb96a188c387c8ecc +22,1,0,18,0,0,1,1,0,0x760eca38f3eb51c7221da327cb1f1e11 +22,1,0,19,1,0,1,1,0,0xc342264a59de004305c6477b33636954 +22,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +22,0,1,1,1,0,0,1,0,0x1241bacf93b28711ce64ff22cd56cd8a +22,0,1,2,2,0,0,1,0,0x820804bbdc840bcd28523e6f6e338dbd +22,0,1,3,3,0,0,1,0,0x9b93d8c445fd39cfb239dd246210686d +22,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +22,0,1,5,5,0,0,1,0,0x07d26c7ba816e696e684b2500ea37ff6 +22,0,1,6,6,0,0,1,0,0x490254ce8eb673cb289852fdf2ac7343 +22,0,1,7,7,0,0,1,0,0xc01d7edc86f04400e51a59833d9ee07d +23,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +23,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +23,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +23,1,0,11,1,1,0,0,1,0x00e5e7d01aeae09f4563749de8669152 +23,1,0,12,2,1,0,0,1,0xb7caf9f00e7df7296f6e70bde702ef77 +23,1,0,13,3,1,0,0,1,0x5c7f96221601fca8947ee90d5db249ab +23,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +23,1,0,15,5,1,0,0,1,0x0954ad0b4a47427fe6ab2603c5631172 +23,1,0,16,6,1,0,0,1,0x9d5b91e98ce1ecfabf85d031b539d538 +23,1,0,17,7,1,0,0,1,0x4404975e1e79ecae0af7d4ebbec1f4d4 +23,1,0,18,0,0,1,0,0,0x780a78afa24e00bd41a2c6e1dad0a86a +23,1,0,19,1,0,1,0,0,0x5c090b3a52ce72a308f26bc73f03d4b9 +23,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +24,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +24,1,0,1,1,1,0,0,1,0x0ccf91ef5e3a018a1ca3982801bcdbe3 +24,1,0,2,2,1,0,0,1,0x5581ac3b737086d06238381794563258 +24,1,0,3,3,1,0,0,1,0xeb5ccc7ce086305fe1ee25eba27fcf6d +24,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +24,1,0,5,5,1,0,0,1,0x033be880edfde3d7422e6714fd4daa28 +24,1,0,6,6,1,0,0,1,0xcdb8b9d32098526225f1766e394404aa +24,1,0,7,7,1,0,0,1,0x4c00513d9254b40660fb80df8a07bc40 +24,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +24,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +24,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +24,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +24,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +25,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +25,1,0,1,1,1,0,0,1,0x1528b9447452f7ebf037f3eabacadaff +25,1,0,2,2,1,0,0,1,0x877df1039369036a913e3cf9f02c418c +25,1,0,3,3,1,0,0,1,0x9d47043fc0c97faa437b0d570380b27b +25,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +25,1,0,5,5,1,0,0,1,0x0d628213e31ba9f74a8d5036d2698dc6 +25,1,0,6,6,1,0,0,1,0xd14ce357ca5471931f0f985efd02b92f +25,1,0,7,7,1,0,0,1,0x83ed8ea0e6880aae6e87314961a97b29 +25,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +25,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +25,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +25,1,0,11,1,1,0,0,0,0x0869482870d1de2e0ee76b932b8db7a6 +25,1,0,12,2,1,0,0,0,0x7f043b5e7770c3c8d33f0ffa7fe280d6 +25,1,0,13,3,1,0,0,0,0x838bc011607591527b94a8a1000c4098 +25,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +25,1,0,15,5,1,0,0,0,0x0dffd9c5b638850069bc31aff2f45233 +25,1,0,16,6,1,0,0,0,0x70c504fe316ee7bea4e37106d01cd101 +25,1,0,17,7,1,0,0,0,0xf7c4cea52172cbd69890145d7d99376e +25,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +25,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +25,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +26,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +26,1,0,1,1,1,0,0,1,0x1629db52d571bb0f162e2c25cd9cf554 +26,1,0,2,2,1,0,0,1,0x4c64755ea0dc5704933ffba0cd35bc18 +26,1,0,3,3,1,0,0,1,0xfb5cbdbfb81f94de1660736657e5e0ab +26,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +26,1,0,5,5,1,0,0,1,0x07477114ef70a99b73fcb5b0c0abf11c +26,1,0,6,6,1,0,0,1,0x8a880a755cc8c14704a7e552ab9c5768 +26,1,0,7,7,1,0,0,1,0x077021435505d0e8bf0f25468fa0828e +26,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +26,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +26,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +26,1,0,11,1,1,0,0,0,0x0095f822498866818f358dbb3360857c +26,1,0,12,2,1,0,0,0,0x64d1c88d52d7b932dd64b37eb48c5d04 +26,1,0,13,3,1,0,0,0,0x4a55e33a4b35a61567177f13955f7768 +26,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +26,1,0,15,5,1,0,0,0,0x06085f5eef56f95cd43f3c21db476d5d +26,1,0,16,6,1,0,0,0,0xcf1563a4cfd19d4855ccc7d147bede89 +26,1,0,17,7,1,0,0,0,0xbc1512c62d12e62813cb0d329de512a1 +26,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +26,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +26,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +27,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +27,1,0,1,1,1,0,0,1,0x0e0f6a4c74e942738ee6ab1dc2015417 +27,1,0,2,2,1,0,0,1,0xacb8eb3cdc7ff80cd0338924130419d2 +27,1,0,3,3,1,0,0,1,0x5783517b27c2f696651cfe3cf8a2a86c +27,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +27,1,0,5,5,1,0,0,1,0x0d49297ce5615c7f5cfb1aff6a70efc1 +27,1,0,6,6,1,0,0,1,0x0f75f00681e89673742b076826595035 +27,1,0,7,7,1,0,0,1,0x396d3e08837e9e644613b6664dc1b9da +27,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +27,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +27,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +27,1,0,11,1,1,0,0,0,0x0728eb386a504e5740ebd763478b4ee4 +27,1,0,12,2,1,0,0,0,0x303367a655972695ab63c16b2af6f143 +27,1,0,13,3,1,0,0,0,0x8201f4eb1b1742287c3b942e7d4d29a5 +27,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +27,1,0,15,5,1,0,0,0,0x00fc248f489ee1a5ea9ae13750aa4278 +27,1,0,16,6,1,0,0,0,0x564c3cfcd27189ddcc06e7ef0c1202fa +27,1,0,17,7,1,0,0,0,0xd7bb8af9d232ac37f249328e6408b8e6 +27,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +27,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +27,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +28,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +28,1,0,1,1,1,0,0,1,0x054b3c1460ded5ef3f16d8cf39f3a011 +28,1,0,2,2,1,0,0,1,0xaa3396501c2983b81e40d9f30d111ba0 +28,1,0,3,3,1,0,0,1,0xdfbbc4b8b460370253f863ade42264f3 +28,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +28,1,0,5,5,1,0,0,1,0x13c48f930b40af723d6269c73d93e748 +28,1,0,6,6,1,0,0,1,0x3b319e20248b28f1708417aba9c46bb7 +28,1,0,7,7,1,0,0,1,0xa4a74111216042c3acb2a77ae57cdcc5 +28,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +28,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +28,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,18,0,0,1,0,0,0x57da7fd34314c5c5c99e5c79159ce98c +28,1,0,19,1,0,1,0,0,0xdda49fe9dee60473cd0377c6de30a3d6 +28,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +29,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +29,1,0,1,1,1,0,0,1,0x07544cb0a871096f1ac4cf54966edd8d +29,1,0,2,2,1,0,0,1,0x035b741e7090f142380b3fb4cb436d5b +29,1,0,3,3,1,0,0,1,0x2d5507e36b6b06b3b604f6cf32ef85d9 +29,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +29,1,0,5,5,1,0,0,1,0x0399de170b807b65fc1d66df85bbc2d3 +29,1,0,6,6,1,0,0,1,0x0fdb8a270a599676fd32ded1ed4480a5 +29,1,0,7,7,1,0,0,1,0x622895f679e5e76a8ce1e64fc3f5d329 +29,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +29,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +29,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +29,1,0,11,1,1,0,0,0,0x05deff257097a88939c6cf61be305adf +29,1,0,12,2,1,0,0,0,0x56e9dc6388f4355c60f4b5ebdea34903 +29,1,0,13,3,1,0,0,0,0xc626f608691a4632227cce8f4fcf815f +29,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +29,1,0,15,5,1,0,0,0,0x0ea4176d3cfefef2db4888d3e9ce057b +29,1,0,16,6,1,0,0,0,0x9ebc9ebd655b4557164cd638f0b2ff06 +29,1,0,17,7,1,0,0,0,0x430149c296448e1f4f975fca6534f5e0 +29,1,0,18,0,0,1,0,0,0x28bb5ab82ee345bdc6bbc850fac30855 +29,1,0,19,1,0,1,0,0,0x741a5987dab6d1c770c6bc868637a49a +29,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +30,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +30,1,0,1,1,1,0,0,1,0x059f9dc267f1a25d806d2df315fa89b7 +30,1,0,2,2,1,0,0,1,0xe448bdb531c1b1934e4b501aba0132ed +30,1,0,3,3,1,0,0,1,0x7838902c8951d43897232eb32efa0cd6 +30,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +30,1,0,5,5,1,0,0,1,0x09237183d0fe0a93a340c923d630de91 +30,1,0,6,6,1,0,0,1,0xf18bc452aa0ef0df2001a6a2a9080135 +30,1,0,7,7,1,0,0,1,0x56a55d6f027d706d0d4e7b10be32a1f0 +30,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +30,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +30,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +30,1,0,11,1,1,0,0,0,0x0b7dec57a05887e4f77c53c9cb11e886 +30,1,0,12,2,1,0,0,0,0x9593c606d49b67e9c4c304c7bf82d6bc +30,1,0,13,3,1,0,0,0,0x93371efb9e3b9de0b131816c92d77cf8 +30,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +30,1,0,15,5,1,0,0,0,0x10f215daf50397109b444f9fdebe18c1 +30,1,0,16,6,1,0,0,0,0x8dbf673db5ada23503f0423d2ca6141c +30,1,0,17,7,1,0,0,0,0x1baa672afd017f3103519c6e95a3dcd6 +30,1,0,18,0,0,1,0,0,0x1b48513087d6fb11191ed16788da342d +30,1,0,19,1,0,1,0,0,0x0cb5d1acdc49559d327d27bfe415512d +30,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +31,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +31,1,0,1,1,1,0,0,1,0x04b04c16b168569bfafc9e3ed0bbd9a2 +31,1,0,2,2,1,0,0,1,0xe1d45950327365638e56c23c5aadf9c7 +31,1,0,3,3,1,0,0,1,0x28dc9105d165aa6980f3feeb2c829318 +31,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +31,1,0,5,5,1,0,0,1,0x186298239e5ddc64bd15c556b49c68da +31,1,0,6,6,1,0,0,1,0xe105dcd0b568cb9e3a65ed1955cf6f94 +31,1,0,7,7,1,0,0,1,0xcf2847c2a27cb8f67f7dd1d079a875d3 +31,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +31,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +31,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +31,1,0,11,1,1,0,0,0,0x0d0f26c83e63f21a38f6b5ac7a814f96 +31,1,0,12,2,1,0,0,0,0x3a881723e4cc43919f7967b9846a83c0 +31,1,0,13,3,1,0,0,0,0x43af39d40f911ec9e81fa65e7b3ab6e7 +31,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +31,1,0,15,5,1,0,0,0,0x02931e0b454b8c5ff29ac1f4a96455e9 +31,1,0,16,6,1,0,0,0,0xc210fdba58374a1b087e0e6ed97ddcb9 +31,1,0,17,7,1,0,0,0,0x86a6e615f3be320299e51eedc674f113 +31,1,0,18,0,0,1,0,0,0x3cd67e4131158f2c7da594ca12ec24f9 +31,1,0,19,1,0,1,0,0,0xe7eda16e6719556e3583ab47886fd018 +31,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +32,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +32,1,0,1,1,1,0,0,1,0x092378b9cdb7dfd7f24faa1ebac8cee9 +32,1,0,2,2,1,0,0,1,0xb893ecda412f8fb955d0134664b953aa +32,1,0,3,3,1,0,0,1,0xe65e47a28f694d51a1623001c6988453 +32,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +32,1,0,5,5,1,0,0,1,0x17d7a8dbfb948023677c1f126929fb0c +32,1,0,6,6,1,0,0,1,0xe5eb71cfdf8c05418d262f760cceb99a +32,1,0,7,7,1,0,0,1,0xb726ba2e822dd2dea16452e8df1c11e5 +32,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +32,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +32,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,18,0,0,1,0,0,0x7c7ef17c37464dc1bc797674e1c86525 +32,1,0,19,1,0,1,0,0,0x273d3c3cb528897d8c9f24c14c43f9c7 +32,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +33,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +33,1,0,1,1,1,0,0,1,0x009e9dcb6e20eab384f9852010d1eb45 +33,1,0,2,2,1,0,0,1,0xe0fc86d41dbaf85f6fc315b79de0c396 +33,1,0,3,3,1,0,0,1,0xd1c92b6e8a4ad249ced161e694acffe8 +33,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +33,1,0,5,5,1,0,0,1,0x17bc612a6b1775debed82976e3d7b107 +33,1,0,6,6,1,0,0,1,0x956117723dbeda3ea34625ae81d8e0b7 +33,1,0,7,7,1,0,0,1,0xf253a3c5feb966990f916cf1e118fe12 +33,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +33,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +33,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +33,1,0,11,1,1,0,0,0,0x082fcf68f819a9bee071362d280e4b54 +33,1,0,12,2,1,0,0,0,0xfd541fcd6cfb75b21b7e5b1b91bec070 +33,1,0,13,3,1,0,0,0,0xa1d19619ee3fa0cd0035b9ce06a6d1af +33,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +33,1,0,15,5,1,0,0,0,0x11df690397941e4eef7a1e0c7aaebded +33,1,0,16,6,1,0,0,0,0xfb09c7ee1ae0419bef623cfbef002cfc +33,1,0,17,7,1,0,0,0,0x46ab1ffd56a009aa9ffd6227acf45722 +33,1,0,18,0,0,1,0,0,0x77b1adb7f9ac889ca239c3527c08b08d +33,1,0,19,1,0,1,0,0,0xa2b8f14f0fce48820d545293f80c888f +33,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +34,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +34,1,0,1,1,1,0,0,1,0x00180a11fb0c567924e07274c8d10340 +34,1,0,2,2,1,0,0,1,0x02cbeb987d1a655f4ab02040f504c0f8 +34,1,0,3,3,1,0,0,1,0xf151bacb4eeaacefa0163373951edb0d +34,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +34,1,0,5,5,1,0,0,1,0x064b2a2b7ab784c0864e11938439adf8 +34,1,0,6,6,1,0,0,1,0xa541754de1ee13b2cdecfa2f9a3cfd4a +34,1,0,7,7,1,0,0,1,0x74dccbd84a335a2b39f2781cadf6c758 +34,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +34,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +34,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +34,1,0,11,1,1,0,0,0,0x121d4cba13fad1d2c13ef7ca2279b5d8 +34,1,0,12,2,1,0,0,0,0xc9bcd8350e49fa01b946c4281a261223 +34,1,0,13,3,1,0,0,0,0xd7f6553af4369831ae589533e1d2717f +34,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +34,1,0,15,5,1,0,0,0,0x19b05e62611d781bc32c98948d3535f6 +34,1,0,16,6,1,0,0,0,0x9c3fed6f31ab504f55c544ef5cf327c0 +34,1,0,17,7,1,0,0,0,0x7c2273d8ce8d44da7306b22248722c6a +34,1,0,18,0,0,1,0,0,0x7e56eab0954bcc297b8d7e298b048bde +34,1,0,19,1,0,1,0,0,0xf3f1f30b02b6a1ce5bb84dcaf095fa3f +34,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +35,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +35,1,0,1,1,1,0,0,1,0x160ae450e9cd54aba97ab698d6a52dfb +35,1,0,2,2,1,0,0,1,0xf866a8fa8336849c408dadec06204cc1 +35,1,0,3,3,1,0,0,1,0xfa5e4f6befaa98f684bacc54bbb2dd2c +35,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +35,1,0,5,5,1,0,0,1,0x15ba3982bfe6a22c063c5903b0181e7f +35,1,0,6,6,1,0,0,1,0x44ca532659d1b0ded141e67c5899b701 +35,1,0,7,7,1,0,0,1,0x870a136d8cedae3305f993c2ee188d01 +35,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +35,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +35,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +35,1,0,11,1,1,0,0,0,0x1956d7d36ad00aa28bd4c7e9fcaf6ef5 +35,1,0,12,2,1,0,0,0,0x6314023b3ce950bed10b4b6aedfc61cd +35,1,0,13,3,1,0,0,0,0xd9a4f4b93b4671d88865bce1ab1688ed +35,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +35,1,0,15,5,1,0,0,0,0x19d0f10e02ae209c919e1c0ec8ab7439 +35,1,0,16,6,1,0,0,0,0xda0a5cf8b702d62639b27ad6ac6be0c8 +35,1,0,17,7,1,0,0,0,0xa6dc848b19b24de658a90eee0eeb71aa +35,1,0,18,0,0,1,0,0,0x7ca3d03b54bd996d96447dd714ed8bcf +35,1,0,19,1,0,1,0,0,0xb793eb6d3fdc68edc1230a4365bf8bae +35,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +36,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,1,1,1,0,1,0,0x14ce3c3e3f978f7a133806347ad44864 +36,1,0,2,2,1,0,1,0,0x0880ae1354c7bfbcd3377eeec72a6ec1 +36,1,0,3,3,1,0,1,0,0x045156fff1195c861aa430300eee590a +36,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,5,5,1,0,1,0,0x182b67c7e1c89227aada900082633d67 +36,1,0,6,6,1,0,1,0,0xf2b359934c9439919a1b1b925be62114 +36,1,0,7,7,1,0,1,0,0xa63bb1643b463c70fdc73e2479c337ea +36,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +36,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +36,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,18,0,0,1,1,0,0x00000000000000000000000000000000 +36,1,0,19,1,0,1,1,0,0x00000000000000000000000000000000 +36,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +37,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +37,1,0,1,1,1,0,0,0,0x15bf963ddc5b531430c998dd070eda71 +37,1,0,2,2,1,0,0,0,0xb5a88644ad4115c831ee15a468f52642 +37,1,0,3,3,1,0,0,0,0x99d3e19ecd88227928a1b4c60ac0a4b1 +37,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +37,1,0,5,5,1,0,0,0,0x0f3627e730c3ba0a288e8508cc82b630 +37,1,0,6,6,1,0,0,0,0x7b4f5320507086820f9328f16d044d63 +37,1,0,7,7,1,0,0,0,0xc8b869420f55e99674a42434b0948352 +37,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +37,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +37,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +37,1,0,11,1,1,0,0,1,0x0bce415a22574475bd680d6c8b2c79d7 +37,1,0,12,2,1,0,0,1,0xec6aaf82b5cf82e1275b4675431c2300 +37,1,0,13,3,1,0,0,1,0xdd20d1b192b457260753cfb3b9ef3a52 +37,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +37,1,0,15,5,1,0,0,1,0x0b48360cbfb86c11a043d9b53f7b534b +37,1,0,16,6,1,0,0,1,0x037781addad4a079638dfe46207c78a0 +37,1,0,17,7,1,0,0,1,0x7e02140202abf4cf05d93c0e30a93923 +37,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +37,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +37,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +38,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,1,1,1,0,1,0,0x0d3732eb743ed1855a6d9df86efe3cac +38,1,0,2,2,1,0,1,0,0xa48888b204ec1149071a6a7dcbc90f8c +38,1,0,3,3,1,0,1,0,0x0e87589843e77484de6fa6320d1d1373 +38,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,5,5,1,0,1,0,0x122af6f32694d0c67d97cac4bd8ee82f +38,1,0,6,6,1,0,1,0,0xa5ba3c5c0b7ac6532663f51f062b961a +38,1,0,7,7,1,0,1,0,0xc4d8f2cd95fc3e612e74fafbceaa1f22 +38,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +38,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +38,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,11,1,1,0,1,0,0x09dbc87e4ed7ece7f135698d2ea86ca7 +38,1,0,12,2,1,0,1,0,0xacce0022b607ef644376d654c8696a30 +38,1,0,13,3,1,0,1,0,0xd2aed73add2f4fb4f57630484666701b +38,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,15,5,1,0,1,0,0x0d6e6da0d3596dbbbc4bad79dd4291ac +38,1,0,16,6,1,0,1,0,0x7dfeec70a10a91d4884b541fc0d84122 +38,1,0,17,7,1,0,1,0,0x732b230ff0ee488bd224c68f565770ab +38,1,0,18,0,0,1,1,0,0x00000000000000000000000000000000 +38,1,0,19,1,0,1,1,0,0x00000000000000000000000000000000 +38,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +39,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +39,1,0,1,1,1,0,0,0,0x0d025a5d9aa7e132672b92287f34a85f +39,1,0,2,2,1,0,0,0,0x027a32dfea30a017a5b225843aae6b7f +39,1,0,3,3,1,0,0,0,0x7c8a9a520e41f69dac41fcd50fae0faf +39,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +39,1,0,5,5,1,0,0,0,0x00a7907daa28669585cd12bd51432cd1 +39,1,0,6,6,1,0,0,0,0x58802fb7f29e23193e41b3558301a771 +39,1,0,7,7,1,0,0,0,0x749c295052e9c3aaf534757370948323 +39,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +39,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +39,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +39,1,0,11,1,1,0,0,1,0x0b90057260e0b213f23b6036619c679e +39,1,0,12,2,1,0,0,1,0x6cd570e277b3e49b2f3b95bf4d720dd6 +39,1,0,13,3,1,0,0,1,0x67d8ea4d724438d969815a6b85333903 +39,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +39,1,0,15,5,1,0,0,1,0x09fc0ca8efa4103c81fa830f2a157869 +39,1,0,16,6,1,0,0,1,0xa1abb43a6f5230c8161ed9be0cf5a2f9 +39,1,0,17,7,1,0,0,1,0xdd928348a99b92340186f3c87c27ac34 +39,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +39,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +39,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +40,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,1,1,1,0,1,0,0x0ed440f9f2ce54906c9470687b887316 +40,1,0,2,2,1,0,1,0,0x48f96a072bd6e3a770b7542b6f1a8855 +40,1,0,3,3,1,0,1,0,0xfebd52186af004c0e724998389a4de4f +40,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,5,5,1,0,1,0,0x00355ca96d4a9e6adc7749ce8b03df34 +40,1,0,6,6,1,0,1,0,0x14ce5a95b34ef07a311a39a8bc2d707a +40,1,0,7,7,1,0,1,0,0xebdf85c88c889a2dd9d7ace16a88b5bf +40,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +40,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +40,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,18,0,0,1,1,0,0x23491beae01385c84df9ec3ffe0aa053 +40,1,0,19,1,0,1,1,0,0xb710c84e44499a07ec8224436c3f3c28 +40,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +41,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +41,1,0,1,1,1,0,0,0,0x0c24657371d3ec55cd685d9d837a53d7 +41,1,0,2,2,1,0,0,0,0xbe81a9d0c90fd00e575c1923f1451cb3 +41,1,0,3,3,1,0,0,0,0x40fce5b9ba0c539c3a68bce4c761286b +41,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +41,1,0,5,5,1,0,0,0,0x0ec3c32ba52af850f7a645132aeb3b7a +41,1,0,6,6,1,0,0,0,0xd03b216751178250802f28c50f5d1ff0 +41,1,0,7,7,1,0,0,0,0x11fedfe74925a50a9d7ea5a0b5b1bd38 +41,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +41,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +41,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +41,1,0,11,1,1,0,0,1,0x1296d6c2fb7515c3d4c35ed3dadc2e53 +41,1,0,12,2,1,0,0,1,0x6d855750802d206727b58dab1f97bf2e +41,1,0,13,3,1,0,0,1,0xf0208ea24a874a1f6a7e1f5137961171 +41,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +41,1,0,15,5,1,0,0,1,0x04aff159eee58abf319c84b685e93a9b +41,1,0,16,6,1,0,0,1,0xf38880d69a0f69dcffc8fcd171b72659 +41,1,0,17,7,1,0,0,1,0x00d31daf1fff35b4814593d632fc27ac +41,1,0,18,0,0,1,0,0,0x5c6e35c5a04d097ef5d2a9b42dbd22c2 +41,1,0,19,1,0,1,0,0,0xe2212fc235b977970a815ea8d8ca4d51 +41,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +42,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,1,1,1,0,1,0,0x032051071a73951c9e5b0f6b1119b169 +42,1,0,2,2,1,0,1,0,0xc79505d436b87bef3750fe2e9f852f14 +42,1,0,3,3,1,0,1,0,0x92715203ef70776155f6df5b0240a524 +42,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,5,5,1,0,1,0,0x0b9e3e82766b40369aadbf41fffa09de +42,1,0,6,6,1,0,1,0,0x9cdb83e32b28eec1eabedb07866c4a72 +42,1,0,7,7,1,0,1,0,0x8f62a56b7b5da4b3b00eea8eac1c882f +42,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +42,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +42,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,11,1,1,0,1,0,0x08d5698d7fbf4385b75eb576a75d3533 +42,1,0,12,2,1,0,1,0,0x47b127fad252168eb824e2f4220e7871 +42,1,0,13,3,1,0,1,0,0x301b0489f99b911bd34a41d9d4ebf635 +42,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,15,5,1,0,1,0,0x0fed039593720568f59bb981bbb4f080 +42,1,0,16,6,1,0,1,0,0x5dd8d3c2a173057e6501f2a6b0bfdabb +42,1,0,17,7,1,0,1,0,0x01c13ab9626476b458a5382e36215cd7 +42,1,0,18,0,0,1,1,0,0x66682b951d572dc9da8a8d62d3a09925 +42,1,0,19,1,0,1,1,0,0xa0c6c4813db319a40c27e0dbc41f4d42 +42,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +42,0,1,1,1,0,0,1,0,0x18f09d65341a00c45d00175f5bb4de4b +42,0,1,2,2,0,0,1,0,0xa787a83d638839d1249c60ea18120571 +42,0,1,3,3,0,0,1,0,0x9a82d520b131cbbb2ce29464d9598f9c +42,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +42,0,1,5,5,0,0,1,0,0x0071684561a2e7932883eb66c374bf8a +42,0,1,6,6,0,0,1,0,0x7516bf1bc7ae8bb16b329b502bd11b46 +42,0,1,7,7,0,0,1,0,0x10dae42a840d93f020dff73ad050995c +43,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +43,1,0,1,1,1,0,0,0,0x0e9f394d4820205d9a479a813783db6d +43,1,0,2,2,1,0,0,0,0xfc3dca75b02888e209b6cf8fec8e587d +43,1,0,3,3,1,0,0,0,0x7251c498ed2dd8fd0777b065db025ab0 +43,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +43,1,0,5,5,1,0,0,0,0x168cd4a825d1577e283464a90ce3ed01 +43,1,0,6,6,1,0,0,0,0x4183ff6f50e7f0d28316f871b9f07711 +43,1,0,7,7,1,0,0,0,0x1fe6ef17efc2801958ab21f4d6780ad8 +43,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +43,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +43,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +43,1,0,11,1,1,0,0,1,0x0a53ae4c9001f664aa7b4390cd54a59f +43,1,0,12,2,1,0,0,1,0xc4d541606f75b3a7c9b20c82ca5db3c2 +43,1,0,13,3,1,0,0,1,0xa74d6d103d2dd314becd62b64f5d5d48 +43,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +43,1,0,15,5,1,0,0,1,0x0c9d3605f849db7002f9344c1d3c8e73 +43,1,0,16,6,1,0,0,1,0xa5bb8f679d25879379c4b405326f8d81 +43,1,0,17,7,1,0,0,1,0x126a0acd9d89bea37465744795176199 +43,1,0,18,0,0,1,0,0,0x364047f161cacd024b89d88620cc897a +43,1,0,19,1,0,1,0,0,0x095a5808a6de51ec5505fe76d3966e7e +43,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +44,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,1,1,1,0,1,0,0x107c6cfd15180ceeb116606a3ccafe76 +44,1,0,2,2,1,0,1,0,0x6db0954316aad3101f24097b0f6b185c +44,1,0,3,3,1,0,1,0,0x2eec571f38eed243756faa676c3bc696 +44,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,5,5,1,0,1,0,0x06d70d27693aa367ffbe514d16115e8e +44,1,0,6,6,1,0,1,0,0x8d5059fe37b6b86d11ad71fead8a39ab +44,1,0,7,7,1,0,1,0,0xc41627d4241eeb762079df59bee8c2bd +44,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +44,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +44,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,18,0,0,1,1,0,0x78900d0455d0e9df9fc7d0ec143c5991 +44,1,0,19,1,0,1,1,0,0xe61c0a37d730fe52ad3e1aa6670f97d9 +44,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +45,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +45,1,0,1,1,1,0,0,0,0x09b9a03a581b2ffd540edc78cd24bda0 +45,1,0,2,2,1,0,0,0,0xa1e007614caa6751674611560ec9a4fa +45,1,0,3,3,1,0,0,0,0xaf27538ee0d797cd18eb9f96215628f0 +45,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +45,1,0,5,5,1,0,0,0,0x0cebc3aab8f5a72133dce402118d0a96 +45,1,0,6,6,1,0,0,0,0x2e407fe73fdd4a4d7ecb11d009036570 +45,1,0,7,7,1,0,0,0,0x18cd15ef99ba66e0e704cd5f91b9ba18 +45,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +45,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +45,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +45,1,0,11,1,1,0,0,1,0x132cc79f6a66384e48f1ccaefce859cc +45,1,0,12,2,1,0,0,1,0x56a0e3d18845b70f0862247f6c71491e +45,1,0,13,3,1,0,0,1,0x046ddfdd351e26c2d583f25d01fc7bc2 +45,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +45,1,0,15,5,1,0,0,1,0x14cde1076b14b188e8b2ab6b50f75dfc +45,1,0,16,6,1,0,0,1,0x518e5286d204c79387be863f63b665b0 +45,1,0,17,7,1,0,0,1,0x0af18fb5507ab28e6644c16c6732accc +45,1,0,18,0,0,1,0,0,0x7fdc9bd40c34f77dce308e988e9ec320 +45,1,0,19,1,0,1,0,0,0x9037adcb579bc9178cb4a5e4fbebfc41 +45,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +46,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,1,1,1,0,1,0,0x058c45d50b7c467a2928cb0d72a6643f +46,1,0,2,2,1,0,1,0,0xa68af139466f545b361eb7288afa036f +46,1,0,3,3,1,0,1,0,0x221284ed8b34d9f1345fcf1a5cd2a6dd +46,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,5,5,1,0,1,0,0x0f5552153a379949edf480705fbddb94 +46,1,0,6,6,1,0,1,0,0xea09debe04cfdf8faf3a33a027b12966 +46,1,0,7,7,1,0,1,0,0x75de926691c3e493c28450e6b072198e +46,1,0,8,0,0,1,1,0,0x00000000000000000000000000000000 +46,1,0,9,1,0,1,1,0,0x00000000000000000000000000000000 +46,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,11,1,1,0,1,0,0x0b78a1be4b8ea497058943ffba7068b1 +46,1,0,12,2,1,0,1,0,0x78a4a5f019dcddd755f359a30cff56f2 +46,1,0,13,3,1,0,1,0,0x92d12e686a2ae87f92a954d1fc7dda6e +46,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,15,5,1,0,1,0,0x157fc5681557072f619723ffe3f875bc +46,1,0,16,6,1,0,1,0,0xe8df7831b94503daa8faf3596942797f +46,1,0,17,7,1,0,1,0,0x2ec91eeeae98757dabdbcb84b0047b72 +46,1,0,18,0,0,1,1,0,0x769fdbc04f2b5e8ce310529cea98ed82 +46,1,0,19,1,0,1,1,0,0xad0ec985782413e35d759733caa05418 +46,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +46,0,1,1,1,0,0,1,0,0x117f176df1ef4bd326c493e0b4a778cd +46,0,1,2,2,0,0,1,0,0xee722deb5bedc4d42d2309abfce7f365 +46,0,1,3,3,0,0,1,0,0xff187024f228a0447d92bb9882ce52c0 +46,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +46,0,1,5,5,0,0,1,0,0x16046ff207b6db51babeb88eac432f7a +46,0,1,6,6,0,0,1,0,0x83f10e30bb73f4e35d797b73c4b2b49b +46,0,1,7,7,0,0,1,0,0xf39eac87262fb2c721c930aa3e17d2e0 +47,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +47,1,0,1,1,1,0,0,0,0x0cf294ad8dcddad1c83242b50ff87329 +47,1,0,2,2,1,0,0,0,0x1b6a38c2ef5f68cf1fbf8cdbcd317212 +47,1,0,3,3,1,0,0,0,0x6738d1f3d4d0b781b76adef3f3c27610 +47,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +47,1,0,5,5,1,0,0,0,0x17e61d812d86cccad2012a725f33bcc6 +47,1,0,6,6,1,0,0,0,0xd0919e54ca9720aa3017429fe2ab6a5f +47,1,0,7,7,1,0,0,0,0x83b1d430e1cd9f75c6ca8d043c4ff754 +47,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +47,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +47,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +47,1,0,11,1,1,0,0,1,0x1058722f793a4a496baf89807ec8be5d +47,1,0,12,2,1,0,0,1,0x4709489aafe8a92dad2a3c06d368c606 +47,1,0,13,3,1,0,0,1,0xc33057c9dba6afd0670c346708090844 +47,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +47,1,0,15,5,1,0,0,1,0x07f3fb7b43dcfea29215c85359b5776d +47,1,0,16,6,1,0,0,1,0x311119627b93917afb4ae4992ac80007 +47,1,0,17,7,1,0,0,1,0x2248afaf8ab44e97f75eaab15d11b67f +47,1,0,18,0,0,1,0,0,0x76938e3185e89f9ceea889300e892bb3 +47,1,0,19,1,0,1,0,0,0x21dd0cc06a8540a7f54d7a896bb3663e +47,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +48,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +48,1,0,1,1,1,0,0,1,0x0fa6d30fefeb41e4783b8007a62e1507 +48,1,0,2,2,1,0,0,1,0xe2992df2435dbb2155611df61d62015c +48,1,0,3,3,1,0,0,1,0x24a6fb578598968a6ce3ed7bc4cd0c8c +48,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +48,1,0,5,5,1,0,0,1,0x02cd08095a81472c7c7d7f0dc1cd0df1 +48,1,0,6,6,1,0,0,1,0x2acae525244e58eddf287e736a05f6b7 +48,1,0,7,7,1,0,0,1,0xd4269f5279a82b81c565a038b1b8585a +48,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +48,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +48,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +48,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +48,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +49,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +49,1,0,1,1,1,0,0,1,0x0ddfece9317d495ad499164d60e51957 +49,1,0,2,2,1,0,0,1,0x2bb3589638308426d497d75143d552c1 +49,1,0,3,3,1,0,0,1,0x45e301d136d335cdc08f9f9257601024 +49,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +49,1,0,5,5,1,0,0,1,0x03cc803d463b7944964c1919e47e86ed +49,1,0,6,6,1,0,0,1,0x014c0a2f5c05566da149a75a3a36350a +49,1,0,7,7,1,0,0,1,0xe7f02d4958e5792b128050efdb14c0d9 +49,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +49,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +49,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +49,1,0,11,1,1,0,0,0,0x0adfaa6eba313332dcd09fef5fc728c1 +49,1,0,12,2,1,0,0,0,0xfe387b3f3ef646fd6cd1f98c95ba16eb +49,1,0,13,3,1,0,0,0,0x0f4a03bf3bd87db93669c2ef2da62831 +49,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +49,1,0,15,5,1,0,0,0,0x08725d8d3eedb88485e726b43ca53089 +49,1,0,16,6,1,0,0,0,0xaf7d3b018d9267cd5611ef3fc0fec157 +49,1,0,17,7,1,0,0,0,0x463a3b9b974b7c16c3b2a45ef53f85bd +49,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +49,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +49,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +50,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +50,1,0,1,1,1,0,0,1,0x0193aab6623bb6d198147376c33fff92 +50,1,0,2,2,1,0,0,1,0xa0bdea833e5d9f8458e87ffb50b21863 +50,1,0,3,3,1,0,0,1,0xc4b010c615614839bd8d6550f59ed817 +50,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +50,1,0,5,5,1,0,0,1,0x018724f224e5299828de0f19bb614235 +50,1,0,6,6,1,0,0,1,0x3ae522e536f506769065245f41ea10a3 +50,1,0,7,7,1,0,0,1,0x11d4c5fbbcdf660c60b81341ee97ca94 +50,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +50,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +50,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +50,1,0,11,1,1,0,0,0,0x11532e7306c69d90ad3fa02e55c1d478 +50,1,0,12,2,1,0,0,0,0x740251e82636a588e70aa10ceef71796 +50,1,0,13,3,1,0,0,0,0x86cd9de60099dd9e28e838369b4d7b96 +50,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +50,1,0,15,5,1,0,0,0,0x06de1a90a6882aa2b52cd245ac56cb19 +50,1,0,16,6,1,0,0,0,0xc3f9e7e36e26da7c2459bca548a3b98a +50,1,0,17,7,1,0,0,0,0x349b19522eefb437ecfc8fec4dbb8060 +50,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +50,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +50,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +51,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +51,1,0,1,1,1,0,0,1,0x14852fbcdcb7e4cdfdefbdf91c28a558 +51,1,0,2,2,1,0,0,1,0x4e0969f80e6e8e96307036ee09e70a46 +51,1,0,3,3,1,0,0,1,0x016d18654b233954f292d45a78cbcf43 +51,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +51,1,0,5,5,1,0,0,1,0x0386bf598def35c9799634cf511a42e8 +51,1,0,6,6,1,0,0,1,0x545ecb89f8f6256f491b9cbef7a4245d +51,1,0,7,7,1,0,0,1,0x6001727f7e1b8c3adf3fcbe4e61cbed1 +51,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +51,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +51,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +51,1,0,11,1,1,0,0,0,0x0a8454b7b460f49348bf459641f2bc5c +51,1,0,12,2,1,0,0,0,0x7cb108887391e59f55bc877ce3980ab2 +51,1,0,13,3,1,0,0,0,0x20698ea7b6361603fcd5f7714ae36b4d +51,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +51,1,0,15,5,1,0,0,0,0x12977a5be1aa9cae9a2c32ef4fababc0 +51,1,0,16,6,1,0,0,0,0x3851df2c22bfc72d33efe1a1d240171c +51,1,0,17,7,1,0,0,0,0x9525fab03ada3edee4c53df58de09de3 +51,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +51,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +51,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +52,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +52,1,0,1,1,1,0,0,1,0x17be79dcb990fc6aab0f2d6d03391579 +52,1,0,2,2,1,0,0,1,0x6c0e074d2cb6dc473f0bddc966fa2ea8 +52,1,0,3,3,1,0,0,1,0xa168bc288afd2b6d3228afce3e996202 +52,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +52,1,0,5,5,1,0,0,1,0x08d13e1310c7069c73ec1589a784d4be +52,1,0,6,6,1,0,0,1,0xf7839faddc37617774a23998570ffc46 +52,1,0,7,7,1,0,0,1,0x4896b7399c8c1bf871b46d0ba37c88b2 +52,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +52,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +52,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,18,0,0,1,0,0,0x42e70f1e35081420d8d25b8754cb10f6 +52,1,0,19,1,0,1,0,0,0x91a115fc0634e0a0b50b73b18e840692 +52,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +53,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +53,1,0,1,1,1,0,0,1,0x107fb621065ed07548ebd600928ecf1c +53,1,0,2,2,1,0,0,1,0x6ae2e1669d08e7894ed7d75582a62bf7 +53,1,0,3,3,1,0,0,1,0x38da01f60d5bdd022e4114076c231435 +53,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +53,1,0,5,5,1,0,0,1,0x052f9e5f7593f33d838e97c6c0ced958 +53,1,0,6,6,1,0,0,1,0xc96b47022cc097c428324e00710e1d3d +53,1,0,7,7,1,0,0,1,0xbf5d7ae371bcc01e16208c335d5f91b1 +53,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +53,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +53,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +53,1,0,11,1,1,0,0,0,0x0e9a5b6e0b685f54ae5b6260adfdfdfc +53,1,0,12,2,1,0,0,0,0x24876ae7b0d97e0e73ec630caa7563c8 +53,1,0,13,3,1,0,0,0,0xce21c13c5829c4f909871d8fe39e7c88 +53,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +53,1,0,15,5,1,0,0,0,0x020ad079c2c5a860f30aa46a3952c725 +53,1,0,16,6,1,0,0,0,0xf957d4827c216734d6991010fd48809c +53,1,0,17,7,1,0,0,0,0x132d6e2c56c2842a5ef22dcbb3f672fe +53,1,0,18,0,0,1,0,0,0x350c4885c9c6440cdf1cd7bd18bb43bd +53,1,0,19,1,0,1,0,0,0x203d462fdcde4f80f977dcc491d18878 +53,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +54,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +54,1,0,1,1,1,0,0,1,0x1168da6d9b95b6ed476875105447782d +54,1,0,2,2,1,0,0,1,0x906225a6a6f8ce39be6408dd62353217 +54,1,0,3,3,1,0,0,1,0x8efc7fa38423d17487191a03436dfe50 +54,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +54,1,0,5,5,1,0,0,1,0x0f6255f1a1343d5d191d7c846bd121f6 +54,1,0,6,6,1,0,0,1,0xb755240d0040ca784a243c8412cbe431 +54,1,0,7,7,1,0,0,1,0x727a7dd13b1aa42012d1f35d79816d20 +54,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +54,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +54,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +54,1,0,11,1,1,0,0,0,0x13f209fe20d1226963b39f0144206ac6 +54,1,0,12,2,1,0,0,0,0x30906f4b1ea4237b58f699bd6a2e37e0 +54,1,0,13,3,1,0,0,0,0xbe259be5cf4619ddd2f3f5c8919b811e +54,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +54,1,0,15,5,1,0,0,0,0x17818db0b4f6011c4e91b3b17fe59db6 +54,1,0,16,6,1,0,0,0,0x848feffc285dbf3dc4054aa13dc49c22 +54,1,0,17,7,1,0,0,0,0x43ff155d73ef0c0faf389bac344b19c1 +54,1,0,18,0,0,1,0,0,0x1a2b931323175972ab4962336291e20c +54,1,0,19,1,0,1,0,0,0x62ea6a50615a5e40abdc7cb2fafb0bd0 +54,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +55,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +55,1,0,1,1,1,0,0,1,0x14942e1d8eb36cf63e4b4dcba48d6ed4 +55,1,0,2,2,1,0,0,1,0x902ae2f0a5516812a69ecd6d567ccfe5 +55,1,0,3,3,1,0,0,1,0x9ad34dfdd8b72d2192d86ecac5b3f518 +55,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +55,1,0,5,5,1,0,0,1,0x15e95a1f003fe288cf7a3b5a78d93f1f +55,1,0,6,6,1,0,0,1,0x1e07841b1153165cd245b3cf2a6cfff9 +55,1,0,7,7,1,0,0,1,0x6d0a116a535bb4180047a3266fbe3ef0 +55,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +55,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +55,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +55,1,0,11,1,1,0,0,0,0x0cde620573a1acca67868a5daea3dcd6 +55,1,0,12,2,1,0,0,0,0x1c4a7d9facf854a89a080027d2a010ef +55,1,0,13,3,1,0,0,0,0x8d939e737fe189c46dd9cd795ec941dc +55,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +55,1,0,15,5,1,0,0,0,0x175e8a434a4918dbb5ebc7354cf3a5a3 +55,1,0,16,6,1,0,0,0,0xfcdc1db0f412b2531176c8a5d50e3212 +55,1,0,17,7,1,0,0,0,0x903bc5f228f652f6977a200bf9384aa3 +55,1,0,18,0,0,1,0,0,0x6bd0d902923933682acbfb5bce32f0cc +55,1,0,19,1,0,1,0,0,0x6a0343a1e028ef827ef2d8496050c88e +55,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +56,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +56,1,0,1,1,1,0,0,1,0x06886ae24528c863f23d7634626758a6 +56,1,0,2,2,1,0,0,1,0xe3e21fea06f746c2d3f9769eee1469c9 +56,1,0,3,3,1,0,0,1,0x5a1d9460259824705c48025be020a9dc +56,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +56,1,0,5,5,1,0,0,1,0x0a4b6dd4df2736b08662c9ef6f221e43 +56,1,0,6,6,1,0,0,1,0x75f1810c64d9e466ed2727a95c47e420 +56,1,0,7,7,1,0,0,1,0xf0e5e3322d99cf7179ecae9fe08617cf +56,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +56,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +56,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,18,0,0,1,0,0,0x7df91b9e0b4bae7e71c70ef38a3b3ca0 +56,1,0,19,1,0,1,0,0,0x774df1e574939f02c45474a866b15774 +56,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +57,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +57,1,0,1,1,1,0,0,1,0x0391c0a8533a514e813796e00942c51a +57,1,0,2,2,1,0,0,1,0xa3116b670b21c4130bfe7521ebd213a3 +57,1,0,3,3,1,0,0,1,0xf78ad22673d408ed408f9bd6e7c1ab66 +57,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +57,1,0,5,5,1,0,0,1,0x12cb4f970474323352a8b38fa3abc279 +57,1,0,6,6,1,0,0,1,0x0e1bdac5e58841a54f5861c8c83be9f5 +57,1,0,7,7,1,0,0,1,0x22a260a1eb61d04d7f8d07dfcaa70fa1 +57,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +57,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +57,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +57,1,0,11,1,1,0,0,0,0x0a75dbecc3edbcea64b85896fd2a7e98 +57,1,0,12,2,1,0,0,0,0x05f83c1490e739d2ec40602e43063fb6 +57,1,0,13,3,1,0,0,0,0xed839a81a2bd55ba533563a839d9e9e8 +57,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +57,1,0,15,5,1,0,0,0,0x0805445255e8302b85a20c45385fac72 +57,1,0,16,6,1,0,0,0,0x70f5860f55df9acf6748430f86880f20 +57,1,0,17,7,1,0,0,0,0x9eefda4135fd46e8291d835a2d0ef113 +57,1,0,18,0,0,1,0,0,0x7fab31577af3880a62f5c89bd212384f +57,1,0,19,1,0,1,0,0,0x99115efd2c25406834d056c2ad3293f1 +57,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +58,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +58,1,0,1,1,1,0,0,1,0x030e6217131126b9d981ed286288317b +58,1,0,2,2,1,0,0,1,0x5e8ab990b99d55807198d0b85ca93366 +58,1,0,3,3,1,0,0,1,0xea234f4353b2441116e5aeb805a20e26 +58,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +58,1,0,5,5,1,0,0,1,0x050756bb29278f13936a0dcada8e6bbe +58,1,0,6,6,1,0,0,1,0xea01d1133fd1b424397a8e8a2d901616 +58,1,0,7,7,1,0,0,1,0x6c8756c0e9db288a0d84767cc5bc62ea +58,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +58,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +58,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +58,1,0,11,1,1,0,0,0,0x0a99e52f79649485d552ea2231a89919 +58,1,0,12,2,1,0,0,0,0x612e2decde0c57c83b976f5c1eb78628 +58,1,0,13,3,1,0,0,0,0xc466d5ed915b59d32c270d5835dfa08f +58,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +58,1,0,15,5,1,0,0,0,0x12a6162df79d559842efe11759fb7dd7 +58,1,0,16,6,1,0,0,0,0x231dd1795676d90b3cdf5f6c06f26343 +58,1,0,17,7,1,0,0,0,0x7e21e2f66a3c874e0ffe95faf7e677dd +58,1,0,18,0,0,1,0,0,0x744ddb60f8522bb2b83ae55705644198 +58,1,0,19,1,0,1,0,0,0x04b2a898d17cc679a53b3cc91fc3d095 +58,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +59,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +59,1,0,1,1,1,0,0,1,0x11942daa231f72eba99c544e5829dd9f +59,1,0,2,2,1,0,0,1,0xdb300f5c7af22c7440e6bb4ee187635f +59,1,0,3,3,1,0,0,1,0xa7aa8ecbc3031ad447a8175acd4331a5 +59,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +59,1,0,5,5,1,0,0,1,0x0b18c20eb6d3edd57e6bc97ae3cd5104 +59,1,0,6,6,1,0,0,1,0x6c96db7a99108105711980af3a8273a1 +59,1,0,7,7,1,0,0,1,0xb459210ea159dcdefa1e4920c136b4a2 +59,1,0,8,0,0,1,0,0,0x00000000000000000000000000000000 +59,1,0,9,1,0,1,0,0,0x00000000000000000000000000000000 +59,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +59,1,0,11,1,1,0,0,0,0x117e5bdd7b2b44c10ee496207a66566e +59,1,0,12,2,1,0,0,0,0xcbc02b06fbdce8266a5bb37dd52700db +59,1,0,13,3,1,0,0,0,0x55fee13ba88304270191df55b7bcc43f +59,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +59,1,0,15,5,1,0,0,0,0x0b92e3c896e894506d5540f722017d19 +59,1,0,16,6,1,0,0,0,0xe7f03e0fb7a024868b2a26f0acec981c +59,1,0,17,7,1,0,0,0,0x93e933093e3c48444f8a1b56c84ebdff +59,1,0,18,0,0,1,0,0,0x7d34af5fd9f89ba1a8110918677e071d +59,1,0,19,1,0,1,0,0,0x98e47398dfe7eaab046993a63acaec4a +59,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +60,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,8,0,0,1,1,0,0x6fe244ac2c0d9a450f0ea7b52150ec1a +60,1,0,9,1,0,1,1,0,0xab164cb320e66753b76b3ee4a3602250 +60,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,18,0,0,1,1,0,0x00000000000000000000000000000000 +60,1,0,19,1,0,1,1,0,0x00000000000000000000000000000000 +60,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +61,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,8,0,0,1,0,0,0x6c2d115e8af00c218ca26bd2479b9213 +61,1,0,9,1,0,1,0,0,0xf2caccd8a5b6d137e0c0a29be8621e31 +61,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +61,1,0,11,1,1,0,0,1,0x0d38ead55758c0fb4f967a5b579e4b14 +61,1,0,12,2,1,0,0,1,0x9c4e91ce300180a34362420c4fbeff98 +61,1,0,13,3,1,0,0,1,0xce4ac72c1c81f8dc815a89c1d766ef08 +61,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +61,1,0,15,5,1,0,0,1,0x0c5802bffb47331fce4a2d893e0bb506 +61,1,0,16,6,1,0,0,1,0x584e0a65a3cc19fdb0ff50f64ff1c03e +61,1,0,17,7,1,0,0,1,0x0ac3cc678d1121087ba7df1266b1af0f +61,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +61,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +61,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +62,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,8,0,0,1,1,0,0x090b51b2b6b192963c436e5bb9367303 +62,1,0,9,1,0,1,1,0,0x6382f1da45a35db3073c3fc2a9c466c4 +62,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,11,1,1,0,1,0,0x045fc38aedcbd80d32a13a438df93f9d +62,1,0,12,2,1,0,1,0,0x1de91fb71c3ce309c40e4434fd1446f3 +62,1,0,13,3,1,0,1,0,0x4796f6c892fc252873472c582e50eaba +62,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,15,5,1,0,1,0,0x07d778fd769652b3524768fac27066be +62,1,0,16,6,1,0,1,0,0x42d68660ef73902fdca1e82c4985134d +62,1,0,17,7,1,0,1,0,0x210826aa8140a2a9bb5ca564a664b439 +62,1,0,18,0,0,1,1,0,0x00000000000000000000000000000000 +62,1,0,19,1,0,1,1,0,0x00000000000000000000000000000000 +62,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +63,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,8,0,0,1,0,0,0x150e016554f1e1639dbfeef25dcbf20b +63,1,0,9,1,0,1,0,0,0xeb29d4d962338f52ab55f21204e9e6ec +63,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +63,1,0,11,1,1,0,0,1,0x108b153e9ed3c345ba710a3dddb0548c +63,1,0,12,2,1,0,0,1,0xc5a32880494b7ee99f72105572df7b7f +63,1,0,13,3,1,0,0,1,0x4af32096689dd26a74a57aae9fab6941 +63,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +63,1,0,15,5,1,0,0,1,0x044d4adf0fc7af9ddc18a5e7b1b35a94 +63,1,0,16,6,1,0,0,1,0xa1fe3e7f62cdac9f2042dc2a958ac100 +63,1,0,17,7,1,0,0,1,0x813a0c5333c0b109285d77252dbd659c +63,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +63,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +63,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +64,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,8,0,0,1,1,0,0x0740413d1e109e63e8c793fd74c12403 +64,1,0,9,1,0,1,1,0,0x60ff8989d8df00e9cfaf2551147b6e57 +64,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,18,0,0,1,1,0,0x43e1ee29b61cb0c221fec0f296580f64 +64,1,0,19,1,0,1,1,0,0xc8db74293b0d025aaf5ec5b8357cdc7e +64,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +65,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,8,0,0,1,0,0,0x1180bbdb0004450b26437de6dd2b79ab +65,1,0,9,1,0,1,0,0,0x1dc255b7a3bd390dafc0a65c03eef9f3 +65,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +65,1,0,11,1,1,0,0,1,0x067b26b0c31eeddc0c16fe82a330f68c +65,1,0,12,2,1,0,0,1,0x61778854e82c9dec4a2b89b99b11a6e2 +65,1,0,13,3,1,0,0,1,0xb4ee838b7081d1dc744a5ba963bff93c +65,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +65,1,0,15,5,1,0,0,1,0x1065a99a5c54c5a6059906e712d8ec90 +65,1,0,16,6,1,0,0,1,0x70eebe2302ea8f21eff801fec59ac1fc +65,1,0,17,7,1,0,0,1,0xc1de74aca25055d858a23e17072c6818 +65,1,0,18,0,0,1,0,0,0x160a696b1c3bfa3092b21453a3621826 +65,1,0,19,1,0,1,0,0,0x925ff25e5d33b2a6e5f43e401632cc01 +65,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +66,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,8,0,0,1,1,0,0x567efa58c4a2ee4782fde708e72d1177 +66,1,0,9,1,0,1,1,0,0xe8d87a0e5132eaf90d730b375cfc7996 +66,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,11,1,1,0,1,0,0x03c1d7417db66cab81e44229d3d380f5 +66,1,0,12,2,1,0,1,0,0x2480ae8301b4f500d268e2fca3f0ba5e +66,1,0,13,3,1,0,1,0,0xbdda277880f8b7e67baba5a63fd8189c +66,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,15,5,1,0,1,0,0x16f02c91e2b42c2f04adb345784b8905 +66,1,0,16,6,1,0,1,0,0x85c3f84486aa913ef236ea539246c461 +66,1,0,17,7,1,0,1,0,0x94b190c7db4f6701cf92bd5dd208e6dd +66,1,0,18,0,0,1,1,0,0x0def51f849fd855a3ac81fb0f5448df7 +66,1,0,19,1,0,1,1,0,0xf32212645061038eb80b22555124c8d9 +66,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +66,0,1,1,1,0,0,1,0,0x19087b88882c5a60acd0370ea2670cd6 +66,0,1,2,2,0,0,1,0,0xca1c043fd8622b4ca22e001e047705cf +66,0,1,3,3,0,0,1,0,0x56a9eb959130b34720e25586dace6f3e +66,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +66,0,1,5,5,0,0,1,0,0x04ac5f33d09cf47d78cdf6840e915142 +66,0,1,6,6,0,0,1,0,0x1ea8b19cc1eaa37fbeb091646ddd3ddd +66,0,1,7,7,0,0,1,0,0x50e6576d459975380a5b5f3fb38f4ad5 +67,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,8,0,0,1,0,0,0x3319fe9318f21f0a64d14f8789fbb841 +67,1,0,9,1,0,1,0,0,0x6ddfd1f1337ad3e0799c4bb16093dcc3 +67,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +67,1,0,11,1,1,0,0,1,0x084e7cf2f4fb1b934879601c25e1f4b5 +67,1,0,12,2,1,0,0,1,0xdbb88c0c7ffd6307fb2bc8600a9e57a8 +67,1,0,13,3,1,0,0,1,0x5ae1525bbbdd0d8dd08c3d00a11a76b9 +67,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +67,1,0,15,5,1,0,0,1,0x047325125a817d4a3c289320bd37db63 +67,1,0,16,6,1,0,0,1,0x0fb7e638504f51a676b91eb721aec2a5 +67,1,0,17,7,1,0,0,1,0x2ffff86091f0819a9c60c25d0c902f37 +67,1,0,18,0,0,1,0,0,0x4109b04a4d92701dc7f4057674b96acf +67,1,0,19,1,0,1,0,0,0x1c30a920cab2ed2460e7b2f8d9cc4457 +67,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +68,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,8,0,0,1,1,0,0x623dc318a78594cade56979df47b6d8f +68,1,0,9,1,0,1,1,0,0x896d2201ec5e4fec2aee471546c53295 +68,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,18,0,0,1,1,0,0x7925317328128c50b4374065f6c84c11 +68,1,0,19,1,0,1,1,0,0x3f5d85055aa283adaf761c4778fe413f +68,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +69,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,8,0,0,1,0,0,0x260516a3472d2c980a7dc51869396ebb +69,1,0,9,1,0,1,0,0,0xb5b1077a6c2332a83ca4df175a2843ed +69,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +69,1,0,11,1,1,0,0,1,0x0ed2a4909b9dc7adb172d264bafd8400 +69,1,0,12,2,1,0,0,1,0xa795bf838078218d8599777390651bfc +69,1,0,13,3,1,0,0,1,0x967d363fac068f68bf6d76b02620b0a1 +69,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +69,1,0,15,5,1,0,0,1,0x1915dc6d4fffc437f984e8e1ca12476b +69,1,0,16,6,1,0,0,1,0x5e52f4cd95135d9ae7c66d7a38604c3a +69,1,0,17,7,1,0,0,1,0x666fd38ebcf2b40788664f58305a8508 +69,1,0,18,0,0,1,0,0,0x7f3a249841bf6503c1206ae5d35181ea +69,1,0,19,1,0,1,0,0,0x51ef59a48152a6ace8d713fbd9469fcd +69,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +70,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,8,0,0,1,1,0,0x19d86cd59ee93329f5a65ff5366a00f7 +70,1,0,9,1,0,1,1,0,0x7b450294d2ee641c36d2fd4aeaaac2ee +70,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,11,1,1,0,1,0,0x19ba77db0e4f767dd7daa1c46e2a1bb2 +70,1,0,12,2,1,0,1,0,0xd38da8aa11458e115f289abe6144b836 +70,1,0,13,3,1,0,1,0,0x4148731f9e7892676c6a0d3809328ac7 +70,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,15,5,1,0,1,0,0x029b0b1003b3504c83920cb5f526922f +70,1,0,16,6,1,0,1,0,0x633a19ea10f60be61f03b717d920a109 +70,1,0,17,7,1,0,1,0,0x0a2ded055862f919865808f34624eb60 +70,1,0,18,0,0,1,1,0,0x7e38ed466ec40ec1ad26b5090ec634b4 +70,1,0,19,1,0,1,1,0,0x53e7c02c1bb3e1161595ff01a39b3a07 +70,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +70,0,1,1,1,0,0,1,0,0x160a667ca0c58c56983bb188ba7dd450 +70,0,1,2,2,0,0,1,0,0xd57b8dda246f2b985c88b208b182539b +70,0,1,3,3,0,0,1,0,0x4872bd78d93871a755c89d53e68b43b6 +70,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +70,0,1,5,5,0,0,1,0,0x0115bff4f7d01e4e73fa94a6063a714e +70,0,1,6,6,0,0,1,0,0x155767aa12543a2b3fed27ab46cac35f +70,0,1,7,7,0,0,1,0,0x8e9f7a0e65a2ad8af5ba9cc814dee881 +71,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,8,0,0,1,0,0,0x1914a825c1fdd0d79bf9114a05c99aaf +71,1,0,9,1,0,1,0,0,0x66be89c1bf02d4f5118a533c4b3c1918 +71,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +71,1,0,11,1,1,0,0,1,0x1286d5d2c657a8e4fd0e49191526b0ab +71,1,0,12,2,1,0,0,1,0x3dab89197de4f932f745c5f17077d634 +71,1,0,13,3,1,0,0,1,0x0acd059a0f1b05255e2f1394be6226b2 +71,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +71,1,0,15,5,1,0,0,1,0x070b81fdc453c49b420d2feb44cb3e25 +71,1,0,16,6,1,0,0,1,0x6ff4b03ffbac14e640add32e50217a02 +71,1,0,17,7,1,0,0,1,0x7b7ef71f5764697f3714a55c98754f99 +71,1,0,18,0,0,1,0,0,0x79a8245cc6f113d595d019c1f2b32d09 +71,1,0,19,1,0,1,0,0,0x66fc21d20453a902a7a3eb9e44e9edf9 +71,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +72,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +72,1,0,1,1,1,0,0,1,0x116b3dcfaa20c4446986f45bdfb307f5 +72,1,0,2,2,1,0,0,1,0x8f18dc59e280b669ccf4e85209bb0876 +72,1,0,3,3,1,0,0,1,0xcdcb076d6f80fe64a5748a7c60c952e0 +72,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +72,1,0,5,5,1,0,0,1,0x088e7cee9f09870ca6264ec2b011ca50 +72,1,0,6,6,1,0,0,1,0xa128028a33971a5e37538447c00555d0 +72,1,0,7,7,1,0,0,1,0x2e6e17e1d82279d0e1c4554a07812a20 +72,1,0,8,0,0,1,0,0,0x02a1bda5cb8acc0f3a5a663c2123be1f +72,1,0,9,1,0,1,0,0,0x9d5ccbcf590891b3ade251ed77a59449 +72,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +72,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +72,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +73,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +73,1,0,1,1,1,0,0,1,0x17bed844c4f2dcf57c4d5f7e3bc7ba0b +73,1,0,2,2,1,0,0,1,0xb9b7c019ac0d0dcf4295e4378eef46de +73,1,0,3,3,1,0,0,1,0xfb4e40c5fd1bc5b6e5f227084b8a2313 +73,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +73,1,0,5,5,1,0,0,1,0x02f801ace819ed4273c1d397b9d48367 +73,1,0,6,6,1,0,0,1,0x4a08da3308c176397d7fe8cf647ff601 +73,1,0,7,7,1,0,0,1,0x45133859bfe88d208134e1626951dc68 +73,1,0,8,0,0,1,0,0,0x6bd7b5f742f357b3e9b89b0c32c00dd4 +73,1,0,9,1,0,1,0,0,0xb7b6d02ffbdfe2d7bbec325c3c7c5037 +73,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +73,1,0,11,1,1,0,0,0,0x192760ea6606b047289375817191655a +73,1,0,12,2,1,0,0,0,0x6817b87c2fe271035d5148e78449cb48 +73,1,0,13,3,1,0,0,0,0xee0ee9e4df34b59b99be2be7203d7e5a +73,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +73,1,0,15,5,1,0,0,0,0x1931dbc4cdc0be9324fbeb2cd377fa98 +73,1,0,16,6,1,0,0,0,0x714f2b32b7111a0ceda39711551e7361 +73,1,0,17,7,1,0,0,0,0x47c9d5bcb8e5b2e87c53f05add5f4111 +73,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +73,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +73,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +74,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +74,1,0,1,1,1,0,0,1,0x04fa5a72cad79e351189b87584bfe0b0 +74,1,0,2,2,1,0,0,1,0xc889657b3551b094ef2bdd156a1624d8 +74,1,0,3,3,1,0,0,1,0x30747819fd1b7beda92d02611bbb728d +74,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +74,1,0,5,5,1,0,0,1,0x1943d951fad5e56bfdcbc5fac1d5bd92 +74,1,0,6,6,1,0,0,1,0x8680ad6b3334eb1c55b28de3da8739a5 +74,1,0,7,7,1,0,0,1,0x4df7489661497d1732d403e5184020db +74,1,0,8,0,0,1,0,0,0x44a7aa30a53439fd3edd0aa600a12963 +74,1,0,9,1,0,1,0,0,0xe88781ec1966f9c2ec12f3bce214fb34 +74,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +74,1,0,11,1,1,0,0,0,0x162cbd5acd461fcb323019c3aaf3a402 +74,1,0,12,2,1,0,0,0,0xf4f1258542311f134c2317b365faea0e +74,1,0,13,3,1,0,0,0,0x0b767d2bcaa497bcb1f67d612bee48c4 +74,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +74,1,0,15,5,1,0,0,0,0x078e55b681ca7155a79fa6b6c4b7b3ec +74,1,0,16,6,1,0,0,0,0x5562cd56c8f7607af9947b7f952ea00c +74,1,0,17,7,1,0,0,0,0xca8ec0f39207791ec2c53f90e4a40bc7 +74,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +74,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +74,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +75,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +75,1,0,1,1,1,0,0,1,0x0aae76d900badd527ef76ab446d0b533 +75,1,0,2,2,1,0,0,1,0x91d79ae4cc1dd6259441f46b0219ec47 +75,1,0,3,3,1,0,0,1,0x7219399f189c34956c7743511d4be586 +75,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +75,1,0,5,5,1,0,0,1,0x0e5b8d7dc3c4a850c0de1bc5b37b6cb9 +75,1,0,6,6,1,0,0,1,0xe8011eaab358a6142081428bc8e7679c +75,1,0,7,7,1,0,0,1,0xb7619c67e3b5eb04b874d5a6016c5557 +75,1,0,8,0,0,1,0,0,0x3af26dc683c9628c60c4720479a02ca6 +75,1,0,9,1,0,1,0,0,0xff7f8108c7ee5677a4c762a3019f74c5 +75,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +75,1,0,11,1,1,0,0,0,0x008377aad4eb5712649a4c585b807b13 +75,1,0,12,2,1,0,0,0,0x74a45c60d8f9a22e41e102a4ba6d1807 +75,1,0,13,3,1,0,0,0,0xc7d866be582fbb880d2a137b4b8c26e3 +75,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +75,1,0,15,5,1,0,0,0,0x01ee2f2915be83ec706a5abb8b788172 +75,1,0,16,6,1,0,0,0,0x10f7dacb2c9e2a2db7907075ce8022c5 +75,1,0,17,7,1,0,0,0,0xb24b5a37f04db4f36e831ee760083bc7 +75,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +75,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +75,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +76,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +76,1,0,1,1,1,0,0,1,0x01fcc5bf0cf4a9555627edaf29bee890 +76,1,0,2,2,1,0,0,1,0x9251ca6f77899b7cf29e12f4952c0170 +76,1,0,3,3,1,0,0,1,0x5f5e2cfb3649cc2c8ae0bfff8645a97e +76,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +76,1,0,5,5,1,0,0,1,0x11eb6be19c6cba585ac9036bf897aa13 +76,1,0,6,6,1,0,0,1,0x08964c43360d5fefdab9bcdb08f08253 +76,1,0,7,7,1,0,0,1,0x60a9e40330837ee41d82e5061ce5d464 +76,1,0,8,0,0,1,0,0,0x6bbd487a2f5f549b072b4c6fc4e32bb5 +76,1,0,9,1,0,1,0,0,0xc6259f97b6dfed3bf703ee19a25e8ce9 +76,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,18,0,0,1,0,0,0x735493155ba2e91bea07b6ea93a93219 +76,1,0,19,1,0,1,0,0,0xbc7be86ff1c8cf3fafa7324b186b1d54 +76,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +77,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +77,1,0,1,1,1,0,0,1,0x06e2aa3f3e500b0565606a7d69a2711a +77,1,0,2,2,1,0,0,1,0xfc478ea45e53ebdbd24b434ccd1167d8 +77,1,0,3,3,1,0,0,1,0x0c6fbcd9573d6cb008dd70f9d2b4461d +77,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +77,1,0,5,5,1,0,0,1,0x132b124689da64ce8449defb156503b8 +77,1,0,6,6,1,0,0,1,0x4b207b9ad2bfcbf262b76b6404878ad0 +77,1,0,7,7,1,0,0,1,0xb6d1a2e4185edea6667f4f953b826860 +77,1,0,8,0,0,1,0,0,0x2aedf40ffdc51c96ea9d48c5543d88ba +77,1,0,9,1,0,1,0,0,0x7a8d6262d84649e1ed73bd84b930f107 +77,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +77,1,0,11,1,1,0,0,0,0x190a86138aebb0dc826ed5183ff96d69 +77,1,0,12,2,1,0,0,0,0x7d37b3afe591e95dfe0475505733b23e +77,1,0,13,3,1,0,0,0,0x481b0302d4047535e57a1e1bad593f0d +77,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +77,1,0,15,5,1,0,0,0,0x0de00b4ded745c4c6b26c99d6dd0fa04 +77,1,0,16,6,1,0,0,0,0x09d96b9a1bfb933a3f1e0914da787370 +77,1,0,17,7,1,0,0,0,0xcdd8e2faecb37b8faeee0d0d0f6e5195 +77,1,0,18,0,0,1,0,0,0x4ba99fcc3dd61ef7a8f1faf8ba8d477b +77,1,0,19,1,0,1,0,0,0xc7f5681d90dc4d71947fcde1510052e2 +77,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +78,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +78,1,0,1,1,1,0,0,1,0x0b5f269ffc4c2216eb3156f1bfcbdf92 +78,1,0,2,2,1,0,0,1,0x7c81f3cbc1da70c0d67c03ef573de776 +78,1,0,3,3,1,0,0,1,0x948cd6bbf5fbb995ff554a302eca3892 +78,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +78,1,0,5,5,1,0,0,1,0x143aa63523b0ca17cd2a8f85e6e561bb +78,1,0,6,6,1,0,0,1,0x4b154eb5bded28cf7966c7e7c36d89d5 +78,1,0,7,7,1,0,0,1,0x3effe98322e69921abb8d7248539095f +78,1,0,8,0,0,1,0,0,0x6976c895dc403f75856e81dc7893de86 +78,1,0,9,1,0,1,0,0,0x0608f127f82072068516717376241c56 +78,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +78,1,0,11,1,1,0,0,0,0x09952f0136015619afe6698d66457d93 +78,1,0,12,2,1,0,0,0,0x2e70f498dc94a8985b6a3135e1e9ed46 +78,1,0,13,3,1,0,0,0,0x6ef222cf414a13cc879b35cada1dfa4f +78,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +78,1,0,15,5,1,0,0,0,0x150a4a53723f5b53b48668fb8b16a9c5 +78,1,0,16,6,1,0,0,0,0x01b9213a13c81cb53214f117b750b3a0 +78,1,0,17,7,1,0,0,0,0xcabbdb126164a989724f558d9df9153c +78,1,0,18,0,0,1,0,0,0x5e6859e779650bbb9cb05b7a6ae16ccb +78,1,0,19,1,0,1,0,0,0xff632d5aa9a6716fd2fc2b9b9b80b7bd +78,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +79,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +79,1,0,1,1,1,0,0,1,0x188e934226c66332fcace3bab19b9913 +79,1,0,2,2,1,0,0,1,0xb9a1cb3cd88f122b9bd186ce4a6730ae +79,1,0,3,3,1,0,0,1,0x0dfbaffa6dea95936e6caee1e66b6293 +79,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +79,1,0,5,5,1,0,0,1,0x005406e572a441c7384d1ec89ed299a1 +79,1,0,6,6,1,0,0,1,0xa40def3583b77bd4b579b66b8f7478f3 +79,1,0,7,7,1,0,0,1,0xc7e68b53d617c9fddfa152c92150ae54 +79,1,0,8,0,0,1,0,0,0x0cff4907bb28dd768f6012cccdd21690 +79,1,0,9,1,0,1,0,0,0x7b21b51242b6a1b790e110006f9eba0c +79,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +79,1,0,11,1,1,0,0,0,0x0a4b6ade2c8734316e25d6dccbd6d6f3 +79,1,0,12,2,1,0,0,0,0x1f53f581dd2c8acf3950213a693af155 +79,1,0,13,3,1,0,0,0,0x42393e7b8acbcd1eacee7c0344806c10 +79,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +79,1,0,15,5,1,0,0,0,0x18f596d8ab0fac06b3571e7303b498b8 +79,1,0,16,6,1,0,0,0,0x2632f7dea08eff236736d67693dc4178 +79,1,0,17,7,1,0,0,0,0xe91d9a9988be680caa51299b3fefeb23 +79,1,0,18,0,0,1,0,0,0x4419456ec52d4632cabc3e8423402143 +79,1,0,19,1,0,1,0,0,0xf4f00945fee3072c3064cf012459aa3f +79,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +80,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +80,1,0,1,1,1,0,0,1,0x038a285257d3ef5ac58116cace2d78f2 +80,1,0,2,2,1,0,0,1,0xface784a00d7e2709ccfbad23279e279 +80,1,0,3,3,1,0,0,1,0xd3c645b74f4d7d7b002ccb4c270a218d +80,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +80,1,0,5,5,1,0,0,1,0x0c4cdabadbe80592b6f32df45d8fc0aa +80,1,0,6,6,1,0,0,1,0x405ebc070c0cb0a90455a379f37bec91 +80,1,0,7,7,1,0,0,1,0x2897fb2f23b0365907a498ee726a5f53 +80,1,0,8,0,0,1,0,0,0x6dd605da0340f1d8af04dd28742d8a1b +80,1,0,9,1,0,1,0,0,0xca7fe740308d98fde7f195bf6d4bb73d +80,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,18,0,0,1,0,0,0x7e66e1e27b271792aae407660e74259d +80,1,0,19,1,0,1,0,0,0xbc78ac7317e6b10e67ebf1d668b032c9 +80,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +81,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +81,1,0,1,1,1,0,0,1,0x1529fc4414f5654c9a1cbe39e1d1ac93 +81,1,0,2,2,1,0,0,1,0x655ab0d4f41888145d885294485ff1c6 +81,1,0,3,3,1,0,0,1,0xb69d159baed74653377928429b80604b +81,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +81,1,0,5,5,1,0,0,1,0x068ae9bbb990c59ee0fe73354b743415 +81,1,0,6,6,1,0,0,1,0xbf44480db3ec00ed32aaa58edea23e69 +81,1,0,7,7,1,0,0,1,0x31cbff97a95d1a212615b7664618b2d5 +81,1,0,8,0,0,1,0,0,0x6a734fce876212fe40543ec39f30061b +81,1,0,9,1,0,1,0,0,0x756b2b1b1d890c0767415004de1989a9 +81,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +81,1,0,11,1,1,0,0,0,0x060077eff2c3286ee73aeb2fb60023c9 +81,1,0,12,2,1,0,0,0,0xed9a38b4462dc447f66ef10e22797ba1 +81,1,0,13,3,1,0,0,0,0xdf815939076eb3d08e61961ce25ecb4b +81,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +81,1,0,15,5,1,0,0,0,0x00366fa3dbf9dc525d7f372ddfff902a +81,1,0,16,6,1,0,0,0,0xe2e87cc6c78d2bf60c59c03cd40201a5 +81,1,0,17,7,1,0,0,0,0x6693c8e25957403ff0adfa4b3f6b2e86 +81,1,0,18,0,0,1,0,0,0x766609d9f3a001cfdae21c43986a12cd +81,1,0,19,1,0,1,0,0,0xdd91bc56b0625ab19809fb1140248a74 +81,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +82,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +82,1,0,1,1,1,0,0,1,0x12010fff4a649d1f6a8236b26978d997 +82,1,0,2,2,1,0,0,1,0xab857480a998e7100dafb0ae38593bfc +82,1,0,3,3,1,0,0,1,0x136d23fc073e51aa4f9994478f515448 +82,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +82,1,0,5,5,1,0,0,1,0x09057271f1a5656ca5289cbdfe4b11e7 +82,1,0,6,6,1,0,0,1,0x467c0f77d7bd00b1ce90ff43862177b4 +82,1,0,7,7,1,0,0,1,0xc2539ad568d5538075276bee32dea14b +82,1,0,8,0,0,1,0,0,0x46e4744a55db0491e6c9ff32144cce8e +82,1,0,9,1,0,1,0,0,0x932c40298f5b3ac3435fd977f4c8de79 +82,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +82,1,0,11,1,1,0,0,0,0x1612e68d64a65e76e702b4c970fc6826 +82,1,0,12,2,1,0,0,0,0xa2ba2e9d2f3fd3f83d8d64613c53462e +82,1,0,13,3,1,0,0,0,0x6e65f401f85ed52369b846629762cbce +82,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +82,1,0,15,5,1,0,0,0,0x121a65380c9ad1e34b130ea673b76c14 +82,1,0,16,6,1,0,0,0,0x38bf1262a5d19845d25f73303658683f +82,1,0,17,7,1,0,0,0,0xb1261654ed02ee59330b297c69457745 +82,1,0,18,0,0,1,0,0,0x7e695e14864a7e38e1af098829b6ac3f +82,1,0,19,1,0,1,0,0,0xa394798db388789198586d2be598e4f6 +82,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +83,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +83,1,0,1,1,1,0,0,1,0x0690c6282c80223bb4f183566ca38671 +83,1,0,2,2,1,0,0,1,0xf947f5893f9249a9cfff532f4042a9d3 +83,1,0,3,3,1,0,0,1,0x02d63cbab9e7d34221c89cc30f0642f5 +83,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +83,1,0,5,5,1,0,0,1,0x195bde8dd2e93b1c4399bcd93fb59354 +83,1,0,6,6,1,0,0,1,0x09be89ec86ec6bcf67911a25e8308c2c +83,1,0,7,7,1,0,0,1,0x8c72018a020e9e3a6004d0a22be5b9cb +83,1,0,8,0,0,1,0,0,0x01212479511a0bcc67cbf8322433231d +83,1,0,9,1,0,1,0,0,0xd2417f2a180015ea6fea0e4eb5cfee1d +83,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +83,1,0,11,1,1,0,0,0,0x0182739e12648cb08f7d01e1c2f34245 +83,1,0,12,2,1,0,0,0,0x523256b43bb0809bbb0fb2f04ab8f82d +83,1,0,13,3,1,0,0,0,0xb46c99290bd2bdddb7db9f98b04f94b6 +83,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +83,1,0,15,5,1,0,0,0,0x0b8da62a7e0153ef8fef3b1657e34ef0 +83,1,0,16,6,1,0,0,0,0xbe095f3646877bcb217017e165e1ebfb +83,1,0,17,7,1,0,0,0,0xc721a076d449652894a36e1d792a186d +83,1,0,18,0,0,1,0,0,0x79c20f3225c3a2eeb10032d7431467ab +83,1,0,19,1,0,1,0,0,0x22f36f68ffd80d72ccfcede5554b6bf1 +83,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +84,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,1,1,1,0,1,0,0x03770feb2d095cd553410c8fdf8c807b +84,1,0,2,2,1,0,1,0,0xca5a557232b85540fbcf1428eaa30112 +84,1,0,3,3,1,0,1,0,0x0113369ca62988a5770f7d88647c7767 +84,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,5,5,1,0,1,0,0x09d3c882c31ff5dc4f99daf30d561951 +84,1,0,6,6,1,0,1,0,0x525150003e6bbb12e62c29f2c609808b +84,1,0,7,7,1,0,1,0,0xe780a97aea0a1a51e16374bf42896119 +84,1,0,8,0,0,1,1,0,0x004c589af93f0b2e2413f9beb36987c7 +84,1,0,9,1,0,1,1,0,0xe085dc112ff129d56e61c8098d518cd7 +84,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,18,0,0,1,1,0,0x00000000000000000000000000000000 +84,1,0,19,1,0,1,1,0,0x00000000000000000000000000000000 +84,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +84,0,1,1,1,0,0,1,0,0x065ebb879006c9fa9e1c6722245abfcd +84,0,1,2,2,0,0,1,0,0xe0f86d5f7fdba9bad31ac607aae8a904 +84,0,1,3,3,0,0,1,0,0xd900c7789917d3b1281821ea64c7e808 +84,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +84,0,1,5,5,0,0,1,0,0x151c398fb32e6f1e1fde78383434342d +84,0,1,6,6,0,0,1,0,0x15d0788164fc68a31d3943b4a6797931 +84,0,1,7,7,0,0,1,0,0x3300adc830935c47bb9568922ab7fc71 +85,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +85,1,0,1,1,1,0,0,0,0x148a9efd2ad488c088521390e3726cb9 +85,1,0,2,2,1,0,0,0,0xebde0e5f4365be7e0ff8ff6a87bc1c76 +85,1,0,3,3,1,0,0,0,0x1bb8da41078171ac00a1656abc17f596 +85,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +85,1,0,5,5,1,0,0,0,0x045114813fc2f309c41dd9368a20479e +85,1,0,6,6,1,0,0,0,0x71cc3b09d8731faa922f356c3836ae9a +85,1,0,7,7,1,0,0,0,0x4dee11bdbd76605e73e981643bd216f4 +85,1,0,8,0,0,1,0,0,0x5583fd5d7d08557536db4a4551e5497b +85,1,0,9,1,0,1,0,0,0xe13da4aac65f961d7f50dd092c2da348 +85,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +85,1,0,11,1,1,0,0,1,0x02dec77245faaccd5460f0335bf21898 +85,1,0,12,2,1,0,0,1,0x03e672995ea1c1a476504281b6dbf9cf +85,1,0,13,3,1,0,0,1,0x29e7337c597a37e828826750a7054e37 +85,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +85,1,0,15,5,1,0,0,1,0x0fa967f2a98873423f3dbcd68e621aa2 +85,1,0,16,6,1,0,0,1,0xbf18e643279482e8a3788fcd3d573cd1 +85,1,0,17,7,1,0,0,1,0x50305033b522a1edcb9a774315944b04 +85,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +85,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +85,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +86,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,1,1,1,0,1,0,0x156068e7d9f618d2d1f51f1c77d9d8c7 +86,1,0,2,2,1,0,1,0,0xe53e42da47315d89f9113fd20f343e6c +86,1,0,3,3,1,0,1,0,0x8973a75f8262e0606ca9fa17f41a9b48 +86,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,5,5,1,0,1,0,0x18c5ae7af31499e4a058e7701dad45ae +86,1,0,6,6,1,0,1,0,0xc5182dd688292482ba2b1d3276cb507c +86,1,0,7,7,1,0,1,0,0xc089007850877dbd5f14b3c56c5150d2 +86,1,0,8,0,0,1,1,0,0x019fdc1f4ccc9e522a59c2774417e046 +86,1,0,9,1,0,1,1,0,0xbd92a19df0b1538cc1810dd25fcc960c +86,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,11,1,1,0,1,0,0x0b0e768b069f1790bfa465a0dd045bda +86,1,0,12,2,1,0,1,0,0x27933d4f621c274471faabb0c1c49537 +86,1,0,13,3,1,0,1,0,0x2b7ff4a6beff8d4d571baaedc529202f +86,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,15,5,1,0,1,0,0x0bb763a2c54df2e3503a24faad42cf84 +86,1,0,16,6,1,0,1,0,0x2113d49726fa66c5b701933ff418f00d +86,1,0,17,7,1,0,1,0,0x5a4cfcbafcaf05e3daa36bcf74b3ac61 +86,1,0,18,0,0,1,1,0,0x00000000000000000000000000000000 +86,1,0,19,1,0,1,1,0,0x00000000000000000000000000000000 +86,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +86,0,1,1,1,0,0,1,0,0x13d98451b768b84b29461d90897e37c8 +86,0,1,2,2,0,0,1,0,0x9ab67e3faa7bb81fda531cbbda0dbc6e +86,0,1,3,3,0,0,1,0,0x9c897949000cd112e844f0d083e8d69e +86,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +86,0,1,5,5,0,0,1,0,0x1647266965a7561dc4a7ecf3618f4060 +86,0,1,6,6,0,0,1,0,0x84662457c771f6ec53432fcbec21cf83 +86,0,1,7,7,0,0,1,0,0xe59a9c9c0b304f9af3adf72e96e39408 +87,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +87,1,0,1,1,1,0,0,0,0x14a19ab46eab24410b588901430461c5 +87,1,0,2,2,1,0,0,0,0x2a2db637f16ad39b512d1aee9981d0f0 +87,1,0,3,3,1,0,0,0,0x13ea50b0f1c4faf383d1ac0781b11805 +87,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +87,1,0,5,5,1,0,0,0,0x03b0483b0771f8672f2549e693c0e05c +87,1,0,6,6,1,0,0,0,0xe2a09e852bb4b86adadb8bc361a4fd2c +87,1,0,7,7,1,0,0,0,0xd7d84ae13409e0beec22c2b52b384238 +87,1,0,8,0,0,1,0,0,0x1800d4389e2b02d4fb0d7c95fe53fd94 +87,1,0,9,1,0,1,0,0,0x9cd913a0744ef52ce894080c4b7b352f +87,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +87,1,0,11,1,1,0,0,1,0x17a75220556cc4711bea42b5758cc432 +87,1,0,12,2,1,0,0,1,0x46f1fa13da1993bc6d84723e56de854e +87,1,0,13,3,1,0,0,1,0x19f341e2445daadddcda1d03613dd475 +87,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +87,1,0,15,5,1,0,0,1,0x0840a0c6b613fc7c639f6267633e168f +87,1,0,16,6,1,0,0,1,0x8eaa4e5ae3ff1da4752c0f3f95b98dee +87,1,0,17,7,1,0,0,1,0xa8479861e92e6b2601f09591cf233cc6 +87,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +87,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +87,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +88,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,1,1,1,0,1,0,0x090a4dfe35bbde1acdd0803b594ba1e0 +88,1,0,2,2,1,0,1,0,0xa5d8ef3f5d665c33658528db0547994f +88,1,0,3,3,1,0,1,0,0x367b92e5d1096a514fd24d7a7be0d8bc +88,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,5,5,1,0,1,0,0x114254dd3807f86e93fc6ddc821684ec +88,1,0,6,6,1,0,1,0,0xfb5f4c9b0d0c379f84bd329c17a95e3b +88,1,0,7,7,1,0,1,0,0xeea97293b41d1b5b6551bad03a79df23 +88,1,0,8,0,0,1,1,0,0x51baeb1a18d75d255a1d7e12c294c42f +88,1,0,9,1,0,1,1,0,0xd95f33763adfa399cf0ed9b5a02753b5 +88,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,18,0,0,1,1,0,0x27d075633382681aa8e56469482cf9ec +88,1,0,19,1,0,1,1,0,0xd4b6e7391939166493538eedb28fe0ae +88,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +88,0,1,1,1,0,0,1,0,0x17439ef412ab2f302181ed4b08d66dd6 +88,0,1,2,2,0,0,1,0,0x29bc5c04f91a63d76586ea2d85d72f1e +88,0,1,3,3,0,0,1,0,0xf03e98571fbcaec34835a3383f60fd16 +88,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +88,0,1,5,5,0,0,1,0,0x166139ebd7f6182f6294b6ace56d1505 +88,0,1,6,6,0,0,1,0,0x8372bc0b562e0040c976c0314d7b8d11 +88,0,1,7,7,0,0,1,0,0x6bce3731c4094d066ae34470627fc0c9 +89,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +89,1,0,1,1,1,0,0,0,0x169f5308e9b952ba8cce081876214103 +89,1,0,2,2,1,0,0,0,0x92b7451960fd658fe699d5bd0327c219 +89,1,0,3,3,1,0,0,0,0x1d23c92dbe3b7ea7430a867271986d98 +89,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +89,1,0,5,5,1,0,0,0,0x1212636eee5caefb144ca41e48e6d0d8 +89,1,0,6,6,1,0,0,0,0xdfa0bff99c1747d7951c18bd20cf60ce +89,1,0,7,7,1,0,0,0,0x37505986ab12c2e263a6a0c97862f145 +89,1,0,8,0,0,1,0,0,0x1f46010b1bf5b223a4590396b59f328c +89,1,0,9,1,0,1,0,0,0x50c3d53e2757b6f5a48e929e3142480c +89,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +89,1,0,11,1,1,0,0,1,0x01d67c40183eb6111f09e54dca32caf3 +89,1,0,12,2,1,0,0,1,0x3a210c83d5f51182c6bb5511cb9b39c3 +89,1,0,13,3,1,0,0,1,0xec8f78786175c4065fafd8142ddb0bf4 +89,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +89,1,0,15,5,1,0,0,1,0x1667e036ea71da4e024cbd7331f2679c +89,1,0,16,6,1,0,0,1,0xbb36b48e52fd3cb8b60337727e689f16 +89,1,0,17,7,1,0,0,1,0xa9028bcabb0790b9f45d5b799388bf76 +89,1,0,18,0,0,1,0,0,0x6d7e692052b806086fc7613f59b45770 +89,1,0,19,1,0,1,0,0,0x941305deaeaef4e39c5b09764400c71e +89,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +90,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,1,1,1,0,1,0,0x1638c39e83d96ad65372674d066b84bb +90,1,0,2,2,1,0,1,0,0xf34f3edbca52b3276a229146f7e0436b +90,1,0,3,3,1,0,1,0,0x640938a285fdd3bc8b854156ebd3f2ce +90,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,5,5,1,0,1,0,0x122b94e6ae3585d7b24a779c1e860189 +90,1,0,6,6,1,0,1,0,0x8493ad9e0261979e0ada38c39bed8a10 +90,1,0,7,7,1,0,1,0,0x3c4b3d8d062e5fb40a8c6ade48697579 +90,1,0,8,0,0,1,1,0,0x147081d01adb9c7c357b89ac7628082f +90,1,0,9,1,0,1,1,0,0x022f0032a64d19bff55f1c751c8e6e92 +90,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,11,1,1,0,1,0,0x05bfc7facd8ea5b7bdba7ad7d8e50f8a +90,1,0,12,2,1,0,1,0,0xdc8fbbe2c5755134ab95c3a1c5cbb031 +90,1,0,13,3,1,0,1,0,0x228b907ca0de619766e14be7e6a51602 +90,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,15,5,1,0,1,0,0x1173349d99c2e2bfa04a813d5ee7b89d +90,1,0,16,6,1,0,1,0,0x006afdf78e364ff7d34881c1eb22cbdb +90,1,0,17,7,1,0,1,0,0x6d081a49dcb002619b2b071befd3d832 +90,1,0,18,0,0,1,1,0,0x2c29e65163bd970e696077ed2c203abd +90,1,0,19,1,0,1,1,0,0x8bd1ef5fa925bcc43077b8636220907e +90,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +90,0,1,1,1,0,0,1,0,0x0a085fb4cca1d2acf502a1ef4e0360c2 +90,0,1,2,2,0,0,1,0,0xba44d5f9de6a535c9b9e80324d86365e +90,0,1,3,3,0,0,1,0,0xa206bc4e84b9b202d95cc4007e759e65 +90,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +90,0,1,5,5,0,0,1,0,0x0595c0df90244f2ade59b89b20d09e9d +90,0,1,6,6,0,0,1,0,0x66129cb02579ce773dbeb431027f9b3d +90,0,1,7,7,0,0,1,0,0x2fce3e79559bbd8ab56a448e35fc6469 +91,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +91,1,0,1,1,1,0,0,0,0x13bee95d884420066ec86eefca57ca73 +91,1,0,2,2,1,0,0,0,0x2e610e0e98c91e69002b41c74cc724dd +91,1,0,3,3,1,0,0,0,0xfe7c264e503755bda16c9142bb1dde91 +91,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +91,1,0,5,5,1,0,0,0,0x08a45c7d112d9008348824ff3dea88bf +91,1,0,6,6,1,0,0,0,0xc5a8b013897e2d356b6c2ab4a283914e +91,1,0,7,7,1,0,0,0,0x0ec4c97655722e8d9c17c7da17d475b1 +91,1,0,8,0,0,1,0,0,0x53d6d1d007d975fb261efaa6eca97f4c +91,1,0,9,1,0,1,0,0,0x481a0d26c56dd98c4ed88efd68c3847f +91,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +91,1,0,11,1,1,0,0,1,0x0124e216b626288f966a16dc8d5334a8 +91,1,0,12,2,1,0,0,1,0x028b5d3981f02b10749cd7e4952fb250 +91,1,0,13,3,1,0,0,1,0xd46f682e876e7bf28578b6c4d5ac284c +91,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +91,1,0,15,5,1,0,0,1,0x10bfd6970dbc7203e45571b3e9a1bec1 +91,1,0,16,6,1,0,0,1,0x43d73f3452c0841f9ee49b26a84fae93 +91,1,0,17,7,1,0,0,1,0x53b4f93a8692e6141703e07634e521cf +91,1,0,18,0,0,1,0,0,0x332d1dd02341593026bd68cfd62cb5ca +91,1,0,19,1,0,1,0,0,0xde81e074ff3b6a7a075e96f6fb885d58 +91,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +92,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,1,1,1,0,1,0,0x17b047662eb819c2c15fad9d27c05410 +92,1,0,2,2,1,0,1,0,0x1569a997fc3c21b46ec01ad144c5a370 +92,1,0,3,3,1,0,1,0,0x5eead093c0a337237cbb809853227802 +92,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,5,5,1,0,1,0,0x0a9e1a3178799abcbba8c4a11db8fbb9 +92,1,0,6,6,1,0,1,0,0x10906c6a4a19c35daa03fd73a1433d5a +92,1,0,7,7,1,0,1,0,0x7ad308cb817c170ee00ff466abf68d16 +92,1,0,8,0,0,1,1,0,0x2700e39e4bfd158572e70c820601d937 +92,1,0,9,1,0,1,1,0,0xbf0334aed9a5aa0033a4febcaf91e675 +92,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,11,1,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,12,2,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,13,3,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,15,5,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,16,6,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,17,7,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,18,0,0,1,1,0,0x7d84c6c1599528b89d611b5b378d4dbf +92,1,0,19,1,0,1,1,0,0xd5bb2f464af29799b74a839cf96a6544 +92,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +92,0,1,1,1,0,0,1,0,0x0771a96df4456e063ef87e2066956953 +92,0,1,2,2,0,0,1,0,0x3e9792f5b513a05d7a21fc106577ed35 +92,0,1,3,3,0,0,1,0,0x873f1ab25a5f5a7dc4bbf6ad2d10acb7 +92,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +92,0,1,5,5,0,0,1,0,0x092c7e3db0c03c9f2a848c52ba7f8d9e +92,0,1,6,6,0,0,1,0,0x37a55e479e538c7687da18608ea59a86 +92,0,1,7,7,0,0,1,0,0x67f01d79be5e19f9d4398526edbf08da +93,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +93,1,0,1,1,1,0,0,0,0x10bc18d226a12b7178e5838d25ea0246 +93,1,0,2,2,1,0,0,0,0x60dfcd3a06909d14571ed72657ea85a3 +93,1,0,3,3,1,0,0,0,0x23d4822da63ce16ce0fb61a718db3ef0 +93,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +93,1,0,5,5,1,0,0,0,0x17cf0fdb5e32d42bbba9350ea7f3fcb7 +93,1,0,6,6,1,0,0,0,0xb876fee6bbf7129d95d7303ea1f677f2 +93,1,0,7,7,1,0,0,0,0x9946539e37d37b925b57927ee6dd193d +93,1,0,8,0,0,1,0,0,0x3cac844ea03c738155bc351e930a4479 +93,1,0,9,1,0,1,0,0,0x1aca9f97f193843d74b43c4e642f2f64 +93,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +93,1,0,11,1,1,0,0,1,0x06903195f8065dbea5498942b9054008 +93,1,0,12,2,1,0,0,1,0x1c1816ea1a6bb1f4e02467ff47264277 +93,1,0,13,3,1,0,0,1,0xf871b6f123755abf13508d1f30e0d4f4 +93,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +93,1,0,15,5,1,0,0,1,0x03daf3d89bb715921d9045f19db81144 +93,1,0,16,6,1,0,0,1,0x5b59bcb4933a555b13faab9c1016d9dd +93,1,0,17,7,1,0,0,1,0x63ffcd4501f204f35a9f3d3e3f253e71 +93,1,0,18,0,0,1,0,0,0x7b2620df2e5c7c561636647e8eb5419b +93,1,0,19,1,0,1,0,0,0xbf4c945f7405db90b603ad4313678027 +93,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +94,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,1,1,1,0,1,0,0x10bc4f811bb939507ad1e28ba1b167ca +94,1,0,2,2,1,0,1,0,0x70f3b7baca878e03b442dbd83227a6c0 +94,1,0,3,3,1,0,1,0,0xbcae3fc4e4a24a1473ceb2055de25342 +94,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,5,5,1,0,1,0,0x051cf268d231c22eafcd3fa2b439329f +94,1,0,6,6,1,0,1,0,0x82a707b9341b99c25a0f211d31d32413 +94,1,0,7,7,1,0,1,0,0xdc1b89dbe33a77351daaa452c8b158f8 +94,1,0,8,0,0,1,1,0,0x1ceec166d93841edeb5a17a6cab4d011 +94,1,0,9,1,0,1,1,0,0x38b38fd60c4d37922a5232ad45c76047 +94,1,0,10,0,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,11,1,1,0,1,0,0x0b84556c1faeb748e031ca8bbc385d68 +94,1,0,12,2,1,0,1,0,0xed072eef764612a54896eb4881abf8ef +94,1,0,13,3,1,0,1,0,0xeb54f5064d248af0b60b3d725d77e242 +94,1,0,14,4,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,15,5,1,0,1,0,0x01e1e3738f8beaa02bd98e2afdf29db5 +94,1,0,16,6,1,0,1,0,0xb3b796a0121d345feecf18e418b98631 +94,1,0,17,7,1,0,1,0,0xa8aad5bfbd55b6656005dcfd02dd2735 +94,1,0,18,0,0,1,1,0,0x7642c1818a0bb6aee91e022b7f0b335a +94,1,0,19,1,0,1,1,0,0x1932a2e9f93912978000ffb7ca542a75 +94,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +94,0,1,1,1,0,0,1,0,0x120fbd303730e89b5fb32059f6eaa300 +94,0,1,2,2,0,0,1,0,0x6633ca8f71c067451e7502f14b1bb39c +94,0,1,3,3,0,0,1,0,0x26f6fcb0d27648dce1af37035e28b77e +94,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +94,0,1,5,5,0,0,1,0,0x1356ca8145124a6e10881478550dfe3c +94,0,1,6,6,0,0,1,0,0x1eee303d280c363983d11967512b34ef +94,0,1,7,7,0,0,1,0,0x639c6e0dc54cfe5113eb1884700a13f0 +95,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +95,1,0,1,1,1,0,0,0,0x13ccd538a5eb6ca07ea0b74dbd68632b +95,1,0,2,2,1,0,0,0,0x6029e91b49a333a843972608b95c3d9f +95,1,0,3,3,1,0,0,0,0xca94337ae7fd65464b6fc721a44a8b23 +95,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +95,1,0,5,5,1,0,0,0,0x0e90a7cf88f4fecb34d3bf2704a4884c +95,1,0,6,6,1,0,0,0,0x9e8619671ae54b9cccabcb51fc6d0c10 +95,1,0,7,7,1,0,0,0,0x5e776dceafe0fe7cbaca9d236a726e98 +95,1,0,8,0,0,1,0,0,0x208de589ad2c3f6bace0d4007c12ae9f +95,1,0,9,1,0,1,0,0,0x4bfa9b9acc3f834d0de6d4aa14e98378 +95,1,0,10,0,1,0,0,1,0x00000000000000000000000000000000 +95,1,0,11,1,1,0,0,1,0x05d9ee31bca46b2bff568775704772a9 +95,1,0,12,2,1,0,0,1,0x5b66d2b77c22668196bfcbf257b7cedf +95,1,0,13,3,1,0,0,1,0x9695b31401ed1e18fd2cef33544b376e +95,1,0,14,4,1,0,0,1,0x00000000000000000000000000000000 +95,1,0,15,5,1,0,0,1,0x1589874f3d7969c72693c6576f175c5f +95,1,0,16,6,1,0,0,1,0xf6a7303902b2114b68cb7e10cd2aa7d6 +95,1,0,17,7,1,0,0,1,0xc179300140846e7c2a8ece335935c429 +95,1,0,18,0,0,1,0,0,0x7997a53d190e070ea15a7e70af03fdc8 +95,1,0,19,1,0,1,0,0,0x240eeca3e2afd59adb96d6cea8229f7b +95,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +96,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +96,1,0,1,1,1,0,0,1,0x015fd26542ba74ccf29373b13ba19c06 +96,1,0,2,2,1,0,0,1,0xf8ca93bf0aaf1af3cc4fe83a4179d015 +96,1,0,3,3,1,0,0,1,0x06938785605391613a4d73ef5bd6da0d +96,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +96,1,0,5,5,1,0,0,1,0x18e750d083cafd83c00cec4a2e059f81 +96,1,0,6,6,1,0,0,1,0x47e9ccf26bdf280f7d54707230becffc +96,1,0,7,7,1,0,0,1,0xe670946e664ae67af55d612db9ce98c5 +96,1,0,8,0,0,1,0,0,0x6654bb36c09a994647645342df9b2955 +96,1,0,9,1,0,1,0,0,0x7a3820cdf01f10a4be43dc985d3f5a18 +96,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,11,1,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,12,2,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,13,3,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,15,5,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,16,6,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,17,7,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +96,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +96,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +97,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +97,1,0,1,1,1,0,0,1,0x0dce729eb31f8e61a6c8213c427a1229 +97,1,0,2,2,1,0,0,1,0x61e4b2f1f8a93844ea98ecdff4ce46e0 +97,1,0,3,3,1,0,0,1,0x29f3f9ef7e6f72f05ab59228caefe11e +97,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +97,1,0,5,5,1,0,0,1,0x0748c3e4d2a447be59a4ccfb45862a78 +97,1,0,6,6,1,0,0,1,0x9a8fcbc5a637cdf2ed6276f6c95e4f54 +97,1,0,7,7,1,0,0,1,0x9d1a83aae4b97d047fc80c3dbfb30aa3 +97,1,0,8,0,0,1,0,0,0x63c7663cd45e894788de0679a9e895c5 +97,1,0,9,1,0,1,0,0,0xf3ad6548a8dfec78cccf622a5500efd4 +97,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +97,1,0,11,1,1,0,0,0,0x11c09bb3d2b3ce6c07d64a96658b1068 +97,1,0,12,2,1,0,0,0,0x82566d1341378d73ead39f8b5e59c654 +97,1,0,13,3,1,0,0,0,0xc49ddd53c39947d9b2e5e6188bf023b6 +97,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +97,1,0,15,5,1,0,0,0,0x121fc50c377f8f179d66621319f45e8a +97,1,0,16,6,1,0,0,0,0x6e825452292a7857c63b19869a9dd6a6 +97,1,0,17,7,1,0,0,0,0x74f2bfaa2a9c033b2d011bac39bff56c +97,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +97,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +97,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +98,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +98,1,0,1,1,1,0,0,1,0x0c6228b6e337ca26b1dfcd358c9d22f8 +98,1,0,2,2,1,0,0,1,0xc6b6c08f1b8213e2ac2a83e164169d9a +98,1,0,3,3,1,0,0,1,0xe716c28c19718dcb3fce09100a9364be +98,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +98,1,0,5,5,1,0,0,1,0x12a79fb0a5646811771922a68f91f44a +98,1,0,6,6,1,0,0,1,0x1042403ebf795b7cc95e95544a54936d +98,1,0,7,7,1,0,0,1,0x0458885c15d7b7844212d6789151ed92 +98,1,0,8,0,0,1,0,0,0x1c647040bedccd282febd448125d5344 +98,1,0,9,1,0,1,0,0,0x6ae0c64e2ea65875c28eed225e291ef0 +98,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +98,1,0,11,1,1,0,0,0,0x0ced21cd0d689ec082b936fcfd2edba4 +98,1,0,12,2,1,0,0,0,0x5c73935e126ee6f1b7f4b8d93ecb2108 +98,1,0,13,3,1,0,0,0,0xf4b45f80460d67224951f38da6c7ff1f +98,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +98,1,0,15,5,1,0,0,0,0x15f6f3dcbbd78ae84a81c9bfc168288b +98,1,0,16,6,1,0,0,0,0x6b452f85fe894c96eaf7c4b4c4a2c454 +98,1,0,17,7,1,0,0,0,0xdfcb067298b5f717d62947fe86b0a4bf +98,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +98,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +98,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +99,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +99,1,0,1,1,1,0,0,1,0x05ec17c52bd12692f75ecc8c345e8fc6 +99,1,0,2,2,1,0,0,1,0xeeaa7594013c0890caacf38d0a14dca7 +99,1,0,3,3,1,0,0,1,0x36d22d8b5594d4e653775962f40ac2f6 +99,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +99,1,0,5,5,1,0,0,1,0x12df4ee390f15df915e8488b90307267 +99,1,0,6,6,1,0,0,1,0xcfed33589c496a3b6752664ba58e861d +99,1,0,7,7,1,0,0,1,0xd5eda87858f8244444d5723a480d686d +99,1,0,8,0,0,1,0,0,0x474133d848a9ed8f3d6f27c6c877532a +99,1,0,9,1,0,1,0,0,0x836ff582cb98a2c8f9c406c6aacd3dfc +99,1,0,10,0,1,0,0,0,0x00000000000000000000000000000000 +99,1,0,11,1,1,0,0,0,0x0207ff83c09cb5f8716982a6e6e5acdc +99,1,0,12,2,1,0,0,0,0x277d359941fdb861413d7fb137ae2b8c +99,1,0,13,3,1,0,0,0,0x6bcc5a97bf32d37d653b3277365833a1 +99,1,0,14,4,1,0,0,0,0x00000000000000000000000000000000 +99,1,0,15,5,1,0,0,0,0x0f18650fbdb50ae832741d2f897f4fe6 +99,1,0,16,6,1,0,0,0,0x8319f722d340db25ddb4237663ab72b4 +99,1,0,17,7,1,0,0,0,0x3d16b47856c718d68197d97be8e2091b +99,1,0,18,0,0,1,0,0,0x00000000000000000000000000000000 +99,1,0,19,1,0,1,0,0,0x00000000000000000000000000000000 +99,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 diff --git a/prover/zkevm/prover/bls/testdata/bls_g2_add_inputs.csv b/prover/zkevm/prover/bls/testdata/bls_g2_add_inputs.csv new file mode 100644 index 0000000000..1082cbd5b8 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/bls_g2_add_inputs.csv @@ -0,0 +1,769 @@ +ID,DATA_G2_ADD,RSLT_G2_ADD,INDEX,CT,IS_FIRST_INPUT,IS_SECOND_INPUT,CIRCUIT_SELECTOR_G2_ADD,CIRCUIT_SELECTOR_C2_MEMBERSHIP,LIMB +0,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,18,2,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,19,3,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,20,4,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,21,5,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,22,6,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,23,7,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,24,8,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,25,9,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,26,10,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,27,11,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,28,12,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,29,13,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,30,14,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,31,15,0,1,1,0,0x00000000000000000000000000000000 +0,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +1,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +1,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +1,1,0,17,1,0,1,1,0,0x03116a52e9320c033d36f9480469ee12 +1,1,0,18,2,0,1,1,0,0x2fa0e92384bf71f568342c4dea8bd25f +1,1,0,19,3,0,1,1,0,0xcde9e510af6975b2a64c66cd7113fdc0 +1,1,0,20,4,0,1,1,0,0x00000000000000000000000000000000 +1,1,0,21,5,0,1,1,0,0x0ca0a10bacb428e99345733aa64c0dd4 +1,1,0,22,6,0,1,1,0,0xab547357a314686513d55b610f7fc92a +1,1,0,23,7,0,1,1,0,0xd58bc8cd125937879333ec8c396adc49 +1,1,0,24,8,0,1,1,0,0x00000000000000000000000000000000 +1,1,0,25,9,0,1,1,0,0x0710a0f327e5bee6a5fc774349e3ae59 +1,1,0,26,10,0,1,1,0,0x69f45f7506b6fc9e26e3164d3c019d90 +1,1,0,27,11,0,1,1,0,0x60f18f95cc17d75d15bc79cd896a79cc +1,1,0,28,12,0,1,1,0,0x00000000000000000000000000000000 +1,1,0,29,13,0,1,1,0,0x04e8c91f8dab74229d534af152513056 +1,1,0,30,14,0,1,1,0,0x7f8424929fe4b81eb2cf60ad1ef36d57 +1,1,0,31,15,0,1,1,0,0xf920b3993b4bfa9b4626bcde746c58e7 +1,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +1,0,1,1,1,0,0,1,0,0x03116a52e9320c033d36f9480469ee12 +1,0,1,2,2,0,0,1,0,0x2fa0e92384bf71f568342c4dea8bd25f +1,0,1,3,3,0,0,1,0,0xcde9e510af6975b2a64c66cd7113fdc0 +1,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +1,0,1,5,5,0,0,1,0,0x0ca0a10bacb428e99345733aa64c0dd4 +1,0,1,6,6,0,0,1,0,0xab547357a314686513d55b610f7fc92a +1,0,1,7,7,0,0,1,0,0xd58bc8cd125937879333ec8c396adc49 +1,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +1,0,1,9,9,0,0,1,0,0x0710a0f327e5bee6a5fc774349e3ae59 +1,0,1,10,10,0,0,1,0,0x69f45f7506b6fc9e26e3164d3c019d90 +1,0,1,11,11,0,0,1,0,0x60f18f95cc17d75d15bc79cd896a79cc +1,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +1,0,1,13,13,0,0,1,0,0x04e8c91f8dab74229d534af152513056 +1,0,1,14,14,0,0,1,0,0x7f8424929fe4b81eb2cf60ad1ef36d57 +1,0,1,15,15,0,0,1,0,0xf920b3993b4bfa9b4626bcde746c58e7 +2,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +2,1,0,17,1,0,1,1,0,0x05728c48f0949ec9a9aad8c9c06355cb +2,1,0,18,2,0,1,1,0,0x05a14aa4104da7a6850744f87038ae75 +2,1,0,19,3,0,1,1,0,0x9f13e2ae9937351160d6ec19dd322061 +2,1,0,20,4,0,1,1,0,0x00000000000000000000000000000000 +2,1,0,21,5,0,1,1,0,0x01a23b88dad085906e6d27e72258ebdf +2,1,0,22,6,0,1,1,0,0x0c822f3988e259125090a698c98a9f64 +2,1,0,23,7,0,1,1,0,0x4cadd865038ef312fd7ff1b4889c6b2f +2,1,0,24,8,0,1,1,0,0x00000000000000000000000000000000 +2,1,0,25,9,0,1,1,0,0x0d1cd5b6774292faaf53856137670599 +2,1,0,26,10,0,1,1,0,0xf722bbe1e9fdc7e29bc0bca72b158fba +2,1,0,27,11,0,1,1,0,0x72d694cd763623c80233c3c3ec786ae2 +2,1,0,28,12,0,1,1,0,0x00000000000000000000000000000000 +2,1,0,29,13,0,1,1,0,0x026ee634e309fd980603aa40d729b738 +2,1,0,30,14,0,1,1,0,0xc96ea3694419b9917a16a60ff920d709 +2,1,0,31,15,0,1,1,0,0xe60e16e23ab0a2f205a126e33ad28e56 +2,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,1,1,0,0,1,0,0x05728c48f0949ec9a9aad8c9c06355cb +2,0,1,2,2,0,0,1,0,0x05a14aa4104da7a6850744f87038ae75 +2,0,1,3,3,0,0,1,0,0x9f13e2ae9937351160d6ec19dd322061 +2,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,5,5,0,0,1,0,0x01a23b88dad085906e6d27e72258ebdf +2,0,1,6,6,0,0,1,0,0x0c822f3988e259125090a698c98a9f64 +2,0,1,7,7,0,0,1,0,0x4cadd865038ef312fd7ff1b4889c6b2f +2,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,9,9,0,0,1,0,0x0d1cd5b6774292faaf53856137670599 +2,0,1,10,10,0,0,1,0,0xf722bbe1e9fdc7e29bc0bca72b158fba +2,0,1,11,11,0,0,1,0,0x72d694cd763623c80233c3c3ec786ae2 +2,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,13,13,0,0,1,0,0x026ee634e309fd980603aa40d729b738 +2,0,1,14,14,0,0,1,0,0xc96ea3694419b9917a16a60ff920d709 +2,0,1,15,15,0,0,1,0,0xe60e16e23ab0a2f205a126e33ad28e56 +3,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +3,1,0,16,0,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,17,1,0,1,0,1,0x15f942a3ef4f9bb88e3f1a6dc27091b9 +3,1,0,18,2,0,1,0,1,0xca74155b6616f4594cf6e5687630bf33 +3,1,0,19,3,0,1,0,1,0x1dd9260a75a8bf71480e3d6b955a0dd2 +3,1,0,20,4,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,21,5,0,1,0,1,0x122a56e276e13a6de1838a872c210db8 +3,1,0,22,6,0,1,0,1,0xb973087ed41803967d3e1b592dc65a25 +3,1,0,23,7,0,1,0,1,0xb9a50f6a5bec3098a1c944b46a99461e +3,1,0,24,8,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,25,9,0,1,0,1,0x19196c90b40c380cd565fc3905130729 +3,1,0,26,10,0,1,0,1,0x746686f5eeee4eee94ccb2f7adc60cd9 +3,1,0,27,11,0,1,0,1,0xc562818f2312e814b73584416c409c93 +3,1,0,28,12,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,29,13,0,1,0,1,0x0711a2aaee92f96028d6f68262e8f84b +3,1,0,30,14,0,1,0,1,0x5cc21338f3a5f5ff1535b284f40b0444 +3,1,0,31,15,0,1,0,1,0x8c4de9528191664432e0218fd236b212 +3,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +4,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,1,1,1,0,1,0,0x109ac2ff79f3f55253fff987cec476cd +4,1,0,2,2,1,0,1,0,0x7360ab48854ca66fb5b20c552c199354 +4,1,0,3,3,1,0,1,0,0xb96204907dc00baf636c9a09edf8e60e +4,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,5,5,1,0,1,0,0x09565aa2487d08ce338f3c37efbeb3f7 +4,1,0,6,6,1,0,1,0,0xe997ca941eddb8d2c0aebe77c657eb68 +4,1,0,7,7,1,0,1,0,0x71c40090ecf9fc7754f62be7967dba1a +4,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,9,9,1,0,1,0,0x0212b1741a1b8c2d636f3ed387ebe9af +4,1,0,10,10,1,0,1,0,0x597fe66f68307db114f339dc378b6221 +4,1,0,11,11,1,0,1,0,0x6326eb33789f8b808b77d3ebe6bd65c7 +4,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,13,13,1,0,1,0,0x03718f9c31eba0017c7bfd5934d87e3c +4,1,0,14,14,1,0,1,0,0x5fa813b4321d15b07f614804b48b79db +4,1,0,15,15,1,0,1,0,0xfa42c7d951952ba9562325087794ac87 +4,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,18,2,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,19,3,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,20,4,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,21,5,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,22,6,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,23,7,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,24,8,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,25,9,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,26,10,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,27,11,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,28,12,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,29,13,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,30,14,0,1,1,0,0x00000000000000000000000000000000 +4,1,0,31,15,0,1,1,0,0x00000000000000000000000000000000 +4,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,1,1,0,0,1,0,0x109ac2ff79f3f55253fff987cec476cd +4,0,1,2,2,0,0,1,0,0x7360ab48854ca66fb5b20c552c199354 +4,0,1,3,3,0,0,1,0,0xb96204907dc00baf636c9a09edf8e60e +4,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,5,5,0,0,1,0,0x09565aa2487d08ce338f3c37efbeb3f7 +4,0,1,6,6,0,0,1,0,0xe997ca941eddb8d2c0aebe77c657eb68 +4,0,1,7,7,0,0,1,0,0x71c40090ecf9fc7754f62be7967dba1a +4,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,9,9,0,0,1,0,0x0212b1741a1b8c2d636f3ed387ebe9af +4,0,1,10,10,0,0,1,0,0x597fe66f68307db114f339dc378b6221 +4,0,1,11,11,0,0,1,0,0x6326eb33789f8b808b77d3ebe6bd65c7 +4,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,13,13,0,0,1,0,0x03718f9c31eba0017c7bfd5934d87e3c +4,0,1,14,14,0,0,1,0,0x5fa813b4321d15b07f614804b48b79db +4,0,1,15,15,0,0,1,0,0xfa42c7d951952ba9562325087794ac87 +5,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +5,1,0,1,1,1,0,1,0,0x14249e2009b16527674c5dbf6c50932c +5,1,0,2,2,1,0,1,0,0x0d3b8b0c424819f77ec443ef3a42fbe9 +5,1,0,3,3,1,0,1,0,0x5cdc35e933e19c2a931d39f95e94d91e +5,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +5,1,0,5,5,1,0,1,0,0x0a4c66ed941a627b0e4a80f1d7a3e90f +5,1,0,6,6,1,0,1,0,0x0b113b9ea68e09309a0e94d0e2cddee3 +5,1,0,7,7,1,0,1,0,0x1c9f9494b36e0757546798356d92eccc +5,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +5,1,0,9,9,1,0,1,0,0x04307534fff358ed7f50b2b25f462372 +5,1,0,10,10,1,0,1,0,0x092ee7c4ee2ab4e0abe0c295d874993d +5,1,0,11,11,1,0,1,0,0x6728a1228e5ac00f35c8ea7d3191ace3 +5,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +5,1,0,13,13,1,0,1,0,0x09c67d75f7ee9107307e22ecfe08f6d1 +5,1,0,14,14,1,0,1,0,0x7d85de788873626c55ca04d75dc494f8 +5,1,0,15,15,1,0,1,0,0x86fd12e1465a9f8c286de2cb8d0edbaa +5,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +5,1,0,17,1,0,1,1,0,0x01deaf9bda3109332f14588f78a8a3d9 +5,1,0,18,2,0,1,1,0,0x90ab0823280d6f4940c0d5b3a05d7fdc +5,1,0,19,3,0,1,1,0,0xfc4740400cdd098178356cfeaab0d1f2 +5,1,0,20,4,0,1,1,0,0x00000000000000000000000000000000 +5,1,0,21,5,0,1,1,0,0x15e5d2e0df7b440a722ba2ba0b4cb411 +5,1,0,22,6,0,1,1,0,0x38f49e721ead9b9df2abfcdbb4f6db88 +5,1,0,23,7,0,1,1,0,0x23800552a6d50d8ab1ac6df4bd62d868 +5,1,0,24,8,0,1,1,0,0x00000000000000000000000000000000 +5,1,0,25,9,0,1,1,0,0x07639c04309881350a92ff1e696a15e2 +5,1,0,26,10,0,1,1,0,0xfad3bea163a30e9b7b4e7e10b77ba0eb +5,1,0,27,11,0,1,1,0,0xdd7abcf2a744897fdd4e1d3bbfbad3f9 +5,1,0,28,12,0,1,1,0,0x00000000000000000000000000000000 +5,1,0,29,13,0,1,1,0,0x0ec1566033558a8cc2ed5bd7edd9b970 +5,1,0,30,14,0,1,1,0,0x72f45955cde4b816c86bcdd67c053b7c +5,1,0,31,15,0,1,1,0,0x1e0ab9f3e835b159c60f03817eba290b +5,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +5,0,1,1,1,0,0,1,0,0x18fc5f131436da1432824e1ae70b771e +5,0,1,2,2,0,0,1,0,0xa728d23e750dce735c8e11f58a9896c5 +5,0,1,3,3,0,0,1,0,0xb633aa6bd295148606cbf3a42b43a393 +5,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +5,0,1,5,5,0,0,1,0,0x0db1b52e3b67a0dee338382bb2a5b917 +5,0,1,6,6,0,0,1,0,0xf6add6a9d731f4478cac369622663e7e +5,0,1,7,7,0,0,1,0,0x6d5f9f822d4d6cb4b2ac0c4914cf07a4 +5,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +5,0,1,9,9,0,0,1,0,0x10ccaba0ff747fdfe160f4899da5cebf +5,0,1,10,10,0,0,1,0,0xa49a638a66b33db0a79e34c4e75977a9 +5,0,1,11,11,0,0,1,0,0x4a4a8e1bfc90ee20e311965a0486d8c0 +5,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +5,0,1,13,13,0,0,1,0,0x1162b04dc04172c3cf83fc35bee32661 +5,0,1,14,14,0,0,1,0,0x06fbbeafc427ef99b65e1522f126163c +5,0,1,15,15,0,0,1,0,0xf92dda355ad97d3816236ac5b3b2f10b +6,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,1,1,1,0,1,0,0x14a2a9aac8b1c9c1c569a9460d00a723 +6,1,0,2,2,1,0,1,0,0xfdd523d160ea4d0edd79d5b7fec82286 +6,1,0,3,3,1,0,1,0,0xac11d5fa21228a01f71976aeda8eb237 +6,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,5,5,1,0,1,0,0x03c2e893aef9574da4742a7895314cb6 +6,1,0,6,6,1,0,1,0,0xc78b83a6f880a2e4a13f96d246afbace +6,1,0,7,7,1,0,1,0,0xb13cd46d2b13c547493ad475bb29b30a +6,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,9,9,1,0,1,0,0x0718adfdd816fe5691e2af75b3bc1024 +6,1,0,10,10,1,0,1,0,0xc9411eddd2ff69f9bdff0ff10fc8d221 +6,1,0,11,11,1,0,1,0,0x51130a063abb62cd575dbeaaa88f773d +6,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,13,13,1,0,1,0,0x1754d10e91899cb45f3b72b98f62d301 +6,1,0,14,14,1,0,1,0,0x719b2dbcd5a26616feeffe853e001ecf +6,1,0,15,15,1,0,1,0,0xcd6fa3f7df24f1737bfc46da5bdb6b8b +6,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +6,1,0,17,1,0,1,1,0,0x0f32ec787d5b71e66b21a7e11412b2ff +6,1,0,18,2,0,1,1,0,0x17a00decbc70f27eb24fb49cc046bc47 +6,1,0,19,3,0,1,1,0,0x437801feb78cea20edec6b40f344a763 +6,1,0,20,4,0,1,1,0,0x00000000000000000000000000000000 +6,1,0,21,5,0,1,1,0,0x191bd4e5b166ba3f4e349b47b7f5adb0 +6,1,0,22,6,0,1,1,0,0x7f57d6cdfc4818c651bf53e4dcb96091 +6,1,0,23,7,0,1,1,0,0x7a5294ff67e97137d8ebe06b3e4ceaf9 +6,1,0,24,8,0,1,1,0,0x00000000000000000000000000000000 +6,1,0,25,9,0,1,1,0,0x0d2a0598ab573be5f753a1fe70fe2074 +6,1,0,26,10,0,1,1,0,0x4feab651201d06aac44ad73a8db8333b +6,1,0,27,11,0,1,1,0,0x5524ad0ab01c61a5a4e5482319d967e9 +6,1,0,28,12,0,1,1,0,0x00000000000000000000000000000000 +6,1,0,29,13,0,1,1,0,0x017a53fbdeebc202f7916450c21d90fb +6,1,0,30,14,0,1,1,0,0xdbfb12ce790498a780cf1a21a2c03382 +6,1,0,31,15,0,1,1,0,0x2f215b857a2d0f066d8bc913b776c313 +6,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,1,1,0,0,1,0,0x128219dc1f8d5f957aedf2c39397902a +6,0,1,2,2,0,0,1,0,0x290ddd9cfbb70c3a6c0e93d3b806b2bb +6,0,1,3,3,0,0,1,0,0x78427a782af8e9e1dfe1c3e14d9c5d82 +6,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,5,5,0,0,1,0,0x03ca947bb4715f5e81bb0391ec2865e4 +6,0,1,6,6,0,0,1,0,0x62801ee38d916a576804e196ac54af2e +6,0,1,7,7,0,0,1,0,0x45a11cc1018a695d06ffd896402db815 +6,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,9,9,0,0,1,0,0x07f4212e0902aa6db33685f8be013b20 +6,0,1,10,10,0,0,1,0,0x056e72f58317e4bf879f92c993058fb1 +6,0,1,11,11,0,0,1,0,0x52ec7115d61bb89ec27d88a6738c8b44 +6,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,13,13,0,0,1,0,0x105c45f4ba94752c6c54632af07cbf07 +6,0,1,14,14,0,0,1,0,0x14ca5665c6d95756d2cab5d30ff29c37 +6,0,1,15,15,0,0,1,0,0xf37570c9da4647b9be713d1c833e5eb7 +7,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +7,1,0,1,1,1,0,0,0,0x044803be32b2111841ee9345488aa147 +7,1,0,2,2,1,0,0,0,0x8c93f5910230c0d61671e43b7e2124d0 +7,1,0,3,3,1,0,0,0,0x7cfb4a4344bff1f0f52ca26ed365e632 +7,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +7,1,0,5,5,1,0,0,0,0x0a641900b703f0305912ada58101eb70 +7,1,0,6,6,1,0,0,0,0x7b279299017911daebbfc4e8e1e08bf2 +7,1,0,7,7,1,0,0,0,0xaf20c2e39a13410fd6f8c91b1c29dba4 +7,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +7,1,0,9,9,1,0,0,0,0x1187979bea77cbbf98e1d865eef57d52 +7,1,0,10,10,1,0,0,0,0x2e6ff023f262d3557ef9222a4965282c +7,1,0,11,11,1,0,0,0,0x7e65c48f9cdff11a4c78ffc331eaede8 +7,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +7,1,0,13,13,1,0,0,0,0x01f6c1f511244519bbff5a894d886126 +7,1,0,14,14,1,0,0,0,0x4154661f18fc27c09fd357fb567cf2cc +7,1,0,15,15,1,0,0,0,0x5e91547ece68e75270856ae65b7c65a2 +7,1,0,16,0,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,17,1,0,1,0,1,0x0b0b122478fbf63647577338c56b3630 +7,1,0,18,2,0,1,0,1,0x411c3c6215b3896c1641d9181acdffe4 +7,1,0,19,3,0,1,0,1,0x924bbd99c7e68e276877581e023492ff +7,1,0,20,4,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,21,5,0,1,0,1,0x007c0233b957a4bde78392072228571b +7,1,0,22,6,0,1,0,1,0x27a198a80702b260256af1714cd2674e +7,1,0,23,7,0,1,0,1,0x3540a63ea08176cdfba8e113e6a83faf +7,1,0,24,8,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,25,9,0,1,0,1,0x03a2e021d262a60f7e11868fd10b5017 +7,1,0,26,10,0,1,0,1,0xd55e8349c37e2e969e8ed3d26b5b8bf1 +7,1,0,27,11,0,1,0,1,0xd555f6a11fdbcdd49285fa77a3da55a0 +7,1,0,28,12,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,29,13,0,1,0,1,0x14d980eeb34baea29735b9d230b05e2f +7,1,0,30,14,0,1,0,1,0xe33700ca763e5b4d85f52a0462f8fc30 +7,1,0,31,15,0,1,0,1,0x62e2f24e554405e5d656a4847c56c443 +7,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +8,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,1,1,1,0,1,0,0x123d6ca61ff09e43d0a06338564d3646 +8,1,0,2,2,1,0,1,0,0xad96fb1af27e8a67b5a7f85c306b828f +8,1,0,3,3,1,0,1,0,0x52f30947327d9b9069b393da5da914d4 +8,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,5,5,1,0,1,0,0x05f69fec9b7b138faf092d32f20ddf62 +8,1,0,6,6,1,0,1,0,0x5d548a99ba527f56e4f06d72bc049569 +8,1,0,7,7,1,0,1,0,0x5efefb381cbffed621858c14c8d29e85 +8,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,9,9,1,0,1,0,0x1171d6be891e7a84b6412275ac509751 +8,1,0,10,10,1,0,1,0,0xdc2ba0ff225e01baf3c5825e76ba288b +8,1,0,11,11,1,0,1,0,0x5b95e67bfa57a32cf669398c2e0d3146 +8,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,13,13,1,0,1,0,0x0a8abf0623b320e7b60ee346a8fc7a82 +8,1,0,14,14,1,0,1,0,0x51d2545e3e65ccc6afbf12bbf695b416 +8,1,0,15,15,1,0,1,0,0x0bcf5d68f0001ed76cd831f48d156311 +8,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,18,2,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,19,3,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,20,4,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,21,5,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,22,6,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,23,7,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,24,8,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,25,9,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,26,10,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,27,11,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,28,12,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,29,13,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,30,14,0,1,1,0,0x00000000000000000000000000000000 +8,1,0,31,15,0,1,1,0,0x00000000000000000000000000000000 +8,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,1,1,0,0,1,0,0x123d6ca61ff09e43d0a06338564d3646 +8,0,1,2,2,0,0,1,0,0xad96fb1af27e8a67b5a7f85c306b828f +8,0,1,3,3,0,0,1,0,0x52f30947327d9b9069b393da5da914d4 +8,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,5,5,0,0,1,0,0x05f69fec9b7b138faf092d32f20ddf62 +8,0,1,6,6,0,0,1,0,0x5d548a99ba527f56e4f06d72bc049569 +8,0,1,7,7,0,0,1,0,0x5efefb381cbffed621858c14c8d29e85 +8,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,9,9,0,0,1,0,0x1171d6be891e7a84b6412275ac509751 +8,0,1,10,10,0,0,1,0,0xdc2ba0ff225e01baf3c5825e76ba288b +8,0,1,11,11,0,0,1,0,0x5b95e67bfa57a32cf669398c2e0d3146 +8,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,13,13,0,0,1,0,0x0a8abf0623b320e7b60ee346a8fc7a82 +8,0,1,14,14,0,0,1,0,0x51d2545e3e65ccc6afbf12bbf695b416 +8,0,1,15,15,0,0,1,0,0x0bcf5d68f0001ed76cd831f48d156311 +9,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +9,1,0,1,1,1,0,1,0,0x090a30afdf3b085143bcba9b05a70af8 +9,1,0,2,2,1,0,1,0,0xdf48d331cfecbddc4b427627cd9443ab +9,1,0,3,3,1,0,1,0,0x4e2234d46949122c6ee0325cbf022afe +9,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +9,1,0,5,5,1,0,1,0,0x04afee1eb8bd27b4af03841d138633f6 +9,1,0,6,6,1,0,1,0,0x81b610654a46052adfd88700b5c1d592 +9,1,0,7,7,1,0,1,0,0xecd20f379c64bf157410eb257ad18e2b +9,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +9,1,0,9,9,1,0,1,0,0x1439c4a7d94881eb5c4f6adeeec6c790 +9,1,0,10,10,1,0,1,0,0x85a1e2dec3cca5d9df8197fe6e9593c4 +9,1,0,11,11,1,0,1,0,0x8a3ca0dcacc1b2b4028934330171ce37 +9,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +9,1,0,13,13,1,0,1,0,0x0de5379d72c8b51e6c5bf60ca52a4344 +9,1,0,14,14,1,0,1,0,0x76326fbe1dcac6ac20b7e524dfa9d52b +9,1,0,15,15,1,0,1,0,0x61f5f5b0f8d509359d5cd2e4ae8497af +9,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +9,1,0,17,1,0,1,1,0,0x023aba64640ef1aff610190157a0e06a +9,1,0,18,2,0,1,1,0,0x0f344583417b6a7ecaaae82ba3dbcf2e +9,1,0,19,3,0,1,1,0,0x43e0c338fbf79dc89ae43bc5ef0714ad +9,1,0,20,4,0,1,1,0,0x00000000000000000000000000000000 +9,1,0,21,5,0,1,1,0,0x08bb46041fef40a44f90d6d14519412d +9,1,0,22,6,0,1,1,0,0x5fec307a8c8d4a0dd89d749a1d06dc4b +9,1,0,23,7,0,1,1,0,0xf4888ba5396e29646de957ccd1d7d7fd +9,1,0,24,8,0,1,1,0,0x00000000000000000000000000000000 +9,1,0,25,9,0,1,1,0,0x0788b345cd3c2ae67397332593abd3f6 +9,1,0,26,10,0,1,1,0,0xe0a2e1d1e1b8488c13f71ca6f7a43230 +9,1,0,27,11,0,1,1,0,0x64e3ddf6368619597b402e8d303edb93 +9,1,0,28,12,0,1,1,0,0x00000000000000000000000000000000 +9,1,0,29,13,0,1,1,0,0x110ec435d5ed8bc11acc25b6891a8ccf +9,1,0,30,14,0,1,1,0,0x5c816314b8ea15c3aaa0d2644613de8a +9,1,0,31,15,0,1,1,0,0xcd9e9471b0de2456c186a4a5c0e65db2 +9,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +9,0,1,1,1,0,0,1,0,0x0c6b7c9ecd7c286d15d489ed6c169823 +9,0,1,2,2,0,0,1,0,0xe74074e0111142819d22f135e780427c +9,0,1,3,3,0,0,1,0,0x63813800c28561b6ba648d4534095f35 +9,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +9,0,1,5,5,0,0,1,0,0x05b773b6b7a39fc439516104c8d7961f +9,0,1,6,6,0,0,1,0,0x1d869cfa291977e35457fcd46e5875e1 +9,0,1,7,7,0,0,1,0,0xd10069114d93356e9e0bc11b3c989d4f +9,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +9,0,1,9,9,0,0,1,0,0x06c62bf6f2ffc0fe33e2a7cc2f775c23 +9,0,1,10,10,0,0,1,0,0xcb2a21f0eddcc96470bd617ae482c892 +9,0,1,11,11,0,0,1,0,0x4a3b938d25fc4990f2ebcea3bdaceb27 +9,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +9,0,1,13,13,0,0,1,0,0x0432bb8d89327020b9cb7eb93b4897ed +9,0,1,14,14,0,0,1,0,0xf73176054e12657a11e02aa05754447f +9,0,1,15,15,0,0,1,0,0x649020a8dab74a6254e9c865c8e8b631 +10,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,1,1,1,0,1,0,0x1067dfd0078389be37c95894e3157b70 +10,1,0,2,2,1,0,1,0,0x8180f2defa2f48a66487fa58260c8279 +10,1,0,3,3,1,0,1,0,0x9b7efb76d8bb5ffaf3c9979f76b5ba08 +10,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,5,5,1,0,1,0,0x05f4378feaf395b34c7ec44b4e46dab9 +10,1,0,6,6,1,0,1,0,0xab7e7731cdb9026c65b3ceb379760a91 +10,1,0,7,7,1,0,1,0,0x298d02074b6323da202a7bfcd1af35ff +10,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,9,9,1,0,1,0,0x0eaa1898ad3255c8c2d1c3f421b8cb7e +10,1,0,10,10,1,0,1,0,0x88d3afa0396c3d3291a334554918a566 +10,1,0,11,11,1,0,1,0,0x471f07a5ba3761a8c3a04ed543234d3e +10,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,13,13,1,0,1,0,0x0af9ff315d9e195f5e828167f4b59f12 +10,1,0,14,14,1,0,1,0,0x89955b65d73ef1c60ad21c424545006c +10,1,0,15,15,1,0,1,0,0x2aec2a88d97ca84c81952f0ae57e1656 +10,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +10,1,0,17,1,0,1,1,0,0x08cec2165f2bbb9543fb25ad21a4147e +10,1,0,18,2,0,1,1,0,0x9817866c7aa1e44ebf86bd7ccc16fad7 +10,1,0,19,3,0,1,1,0,0xe9c0521cfecc9b76bd7503415a6423f1 +10,1,0,20,4,0,1,1,0,0x00000000000000000000000000000000 +10,1,0,21,5,0,1,1,0,0x12de5bd744d81c3401a0bb7a75d120cd +10,1,0,22,6,0,1,1,0,0x0a6603891cb63c87dc67f3f44d2b7391 +10,1,0,23,7,0,1,1,0,0xc65c7eb706a20e774a4de8f2e8f8b499 +10,1,0,24,8,0,1,1,0,0x00000000000000000000000000000000 +10,1,0,25,9,0,1,1,0,0x08750133b3334d05cd3e32f08dac77af +10,1,0,26,10,0,1,1,0,0x35fda74e42d1e3038e0fd87160f03e82 +10,1,0,27,11,0,1,1,0,0x97310fb6e639bbe73dccba5c9a4db3ee +10,1,0,28,12,0,1,1,0,0x00000000000000000000000000000000 +10,1,0,29,13,0,1,1,0,0x076a14be9b369e471ef116396c406145 +10,1,0,30,14,0,1,1,0,0xbbaab06baebec3e6a7a0deb837f85cbc +10,1,0,31,15,0,1,1,0,0x955153e85d513db02daf12b8f8ef343d +10,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,1,1,0,0,1,0,0x0a6f4d1bf82db568967e1b07a0ca8357 +10,0,1,2,2,0,0,1,0,0xe87d588020ccc8aee678459f53e2308b +10,0,1,3,3,0,0,1,0,0x2aa03d503d731f4cc7fab52a9bffcc55 +10,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,5,5,0,0,1,0,0x19761073df87811151bddff648089318 +10,0,1,6,6,0,0,1,0,0xf93e1681e35e0f284ad157d88938a6ef +10,0,1,7,7,0,0,1,0,0x4bc5b018c2530cf64b6b1de852a2fefe +10,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,9,9,0,0,1,0,0x0b16a9d85d3562e79fe8d13be088317c +10,0,1,10,10,0,0,1,0,0xfb5ca1f6469e5ef62bf453b4710101c2 +10,0,1,11,11,0,0,1,0,0xf93e26d49f3d0c9b28f6548d42004c6d +10,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,13,13,0,0,1,0,0x1915f3ad205554bc28d279dbf9cfe750 +10,0,1,14,14,0,0,1,0,0x64a5f646a33375aeb2201cde70e6eb99 +10,0,1,15,15,0,0,1,0,0xfbb66610f05dd1b3684c8d4053b95a9f +11,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +11,1,0,1,1,1,0,0,0,0x05ee2c48c69a7e46194cf2d694d311b2 +11,1,0,2,2,1,0,0,0,0x344e1b8f6a9c73fc9456a58f28e1c414 +11,1,0,3,3,1,0,0,0,0x2ce8f1ef9d347702912d497704a3b882 +11,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +11,1,0,5,5,1,0,0,0,0x121ee83b00eb0294c397d1dd20cf45ec +11,1,0,6,6,1,0,0,0,0x12d4e414686ef482609cf212670deac7 +11,1,0,7,7,1,0,0,0,0x68f4047785f156a1a61355b6e52a5416 +11,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +11,1,0,9,9,1,0,0,0,0x1628fdb2731496b6d6e949af188a71a9 +11,1,0,10,10,1,0,0,0,0x4710a6647a69dddb019660f266c19fd1 +11,1,0,11,11,1,0,0,0,0x5d4d8e6e5746717f8df936e87706635c +11,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +11,1,0,13,13,1,0,0,0,0x114da42f4e8ce2766c3b060745b29754 +11,1,0,14,14,1,0,0,0,0x18875fecd2ff99abd5eb019f02e5947d +11,1,0,15,15,1,0,0,0,0xbabbc46010e8c5328d239c587260d452 +11,1,0,16,0,0,1,0,1,0x00000000000000000000000000000000 +11,1,0,17,1,0,1,0,1,0x05d915a8c6ee7ac88cbbca0d317fa228 +11,1,0,18,2,0,1,0,1,0x39b12fbfcac09cdffbc7daccc768cab8 +11,1,0,19,3,0,1,0,1,0xab88b6ca4e366bbd3b139b47f37c9304 +11,1,0,20,4,0,1,0,1,0x00000000000000000000000000000000 +11,1,0,21,5,0,1,0,1,0x17550301dc15d30834fbcba01e0509a7 +11,1,0,22,6,0,1,0,1,0x812cd3d3ae759d69562958dffeb90ae1 +11,1,0,23,7,0,1,0,1,0x55ac0f1f5259d58301e1a8600e4f58bf +11,1,0,24,8,0,1,0,1,0x00000000000000000000000000000000 +11,1,0,25,9,0,1,0,1,0x1313946ca84de05c9b86f799374ee270 +11,1,0,26,10,0,1,0,1,0x3c80f6c052f3f0d086ff3eaaa8498dfc +11,1,0,27,11,0,1,0,1,0x756588d73e997f871654d63705504329 +11,1,0,28,12,0,1,0,1,0x00000000000000000000000000000000 +11,1,0,29,13,0,1,0,1,0x0b2ec4473e7ae8a18e24db275d41a79b +11,1,0,30,14,0,1,0,1,0xcb42c4afeb65c3fb6b0f113f724f1990 +11,1,0,31,15,0,1,0,1,0x3126761eb1b1d47ce3d2a6425724bd65 +11,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +12,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +12,1,0,1,1,1,0,0,1,0x018ed3430e1430b21631c6a06a56776b +12,1,0,2,2,1,0,0,1,0xf871cd54e1f48cfa66b6d07bfe94bfa9 +12,1,0,3,3,1,0,0,1,0x3fcfe37239c36272fde8a6cadbdf39eb +12,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +12,1,0,5,5,1,0,0,1,0x0eb132b0f9eda948e89cbe97a8529fa6 +12,1,0,6,6,1,0,0,1,0x28eefc2e15ca895487e4ff46b44ae6d7 +12,1,0,7,7,1,0,0,1,0x70d835fa73e38b73fe6595244b55c697 +12,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +12,1,0,9,9,1,0,0,1,0x14259b132576b29bdeebfc2a3e4a83c1 +12,1,0,10,10,1,0,0,1,0x2930a5060c08cd74981bc6a6720614c8 +12,1,0,11,11,1,0,0,1,0x9433491acf9e6c2b0714d81c642b4e67 +12,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +12,1,0,13,13,1,0,0,1,0x05b78859c3895f2add58a061cf074354 +12,1,0,14,14,1,0,0,1,0xc98e0149c3830eb97b6473d3133cc4ee +12,1,0,15,15,1,0,0,1,0x6b3ecc2ce3523174519faba8ba2083f6 +12,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,18,2,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,19,3,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,20,4,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,21,5,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,22,6,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,23,7,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,24,8,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,25,9,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,26,10,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,27,11,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,28,12,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,29,13,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,30,14,0,1,0,0,0x00000000000000000000000000000000 +12,1,0,31,15,0,1,0,0,0x00000000000000000000000000000000 +12,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +12,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +13,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,1,1,1,0,0,1,0x049a2d7223ef0286a28b304598d705c0 +13,1,0,2,2,1,0,0,1,0x96f58a0c91d768d7b41d287133f79333 +13,1,0,3,3,1,0,0,1,0x3f3ba7d4dfd9e29523ac40502116e105 +13,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,5,5,1,0,0,1,0x18d1edfc5f3ee48b59f4105965d01124 +13,1,0,6,6,1,0,0,1,0xd888f43d417a442617a95548657bc5d7 +13,1,0,7,7,1,0,0,1,0xc376c6fcc24a33371a7302ee480419e1 +13,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,9,9,1,0,0,1,0x00fc90c62e593efefd5e4558e2b18df8 +13,1,0,10,10,1,0,0,1,0xed8879ef4b98abcfa0b04a69ee84c94f +13,1,0,11,11,1,0,0,1,0xce684b3ebc65f91759753c2b5359e55c +13,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,13,13,1,0,0,1,0x0a455565c3e11d142a0d6803c5a2e7e5 +13,1,0,14,14,1,0,0,1,0xf2ee9a004c0978bf2ed6de4e81a0258a +13,1,0,15,15,1,0,0,1,0x9388a17c4f72ff308182e558062486ff +13,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,17,1,0,1,0,0,0x077e1df34c550c5ee658f3ba5fd5e301 +13,1,0,18,2,0,1,0,0,0xf689f844744425bbd157272b71847731 +13,1,0,19,3,0,1,0,0,0x68e71b3b91cd1b002fac74583054c22f +13,1,0,20,4,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,21,5,0,1,0,0,0x082f3f90e9e809a5a6efc9f400189403 +13,1,0,22,6,0,1,0,0,0xaaa3ce1bd6058b203bcc2f177b1037bd +13,1,0,23,7,0,1,0,0,0xedb8d69adf0f4f765f0d2316e693aaf1 +13,1,0,24,8,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,25,9,0,1,0,0,0x15dc0704cf2e65eb3ba775a7311f6971 +13,1,0,26,10,0,1,0,0,0xd454b58041f1e2d121031d214d67f5b9 +13,1,0,27,11,0,1,0,0,0x84f4254d17610fdfd19f717fdbe787da +13,1,0,28,12,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,29,13,0,1,0,0,0x0e272f839a936cb7b5119f4f3db7ab1a +13,1,0,30,14,0,1,0,0,0x85cb695f111bd3feb88c167e76917ea0 +13,1,0,31,15,0,1,0,0,0x805b63ca4ad09003b2bfcd604b33c295 +13,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +14,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +14,1,0,1,1,1,0,0,1,0x13b543764ef59042376290ee29d18d4a +14,1,0,2,2,1,0,0,1,0xb7a2963164db13dcf764797cfe5e6c45 +14,1,0,3,3,1,0,0,1,0x8de9a31d6458bb2377fb67bd8c79110d +14,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +14,1,0,5,5,1,0,0,1,0x012571807813b17ce52fbd5302f1788a +14,1,0,6,6,1,0,0,1,0x970e39ff518d752723432f305e8d0c01 +14,1,0,7,7,1,0,0,1,0x1e2be055ce4cf9da8d93dae9b23d08b6 +14,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +14,1,0,9,9,1,0,0,1,0x0118a44253349c98480e45a8084fffba +14,1,0,10,10,1,0,0,1,0x5cd12f2ca380ef3e5f9a2413538cafcc +14,1,0,11,11,1,0,0,1,0x7f7c6bb676b610a39027f6dc00a23c99 +14,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +14,1,0,13,13,1,0,0,1,0x0ffb567f834ff354d336da4fa02912b1 +14,1,0,14,14,1,0,0,1,0x6cb48e949da57f19b0d22cb2ecf336c6 +14,1,0,15,15,1,0,0,1,0x259f51f658b207cad49255f5dc2afce3 +14,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +14,1,0,17,1,0,1,0,0,0x1310123524756725119082b4053bb6d9 +14,1,0,18,2,0,1,0,0,0x0a16f12b0530718a5c8397a2b965bd08 +14,1,0,19,3,0,1,0,0,0xc06d4de92e0b9277f1d94c1922b4a6d9 +14,1,0,20,4,0,1,0,0,0x00000000000000000000000000000000 +14,1,0,21,5,0,1,0,0,0x14c8a346d64c4f52d6a6dcde8df6feee +14,1,0,22,6,0,1,0,0,0xed4d4ad878163f08d311a25127e5c634 +14,1,0,23,7,0,1,0,0,0x6b15057551a86b82a15773cd6826fd0e +14,1,0,24,8,0,1,0,0,0x00000000000000000000000000000000 +14,1,0,25,9,0,1,0,0,0x1532e8d437082227193752f4464d02de +14,1,0,26,10,0,1,0,0,0x8faa32019fb09920351e9c5bd0f9e846 +14,1,0,27,11,0,1,0,0,0xc51c2c18c550796eaa393e2b7ab422b1 +14,1,0,28,12,0,1,0,0,0x00000000000000000000000000000000 +14,1,0,29,13,0,1,0,0,0x0a51cd0ee9a0598e75a1954b57c6a361 +14,1,0,30,14,0,1,0,0,0x7be76102bd3843b6e63c85400970fbee +14,1,0,31,15,0,1,0,0,0xb93bbf2f85d9ce7d027e8a3ee4bb44bf +14,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +14,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +15,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,1,1,1,0,0,1,0x03ac225251a0dae79d6c0a8b0a974c74 +15,1,0,2,2,1,0,0,1,0x5bbd6cf0882b85e7b781f7a137f83747 +15,1,0,3,3,1,0,0,1,0x4884dd90558d1147a88e9863c462f1c5 +15,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,5,5,1,0,0,1,0x11adf0a8c163e47a3db79884f5a46796 +15,1,0,6,6,1,0,0,1,0xc4b496e3c9aa36f2ac562c2a4d4388c2 +15,1,0,7,7,1,0,0,1,0xead3c4b04965f0a01ca17ca17ccd20f9 +15,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,9,9,1,0,0,1,0x0a1964f9589dab85b555853fd80b2225 +15,1,0,10,10,1,0,0,1,0x67eb68cfc12e383335b780dcb26beae8 +15,1,0,11,11,1,0,0,1,0x48f7af2d967641b1c85314edc318b0a7 +15,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,13,13,1,0,0,1,0x1924ef960ca7813505f60c98942b8cd3 +15,1,0,14,14,1,0,0,1,0x63cf3daf29b744de303141e855b2e9b8 +15,1,0,15,15,1,0,0,1,0x6c7f3b0ef6bee42eb94a2cbfa5119578 +15,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,17,1,0,1,0,0,0x0a353852f343d47b9fdd11e939313240 +15,1,0,18,2,0,1,0,0,0x44db5b77adec363d765cbe91f8cd944b +15,1,0,19,3,0,1,0,0,0x0e3118218ce61a51c14e8fe0368da4ef +15,1,0,20,4,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,21,5,0,1,0,0,0x0cd0a286af5d194df59a502d7f4cc293 +15,1,0,22,6,0,1,0,0,0x655b0e01bffba20c988b65485174085d +15,1,0,23,7,0,1,0,0,0x07785c8ffd4ea49ecd7c147b4180cb28 +15,1,0,24,8,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,25,9,0,1,0,0,0x154cf28552026562aabe8e3a9cc68300 +15,1,0,26,10,0,1,0,0,0x1f5c163996710a050589a22d65ae0fa1 +15,1,0,27,11,0,1,0,0,0x7cbcdb98a56f055b65e3342f540ca8f5 +15,1,0,28,12,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,29,13,0,1,0,0,0x15569f294a026265574e6d84fbb9f5a0 +15,1,0,30,14,0,1,0,0,0x831d954cba750c7d06826825211be186 +15,1,0,31,15,0,1,0,0,0x0bacbc3ae2b809d0ee0a492670600abe +15,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 diff --git a/prover/zkevm/prover/bls/testdata/bls_g2_map_inputs.csv b/prover/zkevm/prover/bls/testdata/bls_g2_map_inputs.csv new file mode 100644 index 0000000000..1321199248 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/bls_g2_map_inputs.csv @@ -0,0 +1,97 @@ +ID,DATA_MAP_FP2_TO_G2,RSLT_MAP_FP2_TO_G2,INDEX,CT,IS_FIRST_INPUT,IS_SECOND_INPUT,CIRCUIT_SELECTOR_MAP_FP2_TO_G2,LIMB +0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +0,1,0,1,1,1,0,1,0x00000000000000000000000000000000 +0,1,0,2,2,1,0,1,0x00000000000000000000000000000000 +0,1,0,3,3,1,0,1,0x00000000000000000000000000000000 +0,1,0,4,4,1,0,1,0x00000000000000000000000000000000 +0,1,0,5,5,1,0,1,0x00000000000000000000000000000000 +0,1,0,6,6,1,0,1,0x00000000000000000000000000000000 +0,1,0,7,7,1,0,1,0x00000000000000000000000000000000 +0,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +0,0,1,1,1,0,0,1,0x018320896ec9eef9d5e619848dc29ce2 +0,0,1,2,2,0,0,1,0x66f413d02dd31d9b9d44ec0c79cd61f1 +0,0,1,3,3,0,0,1,0x8b075ddba6d7bd20b7ff27a4b324bfce +0,0,1,4,4,0,0,1,0x00000000000000000000000000000000 +0,0,1,5,5,0,0,1,0x0a67d12118b5a35bb02d2e86b3ebfa7e +0,0,1,6,6,0,0,1,0x23410db93de39fb06d7025fa95e96ffa +0,0,1,7,7,0,0,1,0x428a7a27c3ae4dd4b40bd251ac658892 +0,0,1,8,8,0,0,1,0x00000000000000000000000000000000 +0,0,1,9,9,0,0,1,0x0260e03644d1a2c321256b3246bad2b8 +0,0,1,10,10,0,0,1,0x95cad13890cbe6f85df55106a0d33460 +0,0,1,11,11,0,0,1,0x4fb143c7a042d878006271865bc35941 +0,0,1,12,12,0,0,1,0x00000000000000000000000000000000 +0,0,1,13,13,0,0,1,0x04c69777a43f0bda07679d5805e63f18 +0,0,1,14,14,0,0,1,0xcf4e0e7c6112ac7f70266d199b4f76ae +0,0,1,15,15,0,0,1,0x27c6269a3ceebdae30806e9a76aadf5c +1,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +1,1,0,1,1,1,0,1,0x00000000000000000000000000000000 +1,1,0,2,2,1,0,1,0x00000000000000000000000000000000 +1,1,0,3,3,1,0,1,0x00000000000000000000000000000000 +1,1,0,4,4,1,0,1,0x00000000000000000000000000000000 +1,1,0,5,5,1,0,1,0x08c49951c15fe92cde429f0b4f015a76 +1,1,0,6,6,1,0,1,0x2ac61a9656b17b2a00f4fde5f44de4d4 +1,1,0,7,7,1,0,1,0xcf685b44b2e6657b1b1253f1eb37e0d6 +1,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +1,0,1,1,1,0,0,1,0x119c5c7ae24858d61de8315a915845f7 +1,0,1,2,2,0,0,1,0x21292b1e16b49e919c1bc7de43b53e5d +1,0,1,3,3,0,0,1,0xb8c60c0d8bcdb17bd0721f3e0fc78070 +1,0,1,4,4,0,0,1,0x00000000000000000000000000000000 +1,0,1,5,5,0,0,1,0x02825ce28807ae99ae98fe21bae19cf8 +1,0,1,6,6,0,0,1,0x416e410d95f720001cde1ebe9bffff39 +1,0,1,7,7,0,0,1,0xc4690bb3aa9e4359d1a70554a7390402 +1,0,1,8,8,0,0,1,0x00000000000000000000000000000000 +1,0,1,9,9,0,0,1,0x1828d12269632b4d7dfaad5ded338427 +1,0,1,10,10,0,0,1,0xe1cdfc35793f678706762446c08b4cd7 +1,0,1,11,11,0,0,1,0xbab99f775d2a8eb5c095275e2b95f268 +1,0,1,12,12,0,0,1,0x00000000000000000000000000000000 +1,0,1,13,13,0,0,1,0x02176038b1bbf4ebf5d2530ad7119b95 +1,0,1,14,14,0,0,1,0xc7212fbc8763bbe84bd41414860d27db +1,0,1,15,15,0,0,1,0xe997ee8a48bd6f11466c1b560ff92f38 +2,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +2,1,0,1,1,1,0,1,0x18b66446b229c97a0973d8bcebc17390 +2,1,0,2,2,1,0,1,0x7374f4acb12710dd11598c37567324ad +2,1,0,3,3,1,0,1,0x01d20c234add65450fa52579f0ab3094 +2,1,0,4,4,1,0,1,0x00000000000000000000000000000000 +2,1,0,5,5,1,0,1,0x00000000000000000000000000000000 +2,1,0,6,6,1,0,1,0x00000000000000000000000000000000 +2,1,0,7,7,1,0,1,0x00000000000000000000000000000000 +2,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +2,0,1,1,1,0,0,1,0x0193c54fd3084b8cf3a5b7bc5fb313c7 +2,0,1,2,2,0,0,1,0x7d44e70d8ffe58c7202fe49324d6931e +2,0,1,3,3,0,0,1,0x473d78bfaa65407561503d7bd84d834d +2,0,1,4,4,0,0,1,0x00000000000000000000000000000000 +2,0,1,5,5,0,0,1,0x18fcc685867d476c8a986cda26039d7d +2,0,1,6,6,0,0,1,0xb0c7fe1f7e4a7078b8db886adf286523 +2,0,1,7,7,0,0,1,0x2f226605dc33add2c66ba27321518639 +2,0,1,8,8,0,0,1,0x00000000000000000000000000000000 +2,0,1,9,9,0,0,1,0x12649c45389ef067ec1d71dfbbedf325 +2,0,1,10,10,0,0,1,0x55a97d7f351cea7b8b0c5381798f89a6 +2,0,1,11,11,0,0,1,0xac436843b9df7ed36e0724dab3c6e8ae +2,0,1,12,12,0,0,1,0x00000000000000000000000000000000 +2,0,1,13,13,0,0,1,0x18bc5b0e2be139bc62e4672ad9d4898f +2,0,1,14,14,0,0,1,0x9788998314955a8568d30f50608c19b8 +2,0,1,15,15,0,0,1,0xdb68619af9dcb30d2ca290ac0f04ef4f +3,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,1,1,1,0,1,0x0ab43aa2a307e150c5de859ca801fbf5 +3,1,0,2,2,1,0,1,0x87e3363d34110e9ab5c27642b888faf2 +3,1,0,3,3,1,0,1,0xa31533ef1f14ba8cb972008618cea670 +3,1,0,4,4,1,0,1,0x00000000000000000000000000000000 +3,1,0,5,5,1,0,1,0x13f7d4c916157462c1cf81d0fcb8e42b +3,1,0,6,6,1,0,1,0x16ee2c6d3f7a0eb9800a3e12e125360a +3,1,0,7,7,1,0,1,0x650897a7a3b85e38f1cb3db84fb11b89 +3,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +3,0,1,1,1,0,0,1,0x14e03991c50f0d8623cb9990b843289c +3,0,1,2,2,0,0,1,0x94a5316975a4672b3f50729cb0cdd3d5 +3,0,1,3,3,0,0,1,0xd213f141ad2dcec51779868d43a0a46c +3,0,1,4,4,0,0,1,0x00000000000000000000000000000000 +3,0,1,5,5,0,0,1,0x02aab0fce3ff956f4dfdc85cdbcd4d66 +3,0,1,6,6,0,0,1,0xa332209dc4cba42dcb687406c5b3003b +3,0,1,7,7,0,0,1,0x57eb92003da704dca512367e146ad98e +3,0,1,8,8,0,0,1,0x00000000000000000000000000000000 +3,0,1,9,9,0,0,1,0x04c213bb881d53d58f4fa8082315e638 +3,0,1,10,10,0,0,1,0xb236c023f438c9cd5b086e1fc728cbc8 +3,0,1,11,11,0,0,1,0xa3f1fa39abcb1cfd0db49ee252ebf222 +3,0,1,12,12,0,0,1,0x00000000000000000000000000000000 +3,0,1,13,13,0,0,1,0x13eb8849190571f7f3091cf63bfe4752 +3,0,1,14,14,0,0,1,0x2d14c6eeb8f29bf4cea83768e46f9e6b +3,0,1,15,15,0,0,1,0x7df4cf0d2add429b01cd415e14f17f0e diff --git a/prover/zkevm/prover/bls/testdata/bls_g2_msm_inputs-0.csv b/prover/zkevm/prover/bls/testdata/bls_g2_msm_inputs-0.csv new file mode 100644 index 0000000000..304cb475c5 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/bls_g2_msm_inputs-0.csv @@ -0,0 +1,4985 @@ +ID,DATA_G2_MSM,RSLT_G2_MSM,INDEX,CT,IS_FIRST_INPUT,IS_SECOND_INPUT,CIRCUIT_SELECTOR_G2_MSM,CIRCUIT_SELECTOR_G2_MEMBERSHIP,LIMB +0,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +0,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +0,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +0,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +1,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +1,1,0,1,1,1,0,0,1,0x1296ca26bdcbf766ceb60a1c4c63aaf1 +1,1,0,2,2,1,0,0,1,0x088c2d3c5a4d4533681ad6f703e70a5d +1,1,0,3,3,1,0,0,1,0xcdc7187985e1cb5f28c5ef9621470367 +1,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +1,1,0,5,5,1,0,0,1,0x051b74f4e9cfd6eb3aa6e18d78675bd3 +1,1,0,6,6,1,0,0,1,0xc02c05fd90de3c065592626b2925fcad +1,1,0,7,7,1,0,0,1,0xa3d69e33c75a5ce3e247a00b52ce13af +1,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +1,1,0,9,9,1,0,0,1,0x0087e83ba15c6d71f14fa9c6ed1851d7 +1,1,0,10,10,1,0,0,1,0xa3022afb02facfe97f14cdd0c4fb7645 +1,1,0,11,11,1,0,0,1,0xf5f75c624957d96362f295bb79ec102a +1,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +1,1,0,13,13,1,0,0,1,0x13c2f20fc9c17332b9efe076e19a3b3e +1,1,0,14,14,1,0,0,1,0xc4f27e44564d0b143f4ab3d2e051c70f +1,1,0,15,15,1,0,0,1,0x3ed47594f59d05603db5ca114eaf35dd +1,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +1,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +1,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +1,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +2,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,1,1,1,0,1,0,0x043c51aa737b9f23846f72ca0eb32a63 +2,1,0,2,2,1,0,1,0,0xa9d8f135df5300c1939abb8313bcb166 +2,1,0,3,3,1,0,1,0,0x1e317ed307f56501c2c6a9b15155a428 +2,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,5,5,1,0,1,0,0x043e8d394d1bd45fdb014354b7d1a278 +2,1,0,6,6,1,0,1,0,0x1bf0dcd1b5a2cb106dad97969a9c000a +2,1,0,7,7,1,0,1,0,0x5807d0127d11264eab422dd28f7fe66b +2,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,9,9,1,0,1,0,0x0219176e2e4cc52c66a93c1150fc8198 +2,1,0,10,10,1,0,1,0,0xbc64a9d1d409ca9745a7b7746a42872f +2,1,0,11,11,1,0,1,0,0xdbeef7b8edf0b88058c8bb469135602e +2,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +2,1,0,13,13,1,0,1,0,0x00aa9b5822b35cbe21f0895fa4eb644f +2,1,0,14,14,1,0,1,0,0xfbf80f72c0a8d360ea3ce3ad75ed95f7 +2,1,0,15,15,1,0,1,0,0x7e4be60b9bc6c5dd9e495719d9964092 +2,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +2,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +2,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +3,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +3,1,0,1,1,1,0,0,1,0x11aaac40436fcaf735273316344b22f7 +3,1,0,2,2,1,0,0,1,0xe5eefc63a887399c727aad2ea641e3d1 +3,1,0,3,3,1,0,0,1,0xbad40889bd7728ac7053417778aa9001 +3,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +3,1,0,5,5,1,0,0,1,0x05d6b93a2b5abd187a26b5e695c72859 +3,1,0,6,6,1,0,0,1,0x171399f486fdf57050f7b7a75680b416 +3,1,0,7,7,1,0,0,1,0xa61523771a44c14843913445ee098691 +3,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +3,1,0,9,9,1,0,0,1,0x01a9fe9bc2dab0f2e6b35e9776723479 +3,1,0,10,10,1,0,0,1,0xdc1514799422259c8ee5787aff67c7ad +3,1,0,11,11,1,0,0,1,0x7eb3dfd04f30f37f35b10124482d08a3 +3,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +3,1,0,13,13,1,0,0,1,0x0c797f5a5bbf78e1a2e5bcd3a4345040 +3,1,0,14,14,1,0,0,1,0x484141a3d64d123c1b9da37e6756dcb2 +3,1,0,15,15,1,0,0,1,0xa9ad20307284515028b052a7effce932 +3,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +3,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +3,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +3,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +4,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +4,1,0,16,0,0,1,1,0,0x295c19ee7e7fd56d6db8e446446adac9 +4,1,0,17,1,0,1,1,0,0x83d46875cf0c61525bac1124f93ea7d4 +4,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +5,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +5,1,0,1,1,1,0,0,1,0x10d7a19bdb0a3537391e2e28c4a95517 +5,1,0,2,2,1,0,0,1,0xdc3c6b259c91b591a485abe27249facb +5,1,0,3,3,1,0,0,1,0x331d5846b9126bc6852dc85e5be7495c +5,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +5,1,0,5,5,1,0,0,1,0x129f3b8d984eba7de45342664d638d0e +5,1,0,6,6,1,0,0,1,0x79642d0e34f81af89e037ea329615b23 +5,1,0,7,7,1,0,0,1,0x5c1db1f07cf3e632ba5c5182043e2317 +5,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +5,1,0,9,9,1,0,0,1,0x1037fe5d1c06af3f54e79ee4fa9603ff +5,1,0,10,10,1,0,0,1,0x434c84015a2d5adf4b1a241a37fc8589 +5,1,0,11,11,1,0,0,1,0x34e36366b842760c29d01db70b760fc6 +5,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +5,1,0,13,13,1,0,0,1,0x060758aae68ec06b7ef5989bf1b5a041 +5,1,0,14,14,1,0,0,1,0x17ad47547eee82e3f92cc3801baa31ad +5,1,0,15,15,1,0,0,1,0x0bab0757854f790f4e8e0a01265d9682 +5,1,0,16,0,0,1,0,0,0x0bb45708227e2ec93811f095bc9af8e9 +5,1,0,17,1,0,1,0,0,0xf5a2e51745daed1b911e337dbcce90f6 +5,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +5,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +6,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,1,1,1,0,1,0,0x068f8c580d7b24a77302d196e73370b4 +6,1,0,2,2,1,0,1,0,0x983ae8c50f652a042d8dbc97dc1ff716 +6,1,0,3,3,1,0,1,0,0x2491709762a5141100a8ebf7d62a469c +6,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,5,5,1,0,1,0,0x15e4c2e0e4df294253ed324859b50517 +6,1,0,6,6,1,0,1,0,0x5618e068aef8f3b47a996e534932a838 +6,1,0,7,7,1,0,1,0,0x36f5370f51af7655c52d5d309350b584 +6,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,9,9,1,0,1,0,0x0fd43fed78f346758ee479a7a6c67005 +6,1,0,10,10,1,0,1,0,0x05f5e8a5c0315fd48f5d837c38fa9a12 +6,1,0,11,11,1,0,1,0,0x81b8e05e1958d3e6b1a0c24620d4e1ff +6,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +6,1,0,13,13,1,0,1,0,0x197e6cb583158b7124ff525e1d2e99ed +6,1,0,14,14,1,0,1,0,0x701edf9739b1bdfc20795e10ada91dd5 +6,1,0,15,15,1,0,1,0,0xb7a4562b0148be2b4a747e184c661076 +6,1,0,16,0,0,1,1,0,0x4936f4f8340f1275f638c0e9f95ae074 +6,1,0,17,1,0,1,1,0,0x696a3b0e9d42ad8ec6e5948f83a8df31 +6,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,1,1,0,0,1,0,0x19cdf82c0c50d40067eab695893c2668 +6,0,1,2,2,0,0,1,0,0x11884a75afcfc6439efcfa951e92c1f1 +6,0,1,3,3,0,0,1,0,0xab0724a19d94c44c8ad127853473992c +6,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,5,5,0,0,1,0,0x11ae83cd09d564e76f999042fea59345 +6,0,1,6,6,0,0,1,0,0x5a96007aaaaf5f041895f82f875bfcc8 +6,0,1,7,7,0,0,1,0,0x844f3cd8e51725fedd6f4b72365abf16 +6,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,9,9,0,0,1,0,0x14d44ed3aff265235374db2d8cd5f941 +6,0,1,10,10,0,0,1,0,0x2a2da329764baf0939c0a23e4e26f316 +6,0,1,11,11,0,0,1,0,0x9b038dea222dcd9ae9151637271669d0 +6,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +6,0,1,13,13,0,0,1,0,0x0f7a73ae49b01bab3814ef748d988667 +6,0,1,14,14,0,0,1,0,0x8defc43166cbbe7d2a46ae013fbbd257 +6,0,1,15,15,0,0,1,0,0x94e310c8d5e06575a533c90687c783ae +7,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +7,1,0,1,1,1,0,0,1,0x034cfb79f20b087ac662b97571ead75b +7,1,0,2,2,1,0,0,1,0x3235109e12944eb04a644537b3eb1f5d +7,1,0,3,3,1,0,0,1,0x20369cfc94f31745264bf677b2eaae53 +7,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +7,1,0,5,5,1,0,0,1,0x1608c285de77badc2bb92ab5ea2364bb +7,1,0,6,6,1,0,0,1,0x8bdb66ab94e79f63cf3ce2dba46a2ab4 +7,1,0,7,7,1,0,0,1,0x053026a7c6b6bb0444673e1dbb7d895a +7,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +7,1,0,9,9,1,0,0,1,0x16bfc6b0c1c43e0287e8b49549f5eb3f +7,1,0,10,10,1,0,0,1,0xd1745bc68f936d3596e703faa6892f4f +7,1,0,11,11,1,0,0,1,0x5189ac1595bc6310680a5943cba459e1 +7,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +7,1,0,13,13,1,0,0,1,0x0369c198511589140e4ca5e056c8237e +7,1,0,14,14,1,0,0,1,0x5ca0bad7b6be46ca7dae008cf8f21f06 +7,1,0,15,15,1,0,0,1,0xde3f3d2ba46c9ff8a66c1a73097a0768 +7,1,0,16,0,0,1,0,0,0x355249cc156be4988a0d522270bae378 +7,1,0,17,1,0,1,0,0,0xdbd808c294188377bb80c87ea66b1da7 +7,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +7,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +8,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +8,1,0,16,0,0,1,1,0,0x7bc47e3f935d6101404f2cc68ff28b5d +8,1,0,17,1,0,1,1,0,0x78f41dda72086e65df8ba6610e641cef +8,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +8,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +9,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +9,1,0,1,1,1,0,0,1,0x0e190dbe037656da5dda881b28d77588 +9,1,0,2,2,1,0,0,1,0xd50fa2128884803edeec0bdebcef44b5 +9,1,0,3,3,1,0,0,1,0xfaf15577236b13f3089131e2972bc57e +9,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +9,1,0,5,5,1,0,0,1,0x145eae2448e9cd377700ad1623564cc8 +9,1,0,6,6,1,0,0,1,0xcbb2d9afea1a4c8d6d979787e12dbd30 +9,1,0,7,7,1,0,0,1,0xb18d4a6721641bcfbb3ae9f0d3efc40e +9,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +9,1,0,9,9,1,0,0,1,0x0aafd12df3cef62390ec6b2e7eaa5d16 +9,1,0,10,10,1,0,0,1,0xeca7c4bf181bcd879462f88ebd989d48 +9,1,0,11,11,1,0,0,1,0x7735b1a2ef5f7d012553953111861168 +9,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +9,1,0,13,13,1,0,0,1,0x1630d8cf71e7c3caa168e5c026456fb7 +9,1,0,14,14,1,0,0,1,0x1fbd4864cfa2ee9d3a3d2c3b25a9048a +9,1,0,15,15,1,0,0,1,0x8999256e01099f434b9ed398744874fd +9,1,0,16,0,0,1,0,0,0x7ed52b858423f58126f21e6ba6012518 +9,1,0,17,1,0,1,0,0,0xff239fbe6cc3bad6c2d88de9995ca881 +9,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +9,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +10,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,1,1,1,0,1,0,0x058d37c1a18ee30db5c48b5e7cd34079 +10,1,0,2,2,1,0,1,0,0xb5bc1d8e787b28c3d94777879f33f2d5 +10,1,0,3,3,1,0,1,0,0x6033c747f93a911187392196c4fad513 +10,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,5,5,1,0,1,0,0x0501fc1db037067bafa510bf925aa73a +10,1,0,6,6,1,0,1,0,0xb1b52620e8ad699cc6198638ec851758 +10,1,0,7,7,1,0,1,0,0xd0cf7ea5988ffd01c55f52c67fb8898a +10,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,9,9,1,0,1,0,0x17d9ca569c49c6bceb00f3051d2b93d1 +10,1,0,10,10,1,0,1,0,0xead6684f9d59045270c9dc57d6ef9925 +10,1,0,11,11,1,0,1,0,0x927fdb646cb4553a21c4872293034551 +10,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +10,1,0,13,13,1,0,1,0,0x006c7289d108571e5db72a117c753e1a +10,1,0,14,14,1,0,1,0,0xb9b54c86f3182c4c491c15d63a41a533 +10,1,0,15,15,1,0,1,0,0x412b31882f813701775f4f4d6c3f191e +10,1,0,16,0,0,1,1,0,0x7f947e8446a82df13c0bee70088a04f1 +10,1,0,17,1,0,1,1,0,0xd2eb33d3f863aa6e9fc1d6f02a035d9d +10,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,1,1,0,0,1,0,0x01bbe4b568c311cc7bc3f2d7afe08a66 +10,0,1,2,2,0,0,1,0,0x81458a23f02887463c2d15e07211d935 +10,0,1,3,3,0,0,1,0,0xdbbe30cc5fba44c0c1a77b636c7ea16e +10,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,5,5,0,0,1,0,0x19b2a911442067b23520236d95669168 +10,0,1,6,6,0,0,1,0,0xa64edb92ad398ae81b866df61b236bcf +10,0,1,7,7,0,0,1,0,0x8745a2f1810315d08bc17827082129ae +10,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,9,9,0,0,1,0,0x0b00c1d9c764bb6a5d435b41da6ea950 +10,0,1,10,10,0,0,1,0,0x7735c10a87dd2f9f13b13496fefb1c3c +10,0,1,11,11,0,0,1,0,0xaedccaf74d78d1a372ce490485d68672 +10,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +10,0,1,13,13,0,0,1,0,0x1272a7e7adbcac1717c5b6f399b2607c +10,0,1,14,14,0,0,1,0,0x845a70be671644f4bbbe4d0d7f699ca4 +10,0,1,15,15,0,0,1,0,0xd890103680efc84c23828c7821413fce +11,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +11,1,0,1,1,1,0,0,1,0x0e88003d37d37fc415431ee42a6fceb8 +11,1,0,2,2,1,0,0,1,0x02b08847e18ba3218600c100ed084e77 +11,1,0,3,3,1,0,0,1,0x855dcddbca5fb5a0a6c530a70c122309 +11,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +11,1,0,5,5,1,0,0,1,0x0aca0e3c27b927e7dcb37b689b786157 +11,1,0,6,6,1,0,0,1,0x6b26de3a52f4c8eac49ca56abc51d40e +11,1,0,7,7,1,0,0,1,0xd703d42daa54447c8054d68a37a9cf0e +11,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +11,1,0,9,9,1,0,0,1,0x05841da97567f65298c8361fc0780ec7 +11,1,0,10,10,1,0,0,1,0x9327282f78df1661fcaa9b2982388ec9 +11,1,0,11,11,1,0,0,1,0x21aca70acbabf9e3adc36dab2d4405cb +11,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +11,1,0,13,13,1,0,0,1,0x0868ed5c3c7dcfbc4924c7757e535e43 +11,1,0,14,14,1,0,0,1,0x5b6ebbd2c827b73c37965b5dc7ae246b +11,1,0,15,15,1,0,0,1,0x49962a32395950cf27b71684c76c3ee7 +11,1,0,16,0,0,1,0,0,0x75332fb8a6d75f0d4957168a30f95bc5 +11,1,0,17,1,0,1,0,0,0xd31f3d2096007049004802e3c826fe12 +11,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +11,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +12,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +12,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +12,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +12,1,0,34,0,0,1,1,0,0x00000000000000000000000000000000 +12,1,0,35,1,0,1,1,0,0x00000000000000000000000000000000 +12,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +12,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +13,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +13,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,19,1,1,0,0,1,0x05b8dd3564b5d1a9e879bf1c323131c5 +13,1,0,20,2,1,0,0,1,0x449c414b9eee0be49bffb7ccf5333042 +13,1,0,21,3,1,0,0,1,0xd986a9a4b2c892ab5bec076c86e8727a +13,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,23,5,1,0,0,1,0x12a75bbb11f67d9a99f7a9bb8bf99aa6 +13,1,0,24,6,1,0,0,1,0x647c6a819d09b5125381dfc941d8484a +13,1,0,25,7,1,0,0,1,0xbd55c6a28ddf9890774717d31f0feb34 +13,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,27,9,1,0,0,1,0x0da30cbade62b83d9ecd300a6b13717d +13,1,0,28,10,1,0,0,1,0x54597d13888fb4bd18d10ff7b5aafe02 +13,1,0,29,11,1,0,0,1,0x20117f102f6b922809c72a7d2528bfc5 +13,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,31,13,1,0,0,1,0x0764810e94dda43124da0e95d3edfd31 +13,1,0,32,14,1,0,0,1,0xd14a9cbd4a15f56f789e67150cbc2c5c +13,1,0,33,15,1,0,0,1,0xbe6d1abb2969c06832d17f431390e696 +13,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +13,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +13,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +13,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +14,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +14,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +14,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,19,1,1,0,1,0,0x0347ab974b08d2c0126334d2ab610431 +14,1,0,20,2,1,0,1,0,0xb92e1ae32d159b02105401b197894ef2 +14,1,0,21,3,1,0,1,0,0x46fe679beedcac01dec3dbd137c9ac71 +14,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,23,5,1,0,1,0,0x0dbd09e62d449e084395088ef70802df +14,1,0,24,6,1,0,1,0,0x0c510a45045f9ce392d80bbfe1294eff +14,1,0,25,7,1,0,1,0,0xe8c431d19e75dc28990ba50079cae420 +14,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,27,9,1,0,1,0,0x04e0848d2bfc67c4c0cabf31f23a1179 +14,1,0,28,10,1,0,1,0,0xe43777f1dd0b605d3f3bfedfaeb6f330 +14,1,0,29,11,1,0,1,0,0x3b45f1c26825dc0dba2b391da1533c98 +14,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +14,1,0,31,13,1,0,1,0,0x13f53441c00bdc87143c7c3368c771e4 +14,1,0,32,14,1,0,1,0,0x4ddf5aff8e33965ebfc4148d099c709b +14,1,0,33,15,1,0,1,0,0xdf2077e8064ea99b0b36a6f33d2fa6d9 +14,1,0,34,0,0,1,1,0,0x00000000000000000000000000000000 +14,1,0,35,1,0,1,1,0,0x00000000000000000000000000000000 +14,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +14,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +15,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +15,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,19,1,1,0,0,1,0x02154d9eae63769150092eca1728346e +15,1,0,20,2,1,0,0,1,0x21ac397d8e130d37c08f34f37a7487cb +15,1,0,21,3,1,0,0,1,0xbacab2e619eb485031e863d064ff8983 +15,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,23,5,1,0,0,1,0x0a5de8be716695797ad0a89c6e47e205 +15,1,0,24,6,1,0,0,1,0x8edb33751fbda4e9926bae44a26c2768 +15,1,0,25,7,1,0,0,1,0x10409fee545b223700e59d0d56cc45be +15,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,27,9,1,0,0,1,0x06f73af6cf34ef6793c57533ff657f75 +15,1,0,28,10,1,0,0,1,0xc6983b781e7db4942ba2116cdc3ab4f6 +15,1,0,29,11,1,0,0,1,0x0d40267d7ed8ff08914abd9d744fb0fa +15,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,31,13,1,0,0,1,0x03c11eaff332285856fdbd9d01416fce +15,1,0,32,14,1,0,0,1,0x7f9736998ac874f8a3af58990c40cf7f +15,1,0,33,15,1,0,0,1,0x9f7d280aa6f7352688817e8627f46a36 +15,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +15,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +15,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +15,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +16,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +16,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +16,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +16,1,0,34,0,0,1,1,0,0x03c131a3d160192d3abfb722bbe61a83 +16,1,0,35,1,0,1,1,0,0x536d236f40ea00056f8f285091294164 +16,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +16,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +17,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +17,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +17,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +17,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +17,1,0,19,1,1,0,0,1,0x0102e58b61a82d2c20bc8f5c76fc0edb +17,1,0,20,2,1,0,0,1,0x9d1aaed90241313f440caaa7da5da7f8 +17,1,0,21,3,1,0,0,1,0xd81da3451c5530280faf9ab4aa42eab2 +17,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +17,1,0,23,5,1,0,0,1,0x0900edf2b507a6bbf6f1f038ebd7854b +17,1,0,24,6,1,0,0,1,0x6cc37968d3033c41695550f4cade91e6 +17,1,0,25,7,1,0,0,1,0x0d6aba76e32b6911eeb09aff1a33b5f6 +17,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +17,1,0,27,9,1,0,0,1,0x04457fa845d192bf193c9f6e9b66047a +17,1,0,28,10,1,0,0,1,0x26386497c1981852d19bfbf024f100de +17,1,0,29,11,1,0,0,1,0xedaa10e3667ff0dd689ed5c663925f6b +17,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +17,1,0,31,13,1,0,0,1,0x0037f9329bd5b199035c5810547e9b13 +17,1,0,32,14,1,0,0,1,0x0d8087114ace4181cee20a754f93fe0d +17,1,0,33,15,1,0,0,1,0xcb48351caaf6f65ac8331069b82bd167 +17,1,0,34,0,0,1,0,0,0x2ae95b76471d6e3c878236101d8d88d2 +17,1,0,35,1,0,1,0,0,0xdf24b1197e13e51d7b86b8f530b32e2f +17,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +17,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +18,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +18,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +18,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,19,1,1,0,1,0,0x05183b2e85194092d8b78b74b8cd57c5 +18,1,0,20,2,1,0,1,0,0xa95679d9987f2edcf7c8a3ab7a2ffc1b +18,1,0,21,3,1,0,1,0,0x09cf0c439dc43e9b2effdb5ccc505cca +18,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,23,5,1,0,1,0,0x187e286096d645f5ee078dbeaef5dc4d +18,1,0,24,6,1,0,1,0,0x0f457f4f22d15aa017a241ac8bbacf81 +18,1,0,25,7,1,0,1,0,0x64da89c51610991171aa7bfdfbe771b4 +18,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,27,9,1,0,1,0,0x0b6c2eea1ff79977aebc551422c9b020 +18,1,0,28,10,1,0,1,0,0x83c82fcd5861994fccbc4cc5975baf59 +18,1,0,29,11,1,0,1,0,0x1b5be7b25725469cf926e48d304a68d0 +18,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +18,1,0,31,13,1,0,1,0,0x180ff1ade80b2f2e31c1b2fb45da479b +18,1,0,32,14,1,0,1,0,0x185826b3e30c0caf00b087441fb41a36 +18,1,0,33,15,1,0,1,0,0x325074f78b7422ed933121dbf0a6300b +18,1,0,34,0,0,1,1,0,0x67f4652c81deb004572fecec08ba479c +18,1,0,35,1,0,1,1,0,0x991b3c2838fa9003e36dee970551592d +18,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +18,0,1,1,1,0,0,1,0,0x0bcc407a153f5d5cf061d802eda3a0da +18,0,1,2,2,0,0,1,0,0xf72556266ceda527314206c72f202e03 +18,0,1,3,3,0,0,1,0,0xf5f2a0e67523b93488ed7d5b4fc74d1a +18,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +18,0,1,5,5,0,0,1,0,0x086af9caee3aa1054220a79f7e0c33fd +18,0,1,6,6,0,0,1,0,0xd81f3b1e78415f13f670c6bebdba0660 +18,0,1,7,7,0,0,1,0,0xec6a6dd7e104416750386873a090f464 +18,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +18,0,1,9,9,0,0,1,0,0x0e8260b941303a398c6a7c63f1fae2a2 +18,0,1,10,10,0,0,1,0,0x4bb91df8a7838593a74118f641ee640f +18,0,1,11,11,0,0,1,0,0x87fc86de911f1e4307b6a0bbd358a64f +18,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +18,0,1,13,13,0,0,1,0,0x0ab8b0ddcf39fc7f31212e701ded49d4 +18,0,1,14,14,0,0,1,0,0xa871f39417079f188fa83edd565a086d +18,0,1,15,15,0,0,1,0,0x45a782c21e114a7bb9fa241557321836 +19,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +19,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +19,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +19,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +19,1,0,19,1,1,0,0,1,0x0151658e5ddd69f71216bb7db56b7946 +19,1,0,20,2,1,0,0,1,0x29d1b919bc2f0fc2ac745787b33050e3 +19,1,0,21,3,1,0,0,1,0x6d09640b0591787c1c4b1d27e14b3b52 +19,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +19,1,0,23,5,1,0,0,1,0x04b6ee6e15f856fa27424a554d2e83bc +19,1,0,24,6,1,0,0,1,0x5107eaf5abdf55bd2a7ef7066077b3a7 +19,1,0,25,7,1,0,0,1,0x15849e2356a6b937b7bb2325137a9e11 +19,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +19,1,0,27,9,1,0,0,1,0x18b2f5e68196a738ed1b32f236b7fd7c +19,1,0,28,10,1,0,0,1,0x038d8d181741470330a5a54fe201e529 +19,1,0,29,11,1,0,0,1,0x0e0e546c7e79206d76e5967b6948cf45 +19,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +19,1,0,31,13,1,0,0,1,0x081db8ac2a6490c730322ca34c21cde8 +19,1,0,32,14,1,0,0,1,0xf180772ba8e2baa652657e9c00d865be +19,1,0,33,15,1,0,0,1,0x37c8bfc1cdc29908d290cb7c55cdb67f +19,1,0,34,0,0,1,0,0,0x3f69f958b9d9e6e63073ef03ab3b7084 +19,1,0,35,1,0,1,0,0,0xff095ec02ee095455cc16d1bbeb48e84 +19,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +19,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +20,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +20,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +20,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +20,1,0,34,0,0,1,1,0,0x74fcff7cddd52a3c4e8d2bbf4ed828e8 +20,1,0,35,1,0,1,1,0,0xd4bd6692515059883fad075529b9a0a7 +20,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +20,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +21,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +21,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +21,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +21,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +21,1,0,19,1,1,0,0,1,0x16a118eff7f2cfa7e75c15b485fc6e93 +21,1,0,20,2,1,0,0,1,0xc74b87a71e61684c0ea8113b182cf56e +21,1,0,21,3,1,0,0,1,0x9f1678225d576cfa6857419b3417b7df +21,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +21,1,0,23,5,1,0,0,1,0x1448e795613e277f293ab1127abdf20d +21,1,0,24,6,1,0,0,1,0x4a1dad87fc714ca7301b74bda57451c7 +21,1,0,25,7,1,0,0,1,0xaefaa36a4d52a4a7349ffcf1e81b7848 +21,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +21,1,0,27,9,1,0,0,1,0x1233b503defb190922f3fbb618de2bbf +21,1,0,28,10,1,0,0,1,0xb6726ecb5dd78fa0ac124db5e16c93af +21,1,0,29,11,1,0,0,1,0x89c36953194fb60bc5706b657f45ec5f +21,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +21,1,0,31,13,1,0,0,1,0x0a47937d358f19660084030102884fe6 +21,1,0,32,14,1,0,0,1,0x875ba09e38d296794affebd154b4362d +21,1,0,33,15,1,0,0,1,0x54db4fde77aedc44f152f3b143221974 +21,1,0,34,0,0,1,0,0,0x767315ef9f294125b0a6da5541dcc1d5 +21,1,0,35,1,0,1,0,0,0x39f86b5608b6a7567c8ede06d4c31c3d +21,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +21,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +22,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +22,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +22,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,19,1,1,0,1,0,0x14a6ce26f0ba8b9839333b218afdc0f0 +22,1,0,20,2,1,0,1,0,0xa2ed76a726a73a0afb98bb067ddcd937 +22,1,0,21,3,1,0,1,0,0x48f81a5d7a11fde213075f489020dd71 +22,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,23,5,1,0,1,0,0x02ceb2fd15bdfc6ac770b255e56a426f +22,1,0,24,6,1,0,1,0,0xaa285dd90ce813eeb1726302ea560087 +22,1,0,25,7,1,0,1,0,0x9b7c8aeaa3d5e41c0b6cab7c15d9c2ae +22,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,27,9,1,0,1,0,0x19239a18041b8a9bcb173e26455922d2 +22,1,0,28,10,1,0,1,0,0x9ae09ca8eb64013b54737f7d2de7e23d +22,1,0,29,11,1,0,1,0,0xb025decfec7637f0e4a8b1fb8606a62b +22,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +22,1,0,31,13,1,0,1,0,0x119ef609d857c703de9b617a2ead131a +22,1,0,32,14,1,0,1,0,0x0847d0ba423f9bcb658ed8dd9a613ccf +22,1,0,33,15,1,0,1,0,0x453ea91be82735ac786e4c0383437ada +22,1,0,34,0,0,1,1,0,0x7e0bda7429d17ab02152853c928ee7b5 +22,1,0,35,1,0,1,1,0,0xaba30ee721d0882e4808570337d72452 +22,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +22,0,1,1,1,0,0,1,0,0x1590ad702176df0a0d28e81362b1db27 +22,0,1,2,2,0,0,1,0,0xfc9850e8499208202f77c9fc700217c7 +22,0,1,3,3,0,0,1,0,0xfeac268da83fe2e301c38d226fc25b84 +22,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +22,0,1,5,5,0,0,1,0,0x117bb206b9b1902f48adc3469dcdded2 +22,0,1,6,6,0,0,1,0,0x4ae32f773a26147d736cea82a7cd6bd4 +22,0,1,7,7,0,0,1,0,0xee827bf3e73ae265a74520ad1191a327 +22,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +22,0,1,9,9,0,0,1,0,0x0b0941afbf5353ffa9e78f98012b2df4 +22,0,1,10,10,0,0,1,0,0x3eaa8dd69eb1804c0b128a99f5a621f9 +22,0,1,11,11,0,0,1,0,0x928669130fbc2e965632182fb5628be9 +22,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +22,0,1,13,13,0,0,1,0,0x136335e8391ffaac782ed66574fb5919 +22,0,1,14,14,0,0,1,0,0x3d2188d081a28870726d903e02913814 +22,0,1,15,15,0,0,1,0,0xf4a412a75b6059a365d34514a02d54a5 +23,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +23,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +23,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +23,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +23,1,0,19,1,1,0,0,1,0x0e4e6c3ea0bd0b889eae0fa4ecb1b72d +23,1,0,20,2,1,0,0,1,0x4c0878b81f4c5864e4adc11836917c99 +23,1,0,21,3,1,0,0,1,0xdad7e350ff7249754d19a9a2696e175c +23,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +23,1,0,23,5,1,0,0,1,0x1484c08bcf2deff9ed54ef0bfe306d2e +23,1,0,24,6,1,0,0,1,0xcc48f458877d49610c195a16235f2513 +23,1,0,25,7,1,0,0,1,0x6549d9686a59a5e0f7a1fd0892cef94d +23,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +23,1,0,27,9,1,0,0,1,0x0c5603b70d430fece5e88c022a26e42f +23,1,0,28,10,1,0,0,1,0x45e0e16590c4ca0527950a0414abf318 +23,1,0,29,11,1,0,0,1,0xb4fe8c1068c83604ff6f85e2c4625cac +23,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +23,1,0,31,13,1,0,0,1,0x163708f932bcc140e58e687c0e17e217 +23,1,0,32,14,1,0,0,1,0x433636dc858b2a50f68364c6f5b3ad95 +23,1,0,33,15,1,0,0,1,0x5094067348ce556e5b6df6778eeaa02c +23,1,0,34,0,0,1,0,0,0x7c3379ad7f5e5384195f13174041393e +23,1,0,35,1,0,1,0,0,0x0a2c97717c1af55b71ef7a9079ff4ef4 +23,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +23,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +24,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +24,1,0,1,1,1,0,0,1,0x000a550a2092000cfd9327caf76ad171 +24,1,0,2,2,1,0,0,1,0x7060700873c9e804fe62b7516c59864a +24,1,0,3,3,1,0,0,1,0xdb672dc8b1420778aa48339cb58cf0bd +24,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +24,1,0,5,5,1,0,0,1,0x1770cf6aff87be77e113d7f7d345f081 +24,1,0,6,6,1,0,0,1,0x7f01ef2f6f76a5a2b6b0f4cf7b564fd0 +24,1,0,7,7,1,0,0,1,0x25ed0b9a118d318cfb1d4ace1d3316ca +24,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +24,1,0,9,9,1,0,0,1,0x098d969db55194bab58d09d531dbb22b +24,1,0,10,10,1,0,0,1,0xab339af370ce66d3379b4550bf7b303d +24,1,0,11,11,1,0,0,1,0x3205de88db3ad5a6bdbe60140f8f550c +24,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +24,1,0,13,13,1,0,0,1,0x12eae1cb539bdefb0540e8c30f43fbf0 +24,1,0,14,14,1,0,0,1,0x9c72d89832726e642630f59e61836bd0 +24,1,0,15,15,1,0,0,1,0x5515830058a7d3944edf207214cfa0e8 +24,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +24,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +24,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +24,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +24,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +24,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +24,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +25,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +25,1,0,1,1,1,0,0,1,0x1484466752463e4e654ff34a173e6698 +25,1,0,2,2,1,0,0,1,0x66717a19aabf8ad131c95828fb9314e0 +25,1,0,3,3,1,0,0,1,0x53407112a085ecb035a2b13ed7a8f9ae +25,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +25,1,0,5,5,1,0,0,1,0x0eb6697dd808be5f1fa036dc5710fe10 +25,1,0,6,6,1,0,0,1,0x788a65a1e66292c6acf58abff542e8f2 +25,1,0,7,7,1,0,0,1,0xba948dd63d2f7c5e779b3e38b7b95ec9 +25,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +25,1,0,9,9,1,0,0,1,0x0e6b6589aac63ed671f497094ecd500d +25,1,0,10,10,1,0,0,1,0x0caeae50ef1bdd805c179c4156f01476 +25,1,0,11,11,1,0,0,1,0xf2a88a7a729b04e9d95972e96e60edfd +25,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +25,1,0,13,13,1,0,0,1,0x0bdcba154df84c5abeb9eda92aac0062 +25,1,0,14,14,1,0,0,1,0xe8f9688f81daaf53ff07065491f9ea62 +25,1,0,15,15,1,0,0,1,0x22a83877c7ab5e4fcd19f343df561ebb +25,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +25,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +25,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +25,1,0,19,1,1,0,0,0,0x07b9336853f7f4e1234ba5c3b33087fe +25,1,0,20,2,1,0,0,0,0xa941f80584e8731a09cc74ec42c4c4dc +25,1,0,21,3,1,0,0,0,0x98cfa2cfd38955887b7ac992b9719a06 +25,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +25,1,0,23,5,1,0,0,0,0x171047f5841263d943a8ce2c3aa9124d +25,1,0,24,6,1,0,0,0,0xc8bd36dd1aaf26f4f19bcc159b175e32 +25,1,0,25,7,1,0,0,0,0x1054be65d0227c2f6079a76d9d4dd338 +25,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +25,1,0,27,9,1,0,0,0,0x04375a3094c992fb801c83cb5e0ed3e5 +25,1,0,28,10,1,0,0,0,0xd6bfa6e096504fefaa00c19adce80426 +25,1,0,29,11,1,0,0,0,0xd970e34fd782a3de25a62a9600f8438d +25,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +25,1,0,31,13,1,0,0,0,0x145575a3454216ba6073db0f89213110 +25,1,0,32,14,1,0,0,0,0x0d106c78b14bbddbb7bca9a69c184275 +25,1,0,33,15,1,0,0,0,0xdca78fad2fa6875e0e284e9e6523e965 +25,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +25,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +25,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +25,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +26,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +26,1,0,1,1,1,0,0,1,0x0501335d50abbe76c6353f3baa6caf56 +26,1,0,2,2,1,0,0,1,0x6ee344a73fb52f323eea7214ece34455 +26,1,0,3,3,1,0,0,1,0x180451f78bc6218aad5fef7c22b3375f +26,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +26,1,0,5,5,1,0,0,1,0x1344946d9f81eefcc03fb306b2f6cc21 +26,1,0,6,6,1,0,0,1,0xd3ce95f4ad64337180ff8459785b245b +26,1,0,7,7,1,0,0,1,0x7004221437d4ed494381369097a4ad1f +26,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +26,1,0,9,9,1,0,0,1,0x0432fb39a11304ec1729086caa5a59c5 +26,1,0,10,10,1,0,0,1,0x22ef3a33d76e716647fca097bda9a327 +26,1,0,11,11,1,0,0,1,0xce179c9206a0649366b3aa16d61ad2df +26,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +26,1,0,13,13,1,0,0,1,0x12e339cd6be53da22eb39bec82565ca9 +26,1,0,14,14,1,0,0,1,0x5baf0cd78ce042099214aa6473e76b53 +26,1,0,15,15,1,0,0,1,0x05d1678ca8f08e45d7e6e76a672fa4d5 +26,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +26,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +26,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +26,1,0,19,1,1,0,0,0,0x15ebdbaaff68f5bbf74a4c38aea2b256 +26,1,0,20,2,1,0,0,0,0x7b3263cd6f190e42982443f041bf3188 +26,1,0,21,3,1,0,0,0,0x27b53f011cd4c4a952bd6046206ea27e +26,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +26,1,0,23,5,1,0,0,0,0x0447fe9793152d2c67ca6d4c627184f2 +26,1,0,24,6,1,0,0,0,0x594cd4a9f49dbe2ea0ecc118cc0bc9b7 +26,1,0,25,7,1,0,0,0,0xbe1e9aa42f8783841dbb1ead9ed175ea +26,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +26,1,0,27,9,1,0,0,0,0x053c38165f19372b6aacb12745a4b20c +26,1,0,28,10,1,0,0,0,0x73a3d7306e0754cb43dca5d9a1d940a6 +26,1,0,29,11,1,0,0,0,0xeafa3e733672519ba42278134ca724eb +26,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +26,1,0,31,13,1,0,0,0,0x18b35dffb9be9d10bb5953edeaa5a2c7 +26,1,0,32,14,1,0,0,0,0xef20e013f4112dadcba4e72e74be23e6 +26,1,0,33,15,1,0,0,0,0x69a808624b5566b097148682e54e57f2 +26,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +26,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +26,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +26,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +27,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +27,1,0,1,1,1,0,0,1,0x16526c5cbcd9e1ab045859f3666f7c19 +27,1,0,2,2,1,0,0,1,0x3382ce6bde8a32ea51f5c66d5defa9bc +27,1,0,3,3,1,0,0,1,0x08e260c3b1c175bfb61cbb1a8d9595bb +27,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +27,1,0,5,5,1,0,0,1,0x17d6e3f88d29edecd3dd84ee73e0a6b1 +27,1,0,6,6,1,0,0,1,0x7e9958e41c8182f80dacd6921bd8932a +27,1,0,7,7,1,0,0,1,0x818999396e6b122684a68823ce5021b0 +27,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +27,1,0,9,9,1,0,0,1,0x032762a9844809e2bb3895c503ab09b0 +27,1,0,10,10,1,0,0,1,0xcb41ced74bebd3221381dba18bd868e9 +27,1,0,11,11,1,0,0,1,0xa4892512d896d9731ad3366150026520 +27,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +27,1,0,13,13,1,0,0,1,0x158fcabd126a32314df8b4c88cffb1fc +27,1,0,14,14,1,0,0,1,0x4e3cc34394fbbfc0d449e0664526d181 +27,1,0,15,15,1,0,0,1,0x07a967e677210f3de6ec7e7122efbf90 +27,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +27,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +27,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +27,1,0,19,1,1,0,0,0,0x0ef10b70f44fe2b44f64c7526c21a343 +27,1,0,20,2,1,0,0,0,0x839eb29c87f4c61debb7c2c668fa7fc9 +27,1,0,21,3,1,0,0,0,0x3d3f69b4e813778e04a76cdd76ce3678 +27,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +27,1,0,23,5,1,0,0,0,0x0d7a9197caac5fd499a682e1332c10c4 +27,1,0,24,6,1,0,0,0,0xa5ff1af8b3d27b9e66bf366854566b46 +27,1,0,25,7,1,0,0,0,0xb6192bec55e3a49387fca2872a49b852 +27,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +27,1,0,27,9,1,0,0,0,0x0bbfc1b23fbd3935806c80656525bb82 +27,1,0,28,10,1,0,0,0,0x7512bc9e53f729e1d36748b596f00d18 +27,1,0,29,11,1,0,0,0,0x2e2190ef7dde3252aa85783e76ed6493 +27,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +27,1,0,31,13,1,0,0,0,0x192e125d5466357460254de7cbc49ea0 +27,1,0,32,14,1,0,0,0,0xdce50725fac52c773c7442c57c6734c7 +27,1,0,33,15,1,0,0,0,0xbc6c20477785a98d728560ce63ae1d9e +27,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +27,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +27,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +27,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +28,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +28,1,0,1,1,1,0,0,1,0x024c7de3afd83280b83e29fc54ad602f +28,1,0,2,2,1,0,0,1,0x55d9f87b13451ab9c96f028a02b67cbb +28,1,0,3,3,1,0,0,1,0xde08dc1d8484ae9a5a3e8b807e6d0272 +28,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +28,1,0,5,5,1,0,0,1,0x013f04583a67cf040d123f787bf0b460 +28,1,0,6,6,1,0,0,1,0x7fa7c460a06bcae3e1c085589e9d4d80 +28,1,0,7,7,1,0,0,1,0x549d7bb24d765d2ffb602628096bc5cb +28,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +28,1,0,9,9,1,0,0,1,0x12ef40c2b1d63004910f08e99f8bdddb +28,1,0,10,10,1,0,0,1,0x9b68fb05fc846f4b00db9fc5df00cb82 +28,1,0,11,11,1,0,0,1,0xd86dab14fe4b2d7a41d0cf8968a76159 +28,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +28,1,0,13,13,1,0,0,1,0x18b63331d1dfb6a8f53ce9c6edce508d +28,1,0,14,14,1,0,0,1,0x921c462c661950478ff99d65a69fa907 +28,1,0,15,15,1,0,0,1,0x5a1fd325ad576ba955e61e3e64b62f72 +28,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +28,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +28,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +28,1,0,34,0,0,1,0,0,0x3e96f4594929eb7ee154ba588a3e5419 +28,1,0,35,1,0,1,0,0,0x10a96b1301fb179d2b47424af6509eb4 +28,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +28,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +29,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +29,1,0,1,1,1,0,0,1,0x116532dfdd0ae80d20ef6f8f2bc0317d +29,1,0,2,2,1,0,0,1,0xe6d09ab198bd899523b3427113a7ba25 +29,1,0,3,3,1,0,0,1,0xf2706e5b9ac226c7e116d7be606ed575 +29,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +29,1,0,5,5,1,0,0,1,0x030818ae6826bb2b77ca1955131833a2 +29,1,0,6,6,1,0,0,1,0xb41c6624b28ea66a5496ec8c08ccadd6 +29,1,0,7,7,1,0,0,1,0x2f8f329bb19ae69110e6d79044294643 +29,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +29,1,0,9,9,1,0,0,1,0x0b1749f49c3797b24501e1d8deef36e6 +29,1,0,10,10,1,0,0,1,0x987edeaa85d60a341c046f54c5c23221 +29,1,0,11,11,1,0,0,1,0xc62f066878233b39a6b824dcdab896f0 +29,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +29,1,0,13,13,1,0,0,1,0x1530a916b8f01f108acbb71e2d9b4eeb +29,1,0,14,14,1,0,0,1,0xd0da8844514591595f295e543e59e390 +29,1,0,15,15,1,0,0,1,0x72fc528321347871103e411e55453604 +29,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +29,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +29,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +29,1,0,19,1,1,0,0,0,0x00b77447bfd02182db5f5180d3f152e6 +29,1,0,20,2,1,0,0,0,0x3d0cb6f1809339029cd5e2c12b5b9602 +29,1,0,21,3,1,0,0,0,0x17e2d67eba6b5163a4c18aaed9e145ec +29,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +29,1,0,23,5,1,0,0,0,0x020ea6af5272ae24da51bc0bdf11ee66 +29,1,0,24,6,1,0,0,0,0xf8c35dc2a3ff996d718a3f6a2f387b9e +29,1,0,25,7,1,0,0,0,0xcd213f4b4dcb0f1ec3b551c769308d19 +29,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +29,1,0,27,9,1,0,0,0,0x1024b2ac09a29a9b4529f99620223e80 +29,1,0,28,10,1,0,0,0,0x67e8777eb3b39e344b8dc25f55ee64e0 +29,1,0,29,11,1,0,0,0,0x83fa35b7110e897d7814e3f0818e14cd +29,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +29,1,0,31,13,1,0,0,0,0x14b247ebbfaad5cecb62b51fd54b2916 +29,1,0,32,14,1,0,0,0,0x373458d6f8cb45cb7f0cc5d6a7b79787 +29,1,0,33,15,1,0,0,0,0x84041b53c7421dbae7037096536daf21 +29,1,0,34,0,0,1,0,0,0x54fb63144fa9e7913db49c824a135819 +29,1,0,35,1,0,1,0,0,0x81ddb0fbdcb20d639bdb271bf02fcc98 +29,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +29,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +30,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +30,1,0,1,1,1,0,0,1,0x0036c1e6edc097e9908981b97c9ee9e2 +30,1,0,2,2,1,0,0,1,0x32928bdde4836fb08e22d99f55e2dee7 +30,1,0,3,3,1,0,0,1,0x3666b8d74d3745fd202b8d1da6d32415 +30,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +30,1,0,5,5,1,0,0,1,0x14c71052c2168c708ca0917382059545 +30,1,0,6,6,1,0,0,1,0x634fef10d56f5a0877fd85eaa159280e +30,1,0,7,7,1,0,0,1,0x9ef8e159abe9adef922abaa317c54dfd +30,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +30,1,0,9,9,1,0,0,1,0x11dfc8ebfcc356b144cf51ba8fb8eb0e +30,1,0,10,10,1,0,0,1,0x25a5f6b838e5b0648a731e8e8dd29c53 +30,1,0,11,11,1,0,0,1,0x2f267bb203727b597c3716c8fafb3275 +30,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +30,1,0,13,13,1,0,0,1,0x16cc107a52da1c608471c32d14f86ac2 +30,1,0,14,14,1,0,0,1,0x8eba3c7b511fe15673bd31dd782e78f0 +30,1,0,15,15,1,0,0,1,0xfe58dbefe7b04e6caa124b5a5dde1722 +30,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +30,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +30,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +30,1,0,19,1,1,0,0,0,0x176fd3420a43c7ca1a710ce3b9a0306f +30,1,0,20,2,1,0,0,0,0x5ffd285432fd703dec03ad4b0a3459d8 +30,1,0,21,3,1,0,0,0,0x3bfa48591d106214d313de16e6d0ddbe +30,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +30,1,0,23,5,1,0,0,0,0x16f190e486bfff44df40d998d50c2530 +30,1,0,24,6,1,0,0,0,0xb71259e79e36ddedee8d73822370e02d +30,1,0,25,7,1,0,0,0,0xdca74b42f3fb5138c455109e0338baea +30,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +30,1,0,27,9,1,0,0,0,0x13c508c82b42281e21eb1388c608eb43 +30,1,0,28,10,1,0,0,0,0x6f4e75522843a67657b9f30f628f997d +30,1,0,29,11,1,0,0,0,0x3f04bf2e964d65db60a47a6ed425ccb0 +30,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +30,1,0,31,13,1,0,0,0,0x18a2bbc016f87a23b2a9268194d0fa21 +30,1,0,32,14,1,0,0,0,0xcd4a80b968077c9e70dd163aad156b8c +30,1,0,33,15,1,0,0,0,0xa08a3631eb2f195ec5f0a5e4a9fe259c +30,1,0,34,0,0,1,0,0,0x0b9832631f4e19cae76ff89222fccf8f +30,1,0,35,1,0,1,0,0,0xf7004149a0186665ec1d62431f09fd1b +30,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +30,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +31,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +31,1,0,1,1,1,0,0,1,0x13b5a9065ba163667774df8edaa57ca0 +31,1,0,2,2,1,0,0,1,0x483d7b69e407e5337a3d6ab5a9900a66 +31,1,0,3,3,1,0,0,1,0xd5cc2911b7dd9c9447cd61ddacb2a04c +31,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +31,1,0,5,5,1,0,0,1,0x049b78568438dd4c35f0231fba6fa2d4 +31,1,0,6,6,1,0,0,1,0xc8fe5fd25642a3048f52297a63ec6c10 +31,1,0,7,7,1,0,0,1,0xab57d0c5bd09f8d1fb719bf2f10a8cef +31,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +31,1,0,9,9,1,0,0,1,0x0d9f6a90c88fc4dd9e588928e20b5dc8 +31,1,0,10,10,1,0,0,1,0x6c1dd190df72491eded43c9275053937 +31,1,0,11,11,1,0,0,1,0xe8dff3fe793b7c7bdd48bd1fed81e9a6 +31,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +31,1,0,13,13,1,0,0,1,0x024801401c57a7eaf48ac0ecd6aa54dc +31,1,0,14,14,1,0,0,1,0x020223a100a184f83a49a54980a310b7 +31,1,0,15,15,1,0,0,1,0xd5a594c7e293a2f9f46934c2fdc2f9ad +31,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +31,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +31,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +31,1,0,19,1,1,0,0,0,0x00ea02f0545e9e35ac160c1beb16929a +31,1,0,20,2,1,0,0,0,0x2782498972e51800e4cb072930914134 +31,1,0,21,3,1,0,0,0,0xdf1beda87db68c9e55dedc838881dacd +31,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +31,1,0,23,5,1,0,0,0,0x0e0eea4d9be39fa837297818baabfda4 +31,1,0,24,6,1,0,0,0,0x1c3c45b9b297a40b6b04778e94bb61d7 +31,1,0,25,7,1,0,0,0,0x516f10e27ccff2b7a4509ec29f3a9a79 +31,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +31,1,0,27,9,1,0,0,0,0x11373ec906bc4c0c71bb79a0b8a43c08 +31,1,0,28,10,1,0,0,0,0x6c33e073360d6a2b44fe15c41d1e92c6 +31,1,0,29,11,1,0,0,0,0x2e052e99820c2baa09f65bca553b444c +31,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +31,1,0,31,13,1,0,0,0,0x02e3798ab75aee082f7d67d1bd05cd1f +31,1,0,32,14,1,0,0,0,0xa669fb5d597c9c70f385cea99e5fa006 +31,1,0,33,15,1,0,0,0,0xe5e618c86ae2dfd0de7d77a7eaf46913 +31,1,0,34,0,0,1,0,0,0x4fccee4944bab6703002eada728da8c3 +31,1,0,35,1,0,1,0,0,0x09116ab81efaeb0bd36f55726c6afcf4 +31,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +31,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +32,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +32,1,0,1,1,1,0,0,1,0x09659a6949949186a4606a4ee15afce9 +32,1,0,2,2,1,0,0,1,0x57639f94240e5c81b2f34a6b39d58d15 +32,1,0,3,3,1,0,0,1,0xa909ac71de2aeb3d2237feb416c3e77b +32,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +32,1,0,5,5,1,0,0,1,0x09d9023800da7a953722435172caa29b +32,1,0,6,6,1,0,0,1,0x6a394cb4f705185af6bc2ab9e4256743 +32,1,0,7,7,1,0,0,1,0xe346e76d12555e83a6bb92143c1b0d0d +32,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +32,1,0,9,9,1,0,0,1,0x002a7db598f508ade4d57dc0a2ffa3b9 +32,1,0,10,10,1,0,0,1,0xb0e18f6e748b86ed0a69f984529f0eed +32,1,0,11,11,1,0,0,1,0x4c65b385e22472dd77f699cd569928b4 +32,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +32,1,0,13,13,1,0,0,1,0x0eea4fe77976e3c975c716c5535665fe +32,1,0,14,14,1,0,0,1,0x7caa3af9cac3de73ff587031d40ad3be +32,1,0,15,15,1,0,0,1,0x6a83b3b50cf805e491c0d619909b9ba0 +32,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +32,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +32,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +32,1,0,34,0,0,1,0,0,0x79f22053ac4d664b96025d9366725e1c +32,1,0,35,1,0,1,0,0,0x7546b130b093985e246adc38baf96db2 +32,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +32,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +33,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +33,1,0,1,1,1,0,0,1,0x010284c0a7ac45a9cc1181b29becca67 +33,1,0,2,2,1,0,0,1,0x1014eef213903fbf46cd8017214043ed +33,1,0,3,3,1,0,0,1,0x70bf3d6fdb4829860501a382373ef583 +33,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +33,1,0,5,5,1,0,0,1,0x07c14f25166fadb9170933b31012d7a8 +33,1,0,6,6,1,0,0,1,0x4835450dc49da85b131e510d47611bad +33,1,0,7,7,1,0,0,1,0x522f0291918e447b947ad21cfa3430d0 +33,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +33,1,0,9,9,1,0,0,1,0x0506ce8d8d0fb2171163a41a6de0c894 +33,1,0,10,10,1,0,0,1,0x8d28d9a7e20a327018a5624f5d4e8c0c +33,1,0,11,11,1,0,0,1,0xb64721fddef16ba631690de6eca46195 +33,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +33,1,0,13,13,1,0,0,1,0x08fac98027aa2e6233754b285da3c7e6 +33,1,0,14,14,1,0,0,1,0x5f28a90782b3c385c9281ae686234e7a +33,1,0,15,15,1,0,0,1,0x583c28e794e1a906634dc0b3eeb85cf2 +33,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +33,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +33,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +33,1,0,19,1,1,0,0,0,0x1406c7fee94b8b85bef3e50e55f30c48 +33,1,0,20,2,1,0,0,0,0xe251e40191cf1cf08fcaa37af25b6b08 +33,1,0,21,3,1,0,0,0,0xc53bc563a8347e3f041fa1c198ed4e8a +33,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +33,1,0,23,5,1,0,0,0,0x0445e95bc432371d5ce1e95ff9e03180 +33,1,0,24,6,1,0,0,0,0xb5a911f00d2a62fedf8ea63fc3be61db +33,1,0,25,7,1,0,0,0,0x64eb207d131326b1030ae0a025505a0a +33,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +33,1,0,27,9,1,0,0,0,0x12a387df755cb2d889ae59cbda7d283b +33,1,0,28,10,1,0,0,0,0xf1ea420e73ab4ad2ddb0a6f2f3f85bd8 +33,1,0,29,11,1,0,0,0,0x6ffa07723b5c62d22cd3c45bbb4769e9 +33,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +33,1,0,31,13,1,0,0,0,0x0fdcd0191a5943363cd41d1af2853088 +33,1,0,32,14,1,0,0,0,0x651d49699cc48836bd0183f810a3ea5e +33,1,0,33,15,1,0,0,0,0x370269dc2402848e82fa6685573b1c62 +33,1,0,34,0,0,1,0,0,0x7b84158e3905b58c767a0650b8084eb2 +33,1,0,35,1,0,1,0,0,0x2c287481d306c45156e7068ce4dd35e5 +33,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +33,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +34,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +34,1,0,1,1,1,0,0,1,0x15f22f1ca1332d96ab249673a1ba083b +34,1,0,2,2,1,0,0,1,0x48446afe48a8d83671a34baac3af87f4 +34,1,0,3,3,1,0,0,1,0xdd459ede64df42ba462dafa21db36e0f +34,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +34,1,0,5,5,1,0,0,1,0x10eac4d914ad3ac6ddebc397a79bc44f +34,1,0,6,6,1,0,0,1,0x3256118b324a9c7e01eed55198ed10a9 +34,1,0,7,7,1,0,0,1,0x0fd33c72a5b1ba0d3a9de49e058394ff +34,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +34,1,0,9,9,1,0,0,1,0x055cc55a475dcbc1b00ae4c2c719b749 +34,1,0,10,10,1,0,0,1,0xbc5a75f305d03f2e322115a50c5e7730 +34,1,0,11,11,1,0,0,1,0xf391ba43129bf6461aef0aaecdbeda7a +34,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +34,1,0,13,13,1,0,0,1,0x03828336c133e6f99e9c2791e94d5d3b +34,1,0,14,14,1,0,0,1,0x87d6abc8c9375a072161f94bd636d1c4 +34,1,0,15,15,1,0,0,1,0xa4505cf8d1575fa9967ffa5abf7c622b +34,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +34,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +34,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +34,1,0,19,1,1,0,0,0,0x07fdef441d9a8721bd1f2858a2d76947 +34,1,0,20,2,1,0,0,0,0x7674d30e84f52c695e6cf4cd6a597c2a +34,1,0,21,3,1,0,0,0,0x2f4dab7374447cc94837f0f028c63e18 +34,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +34,1,0,23,5,1,0,0,0,0x0148df2bcd9475a6a3f0f15625d4f062 +34,1,0,24,6,1,0,0,0,0x16ca7df7d6b2ea14c939013f928da64a +34,1,0,25,7,1,0,0,0,0x93e128e4c71ff0b7d2e6ae9abf0b4929 +34,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +34,1,0,27,9,1,0,0,0,0x052ea5158a6f3358435ba4a8e620d4f1 +34,1,0,28,10,1,0,0,0,0x06d6da56e0abe9a9a3ee5081e1180010 +34,1,0,29,11,1,0,0,0,0xa26c4c2a991339ed87aa80aad0a6d55c +34,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +34,1,0,31,13,1,0,0,0,0x03c8e7daff81119bd767ebd1e44b1df1 +34,1,0,32,14,1,0,0,0,0x36a36966f79a348b917549cd9bfd6d85 +34,1,0,33,15,1,0,0,0,0x57ffcf5955baeda53bcc560cf8d975ba +34,1,0,34,0,0,1,0,0,0x7cb959f70e621fd28496127777d794f8 +34,1,0,35,1,0,1,0,0,0x3f32001aba67f49f1f1c332f26a26ece +34,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +34,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +35,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +35,1,0,1,1,1,0,0,1,0x01a6dd1299a47f4b976f95a78437b32f +35,1,0,2,2,1,0,0,1,0x53a2c0bd81b7e28f4e12f054fad8af88 +35,1,0,3,3,1,0,0,1,0xc2f67afa223360b9a24604294722bc91 +35,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +35,1,0,5,5,1,0,0,1,0x09cc33131eccc3bc19f54bb7b824c34d +35,1,0,6,6,1,0,0,1,0xef3f31af2903d7b7f2b1b64dac15bca3 +35,1,0,7,7,1,0,0,1,0x185a028cee6795282d4ac5eaaae01556 +35,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +35,1,0,9,9,1,0,0,1,0x0c2043d2a39fec2ef0ca34fa730b11bc +35,1,0,10,10,1,0,0,1,0x65138388f09fa1c7ce2023b51bd68540 +35,1,0,11,11,1,0,0,1,0x6ea8f42511fef658a8f037fbe18a86ee +35,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +35,1,0,13,13,1,0,0,1,0x126e43776d826106b50bc65c3065f90e +35,1,0,14,14,1,0,0,1,0xb8aa8a998a13d8b50b00e736e885ca60 +35,1,0,15,15,1,0,0,1,0xe23ab7ba2d79d5ecc7384060c13c1105 +35,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +35,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +35,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +35,1,0,19,1,1,0,0,0,0x0100449b85fa5ba7a5ca6b98efe455f1 +35,1,0,20,2,1,0,0,0,0x62fcb5f5837633a4bacd5b13e1e7f751 +35,1,0,21,3,1,0,0,0,0xe20b77e1c7376dba430c6b88ae5cb405 +35,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +35,1,0,23,5,1,0,0,0,0x0606c31397aafecb4247c505fffb5183 +35,1,0,24,6,1,0,0,0,0xa75f8089177058e85ffc3d7b153967ff +35,1,0,25,7,1,0,0,0,0x290a444542e75cf44f8e3b2bba9a5b8c +35,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +35,1,0,27,9,1,0,0,0,0x0338c0b991912247235cd246c15988de +35,1,0,28,10,1,0,0,0,0x9c1cb702edae64de82a6c50207bd8cf1 +35,1,0,29,11,1,0,0,0,0x746e0ff78410f07782efb5fd3c18addf +35,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +35,1,0,31,13,1,0,0,0,0x174f06b7edc3fd520b4cbaa5918c0312 +35,1,0,32,14,1,0,0,0,0x2553f05aa69a397178640f61ce52fc42 +35,1,0,33,15,1,0,0,0,0xef9cf30badd250dcbde73a69a54a9fb4 +35,1,0,34,0,0,1,0,0,0x7c31c027aece12e36c9ee04dd5e15082 +35,1,0,35,1,0,1,0,0,0x1433a7071c3cc941880f207698a27e60 +35,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +35,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +36,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,1,1,1,0,1,0,0x07a4f224676dfe0256ca229097182b69 +36,1,0,2,2,1,0,1,0,0x8199300f1efe26e631595ac972bf75e4 +36,1,0,3,3,1,0,1,0,0xdf76884be478be4a2be8ceaebbd1af7d +36,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,5,5,1,0,1,0,0x0e3cb4322b5cd2d6082319643ead6c6b +36,1,0,6,6,1,0,1,0,0x5133e9a91a1a223c8ef3878228344357 +36,1,0,7,7,1,0,1,0,0x445ed6a2dfd667b1634a465a0a1dc430 +36,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,9,9,1,0,1,0,0x08a0e7887ba99424689b711c18d29ddf +36,1,0,10,10,1,0,1,0,0x0d1d17302ea395ddf3a22a44856929a0 +36,1,0,11,11,1,0,1,0,0x097757f4d3e20735131a9ae1aacfa444 +36,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,13,13,1,0,1,0,0x0d0e04b98a7122b735fc202a72f55bd6 +36,1,0,14,14,1,0,1,0,0x9e5c868cc3c811ff6d685e0db955353f +36,1,0,15,15,1,0,1,0,0x7768f846bd3cdf37aa40cc14f69e587e +36,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +36,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +36,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +36,1,0,34,0,0,1,1,0,0x00000000000000000000000000000000 +36,1,0,35,1,0,1,1,0,0x00000000000000000000000000000000 +36,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +36,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +37,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +37,1,0,1,1,1,0,0,0,0x107eba4c8d2cfabf92e28a82033ee319 +37,1,0,2,2,1,0,0,0,0x762d8216cad9c064273af65712a6b895 +37,1,0,3,3,1,0,0,0,0xcd9567816e8743ee4de36c4a644be5eb +37,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +37,1,0,5,5,1,0,0,0,0x04be0d44097b9c1a1800a25f4c050ad7 +37,1,0,6,6,1,0,0,0,0xe0d0e0580fbf80980dfff1cf0cec639d +37,1,0,7,7,1,0,0,0,0xaa3abb68553161f7fa85900ab5d441e0 +37,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +37,1,0,9,9,1,0,0,0,0x171c3e75f037313ce77ec760013b5af2 +37,1,0,10,10,1,0,0,0,0x6eca5338f80f14f47bc9870a4431ba2e +37,1,0,11,11,1,0,0,0,0xbccd3279d36a81d3312d2868006424ba +37,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +37,1,0,13,13,1,0,0,0,0x07ddb7e26f2826998aef6b6b935a4287 +37,1,0,14,14,1,0,0,0,0x93025b729460fa69d22c83411c516802 +37,1,0,15,15,1,0,0,0,0xb41fa699844b7c16e562caec710e0032 +37,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +37,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +37,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +37,1,0,19,1,1,0,0,1,0x04e81880bfac1ee6d5ac5b65a4ac3f18 +37,1,0,20,2,1,0,0,1,0x68f5b681308379d0253e8e58074eb2dc +37,1,0,21,3,1,0,0,1,0xc602d2173ebbe37bba04825fe7b1c4b6 +37,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +37,1,0,23,5,1,0,0,1,0x03256fafe920fe64f56324d632e5f1df +37,1,0,24,6,1,0,0,1,0xd3cf5875d6a69891f8b15df2b6f5ed14 +37,1,0,25,7,1,0,0,1,0xc801f171ea7a7fecddac49595fa5fddb +37,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +37,1,0,27,9,1,0,0,1,0x00050e6ad2235a32541909e7da8e4d1e +37,1,0,28,10,1,0,0,1,0x51fb3a5c4259d340297ab64b58396081 +37,1,0,29,11,1,0,0,1,0x78bc1180f411d602fbcbf86d11e0a132 +37,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +37,1,0,31,13,1,0,0,1,0x0566e20c26489378f1aee3b35ac6673e +37,1,0,32,14,1,0,0,1,0x4ee454174dc52d9fc511238c2d03f7bb +37,1,0,33,15,1,0,0,1,0xfb0cff992c13fa99ace3a31abea3c439 +37,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +37,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +37,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +37,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +38,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,1,1,1,0,1,0,0x0926db834bb88adf2aa320a6b46d8bc5 +38,1,0,2,2,1,0,1,0,0xa20bfb17748b7f3f74b9910e3d7f7fa3 +38,1,0,3,3,1,0,1,0,0x1e2828aebb9094bf59159088a4c75b36 +38,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,5,5,1,0,1,0,0x10ce9d3cdef62c906f24927202389283 +38,1,0,6,6,1,0,1,0,0x24a9ea1ed029bcd46a0c8d82005da23b +38,1,0,7,7,1,0,1,0,0x72d7d6d37de652961439ec9951439f5c +38,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,9,9,1,0,1,0,0x162292afb7f1dfdd843b601ea3504211 +38,1,0,10,10,1,0,1,0,0xaa0ec516b8eb884865f531ba779ddefb +38,1,0,11,11,1,0,1,0,0xd0fe8d2829238885a372d1d77277895f +38,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,13,13,1,0,1,0,0x14167010776211202b697a0defd1d827 +38,1,0,14,14,1,0,1,0,0x07d40637032a36319ee4188dcb266c57 +38,1,0,15,15,1,0,1,0,0x711e62ed42143d2544dda569e1820947 +38,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +38,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +38,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,19,1,1,0,1,0,0x19f0d1cfe56f9fa3415c4cdf909e194c +38,1,0,20,2,1,0,1,0,0x567dec59c43877340e4ce3e6ef0f90c0 +38,1,0,21,3,1,0,1,0,0x5aadd426f1554c6c086b007922db3feb +38,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,23,5,1,0,1,0,0x0f88da27e629e55395b61ae36b39b483 +38,1,0,24,6,1,0,1,0,0x57cb8b63201c79eae2ca188c1564ad14 +38,1,0,25,7,1,0,1,0,0x066717bbc647e2c2e18083bbe9967ddc +38,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,27,9,1,0,1,0,0x1519ced0c432043032017bb5cda99b48 +38,1,0,28,10,1,0,1,0,0x6d9980a335ce677093a403c48ac82919 +38,1,0,29,11,1,0,1,0,0xbf1d34b77bbe31926fb40eaca6708a55 +38,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +38,1,0,31,13,1,0,1,0,0x0539af7f214ee8cdfe97555b7b7617b8 +38,1,0,32,14,1,0,1,0,0xefee0e954c6969c1f68340e4f05733ea +38,1,0,33,15,1,0,1,0,0xeebd5dc56340fca3c3d100a77e368033 +38,1,0,34,0,0,1,1,0,0x00000000000000000000000000000000 +38,1,0,35,1,0,1,1,0,0x00000000000000000000000000000000 +38,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +38,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +39,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +39,1,0,1,1,1,0,0,0,0x0c23cf18d6032b477ae9ac12df7f8a81 +39,1,0,2,2,1,0,0,0,0xf227c2a405ba4a8e64bf9e20e7b23d30 +39,1,0,3,3,1,0,0,0,0x136ffb69678df470b20c50f197183b22 +39,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +39,1,0,5,5,1,0,0,0,0x053dd107a98aa45a223627c66faa38d1 +39,1,0,6,6,1,0,0,0,0x8d3234a8f2d7bd9caecd78733bffae30 +39,1,0,7,7,1,0,0,0,0xd4c9ba8b1d797431f44175db7ca4fc3b +39,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +39,1,0,9,9,1,0,0,0,0x0a22e2dd5254c9af9849cc24e1d7e1c4 +39,1,0,10,10,1,0,0,0,0xa1c2241c487e34b30a816cb36bebcce9 +39,1,0,11,11,1,0,0,0,0x384a355b62b7fb1c72e38a5659063b4d +39,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +39,1,0,13,13,1,0,0,0,0x0f2013eb74101889d0382ad40f704e22 +39,1,0,14,14,1,0,0,0,0x9fe2c7ed1cff90c379b2ff0d3fd264ac +39,1,0,15,15,1,0,0,0,0xcc1c03d31a061935665091792d07c6d4 +39,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +39,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +39,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +39,1,0,19,1,1,0,0,1,0x1999a09ffabb05160db5e85280c29114 +39,1,0,20,2,1,0,0,1,0xb603fa2ea47176217de587280398c982 +39,1,0,21,3,1,0,0,1,0x8e09406198ea2b6874680dd6d9af6cc8 +39,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +39,1,0,23,5,1,0,0,1,0x12529a7c06f435795529589822a04140 +39,1,0,24,6,1,0,0,1,0x6f29307005a96ec47722e6713086cf09 +39,1,0,25,7,1,0,0,1,0x29fd109b070f9792ec0435e25c490df3 +39,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +39,1,0,27,9,1,0,0,1,0x0edb7407e7bd616ed73acd8ead49503f +39,1,0,28,10,1,0,0,1,0xaf321403bd1a9c064f3f1b5aaea9aa29 +39,1,0,29,11,1,0,0,1,0xd633068c207ab997f70c05d1873525d9 +39,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +39,1,0,31,13,1,0,0,1,0x06244a42d06bee7fcee4666ba03f2541 +39,1,0,32,14,1,0,0,1,0xf07d51160d0fce8e0d9ce8d301c0da36 +39,1,0,33,15,1,0,0,1,0x454592dbf01b1c32cdbc635c43ac7781 +39,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +39,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +39,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +39,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +40,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,1,1,1,0,1,0,0x0516111d71031d9d03179417b081c4a9 +40,1,0,2,2,1,0,1,0,0x9b480f6fb3225917d861eb513065fe14 +40,1,0,3,3,1,0,1,0,0xbbdffd75e1dd921663a9551d36afd4cb +40,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,5,5,1,0,1,0,0x0eaa1c6f6161f416cf8858c30617bf9a +40,1,0,6,6,1,0,1,0,0xb785564bd73fb839f54678d852dfc687 +40,1,0,7,7,1,0,1,0,0x613a2a45374ffd1ddbf638e3ae17c805 +40,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,9,9,1,0,1,0,0x14fcf90c25e51d0ca0496c6a0ad155e8 +40,1,0,10,10,1,0,1,0,0x86fb04688a3ba4f129df89e4513e6ab9 +40,1,0,11,11,1,0,1,0,0xea5cb305e119ddb3cd42823b7799d25e +40,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,13,13,1,0,1,0,0x02e684e74171d61780dc961a79364d10 +40,1,0,14,14,1,0,1,0,0x1860232f235b3af3366208b8135aad60 +40,1,0,15,15,1,0,1,0,0xb8c7337d66d70ae58a8b7fc695c87053 +40,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +40,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +40,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +40,1,0,34,0,0,1,1,0,0x64f3637d5a52e457cf2f8c61946dab94 +40,1,0,35,1,0,1,1,0,0xc7f2ed919779e7b59a3ece234a660357 +40,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +40,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +41,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +41,1,0,1,1,1,0,0,0,0x17b8f83d8ce54a18bec0f828da4faffa +41,1,0,2,2,1,0,0,0,0x78904aa039f059260ed97d513409c169 +41,1,0,3,3,1,0,0,0,0x68fcd5b688bcccca24c2aed0b038ec72 +41,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +41,1,0,5,5,1,0,0,0,0x05130f418556cf8aa4082bce2e56c605 +41,1,0,6,6,1,0,0,0,0x7d29464d06a6892e5a4fdb0329c451a6 +41,1,0,7,7,1,0,0,0,0xfa6b53c5393f2ba1a5f47d0c229a806e +41,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +41,1,0,9,9,1,0,0,0,0x090656d8dce342b21cd2571406046a4e +41,1,0,10,10,1,0,0,0,0x109b710bcdfb0688876718bca51217e3 +41,1,0,11,11,1,0,0,0,0xc12cb91cf422ed185a5927b2cc85ad22 +41,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +41,1,0,13,13,1,0,0,0,0x012bb36ca58962d4329330781f07674b +41,1,0,14,14,1,0,0,0,0x4a5c7db65ecc629e1eee795e5de1812d +41,1,0,15,15,1,0,0,0,0x59e53386ede18ef3fedd2009d9d4d1b7 +41,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +41,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +41,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +41,1,0,19,1,1,0,0,1,0x1250c13912197d1620bedbc3e239d07c +41,1,0,20,2,1,0,0,1,0x3b94a1f00af429e41c4729203a93d5ad +41,1,0,21,3,1,0,0,1,0x49194e1a07ce7fdf610cf5d47c6ef1dc +41,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +41,1,0,23,5,1,0,0,1,0x14e855192aa0eb09738f9f212f61232c +41,1,0,24,6,1,0,0,1,0x64d450acc379f19a0899057f4a9001ba +41,1,0,25,7,1,0,0,1,0x03aca16cf4edbe0f743d541220d1ad55 +41,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +41,1,0,27,9,1,0,0,1,0x04fb26238aee8ae0777fdf8f6d86bbd8 +41,1,0,28,10,1,0,0,1,0x884c8433e7eac05960138d26f0caa0bb +41,1,0,29,11,1,0,0,1,0x8a136c948f702bd490e834666a8a62e6 +41,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +41,1,0,31,13,1,0,0,1,0x18ca45b0ac14064bf88f38757b76a2b9 +41,1,0,32,14,1,0,0,1,0x29fd80b38aa845677275a28d375b9906 +41,1,0,33,15,1,0,0,1,0x8c4197c8a9355c16b2910f6985b072c4 +41,1,0,34,0,0,1,0,0,0x554c46d47b968f73316ca38361c0fff8 +41,1,0,35,1,0,1,0,0,0xe5a32ee7fd72e535190fc30eb0918cdc +41,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +41,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +42,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,1,1,1,0,1,0,0x0872a9eb877168d53bca562e43335e8b +42,1,0,2,2,1,0,1,0,0x072723a68329dc17cea39f58dfeac2f9 +42,1,0,3,3,1,0,1,0,0x85dec8d3cddaf7e44af3e950c14f52ee +42,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,5,5,1,0,1,0,0x008f17e5fa152d864f3b5b66145cfa7e +42,1,0,6,6,1,0,1,0,0xb170f3a71988a3797a1ba59fd009fce0 +42,1,0,7,7,1,0,1,0,0xc3de859579bf2a79f3346cd4ceb57634 +42,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,9,9,1,0,1,0,0x13295fed34d43b84dc306371bdf0b8f8 +42,1,0,10,10,1,0,1,0,0x802012fce1b4628fc1d3e8a4012a24f1 +42,1,0,11,11,1,0,1,0,0x76bcdec3a42ee252b8f6b2bc4197de90 +42,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,13,13,1,0,1,0,0x012bbb290733bcc3fac637708a88e07d +42,1,0,14,14,1,0,1,0,0x1d3cdb6d377615fa7dd9e318d3fb52dc +42,1,0,15,15,1,0,1,0,0xaf040892a3c890cd6f54f987b4981abc +42,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +42,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +42,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,19,1,1,0,1,0,0x133203f7d7f566981ecff341b5c2d649 +42,1,0,20,2,1,0,1,0,0x6c96d01597d158561b3b5fe78166b0cd +42,1,0,21,3,1,0,1,0,0x07811cf0c0c46dc300b234aa3dd2724b +42,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,23,5,1,0,1,0,0x114e56a025281fd0ace416c4667d0bdb +42,1,0,24,6,1,0,1,0,0x12a367e560e0ce283ee69c71fa1ac6a8 +42,1,0,25,7,1,0,1,0,0xfe7e67a7e8b6861adb5d5fe26ab7aa1d +42,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,27,9,1,0,1,0,0x003afc689eeb9b21d4ab4c15c37a4706 +42,1,0,28,10,1,0,1,0,0xe4e9451e1abd1c128c2fa2216a9f7e7f +42,1,0,29,11,1,0,1,0,0x7b094ee356c2014128821662efec5314 +42,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +42,1,0,31,13,1,0,1,0,0x0c5c1cbb3b65c20d6adae0e343fdbd83 +42,1,0,32,14,1,0,1,0,0x868d26020a73d219d81b725cdf5b3dd7 +42,1,0,33,15,1,0,1,0,0xf0646864fc83db0c85d1f4c08f299115 +42,1,0,34,0,0,1,1,0,0x12392d2bf030e1a6da645b79e3caef6c +42,1,0,35,1,0,1,1,0,0x67054a58a47ec4e54bb32e700a7211c0 +42,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +42,0,1,1,1,0,0,1,0,0x01b85d0b97350fed4502d6d3e650feaa +42,0,1,2,2,0,0,1,0,0x2c14a06b9d68779a5d0a51d95a6a2525 +42,0,1,3,3,0,0,1,0,0xe9606cefbf5c57ebe1ca62e2238d8abf +42,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +42,0,1,5,5,0,0,1,0,0x0357b058ce4cb85dced1db40471e9c14 +42,0,1,6,6,0,0,1,0,0xf80f9bcc44accbe117b05574feb24f29 +42,0,1,7,7,0,0,1,0,0x93ad80908e66c5a8a1524d21a33946da +42,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +42,0,1,9,9,0,0,1,0,0x020d6cf1badc245040b77090b0870bd7 +42,0,1,10,10,0,0,1,0,0x5d3905047fdba0bf59a2fe39dc37270a +42,0,1,11,11,0,0,1,0,0x5728c84ebd784207d114a63b183cdd87 +42,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +42,0,1,13,13,0,0,1,0,0x0c035c82066906a5aaf101869c7fb34f +42,0,1,14,14,0,0,1,0,0x1eecdcdc26ef882f96adf484cc6732f3 +42,0,1,15,15,0,0,1,0,0xec792e257848549e144dfbe09885a335 +43,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +43,1,0,1,1,1,0,0,0,0x013cac92c0f0364df73556db1b97b939 +43,1,0,2,2,1,0,0,0,0x631ec435bffb797b4a1b77dbe7459544 +43,1,0,3,3,1,0,0,0,0x5aeedc2457720202536d8462f914d5b3 +43,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +43,1,0,5,5,1,0,0,0,0x0c294c1fa08bb616917d1199dbf191f9 +43,1,0,6,6,1,0,0,0,0xf41a40942e6aa6f143c3cb548f7a41f0 +43,1,0,7,7,1,0,0,0,0xf386f3cd1d5a6a2e69702c0021b0d144 +43,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +43,1,0,9,9,1,0,0,0,0x0e0d4b667be9cf8479d0f14aafeb6629 +43,1,0,10,10,1,0,0,0,0x0ed147348e0895e15e421808f07535fd +43,1,0,11,11,1,0,0,0,0x1e79b6034618752a829ee9c9bf58f4bd +43,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +43,1,0,13,13,1,0,0,0,0x03aa429a0d1066a098d78bcc1f263642 +43,1,0,14,14,1,0,0,0,0x670def7a243f698a8447581c2f7bc801 +43,1,0,15,15,1,0,0,0,0xc06d251784e5f961c938d80c25414d26 +43,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +43,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +43,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +43,1,0,19,1,1,0,0,1,0x01901520bc945f55e315e52f00951bec +43,1,0,20,2,1,0,0,1,0xbcbc18e002643fa7f16bec81e6bf2594 +43,1,0,21,3,1,0,0,1,0x335c344eabb772a75857738dde7ed336 +43,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +43,1,0,23,5,1,0,0,1,0x01aaff35ccb53e8b5a04661e1bd1a5be +43,1,0,24,6,1,0,0,1,0x213d6cd1398f0f5c4014f524c5ba1c2a +43,1,0,25,7,1,0,0,1,0xaecc50a098c3aefb70b871ee8bd5d4a1 +43,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +43,1,0,27,9,1,0,0,1,0x0c4773da8af8bbebd444bab0862750e1 +43,1,0,28,10,1,0,0,1,0xc1f3a6368330a7d67c3943b0a43ff8f3 +43,1,0,29,11,1,0,0,1,0x64f0e8c9e316202a7939ac913ffe2141 +43,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +43,1,0,31,13,1,0,0,1,0x006cff643c96e01067d629884fbe9940 +43,1,0,32,14,1,0,0,1,0x09ad3963c92316a5079e5e1669d2b255 +43,1,0,33,15,1,0,0,1,0x00f012b46a0f1200d1e3ed5bc4e6239c +43,1,0,34,0,0,1,0,0,0x1799a8dddfdd61f8a07ec2c65b659f7c +43,1,0,35,1,0,1,0,0,0x6f8fc699251c0c754c4cdaa8d2714850 +43,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +43,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +44,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,1,1,1,0,1,0,0x04e8560b1da8207909cde226b3fa90c7 +44,1,0,2,2,1,0,1,0,0xa3098ad4cdedebbdb4d00be77799c77a +44,1,0,3,3,1,0,1,0,0xa4125a96dbdb0fd3af8d8de30fcaf49f +44,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,5,5,1,0,1,0,0x18ac457dc4246dc659b6d3325ff272e2 +44,1,0,6,6,1,0,1,0,0x80bd14bb1871b15976f0b60ee2e79e15 +44,1,0,7,7,1,0,1,0,0xa3670eecb2966f15f0ea1c55f4bb4732 +44,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,9,9,1,0,1,0,0x014f7bf27a42b614a7b1139d896a89f4 +44,1,0,10,10,1,0,1,0,0xb0451184b07db562673ed946eacab24b +44,1,0,11,11,1,0,1,0,0x83b4ece1e4f11c3571bb02220b4cf68a +44,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,13,13,1,0,1,0,0x187b3489c9ca6d35542dc80647b1ae40 +44,1,0,14,14,1,0,1,0,0x2bd14f906865ddd1de7bb47da3b724ed +44,1,0,15,15,1,0,1,0,0xb646150a5856d927179f2d2fa94c2735 +44,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +44,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +44,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +44,1,0,34,0,0,1,1,0,0x75a27b75fc3f9a357124d23c3aa46629 +44,1,0,35,1,0,1,1,0,0x552e95c55b280ffdfb00afe2f716e452 +44,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +44,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +45,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +45,1,0,1,1,1,0,0,0,0x03f72c227538db943fb8004e16b57022 +45,1,0,2,2,1,0,0,0,0xfd8c3fc63ef7218c8f6a898bd1c0a442 +45,1,0,3,3,1,0,0,0,0x05de895b253efc9425aa0f435c3f9104 +45,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +45,1,0,5,5,1,0,0,0,0x133780f002e4294f11f35258ab67931f +45,1,0,6,6,1,0,0,0,0x77fdd8d90023f300cc372bf5a08d387d +45,1,0,7,7,1,0,0,0,0xce30f6b49e085837b5c29b490da7154d +45,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +45,1,0,9,9,1,0,0,0,0x16bd9ccf73e789b048de0e4f8dd28d07 +45,1,0,10,10,1,0,0,0,0xf10fbaeb4ae38bcbc35bf2b22f99c7ec +45,1,0,11,11,1,0,0,0,0x7b99b379ee266f84a239e83c672f0a0e +45,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +45,1,0,13,13,1,0,0,0,0x0b54cf0cea13cc6e5b93f8693f899d52 +45,1,0,14,14,1,0,0,0,0x8fd8c1b2ddaecea040185d6ab132f2cb +45,1,0,15,15,1,0,0,0,0x39b41cb04397391c4416ab5aea856ec6 +45,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +45,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +45,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +45,1,0,19,1,1,0,0,1,0x17386d402d52fc1b73b239727be76fb7 +45,1,0,20,2,1,0,0,1,0xf3c433bf993717fb461c6d77561d58ae +45,1,0,21,3,1,0,0,1,0x241430defecb3d7c9441e747a95c2d28 +45,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +45,1,0,23,5,1,0,0,1,0x13c779131b46a2c812feb3782b491e37 +45,1,0,24,6,1,0,0,1,0x133a3a2b894e1384d44738c33b857c8f +45,1,0,25,7,1,0,0,1,0x18bb19ca9f98715c57aa57953aaae527 +45,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +45,1,0,27,9,1,0,0,1,0x0f5f48a3cc9252800a859bf07e8efcb0 +45,1,0,28,10,1,0,0,1,0x0b5ea0244d357c9eea3d96ce31ea0456 +45,1,0,29,11,1,0,0,1,0x4de24e4757a7eb66728e18678347216c +45,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +45,1,0,31,13,1,0,0,1,0x0b264b3131581ed595146febb74b7223 +45,1,0,32,14,1,0,0,1,0xca43150ce82f4433b40e4882459cf643 +45,1,0,33,15,1,0,0,1,0xcfe2efece5a06753aec236f776678468 +45,1,0,34,0,0,1,0,0,0x7d66560873b1402bde32491c2a65a9e4 +45,1,0,35,1,0,1,0,0,0xbd9ff42502fde06b62e9ae238797add4 +45,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +45,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +46,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,1,1,1,0,1,0,0x0384f2cf4080af6939d6f89c3da80f37 +46,1,0,2,2,1,0,1,0,0x331ebf51f837e8e6088f3bc671ea631f +46,1,0,3,3,1,0,1,0,0xfb15d4ea9c4986b2d51e97fa8fd930b0 +46,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,5,5,1,0,1,0,0x06464fc9910df59be4ca9b4966a8ad3a +46,1,0,6,6,1,0,1,0,0x7f2802eef085a5373211bf6d95f69cd1 +46,1,0,7,7,1,0,1,0,0xf78a68ef60b4a651cc36676509f1e233 +46,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,9,9,1,0,1,0,0x136eecaab808d85f2ea9868e6ca517cf +46,1,0,10,10,1,0,1,0,0x3774bad6e707ede9c232f269a068a4c3 +46,1,0,11,11,1,0,1,0,0x7c30aaf8814a563be78c4cd81a57946e +46,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,13,13,1,0,1,0,0x0d4a95fc07520031086c127bde428a02 +46,1,0,14,14,1,0,1,0,0x48ca0120544ac2a250ca5bf75ce94482 +46,1,0,15,15,1,0,1,0,0x00c730f88e40ca79f4b6c044d63bada8 +46,1,0,16,0,0,1,1,0,0x00000000000000000000000000000000 +46,1,0,17,1,0,1,1,0,0x00000000000000000000000000000000 +46,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,19,1,1,0,1,0,0x127c5f90ad1563613c88636bf21924f1 +46,1,0,20,2,1,0,1,0,0xa6de1bef849c57603e55a73c081539ab +46,1,0,21,3,1,0,1,0,0x9d3a0852402f6ced05e66f5d979d017f +46,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,23,5,1,0,1,0,0x154df2cf58a6ae587cd097ca3b78ddf1 +46,1,0,24,6,1,0,1,0,0x5212009848d3eb7ddd689acc32b45b68 +46,1,0,25,7,1,0,1,0,0x03eaf25160678098482a55a10df98253 +46,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,27,9,1,0,1,0,0x125f136a54892733c9c427006b727998 +46,1,0,28,10,1,0,1,0,0x49540d5369509a8bc2698bea68163387 +46,1,0,29,11,1,0,1,0,0x5ba670b6001705da4dba2bd9dab2985f +46,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +46,1,0,31,13,1,0,1,0,0x081038275f01f7d905b66077860e707f +46,1,0,32,14,1,0,1,0,0xab757ae443205e28944f402a005db158 +46,1,0,33,15,1,0,1,0,0x2a53dac620a29ba6f6bdb33f4c202818 +46,1,0,34,0,0,1,1,0,0x752b1699a575e977e5cdfdcfee5fda20 +46,1,0,35,1,0,1,1,0,0xb38e12388d66f14bad2f0129a87fbef9 +46,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +46,0,1,1,1,0,0,1,0,0x0c11b19c9d9bc9a0223e61268d5f87d6 +46,0,1,2,2,0,0,1,0,0xe8dd37871f80d4723c90a5fc30921343 +46,0,1,3,3,0,0,1,0,0x994b4700b4e8ed1463f64662b4dd598a +46,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +46,0,1,5,5,0,0,1,0,0x0bfd6252da077eb8455ae4f98069de6c +46,0,1,6,6,0,0,1,0,0x20fab855b9a980b26e7fe48d569fe427 +46,0,1,7,7,0,0,1,0,0x7dc719cbb0ada930174f2746b4ffc057 +46,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +46,0,1,9,9,0,0,1,0,0x124759fa30cdccec0daccb40866bd2ff +46,0,1,10,10,0,0,1,0,0x33b6e85a36b1f28432976a9c53230ff1 +46,0,1,11,11,0,0,1,0,0x05fea6ae444f336a4aa0bcca41a9ea40 +46,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +46,0,1,13,13,0,0,1,0,0x00ad1b9fb202467a606caaa24d45ece8 +46,0,1,14,14,0,0,1,0,0xcf86fad1bdab6ad8febac752f6943143 +46,0,1,15,15,0,0,1,0,0x334db183481bb2d294d5b8b9325bd57b +47,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +47,1,0,1,1,1,0,0,0,0x11416166c9e21b5998e5c7e791095e48 +47,1,0,2,2,1,0,0,0,0x423819fe3bd8b52838c752a988afb02a +47,1,0,3,3,1,0,0,0,0x1fea586fe9146b30f0ffd68160b1f7db +47,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +47,1,0,5,5,1,0,0,0,0x016ead034eb7f65d483d35a64bed965f +47,1,0,6,6,1,0,0,0,0x07e170f4f1dd6cbb13024aa444d6db4d +47,1,0,7,7,1,0,0,0,0xb39f2a1c9a63882eb2a514ba5dabb736 +47,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +47,1,0,9,9,1,0,0,0,0x0df17cc19d64fcca23f4ff933d297829 +47,1,0,10,10,1,0,0,0,0x77e2a97c8bbc3eda572c7dfbc25b128d +47,1,0,11,11,1,0,0,0,0xace8aa3a59193a3f432a8806e1e3a742 +47,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +47,1,0,13,13,1,0,0,0,0x0ca519f3c3f87390f2c96801991724ba +47,1,0,14,14,1,0,0,0,0x93173204f1964ebd41c0f7653beaf5cc +47,1,0,15,15,1,0,0,0,0x7685b0101de67a33202d59a8f0b5e5b3 +47,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +47,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +47,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +47,1,0,19,1,1,0,0,1,0x14bce7f18c0aaf72fde05dc0b7f8269c +47,1,0,20,2,1,0,0,1,0x459b46b1434a9de536387812406916b1 +47,1,0,21,3,1,0,0,1,0x3814589e349e58f28659ab69b05ae601 +47,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +47,1,0,23,5,1,0,0,1,0x03e68fd9e467a38ade1f98928ab1774f +47,1,0,24,6,1,0,0,1,0x78eb67a592a8b09ac74a4eb5fa760f34 +47,1,0,25,7,1,0,0,1,0xa856017605124d0988663a13b89dde69 +47,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +47,1,0,27,9,1,0,0,1,0x010d4fad8db9fecba76480c6f42a3619 +47,1,0,28,10,1,0,0,1,0x21469ca696f34738a0a5c4598d39e078 +47,1,0,29,11,1,0,0,1,0xa136086f29236a638a2a341beab696df +47,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +47,1,0,31,13,1,0,0,1,0x166d723f0f7e83f9eb0411f1547fa6fa +47,1,0,32,14,1,0,0,1,0x716b1f7e07a8105ec7480de8a9cc2c89 +47,1,0,33,15,1,0,0,1,0xc1985b55380e71e31f6a3b6ac47ba738 +47,1,0,34,0,0,1,0,0,0x74a1691d61e11eb3a20d429003d797c4 +47,1,0,35,1,0,1,0,0,0x48b85dfed2622fc9e5eda5283f746ecb +47,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +47,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +48,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +48,1,0,1,1,1,0,0,1,0x0daec1f756feee70421e0baea139c462 +48,1,0,2,2,1,0,0,1,0xac1c3a33bb18aeaf28f25c31aa5bb6f7 +48,1,0,3,3,1,0,0,1,0x464165bb944022fd67c6e4b3b2984c4b +48,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +48,1,0,5,5,1,0,0,1,0x0848012c1e20bbc49a84cda68956dc74 +48,1,0,6,6,1,0,0,1,0x3052950410b08d5562dfc86d360d9a96 +48,1,0,7,7,1,0,0,1,0x0216513ca542dde2aed30401417ea951 +48,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +48,1,0,9,9,1,0,0,1,0x0281fe11fe022601e1d44d1e066224d4 +48,1,0,10,10,1,0,0,1,0x1a6027a68864987e7deeec1edade9848 +48,1,0,11,11,1,0,0,1,0x450bf017ee9ef32088e77aa291866411 +48,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +48,1,0,13,13,1,0,0,1,0x17f668d50e05e4c7f185377e64a91129 +48,1,0,14,14,1,0,0,1,0xfac1cf0b473aaa7979d67f2199d7f4e9 +48,1,0,15,15,1,0,0,1,0x1b066ad3fb6fc703b646f493e9563713 +48,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +48,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +48,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +48,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +48,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +48,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +48,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +49,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +49,1,0,1,1,1,0,0,1,0x0d30668f35d11c3be594c69179f6226d +49,1,0,2,2,1,0,0,1,0xf5916c2d300d62288679d2e2d5d812c7 +49,1,0,3,3,1,0,0,1,0xbee7c083a30d52f7513c1bbbc9ce871a +49,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +49,1,0,5,5,1,0,0,1,0x01099b56a1b2604389383bc86933a4df +49,1,0,6,6,1,0,0,1,0xa48dbe38f0e9f8597f0e0b2efdf3db77 +49,1,0,7,7,1,0,0,1,0x510d2bffc9a4fc36e02fa73065a74b37 +49,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +49,1,0,9,9,1,0,0,1,0x172e046055cf0edf7ccfd636570978f3 +49,1,0,10,10,1,0,0,1,0x9249d0dde820707dc9d8d68b66f76dd0 +49,1,0,11,11,1,0,0,1,0xca99c88396d12fae419b7bb532b163e1 +49,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +49,1,0,13,13,1,0,0,1,0x05a75ec3c5462779689611193ebf438f +49,1,0,14,14,1,0,0,1,0x56c606b6b2d7cd56895a4f43124742c8 +49,1,0,15,15,1,0,0,1,0x81c3b8bd3eb7f5d3c5c87f652d598ec4 +49,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +49,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +49,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +49,1,0,19,1,1,0,0,0,0x09619391a597584bdcabe6406404059e +49,1,0,20,2,1,0,0,0,0x9cb367e5294171a58d58d0dbe43086a5 +49,1,0,21,3,1,0,0,0,0x0410fbb152df928bd8b4b25d9d70cc3a +49,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +49,1,0,23,5,1,0,0,0,0x0dfecca90cecb02bea90de5aad4d0103 +49,1,0,24,6,1,0,0,0,0x5b0df623c7cf8794724110bce7727359 +49,1,0,25,7,1,0,0,0,0xae5b02b51f32be55e52f589cd6c0985a +49,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +49,1,0,27,9,1,0,0,0,0x01c7f907f7e7ae17211267d0a498e7f0 +49,1,0,28,10,1,0,0,0,0xd3eb6e5797b7f89caffdbe96ee588fa2 +49,1,0,29,11,1,0,0,0,0xc0aa53574d87118990fa4b8587cd8bcb +49,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +49,1,0,31,13,1,0,0,0,0x017b47de740a7ddffbe6f3a5e7d65910 +49,1,0,32,14,1,0,0,0,0x171da6c0a062b5226aa2339f8a903486 +49,1,0,33,15,1,0,0,0,0x6340eca6068f8ba8ea52211dbad73c1c +49,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +49,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +49,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +49,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +50,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +50,1,0,1,1,1,0,0,1,0x0b4ab52a9017e96ff43c6f1e0e27481c +50,1,0,2,2,1,0,0,1,0x6932c5314aa201fa0de0a6de3985ee19 +50,1,0,3,3,1,0,0,1,0xc66af9517e96601a0705838e095458d0 +50,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +50,1,0,5,5,1,0,0,1,0x11a40aff69d9044fe8f8882c4d94a866 +50,1,0,6,6,1,0,0,1,0xfdfc11e03b23cdcf9b9c9ae9487902e7 +50,1,0,7,7,1,0,0,1,0xf96b336629954e4a3be71af140243972 +50,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +50,1,0,9,9,1,0,0,1,0x09a34cfc3c2b362b8a7f81521bdd5d6e +50,1,0,10,10,1,0,0,1,0xf7446fe37a8a71b7af28c3725869b687 +50,1,0,11,11,1,0,0,1,0x061dfee9fcf48ae1b117ffe00f14378d +50,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +50,1,0,13,13,1,0,0,1,0x08d37ceccd8b1a936a2e4c05e82c4ff0 +50,1,0,14,14,1,0,0,1,0x21426a646a0b4258765c38f43dce0ec3 +50,1,0,15,15,1,0,0,1,0x8b9df5b5174232c21d3870c1e9aa67f9 +50,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +50,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +50,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +50,1,0,19,1,1,0,0,0,0x0d386e1c4edd875b80f017783f127d90 +50,1,0,20,2,1,0,0,0,0xdea93ae8c6445dbca92278c5c1e7b23f +50,1,0,21,3,1,0,0,0,0xb3a8920ec005eeb2da215a7b00eb2816 +50,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +50,1,0,23,5,1,0,0,0,0x1082d9460d7c01c834c0a178c80468a2 +50,1,0,24,6,1,0,0,0,0x02bfe9405de4ffea438987d772bd5b3f +50,1,0,25,7,1,0,0,0,0x1ee012db835ff1a14e8044cd566552a8 +50,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +50,1,0,27,9,1,0,0,0,0x189c1e676042193eece74951078315d0 +50,1,0,28,10,1,0,0,0,0xfbe92cf4de1cb6c908f855d80cd1450a +50,1,0,29,11,1,0,0,0,0x8fbcc7a68d5149f1ffe234189c11bad1 +50,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +50,1,0,31,13,1,0,0,0,0x0f39c617291a2e098cf359046f1ab25f +50,1,0,32,14,1,0,0,0,0x21e7725c56bb37537195122693f73d2e +50,1,0,33,15,1,0,0,0,0xf5952a76d90bec3f81f68bb90ffe7f8d +50,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +50,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +50,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +50,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +51,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +51,1,0,1,1,1,0,0,1,0x09d8f49cda1179a22295a0e06ab11dfe +51,1,0,2,2,1,0,0,1,0xd17c544b50c03f378c46dda1faef1c0e +51,1,0,3,3,1,0,0,1,0x4120fbac915bb5f6c40079b8b63d2b3e +51,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +51,1,0,5,5,1,0,0,1,0x0e1076292b47c8b8e3132dfcbd92ce59 +51,1,0,6,6,1,0,0,1,0x0d4a927ad30bea07c52be3a87477ab5b +51,1,0,7,7,1,0,0,1,0x1c656560e91aa312c6f92a4cfeced56e +51,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +51,1,0,9,9,1,0,0,1,0x158359a0acdac1cf16ab6d0b39d22950 +51,1,0,10,10,1,0,0,1,0xc48455c64450d2c6719c78b13a1db1bc +51,1,0,11,11,1,0,0,1,0xc13afc273df0ac85fad84e9225186fce +51,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +51,1,0,13,13,1,0,0,1,0x13fe59d117b18da67574e1143d21fe69 +51,1,0,14,14,1,0,0,1,0xfc8400a8e86104a50818f888ab0dfc7a +51,1,0,15,15,1,0,0,1,0xa00dfd5e1aa57b10d870b2beaf726ae9 +51,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +51,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +51,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +51,1,0,19,1,1,0,0,0,0x11879709b3ab836940940e5f48ab91ed +51,1,0,20,2,1,0,0,0,0x608e8fa7d26693b479f4f0436078e44f +51,1,0,21,3,1,0,0,0,0x9224b9d0aa080ddf8d51565fe1e92940 +51,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +51,1,0,23,5,1,0,0,0,0x14b1ae58d577a4d188055f3f5d017ba6 +51,1,0,24,6,1,0,0,0,0xffac8f406a16d89b0320e0d54ce58c5b +51,1,0,25,7,1,0,0,0,0xdd84349f23e2f2395027ecbee1e01170 +51,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +51,1,0,27,9,1,0,0,0,0x11e51fdd9e23c673643f1f0b27397ece +51,1,0,28,10,1,0,0,0,0x53429c478950fa497341b14b8448042d +51,1,0,29,11,1,0,0,0,0x14d73b34918b988e328070aaff14ebc3 +51,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +51,1,0,31,13,1,0,0,0,0x000d873bc7dc2821b18fa78da3e521cd +51,1,0,32,14,1,0,0,0,0x6ba60e67f2bd357e59dda107ec74d680 +51,1,0,33,15,1,0,0,0,0x6a2108554c071234f4a202023a30ba55 +51,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +51,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +51,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +51,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +52,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +52,1,0,1,1,1,0,0,1,0x18c516799e6cefa54019bf2cee74e8c0 +52,1,0,2,2,1,0,0,1,0x6c970864c25b05f6c1c50074cfa244b8 +52,1,0,3,3,1,0,0,1,0x8e7d27f4fa5860afbb6551e90c8bbb0e +52,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +52,1,0,5,5,1,0,0,1,0x0ff2d0bb5d9f2018cf8a6faccd93ee20 +52,1,0,6,6,1,0,0,1,0xa8b6e134640c33ecda73224ba284c403 +52,1,0,7,7,1,0,0,1,0x2866b018661197a27d1721b7c92e744b +52,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +52,1,0,9,9,1,0,0,1,0x191cac282c98d8353803430367131d0b +52,1,0,10,10,1,0,0,1,0x09721259bc40fcda44b3dc08e611b04b +52,1,0,11,11,1,0,0,1,0x5132b6de655a40bb65eaa8ef431d14df +52,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +52,1,0,13,13,1,0,0,1,0x0ad32291d5025c7c003f1ad4c4efb72b +52,1,0,14,14,1,0,0,1,0xfaba03c47db58c35e1a9b910178990df +52,1,0,15,15,1,0,0,1,0xd797bf026d2299cf7e31a1ae6a772c71 +52,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +52,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +52,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +52,1,0,34,0,0,1,0,0,0x0b5b3adc9d86e6d48200636c19006976 +52,1,0,35,1,0,1,0,0,0x4405693c8f90cfdab0ba6819ecca3398 +52,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +52,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +53,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +53,1,0,1,1,1,0,0,1,0x054341f674d9b37ddc507987638a7afb +53,1,0,2,2,1,0,0,1,0x2921e151567aea9149ea577d98b23dfd +53,1,0,3,3,1,0,0,1,0xee02982e1a1734204a6f5dc1e1359dab +53,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +53,1,0,5,5,1,0,0,1,0x03fe94e6dd90c813f4ad10ee84aab57e +53,1,0,6,6,1,0,0,1,0x8a635f6aba729068b5976e772626727a +53,1,0,7,7,1,0,0,1,0x3bb2d974c780d1e5f10bfd76dc1e5c8d +53,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +53,1,0,9,9,1,0,0,1,0x0f40e088d22f7bf25e90d92f291d5621 +53,1,0,10,10,1,0,0,1,0x1d8818e165b5f038b3f3ae8ac50e5357 +53,1,0,11,11,1,0,0,1,0xdfecb72d20fec507c378c9659bccf90c +53,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +53,1,0,13,13,1,0,0,1,0x02fbcb66385d7f3f4b1533d5994f90cb +53,1,0,14,14,1,0,0,1,0x3e4074fc9acdd3283aa1ac96579dfeda +53,1,0,15,15,1,0,0,1,0xf1dd6393f1abc6036cd6a84843016010 +53,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +53,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +53,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +53,1,0,19,1,1,0,0,0,0x0fc0283ed390848a39c9a22dc5785592 +53,1,0,20,2,1,0,0,0,0x5e3cefce319f443e25368830707ebdda +53,1,0,21,3,1,0,0,0,0x7636c54857427b10648bbe2f37f4003f +53,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +53,1,0,23,5,1,0,0,0,0x17509e88de2c46ac4289ce1202d8c45f +53,1,0,24,6,1,0,0,0,0xc5e1b956db6aad45a33dee8a8d9ccf4c +53,1,0,25,7,1,0,0,0,0xc323c3fc9be7707c1c96b4fca20e36a4 +53,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +53,1,0,27,9,1,0,0,0,0x0138e5bd05afbb42a42a753978dd4086 +53,1,0,28,10,1,0,0,0,0x53c3cbf95826b3159b103f5aa9eed1a5 +53,1,0,29,11,1,0,0,0,0x6d2d8beda28405230cb7f2558a060c9b +53,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +53,1,0,31,13,1,0,0,0,0x0564a7de96fa5bc3bb5c540ef9e8c14e +53,1,0,32,14,1,0,0,0,0xf4729b143e7f811628f14fa8e3ee2bec +53,1,0,33,15,1,0,0,0,0xd4e0521d2f15d0214b2c2c62b67c170a +53,1,0,34,0,0,1,0,0,0x11b178f13054b0a7faad13ff145e9681 +53,1,0,35,1,0,1,0,0,0x60935ed8348051f264c6a5f8b58b83b6 +53,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +53,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +54,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +54,1,0,1,1,1,0,0,1,0x196611265e1c6d117db3f91439868a1c +54,1,0,2,2,1,0,0,1,0xcb04c83e5f9af09809499fefdb61b416 +54,1,0,3,3,1,0,0,1,0x980c7314375c484b5cf37608efeee773 +54,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +54,1,0,5,5,1,0,0,1,0x037c47b002dfb3d6725257abc57f59c0 +54,1,0,6,6,1,0,0,1,0xc3032aeb1e5e0578f9006587fbf99a1f +54,1,0,7,7,1,0,0,1,0xb20c0df27132eca555d59fa73cfcf4c9 +54,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +54,1,0,9,9,1,0,0,1,0x14b09a01c2b23e6759b9209443d59f62 +54,1,0,10,10,1,0,0,1,0x44ef816d7e2679eac2e68cac67fbe702 +54,1,0,11,11,1,0,0,1,0xd429608a9453376dfa23ec7cf8162ff2 +54,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +54,1,0,13,13,1,0,0,1,0x1212e46364a26f0e3de59cc683b5c42d +54,1,0,14,14,1,0,0,1,0x90fcf7e5a2c291fc63ab09093981efd2 +54,1,0,15,15,1,0,0,1,0xfc885f13311698c5cbf9dd553312a95b +54,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +54,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +54,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +54,1,0,19,1,1,0,0,0,0x109b39d7cec4445e764c6d744d737bec +54,1,0,20,2,1,0,0,0,0xeabb4180ec5d6ed94f4e786e64de1801 +54,1,0,21,3,1,0,0,0,0x111586b83b8638528a27e61170764377 +54,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +54,1,0,23,5,1,0,0,0,0x041fd3aa544741118af29c503bdc704b +54,1,0,24,6,1,0,0,0,0x2a8ea05289dcba44d38360152a7b71ce +54,1,0,25,7,1,0,0,0,0xf7250d9cc427c9a845851ae7b95c0bb0 +54,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +54,1,0,27,9,1,0,0,0,0x18e274dc2bb8b6b3bf311fdfd39b52e1 +54,1,0,28,10,1,0,0,0,0x7bbf820d89946e7c87019da7de29ac62 +54,1,0,29,11,1,0,0,0,0xf642f0b02067fe553cf4039c92ed0bdf +54,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +54,1,0,31,13,1,0,0,0,0x045967fe3bfd8b4b99792e62102a5b4a +54,1,0,32,14,1,0,0,0,0x01c026eb87f9a2a8137bc8c6f78445a3 +54,1,0,33,15,1,0,0,0,0x3e46ac4cbb56e51e24c9625878f72797 +54,1,0,34,0,0,1,0,0,0x554133e0b6af78ebee183048333fb886 +54,1,0,35,1,0,1,0,0,0x6e0c216af7dfd1c52bb6a073210707c5 +54,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +54,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +55,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +55,1,0,1,1,1,0,0,1,0x031c8c7cfaa20bfedf319d83f26b0099 +55,1,0,2,2,1,0,0,1,0x0fbbe723fd48670547468b2ea35643af +55,1,0,3,3,1,0,0,1,0x6d26a0b3856b42e03e7546ab7db01b5f +55,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +55,1,0,5,5,1,0,0,1,0x0f260be84141c70b2adcb1d00fb84296 +55,1,0,6,6,1,0,0,1,0x7b9a348638063118b8ad4fca7d07bce2 +55,1,0,7,7,1,0,0,1,0xe93fec9a5288ae44c2ace05022001a70 +55,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +55,1,0,9,9,1,0,0,1,0x1079f36d91c4fd9ae94b929042448bd9 +55,1,0,10,10,1,0,0,1,0xe3db0aeb60b2d96db62a7641e3694206 +55,1,0,11,11,1,0,0,1,0x09605b747abfeea5159998e49936f06a +55,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +55,1,0,13,13,1,0,0,1,0x191ddec683038afb8cfb419b970ce0dd +55,1,0,14,14,1,0,0,1,0x3a299867ad2acafdbceceebca2446433 +55,1,0,15,15,1,0,0,1,0xa4305b37c0bf17667034e52095ca6043 +55,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +55,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +55,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +55,1,0,19,1,1,0,0,0,0x03b281200b64cc5111c76a8cc8ea042e +55,1,0,20,2,1,0,0,0,0xdae480960f460e6832f8542016232e6a +55,1,0,21,3,1,0,0,0,0x2b3ec5acca11686827a15c9dc31621f0 +55,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +55,1,0,23,5,1,0,0,0,0x0c7d7eb8c790ca9fca63db670730c100 +55,1,0,24,6,1,0,0,0,0x6d0a837ffd1c7ee5c35619ab9a7cfa60 +55,1,0,25,7,1,0,0,0,0x54635129a0bce1a76965749613376833 +55,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +55,1,0,27,9,1,0,0,0,0x0aa823c623911713bd4484e9c9d9790c +55,1,0,28,10,1,0,0,0,0x9236805c21c0126b0380a743836107b1 +55,1,0,29,11,1,0,0,0,0x8e6f059ce5a80870ee9bb1ff782d191c +55,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +55,1,0,31,13,1,0,0,0,0x0a18e4990ba70a9e353d48a77b0604f5 +55,1,0,32,14,1,0,0,0,0x3c2f37419c009207ed0b96cb4cfae2e1 +55,1,0,33,15,1,0,0,0,0x8db8daf2a2c1a2e289b264741c0a410c +55,1,0,34,0,0,1,0,0,0x3f5d2052604fd7e8887850f7734c9c69 +55,1,0,35,1,0,1,0,0,0x8975df372829900d476e11226007178f +55,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +55,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +56,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +56,1,0,1,1,1,0,0,1,0x022b4abe4bbfef5e4016220ac6f16b07 +56,1,0,2,2,1,0,0,1,0x81bb2483c865a267ecf299343b471632 +56,1,0,3,3,1,0,0,1,0x468c19bb1c8d35be77539275ccc452a8 +56,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +56,1,0,5,5,1,0,0,1,0x0d28091cba7c4b95a09b07adaf5f3886 +56,1,0,6,6,1,0,0,1,0x73de329fc57e03da416e0771c1a2c250 +56,1,0,7,7,1,0,0,1,0xf83a76a3139d55b70953c6c26aeed375 +56,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +56,1,0,9,9,1,0,0,1,0x19b62ca31593f2d26f786fa1f528b871 +56,1,0,10,10,1,0,0,1,0xe9d7d05668fa45ce00c6bf0c42af3ffb +56,1,0,11,11,1,0,0,1,0xb44ed13c8df61c6f164f3135186efc16 +56,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +56,1,0,13,13,1,0,0,1,0x075a6a254aa2ebb6515c622d84968385 +56,1,0,14,14,1,0,0,1,0xe8acbc78b68eaeb2175b7744dced7540 +56,1,0,15,15,1,0,0,1,0xd30d0910fdafa2dc6e2c603bc227fbe2 +56,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +56,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +56,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +56,1,0,34,0,0,1,0,0,0x7cd9e7d57cbd7f365735efebfc3a15d2 +56,1,0,35,1,0,1,0,0,0x88d44255e2d5e4cbe1ff6d95fb9f427b +56,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +56,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +57,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +57,1,0,1,1,1,0,0,1,0x08678c24cfe2f25b4faabe529b11d442 +57,1,0,2,2,1,0,0,1,0x17a3dbb45db810277d5c5468ff51a086 +57,1,0,3,3,1,0,0,1,0xdbf75fd8ee14be0625f75c0d4b7245cd +57,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +57,1,0,5,5,1,0,0,1,0x176bb7228ff549fdad68b3aa19e0698b +57,1,0,6,6,1,0,0,1,0x853fb8138f695abaecb5b8751ba38edf +57,1,0,7,7,1,0,0,1,0x93a9361fab2a31567952baf27d0911ec +57,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +57,1,0,9,9,1,0,0,1,0x05beaf576cdb48a32de3d9d08a418032 +57,1,0,10,10,1,0,0,1,0x4931088ad8f210a271afd5c51be97df7 +57,1,0,11,11,1,0,0,1,0x2e0a3650c06d84340546d9db4a2761a1 +57,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +57,1,0,13,13,1,0,0,1,0x0c9bcf684b2cab923851a2007cd2ec97 +57,1,0,14,14,1,0,0,1,0x70474915d42626e5f648991d493f4cad +57,1,0,15,15,1,0,0,1,0x6c93acdead68815178a3ae1bd6c00496 +57,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +57,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +57,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +57,1,0,19,1,1,0,0,0,0x171f7d7eef078c119439a30d6eb29af7 +57,1,0,20,2,1,0,0,0,0x8a62c3c53853205dfde9fd96559dae77 +57,1,0,21,3,1,0,0,0,0x4387f05d3dac88303a9198c357651eae +57,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +57,1,0,23,5,1,0,0,0,0x08945d1266ae4f402458b6ac37988792 +57,1,0,24,6,1,0,0,0,0x511ce2743b312ead3881cee5d3d9618c +57,1,0,25,7,1,0,0,0,0x034fa7e503a4b630def6fe05067141e2 +57,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +57,1,0,27,9,1,0,0,0,0x03826c20f5ef663bf939c1d3f31947c3 +57,1,0,28,10,1,0,0,0,0x8af9fa7cc7b26d78ed80c828a1d78bda +57,1,0,29,11,1,0,0,0,0x374a0d7a263fedb1b609ccbd3b6e77b1 +57,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +57,1,0,31,13,1,0,0,0,0x185e5478ef7d3631b7f20a9d9257a6f4 +57,1,0,32,14,1,0,0,0,0xd09e220e855eab8512757f83ac507f04 +57,1,0,33,15,1,0,0,0,0x4040bba3a0b09e331e30d5bd7033de38 +57,1,0,34,0,0,1,0,0,0x742ba2deed705e24c73962c6bd782016 +57,1,0,35,1,0,1,0,0,0x0e604cdd40888d183fbc7c2a80640323 +57,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +57,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +58,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +58,1,0,1,1,1,0,0,1,0x0f2a243f2777000898b13deea4fb5960 +58,1,0,2,2,1,0,0,1,0x9e70551d945a89fe8a6415cb1b485967 +58,1,0,3,3,1,0,0,1,0x6a55abf6e38df20dd71ae58852059725 +58,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +58,1,0,5,5,1,0,0,1,0x0af8c5a70fef5052d7d6bdafd8964ea3 +58,1,0,6,6,1,0,0,1,0xde17c1a66d73389c4d27f186ab4d493d +58,1,0,7,7,1,0,0,1,0x24ed236e404f59afac0ab22220edc6e6 +58,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +58,1,0,9,9,1,0,0,1,0x07e46697ace7b9cc91b5b9bea498b960 +58,1,0,10,10,1,0,0,1,0x7935be7f27ca78d01d142b3ba2d53d9a +58,1,0,11,11,1,0,0,1,0x136619fddc35803638c149d72c248aa7 +58,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +58,1,0,13,13,1,0,0,1,0x16df489d7625370a21a99fbd6ea6367f +58,1,0,14,14,1,0,0,1,0x20a35d36873b3fc27551f1431754eafb +58,1,0,15,15,1,0,0,1,0x2218d29c64e9a46b85f1ee9c2340b19b +58,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +58,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +58,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +58,1,0,19,1,1,0,0,0,0x0af81e4046e5c07b5f67e0158ce6ae9e +58,1,0,20,2,1,0,0,0,0xe2a5643c6641474e22445d1fbf90cfe0 +58,1,0,21,3,1,0,0,0,0x634393fad35883c3727922378bf8036e +58,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +58,1,0,23,5,1,0,0,0,0x0fb88f2c69c59dbc448b0162e8162268 +58,1,0,24,6,1,0,0,0,0xc0b5b82cdc4d398227ac1381ce8ce2e8 +58,1,0,25,7,1,0,0,0,0xd4243677d644b5095b2576eba4a13bb8 +58,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +58,1,0,27,9,1,0,0,0,0x0fdcd14a48bd215c1807e20e0813042b +58,1,0,28,10,1,0,0,0,0xb057dba0e5fbe2dce9a220522fedf381 +58,1,0,29,11,1,0,0,0,0x36df90e764236c3e55b8e00776275505 +58,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +58,1,0,31,13,1,0,0,0,0x18d8902414b6d8173c53ba05c64418b1 +58,1,0,32,14,1,0,0,0,0x6b3643a4daddd9f9a37d839ae693a482 +58,1,0,33,15,1,0,0,0,0xb8e0f8ed01af6ecf3397e1b156c2e5be +58,1,0,34,0,0,1,0,0,0x7f10e31007da710be5c30a1f0d95e107 +58,1,0,35,1,0,1,0,0,0x4d492be5328f8ffb6448fb055b2122f0 +58,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +58,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +59,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +59,1,0,1,1,1,0,0,1,0x05e2684582fcc0737c7b9a31aed0d9f3 +59,1,0,2,2,1,0,0,1,0x0616416a00830a8603d787c6b13da35c +59,1,0,3,3,1,0,0,1,0xd9553227ac3b33be975f785fd006122f +59,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +59,1,0,5,5,1,0,0,1,0x09eef0b06f7c565a0c3687fb69790ae8 +59,1,0,6,6,1,0,0,1,0x34fdc6ba78a99f5d14d08c2ba1ece847 +59,1,0,7,7,1,0,0,1,0xcc827f57aa88cdc21f40ea1194a7f7d4 +59,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +59,1,0,9,9,1,0,0,1,0x11ff6be11792d4d06c08af3d010aaca9 +59,1,0,10,10,1,0,0,1,0x842e821255192381eef4fba925ebdf4d +59,1,0,11,11,1,0,0,1,0xb1990dfec821788188fbe40bcf9b6284 +59,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +59,1,0,13,13,1,0,0,1,0x080ab8cfd71190867bd0bc6259c4ba70 +59,1,0,14,14,1,0,0,1,0x27571712fff86ca26e641a019dd40b89 +59,1,0,15,15,1,0,0,1,0x984ed0ee1da103787626426aaf6b6a9b +59,1,0,16,0,0,1,0,0,0x00000000000000000000000000000000 +59,1,0,17,1,0,1,0,0,0x00000000000000000000000000000000 +59,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +59,1,0,19,1,1,0,0,0,0x0701aa29d7c9763f6f8904b72019bcca +59,1,0,20,2,1,0,0,0,0xb0826b31300927421a294dde2ae02fad +59,1,0,21,3,1,0,0,0,0x6cad0d0509715b5f99276406ac2a0272 +59,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +59,1,0,23,5,1,0,0,0,0x0769eb17f626b075591f7f5b06f59ccc +59,1,0,24,6,1,0,0,0,0xc6040bca209b80cc66d1c696f57164fa +59,1,0,25,7,1,0,0,0,0x321395909835e2ab74afbfc7bc3015b2 +59,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +59,1,0,27,9,1,0,0,0,0x062416a642bd9136a8425e44455880bf +59,1,0,28,10,1,0,0,0,0xeb2d8a55dcad92a1c40a1eca0178ae87 +59,1,0,29,11,1,0,0,0,0x8510e670f6faf6cc2a49a3fb7ba1124f +59,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +59,1,0,31,13,1,0,0,0,0x13d981b5b64392c33266aa297090a86d +59,1,0,32,14,1,0,0,0,0xc9b5b9ac6f8e9d5ee3966ac5d0b11ede +59,1,0,33,15,1,0,0,0,0xa12bb8b2ecff51026f1382192ee930f7 +59,1,0,34,0,0,1,0,0,0x74181ad1503a121f48dcec7d4d8fdcbe +59,1,0,35,1,0,1,0,0,0x5f68504591416654893364d856c81926 +59,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +59,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +60,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,16,0,0,1,1,0,0x3af90aac7826df54dc8d62a51a0313f2 +60,1,0,17,1,0,1,1,0,0x92d4ad39772a73ea0ed03c7345840fef +60,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +60,1,0,34,0,0,1,1,0,0x00000000000000000000000000000000 +60,1,0,35,1,0,1,1,0,0x00000000000000000000000000000000 +60,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +60,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +61,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +61,1,0,16,0,0,1,0,0,0x111a2de6e920759067cc711870d73d4c +61,1,0,17,1,0,1,0,0,0xb1e06e776e14b5038b52980a982ff84f +61,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +61,1,0,19,1,1,0,0,1,0x093b9e386a53bc546e68da37a5453785 +61,1,0,20,2,1,0,0,1,0x8e76e10726ef635e887a5864afe3a2f3 +61,1,0,21,3,1,0,0,1,0x9a3474e64894871016fd0febdf766a7e +61,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +61,1,0,23,5,1,0,0,1,0x0c1f87cf3212d46cb5d3be4b9b5c10c4 +61,1,0,24,6,1,0,0,1,0x927b51308a46dec4e8b210598b8e010f +61,1,0,25,7,1,0,0,1,0xb0b2adc96d2cd48f420eca28504db10b +61,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +61,1,0,27,9,1,0,0,1,0x19e260d558b981749372c9faab46ac40 +61,1,0,28,10,1,0,0,1,0xab78a3ea5af90aa8bd0f2d9774524775 +61,1,0,29,11,1,0,0,1,0x3e1be6675ee014ad9f115922a7e0db95 +61,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +61,1,0,31,13,1,0,0,1,0x18e13be153554a7fdd46f664169d16a5 +61,1,0,32,14,1,0,0,1,0x59e33a7323a08c41df195fe91d11872f +61,1,0,33,15,1,0,0,1,0x2d8acbdb203f775d089a944ecfa2be21 +61,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +61,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +61,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +61,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +62,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,16,0,0,1,1,0,0x315c674e5e0890d041ace8436f076d81 +62,1,0,17,1,0,1,1,0,0xca0ef8499df50fcd5503ab31b20ca36f +62,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,19,1,1,0,1,0,0x0cd11c8014ccc40c4669021bf23166ee +62,1,0,20,2,1,0,1,0,0xfcb928eab1be19bce0caaa5a7fc13271 +62,1,0,21,3,1,0,1,0,0x05ec139ba80445be187bd72403ff4533 +62,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,23,5,1,0,1,0,0x156ad2fb034143a5a4ca47d546f0e876 +62,1,0,24,6,1,0,1,0,0xacbc01481b09a141a70d343c55abbe2a +62,1,0,25,7,1,0,1,0,0x12a7fdb8c2952fc33ea423d72bc09527 +62,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,27,9,1,0,1,0,0x1443e4182b6101384c522d1525e712e5 +62,1,0,28,10,1,0,1,0,0x5f09acbd4346f11286ca25d2d86abecc +62,1,0,29,11,1,0,1,0,0xe13032e458c58c4da93fb1d6ea481471 +62,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +62,1,0,31,13,1,0,1,0,0x04387c5db1d8d1afea2229e279beafaf +62,1,0,32,14,1,0,1,0,0xd84cc86b718046c2492c701df56c3c1a +62,1,0,33,15,1,0,1,0,0x59fe83d87c82450d1316afd294200131 +62,1,0,34,0,0,1,1,0,0x00000000000000000000000000000000 +62,1,0,35,1,0,1,1,0,0x00000000000000000000000000000000 +62,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +62,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +63,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +63,1,0,16,0,0,1,0,0,0x24f5f85b2c9b3235451a40aa24828d67 +63,1,0,17,1,0,1,0,0,0xbf179e85ab0c88146c79db386fdd2b93 +63,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +63,1,0,19,1,1,0,0,1,0x0ae630e13367591f31e45ed853cabac5 +63,1,0,20,2,1,0,0,1,0x8095806e872a5949babf38f86702c70e +63,1,0,21,3,1,0,0,1,0xa6fcc429901593097c3a0655b2a846a1 +63,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +63,1,0,23,5,1,0,0,1,0x0d1127d9dc99f104bc951fa2b004664b +63,1,0,24,6,1,0,0,1,0x2f51a40503adc04ba322918b7711ecbf +63,1,0,25,7,1,0,0,1,0xe37aad85b3a077e29e060d4c3b09271c +63,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +63,1,0,27,9,1,0,0,1,0x01fbd39a2da7c9a046306c13b33fcd6b +63,1,0,28,10,1,0,0,1,0xaa13e4d35b82bfe229f2f0aafcb9c222 +63,1,0,29,11,1,0,0,1,0x7d3898c26882591cd896237ec2ec75f6 +63,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +63,1,0,31,13,1,0,0,1,0x0388805d62fee05d9054fae1aa4f7352 +63,1,0,32,14,1,0,0,1,0xb03c056a05eceb1fca28847969c246e9 +63,1,0,33,15,1,0,0,1,0xc29c8de209d39ed590a9cd0babd3cb23 +63,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +63,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +63,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +63,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +64,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,16,0,0,1,1,0,0x4c873416d277ff1f2cf5155f6a94ee73 +64,1,0,17,1,0,1,1,0,0xdbe9a9505a99fd137cae95d6ec0cad82 +64,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +64,1,0,34,0,0,1,1,0,0x12f95d1573f9c62ff0f2f549b1073435 +64,1,0,35,1,0,1,1,0,0x8c1abf266a4b9a0aff1a65dd58b844c9 +64,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +64,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +65,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +65,1,0,16,0,0,1,0,0,0x66d6d6da68404d0f0447fd5758602b87 +65,1,0,17,1,0,1,0,0,0xa56b0ccff05271b4aa89134245ca0d56 +65,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +65,1,0,19,1,1,0,0,1,0x100c34c00ee7d0db714a14bf8bfa5fc0 +65,1,0,20,2,1,0,0,1,0xa77e3cd2ced769617cbaf488c206622d +65,1,0,21,3,1,0,0,1,0x308691b497694d9c78817c97bc1d4ee3 +65,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +65,1,0,23,5,1,0,0,1,0x046be152e2617ee48bdd79c605e5cb0f +65,1,0,24,6,1,0,0,1,0xb1a5ae1716ce505fd2cbabe8b5f42f22 +65,1,0,25,7,1,0,0,1,0xabb770a53d2ba46a093143868a33da98 +65,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +65,1,0,27,9,1,0,0,1,0x037bdc4a9d4bf4f8ddebba7fdc01d73b +65,1,0,28,10,1,0,0,1,0x2e6338d2354d2adc52cc503422f3b804 +65,1,0,29,11,1,0,0,1,0x5297c0d33d0bdcf95d70d7943c813451 +65,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +65,1,0,31,13,1,0,0,1,0x0b6a642dba4b1533617a5e29eac8af5d +65,1,0,32,14,1,0,0,1,0x77a7928f4339269f21e1ef9ac854c7b4 +65,1,0,33,15,1,0,0,1,0xae6a92a67c0598947f2c86eb516dbc85 +65,1,0,34,0,0,1,0,0,0x2a4e0d450b416e069702cce8f2a5f00a +65,1,0,35,1,0,1,0,0,0xf9b79b3d17e26fea381ef1b4350a0047 +65,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +65,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +66,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,16,0,0,1,1,0,0x36886fb69e50b3bd76d630a46bace6fb +66,1,0,17,1,0,1,1,0,0xb7406e23fb8e1157100097a6026eab67 +66,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,19,1,1,0,1,0,0x13b9099af89e091f1dd4513a283e95c5 +66,1,0,20,2,1,0,1,0,0x3b4964b1b907438f29b12a5f594635de +66,1,0,21,3,1,0,1,0,0x5b2c4bab93986ff9f88aa8f6f381d7d3 +66,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,23,5,1,0,1,0,0x05bde4e91b1b5b77eb6a08198bd7fcc3 +66,1,0,24,6,1,0,1,0,0xa8169bff30ad184e2e5d8964df17bcc5 +66,1,0,25,7,1,0,1,0,0xf0cb47fd75bb1ca055fe610d9426df75 +66,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,27,9,1,0,1,0,0x06cf0bca5b8c091bca4aae8ae8b97322 +66,1,0,28,10,1,0,1,0,0xc82a70f4a6fb78f0276b083bafe39506 +66,1,0,29,11,1,0,1,0,0xf2f6a4318e566dd3c6e08b0545c8cee3 +66,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +66,1,0,31,13,1,0,1,0,0x12380428ae27162cd4c634ade1255074 +66,1,0,32,14,1,0,1,0,0x80144ac020b96c5e14d349dbf5b75af7 +66,1,0,33,15,1,0,1,0,0xe6b7155851ee807a6cc075587a6ad71d +66,1,0,34,0,0,1,1,0,0x3817ef98e508e364eee281055857b5d1 +66,1,0,35,1,0,1,1,0,0x3477f177d1f3650f2cef33ab4af520be +66,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +66,0,1,1,1,0,0,1,0,0x14fcc055474eadb8aaf9e98cebf63a3c +66,0,1,2,2,0,0,1,0,0xd0c3b862281e8f529a73c2b9af4b925b +66,0,1,3,3,0,0,1,0,0x2e1688e66983ce69045bd716de195580 +66,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +66,0,1,5,5,0,0,1,0,0x15fd6e461289933ef7d350501d4b444a +66,0,1,6,6,0,0,1,0,0xf8d57503a6ae437ae8ba4b91cee0d10a +66,0,1,7,7,0,0,1,0,0x18b42d2ad343fbd2f27811fa96a04aeb +66,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +66,0,1,9,9,0,0,1,0,0x15b5c79aa00bd0f7c0fcf0f130501170 +66,0,1,10,10,0,0,1,0,0x1453840064b5168d8c6b5ebc03751d79 +66,0,1,11,11,0,0,1,0,0x993a1b01d77f956c674c7dea8530c699 +66,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +66,0,1,13,13,0,0,1,0,0x0b55060762de0f248328cb0962660faa +66,0,1,14,14,0,0,1,0,0xe769740a4aa364a2269a8bbd60e47e4b +66,0,1,15,15,0,0,1,0,0x3d27b2b937f0fa1084a33f08d1b25ccb +67,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +67,1,0,16,0,0,1,0,0,0x3db5b3ef051c41a4244db5c15fae63f7 +67,1,0,17,1,0,1,0,0,0x7ab7cf9604d125c9eb692008706e0501 +67,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +67,1,0,19,1,1,0,0,1,0x0232ead2a8d6243ae432993cecd7c430 +67,1,0,20,2,1,0,0,1,0x4c5a59e482e56e4f5c55da12d98528e9 +67,1,0,21,3,1,0,0,1,0xef85fe5d7bd65cbaa17fff9e16dac201 +67,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +67,1,0,23,5,1,0,0,1,0x0b183d1b3a32e045398bcf498a69c3fa +67,1,0,24,6,1,0,0,1,0x56a8724951a4370d2c7d265662ae1894 +67,1,0,25,7,1,0,0,1,0x99ce26b9515d5e1f55725bb786383cdd +67,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +67,1,0,27,9,1,0,0,1,0x11e162b3eeff0553a186375842773e89 +67,1,0,28,10,1,0,0,1,0xdfb9d22e298a68fcf12efde2fa0ef6e0 +67,1,0,29,11,1,0,0,1,0xd46dd87b20ad2608168de8f17adc50a2 +67,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +67,1,0,31,13,1,0,0,1,0x0d39143a77af404f03cd42a99b8bb3b5 +67,1,0,32,14,1,0,0,1,0xb289369f1e9f01c1af0df9af935d84d6 +67,1,0,33,15,1,0,0,1,0xcfaa339a74abc65c464b9653235d1ae8 +67,1,0,34,0,0,1,0,0,0x18c7d39e808c5c66ceac0d72d9d825d1 +67,1,0,35,1,0,1,0,0,0xcbb8d864de8b7b15a8c95fd35ed0734e +67,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +67,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +68,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,16,0,0,1,1,0,0x0ec08d99c0538151afeeb297dc142078 +68,1,0,17,1,0,1,1,0,0x74ee709e804798a6e532248267106ac7 +68,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +68,1,0,34,0,0,1,1,0,0x796bc669af57f8980eb631c0d869b6fe +68,1,0,35,1,0,1,1,0,0x323f04bda94001c4495dd8dc646f8ee1 +68,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,1,1,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,2,2,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,3,3,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,5,5,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,6,6,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,7,7,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,9,9,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,10,10,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,11,11,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,13,13,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,14,14,0,0,1,0,0x00000000000000000000000000000000 +68,0,1,15,15,0,0,1,0,0x00000000000000000000000000000000 +69,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +69,1,0,16,0,0,1,0,0,0x207969ab79cb43727aacd8d0db25f3cb +69,1,0,17,1,0,1,0,0,0xc50cf0285d1a09fbfb26b8b06b34f443 +69,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +69,1,0,19,1,1,0,0,1,0x04574a7dd9651dfb772a1cc54a333a45 +69,1,0,20,2,1,0,0,1,0xacc77f64679ee5823d68d21de76762fc +69,1,0,21,3,1,0,0,1,0xded4da0899a2b3e5ece13c083b06ec99 +69,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +69,1,0,23,5,1,0,0,1,0x017566f5883d31ba64e6c46ccb175c99 +69,1,0,24,6,1,0,0,1,0x7f637fe7d24f9395f8a80de299356c10 +69,1,0,25,7,1,0,0,1,0xa64679b6fa769ef2c00118f343614e11 +69,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +69,1,0,27,9,1,0,0,1,0x194356a8f6b052119159e6cd92aae214 +69,1,0,28,10,1,0,0,1,0x375906af13f09d75ed9dea0915a1fb06 +69,1,0,29,11,1,0,0,1,0x09f0bffdcc61ff11e60efcd23a4c5e42 +69,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +69,1,0,31,13,1,0,0,1,0x059ff6d1dc07389a41ad81729752a4d0 +69,1,0,32,14,1,0,0,1,0x3b2152c939d54f26c3f33eca1e23045d +69,1,0,33,15,1,0,0,1,0x3d9e4817e55504edf5fc24e571cd242e +69,1,0,34,0,0,1,0,0,0x7ca2cab9980453b70e785b74ca03e72d +69,1,0,35,1,0,1,0,0,0x59a87796494896d29db4d844d977bd50 +69,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +69,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +70,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,1,1,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,2,2,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,3,3,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,5,5,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,6,6,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,7,7,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,9,9,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,10,10,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,11,11,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,13,13,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,14,14,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,15,15,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,16,0,0,1,1,0,0x7187abce656292a8314a4f4514a2735d +70,1,0,17,1,0,1,1,0,0x164e69834daa1789e8bd29e5c96bca2e +70,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,19,1,1,0,1,0,0x067ff4967c398545ec9f00a4b96ac0d6 +70,1,0,20,2,1,0,1,0,0xb195510d59c90b09ad2d75702aaf5233 +70,1,0,21,3,1,0,1,0,0x84a5387b539860f8659077a767e9c0bb +70,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,23,5,1,0,1,0,0x0caae1c40e339cae4df310a39b44e9a5 +70,1,0,24,6,1,0,1,0,0x1149f29438f927f2bb3cfd36eb6dbeee +70,1,0,25,7,1,0,1,0,0x64a8d85ffbc83e616fbc1313f8a4a5cc +70,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,27,9,1,0,1,0,0x06a4f707af6f683c1722a12efa53117f +70,1,0,28,10,1,0,1,0,0x39a0a8eda4e4377ca42c4429a3ee9c62 +70,1,0,29,11,1,0,1,0,0x4e463181a27ed2da2a67295a8082ae4f +70,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +70,1,0,31,13,1,0,1,0,0x0f4cffb923422f1cfaf66474321ea5d1 +70,1,0,32,14,1,0,1,0,0x05a18700d29697f3d17223c524f829ed +70,1,0,33,15,1,0,1,0,0x50a9b89b821eb28ca29f249d43abeb78 +70,1,0,34,0,0,1,1,0,0x7875bbcd162534f2b2587734fdcbe254 +70,1,0,35,1,0,1,1,0,0x7fb2678d5b3c4f090aead1d11d9b7712 +70,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +70,0,1,1,1,0,0,1,0,0x10816d5cd362fedf591b3410991ca065 +70,0,1,2,2,0,0,1,0,0xe960537f61da3b55412c79f312ca4bca +70,0,1,3,3,0,0,1,0,0x65dfd2c1d0398ce939fcfb63d649ba18 +70,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +70,0,1,5,5,0,0,1,0,0x1730a8b0e9d57de9fad33141ad5d629b +70,0,1,6,6,0,0,1,0,0x1d1e8ab1d2519942a0a9efd23249f56f +70,0,1,7,7,0,0,1,0,0x8a9d59e14e898061341ef7c84147399a +70,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +70,0,1,9,9,0,0,1,0,0x04d6b096f0d460e61fe9930fbce764e1 +70,0,1,10,10,0,0,1,0,0xf7482eeedc40722743f13c7ba28932f9 +70,0,1,11,11,0,0,1,0,0x35b7193de79e6c32b1fd400c7ac2b68d +70,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +70,0,1,13,13,0,0,1,0,0x04184c99a26108e8174ab316ee4a10b7 +70,0,1,14,14,0,0,1,0,0x04b5c7e342e5757300a53ed6ca44aa2f +70,0,1,15,15,0,0,1,0,0x5b41bd37fa135349a14c5387883366a7 +71,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,1,1,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,2,2,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,3,3,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,5,5,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,6,6,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,7,7,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,9,9,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,10,10,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,11,11,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,13,13,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,14,14,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,15,15,1,0,0,0,0x00000000000000000000000000000000 +71,1,0,16,0,0,1,0,0,0x4ed36c315d9d74e24045b83e7159f7a9 +71,1,0,17,1,0,1,0,0,0x22a84a466b2a402c1521966f05a95336 +71,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +71,1,0,19,1,1,0,0,1,0x131a3fc35f6900088a28a8445da1939b +71,1,0,20,2,1,0,0,1,0xd32a332f47a19ea3b6a88f361a31bc34 +71,1,0,21,3,1,0,0,1,0x0c5635e1955964afae14a2c102411a66 +71,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +71,1,0,23,5,1,0,0,1,0x05fc1afbc69bfbed065ae247a17e576e +71,1,0,24,6,1,0,0,1,0xab0d94fb400665e5936261afde3368eb +71,1,0,25,7,1,0,0,1,0xc88c90b615c5dbe17676c6a40b0ff2d8 +71,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +71,1,0,27,9,1,0,0,1,0x0d30f084cabc6823fd57b1013f6a8e44 +71,1,0,28,10,1,0,0,1,0x4a3803f5fc4c8f34a89d4f50bb8ae208 +71,1,0,29,11,1,0,0,1,0xf530c0d1b28409b3bc7b95808669bd68 +71,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +71,1,0,31,13,1,0,0,1,0x016ae0e7ca670aa1686f6352e1179cda +71,1,0,32,14,1,0,0,1,0xcef8956a687550d2ba1daa020e038604 +71,1,0,33,15,1,0,0,1,0xc993e82d3111460138ca52d621c20c57 +71,1,0,34,0,0,1,0,0,0x7b3afdb07e96624267f3a5b6cea4cfc4 +71,1,0,35,1,0,1,0,0,0xbc4dbcd77dbd8657718341fc0dd62ccc +71,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +71,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +72,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +72,1,0,1,1,1,0,0,1,0x197d5c5f40d9b81aeec335e9c8d61be9 +72,1,0,2,2,1,0,0,1,0x4aa57cec4666439f8e730e087aa17990 +72,1,0,3,3,1,0,0,1,0x455b0c5ae3bc0d0ca6d1231f99aeb59d +72,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +72,1,0,5,5,1,0,0,1,0x10726f5bd90d27b5adb6dd4eaa5a6429 +72,1,0,6,6,1,0,0,1,0x0d98eaa77e0119a563f23e2093e23a1b +72,1,0,7,7,1,0,0,1,0x2cdf2d7105683ed9f25603fed713ea8d +72,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +72,1,0,9,9,1,0,0,1,0x03cecc9b9d45b9f412192dae2335286d +72,1,0,10,10,1,0,0,1,0x2a732997b3a5f7a9a633e4b07b49397b +72,1,0,11,11,1,0,0,1,0xbeaa5eb10d712ff44b45c7fc51826de0 +72,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +72,1,0,13,13,1,0,0,1,0x00570c27048a31634e9400539a9fc697 +72,1,0,14,14,1,0,0,1,0xec5e2d6273d680a4beb289e7ff58c7b3 +72,1,0,15,15,1,0,0,1,0xf6b079d27593af8739d09394a6ca207f +72,1,0,16,0,0,1,0,0,0x139e3a2f81350229c854d4597b53628d +72,1,0,17,1,0,1,0,0,0xda6efe2ed2660a79a32e90754e3544e4 +72,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +72,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +72,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +72,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +72,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +73,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +73,1,0,1,1,1,0,0,1,0x12d963dae7bcfa9594506efeb9700711 +73,1,0,2,2,1,0,0,1,0x53ed0792e1ee43b94cfeaf236cb698b6 +73,1,0,3,3,1,0,0,1,0x9e931522bdec3df4f7ccdb0624e1faaf +73,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +73,1,0,5,5,1,0,0,1,0x198da401bd29cb60b279497b609d0a13 +73,1,0,6,6,1,0,0,1,0x87c83c9bce6a98893f6575b31063fb1a +73,1,0,7,7,1,0,0,1,0x35b36de443f7502615025d6703c549a6 +73,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +73,1,0,9,9,1,0,0,1,0x195377f0eca2818a9f7629bef282d6d8 +73,1,0,10,10,1,0,0,1,0xb5bceb5bbd5a6e3185c443a23c10a9d9 +73,1,0,11,11,1,0,0,1,0x6f3e4611abd35947c8f4af7d2349643c +73,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +73,1,0,13,13,1,0,0,1,0x0643b1c3d92d9e362ede9159057bc1c1 +73,1,0,14,14,1,0,0,1,0x8871bea97c3945385a656496ddaa47c7 +73,1,0,15,15,1,0,0,1,0xd08d1eaa393c06a4e3b995b973745763 +73,1,0,16,0,0,1,0,0,0x08097acb4cd3ad683aa28c262acacc60 +73,1,0,17,1,0,1,0,0,0xbf76e47f5e2a96f9df11a8aa1a010de2 +73,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +73,1,0,19,1,1,0,0,0,0x08c9d2b5af3749b6bd716e3aab6c1f09 +73,1,0,20,2,1,0,0,0,0x0de6e84421f796b58a73abfb528b3977 +73,1,0,21,3,1,0,0,0,0x67c731afe9e690d44829f5debac65b5c +73,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +73,1,0,23,5,1,0,0,0,0x18ed5595c083a5beb85e37ac0915ceda +73,1,0,24,6,1,0,0,0,0x2e891e7562ab622dda5fd8f53cbcaf3f +73,1,0,25,7,1,0,0,0,0x31b542f3e5e892b8c4787880d0726964 +73,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +73,1,0,27,9,1,0,0,0,0x084196033d6777f9cee8ffdb2cf607d9 +73,1,0,28,10,1,0,0,0,0x62a4357587c579fc10e49b7d431a780f +73,1,0,29,11,1,0,0,0,0x02f5162f5407586c6f01b3a5e801a004 +73,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +73,1,0,31,13,1,0,0,0,0x1373a053d85313ca99a1d4f11d1134e1 +73,1,0,32,14,1,0,0,0,0x382773b1034b97439c8e0d862049f681 +73,1,0,33,15,1,0,0,0,0xc6b4f7ccfb6bc96746c120a7bca8b38c +73,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +73,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +73,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +73,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +74,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +74,1,0,1,1,1,0,0,1,0x1405ff56545b3a3421eaa144bc1aecd7 +74,1,0,2,2,1,0,0,1,0x420cf2d9a6501ab87cb66fa742c8a89c +74,1,0,3,3,1,0,0,1,0x11aecf4b7085723cbfaf56166e6836ed +74,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +74,1,0,5,5,1,0,0,1,0x03b758c8c5743db1b2c9dbd82d7f575c +74,1,0,6,6,1,0,0,1,0x8b8ab985de70a490f180b1a8a44ccba5 +74,1,0,7,7,1,0,0,1,0x2a1e818e6bc72aa6ca7154e1eda6110e +74,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +74,1,0,9,9,1,0,0,1,0x178be358f2c3c21fcb55ed8d949648bb +74,1,0,10,10,1,0,0,1,0x200d00191bd8862a2715bdbbe8939808 +74,1,0,11,11,1,0,0,1,0x7fd85a333f9989758028b31699801743 +74,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +74,1,0,13,13,1,0,0,1,0x1892e5a5601224ebd3e88e5e5506664a +74,1,0,14,14,1,0,0,1,0x0dadadfa66df1f73dfc93ad241a19f07 +74,1,0,15,15,1,0,0,1,0x957d552b99d22c3791c671f961a3961c +74,1,0,16,0,0,1,0,0,0x3c39037a26e3d4fb39f73632ccfda33e +74,1,0,17,1,0,1,0,0,0x4141d4ab408a361854e36df03a7d015c +74,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +74,1,0,19,1,1,0,0,0,0x178771a07cbd4cef3ec1a3db86096d46 +74,1,0,20,2,1,0,0,0,0x29be0a10364ef1317a05e30bdff2e496 +74,1,0,21,3,1,0,0,0,0x3d90a85c33920906f504501077a709bf +74,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +74,1,0,23,5,1,0,0,0,0x0d407f585a87e5a731c65277b50d92b7 +74,1,0,24,6,1,0,0,0,0x75ca3f194e675940238311a48d3b3d37 +74,1,0,25,7,1,0,0,0,0x8e38ea37c02636601a891587025f7b64 +74,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +74,1,0,27,9,1,0,0,0,0x0296af5b4cdc972019728386ca1e4bca +74,1,0,28,10,1,0,0,0,0x33969abea0690018bf84e2763b3e7b36 +74,1,0,29,11,1,0,0,0,0xebfadc331239280c0b1b9efa260f773a +74,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +74,1,0,31,13,1,0,0,0,0x1698d7f2ec9f7f12cb60e4f13199b3a3 +74,1,0,32,14,1,0,0,0,0xd28384a2d16dada7dd1c9a00a222bbfb +74,1,0,33,15,1,0,0,0,0x5eca9773b7d72236ff1fcbe9766204ee +74,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +74,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +74,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +74,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +75,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +75,1,0,1,1,1,0,0,1,0x04957b29f21f1af3fa21732a3d971244 +75,1,0,2,2,1,0,0,1,0xcc73852f1c4dddf46a0b689395e0090d +75,1,0,3,3,1,0,0,1,0x5d43da41d8a946922786190e2877d982 +75,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +75,1,0,5,5,1,0,0,1,0x099090ba5ef4841d9c0a8113b191eaf1 +75,1,0,6,6,1,0,0,1,0x8386f48b707e89709f3c179acb072158 +75,1,0,7,7,1,0,0,1,0x2cf99e1de290e97053802e96323c2802 +75,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +75,1,0,9,9,1,0,0,1,0x0febf0a6f15e6e0e728608f325b4e849 +75,1,0,10,10,1,0,0,1,0x998e0787aef77fe9a161e03687d86c7d +75,1,0,11,11,1,0,0,1,0xbad1b9957d91b84f194404ca794b3fd5 +75,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +75,1,0,13,13,1,0,0,1,0x12c7e8355f2862f5578cf7033c3db25f +75,1,0,14,14,1,0,0,1,0x8b3b30ddcb6b3e712e95cdfcb14e6dbd +75,1,0,15,15,1,0,0,1,0xe7ecb7647d5abc954f088aeb9e1d9403 +75,1,0,16,0,0,1,0,0,0x2ef2f828639def586a5355a626c5fdcc +75,1,0,17,1,0,1,0,0,0x49915d28c9b3f8c07f01745a54520431 +75,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +75,1,0,19,1,1,0,0,0,0x14c4fd125982dbf024062f7d425d9fa9 +75,1,0,20,2,1,0,0,0,0xdebac724d6ac1ba50fc9618868675f1f +75,1,0,21,3,1,0,0,0,0x0c154141cd3cb353f03b4a12b5e4de6a +75,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +75,1,0,23,5,1,0,0,0,0x0946c16ccac771c54e84bb9ff384c0c5 +75,1,0,24,6,1,0,0,0,0xaa893f274e3363d0d4394021dcaa7a4a +75,1,0,25,7,1,0,0,0,0xd7af514f71a1b12609d8c36d99091030 +75,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +75,1,0,27,9,1,0,0,0,0x075a4f34822943aec6a760b21b5a3234 +75,1,0,28,10,1,0,0,0,0x2ae59cdec5ac8cbaf39897b1940fbbe4 +75,1,0,29,11,1,0,0,0,0x92ca36b144366775f89802d91062ccb0 +75,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +75,1,0,31,13,1,0,0,0,0x0fda4437a4f0bb2e0366c0f15bd8ac99 +75,1,0,32,14,1,0,0,0,0xbd149cc7e24b7ad22d1f39b1a72ae906 +75,1,0,33,15,1,0,0,0,0xc0216118ce7c813972aa4a40a24b7cf4 +75,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +75,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +75,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +75,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +76,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +76,1,0,1,1,1,0,0,1,0x1443666e40551e09658bf6db6459332d +76,1,0,2,2,1,0,0,1,0x0f3e18069542960049f0900151948fa1 +76,1,0,3,3,1,0,0,1,0x3acbf25430de906a89e3259da80fcc33 +76,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +76,1,0,5,5,1,0,0,1,0x186423f290c38b7cd4a1a89283316946 +76,1,0,6,6,1,0,0,1,0x9d3a8decc8738b5366e08f6940a177bd +76,1,0,7,7,1,0,0,1,0x4bc05c2e826e99d5a04177c327b17f73 +76,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +76,1,0,9,9,1,0,0,1,0x0b1bade9263f39db1fc9e8fc7079e973 +76,1,0,10,10,1,0,0,1,0xf0dbae9b83076378b103fcd97de420d8 +76,1,0,11,11,1,0,0,1,0xd5791a7458c526870602c06229ca0a37 +76,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +76,1,0,13,13,1,0,0,1,0x0dd1780871f5a9a92f50fc723b805d6f +76,1,0,14,14,1,0,0,1,0x6c416dc480cb9d53805f17e9917e58aa +76,1,0,15,15,1,0,0,1,0x39fd30321c206b550a259755b7a13b48 +76,1,0,16,0,0,1,0,0,0x7378746c983ee56d27c2e944b1230845 +76,1,0,17,1,0,1,0,0,0x3052736374d9fd3ff235058031f1ca4b +76,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +76,1,0,34,0,0,1,0,0,0x374674d23fde8d30d9aa8157d7eac2c3 +76,1,0,35,1,0,1,0,0,0xf7214f4cd313fc55d02587f1df020174 +76,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +76,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +77,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +77,1,0,1,1,1,0,0,1,0x12fd634c149b5822f630f59e1f14c123 +77,1,0,2,2,1,0,0,1,0xa966ce44321863104db75fffaf859c73 +77,1,0,3,3,1,0,0,1,0x24205ab46d8b224b347d8858ce5de756 +77,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +77,1,0,5,5,1,0,0,1,0x15eab12deda59d0137a837bcdd5edfdb +77,1,0,6,6,1,0,0,1,0xe412cb002ab07d1409819445a0bfea0f +77,1,0,7,7,1,0,0,1,0x0998e1eec91f44c24e6bacf19d294ae8 +77,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +77,1,0,9,9,1,0,0,1,0x170f195797fcaa3aa3f46eea85e8d9f1 +77,1,0,10,10,1,0,0,1,0xddb333304f36181532aa3aca65392e91 +77,1,0,11,11,1,0,0,1,0x937736381198c1dde343af55bb6c4165 +77,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +77,1,0,13,13,1,0,0,1,0x084808262048128eb057c4cf0e47510b +77,1,0,14,14,1,0,0,1,0x11c16fb51a9e611915ac2ea7a4fb0d21 +77,1,0,15,15,1,0,0,1,0xef417c5d4b4164d633eeac7a2f429418 +77,1,0,16,0,0,1,0,0,0x496fd8702a6a3bee430277887554cb68 +77,1,0,17,1,0,1,0,0,0x410f0bba6848b1b3001c58a7aa4729a0 +77,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +77,1,0,19,1,1,0,0,0,0x0e363fd36fb352fef3cc7e3c61d45eb1 +77,1,0,20,2,1,0,0,0,0x3bd4707db4548b661026de2a350a5a42 +77,1,0,21,3,1,0,0,0,0xac4ca4a338ab4a02e1e5cb4e80379b5b +77,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +77,1,0,23,5,1,0,0,0,0x0b95db0000291959e0eea71571797765 +77,1,0,24,6,1,0,0,0,0x7f58435f6159c847a1ef25b8070ec22a +77,1,0,25,7,1,0,0,0,0x0a0519344bd650e85236a3d38e8ed15b +77,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +77,1,0,27,9,1,0,0,0,0x0851b96f006ef6b273c8f3f2a47b07ac +77,1,0,28,10,1,0,0,0,0xe4ee5769fbc3c428a0710bdae45b07ae +77,1,0,29,11,1,0,0,0,0x270c47675e07ba3270f327e490161066 +77,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +77,1,0,31,13,1,0,0,0,0x05b374168da52d6ea044898e3dc4b988 +77,1,0,32,14,1,0,0,0,0xd12e919aeae3aa824a03ba62a026ab3a +77,1,0,33,15,1,0,0,0,0x4120d62b3ab0c1dfef56dad5babd4f1e +77,1,0,34,0,0,1,0,0,0x3a4818fa39bd7c333b287f7ba5435c2a +77,1,0,35,1,0,1,0,0,0x5571dd9ae7b439114c4198cfb6e679cd +77,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +77,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +78,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +78,1,0,1,1,1,0,0,1,0x0bbf2505207bfe6e4ab17c044d54d221 +78,1,0,2,2,1,0,0,1,0x590c705c51948134ce1053fee8cd640c +78,1,0,3,3,1,0,0,1,0x14ff4438655c909f4c3cc58de9d1cc9d +78,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +78,1,0,5,5,1,0,0,1,0x0b293d4cefa1a649f8e977d63fc10d52 +78,1,0,6,6,1,0,0,1,0x0e2d4ea407f88af0d9fcdb4ac4015123 +78,1,0,7,7,1,0,0,1,0x7ba48b33cb3eeaec8b9a71fa6ab38066 +78,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +78,1,0,9,9,1,0,0,1,0x0957e0bf2b7e195c446540db9003ab39 +78,1,0,10,10,1,0,0,1,0xf757f5f5691184297ae817ef271744cb +78,1,0,11,11,1,0,0,1,0xe7b1f8cc49f2093b223192634c136f9d +78,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +78,1,0,13,13,1,0,0,1,0x06f3cdcb9453579a5d895dbd4d155891 +78,1,0,14,14,1,0,0,1,0x00aab16a3ecfcd3710c8ce9d589a95da +78,1,0,15,15,1,0,0,1,0xc883f25cf898120f737f7ccce65eca89 +78,1,0,16,0,0,1,0,0,0x3769f97f4179173fd34bf0e6c65d25bc +78,1,0,17,1,0,1,0,0,0xf6da48077fb6bb93a76b16cbf6d93f00 +78,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +78,1,0,19,1,1,0,0,0,0x0f543828e382f32b5face2052c15b9e9 +78,1,0,20,2,1,0,0,0,0x40c992e25e215cd00be851ffbc4c2ae7 +78,1,0,21,3,1,0,0,0,0x1374825e16c2f5b1dffac650cc2b3762 +78,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +78,1,0,23,5,1,0,0,0,0x00f25a8b7395854f1d3a737dacd938ff +78,1,0,24,6,1,0,0,0,0x460bd9b2260a6e4ef8f29be6141c149a +78,1,0,25,7,1,0,0,0,0x7ef6689ab8260cd813f9fb04f0e42e16 +78,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +78,1,0,27,9,1,0,0,0,0x1558a84e29e5d0d6d69c2b53141955f1 +78,1,0,28,10,1,0,0,0,0x3a5512689f38e01f010af5882d963df4 +78,1,0,29,11,1,0,0,0,0x4c769da4676cf5b77011db97f3522e68 +78,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +78,1,0,31,13,1,0,0,0,0x16f8cae1060596ccb104c726f33d1aef +78,1,0,32,14,1,0,0,0,0x431e8fb133751dc485d76654f6a7baaa +78,1,0,33,15,1,0,0,0,0x58c308c3c8bb0b090c832ddc1ba68ca4 +78,1,0,34,0,0,1,0,0,0x1c8b776ec7086b56556cdba291a7beac +78,1,0,35,1,0,1,0,0,0x58ec50874ba2aaab6eabf63d4055fe25 +78,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +78,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +79,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +79,1,0,1,1,1,0,0,1,0x02aff09471ff69a00f6b3e078895425b +79,1,0,2,2,1,0,0,1,0xf6f0e64ea366ba154b97a24199d61744 +79,1,0,3,3,1,0,0,1,0xa64848df9f17cee1786927ccc91f9e26 +79,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +79,1,0,5,5,1,0,0,1,0x0ec2b800fcb979b32b0e533d859f31c7 +79,1,0,6,6,1,0,0,1,0xee4a346a479a743a844560a94c1406c0 +79,1,0,7,7,1,0,0,1,0x3a2f39a58129e3b22ed71189f9cabd91 +79,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +79,1,0,9,9,1,0,0,1,0x12426554cf90eff3bd3b3bdb8b22a505 +79,1,0,10,10,1,0,0,1,0x8fd01177f9b40354858101710a469ba6 +79,1,0,11,11,1,0,0,1,0x0176ecf5c2008632d1efd9eabd6dc180 +79,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +79,1,0,13,13,1,0,0,1,0x167607996b22019278701f5f1930f977 +79,1,0,14,14,1,0,0,1,0x1eb06a7c6e19ffd32064822afb13c987 +79,1,0,15,15,1,0,0,1,0xbe923a19cfac38362079808f1767049e +79,1,0,16,0,0,1,0,0,0x1b8e33a09426bbc378ff8a3514f81016 +79,1,0,17,1,0,1,0,0,0x74488994a28439d542ebe4182a22429f +79,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +79,1,0,19,1,1,0,0,0,0x15dd19b54a93161705e770d09f8257bb +79,1,0,20,2,1,0,0,0,0x2d2e67a77215f91c274a25bd7e26dc20 +79,1,0,21,3,1,0,0,0,0x96afb29701555a0e5d3a1777cbf9deea +79,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +79,1,0,23,5,1,0,0,0,0x09c68301df2d283b55ea15ccf0ddff32 +79,1,0,24,6,1,0,0,0,0x6b3c4b6264d41dfb244e38e811510846 +79,1,0,25,7,1,0,0,0,0xc8604a72855e14448b64ea2323a4a2d4 +79,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +79,1,0,27,9,1,0,0,0,0x0e6afae36cace0a67671cf32580e8450 +79,1,0,28,10,1,0,0,0,0x390405fcb594d156d4fc7475cf2a2f0e +79,1,0,29,11,1,0,0,0,0xb893ac3d538fa14b413256d2314b26cb +79,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +79,1,0,31,13,1,0,0,0,0x11e7aa6c740a4a6dc647eeedd3b7a49c +79,1,0,32,14,1,0,0,0,0xbc1c4a4dadd025912a88a8c5d4d7f69b +79,1,0,33,15,1,0,0,0,0x1fcd1c4e18c09659f84eaadf80ce673b +79,1,0,34,0,0,1,0,0,0x33b77844252c7e6bbf6e59391597e672 +79,1,0,35,1,0,1,0,0,0x1b816ff99fb6d3fab5b2aab3b605de4b +79,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +79,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +80,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +80,1,0,1,1,1,0,0,1,0x19cca4e0cd828b6be178819cf23964d6 +80,1,0,2,2,1,0,0,1,0x6f25f6da062d6041fe165490c4424793 +80,1,0,3,3,1,0,0,1,0x96040dfb613902cb1416ab5cae74b5da +80,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +80,1,0,5,5,1,0,0,1,0x0430a7b4256c44e21f8ba0e8984cbf13 +80,1,0,6,6,1,0,0,1,0x4a0379e6cf68025e3a893bd03828b279 +80,1,0,7,7,1,0,0,1,0xe92fb629e4c4713d8b08840854832fbb +80,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +80,1,0,9,9,1,0,0,1,0x01e74d1418b995b74e98d71efc847e00 +80,1,0,10,10,1,0,0,1,0x498561e162828059fe8fb6e127669f9b +80,1,0,11,11,1,0,0,1,0xbdb91a031ac29e35b8585abaec147ea6 +80,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +80,1,0,13,13,1,0,0,1,0x17af63c3d10e108c477fd6461af6e937 +80,1,0,14,14,1,0,0,1,0x596bcdb07a116d9ec2680ecdb3931769 +80,1,0,15,15,1,0,0,1,0x6a1695c6837bf3ab9bd4e821197d40d1 +80,1,0,16,0,0,1,0,0,0x16413fac8cb750ae59b2c8934913d12b +80,1,0,17,1,0,1,0,0,0x5b8d4a1a1df4419214d81abf5abfc8e9 +80,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +80,1,0,34,0,0,1,0,0,0x7507b06ec20ee33a60e87a33e1e7e1eb +80,1,0,35,1,0,1,0,0,0xc8f8bf32e95e678030f6b19fd3d81e9d +80,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +80,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +81,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +81,1,0,1,1,1,0,0,1,0x094fa40a74c2c0918f492d2277691430 +81,1,0,2,2,1,0,0,1,0xd0aba91926c0ffa21734de68caf738e9 +81,1,0,3,3,1,0,0,1,0x60fd505017e09f564d7a562b9dd427b0 +81,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +81,1,0,5,5,1,0,0,1,0x049cde9be8925a47ba30649683caa1c9 +81,1,0,6,6,1,0,0,1,0x3a11bfa639df5b30fa26871700b736cf +81,1,0,7,7,1,0,0,1,0x0bda793eca8bf4d77b3b6fae05fe895e +81,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +81,1,0,9,9,1,0,0,1,0x037b72dd2bcbfd61c291e9a5141a6195 +81,1,0,10,10,1,0,0,1,0x647408e5c7bfb4a07e1970d9c1a4d605 +81,1,0,11,11,1,0,0,1,0x1d156296bc21d5c638d0f9b3bcbedd34 +81,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +81,1,0,13,13,1,0,0,1,0x11e8fa202066f1829a08acdf4d03683c +81,1,0,14,14,1,0,0,1,0x99bbdcefef41b1fedf15cd4742821b5d +81,1,0,15,15,1,0,0,1,0x28e4830ebe3b42b2c10a94cef57a3f82 +81,1,0,16,0,0,1,0,0,0x72033240bbab6546d7b10dbfeb222818 +81,1,0,17,1,0,1,0,0,0x072b8f88486e745101e8a70e39cf456f +81,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +81,1,0,19,1,1,0,0,0,0x011ca5793faff04fa079144c1952b056 +81,1,0,20,2,1,0,0,0,0x6eed91975cd40970552bb2f34dfef374 +81,1,0,21,3,1,0,0,0,0xac4414998faf4e81d06957c170bfd52e +81,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +81,1,0,23,5,1,0,0,0,0x135ec415c48ed9e4aaf6a93b120db67e +81,1,0,24,6,1,0,0,0,0x0edf09a5e6210144771a6ab58b6b2803 +81,1,0,25,7,1,0,0,0,0x9646ac8cff09a63508e98e62a2018ef6 +81,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +81,1,0,27,9,1,0,0,0,0x004977460cc27cd0d9c591ff639f2f7b +81,1,0,28,10,1,0,0,0,0xfb1c39e78f4eac40e1e8f4d70efff96a +81,1,0,29,11,1,0,0,0,0x9e85250a020ecd53d0ed13d5a48654de +81,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +81,1,0,31,13,1,0,0,0,0x12c7dafdb219a1c07e3a07c5d4e4260f +81,1,0,32,14,1,0,0,0,0x3408052498b9ef638356a4fbc029b45d +81,1,0,33,15,1,0,0,0,0x1751991c9c3daaeaa8a4e75b080af261 +81,1,0,34,0,0,1,0,0,0x7882c2a86dda4f48e972d0e94ba11f0a +81,1,0,35,1,0,1,0,0,0x26cf185cadfcc3dfd06aefb31b5e8326 +81,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +81,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +82,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +82,1,0,1,1,1,0,0,1,0x03b3b92e8c5d354050b049d08038889c +82,1,0,2,2,1,0,0,1,0xdead1d52dc8debeb9940342d50b7d0f5 +82,1,0,3,3,1,0,0,1,0x01b1a4bf993c91eca0e06ac63775c9ac +82,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +82,1,0,5,5,1,0,0,1,0x0519c106f1e6d7b598992a9dbf5d4036 +82,1,0,6,6,1,0,0,1,0x5c21adf50007727a6911e8a3b62f5a30 +82,1,0,7,7,1,0,0,1,0x690366adeacd238df2d211931219e737 +82,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +82,1,0,9,9,1,0,0,1,0x136dc746604e5d81724996cf35583743 +82,1,0,10,10,1,0,0,1,0x22ef4ce20bc398f35a88daba43b47292 +82,1,0,11,11,1,0,0,1,0xa604a2e1485040ffad60c3f72dac3c6c +82,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +82,1,0,13,13,1,0,0,1,0x0554481e628cd9ba967085b0b8f5f38f +82,1,0,14,14,1,0,0,1,0x56e61d466fd93c7a04e6271d40b96a74 +82,1,0,15,15,1,0,0,1,0xf88a57c0b193bb979bc554c96c5cfad3 +82,1,0,16,0,0,1,0,0,0x18cd72a7ba4050803c0c884fef478a7b +82,1,0,17,1,0,1,0,0,0xb22f9754d911db2f1f42eed28cba33bf +82,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +82,1,0,19,1,1,0,0,0,0x17d1b2bac3eb55cded1b722fa656a180 +82,1,0,20,2,1,0,0,0,0x381ac7d6d58805797966da3b67d43b2a +82,1,0,21,3,1,0,0,0,0x25f1677675654f94940c27a1825d5982 +82,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +82,1,0,23,5,1,0,0,0,0x11ba46fce04364df52386b5d4d2a39b9 +82,1,0,24,6,1,0,0,0,0x67401e915146ce8ed9e570c8cb2a8299 +82,1,0,25,7,1,0,0,0,0x99eff477b166dfdc3c62459090eff1ab +82,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +82,1,0,27,9,1,0,0,0,0x10a6f056a7a1dd6da71164e889366f30 +82,1,0,28,10,1,0,0,0,0x58038f708444a5b10e301dd2d71b21e3 +82,1,0,29,11,1,0,0,0,0xf6d7e6a17230ece8dac39be6160f2a1c +82,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +82,1,0,31,13,1,0,0,0,0x04c8b85fcc2fa9470000e4fbf4ada6f6 +82,1,0,32,14,1,0,0,0,0xe5edc3c2d80482c93ede686da0377091 +82,1,0,33,15,1,0,0,0,0xce9c9dfbfa0f06d9d42293a944abd878 +82,1,0,34,0,0,1,0,0,0x7ff341402d2340565ba70069138992b4 +82,1,0,35,1,0,1,0,0,0xefa37b6be46e4d31d2d40767a23d0421 +82,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +82,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +83,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +83,1,0,1,1,1,0,0,1,0x146fe0a18f5a34a8049c265b78af70fb +83,1,0,2,2,1,0,0,1,0xfe4455b2370be891cb3d02e0767dd7b6 +83,1,0,3,3,1,0,0,1,0xedf1318c74bd37b89d569efe2f2ef668 +83,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +83,1,0,5,5,1,0,0,1,0x0033204b3976280a8d8fcc0919b7d478 +83,1,0,6,6,1,0,0,1,0x4e2ec267d329726f45fdf5d841ddc362 +83,1,0,7,7,1,0,0,1,0xac77989a675828076311703f522706c6 +83,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +83,1,0,9,9,1,0,0,1,0x063e9312389306dc69a9dc934c07806d +83,1,0,10,10,1,0,0,1,0x0f9ebaff8986a05b2b432f8736105eef +83,1,0,11,11,1,0,0,1,0x7cb0161319ec6e9efc89bd2fabf22abe +83,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +83,1,0,13,13,1,0,0,1,0x1223ee53049ff70dabc202f391cc79bd +83,1,0,14,14,1,0,0,1,0x572075b243d18144952c73d080b07243 +83,1,0,15,15,1,0,0,1,0x92b7763d257045b10179cb05e6adde68 +83,1,0,16,0,0,1,0,0,0x1b51da91d3c413eb11562f3f8128b469 +83,1,0,17,1,0,1,0,0,0xe4c3da20c1bdd4bef6e04a3e6447b963 +83,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +83,1,0,19,1,1,0,0,0,0x117cda03dc3f26c830b0bab4b50acfc4 +83,1,0,20,2,1,0,0,0,0xc93d2d2e4f53d2e98af02c7296146232 +83,1,0,21,3,1,0,0,0,0x660d3e69c5f3f84073a2b329de0e4116 +83,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +83,1,0,23,5,1,0,0,0,0x178a607030e4e391984f6766b655eda7 +83,1,0,24,6,1,0,0,0,0x80bb849062a7aaaef833f89457efd731 +83,1,0,25,7,1,0,0,0,0x34e47a18dbf9878faacb90d6c193eb50 +83,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +83,1,0,27,9,1,0,0,0,0x01d87cc638908cf5b7f67439a39e2968 +83,1,0,28,10,1,0,0,0,0x6bba5018f95699c51c33b11ae1942209 +83,1,0,29,11,1,0,0,0,0x0b569dfe9515f5cb944e0206333e03af +83,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +83,1,0,31,13,1,0,0,0,0x19961ed1d034fc112ce23b94f0bb2ff5 +83,1,0,32,14,1,0,0,0,0xe86887ffd1ea5af6c6d317abfd3ec64f +83,1,0,33,15,1,0,0,0,0x54a51737d70c4af7fbdd943030375a84 +83,1,0,34,0,0,1,0,0,0x7e940b9c2f9924bd411b5c9157c79706 +83,1,0,35,1,0,1,0,0,0x4f544340ccf41ee6e6447587b5255c34 +83,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +83,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +84,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,1,1,1,0,1,0,0x04cfc6a9fda5d24ec73e1570666a183a +84,1,0,2,2,1,0,1,0,0x3ba7545efd7ee92f4d933099fd3b5bf0 +84,1,0,3,3,1,0,1,0,0x41ae2f28bebceea14778db746be994f2 +84,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,5,5,1,0,1,0,0x0708646f16b2b36cc530f7e1d0297297 +84,1,0,6,6,1,0,1,0,0xad30f8224f849b2f79ab9faa5e12dfb6 +84,1,0,7,7,1,0,1,0,0x1d2a8de73bb46051d25352fc0847fe81 +84,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,9,9,1,0,1,0,0x0f703768c45229180e5f94f2a8e43d6f +84,1,0,10,10,1,0,1,0,0x3a636d75f60239218c1e291af38830ff +84,1,0,11,11,1,0,1,0,0x2ab411983907ac32bd6e1d8c4f590584 +84,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,13,13,1,0,1,0,0x0f759e4ba63847351960fb098109410a +84,1,0,14,14,1,0,1,0,0x06015b392f99cfcd479522a42893612a +84,1,0,15,15,1,0,1,0,0x9bf23af2cd332913bc531f94ff09c939 +84,1,0,16,0,0,1,1,0,0x1e19fbd2867bd3d575724e9cbcbcce2c +84,1,0,17,1,0,1,1,0,0xa2211063217fc81ecd7f4cc0468176cd +84,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +84,1,0,34,0,0,1,1,0,0x00000000000000000000000000000000 +84,1,0,35,1,0,1,1,0,0x00000000000000000000000000000000 +84,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +84,0,1,1,1,0,0,1,0,0x0ba3135a3cc1558844277f6a7ede9280 +84,0,1,2,2,0,0,1,0,0xd9ef7e97b79285e5959ab9b9a878ca03 +84,0,1,3,3,0,0,1,0,0xdbeceff5f9abb220c03f3b8d4e619673 +84,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +84,0,1,5,5,0,0,1,0,0x17603f2a5b42cbd2cc9b3a0d0d0ec0ea +84,0,1,6,6,0,0,1,0,0xeadf3764a150ad9039573e02da41e255 +84,0,1,7,7,0,0,1,0,0x649aeb5710799308c5f24894eceb7333 +84,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +84,0,1,9,9,0,0,1,0,0x128ffc75a60400b10a93105c45032348 +84,0,1,10,10,0,0,1,0,0x1974087845175d99972000b590844188 +84,0,1,11,11,0,0,1,0,0x63169c16ab1a51b777fc54dacedbfe9e +84,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +84,0,1,13,13,0,0,1,0,0x07ebb68d4204f1bfcd109d68f068e93b +84,0,1,14,14,0,0,1,0,0x8d5c59ff20db66b7d70a56deed52c397 +84,0,1,15,15,0,0,1,0,0x1efea40fff8fdc8a45578287e4ddd729 +85,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +85,1,0,1,1,1,0,0,0,0x14a726318101732605fc53c8c8863e6a +85,1,0,2,2,1,0,0,0,0x159a7e1694fbeef1fda48faf84c99749 +85,1,0,3,3,1,0,0,0,0x27650c80cdbfad9cfa78c6106a410d60 +85,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +85,1,0,5,5,1,0,0,0,0x02d10766ed61fd5403594db491c95244 +85,1,0,6,6,1,0,0,0,0x232e0ae08b6c82132946bcfbbce9de47 +85,1,0,7,7,1,0,0,0,0xf54b7357dc1ac6fe7ef1fae84cd945e2 +85,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +85,1,0,9,9,1,0,0,0,0x0a3135251e26a06b691a7b4795fbe9eb +85,1,0,10,10,1,0,0,0,0x517f6e70b8e7e4c4695f51eae89e780d +85,1,0,11,11,1,0,0,0,0xbcb1d3184722aa6be47127718e1b45a3 +85,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +85,1,0,13,13,1,0,0,0,0x0fc6385b58c73f0bee1c9c0b3278ed6b +85,1,0,14,14,1,0,0,0,0x820dd012c8d86174ec0828d2b3720939 +85,1,0,15,15,1,0,0,0,0x7ff973914ffeab7ee451bf593b9d166f +85,1,0,16,0,0,1,0,0,0x66de576c3546456c76dc7dc60cd610b7 +85,1,0,17,1,0,1,0,0,0x4781c39cba4541ad1b567c75cc8c8a5e +85,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +85,1,0,19,1,1,0,0,1,0x0e3ffdb5c10069e6a1981cd6d632e82c +85,1,0,20,2,1,0,0,1,0xee211467e66ac7dc35c89e86f4fe4fcf +85,1,0,21,3,1,0,0,1,0xbfa0ee213d7ab307efb7cd085fa4622e +85,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +85,1,0,23,5,1,0,0,1,0x00e914854fa30b489ea11966c6997853 +85,1,0,24,6,1,0,0,1,0xfee0448bb7a36cd4c4b9b3a560f2f5e3 +85,1,0,25,7,1,0,0,1,0xf4138a95f4a008df2b2aa8e3712dad4f +85,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +85,1,0,27,9,1,0,0,1,0x13aef6e288066e8b50d2072a005a6f47 +85,1,0,28,10,1,0,0,1,0x155b9dc73207b9ea795929a5ffb51ee6 +85,1,0,29,11,1,0,0,1,0xad8a43e498209a227240354948f07826 +85,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +85,1,0,31,13,1,0,0,1,0x00fc17cfb4139872aa2dbc7b05be91e8 +85,1,0,32,14,1,0,0,1,0xb22dd8d578aad44563daa39a528e1dc0 +85,1,0,33,15,1,0,0,1,0xeed2d85eaa90b76fd4ac34e741222c0e +85,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +85,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +85,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +85,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +86,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,1,1,1,0,1,0,0x081885b4db98e5377532bc5d92714c2c +86,1,0,2,2,1,0,1,0,0x4fa7ec3b97c83654c7972b78e2ad2519 +86,1,0,3,3,1,0,1,0,0xf15cac28d628cbc6d3fdc19d7cde6630 +86,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,5,5,1,0,1,0,0x0e564774af6250a31986b8e8b6bc6b19 +86,1,0,6,6,1,0,1,0,0xa335eaf4c45e22b415b3fa7a177329bc +86,1,0,7,7,1,0,1,0,0x45cfbff497478fe80c5e03ade620731a +86,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,9,9,1,0,1,0,0x064b97e4b7d25f820b1b9a311010d46d +86,1,0,10,10,1,0,1,0,0x5ed29337d0d3475dad3ac741265643cf +86,1,0,11,11,1,0,1,0,0x7bf89f225dbf9e997672ec19b164c7d3 +86,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,13,13,1,0,1,0,0x14fb595e6e5ccb5c2ad25a97b522bcf8 +86,1,0,14,14,1,0,1,0,0x899d31b4b7f7de56e47bbd9b34855aad +86,1,0,15,15,1,0,1,0,0xb6e571500e3c6a26fda85ba59b43741a +86,1,0,16,0,0,1,1,0,0x4c0585597fbde9b8df5b1d589620cc2a +86,1,0,17,1,0,1,1,0,0x41f6d47496979b51488c4644b89e867b +86,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,19,1,1,0,1,0,0x00602f2e471af8948bd8668bc5654ad0 +86,1,0,20,2,1,0,1,0,0xabc4f2524e9ee444022567764132e984 +86,1,0,21,3,1,0,1,0,0xe54fbd9adea8dad993712463274601ec +86,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,23,5,1,0,1,0,0x058290a09a991f6a5e90bcd89d64259d +86,1,0,24,6,1,0,1,0,0xbd21f4f3987922a3bf95baea9ec93947 +86,1,0,25,7,1,0,1,0,0xf569e13c163aef5f9fe5f5063ba72624 +86,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,27,9,1,0,1,0,0x14675cb4a27a034146e0c5c1a9adcb96 +86,1,0,28,10,1,0,1,0,0x227dc18cfe1e20f0da0bd4e15d642b67 +86,1,0,29,11,1,0,1,0,0x6d555807d5ccd31200cdfde2afa208af +86,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +86,1,0,31,13,1,0,1,0,0x074c250fb0fc9eb10cdf19c1c9fa9975 +86,1,0,32,14,1,0,1,0,0xc77087c55e1fc73d019b02b0767d291b +86,1,0,33,15,1,0,1,0,0x537611447e621cf4099f6a1dc9ec488b +86,1,0,34,0,0,1,1,0,0x00000000000000000000000000000000 +86,1,0,35,1,0,1,1,0,0x00000000000000000000000000000000 +86,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +86,0,1,1,1,0,0,1,0,0x008e5ce14003fb621ff4297e2354822b +86,0,1,2,2,0,0,1,0,0xe09dbc0abf72382a8c3bfffec17df3d0 +86,0,1,3,3,0,0,1,0,0x0f14271339c47bfc9d1eba689ba5abd2 +86,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +86,0,1,5,5,0,0,1,0,0x0e803e8267ce7f5513462dd8dba43778 +86,0,1,6,6,0,0,1,0,0x1698a3fc40f59b901d1621d23868a4a1 +86,0,1,7,7,0,0,1,0,0x3fb29a73ee55e0c630334f67001d44aa +86,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +86,0,1,9,9,0,0,1,0,0x0ab507fb8d0d4b90b8d9b2a391f0cdf6 +86,0,1,10,10,0,0,1,0,0x9f2fde32910b6d572dae79156aed734d +86,0,1,11,11,0,0,1,0,0xdc83897080ef818ee57182fc208eb851 +86,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +86,0,1,13,13,0,0,1,0,0x03f8c3a2e191539ea0b8c74ed07af931 +86,0,1,14,14,0,0,1,0,0x3eff47e5471872de77f72bb0ef940902 +86,0,1,15,15,0,0,1,0,0x2f0291408399257fde3b8cfe25a6ef8d +87,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +87,1,0,1,1,1,0,0,0,0x0794f381851b3c03a96fea7201a9f0ee +87,1,0,2,2,1,0,0,0,0xfe52c8c3dbf9ae99707848699459da3a +87,1,0,3,3,1,0,0,0,0x8dfc69da2adc5fa23d8b4a984e248ac6 +87,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +87,1,0,5,5,1,0,0,0,0x0183162b2463a023cf74476f3e9f43db +87,1,0,6,6,1,0,0,0,0x14be53b443e4b4dad92b7bf1306f1651 +87,1,0,7,7,1,0,0,0,0x942993c6fcc9839168caeeb7527e5f88 +87,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +87,1,0,9,9,1,0,0,0,0x0ffbb46625c39648849feb57f90d32ed +87,1,0,10,10,1,0,0,0,0x71cc4cef0b7bb8078f463ce278acb7ec +87,1,0,11,11,1,0,0,0,0xc787fc6cf226e32bce9528d4e43cba6e +87,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +87,1,0,13,13,1,0,0,0,0x142533ff30930a79db69d23ee7993dd0 +87,1,0,14,14,1,0,0,0,0xce78cd607c4b10af3063f6aa0ed8471b +87,1,0,15,15,1,0,0,0,0xad1a34f8ddfbfb420318624e59c431f6 +87,1,0,16,0,0,1,0,0,0x146439834c50022ae9b13387ed23fa70 +87,1,0,17,1,0,1,0,0,0xbe8f1ef407f16d94a830d3f5125939fa +87,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +87,1,0,19,1,1,0,0,1,0x06ee789b5d4339accae9f6930c492b59 +87,1,0,20,2,1,0,0,1,0x5869814b22f8ed7320117172329e0c0b +87,1,0,21,3,1,0,0,1,0x68bb8352f21d5d2ccf3e652ab62c38b0 +87,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +87,1,0,23,5,1,0,0,1,0x0c4a57035abd2fd91c31762167aeab7f +87,1,0,24,6,1,0,0,1,0xae1e2eef0c2d1a5a8e8d9957dc305448 +87,1,0,25,7,1,0,0,1,0x840f7e3365d8451ec265b65d0b69228e +87,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +87,1,0,27,9,1,0,0,1,0x017607c6cca6bbe65f3114cd8c20da81 +87,1,0,28,10,1,0,0,1,0x150be34a5f51d553d3a325cfb12c2a5c +87,1,0,29,11,1,0,0,1,0x33470d3c9fb310a2f49e741025a248f8 +87,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +87,1,0,31,13,1,0,0,1,0x05ccae56f0f1c747b03ad32cadf4eb05 +87,1,0,32,14,1,0,0,1,0x43c323d0fbcf5d766d40382f855cd342 +87,1,0,33,15,1,0,0,1,0x5a6099e8d0d80f865621b63b61b78afc +87,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +87,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +87,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +87,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +88,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,1,1,1,0,1,0,0x1349521a5a6d3233af13a772f2f64802 +88,1,0,2,2,1,0,1,0,0xc633851fad887b5e5aeeae615152e373 +88,1,0,3,3,1,0,1,0,0x885b4eae77078225da9d4799167822cc +88,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,5,5,1,0,1,0,0x1294c531b7626595b7ada1550bf5cfeb +88,1,0,6,6,1,0,1,0,0x4caeb05b5126275d7bd219f60be1201f +88,1,0,7,7,1,0,1,0,0x2684dcffe79be72b971599df0e9a2a2a +88,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,9,9,1,0,1,0,0x0ed6052c8da7f7e5aa70d7a7e9eaca73 +88,1,0,10,10,1,0,1,0,0xc44757368beb3c8c43db20dd9092a286 +88,1,0,11,11,1,0,1,0,0xc5eb5cefdf41a318250cba0b7faab0ce +88,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,13,13,1,0,1,0,0x06cc8be82cff45254a00581a410d3593 +88,1,0,14,14,1,0,1,0,0x91ed12ecff4b1fc9e6533ce9be882894 +88,1,0,15,15,1,0,1,0,0x78e8397aeef92b2df2dd3e0b2c67bb3e +88,1,0,16,0,0,1,1,0,0x567df7efcc31f54a5190d396c111c695 +88,1,0,17,1,0,1,1,0,0x07c9ed7c23b9a4d0a8d5574ae35b567c +88,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +88,1,0,34,0,0,1,1,0,0x4551c5c7445b4232fd5ddd8c62ed8630 +88,1,0,35,1,0,1,1,0,0x59a0dafed1a71aa11c1b437236505060 +88,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +88,0,1,1,1,0,0,1,0,0x0dcafa9919eba66f8c670278604ab47c +88,0,1,2,2,0,0,1,0,0x956c514c9318d1e14ec11056cb86987e +88,0,1,3,3,0,0,1,0,0x0c71592cff85d89b6683df440c514fb7 +88,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +88,0,1,5,5,0,0,1,0,0x0851609f031ae7faf27e2a1f9dd9f43c +88,0,1,6,6,0,0,1,0,0xf0f79478586c9a71ddba56bebd663d79 +88,0,1,7,7,0,0,1,0,0xfd9c1e790752334352db2b96727b4aa0 +88,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +88,0,1,9,9,0,0,1,0,0x0485a3126b1a136d8d239e2d7e987720 +88,0,1,10,10,0,0,1,0,0x55aa65adbf675f59ea26475bb897d5c3 +88,0,1,11,11,0,0,1,0,0x1665984b9e2752321c09a6c45a685dd8 +88,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +88,0,1,13,13,0,0,1,0,0x136b75cbce39292ab808d266f569a8e4 +88,0,1,14,14,0,0,1,0,0x012f028f688a6e2f9c6cf98f94252199 +88,0,1,15,15,0,0,1,0,0x8dbb49fc0d784024d865484d40723d71 +89,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +89,1,0,1,1,1,0,0,0,0x172b9ae63ac6f66ef8d2c7b241c9f35d +89,1,0,2,2,1,0,0,0,0x8a4dfaf9acc8c7b5c14b022cc229ccb1 +89,1,0,3,3,1,0,0,0,0x8edcd595e178eb1fadeae3066edc747d +89,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +89,1,0,5,5,1,0,0,0,0x044a4e4cbfc6ddf1bd1bd08453dc6d0f +89,1,0,6,6,1,0,0,0,0xfc23a300d53ee3f58f929658df4064a1 +89,1,0,7,7,1,0,0,0,0xb12f59dcf5cab0aacb127be6cec2962a +89,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +89,1,0,9,9,1,0,0,0,0x1953e3350971231b39b279f0283507df +89,1,0,10,10,1,0,0,0,0x4aa3970a3a1eb5b6409d8cc842782355 +89,1,0,11,11,1,0,0,0,0x828b32a9b6fbb26671471a9719bd34ec +89,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +89,1,0,13,13,1,0,0,0,0x14e43d7e862bf67bc8df3cfe671a03c3 +89,1,0,14,14,1,0,0,0,0x7109d4e2e5d1feb96702a29bf91c1051 +89,1,0,15,15,1,0,0,0,0xc626281ada7fca25c888e9d34bd01120 +89,1,0,16,0,0,1,0,0,0x16b3423a00f3e35873a2ba14e73d88ed +89,1,0,17,1,0,1,0,0,0x9783bb93496efa5fc224ac5b5eeb34f6 +89,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +89,1,0,19,1,1,0,0,1,0x04ca17b886fe17bb80e040af04bae5e7 +89,1,0,20,2,1,0,0,1,0xd30ab7eabbf253fdafdf9f5d0cb2a4d7 +89,1,0,21,3,1,0,0,1,0xf2c6cf36ab185b34ab36fdee85971177 +89,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +89,1,0,23,5,1,0,0,1,0x19ef309f8a59512767192d37e443c4a3 +89,1,0,24,6,1,0,0,1,0xd0a0ad4d4cab3f166c5f31efea7cc0ec +89,1,0,25,7,1,0,0,1,0x713dc187fe03ba6e1fba552d35c8c6a5 +89,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +89,1,0,27,9,1,0,0,1,0x18336b1a39a61de1a01f555834ded1e2 +89,1,0,28,10,1,0,0,1,0xf6b4d65838ce7ad7b74b6ac58f437279 +89,1,0,29,11,1,0,0,1,0xc9ab8d844d49b59485964079f4cf93fc +89,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +89,1,0,31,13,1,0,0,1,0x04f70037bb11a8c7a5fe2c3b23d00e5e +89,1,0,32,14,1,0,0,1,0x98d418868f4ad2f2d89bb7c47c0c4363 +89,1,0,33,15,1,0,0,1,0x8f4044908ba8a38531521eba975cdcb1 +89,1,0,34,0,0,1,0,0,0x08072449505f149b21114666d7b5599e +89,1,0,35,1,0,1,0,0,0x32c9e49a8979f3552d88c266b1fafc8e +89,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +89,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +90,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,1,1,1,0,1,0,0x167cbacdcc0dd58309abc077b6d45d21 +90,1,0,2,2,1,0,1,0,0x9a8d4d7f5d7cf08a485206908a450096 +90,1,0,3,3,1,0,1,0,0x00cb0d2e42ca2aae115d126305866c4c +90,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,5,5,1,0,1,0,0x11140e4f75821c2276868f273aa0c8b0 +90,1,0,6,6,1,0,1,0,0x9715947117555765168e562c5c1ffb2d +90,1,0,7,7,1,0,1,0,0xd97b643803217e254b626568c0528e1b +90,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,9,9,1,0,1,0,0x10c14c72387904d086ce1815692627dc +90,1,0,10,10,1,0,1,0,0xbc568ee5d9746151037c0e5603327ac1 +90,1,0,11,11,1,0,1,0,0x9a414b267e2c884d6833c5213d4d2daf +90,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,13,13,1,0,1,0,0x029d7c588ff4e3600b84460586fd8d98 +90,1,0,14,14,1,0,1,0,0x9aacb5ddc90d145371516fe4616bf733 +90,1,0,15,15,1,0,1,0,0x31f4b88fc117f12bc060dccb03f95204 +90,1,0,16,0,0,1,1,0,0x3c6fdfaf5c2477fc2d32563cb1000e4d +90,1,0,17,1,0,1,1,0,0x8a930070215669855ded9088d1ff2cef +90,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,19,1,1,0,1,0,0x05bc045d5e4b42b3fd09837aa9e6056b +90,1,0,20,2,1,0,1,0,0x05da1a06254c85ec958c6a382603d2aa +90,1,0,21,3,1,0,1,0,0x87c52aa5764438d10c56ab2b7c37fb54 +90,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,23,5,1,0,1,0,0x006796f3737a4e40591f81350c4889dd +90,1,0,24,6,1,0,1,0,0x40a2143f77379e7c877f8c15e43a9589 +90,1,0,25,7,1,0,1,0,0x99de9ff010e5d21acf8d311a6f904243 +90,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,27,9,1,0,1,0,0x19b44352a4d9afca6c2e1d4ea614e9e2 +90,1,0,28,10,1,0,1,0,0xc4f279f22d0e349641630387e8f1efe5 +90,1,0,29,11,1,0,1,0,0x985484f3fc8fc98069652ba1162ad0f3 +90,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +90,1,0,31,13,1,0,1,0,0x10ed068bdd69f960077a7333cc014e7d +90,1,0,32,14,1,0,1,0,0x8813e94e9550b0d7c36c49b6c20fe600 +90,1,0,33,15,1,0,1,0,0xdddbe305f1e76830e25651c8eeef1906 +90,1,0,34,0,0,1,1,0,0x5eaa7cb31766009e05c891bae5b7833a +90,1,0,35,1,0,1,1,0,0xdc4eb283792c9605af55b0891eec5ea5 +90,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +90,0,1,1,1,0,0,1,0,0x0e95ab89bb56006c0c1588bea45de93c +90,0,1,2,2,0,0,1,0,0xcad34d204100bf54e397ca705be8c7c2 +90,0,1,3,3,0,0,1,0,0x71139e68b8b54f9769d1170e931e98c4 +90,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +90,0,1,5,5,0,0,1,0,0x18016954d4b069c73da47e7831d9bac2 +90,0,1,6,6,0,0,1,0,0xc81d8a4955d53628c3f1a22cac69a4fb +90,0,1,7,7,0,0,1,0,0x568d0adf2d916d2ac74cfbff7876cf99 +90,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +90,0,1,9,9,0,0,1,0,0x0fbda655f9490ee6c4cc8cd89d07c8f0 +90,0,1,10,10,0,0,1,0,0xe39166fe0375d88067396667ccd2c580 +90,0,1,11,11,0,0,1,0,0x5760320a6376978dd5fff84b9effeffc +90,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +90,0,1,13,13,0,0,1,0,0x0614e0bfd784e2c1a54cf6d36b0e5278 +90,0,1,14,14,0,0,1,0,0x0c464245687ce6113185cb64cabfd560 +90,0,1,15,15,0,0,1,0,0x63264f97074ce3877eb8baed18d7f586 +91,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +91,1,0,1,1,1,0,0,0,0x04e2399a1a95a28fe48112433c3cc0b2 +91,1,0,2,2,1,0,0,0,0x367a43def5a7e00dbeeb7fefa23b1bb6 +91,1,0,3,3,1,0,0,0,0xd488dd21742a865fc5132968fc140c0f +91,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +91,1,0,5,5,1,0,0,0,0x030201d5fa37a4b8a5c87f29dec2be4b +91,1,0,6,6,1,0,0,0,0xe3166b96ed9ed20db24972f2533df0f1 +91,1,0,7,7,1,0,0,0,0x15788401fd41b68cd5cf389adbbd5b45 +91,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +91,1,0,9,9,1,0,0,0,0x064fb044c70ba5650a4fe3584aee0395 +91,1,0,10,10,1,0,0,0,0xfac9cb23c22bf6ed9d65dcb779a13141 +91,1,0,11,11,1,0,0,0,0x33e237bd504632d327746d1fcafa7c9f +91,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +91,1,0,13,13,1,0,0,0,0x13c743a0a530db5d7987026f3397957c +91,1,0,14,14,1,0,0,0,0x2fcf622dc03ca491c01393dea22b2d53 +91,1,0,15,15,1,0,0,0,0x2cb0be30c888e08265949b1e18a1db5b +91,1,0,16,0,0,1,0,0,0x4d1b1b67869f5a1a3c3197e26377dce2 +91,1,0,17,1,0,1,0,0,0x0d7f6fa484ccc2ef1678d47c9eb6bb23 +91,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +91,1,0,19,1,1,0,0,1,0x027262b67ae592a2cbd2fd40538d506c +91,1,0,20,2,1,0,0,1,0xa9cffd1b8e7ee9b595fa03be41172088 +91,1,0,21,3,1,0,0,1,0x735e5600aa0e7f02c0bb9c1dbf5847f3 +91,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +91,1,0,23,5,1,0,0,1,0x03cea41f254000eb521773254b03d495 +91,1,0,24,6,1,0,0,1,0xa8a97a018581a16a09e4fae3bbe8dd72 +91,1,0,25,7,1,0,0,1,0x35e2eae55cbf510178daf72c44351fc3 +91,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +91,1,0,27,9,1,0,0,1,0x07d782401f05b052671c83b11fd99f57 +91,1,0,28,10,1,0,0,1,0x17d65c60224f97792da62c68e27793ea +91,1,0,29,11,1,0,0,1,0x927e1485b3396c79603aae6fd2d593bd +91,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +91,1,0,31,13,1,0,0,1,0x0d6f623f8bfc3d3217ba23568a976550 +91,1,0,32,14,1,0,0,1,0x19945d6d12efd6af5c216f293e6daa01 +91,1,0,33,15,1,0,0,1,0x6078691110791ec3ac0d38632760d7ab +91,1,0,34,0,0,1,0,0,0x232fe9f5b0a764656eef3a8a08db0142 +91,1,0,35,1,0,1,0,0,0xc1f95393dd0971fe7a0dd7566ab6b083 +91,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +91,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +92,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,1,1,1,0,1,0,0x07712c7d9d9c14688cbbba1698f72a60 +92,1,0,2,2,1,0,1,0,0x876ed7e1c3ba732d14e5ef6241407213 +92,1,0,3,3,1,0,1,0,0x8f7fee5604dc40b439eeb19196ca02af +92,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,5,5,1,0,1,0,0x0e8764476c4d664fb7c2603d0e9cdc88 +92,1,0,6,6,1,0,1,0,0xe899ab2e2c1e268ad1e91d09578b68f3 +92,1,0,7,7,1,0,1,0,0xf80c0b7da6d6dcea9cc450e89fb0621c +92,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,9,9,1,0,1,0,0x119329709d94b132964949ae64aa276a +92,1,0,10,10,1,0,1,0,0xdda4ed7f58a95cb75f9dbc45f1d1039e +92,1,0,11,11,1,0,1,0,0x8ef604e0bc40644cc5c4a8c95e5cdd77 +92,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,13,13,1,0,1,0,0x02a8b0321d5700fd8a886c95a5c10a42 +92,1,0,14,14,1,0,1,0,0xd64de4f2620184732e952ae581da8d0f +92,1,0,15,15,1,0,1,0,0xefbe5e9b97bd5909e03f3da80bf3aa3c +92,1,0,16,0,0,1,1,0,0x51c314e39bb5e0da33136f919849ae9a +92,1,0,17,1,0,1,1,0,0xf01ef35c202f2cf7e2dc2b0b6dba6452 +92,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,19,1,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,20,2,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,21,3,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,23,5,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,24,6,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,25,7,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,27,9,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,28,10,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,29,11,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,31,13,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,32,14,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,33,15,1,0,1,0,0x00000000000000000000000000000000 +92,1,0,34,0,0,1,1,0,0x77d48119dfd9f6086891f47e684571df +92,1,0,35,1,0,1,1,0,0x560e19050b89f7e5b50e0f8c4802f872 +92,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +92,0,1,1,1,0,0,1,0,0x0d6155573ee6cd6d8011498dfb4aaea9 +92,0,1,2,2,0,0,1,0,0x8226ef09d00909011432de045e64fe0c +92,0,1,3,3,0,0,1,0,0xb5a4e97d2db9eb185d908afe26e295a9 +92,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +92,0,1,5,5,0,0,1,0,0x07f0d0cfbb2542a365280bee1d73c857 +92,0,1,6,6,0,0,1,0,0xfe91fe0e1843c5b4fc3bed02abc792ca +92,0,1,7,7,0,0,1,0,0xe0f0fe27b26d904dccccda4c0f31a5fe +92,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +92,0,1,9,9,0,0,1,0,0x14e0b67df3c856aece33a10aef8725c2 +92,0,1,10,10,0,0,1,0,0x309f42fba3bc3693b00f6fab15ee2ff6 +92,0,1,11,11,0,0,1,0,0xcdbb6cdf5eacf63e97bcbc8fc063863c +92,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +92,0,1,13,13,0,0,1,0,0x0806f17d43557b9d14a467dfff2f089d +92,0,1,14,14,0,0,1,0,0xf3af34c8182b65df8568b8c56f84ee26 +92,0,1,15,15,0,0,1,0,0x77d6496431c944aac86833692e601103 +93,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +93,1,0,1,1,1,0,0,0,0x03ff7ac3460d5090d481b68b78b89c8a +93,1,0,2,2,1,0,0,0,0xf29c1f686f2f98c62a0243e04a540d9c +93,1,0,3,3,1,0,0,0,0x0f22b066328c9dc39505bd357c9f6dc4 +93,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +93,1,0,5,5,1,0,0,0,0x0f27f72551463cd10990c585112e1a5f +93,1,0,6,6,1,0,0,0,0x876dc260493c8971ff226df37b6aa818 +93,1,0,7,7,1,0,0,0,0x484203134a94e8d01d62e31079b0d642 +93,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +93,1,0,9,9,1,0,0,0,0x1537a78930d9d2e0738224affe59828f +93,1,0,10,10,1,0,0,0,0x2f6d61da33766e185ba3e431f66dc017 +93,1,0,11,11,1,0,0,0,0xb711318b84f50e7d96dda229076ed665 +93,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +93,1,0,13,13,1,0,0,0,0x0ae6b3814c4065d52985ac5b34ec61da +93,1,0,14,14,1,0,0,0,0xc2dfc887be2ce339e2714e53d6a21c43 +93,1,0,15,15,1,0,0,0,0x663acd6423e731ce1d0c7f0f08f61d0f +93,1,0,16,0,0,1,0,0,0x70bf9145963c901e63c796217c31cc4b +93,1,0,17,1,0,1,0,0,0xc12c866bcca59f008e6d4bbee7df5e81 +93,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +93,1,0,19,1,1,0,0,1,0x04547c096737ea016149080eb3647ee9 +93,1,0,20,2,1,0,0,1,0x870eb5a6214f3734aa2abbe6dcffd4b1 +93,1,0,21,3,1,0,0,1,0x533995d1f2ed9f5b5e221216944df4ec +93,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +93,1,0,23,5,1,0,0,1,0x0edcfdf7eac04d912e207b605636d932 +93,1,0,24,6,1,0,0,1,0x33b8a0b11b81c90b845d0fe2052599f4 +93,1,0,25,7,1,0,0,1,0x2ab712fc5ff46d86983da86b89c0003e +93,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +93,1,0,27,9,1,0,0,1,0x1334190b5680dd4f4bb47e63794946dc +93,1,0,28,10,1,0,0,1,0x4a193de38592963c2d56a185731096ae +93,1,0,29,11,1,0,0,1,0x633bfbdfca8b103867cb7b0c1bb6724b +93,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +93,1,0,31,13,1,0,0,1,0x1374df2eeb06574351a242f05e771181 +93,1,0,32,14,1,0,0,1,0x549f9720e5b03cb1c575163900bf5d41 +93,1,0,33,15,1,0,0,1,0x8b410aa6cc68fceda41b979e2cd58ec3 +93,1,0,34,0,0,1,0,0,0x7bf0291ecf20bb1046501c5a9dfded6e +93,1,0,35,1,0,1,0,0,0xc7fe15cadffab281827584165216bf1b +93,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +93,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +94,1,0,0,0,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,1,1,1,0,1,0,0x18c5257671eeceaf2f90e7c6671d1189 +94,1,0,2,2,1,0,1,0,0x153982b84f3760e02196ec38ce7c05a7 +94,1,0,3,3,1,0,1,0,0x67f9c7c5d24f49e5ed238693bd913ad8 +94,1,0,4,4,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,5,5,1,0,1,0,0x10a614238b58cbcc524dee523d46c358 +94,1,0,6,6,1,0,1,0,0xc08d7af578a272c3ea9235b59f78ef8b +94,1,0,7,7,1,0,1,0,0xf4abf33c5adc18fa6c2268a0a4c8b51f +94,1,0,8,8,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,9,9,1,0,1,0,0x044df67d4417787d10e6dfb616d7720e +94,1,0,10,10,1,0,1,0,0x2e2de6177864c3b0a43032b7de9b5694 +94,1,0,11,11,1,0,1,0,0xe9088b10336b19bfdf0d0df1b44ec878 +94,1,0,12,12,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,13,13,1,0,1,0,0x060ee1998499cbd99d64f594e3837e67 +94,1,0,14,14,1,0,1,0,0x732e5bc01a6764520b31ba893fe21082 +94,1,0,15,15,1,0,1,0,0x45884cabede5651dd5d0b920a37c3cdb +94,1,0,16,0,0,1,1,0,0x2b0d6f4850518c8cb8e16494d764e6e6 +94,1,0,17,1,0,1,1,0,0x97e2de69f14de86c850bc553a65f7f97 +94,1,0,18,0,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,19,1,1,0,1,0,0x06f797c6f20ce86a0b8235334f897659 +94,1,0,20,2,1,0,1,0,0xc54587a775190511644010aef6c77c7d +94,1,0,21,3,1,0,1,0,0x72586a35209b1d8f21e4c138f742f626 +94,1,0,22,4,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,23,5,1,0,1,0,0x042099026d97b5b92adadb484cae27f9 +94,1,0,24,6,1,0,1,0,0xa0a292fd1adfbf78f1b2144ea313c323 +94,1,0,25,7,1,0,1,0,0x02a68174e61e7a9000da638003b6de79 +94,1,0,26,8,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,27,9,1,0,1,0,0x028d374c5339c1af2b0c435e23f0c226 +94,1,0,28,10,1,0,1,0,0x89ffc57f38e8dcd830a453a99883831f +94,1,0,29,11,1,0,1,0,0x0641e2048d078e194209fada79bd5529 +94,1,0,30,12,1,0,1,0,0x00000000000000000000000000000000 +94,1,0,31,13,1,0,1,0,0x00858fae2d514e571dfdd5b297b9ac12 +94,1,0,32,14,1,0,1,0,0x7e6c196c12edc04f5559b01d20554f94 +94,1,0,33,15,1,0,1,0,0x779cc4d4af45209c289bfa4e298892d5 +94,1,0,34,0,0,1,1,0,0x7e407606f502660e21e8719c5c0eeeb0 +94,1,0,35,1,0,1,1,0,0xcc35ffb92c8d8aa3d70bdf38d1f3a28c +94,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +94,0,1,1,1,0,0,1,0,0x05d18a55a36439a59cabb241484896c1 +94,0,1,2,2,0,0,1,0,0x48f8094a5e5087ade42be74979860624 +94,0,1,3,3,0,0,1,0,0x5dc6dce951393fda3349a78d666e684b +94,0,1,4,4,0,0,1,0,0x00000000000000000000000000000000 +94,0,1,5,5,0,0,1,0,0x013cdd11b843d493df42670f613324c9 +94,0,1,6,6,0,0,1,0,0x21d359e34f8fe53b5d3ee647dde5bf90 +94,0,1,7,7,0,0,1,0,0xfcbb19dcf29921e1e67b1ecdbb1698d2 +94,0,1,8,8,0,0,1,0,0x00000000000000000000000000000000 +94,0,1,9,9,0,0,1,0,0x171f7e6327f512bd06d22f8e1723cc9e +94,0,1,10,10,0,0,1,0,0xc3948553e410155a73f95b27ab2e1b98 +94,0,1,11,11,0,0,1,0,0x0d6cb2536297e0beb8fbc015902057bd +94,0,1,12,12,0,0,1,0,0x00000000000000000000000000000000 +94,0,1,13,13,0,0,1,0,0x12697fdc29de1b59927ca054904065a8 +94,0,1,14,14,0,0,1,0,0xec19b8cf07342a77fb2a969b5b0b805d +94,0,1,15,15,0,0,1,0,0xbe667d69cdc3c52f621f9c32e74b2548 +95,1,0,0,0,1,0,0,0,0x00000000000000000000000000000000 +95,1,0,1,1,1,0,0,0,0x05079dce06ebf9913c51ccc8d71d6dbe +95,1,0,2,2,1,0,0,0,0x6f958c013fafa33c7c93fb0a5a1a9b57 +95,1,0,3,3,1,0,0,0,0x0830d628b7c745ed776c8f7977a6b8e8 +95,1,0,4,4,1,0,0,0,0x00000000000000000000000000000000 +95,1,0,5,5,1,0,0,0,0x00cb51a21890966e5f24af9812d5de8b +95,1,0,6,6,1,0,0,0,0xb2320c20dbd933a5ae1bc0511f4dcea9 +95,1,0,7,7,1,0,0,0,0x5e04d36676ffd03e515c50b1b30a6684 +95,1,0,8,8,1,0,0,0,0x00000000000000000000000000000000 +95,1,0,9,9,1,0,0,0,0x026c4f4a422d42d633b1838ebb294175 +95,1,0,10,10,1,0,0,0,0xe60801ee8796464acd3ffe7562fdefec +95,1,0,11,11,1,0,0,0,0x25d9a97cea70188571fe3a5a787b9505 +95,1,0,12,12,1,0,0,0,0x00000000000000000000000000000000 +95,1,0,13,13,1,0,0,0,0x09bafc5df6572db0c34677e60d359815 +95,1,0,14,14,1,0,0,0,0x5979275f0cc8e650b2a1da333b1d2754 +95,1,0,15,15,1,0,0,0,0xfddda927ad314db41b7f19f52475f936 +95,1,0,16,0,0,1,0,0,0x2709894b5dddb59fa790f62f8e1891bc +95,1,0,17,1,0,1,0,0,0xe471d68012855f4f7dcf98d3d47eb3f2 +95,1,0,18,0,1,0,0,1,0x00000000000000000000000000000000 +95,1,0,19,1,1,0,0,1,0x062aac0d4965df70779c83aad6985d10 +95,1,0,20,2,1,0,0,1,0x88062001c0426cc3610ead54e72e7f0a +95,1,0,21,3,1,0,0,1,0x7f8e5dbd87cb5f6d1131f7e9f6617858 +95,1,0,22,4,1,0,0,1,0x00000000000000000000000000000000 +95,1,0,23,5,1,0,0,1,0x193de9750ea3cd485fc159f69c02b41d +95,1,0,24,6,1,0,0,1,0x9f55e7d418950d58cfc6ba3741bf37c5 +95,1,0,25,7,1,0,0,1,0x5f01501382656e7e872b61d58b1b0df5 +95,1,0,26,8,1,0,0,1,0x00000000000000000000000000000000 +95,1,0,27,9,1,0,0,1,0x139b8538b14589e792ee8c39e99fa32b +95,1,0,28,10,1,0,0,1,0x74edfbb658552b5bbdbc4725935ad27f +95,1,0,29,11,1,0,0,1,0x40c87eccdf36d2e39584debf2b0fbe4c +95,1,0,30,12,1,0,0,1,0x00000000000000000000000000000000 +95,1,0,31,13,1,0,0,1,0x04bce2d55d0ed4c68215af9f26cd5b87 +95,1,0,32,14,1,0,0,1,0xbc501274ec31b1dd561a966efc1dd5e0 +95,1,0,33,15,1,0,0,1,0xe9469519342f1fb25d13f8d8fd780379 +95,1,0,34,0,0,1,0,0,0x742ddfacffb2c4cafd931c831d773f81 +95,1,0,35,1,0,1,0,0,0x4ac6a1e5d692a601cc75ab366e607ce1 +95,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +95,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +96,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +96,1,0,1,1,1,0,0,1,0x09707e2e2858112f6c18872afc604144 +96,1,0,2,2,1,0,0,1,0xa39c7a57632c888c36b496059f3e81d3 +96,1,0,3,3,1,0,0,1,0xbb36d33745436babf8caa95bf323d7d0 +96,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +96,1,0,5,5,1,0,0,1,0x00a681dd3169036651b0ed89c8b35d9b +96,1,0,6,6,1,0,0,1,0x285bc98eceb7dd9db1d5b64fc0a0fd3c +96,1,0,7,7,1,0,0,1,0x6bdb14696750d43be3366a5742bc33d7 +96,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +96,1,0,9,9,1,0,0,1,0x0d9bbbf7f076ed14ce17c55a2751080b +96,1,0,10,10,1,0,0,1,0x444c7abddc209fc2b7954290f1fe13d1 +96,1,0,11,11,1,0,0,1,0x2aa9a3fada934348006da8a28b557f48 +96,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +96,1,0,13,13,1,0,0,1,0x01b0e3034154a327d383645833bbc358 +96,1,0,14,14,1,0,0,1,0xf7baa2153ca336fcd3709ee2aa452b91 +96,1,0,15,15,1,0,0,1,0xebc28b15410f06311b5484b73bd10b85 +96,1,0,16,0,0,1,0,0,0x35ca14ea70127e527c705bdaa055cb47 +96,1,0,17,1,0,1,0,0,0xc302676d3698943f1c38fcbbe9a12e6b +96,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,19,1,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,20,2,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,21,3,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,23,5,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,24,6,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,25,7,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,27,9,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,28,10,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,29,11,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,31,13,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,32,14,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,33,15,1,0,0,0,0x00000000000000000000000000000000 +96,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +96,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +96,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +96,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +97,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +97,1,0,1,1,1,0,0,1,0x0a40f8f184166dd618c177b9c45be64a +97,1,0,2,2,1,0,0,1,0x0bb2a04dbca9a4d81b97c4229819d507 +97,1,0,3,3,1,0,0,1,0x979924e0a874085d0138c30be4d503e4 +97,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +97,1,0,5,5,1,0,0,1,0x0485c78804633d07a4c274d0b40a1ad4 +97,1,0,6,6,1,0,0,1,0xf7e65d259ce1592ec0b8ae8f2a534c21 +97,1,0,7,7,1,0,0,1,0xfc5a760bf5be03dab50ac5964e5765d1 +97,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +97,1,0,9,9,1,0,0,1,0x1880cca303bb556135322b63c154c282 +97,1,0,10,10,1,0,0,1,0x79d8a944fda03d0cb29aebbc1b7bc4e4 +97,1,0,11,11,1,0,0,1,0xf2e0c8e7af9b63fabdfe594f9c51f85a +97,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +97,1,0,13,13,1,0,0,1,0x04ce75fc333cbb2aee73ff2f2e95f4d7 +97,1,0,14,14,1,0,0,1,0xe09d320e6c3c1ed8107266118f7f5e80 +97,1,0,15,15,1,0,0,1,0xfd2c21f05ba9a4121e7ceb9bf40b9896 +97,1,0,16,0,0,1,0,0,0x52eb879b77f3e961e87a1a945da7a178 +97,1,0,17,1,0,1,0,0,0xc1f9676a2eade8fe1d409c9a7ae9c555 +97,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +97,1,0,19,1,1,0,0,0,0x02f8ce0bd8b84b1e11ece4306ab6efd5 +97,1,0,20,2,1,0,0,0,0xab7ad440c67755a4803c59cd6446cf9e +97,1,0,21,3,1,0,0,0,0xedec044a9b27fa5089ecaa4461cd3fa5 +97,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +97,1,0,23,5,1,0,0,0,0x12beef40a8dc6e431d9d661c4cc1bb47 +97,1,0,24,6,1,0,0,0,0xddcc404bf762a029d25d10591add9f85 +97,1,0,25,7,1,0,0,0,0x014f75b2f3c19d7e22a169199095d08f +97,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +97,1,0,27,9,1,0,0,0,0x025226de15a6bf4bc57af87d11b8b807 +97,1,0,28,10,1,0,0,0,0xd0ffb6ab1adb2a133542dba7a825e6a7 +97,1,0,29,11,1,0,0,0,0xcce53c8df119e92740ce0bdef90d1362 +97,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +97,1,0,31,13,1,0,0,0,0x121f0b53fac0b56e29be771c4769783d +97,1,0,32,14,1,0,0,0,0xb4bba5ddd264f30ba595c6a1b4a80671 +97,1,0,33,15,1,0,0,0,0x7f2db4ec87b48c7488bfe43a9eb19695 +97,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +97,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +97,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +97,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +98,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +98,1,0,1,1,1,0,0,1,0x01dcaebc5e431cbea4b7c266409f73de +98,1,0,2,2,1,0,0,1,0xebdd522023d07f25e90310ee06cd13d6 +98,1,0,3,3,1,0,0,1,0x941c2be6dd03428727ade07979d16732 +98,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +98,1,0,5,5,1,0,0,1,0x04576cb06a27e991a2591499660f68fe +98,1,0,6,6,1,0,0,1,0x2614173ad2d1c1c81e1456c1bd6e67d5 +98,1,0,7,7,1,0,0,1,0xc44ad42fcc8a6367a7ab48b6c7c199ef +98,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +98,1,0,9,9,1,0,0,1,0x0257619c1bac6d1f887df17e06d34bad +98,1,0,10,10,1,0,0,1,0xb7dcb3e2ea99100039c38813d3ab48bf +98,1,0,11,11,1,0,0,1,0x984cf1f516a2c0f5220d2fba00d19fb3 +98,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +98,1,0,13,13,1,0,0,1,0x112dbbae9576d60a0b2f117ad1f5e447 +98,1,0,14,14,1,0,0,1,0x8321a8ac0669550dfc613d37e32fa40a +98,1,0,15,15,1,0,0,1,0x59cc342e85ac2e067c1e67d671438c1d +98,1,0,16,0,0,1,0,0,0x310a84093d77271276ac1cc7363cfe3e +98,1,0,17,1,0,1,0,0,0x20816a544edcce76ccf3721351ec693f +98,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +98,1,0,19,1,1,0,0,0,0x17556ff12480dcb0cf32b26a235da6b2 +98,1,0,20,2,1,0,0,0,0x31d6061ce585dcb1dc01a9ca44c6010a +98,1,0,21,3,1,0,0,0,0x49b4d3b98d98f36680ec558685134133 +98,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +98,1,0,23,5,1,0,0,0,0x12e9832213c517577e73c8a8a920d363 +98,1,0,24,6,1,0,0,0,0x5462617d066dd9a07d82429886b5da74 +98,1,0,25,7,1,0,0,0,0xef054965ea0065666bbe4307e6b3863c +98,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +98,1,0,27,9,1,0,0,0,0x03a51708f0be40e2c653a39197769c8a +98,1,0,28,10,1,0,0,0,0x496daf463f883179871481093a472db1 +98,1,0,29,11,1,0,0,0,0x12e285b3ad18489833c6cc5f216ae574 +98,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +98,1,0,31,13,1,0,0,0,0x0d547a87a147e9b188744864bed610a5 +98,1,0,32,14,1,0,0,0,0x0d8a92726fbcf3f7ec70e9c8b264a0f6 +98,1,0,33,15,1,0,0,0,0x29a540550ce2691917ff76a6cc82bbe7 +98,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +98,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +98,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +98,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 +99,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +99,1,0,1,1,1,0,0,1,0x0e8d59df17952ac153d9cec0177903e2 +99,1,0,2,2,1,0,0,1,0x44c8593af904c9499cff41462a652e64 +99,1,0,3,3,1,0,0,1,0xb39ed6cff150e340c4e1b7728bdcbee9 +99,1,0,4,4,1,0,0,1,0x00000000000000000000000000000000 +99,1,0,5,5,1,0,0,1,0x19db7b9c3f335544046ed49a5906ee44 +99,1,0,6,6,1,0,0,1,0x15fd53d675b38346f381897250670a6e +99,1,0,7,7,1,0,0,1,0xf39cfbf741a187d7a3e6f2319be961d4 +99,1,0,8,8,1,0,0,1,0x00000000000000000000000000000000 +99,1,0,9,9,1,0,0,1,0x1727d8f8f063860cce1abba253753a96 +99,1,0,10,10,1,0,0,1,0x9151ea9d251ddb88daa3c00f1c661539 +99,1,0,11,11,1,0,0,1,0x6ff8630529e79d29cddab360796a4552 +99,1,0,12,12,1,0,0,1,0x00000000000000000000000000000000 +99,1,0,13,13,1,0,0,1,0x0c04e44038f67767a88ffd7457302552 +99,1,0,14,14,1,0,0,1,0x4b0d9b25b757beb2ef4e0eac79382401 +99,1,0,15,15,1,0,0,1,0xf5f1ff1f920207c123cbd041019497c6 +99,1,0,16,0,0,1,0,0,0x6aa2241aa5d88a71a474013564546ec2 +99,1,0,17,1,0,1,0,0,0xe45498eb4f17ab610dac1890a61ce7ee +99,1,0,18,0,1,0,0,0,0x00000000000000000000000000000000 +99,1,0,19,1,1,0,0,0,0x0575031ef588526b0f376522e313fd17 +99,1,0,20,2,1,0,0,0,0x65d2c265103cc11c94da3f04f788314b +99,1,0,21,3,1,0,0,0,0x587f6c60ee8908fe4d4ead3dedbde929 +99,1,0,22,4,1,0,0,0,0x00000000000000000000000000000000 +99,1,0,23,5,1,0,0,0,0x048e6390445d814693650aec4738fdae +99,1,0,24,6,1,0,0,0,0x6e2fdb184ee15c038e8bcc5cd5e8a7e6 +99,1,0,25,7,1,0,0,0,0xec981ddc68334605164eb01855568e31 +99,1,0,26,8,1,0,0,0,0x00000000000000000000000000000000 +99,1,0,27,9,1,0,0,0,0x1265731b044343c65bbe6aec9b71a2fd +99,1,0,28,10,1,0,0,0,0x66924f11e9479ff0080c725e005dd12e +99,1,0,29,11,1,0,0,0,0x0c95f3fb17c28329e548e9a1b7a64bda +99,1,0,30,12,1,0,0,0,0x00000000000000000000000000000000 +99,1,0,31,13,1,0,0,0,0x0667ec1e2c621bdd92cf09466ec88750 +99,1,0,32,14,1,0,0,0,0x940c2de6f1a21af6ba2912c205acf060 +99,1,0,33,15,1,0,0,0,0x9f0b5be379b53a087d6a59b28c31a11a +99,1,0,34,0,0,1,0,0,0x00000000000000000000000000000000 +99,1,0,35,1,0,1,0,0,0x00000000000000000000000000000000 +99,0,1,0,0,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,1,1,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,2,2,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,3,3,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,4,4,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,5,5,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,6,6,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,7,7,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,8,8,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,9,9,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,10,10,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,11,11,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,12,12,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,13,13,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,14,14,0,0,0,0,0x00000000000000000000000000000000 +99,0,1,15,15,0,0,0,0,0x00000000000000000000000000000000 diff --git a/prover/zkevm/prover/bls/testdata/bls_pairing_inputs-0.csv b/prover/zkevm/prover/bls/testdata/bls_pairing_inputs-0.csv new file mode 100644 index 0000000000..960aa88da2 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/bls_pairing_inputs-0.csv @@ -0,0 +1,2117 @@ +ID,DATA_PAIRING_CHECK,RSLT_PAIRING_CHECK,INDEX,CT,IS_FIRST_INPUT,IS_SECOND_INPUT,NONTRIVIAL_POP_BIT,CS_PAIRING_CHECK,CS_G1_MEMBERSHIP,CS_G2_MEMBERSHIP,SUCCESS_BIT,ACC_INPUTS,LIMB +0,1,0,0,0,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,1,1,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,2,2,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,3,3,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,4,4,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,5,5,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,6,6,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,7,7,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,8,0,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,9,1,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,10,2,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,11,3,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,12,4,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,13,5,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,14,6,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,15,7,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,16,8,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,17,9,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,18,10,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,19,11,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,20,12,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,21,13,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,22,14,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,1,0,23,15,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +0,0,1,0,0,0,0,0,0,0,0,1,1,0 +0,0,1,1,1,0,0,0,0,0,0,1,1,1 +1,1,0,0,0,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +1,1,0,1,1,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +1,1,0,2,2,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +1,1,0,3,3,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +1,1,0,4,4,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +1,1,0,5,5,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +1,1,0,6,6,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +1,1,0,7,7,1,0,0,0,0,0,1,1,0x00000000000000000000000000000000 +1,1,0,8,0,0,1,0,0,0,1,1,1,0x00000000000000000000000000000000 +1,1,0,9,1,0,1,0,0,0,1,1,1,0x0943f488a7114f44110c3fc959b79555 +1,1,0,10,2,0,1,0,0,0,1,1,1,0xd218b4baae8e4299ba720edc0ae9604b +1,1,0,11,3,0,1,0,0,0,1,1,1,0x2fe8e11442e13a521d5dafb7fe5fb158 +1,1,0,12,4,0,1,0,0,0,1,1,1,0x00000000000000000000000000000000 +1,1,0,13,5,0,1,0,0,0,1,1,1,0x11563159be865004b70a371373724181 +1,1,0,14,6,0,1,0,0,0,1,1,1,0xa63bbad6124d3aac21c0f1a4f4827154 +1,1,0,15,7,0,1,0,0,0,1,1,1,0x56388fd2177ee69bb9290b84960bf6cf +1,1,0,16,8,0,1,0,0,0,1,1,1,0x00000000000000000000000000000000 +1,1,0,17,9,0,1,0,0,0,1,1,1,0x1027c928f7a7bd6d96e55584a7ee4a5f +1,1,0,18,10,0,1,0,0,0,1,1,1,0xc655fc95ef3cddab68e3d84b565922c9 +1,1,0,19,11,0,1,0,0,0,1,1,1,0x7514af3d46e7417e853acc8219428cf7 +1,1,0,20,12,0,1,0,0,0,1,1,1,0x00000000000000000000000000000000 +1,1,0,21,13,0,1,0,0,0,1,1,1,0x19fc9f4e0c88f6fd7704526a05e6939e +1,1,0,22,14,0,1,0,0,0,1,1,1,0x4e38c85be6bfc518c7ebdd570d0352bd +1,1,0,23,15,0,1,0,0,0,1,1,1,0x13051bcc4ce0406060afb84b04a3eb97 +1,0,1,0,0,0,0,0,0,0,0,1,1,0 +1,0,1,1,1,0,0,0,0,0,0,1,1,1 +2,1,0,0,0,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +2,1,0,1,1,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +2,1,0,2,2,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +2,1,0,3,3,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +2,1,0,4,4,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +2,1,0,5,5,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +2,1,0,6,6,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +2,1,0,7,7,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +2,1,0,8,0,0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +2,1,0,9,1,0,1,0,0,0,1,0,1,0x0c9c73c860961cc28d57cecb378a448e +2,1,0,10,2,0,1,0,0,0,1,0,1,0x61fb257050938a20a6a3dd82f2575770 +2,1,0,11,3,0,1,0,0,0,1,0,1,0x1e3b5d5304e7bdad6095f693f8e1c717 +2,1,0,12,4,0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +2,1,0,13,5,0,1,0,0,0,1,0,1,0x08d96b3480defddf89ccfc3d1bb54a10 +2,1,0,14,6,0,1,0,0,0,1,0,1,0x707bdebb899ac1f0fc6ac12f400f5cce +2,1,0,15,7,0,1,0,0,0,1,0,1,0x76ea8400824e2e57b86fe5900eb9615c +2,1,0,16,8,0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +2,1,0,17,9,0,1,0,0,0,1,0,1,0x032a7cc5ad93a38c610df8d22322a254 +2,1,0,18,10,0,1,0,0,0,1,0,1,0x65c8d991ef219e1ef8cd826f205397ca +2,1,0,19,11,0,1,0,0,0,1,0,1,0xabc4ace89c60036fcbf2491820336763 +2,1,0,20,12,0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +2,1,0,21,13,0,1,0,0,0,1,0,1,0x126d4eb6f84c780250fbbd407202aedf +2,1,0,22,14,0,1,0,0,0,1,0,1,0xfb8168b6cb0cb3540305638f6a5de2ca +2,1,0,23,15,0,1,0,0,0,1,0,1,0xb45da7b812fe23b7ab8ec6e241974321 +2,0,1,0,0,0,0,0,0,0,0,0,1,0 +2,0,1,1,1,0,0,0,0,0,0,0,1,0 +3,1,0,0,0,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +3,1,0,1,1,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +3,1,0,2,2,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +3,1,0,3,3,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +3,1,0,4,4,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +3,1,0,5,5,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +3,1,0,6,6,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +3,1,0,7,7,1,0,0,0,0,0,0,1,0x00000000000000000000000000000000 +3,1,0,8,0,0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,9,1,0,1,0,0,0,1,0,1,0x01cf44875968f8099704bcc18357e365 +3,1,0,10,2,0,1,0,0,0,1,0,1,0x1db8d36d1b30482fa196195abb7db78b +3,1,0,11,3,0,1,0,0,0,1,0,1,0x2d314325d38559b6c537b6bf37bf4fca +3,1,0,12,4,0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,13,5,0,1,0,0,0,1,0,1,0x00aa35938a3a7fecd1d3086d84eee675 +3,1,0,14,6,0,1,0,0,0,1,0,1,0x61133ec0b91f76d86661691e71f0d7b1 +3,1,0,15,7,0,1,0,0,0,1,0,1,0x5db607d2d5df188eaad95a32063d9312 +3,1,0,16,8,0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,17,9,0,1,0,0,0,1,0,1,0x0dcdfed39df6b4c96e9505effbbbcb5f +3,1,0,18,10,0,1,0,0,0,1,0,1,0xf24016e0a31b17649b9945b47f5f0b9d +3,1,0,19,11,0,1,0,0,0,1,0,1,0x29da50bfc5afacd4155712f16a2dc5e0 +3,1,0,20,12,0,1,0,0,0,1,0,1,0x00000000000000000000000000000000 +3,1,0,21,13,0,1,0,0,0,1,0,1,0x162a45e82295805df7744a37479c12c5 +3,1,0,22,14,0,1,0,0,0,1,0,1,0xcbbcf63940da98c3d9b79385e7433f07 +3,1,0,23,15,0,1,0,0,0,1,0,1,0x4655fed5697ff2461b4cb6f8c7b97497 +3,0,1,0,0,0,0,0,0,0,0,0,1,0 +3,0,1,1,1,0,0,0,0,0,0,0,1,0 +4,1,0,0,0,1,0,0,0,1,0,1,1,0x00000000000000000000000000000000 +4,1,0,1,1,1,0,0,0,1,0,1,1,0x05a25c6f8ec93b582aa4a34e50ff37ab +4,1,0,2,2,1,0,0,0,1,0,1,1,0x6230d8b9ddea15a4b1e10e4a90a4b518 +4,1,0,3,3,1,0,0,0,1,0,1,1,0xf2e11e8020c8cd863b0da22af5a91c22 +4,1,0,4,4,1,0,0,0,1,0,1,1,0x00000000000000000000000000000000 +4,1,0,5,5,1,0,0,0,1,0,1,1,0x0636feedd603fc98302a98065bbf2b3a +4,1,0,6,6,1,0,0,0,1,0,1,1,0xd582d0d99aa892fe077ff268d867559e +4,1,0,7,7,1,0,0,0,1,0,1,1,0x4ac301f4e7391b32ae79468c52d8fb63 +4,1,0,8,0,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,9,1,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,10,2,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,11,3,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,12,4,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,13,5,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,14,6,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,15,7,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,16,8,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,17,9,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,18,10,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,19,11,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,20,12,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,21,13,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,22,14,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,1,0,23,15,0,1,0,0,0,0,1,1,0x00000000000000000000000000000000 +4,0,1,0,0,0,0,0,0,0,0,1,1,0 +4,0,1,1,1,0,0,0,0,0,0,1,1,1 +5,1,0,0,0,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +5,1,0,1,1,1,0,0,0,1,0,0,1,0x148fc95059a7153df947122ee6a4ae0e +5,1,0,2,2,1,0,0,0,1,0,0,1,0x9f84f98f3bb88435514ac9376d53a4d5 +5,1,0,3,3,1,0,0,0,1,0,0,1,0x9aea044be2abc1ec48c7903d04fe853b +5,1,0,4,4,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +5,1,0,5,5,1,0,0,0,1,0,0,1,0x012802bd682a36fe58ff8853c24a162a +5,1,0,6,6,1,0,0,0,1,0,0,1,0xf7bf2be2a5198e286956193b76dc3e0d +5,1,0,7,7,1,0,0,0,1,0,0,1,0x51bd2cde3a57ea5bff02aa58d8dc9944 +5,1,0,8,0,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,9,1,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,10,2,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,11,3,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,12,4,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,13,5,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,14,6,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,15,7,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,16,8,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,17,9,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,18,10,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,19,11,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,20,12,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,21,13,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,22,14,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,1,0,23,15,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,0,1,0,0,0,0,0,0,0,0,0,1,0 +5,0,1,1,1,0,0,0,0,0,0,0,1,0 +6,1,0,0,0,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +6,1,0,1,1,1,0,0,0,1,0,0,1,0x169dd2966fa8cd4fc23498428c08887c +6,1,0,2,2,1,0,0,0,1,0,0,1,0xc954fa7f5cc5bb8403dcbf08be0f150f +6,1,0,3,3,1,0,0,0,1,0,0,1,0x42bb657fd7c98d8f50a71a8ecb7abc61 +6,1,0,4,4,1,0,0,0,1,0,0,1,0x00000000000000000000000000000000 +6,1,0,5,5,1,0,0,0,1,0,0,1,0x04e37a7093596f492f7def15d996c843 +6,1,0,6,6,1,0,0,0,1,0,0,1,0xd0f40b1f2d04e0fa711bee0ab332e994 +6,1,0,7,7,1,0,0,0,1,0,0,1,0x589ba2fab7711cf2d88061baa77ec2ef +6,1,0,8,0,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,9,1,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,10,2,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,11,3,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,12,4,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,13,5,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,14,6,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,15,7,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,16,8,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,17,9,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,18,10,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,19,11,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,20,12,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,21,13,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,22,14,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,1,0,23,15,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,0,1,0,0,0,0,0,0,0,0,0,1,0 +6,0,1,1,1,0,0,0,0,0,0,0,1,0 +7,1,0,0,0,1,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +7,1,0,1,1,1,0,1,0,0,0,0,1,0x0228bf7b407492b5d326f75ffb2e82b7 +7,1,0,2,2,1,0,1,0,0,0,0,1,0x22e4bc1b07e06889245949fcc2e44953 +7,1,0,3,3,1,0,1,0,0,0,0,1,0xfd40c0edc6bc435bbeb17a291ee4c8d6 +7,1,0,4,4,1,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +7,1,0,5,5,1,0,1,0,0,0,0,1,0x011729f91f943594f246570e08b16564 +7,1,0,6,6,1,0,1,0,0,0,0,1,0x050e250142ee2f6e968198a95482738b +7,1,0,7,7,1,0,1,0,0,0,0,1,0xe0df25e2230bf0e9911ada1e8cc6785c +7,1,0,8,0,0,1,1,0,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,9,1,0,1,1,0,0,1,0,1,0x0c5ff6027b17d5f7193a86d18d4f0be0 +7,1,0,10,2,0,1,1,0,0,1,0,1,0xa1bc4318d8dc944964d5cc82dd805972 +7,1,0,11,3,0,1,1,0,0,1,0,1,0x71280d2a54e35aea9fb38d87baee49b2 +7,1,0,12,4,0,1,1,0,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,13,5,0,1,1,0,0,1,0,1,0x004e3f7cef2c69400ca4f47315164364 +7,1,0,14,6,0,1,1,0,0,1,0,1,0x016b03546668b1aa11f2d03e5edc75c6 +7,1,0,15,7,0,1,1,0,0,1,0,1,0x4a5fe84b793336eedcf74f2035452383 +7,1,0,16,8,0,1,1,0,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,17,9,0,1,1,0,0,1,0,1,0x0393def5c3a8f51c5022c6b0b5dfac84 +7,1,0,18,10,0,1,1,0,0,1,0,1,0x55fe7c1fc1a36fc52d098eb766772b79 +7,1,0,19,11,0,1,1,0,0,1,0,1,0x4d9ea90375093039907e19674bc6e08f +7,1,0,20,12,0,1,1,0,0,1,0,1,0x00000000000000000000000000000000 +7,1,0,21,13,0,1,1,0,0,1,0,1,0x10f11834cebee38acda3ba98ea266291 +7,1,0,22,14,0,1,1,0,0,1,0,1,0x56f20a64d42a30f1b0927428c32de22d +7,1,0,23,15,0,1,1,0,0,1,0,1,0x9fb3e7d6dccf99997e0e0ad152735506 +7,0,1,0,0,0,0,0,0,0,0,0,1,0 +7,0,1,1,1,0,0,0,0,0,0,0,1,0 +8,1,0,0,0,1,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +8,1,0,1,1,1,0,1,0,0,0,0,1,0x1191b4f8f5a6d4982895bc3d7eeac508 +8,1,0,2,2,1,0,1,0,0,0,0,1,0x197a9e514bb80d256830275eceda3d31 +8,1,0,3,3,1,0,1,0,0,0,0,1,0x62cbc1188d6aa5c52400c0c0100d9e7d +8,1,0,4,4,1,0,1,0,0,0,0,1,0x00000000000000000000000000000000 +8,1,0,5,5,1,0,1,0,0,0,0,1,0x115b1aa0736dc88577c793c98db783ce +8,1,0,6,6,1,0,1,0,0,0,0,1,0x8febde4c2628046e66f50e1039b159f9 +8,1,0,7,7,1,0,1,0,0,0,0,1,0x476247fcef2311b6bb8ccf61c77bea6d +8,1,0,8,0,0,1,1,0,0,1,0,1,0x00000000000000000000000000000000 +8,1,0,9,1,0,1,1,0,0,1,0,1,0x0a443b9ab858fdf4179349311542846f +8,1,0,10,2,0,1,1,0,0,1,0,1,0x25555d0e0befdddb72125f869dcce89f +8,1,0,11,3,0,1,1,0,0,1,0,1,0xa46fec3778bed10659abab7919e89465 +8,1,0,12,4,0,1,1,0,0,1,0,1,0x00000000000000000000000000000000 +8,1,0,13,5,0,1,1,0,0,1,0,1,0x069e54bf78379f73fcd6669ce28a6391 +8,1,0,14,6,0,1,1,0,0,1,0,1,0xceb4dcf084024303ffb63ce54201dd8a +8,1,0,15,7,0,1,1,0,0,1,0,1,0x5cfdd139df61ef635d91ea68484439d5 +8,1,0,16,8,0,1,1,0,0,1,0,1,0x00000000000000000000000000000000 +8,1,0,17,9,0,1,1,0,0,1,0,1,0x085657fd96c77395130c21c88143639a +8,1,0,18,10,0,1,1,0,0,1,0,1,0x7ee10e62b007aa2f08fd39d4ffa960d0 +8,1,0,19,11,0,1,1,0,0,1,0,1,0x5abb473e4af82b714f0234101a7e6034 +8,1,0,20,12,0,1,1,0,0,1,0,1,0x00000000000000000000000000000000 +8,1,0,21,13,0,1,1,0,0,1,0,1,0x12f8f2efccdbc1c5c35100c28e287c93 +8,1,0,22,14,0,1,1,0,0,1,0,1,0x5cac827781a3a91557e58ef15566a241 +8,1,0,23,15,0,1,1,0,0,1,0,1,0x75fb6556fa406cd9c5bbfb934e0610e7 +8,0,1,0,0,0,0,0,0,0,0,0,1,0 +8,0,1,1,1,0,0,0,0,0,0,0,1,0 +9,1,0,0,0,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +9,1,0,1,1,1,0,1,0,1,0,0,1,0x0901e3a5cac785b3f02bfacbbeb57bee +9,1,0,2,2,1,0,1,0,1,0,0,1,0x9c1df4629fb627583d829d6d40ba2e35 +9,1,0,3,3,1,0,1,0,1,0,0,1,0x1dbaf5b1ff7b0065e9d713ffe66b0a93 +9,1,0,4,4,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +9,1,0,5,5,1,0,1,0,1,0,0,1,0x1901cb492fb25eb8bfba4fc4d2fbbe8a +9,1,0,6,6,1,0,1,0,1,0,0,1,0xb6fa11051e9b86fc22752a7947f1beae +9,1,0,7,7,1,0,1,0,1,0,0,1,0xd4f3b62f60c0e7ae47a5d43dd15fdf3a +9,1,0,8,0,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +9,1,0,9,1,0,1,1,0,0,0,0,1,0x069ddadc352debc5116b93e9d84411e4 +9,1,0,10,2,0,1,1,0,0,0,0,1,0x1d44cf9f4d3c57ecaa8a92044bfda2e8 +9,1,0,11,3,0,1,1,0,0,0,0,1,0x9b1b86139bd509d5aaafbfb6b1eca7c6 +9,1,0,12,4,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +9,1,0,13,5,0,1,1,0,0,0,0,1,0x123f474689493036f568bee682158a6f +9,1,0,14,6,0,1,1,0,0,0,0,1,0xfdf38594fa9f838c3f871cafff933141 +9,1,0,15,7,0,1,1,0,0,0,0,1,0x4ddabfeb8ee226a9eabeb377e82b1c21 +9,1,0,16,8,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +9,1,0,17,9,0,1,1,0,0,0,0,1,0x07b30b8c0435775bdc41eeeb6abe2efb +9,1,0,18,10,0,1,1,0,0,0,0,1,0x3cc5277e875547fcdb68971c0c09a0dd +9,1,0,19,11,0,1,1,0,0,0,0,1,0xb43a29be997b1c7a8b1b7518c07cbfcc +9,1,0,20,12,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +9,1,0,21,13,0,1,1,0,0,0,0,1,0x0f86541049d5ad63c772cfea9a4d55c3 +9,1,0,22,14,0,1,1,0,0,0,0,1,0x8c66a321da770cec7cefd39e07b93201 +9,1,0,23,15,0,1,1,0,0,0,0,1,0xcbe395f8c8af0787c4f6b4f420a087a7 +9,0,1,0,0,0,0,0,0,0,0,0,1,0 +9,0,1,1,1,0,0,0,0,0,0,0,1,0 +10,1,0,0,0,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +10,1,0,1,1,1,0,1,0,1,0,0,1,0x0af6b997dfd3534396ed0fb4ea949c51 +10,1,0,2,2,1,0,1,0,1,0,0,1,0x4fb12f9ba7d10afabc7ed6a65b3f05a2 +10,1,0,3,3,1,0,1,0,1,0,0,1,0x2352245e7bb4af2e1563672eeba17c62 +10,1,0,4,4,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +10,1,0,5,5,1,0,1,0,1,0,0,1,0x02d9f19edd649d72d7dbdc77ce9c55bf +10,1,0,6,6,1,0,1,0,1,0,0,1,0x459631d677e7ca879fdba309e3450451 +10,1,0,7,7,1,0,1,0,1,0,0,1,0x9c36390954d83d4d9332f02fb4a78c53 +10,1,0,8,0,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +10,1,0,9,1,0,1,1,0,0,0,0,1,0x13163a1a43f67d516c50cb43a80977c9 +10,1,0,10,2,0,1,1,0,0,0,0,1,0x493c9d712b950a18b1aeb553690996c4 +10,1,0,11,3,0,1,1,0,0,0,0,1,0xa8e5851a09898d243498dd277365dbc5 +10,1,0,12,4,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +10,1,0,13,5,0,1,1,0,0,0,0,1,0x002319bff39bf7808a539b8f389b1418 +10,1,0,14,6,0,1,1,0,0,0,0,1,0x7cd90c621e1359bfa40929f0c31eea8d +10,1,0,15,7,0,1,1,0,0,0,0,1,0x0fe98c886cf8fcf0e7c9fd917aa9420f +10,1,0,16,8,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +10,1,0,17,9,0,1,1,0,0,0,0,1,0x02f2bc06979674ffae4abf750cc6d755 +10,1,0,18,10,0,1,1,0,0,0,0,1,0xfad398bdc34ef708b3e86d407bc99650 +10,1,0,19,11,0,1,1,0,0,0,0,1,0x86b5043c411c021d065246c314ceb2ae +10,1,0,20,12,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +10,1,0,21,13,0,1,1,0,0,0,0,1,0x10ae17402a45373a158bc7015cb41ea9 +10,1,0,22,14,0,1,1,0,0,0,0,1,0x5468311a68b874d938e66eb7e6a1d7bd +10,1,0,23,15,0,1,1,0,0,0,0,1,0x9d829aba0fadf2ccd16e80f7bbe66d51 +10,0,1,0,0,0,0,0,0,0,0,0,1,0 +10,0,1,1,1,0,0,0,0,0,0,0,1,0 +11,1,0,0,0,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +11,1,0,1,1,1,0,1,0,1,0,0,1,0x15f43a9d35c6d0a0d7fb260c5686a782 +11,1,0,2,2,1,0,1,0,1,0,0,1,0xd8ad5e125acd4c37f867bff5ced41058 +11,1,0,3,3,1,0,1,0,1,0,0,1,0x5be67e3eab19b3633dbb2ff084f5cbc5 +11,1,0,4,4,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +11,1,0,5,5,1,0,1,0,1,0,0,1,0x08c83e31c06b00728600032db6129acc +11,1,0,6,6,1,0,1,0,1,0,0,1,0xd98430f6534d273f7abbd8cfac48b029 +11,1,0,7,7,1,0,1,0,1,0,0,1,0x8615b9e92b247066a1a165564272fea0 +11,1,0,8,0,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +11,1,0,9,1,0,1,1,0,0,0,0,1,0x0a65aa99d0503869e9de3b49a77cebdb +11,1,0,10,2,0,1,1,0,0,0,0,1,0x59367a9b7b5073372a58949828d4c339 +11,1,0,11,3,0,1,1,0,0,0,0,1,0xee09ef61e0b1125b69dd290a4bbdb799 +11,1,0,12,4,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +11,1,0,13,5,0,1,1,0,0,0,0,1,0x04eceb263f4277e8a34ad2e53991307d +11,1,0,14,6,0,1,1,0,0,0,0,1,0x8807bc5b54b98e285f472262403d7186 +11,1,0,15,7,0,1,1,0,0,0,0,1,0x6db7bd2f04d90cb3743aacdf511ce8e2 +11,1,0,16,8,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +11,1,0,17,9,0,1,1,0,0,0,0,1,0x02b101247f0be95e17f6ba067543359b +11,1,0,18,10,0,1,1,0,0,0,0,1,0x39142c053730a068197be03ef3e5a9aa +11,1,0,19,11,0,1,1,0,0,0,0,1,0x4be09d0ac470f3318484c4f6e295677b +11,1,0,20,12,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +11,1,0,21,13,0,1,1,0,0,0,0,1,0x19cda32657e93109f7884b7530350d70 +11,1,0,22,14,0,1,1,0,0,0,0,1,0xdf7425d22bd014256dab500c01fa30fd +11,1,0,23,15,0,1,1,0,0,0,0,1,0xd89f52989dcccf72ebff5e270fce7e45 +11,0,1,0,0,0,0,0,0,0,0,0,1,0 +11,0,1,1,1,0,0,0,0,0,0,0,1,0 +12,1,0,0,0,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +12,1,0,1,1,1,0,1,0,1,0,0,1,0x0b57cd76ced74af50965dfa604c66889 +12,1,0,2,2,1,0,1,0,1,0,0,1,0x4e23c36924994891a6bd7b8c0d67dfb4 +12,1,0,3,3,1,0,1,0,1,0,0,1,0x9be619c7ca1cd6b34d2c7bc889817c1f +12,1,0,4,4,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +12,1,0,5,5,1,0,1,0,1,0,0,1,0x0c1999c3212640fe9f6af0fd26ba0c7d +12,1,0,6,6,1,0,1,0,1,0,0,1,0x005453e0390baa4fdcc9e93c9d7f8a14 +12,1,0,7,7,1,0,1,0,1,0,0,1,0x64e71d7502da04ed9b0107ae37d16795 +12,1,0,8,0,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +12,1,0,9,1,0,1,1,0,0,0,0,1,0x19397391b0eec8dce2e9ee72f560ca79 +12,1,0,10,2,0,1,1,0,0,0,0,1,0x0cc25e4599921c9f581322c4f3314f4f +12,1,0,11,3,0,1,1,0,0,0,0,1,0x94a8c83eb9d7c1838307258d8513039d +12,1,0,12,4,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +12,1,0,13,5,0,1,1,0,0,0,0,1,0x1705409f4da663b3bd8f66fa192febef +12,1,0,14,6,0,1,1,0,0,0,0,1,0xd54f58f9521a0ac610e4c35468d13ff7 +12,1,0,15,7,0,1,1,0,0,0,0,1,0x97d9ea1a180ae32e1ae412370856587b +12,1,0,16,8,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +12,1,0,17,9,0,1,1,0,0,0,0,1,0x1352518298ecc5b61556941cd37ab959 +12,1,0,18,10,0,1,1,0,0,0,0,1,0xbbadf4056f720dac44038cc1662e7db2 +12,1,0,19,11,0,1,1,0,0,0,0,1,0x79f296f4df0680a91bc021de7783e285 +12,1,0,20,12,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +12,1,0,21,13,0,1,1,0,0,0,0,1,0x0601a518d0d1e2205400b04700520a3e +12,1,0,22,14,0,1,1,0,0,0,0,1,0x7a28945b66aff090cf42a14ffdf11b13 +12,1,0,23,15,0,1,1,0,0,0,0,1,0x1f4c70055b932b650b50a1250bfb6ffc +12,0,1,0,0,0,0,0,0,0,0,0,1,0 +12,0,1,1,1,0,0,0,0,0,0,0,1,0 +13,1,0,0,0,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,1,1,1,0,1,0,1,0,0,1,0x14bd82e3169bb0c4b33161123cd531f7 +13,1,0,2,2,1,0,1,0,1,0,0,1,0x986879cafa29c6727064690e8dbcc904 +13,1,0,3,3,1,0,1,0,1,0,0,1,0x1566f5e74bca54ca51cb3dbc999f1b6a +13,1,0,4,4,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,5,5,1,0,1,0,1,0,0,1,0x08ea62fbc98992046529d246b0a89763 +13,1,0,6,6,1,0,1,0,1,0,0,1,0x0fad3325d2c71d69ad2e71013f456f67 +13,1,0,7,7,1,0,1,0,1,0,0,1,0xfc5b2b7e131c7748bcba8c68c0c64f91 +13,1,0,8,0,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +13,1,0,9,1,0,1,1,0,0,0,0,1,0x07545fb3813d566079c0d17fd75a27cf +13,1,0,10,2,0,1,1,0,0,0,0,1,0x7e15fd0b9bc4a1efb600260447f6ec88 +13,1,0,11,3,0,1,1,0,0,0,0,1,0x87310adaec3a1b80ab447cffe2660e66 +13,1,0,12,4,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +13,1,0,13,5,0,1,1,0,0,0,0,1,0x0f2ded0a5a15170052c90bf1ded22219 +13,1,0,14,6,0,1,1,0,0,0,0,1,0x19e44ea07b34db5f9b65783edc733f50 +13,1,0,15,7,0,1,1,0,0,0,0,1,0x362451f08dc05fcfbd0ded5c760bf493 +13,1,0,16,8,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +13,1,0,17,9,0,1,1,0,0,0,0,1,0x18951ea809ed5c680608978dc11b3d7a +13,1,0,18,10,0,1,1,0,0,0,0,1,0x9c6d7e076b9e62260e586468c37e8e2d +13,1,0,19,11,0,1,1,0,0,0,0,1,0xcfbd9e0f25ba008dff985519fddf1ac5 +13,1,0,20,12,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +13,1,0,21,13,0,1,1,0,0,0,0,1,0x0cc281b40e57a69e3c9f59b4da41fc9b +13,1,0,22,14,0,1,1,0,0,0,0,1,0x8423a74aaae0818ea5186888be77c8e6 +13,1,0,23,15,0,1,1,0,0,0,0,1,0x83552bd9cdafdc8f31076894e7f2057b +13,0,1,0,0,0,0,0,0,0,0,0,1,0 +13,0,1,1,1,0,0,0,0,0,0,0,1,0 +14,1,0,0,0,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +14,1,0,1,1,1,0,1,0,1,0,0,1,0x0bea5da6eb9382481a92f1d632113390 +14,1,0,2,2,1,0,1,0,1,0,0,1,0x7e78109fa0b4850d1fe151bd9e51b024 +14,1,0,3,3,1,0,1,0,1,0,0,1,0x61003b016820d2ecda83e4958257d40b +14,1,0,4,4,1,0,1,0,1,0,0,1,0x00000000000000000000000000000000 +14,1,0,5,5,1,0,1,0,1,0,0,1,0x073f8a08f17c7aaf77b5af06029a0af1 +14,1,0,6,6,1,0,1,0,1,0,0,1,0x69bc6f300b78abb16719a4482e9929b9 +14,1,0,7,7,1,0,1,0,1,0,0,1,0xdef254b826656bbd834ec33effcf5710 +14,1,0,8,0,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +14,1,0,9,1,0,1,1,0,0,0,0,1,0x0de4806056c8bfa0dda0de33d249de44 +14,1,0,10,2,0,1,1,0,0,0,0,1,0x4b7eee586b46b65ce3cd1b83a244a273 +14,1,0,11,3,0,1,1,0,0,0,0,1,0xcb02ad28f381da589e2ce8db059885cb +14,1,0,12,4,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +14,1,0,13,5,0,1,1,0,0,0,0,1,0x0f4c12732a17d0b8bd0a464f20584a40 +14,1,0,14,6,0,1,1,0,0,0,0,1,0xc01d9520350566f0d58774df1f7ae9d9 +14,1,0,15,7,0,1,1,0,0,0,0,1,0xdca890156686cc5487d54259021659fc +14,1,0,16,8,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +14,1,0,17,9,0,1,1,0,0,0,0,1,0x112b16b768b874676ea4d9ddd6e75704 +14,1,0,18,10,0,1,1,0,0,0,0,1,0x830b21b35c11de6f4fdcaa23ba1beaa6 +14,1,0,19,11,0,1,1,0,0,0,0,1,0xaf32c93c788f95a5559c60e16f4d621d +14,1,0,20,12,0,1,1,0,0,0,0,1,0x00000000000000000000000000000000 +14,1,0,21,13,0,1,1,0,0,0,0,1,0x0b47f3c7ba7fa64603fcdfc921b199d4 +14,1,0,22,14,0,1,1,0,0,0,0,1,0x318a4d8281b3e79c7c0a0eac629cd071 +14,1,0,23,15,0,1,1,0,0,0,0,1,0xc1abc79716856298df2cbbb32c62d958 +14,0,1,0,0,0,0,0,0,0,0,0,1,0 +14,0,1,1,1,0,0,0,0,0,0,0,1,0 +15,1,0,0,0,1,0,1,1,0,0,1,1,0x00000000000000000000000000000000 +15,1,0,1,1,1,0,1,1,0,0,1,1,0x0e372fec61acc39a61a828299db8022b +15,1,0,2,2,1,0,1,1,0,0,1,1,0x8de20ccc7c6b3ed82d71dce16e2f1bcd +15,1,0,3,3,1,0,1,1,0,0,1,1,0xaeb9fc95e9541b9331894cda03b564d6 +15,1,0,4,4,1,0,1,1,0,0,1,1,0x00000000000000000000000000000000 +15,1,0,5,5,1,0,1,1,0,0,1,1,0x16030357895b0465b5ebbecac72b8cad +15,1,0,6,6,1,0,1,1,0,0,1,1,0x474d85735f3665e2df0353f83d60b78d +15,1,0,7,7,1,0,1,1,0,0,1,1,0x4ee7f3e85dc4d7fa63c2c14207278cf6 +15,1,0,8,0,0,1,1,1,0,0,1,1,0x00000000000000000000000000000000 +15,1,0,9,1,0,1,1,1,0,0,1,1,0x00a382960f594c663b687bba7c266992 +15,1,0,10,2,0,1,1,1,0,0,1,1,0xecb9e2683b65065bf527b3285a1c8ead +15,1,0,11,3,0,1,1,1,0,0,1,1,0x81393f22d1a9348dec38c8b0df22d54e +15,1,0,12,4,0,1,1,1,0,0,1,1,0x00000000000000000000000000000000 +15,1,0,13,5,0,1,1,1,0,0,1,1,0x10abc76045b3ea018a42c97120482bb2 +15,1,0,14,6,0,1,1,1,0,0,1,1,0xd888e412ebce1fdc92d04148a59fbf2a +15,1,0,15,7,0,1,1,1,0,0,1,1,0x678160bf2ecf2e5bbf1b209897afc43d +15,1,0,16,8,0,1,1,1,0,0,1,1,0x00000000000000000000000000000000 +15,1,0,17,9,0,1,1,1,0,0,1,1,0x0ab425fdc795b19e0f74ce47926b6ebb +15,1,0,18,10,0,1,1,1,0,0,1,1,0x3ced756f60862e748c1fbf1694b4e93b +15,1,0,19,11,0,1,1,1,0,0,1,1,0xe52e327c3cadab3a4f51ac2b2e74b1fa +15,1,0,20,12,0,1,1,1,0,0,1,1,0x00000000000000000000000000000000 +15,1,0,21,13,0,1,1,1,0,0,1,1,0x009bb2c2711014d4c5f8763058912129 +15,1,0,22,14,0,1,1,1,0,0,1,1,0x39032372f31beb835c21cad56ce5ce3c +15,1,0,23,15,0,1,1,1,0,0,1,1,0xd071390c1cdf385bdfaa96a6db62a7ad +15,0,1,0,0,0,0,0,1,0,0,1,1,0 +15,0,1,1,1,0,0,0,1,0,0,1,1,0 +16,1,0,0,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,1,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,2,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,3,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,4,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,5,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,6,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,7,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,8,0,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,9,1,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,10,2,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,11,3,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,12,4,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,13,5,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,14,6,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,15,7,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,16,8,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,17,9,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,18,10,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,19,11,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,20,12,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,21,13,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,22,14,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,23,15,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,24,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,25,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,26,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,27,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,28,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,29,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,30,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,31,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,32,0,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,33,1,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,34,2,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,35,3,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,36,4,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,37,5,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,38,6,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,39,7,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,40,8,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,41,9,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,42,10,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,43,11,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,44,12,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,45,13,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,46,14,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,1,0,47,15,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +16,0,1,0,0,0,0,0,0,0,0,1,2,0 +16,0,1,1,1,0,0,0,0,0,0,1,2,1 +17,1,0,0,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,1,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,2,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,3,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,4,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,5,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,6,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,7,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,8,0,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,9,1,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,10,2,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,11,3,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,12,4,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,13,5,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,14,6,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,15,7,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,16,8,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,17,9,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,18,10,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,19,11,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,20,12,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,21,13,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,22,14,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,23,15,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,24,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,25,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,26,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,27,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,28,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,29,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,30,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,31,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +17,1,0,32,0,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +17,1,0,33,1,0,1,0,0,0,1,1,2,0x08384c34a03006dea1f3be6991fd38ee +17,1,0,34,2,0,1,0,0,0,1,1,2,0xb2a17bb7f0ff0b0e38fd8b678dc8f207 +17,1,0,35,3,0,1,0,0,0,1,1,2,0x01580d02308417a52fcf9ee417c72d01 +17,1,0,36,4,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +17,1,0,37,5,0,1,0,0,0,1,1,2,0x0e31fd6b421b9754dc8c820c62010e4e +17,1,0,38,6,0,1,0,0,0,1,1,2,0x566ce6191ae290ccbadcb4ad289e1f48 +17,1,0,39,7,0,1,0,0,0,1,1,2,0x7aa796e1bf8addc51ca2295015af97ce +17,1,0,40,8,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +17,1,0,41,9,0,1,0,0,0,1,1,2,0x13d9bb1e9fa7862c2c7738c98306b26f +17,1,0,42,10,0,1,0,0,0,1,1,2,0x74c9d14031e63d1b7f6c34c0027a7d72 +17,1,0,43,11,0,1,0,0,0,1,1,2,0x17296836e693050d2f0dfafd427e2220 +17,1,0,44,12,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +17,1,0,45,13,0,1,0,0,0,1,1,2,0x0318d39ba4dd5f0aaabf806586e035fd +17,1,0,46,14,0,1,0,0,0,1,1,2,0x8bc0af57192e9c1ecbeb1db3921b557f +17,1,0,47,15,0,1,0,0,0,1,1,2,0xe7e6036d5f50f6c9ec87c214a1215500 +17,0,1,0,0,0,0,0,0,0,0,1,2,0 +17,0,1,1,1,0,0,0,0,0,0,1,2,1 +18,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,24,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,25,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,26,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,27,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,28,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,29,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,30,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,31,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +18,1,0,32,0,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +18,1,0,33,1,0,1,0,0,0,1,0,2,0x18f88213322971f338c8129c08fd7883 +18,1,0,34,2,0,1,0,0,0,1,0,2,0x5de2711f69252356e3d22d636cf2487f +18,1,0,35,3,0,1,0,0,0,1,0,2,0x22be9b8a5c6b27359faaafd9e99c9c9a +18,1,0,36,4,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +18,1,0,37,5,0,1,0,0,0,1,0,2,0x126268826d85e9d4f6e746920ce4402e +18,1,0,38,6,0,1,0,0,0,1,0,2,0x54b0f9173b3a00bca69f4d0d9b90147b +18,1,0,39,7,0,1,0,0,0,1,0,2,0xf340699c69786dd836dacbfe4d153aa7 +18,1,0,40,8,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +18,1,0,41,9,0,1,0,0,0,1,0,2,0x1811ce22d860cd5fdb1b417e6b0f3fd3 +18,1,0,42,10,0,1,0,0,0,1,0,2,0x93ba14fefb99a7dc2960f4d6d731ec92 +18,1,0,43,11,0,1,0,0,0,1,0,2,0x14c644301f5a0d15f82a63df4a0e916d +18,1,0,44,12,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +18,1,0,45,13,0,1,0,0,0,1,0,2,0x12fce46eeab3764f038001b893e78dc6 +18,1,0,46,14,0,1,0,0,0,1,0,2,0xbb02dfb05f604abfea7a4ad7ecc949c9 +18,1,0,47,15,0,1,0,0,0,1,0,2,0x81a4f3c182996896879faecd634fbd8d +18,0,1,0,0,0,0,0,0,0,0,0,2,0 +18,0,1,1,1,0,0,0,0,0,0,0,2,0 +19,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,24,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,25,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,26,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,27,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,28,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,29,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,30,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,31,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +19,1,0,32,0,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +19,1,0,33,1,0,1,0,0,0,1,0,2,0x123cd47f4d3ea00543fee60df937c10b +19,1,0,34,2,0,1,0,0,0,1,0,2,0x2ec241576e6413496d7002fad2162a00 +19,1,0,35,3,0,1,0,0,0,1,0,2,0x55677a8141998e1d7ff33dcf67fb03b7 +19,1,0,36,4,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +19,1,0,37,5,0,1,0,0,0,1,0,2,0x00327824a6440c1028f12cb582640baa +19,1,0,38,6,0,1,0,0,0,1,0,2,0x316e8cc2da7783d13a9c0e5a6755ff1c +19,1,0,39,7,0,1,0,0,0,1,0,2,0xe7abd595cb70c60926897996f63b5cb0 +19,1,0,40,8,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +19,1,0,41,9,0,1,0,0,0,1,0,2,0x0dd1c3825fc3f803b986d3d90c715cdd +19,1,0,42,10,0,1,0,0,0,1,0,2,0x5039cc6f24da737b0ca3413ac15757a5 +19,1,0,43,11,0,1,0,0,0,1,0,2,0x74b6c3c6303088dc5b1dc2b6b09e4e23 +19,1,0,44,12,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +19,1,0,45,13,0,1,0,0,0,1,0,2,0x06677657bafb44d089602c280bc44fdd +19,1,0,46,14,0,1,0,0,0,1,0,2,0xe03f979a0e1dfbf6f9a02537c836082c +19,1,0,47,15,0,1,0,0,0,1,0,2,0xea57b2789ff5756a93a467568f739bcb +19,0,1,0,0,0,0,0,0,0,0,0,2,0 +19,0,1,1,1,0,0,0,0,0,0,0,2,0 +20,1,0,0,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,1,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,2,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,3,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,4,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,5,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,6,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,7,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,8,0,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,9,1,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,10,2,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,11,3,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,12,4,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,13,5,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,14,6,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,15,7,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,16,8,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,17,9,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,18,10,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,19,11,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,20,12,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,21,13,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,22,14,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,23,15,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,24,0,1,0,0,0,1,0,1,2,0x00000000000000000000000000000000 +20,1,0,25,1,1,0,0,0,1,0,1,2,0x07444f12826007da3d72f2eaf698be8f +20,1,0,26,2,1,0,0,0,1,0,1,2,0xb28fc463c16dcae34751d776de417fd7 +20,1,0,27,3,1,0,0,0,1,0,1,2,0x605009fb214c7c315683a114c413c106 +20,1,0,28,4,1,0,0,0,1,0,1,2,0x00000000000000000000000000000000 +20,1,0,29,5,1,0,0,0,1,0,1,2,0x168eb8dd7c216daf24bae5d954044ef3 +20,1,0,30,6,1,0,0,0,1,0,1,2,0xa58214d07c876838cbe8d494e719d055 +20,1,0,31,7,1,0,0,0,1,0,1,2,0x0788423ff80fb78858f5831f159a1381 +20,1,0,32,0,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,33,1,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,34,2,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,35,3,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,36,4,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,37,5,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,38,6,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,39,7,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,40,8,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,41,9,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,42,10,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,43,11,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,44,12,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,45,13,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,46,14,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,1,0,47,15,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +20,0,1,0,0,0,0,0,0,0,0,1,2,0 +20,0,1,1,1,0,0,0,0,0,0,1,2,1 +21,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,24,0,1,0,0,0,1,0,0,2,0x00000000000000000000000000000000 +21,1,0,25,1,1,0,0,0,1,0,0,2,0x04e1d6c4640043a3005681339faeafbb +21,1,0,26,2,1,0,0,0,1,0,0,2,0xe1820f31c59f8491b86b446366a1e9aa +21,1,0,27,3,1,0,0,0,1,0,0,2,0x98e855d70d823850c969d62638051dc6 +21,1,0,28,4,1,0,0,0,1,0,0,2,0x00000000000000000000000000000000 +21,1,0,29,5,1,0,0,0,1,0,0,2,0x12d98e420087db82c4a28fc7ef19510f +21,1,0,30,6,1,0,0,0,1,0,0,2,0x3259bf4c51f5ce194f8a0f1137de6899 +21,1,0,31,7,1,0,0,0,1,0,0,2,0x1113895977ac6b2e215c231310be40d9 +21,1,0,32,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,33,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,34,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,35,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,36,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,37,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,38,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,39,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,40,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,41,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,42,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,43,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,44,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,45,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,46,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,1,0,47,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +21,0,1,0,0,0,0,0,0,0,0,0,2,0 +21,0,1,1,1,0,0,0,0,0,0,0,2,0 +22,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,24,0,1,0,0,0,1,0,0,2,0x00000000000000000000000000000000 +22,1,0,25,1,1,0,0,0,1,0,0,2,0x172b15cf221122295207708af0c4eba5 +22,1,0,26,2,1,0,0,0,1,0,0,2,0x0f15ad64835b4500c9fb939d67adebcd +22,1,0,27,3,1,0,0,0,1,0,0,2,0xabd00e9e13a09053e3cc0d1a716e87ca +22,1,0,28,4,1,0,0,0,1,0,0,2,0x00000000000000000000000000000000 +22,1,0,29,5,1,0,0,0,1,0,0,2,0x0b78a8ad03308cee7a5bdf169ade5a1e +22,1,0,30,6,1,0,0,0,1,0,0,2,0x0306ab38d948a2ec93d393e431e6f8c5 +22,1,0,31,7,1,0,0,0,1,0,0,2,0x59838ca09793b8233ad682f2ceefc73c +22,1,0,32,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,33,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,34,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,35,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,36,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,37,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,38,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,39,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,40,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,41,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,42,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,43,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,44,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,45,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,46,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,1,0,47,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +22,0,1,0,0,0,0,0,0,0,0,0,2,0 +22,0,1,1,1,0,0,0,0,0,0,0,2,0 +23,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,24,0,1,0,1,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,25,1,1,0,1,0,0,0,0,2,0x0b2937ffdb163f38c37ff6146eb41ce0 +23,1,0,26,2,1,0,1,0,0,0,0,2,0x1fbec8a077a48da6630f38abf567439d +23,1,0,27,3,1,0,1,0,0,0,0,2,0x179b1afcecc930754e04366787199ca7 +23,1,0,28,4,1,0,1,0,0,0,0,2,0x00000000000000000000000000000000 +23,1,0,29,5,1,0,1,0,0,0,0,2,0x10e8621c683925f1167747c3fa24975d +23,1,0,30,6,1,0,1,0,0,0,0,2,0xeef31393c89218dc2373cb490435c632 +23,1,0,31,7,1,0,1,0,0,0,0,2,0x7d88343394e326b5ac2e7c363e646ae8 +23,1,0,32,0,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +23,1,0,33,1,0,1,1,0,0,1,0,2,0x064ecdafc6a6f9a11ffe884ce35440a4 +23,1,0,34,2,0,1,1,0,0,1,0,2,0xbac64c3c1a83b243228565820594f22a +23,1,0,35,3,0,1,1,0,0,1,0,2,0xac859f4dc5cda9b4f3d2cc64623c1d2d +23,1,0,36,4,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +23,1,0,37,5,0,1,1,0,0,1,0,2,0x0e846991a0f6a84ab05ae56e0411f026 +23,1,0,38,6,0,1,1,0,0,1,0,2,0xa52167a7f8d35c43780fc470ac6821bf +23,1,0,39,7,0,1,1,0,0,1,0,2,0xef9938a9449f9a23a207fc32116f79ac +23,1,0,40,8,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +23,1,0,41,9,0,1,1,0,0,1,0,2,0x168f42ba90b32001524f89ae0c43b2d1 +23,1,0,42,10,0,1,1,0,0,1,0,2,0x696bbd26eff82dfb4d98002b18de79d6 +23,1,0,43,11,0,1,1,0,0,1,0,2,0x209a30c6b97e8b23893bfe0989b66039 +23,1,0,44,12,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +23,1,0,45,13,0,1,1,0,0,1,0,2,0x10dccedbb69a19cedfd113e8bca5d670 +23,1,0,46,14,0,1,1,0,0,1,0,2,0xf77550e3c206304c63d1ba5f6f531649 +23,1,0,47,15,0,1,1,0,0,1,0,2,0x049925cb70f9b3aab5a415441b2ca118 +23,0,1,0,0,0,0,0,0,0,0,0,2,0 +23,0,1,1,1,0,0,0,0,0,0,0,2,0 +24,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,24,0,1,0,1,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,25,1,1,0,1,0,0,0,0,2,0x0c5cd712a6ea6cea874a64c1d738f6a9 +24,1,0,26,2,1,0,1,0,0,0,0,2,0xd37d39842a0fab8acfd438136ba57517 +24,1,0,27,3,1,0,1,0,0,0,0,2,0xf3855a0b1a756b1052e807a6b28d84f6 +24,1,0,28,4,1,0,1,0,0,0,0,2,0x00000000000000000000000000000000 +24,1,0,29,5,1,0,1,0,0,0,0,2,0x1807b22b7399a8a553b350efde3167f7 +24,1,0,30,6,1,0,1,0,0,0,0,2,0xe69c143f57007fbae767674a67b120e2 +24,1,0,31,7,1,0,1,0,0,0,0,2,0x4c2226040f01ea7a76d1bf27ad142c89 +24,1,0,32,0,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +24,1,0,33,1,0,1,1,0,0,1,0,2,0x097227b4d082a3677019e4b583b244c2 +24,1,0,34,2,0,1,1,0,0,1,0,2,0xb047eab35d844d5b738469f1e6875e19 +24,1,0,35,3,0,1,1,0,0,1,0,2,0x41b7db8561f9355bfa6c950653a5c699 +24,1,0,36,4,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +24,1,0,37,5,0,1,1,0,0,1,0,2,0x090bdc41ce579d181caa38243ecefeaa +24,1,0,38,6,0,1,1,0,0,1,0,2,0xd9dafec8cefe936d4e83787fb5b73ca2 +24,1,0,39,7,0,1,1,0,0,1,0,2,0x9813ca2892ad5d5739cd1b2e3ef07573 +24,1,0,40,8,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +24,1,0,41,9,0,1,1,0,0,1,0,2,0x141e9f4deddfca5da869dc058eab2a8a +24,1,0,42,10,0,1,1,0,0,1,0,2,0xa36e4ac7db60dae42f5feccd9c0cf11b +24,1,0,43,11,0,1,1,0,0,1,0,2,0x249831098352f1e4429d2855047e5fb6 +24,1,0,44,12,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +24,1,0,45,13,0,1,1,0,0,1,0,2,0x0f157328dd994fbdcc28bbeb997b68bb +24,1,0,46,14,0,1,1,0,0,1,0,2,0xbcd0d6c6cdd3a0b6b6117875776a875f +24,1,0,47,15,0,1,1,0,0,1,0,2,0x7ef15303fe3e466eb80a3cdf202167b3 +24,0,1,0,0,0,0,0,0,0,0,0,2,0 +24,0,1,1,1,0,0,0,0,0,0,0,2,0 +25,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +25,1,0,25,1,1,0,1,0,1,0,0,2,0x04cdd9e5f080763756013fa0f0ac8049 +25,1,0,26,2,1,0,1,0,1,0,0,2,0xff3c796bd9a1a243c2422334602541ac +25,1,0,27,3,1,0,1,0,1,0,0,2,0x0004c6f31a4e0e1136dc458aa5d5bbef +25,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +25,1,0,29,5,1,0,1,0,1,0,0,2,0x058c354401c9b36e25ee24345e26bb23 +25,1,0,30,6,1,0,1,0,1,0,0,2,0xfb2e34e0223159c9868c51abb2c8d321 +25,1,0,31,7,1,0,1,0,1,0,0,2,0x4511ae4b54812ed91df8ca3bf0aa5687 +25,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,33,1,0,1,1,0,0,0,0,2,0x05c5f97d81d35694bb3839e080204d62 +25,1,0,34,2,0,1,1,0,0,0,0,2,0xff3fb0b982046e67a8a858eec2cf5a03 +25,1,0,35,3,0,1,1,0,0,0,0,2,0x68abf1a8dc379b8a202496f839a92b29 +25,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,37,5,0,1,1,0,0,0,0,2,0x14ce3b02c9cce035c336c5887688a3d9 +25,1,0,38,6,0,1,1,0,0,0,0,2,0x28b4c54bc3c939cb40bcf8abf84db4d0 +25,1,0,39,7,0,1,1,0,0,0,0,2,0xd8cb992cffa58e9763d689ee59111942 +25,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,41,9,0,1,1,0,0,0,0,2,0x064023933886864f641a28c6cc88f7c9 +25,1,0,42,10,0,1,1,0,0,0,0,2,0x01a1b3a068c15bdac55b62085edc1a8e +25,1,0,43,11,0,1,1,0,0,0,0,2,0x24504a2abf761162b4e8be8476af5a78 +25,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +25,1,0,45,13,0,1,1,0,0,0,0,2,0x037f5c8e51e106e2de03bb405096fdd6 +25,1,0,46,14,0,1,1,0,0,0,0,2,0xdc7b8aa5ca03bacf82af700f40ad33d8 +25,1,0,47,15,0,1,1,0,0,0,0,2,0x5aadb703878c15b301f65f36563362be +25,0,1,0,0,0,0,0,0,0,0,0,2,0 +25,0,1,1,1,0,0,0,0,0,0,0,2,0 +26,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +26,1,0,25,1,1,0,1,0,1,0,0,2,0x10b3a0421398413e1f2aeb5998d5fa92 +26,1,0,26,2,1,0,1,0,1,0,0,2,0x2bb14c2714f25dfd8cc92408a2924c0d +26,1,0,27,3,1,0,1,0,1,0,0,2,0x09d27eb3579d2514429bebd83f8383cb +26,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +26,1,0,29,5,1,0,1,0,1,0,0,2,0x0343b56b6ce3716354993c084db87ff0 +26,1,0,30,6,1,0,1,0,1,0,0,2,0x8ef7d4f7b53a4551b4ac1a177c791279 +26,1,0,31,7,1,0,1,0,1,0,0,2,0x6a73680894ff0af54e8f961c95f9a849 +26,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,33,1,0,1,1,0,0,0,0,2,0x0fd718acaa4c30d7a78e328388e792f4 +26,1,0,34,2,0,1,1,0,0,0,0,2,0x4d23d86982ba4fb7f319642b88abdd48 +26,1,0,35,3,0,1,1,0,0,0,0,2,0x34111fa09862e6729f028c11678e4da6 +26,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,37,5,0,1,1,0,0,0,0,2,0x065eeedac0f5c9a8be66c5fdc3cf9926 +26,1,0,38,6,0,1,1,0,0,0,0,2,0x776a29aac9448f647f2eb121a0ae1e8e +26,1,0,39,7,0,1,1,0,0,0,0,2,0x779f50bfc6c46e4c6833c529f41e7c1f +26,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,41,9,0,1,1,0,0,0,0,2,0x1525f358a4d693edfb95521f98212790 +26,1,0,42,10,0,1,1,0,0,0,0,2,0xfd579029c9b68e30dea0860243961a6e +26,1,0,43,11,0,1,1,0,0,0,0,2,0xb3357e8f7cf80e725db90c3a642a6889 +26,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +26,1,0,45,13,0,1,1,0,0,0,0,2,0x035ec29ff4ac7155ddd5bbc6b62a56ae +26,1,0,46,14,0,1,1,0,0,0,0,2,0x4e18661eb783c03b7ebca30d3fb3324e +26,1,0,47,15,0,1,1,0,0,0,0,2,0x31283b3c302cae3273a5c48ad8f114a4 +26,0,1,0,0,0,0,0,0,0,0,0,2,0 +26,0,1,1,1,0,0,0,0,0,0,0,2,0 +27,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +27,1,0,25,1,1,0,1,0,1,0,0,2,0x04538432d8ed4833a525c4d46fac928d +27,1,0,26,2,1,0,1,0,1,0,0,2,0xe19262351eeb65555dfc8e55ef60e541 +27,1,0,27,3,1,0,1,0,1,0,0,2,0x3bcaeb9fcc7d06fa3de9c197cef2feb8 +27,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +27,1,0,29,5,1,0,1,0,1,0,0,2,0x0be413257336e1733c4fbd36bb6c973d +27,1,0,30,6,1,0,1,0,1,0,0,2,0xff5215d4e88cc3e098ef9798c0eb939f +27,1,0,31,7,1,0,1,0,1,0,0,2,0x943291feff1d8a09d8d390b50f60753b +27,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,33,1,0,1,1,0,0,0,0,2,0x0da92f6acf468a4d2f68f09cdce15f0d +27,1,0,34,2,0,1,1,0,0,0,0,2,0xe378369f9b6a65456696b4458fcb4542 +27,1,0,35,3,0,1,1,0,0,0,0,2,0x26e83c226033d0431350f9cc1b20f443 +27,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,37,5,0,1,1,0,0,0,0,2,0x1039b8cb1bd1ec8e291dc4113b2f0292 +27,1,0,38,6,0,1,1,0,0,0,0,2,0x5c94f0ccf5c25c198f454194a97b52f5 +27,1,0,39,7,0,1,1,0,0,0,0,2,0xfd55c9343bb5df35ae58000844016eb2 +27,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,41,9,0,1,1,0,0,0,0,2,0x16733da90c2172049bc5a6668a99f9ac +27,1,0,42,10,0,1,1,0,0,0,0,2,0x999376c3c005e96328c59d79c5953f47 +27,1,0,43,11,0,1,1,0,0,0,0,2,0xcce9616d1d7099f1e189198e4cd8e1a5 +27,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +27,1,0,45,13,0,1,1,0,0,0,0,2,0x13e068706e5a6993c4253f704385f02b +27,1,0,46,14,0,1,1,0,0,0,0,2,0xa50d2dac3e00c386ad88857a17c5771d +27,1,0,47,15,0,1,1,0,0,0,0,2,0xbc460e56bf7949457d104245e057a9f0 +27,0,1,0,0,0,0,0,0,0,0,0,2,0 +27,0,1,1,1,0,0,0,0,0,0,0,2,0 +28,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +28,1,0,25,1,1,0,1,0,1,0,0,2,0x02046c3508e0628195386bd3a07ed505 +28,1,0,26,2,1,0,1,0,1,0,0,2,0x589ff256121440da62b49b8e4f3d4362 +28,1,0,27,3,1,0,1,0,1,0,0,2,0xbd18f65a1885c23113d22485581b86a2 +28,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +28,1,0,29,5,1,0,1,0,1,0,0,2,0x0a9abb8b446cb36393cb8abb8c3feeea +28,1,0,30,6,1,0,1,0,1,0,0,2,0x54a6b5508134a5ce2db27709521fb548 +28,1,0,31,7,1,0,1,0,1,0,0,2,0x194d913ce3489a4f140511838aedabe8 +28,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,33,1,0,1,1,0,0,0,0,2,0x030293b38a321ef1a04ef987c47fa415 +28,1,0,34,2,0,1,1,0,0,0,0,2,0x9157c9f7e57af1a15412fd6192e754c0 +28,1,0,35,3,0,1,1,0,0,0,0,2,0x467561a11f78460b0a5aad06d2b45caa +28,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,37,5,0,1,1,0,0,0,0,2,0x0e1f1312c7905fd7e1f30c7d2caa3e14 +28,1,0,38,6,0,1,1,0,0,0,0,2,0xcf25e7e9ed4741ed29e3f77481bb73e4 +28,1,0,39,7,0,1,1,0,0,0,0,2,0x810415b88358d0d42320488fdb20df2e +28,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,41,9,0,1,1,0,0,0,0,2,0x056d0f30c349b75985d5815fa5cf3ffd +28,1,0,42,10,0,1,1,0,0,0,0,2,0x62450462cb6c60d4cd0039fd28550a56 +28,1,0,43,11,0,1,1,0,0,0,0,2,0x4a048d96957ab8e6715edfaa06241eb9 +28,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +28,1,0,45,13,0,1,1,0,0,0,0,2,0x0e19f10fd9dedd9c09b9ffade5cbd9b3 +28,1,0,46,14,0,1,1,0,0,0,0,2,0x4312058663843b46187d88989b052a2f +28,1,0,47,15,0,1,1,0,0,0,0,2,0x043f4b390026a45138051201cf2d53f8 +28,0,1,0,0,0,0,0,0,0,0,0,2,0 +28,0,1,1,1,0,0,0,0,0,0,0,2,0 +29,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +29,1,0,25,1,1,0,1,0,1,0,0,2,0x142db07dafa7dd0cdc2531358f2ef292 +29,1,0,26,2,1,0,1,0,1,0,0,2,0xb777a7fed1d4bcd37a3a8f91f2d1eb41 +29,1,0,27,3,1,0,1,0,1,0,0,2,0x0badcc6f8d4e91cbf0f8ac3328afe8df +29,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +29,1,0,29,5,1,0,1,0,1,0,0,2,0x03b52a170cd9d596c85e1dcc3aa858d7 +29,1,0,30,6,1,0,1,0,1,0,0,2,0x1fa6e0e561ef957770f49c032ff67835 +29,1,0,31,7,1,0,1,0,1,0,0,2,0xf337c187fa82d0bdb7cb2cc523e7ec29 +29,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,33,1,0,1,1,0,0,0,0,2,0x127fe7d58fcff7bfc929403665d7ba55 +29,1,0,34,2,0,1,1,0,0,0,0,2,0xe93d3947ea73112e88b2721db990c2f2 +29,1,0,35,3,0,1,1,0,0,0,0,2,0x22aa43f1af9418e47c3aec9fcf470ec0 +29,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,37,5,0,1,1,0,0,0,0,2,0x155b4cdc916dbcea88de1bfe7eab4862 +29,1,0,38,6,0,1,1,0,0,0,0,2,0xd0110bb8445a8395e8d24e1d37dce671 +29,1,0,39,7,0,1,1,0,0,0,0,2,0xca1d4b1dc39659c731fb66e032d7721e +29,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,41,9,0,1,1,0,0,0,0,2,0x18da2f7ce9d107864b4530dde90d0dff +29,1,0,42,10,0,1,1,0,0,0,0,2,0xba7f301fea05e4f3cc26ec81be321522 +29,1,0,43,11,0,1,1,0,0,0,0,2,0x0662363b6a250ef1f772bf658c7fb6fd +29,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +29,1,0,45,13,0,1,1,0,0,0,0,2,0x0f3c8b47a75611c7b9a2a0582231473b +29,1,0,46,14,0,1,1,0,0,0,0,2,0xfbea3ff404373e541fc6fc7da8a1f7bf +29,1,0,47,15,0,1,1,0,0,0,0,2,0x5544d86bc4ee0c998175e58868ff4774 +29,0,1,0,0,0,0,0,0,0,0,0,2,0 +29,0,1,1,1,0,0,0,0,0,0,0,2,0 +30,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,9,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,10,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,11,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,13,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,14,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,15,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,17,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,18,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,19,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,21,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,22,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,23,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +30,1,0,25,1,1,0,1,0,1,0,0,2,0x097f60e72049ddc408b8611b9cd7313e +30,1,0,26,2,1,0,1,0,1,0,0,2,0x490c48ca4283eec0faf8198000faa4d4 +30,1,0,27,3,1,0,1,0,1,0,0,2,0xf73dca1eb6dabe94b36c0815793f2e89 +30,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +30,1,0,29,5,1,0,1,0,1,0,0,2,0x0235eab4227118c97cacc5ea4c20e3e9 +30,1,0,30,6,1,0,1,0,1,0,0,2,0x7883588352e05e889d0cc7d0727d08f7 +30,1,0,31,7,1,0,1,0,1,0,0,2,0x22001d0ce2febd8b1a030e0e5cf1c9ad +30,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,33,1,0,1,1,0,0,0,0,2,0x06cc07ef1d1d7f5fa0aa7de1b0f0f9fc +30,1,0,34,2,0,1,1,0,0,0,0,2,0x7120f436d967045284d5a808e6293f67 +30,1,0,35,3,0,1,1,0,0,0,0,2,0xba90aaa51dfdb3e35b610f7157a68d1b +30,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,37,5,0,1,1,0,0,0,0,2,0x05051d2f0421c2e0e4c256a5a3dc28c8 +30,1,0,38,6,0,1,1,0,0,0,0,2,0xb1bc01929bfd0f0da72e08040376afb7 +30,1,0,39,7,0,1,1,0,0,0,0,2,0x082782fd24d03a00bdd0a1119e7d5266 +30,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,41,9,0,1,1,0,0,0,0,2,0x0d5630be9ec8cb3b765d6586bbcd5eea +30,1,0,42,10,0,1,1,0,0,0,0,2,0x8c09905e509401e9c2c35db4fe7dbb95 +30,1,0,43,11,0,1,1,0,0,0,0,2,0xc2bfda83d5c2e0ccc20a69a072fa467b +30,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +30,1,0,45,13,0,1,1,0,0,0,0,2,0x06c2c4987a96294f571883b0954e8dd8 +30,1,0,46,14,0,1,1,0,0,0,0,2,0xcab1bc1fe9c6fb7c9e80dda979da4cb9 +30,1,0,47,15,0,1,1,0,0,0,0,2,0x42db7f050e3fd05269cea02dee68f8f9 +30,0,1,0,0,0,0,0,0,0,0,0,2,0 +30,0,1,1,1,0,0,0,0,0,0,0,2,0 +31,1,0,0,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,1,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,2,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,3,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,4,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,5,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,6,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,7,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,8,0,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,9,1,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,10,2,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,11,3,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,12,4,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,13,5,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,14,6,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,15,7,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,16,8,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,17,9,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,18,10,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,19,11,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,20,12,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,21,13,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,22,14,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,23,15,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,24,0,1,0,1,1,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,25,1,1,0,1,1,0,0,1,2,0x0eae36b302ae7176e3083e901b2d4cdb +31,1,0,26,2,1,0,1,1,0,0,1,2,0x1dbcb9d3833f7e9c47bf6c7a7d3269b9 +31,1,0,27,3,1,0,1,1,0,0,1,2,0x473df10448fe074f01116067caa50611 +31,1,0,28,4,1,0,1,1,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,29,5,1,0,1,1,0,0,1,2,0x15e51e44d133da7ecc78045064ac58c2 +31,1,0,30,6,1,0,1,1,0,0,1,2,0xaacc02e90ddb00cfcc395d71ff14442e +31,1,0,31,7,1,0,1,1,0,0,1,2,0xe4be78c6c9f2c3752a9098d198c7cd0a +31,1,0,32,0,0,1,1,1,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,33,1,0,1,1,1,0,0,1,2,0x04b40783096c8d3da7c3c0e13366007d +31,1,0,34,2,0,1,1,1,0,0,1,2,0x4d3871d6b534443dfa6556224e8377b0 +31,1,0,35,3,0,1,1,1,0,0,1,2,0x551a61cd80d4491d1789edddbca6b175 +31,1,0,36,4,0,1,1,1,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,37,5,0,1,1,1,0,0,1,2,0x04271e23c5eab7ea4a90b7f1694e3079 +31,1,0,38,6,0,1,1,1,0,0,1,2,0xa21cd5af9ab2839300a9eb9694aade6a +31,1,0,39,7,0,1,1,1,0,0,1,2,0x7ecfe0121ff31ab6e829144b5c5e5413 +31,1,0,40,8,0,1,1,1,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,41,9,0,1,1,1,0,0,1,2,0x192424d2baea33f226c28f784837f918 +31,1,0,42,10,0,1,1,1,0,0,1,2,0x378e082d081c1766f77504c0652126df +31,1,0,43,11,0,1,1,1,0,0,1,2,0xa5d6b3f9556fa002f708f786eac5851f +31,1,0,44,12,0,1,1,1,0,0,1,2,0x00000000000000000000000000000000 +31,1,0,45,13,0,1,1,1,0,0,1,2,0x0f5c86902d181da5666aa55cc4912beb +31,1,0,46,14,0,1,1,1,0,0,1,2,0x7f97471e5e6b50e04412aab8745e5a69 +31,1,0,47,15,0,1,1,1,0,0,1,2,0x74f66d6507651a21b37471bd5f8ff2dc +31,0,1,0,0,0,0,0,1,0,0,1,2,0 +31,0,1,1,1,0,0,0,1,0,0,1,2,0 +32,1,0,0,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,1,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,2,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,3,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,4,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,5,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,6,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,7,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,8,0,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +32,1,0,9,1,0,1,0,0,0,1,1,2,0x06dca9cfa55b5e0a630b1bfa3f6628ad +32,1,0,10,2,0,1,0,0,0,1,1,2,0xfd3cc5e398fb0fb4b2fec2ae4152bdde +32,1,0,11,3,0,1,0,0,0,1,1,2,0xb9403c3ba5277e0be479d975c69e7905 +32,1,0,12,4,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +32,1,0,13,5,0,1,0,0,0,1,1,2,0x1874c81d18032ea572983616dc987678 +32,1,0,14,6,0,1,0,0,0,1,1,2,0x3eb2fe4966874e988bd0884dba1566f4 +32,1,0,15,7,0,1,0,0,0,1,1,2,0xdf9789fb998de0043535b20edd97fa42 +32,1,0,16,8,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +32,1,0,17,9,0,1,0,0,0,1,1,2,0x0daf26ff74884e1576544fc5f2b1c2c6 +32,1,0,18,10,0,1,0,0,0,1,1,2,0x65a3eeb846f9fbacd61c8c817cab10c8 +32,1,0,19,11,0,1,0,0,0,1,1,2,0x30d92cedf036ddefdbc2291126988f33 +32,1,0,20,12,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +32,1,0,21,13,0,1,0,0,0,1,1,2,0x136a07136fa9b6d3b863fda3fb720fc4 +32,1,0,22,14,0,1,0,0,0,1,1,2,0xfa72b8a905ebd6092adb601ed0469a0a +32,1,0,23,15,0,1,0,0,0,1,1,2,0x31fde8d1c56679863fd421b8c27fae63 +32,1,0,24,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,25,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,26,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,27,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,28,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,29,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,30,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,31,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,32,0,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,33,1,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,34,2,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,35,3,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,36,4,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,37,5,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,38,6,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,39,7,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,40,8,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,41,9,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,42,10,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,43,11,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,44,12,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,45,13,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,46,14,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,1,0,47,15,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +32,0,1,0,0,0,0,0,0,0,0,1,2,0 +32,0,1,1,1,0,0,0,0,0,0,1,2,1 +33,1,0,0,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,1,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,2,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,3,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,4,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,5,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,6,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,7,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,8,0,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +33,1,0,9,1,0,1,0,0,0,1,1,2,0x023ab0ec3a9c167ffd1e4733c7456ffa +33,1,0,10,2,0,1,0,0,0,1,1,2,0x4a843e1e4966a3d3590e1efa7a588a7c +33,1,0,11,3,0,1,0,0,0,1,1,2,0x3b8a8720d07d153ba2a4fbeecd05eee0 +33,1,0,12,4,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +33,1,0,13,5,0,1,0,0,0,1,1,2,0x15794bf73ceed0e43fa80fc23cd9a985 +33,1,0,14,6,0,1,0,0,0,1,1,2,0x58bae0ef3e9002ad832c5f8743d96a63 +33,1,0,15,7,0,1,0,0,0,1,1,2,0x71f677b9f02472f7f422c6f3e3a1478c +33,1,0,16,8,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +33,1,0,17,9,0,1,0,0,0,1,1,2,0x1780ce236a83c915afc3f1c585481f1c +33,1,0,18,10,0,1,0,0,0,1,1,2,0x7030f0eee7b5b1303ad923633d71f1d8 +33,1,0,19,11,0,1,0,0,0,1,1,2,0x320510c9076935ce432f5276fae25f2b +33,1,0,20,12,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +33,1,0,21,13,0,1,0,0,0,1,1,2,0x00b44904ffcd4e98e90a41b481f42b7f +33,1,0,22,14,0,1,0,0,0,1,1,2,0x4e3cdb512926ed658349832929e44afe +33,1,0,23,15,0,1,0,0,0,1,1,2,0x1ff16eb8c31c213d8a9ed449209432c0 +33,1,0,24,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,25,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,26,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,27,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,28,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,29,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,30,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,31,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +33,1,0,32,0,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +33,1,0,33,1,0,1,0,0,0,1,1,2,0x02542f79ba9def13519633077ff5a070 +33,1,0,34,2,0,1,0,0,0,1,1,2,0x4e49a5b79f0e882e11996aebd03429a3 +33,1,0,35,3,0,1,0,0,0,1,1,2,0xe3fba29ceaffeb0c2f437b087a6b1e73 +33,1,0,36,4,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +33,1,0,37,5,0,1,0,0,0,1,1,2,0x072b011a594ec057f050bf25d77603c1 +33,1,0,38,6,0,1,0,0,0,1,1,2,0xcf277ed1a024c8443da5b2a0b2db9c8d +33,1,0,39,7,0,1,0,0,0,1,1,2,0x4400b48a4d7a69b7a5c82ebdcb841f01 +33,1,0,40,8,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +33,1,0,41,9,0,1,0,0,0,1,1,2,0x0a9b15232c9a5218a415943388e5ee6e +33,1,0,42,10,0,1,0,0,0,1,1,2,0xb19c991606e133cde2ce733e513438f1 +33,1,0,43,11,0,1,0,0,0,1,1,2,0x3a82864545facc29c726896c39ee51e7 +33,1,0,44,12,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +33,1,0,45,13,0,1,0,0,0,1,1,2,0x151ca134912921de8add6d7f5826360b +33,1,0,46,14,0,1,0,0,0,1,1,2,0xa5ea3c4f52d0300bbb20c465cf305d61 +33,1,0,47,15,0,1,0,0,0,1,1,2,0x36ce863ce687a72260f333614d29a22e +33,0,1,0,0,0,0,0,0,0,0,1,2,0 +33,0,1,1,1,0,0,0,0,0,0,1,2,1 +34,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,9,1,0,1,0,0,0,0,0,2,0x02f38d0aaacbfe13bfc30a4ac3168689 +34,1,0,10,2,0,1,0,0,0,0,0,2,0xe51035aaa199b3d1f8e9807245c78d7a +34,1,0,11,3,0,1,0,0,0,0,0,2,0xb02ff7148ee42c3b735feef6c2ca2f80 +34,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,13,5,0,1,0,0,0,0,0,2,0x00d48584aea8b414f687e2bced908e03 +34,1,0,14,6,0,1,0,0,0,0,0,2,0xb14c3fc3f2e4df989e26a139d2b053ee +34,1,0,15,7,0,1,0,0,0,0,0,2,0x63c670bf3cbdea36c1a6feeef5602728 +34,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,17,9,0,1,0,0,0,0,0,2,0x1899b012308760c30314a7a04cec86e0 +34,1,0,18,10,0,1,0,0,0,0,0,2,0x8a99198a10472775799991b780119d33 +34,1,0,19,11,0,1,0,0,0,0,0,2,0x15200fd4a1e8ec3683c0dba99c59c802 +34,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,21,13,0,1,0,0,0,0,0,2,0x125adfa613033c113ef34b4398d6ba8a +34,1,0,22,14,0,1,0,0,0,0,0,2,0xe44763ba2fc184e540492106faf7ebca +34,1,0,23,15,0,1,0,0,0,0,0,2,0xf768385abc500301fffdd7c716e72d8a +34,1,0,24,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,25,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,26,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,27,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,28,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,29,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,30,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,31,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +34,1,0,32,0,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +34,1,0,33,1,0,1,0,0,0,1,0,2,0x018f1132fa4536d208d9da92dd5cb265 +34,1,0,34,2,0,1,0,0,0,1,0,2,0x9c4bcbd2b9ec18e8e82c942282e5aef7 +34,1,0,35,3,0,1,0,0,0,1,0,2,0x374764c1566a9868277e81e4120a5048 +34,1,0,36,4,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +34,1,0,37,5,0,1,0,0,0,1,0,2,0x0a77434811dfe208c660735bdb31b88f +34,1,0,38,6,0,1,0,0,0,1,0,2,0xe1a6872aebbfe39dc7f3153722fb8d2a +34,1,0,39,7,0,1,0,0,0,1,0,2,0xde7ef21c80a050e2a09ed0f65ab3cf75 +34,1,0,40,8,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +34,1,0,41,9,0,1,0,0,0,1,0,2,0x01959a881f442862725c25360fce0e64 +34,1,0,42,10,0,1,0,0,0,1,0,2,0x2c066a80f1355bc30539b1400fb24ed2 +34,1,0,43,11,0,1,0,0,0,1,0,2,0xa82ff6f64a9bb89148bf2ce882b80a96 +34,1,0,44,12,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +34,1,0,45,13,0,1,0,0,0,1,0,2,0x13cecdabd9be1c1173058f2dbd20c370 +34,1,0,46,14,0,1,0,0,0,1,0,2,0x1d189274c823d66814c9c7934a389cc6 +34,1,0,47,15,0,1,0,0,0,1,0,2,0x35710c948f2a1e2c90b00db84eaa24d8 +34,0,1,0,0,0,0,0,0,0,0,0,2,0 +34,0,1,1,1,0,0,0,0,0,0,0,2,0 +35,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,9,1,0,1,0,0,0,0,0,2,0x085ee7d543a48b8c77b0f4d7bc504f3d +35,1,0,10,2,0,1,0,0,0,0,0,2,0xac9ea1e67eabc04d61d0b84647c0bacc +35,1,0,11,3,0,1,0,0,0,0,0,2,0x0746d0448cd8932a65861d8e2d090185 +35,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,13,5,0,1,0,0,0,0,0,2,0x0af9d8d526ce2231346504409a9f8fff +35,1,0,14,6,0,1,0,0,0,0,0,2,0xd04ee96d29283fa3f59740a137e6397a +35,1,0,15,7,0,1,0,0,0,0,0,2,0x722b520df90e99b441e410a303ee17ed +35,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,17,9,0,1,0,0,0,0,0,2,0x172ff41683602850bd58d6722315667a +35,1,0,18,10,0,1,0,0,0,0,0,2,0x7f1e8b3310ed13d169aad1dbace7dd2a +35,1,0,19,11,0,1,0,0,0,0,0,2,0x81defeb5beb8da4c7f61f0befa431db2 +35,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,21,13,0,1,0,0,0,0,0,2,0x0b2a90bfea072c23c4d3625582d9dc86 +35,1,0,22,14,0,1,0,0,0,0,0,2,0x484a6874da5f048dc5503844cd5e5877 +35,1,0,23,15,0,1,0,0,0,0,0,2,0x8be939f27312420007dce10612d26746 +35,1,0,24,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,25,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,26,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,27,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,28,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,29,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,30,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,31,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +35,1,0,32,0,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +35,1,0,33,1,0,1,0,0,0,1,0,2,0x158fdde33de14ff1ecf8d3a23fdb48df +35,1,0,34,2,0,1,0,0,0,1,0,2,0xddf937b72ea0745120a29b8c0f2e287c +35,1,0,35,3,0,1,0,0,0,1,0,2,0xb0f9069bd0de7079f09b97cffae41d5b +35,1,0,36,4,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +35,1,0,37,5,0,1,0,0,0,1,0,2,0x05968a2571eb97c6ba944700f1de1554 +35,1,0,38,6,0,1,0,0,0,1,0,2,0x0339474e7b551066bb28dd893a927843 +35,1,0,39,7,0,1,0,0,0,1,0,2,0x2d4a108e5263586a1d1770bba76b176c +35,1,0,40,8,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +35,1,0,41,9,0,1,0,0,0,1,0,2,0x17a27d17f6249fd5f854cd6986f6253b +35,1,0,42,10,0,1,0,0,0,1,0,2,0xdbbb27f46be95eaaa0b5e5241ccdb53d +35,1,0,43,11,0,1,0,0,0,1,0,2,0x1823a1409ab229b36a09be710cb2c187 +35,1,0,44,12,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +35,1,0,45,13,0,1,0,0,0,1,0,2,0x04ae857e17a7344dfce1a959eb52b547 +35,1,0,46,14,0,1,0,0,0,1,0,2,0x22238d9af6fe57fbce1071fdbef378e4 +35,1,0,47,15,0,1,0,0,0,1,0,2,0xb7d952b5ecf30daaca7e45e52c88fe15 +35,0,1,0,0,0,0,0,0,0,0,0,2,0 +35,0,1,1,1,0,0,0,0,0,0,0,2,0 +36,1,0,0,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,1,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,2,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,3,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,4,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,5,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,6,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,7,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,8,0,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +36,1,0,9,1,0,1,0,0,0,1,1,2,0x08af81300a4af936c36cdf1d08080689 +36,1,0,10,2,0,1,0,0,0,1,1,2,0x8d191b44c6e1ee87b49d7f6354f1ab57 +36,1,0,11,3,0,1,0,0,0,1,1,2,0xdc4629fa863545aaff2660f184abd9fd +36,1,0,12,4,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +36,1,0,13,5,0,1,0,0,0,1,1,2,0x086f5b66237025fc3995f4cd289888bb +36,1,0,14,6,0,1,0,0,0,1,1,2,0x09bfe8230a38cd31ac877f8d01612202 +36,1,0,15,7,0,1,0,0,0,1,1,2,0x4b5d89fed2c25558e895741ee9cbc15f +36,1,0,16,8,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +36,1,0,17,9,0,1,0,0,0,1,1,2,0x13243bb0cb5183910cbc5920584fa16c +36,1,0,18,10,0,1,0,0,0,1,1,2,0xda37bce1d57e9d10112907b7d00ee34b +36,1,0,19,11,0,1,0,0,0,1,1,2,0x8533e24d6f65ca1ff390825c475f6e1b +36,1,0,20,12,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +36,1,0,21,13,0,1,0,0,0,1,1,2,0x139824a7cf5ce5363844ecefd7326431 +36,1,0,22,14,0,1,0,0,0,1,1,2,0xfad32404c401696554c36352913d36d4 +36,1,0,23,15,0,1,0,0,0,1,1,2,0x3a3bfcbd6c2e719a3be5a7fdb5f60ae7 +36,1,0,24,0,1,0,0,0,1,0,1,2,0x00000000000000000000000000000000 +36,1,0,25,1,1,0,0,0,1,0,1,2,0x03e16f0139fb1a5b8c6aaa3478027d84 +36,1,0,26,2,1,0,0,0,1,0,1,2,0xf572b49068337d7180e43567894cb3cf +36,1,0,27,3,1,0,0,0,1,0,1,2,0x53e859989456ff8f45b3591026c90667 +36,1,0,28,4,1,0,0,0,1,0,1,2,0x00000000000000000000000000000000 +36,1,0,29,5,1,0,0,0,1,0,1,2,0x19414f40763436eea46dc9baf2ad4c3e +36,1,0,30,6,1,0,0,0,1,0,1,2,0x177850202c9fc807b724aec6d27de71e +36,1,0,31,7,1,0,0,0,1,0,1,2,0x75f42b6676e72976e10edef6aeb91e58 +36,1,0,32,0,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,33,1,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,34,2,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,35,3,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,36,4,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,37,5,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,38,6,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,39,7,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,40,8,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,41,9,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,42,10,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,43,11,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,44,12,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,45,13,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,46,14,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,1,0,47,15,0,1,0,0,0,0,1,2,0x00000000000000000000000000000000 +36,0,1,0,0,0,0,0,0,0,0,1,2,0 +36,0,1,1,1,0,0,0,0,0,0,1,2,1 +37,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,9,1,0,1,0,0,0,0,0,2,0x0cb6a3f97c5f0239d6ee71c53f22d2c4 +37,1,0,10,2,0,1,0,0,0,0,0,2,0xc78697ab49fc9d49525c59f5b46b3278 +37,1,0,11,3,0,1,0,0,0,0,0,2,0xe8be2f12873af7c026987ed536cad492 +37,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,13,5,0,1,0,0,0,0,0,2,0x0e24571d1aeb45a6324949e4e0cbce16 +37,1,0,14,6,0,1,0,0,0,0,0,2,0x8340c8e7fab92ee4a21bf18baaab5444 +37,1,0,15,7,0,1,0,0,0,0,0,2,0x071a61659f63ea9ade7bf1176b344723 +37,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,17,9,0,1,0,0,0,0,0,2,0x012f9ab5a9d96b7dd07dffe3e8bcb567 +37,1,0,18,10,0,1,0,0,0,0,0,2,0x110222d85201f8db4b5129dc356e950b +37,1,0,19,11,0,1,0,0,0,0,0,2,0x83e60afc55d16d5ce029f173c83d58cf +37,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,21,13,0,1,0,0,0,0,0,2,0x0a3b5d15bee22553a041837ba4ed7f9e +37,1,0,22,14,0,1,0,0,0,0,0,2,0x54bfd9039bebdd9eb95932519f2e3e55 +37,1,0,23,15,0,1,0,0,0,0,0,2,0x75a9e43704b7d055259a4f621e652221 +37,1,0,24,0,1,0,0,0,1,0,0,2,0x00000000000000000000000000000000 +37,1,0,25,1,1,0,0,0,1,0,0,2,0x0052bbd5989d4601d850015f6e2732b8 +37,1,0,26,2,1,0,0,0,1,0,0,2,0x205081850a6fd5933a34fbe9c23be3ab +37,1,0,27,3,1,0,0,0,1,0,0,2,0xab4157aadeb22ec493b5d62d22261757 +37,1,0,28,4,1,0,0,0,1,0,0,2,0x00000000000000000000000000000000 +37,1,0,29,5,1,0,0,0,1,0,0,2,0x0f23b7d791d4a7b1a82026fa267b6156 +37,1,0,30,6,1,0,0,0,1,0,0,2,0x1ec455bca36705efe4c5d8c3e7299880 +37,1,0,31,7,1,0,0,0,1,0,0,2,0x63ed0ff07396c1100bfc233d8f36563c +37,1,0,32,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,33,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,34,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,35,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,36,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,37,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,38,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,39,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,40,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,41,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,42,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,43,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,44,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,45,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,46,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,1,0,47,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +37,0,1,0,0,0,0,0,0,0,0,0,2,0 +37,0,1,1,1,0,0,0,0,0,0,0,2,0 +38,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,9,1,0,1,0,0,0,0,0,2,0x09358465b25e7210fc4b943db729c58e +38,1,0,10,2,0,1,0,0,0,0,0,2,0xa96fc726c892f079e0c89cab2bcfb121 +38,1,0,11,3,0,1,0,0,0,0,0,2,0x7f2f615550922c8148e9dca2af539068 +38,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,13,5,0,1,0,0,0,0,0,2,0x056986963d5965efd1c45caee653dcfd +38,1,0,14,6,0,1,0,0,0,0,0,2,0xa857f306a03d3518df66590d380532fc +38,1,0,15,7,0,1,0,0,0,0,0,2,0x277181269f084e3d90dca0c6974f5321 +38,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,17,9,0,1,0,0,0,0,0,2,0x0e5fd720ca2f91677d1f0e8fde801698 +38,1,0,18,10,0,1,0,0,0,0,0,2,0x9c400435ce5c5c84197446b9168d008a +38,1,0,19,11,0,1,0,0,0,0,0,2,0xb87a8e8af1aea3d2cb4fa5c98a724bea +38,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,21,13,0,1,0,0,0,0,0,2,0x012273a8344c0e73be775946415eea87 +38,1,0,22,14,0,1,0,0,0,0,0,2,0x71d5fe81072b48be0173b19eac83c0aa +38,1,0,23,15,0,1,0,0,0,0,0,2,0xe4090b09758407f9aec1cc2f88daf400 +38,1,0,24,0,1,0,0,0,1,0,0,2,0x00000000000000000000000000000000 +38,1,0,25,1,1,0,0,0,1,0,0,2,0x12221ccf8a05ef8baf6f46bf22d0e29f +38,1,0,26,2,1,0,0,0,1,0,0,2,0x33b31e13ce622c458f95cbc38220b8f1 +38,1,0,27,3,1,0,0,0,1,0,0,2,0x708cb6e60bbbd69ce13847f76edb7221 +38,1,0,28,4,1,0,0,0,1,0,0,2,0x00000000000000000000000000000000 +38,1,0,29,5,1,0,0,0,1,0,0,2,0x04bc265b3d3575e27643156df3f6b8c3 +38,1,0,30,6,1,0,0,0,1,0,0,2,0x42fc82f23c245d25e681c37bc4eb0359 +38,1,0,31,7,1,0,0,0,1,0,0,2,0xf3a1183642d2997ae7a78f31717c3b59 +38,1,0,32,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,33,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,34,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,35,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,36,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,37,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,38,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,39,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,40,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,41,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,42,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,43,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,44,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,45,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,46,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,1,0,47,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +38,0,1,0,0,0,0,0,0,0,0,0,2,0 +38,0,1,1,1,0,0,0,0,0,0,0,2,0 +39,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,9,1,0,1,0,0,0,0,0,2,0x024641adbb23a84d930b837ff0b60238 +39,1,0,10,2,0,1,0,0,0,0,0,2,0xe1ee1b8f7f1c5793480b365eeba6cd95 +39,1,0,11,3,0,1,0,0,0,0,0,2,0x1ba60e5c8afd08d51148cb27ad0fe756 +39,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,13,5,0,1,0,0,0,0,0,2,0x05ba84f2aa38b433398aa18fdc296136 +39,1,0,14,6,0,1,0,0,0,0,0,2,0xb135fc933058d2787668e5d5c339c840 +39,1,0,15,7,0,1,0,0,0,0,0,2,0xa5405fc56078afed60ae533ecee1e03b +39,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,17,9,0,1,0,0,0,0,0,2,0x151556f0ad98badc103a9075bd2da49e +39,1,0,18,10,0,1,0,0,0,0,0,2,0x16f84cefa1e58f570c2d9e9990b5f1d2 +39,1,0,19,11,0,1,0,0,0,0,0,2,0xa508328e5035d111e66643c430940eb0 +39,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,21,13,0,1,0,0,0,0,0,2,0x0795ab05cf06f593fcec46a45bbca4ba +39,1,0,22,14,0,1,0,0,0,0,0,2,0xae11ab05b72d14ac65ae7d6ff629062f +39,1,0,23,15,0,1,0,0,0,0,0,2,0x43552c533af32e2e5a78b9a5aeb71d8a +39,1,0,24,0,1,0,1,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,25,1,1,0,1,0,0,0,0,2,0x063db5c2f713015c55701ef05f97ddbb +39,1,0,26,2,1,0,1,0,0,0,0,2,0x19405717906ecca25eb52c039351bc8a +39,1,0,27,3,1,0,1,0,0,0,0,2,0x786f57f3b0ae06ff0fd805faa8f810fb +39,1,0,28,4,1,0,1,0,0,0,0,2,0x00000000000000000000000000000000 +39,1,0,29,5,1,0,1,0,0,0,0,2,0x0ee7a5fa34b0d3471c5cde29210aa0f0 +39,1,0,30,6,1,0,1,0,0,0,0,2,0x472e91f2083a4b99a1d5495e49e91938 +39,1,0,31,7,1,0,1,0,0,0,0,2,0xacb9c6e876607c7fcfbcf885655918dc +39,1,0,32,0,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +39,1,0,33,1,0,1,1,0,0,1,0,2,0x0bc7a1d369af6bca6ca529813b3bbb4b +39,1,0,34,2,0,1,1,0,0,1,0,2,0x18cd7f4ded1b29fb12661a0d1558a588 +39,1,0,35,3,0,1,1,0,0,1,0,2,0x73bb60de3ba3189ca3c3234852756054 +39,1,0,36,4,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +39,1,0,37,5,0,1,1,0,0,1,0,2,0x0ff80edb1b0ffc485214d6cfea7bb429 +39,1,0,38,6,0,1,1,0,0,1,0,2,0x39b05ca3a9884a15cf7536bc91edbf75 +39,1,0,39,7,0,1,1,0,0,1,0,2,0xe345b4b62fe2fdffbd998e0ff174486e +39,1,0,40,8,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +39,1,0,41,9,0,1,1,0,0,1,0,2,0x0096c67089159df150e31d4d63add388 +39,1,0,42,10,0,1,1,0,0,1,0,2,0x7043fe9282f87c9bc3e2ac59b2330af1 +39,1,0,43,11,0,1,1,0,0,1,0,2,0x02c368741a98e9d3174d3e001437362e +39,1,0,44,12,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +39,1,0,45,13,0,1,1,0,0,1,0,2,0x0f7fc12eded364fd603e6e622446394f +39,1,0,46,14,0,1,1,0,0,1,0,2,0xb8f750f5b80f4e9879bd8e18080ed71e +39,1,0,47,15,0,1,1,0,0,1,0,2,0x01d6eb495e1946589cf7178366ad26c8 +39,0,1,0,0,0,0,0,0,0,0,0,2,0 +39,0,1,1,1,0,0,0,0,0,0,0,2,0 +40,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,9,1,0,1,0,0,0,0,0,2,0x11db763693ff36629d5469adb66efde0 +40,1,0,10,2,0,1,0,0,0,0,0,2,0xadad8ad288432cd8b1e60e4c5f9be915 +40,1,0,11,3,0,1,0,0,0,0,0,2,0x1ed1e8048101e8fcf4f3d8d308042719 +40,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,13,5,0,1,0,0,0,0,0,2,0x19e065b5a94baa3287e65aacce05a387 +40,1,0,14,6,0,1,0,0,0,0,0,2,0x717c49b1df434ba248d366e71cc7efef +40,1,0,15,7,0,1,0,0,0,0,0,2,0x919481429ee84c2cb13e3ad2df78917f +40,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,17,9,0,1,0,0,0,0,0,2,0x17ca9f78add13de0f67723d9a01a77be +40,1,0,18,10,0,1,0,0,0,0,0,2,0x77a8849a87b772827378b914fbef18f5 +40,1,0,19,11,0,1,0,0,0,0,0,2,0xa82f90141e3e98e337e16b78c5dca00f +40,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,21,13,0,1,0,0,0,0,0,2,0x0164a95965fb55e41e8c9ff1f359f019 +40,1,0,22,14,0,1,0,0,0,0,0,2,0x538fb7a72a66fb03e56f187576dde55e +40,1,0,23,15,0,1,0,0,0,0,0,2,0x34640d4643328234597ecf438dca38cc +40,1,0,24,0,1,0,1,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,25,1,1,0,1,0,0,0,0,2,0x0bd1b58606880e081acfe9a5474ecc14 +40,1,0,26,2,1,0,1,0,0,0,0,2,0xe991226dc97f6522122acd8c0876a128 +40,1,0,27,3,1,0,1,0,0,0,0,2,0x4c9f8627102dd045a6a70766d521881f +40,1,0,28,4,1,0,1,0,0,0,0,2,0x00000000000000000000000000000000 +40,1,0,29,5,1,0,1,0,0,0,0,2,0x0064d85d456f0318f05b921dd11d497d +40,1,0,30,6,1,0,1,0,0,0,0,2,0x7ef25f442962e0787ae5fd4d1e39ce84 +40,1,0,31,7,1,0,1,0,0,0,0,2,0x5503ad24e706a9fb53f5b718da5a9496 +40,1,0,32,0,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +40,1,0,33,1,0,1,1,0,0,1,0,2,0x15538b449b93bbdb9f20f35e7b11aa86 +40,1,0,34,2,0,1,1,0,0,1,0,2,0x4d61b542c633759ed7a6dda7c5331add +40,1,0,35,3,0,1,1,0,0,1,0,2,0xd86240266971ae4bcac056fa63624c1e +40,1,0,36,4,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +40,1,0,37,5,0,1,1,0,0,1,0,2,0x0b609bf88e8af925fad21f353a1825bb +40,1,0,38,6,0,1,1,0,0,1,0,2,0x13172909a5d744513dcd49fda88206cf +40,1,0,39,7,0,1,1,0,0,1,0,2,0x7ad731f95eeb976254b31659932e5a72 +40,1,0,40,8,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +40,1,0,41,9,0,1,1,0,0,1,0,2,0x0a87d390174bdeef749e8b4472545e02 +40,1,0,42,10,0,1,1,0,0,1,0,2,0x6e6a357c53afbb588d6863f1a8692623 +40,1,0,43,11,0,1,1,0,0,1,0,2,0xbb6863e7cfdd615f9ef8c6f69f71a29c +40,1,0,44,12,0,1,1,0,0,1,0,2,0x00000000000000000000000000000000 +40,1,0,45,13,0,1,1,0,0,1,0,2,0x0fede0a297f9b3542d89b91d9e244de1 +40,1,0,46,14,0,1,1,0,0,1,0,2,0x4eee7291979670a7a9b41a0a55ac53d9 +40,1,0,47,15,0,1,1,0,0,1,0,2,0x6a443f84789b358873f715dba9285c5b +40,0,1,0,0,0,0,0,0,0,0,0,2,0 +40,0,1,1,1,0,0,0,0,0,0,0,2,0 +41,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,9,1,0,1,0,0,0,0,0,2,0x0179c540007ec8450f22f28d895894c0 +41,1,0,10,2,0,1,0,0,0,0,0,2,0xa1ac184f13f907f873cae7d6ead57a03 +41,1,0,11,3,0,1,0,0,0,0,0,2,0x837747c7642953ff714bf533da08cc75 +41,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,13,5,0,1,0,0,0,0,0,2,0x18f5b0845cad4ceebd4cee23f1803d88 +41,1,0,14,6,0,1,0,0,0,0,0,2,0xa6c40f1b7d8822636a6b43d869c65e1c +41,1,0,15,7,0,1,0,0,0,0,0,2,0xfd5e3e990d4e3a41653814be85cf8575 +41,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,17,9,0,1,0,0,0,0,0,2,0x1952ee574daf30baf72bd1850423feb2 +41,1,0,18,10,0,1,0,0,0,0,0,2,0x9282b557f16428fa3f2c2a2076b4d49f +41,1,0,19,11,0,1,0,0,0,0,0,2,0xd9084b4b9ed99bed20bc67f1481c14cf +41,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,21,13,0,1,0,0,0,0,0,2,0x0f35736d73bd44c9ad8dd254833d2c16 +41,1,0,22,14,0,1,0,0,0,0,0,2,0xcc4a458185ee92d501cc07a35eb2e47d +41,1,0,23,15,0,1,0,0,0,0,0,2,0x0b306850f2984c7ddf55dd41b94dd376 +41,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +41,1,0,25,1,1,0,1,0,1,0,0,2,0x1692a5b01c729426ef64791d2e619d23 +41,1,0,26,2,1,0,1,0,1,0,0,2,0xf8aecfe3d66be15c604511cd5ffb4de9 +41,1,0,27,3,1,0,1,0,1,0,0,2,0x1aa410d3c484129711e3ed8b4a51e325 +41,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +41,1,0,29,5,1,0,1,0,1,0,0,2,0x0daaa90ab7f09c228ef04281217007ed +41,1,0,30,6,1,0,1,0,1,0,0,2,0xa94fea9bca4832499ccf2867d55deea2 +41,1,0,31,7,1,0,1,0,1,0,0,2,0xdd0adabce1eb037e5a7993cb41ce8e3d +41,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,33,1,0,1,1,0,0,0,0,2,0x0376df41b01d69bb9cb5a9c15b35f2a0 +41,1,0,34,2,0,1,1,0,0,0,0,2,0x9104e9b09da75074b6c5311a39440eb1 +41,1,0,35,3,0,1,1,0,0,0,0,2,0x8632752e2565e34c2ca9aded4a296d41 +41,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,37,5,0,1,1,0,0,0,0,2,0x1152076967ba94fbfa095cd91507965c +41,1,0,38,6,0,1,1,0,0,0,0,2,0x105cb30764bcb9e2e46d3702f76eab3a +41,1,0,39,7,0,1,1,0,0,0,0,2,0x052f0a7e30fdb666f195d7e6f05cdade +41,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,41,9,0,1,1,0,0,0,0,2,0x0d0c584b48b0fb76140268213123fb3e +41,1,0,42,10,0,1,1,0,0,0,0,2,0xdab0132cc834b641ff4e5fabf9fe1e05 +41,1,0,43,11,0,1,1,0,0,0,0,2,0x5696811aa269c7d4be09171803128777 +41,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +41,1,0,45,13,0,1,1,0,0,0,0,2,0x002de804af6b919c84a05c639ea440d1 +41,1,0,46,14,0,1,1,0,0,0,0,2,0x2ed8a37fcb67f2ca5c4491473adf1206 +41,1,0,47,15,0,1,1,0,0,0,0,2,0x941e56c91165785a4946484f976b127d +41,0,1,0,0,0,0,0,0,0,0,0,2,0 +41,0,1,1,1,0,0,0,0,0,0,0,2,0 +42,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,9,1,0,1,0,0,0,0,0,2,0x15a0e3ef8501ab612abb615711afacd6 +42,1,0,10,2,0,1,0,0,0,0,0,2,0xd5a42008b12c2dc9723bf7d5c0eb81a3 +42,1,0,11,3,0,1,0,0,0,0,0,2,0x0beebffbb5cc324c9e9c2dffc11bdf74 +42,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,13,5,0,1,0,0,0,0,0,2,0x09183fca81db288e014ec7692500eb25 +42,1,0,14,6,0,1,0,0,0,0,0,2,0x18663867031e3e011192fccc052e4dc4 +42,1,0,15,7,0,1,0,0,0,0,0,2,0x9ecd319241e5259a769eb004ffeb7e3a +42,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,17,9,0,1,0,0,0,0,0,2,0x0f665c3fee294e094bfb5c0cd015e038 +42,1,0,18,10,0,1,0,0,0,0,0,2,0xab8f1e098006fb0b2e03fed56fb17911 +42,1,0,19,11,0,1,0,0,0,0,0,2,0x386019332f8bd638f56998aebff80100 +42,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,21,13,0,1,0,0,0,0,0,2,0x0ab54e08855f7c33b8a8ffabb5861a65 +42,1,0,22,14,0,1,0,0,0,0,0,2,0xbc3f941b393a9db8a9ed80599937d8b6 +42,1,0,23,15,0,1,0,0,0,0,0,2,0x1494118945c856b1e54a36626bb2ea02 +42,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +42,1,0,25,1,1,0,1,0,1,0,0,2,0x0b9e16c9e28287ab425d1818b6fcc466 +42,1,0,26,2,1,0,1,0,1,0,0,2,0x7c1db029bb7b7f126714296228b3c0e3 +42,1,0,27,3,1,0,1,0,1,0,0,2,0xf21a396447385b377dcff88e5bd66d02 +42,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +42,1,0,29,5,1,0,1,0,1,0,0,2,0x02f9d3c4f3cf959112f1a8f5d3d2f1ae +42,1,0,30,6,1,0,1,0,1,0,0,2,0x8920d0ad3b59fe505ecb7eb29501aef1 +42,1,0,31,7,1,0,1,0,1,0,0,2,0xb19219942c07d1fbd50e38edec2ec583 +42,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,33,1,0,1,1,0,0,0,0,2,0x0be29d7ac0ca756a46891736c4e80fa4 +42,1,0,34,2,0,1,1,0,0,0,0,2,0xe42b8ebe138251e1d7e0f90aed8083f7 +42,1,0,35,3,0,1,1,0,0,0,0,2,0xc727159797f1e78206f25aa14a7af1b9 +42,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,37,5,0,1,1,0,0,0,0,2,0x16bd04e2a9cea0ebc16e47d913886353 +42,1,0,38,6,0,1,1,0,0,0,0,2,0xf46b5fbb6218d35f881aea700348658a +42,1,0,39,7,0,1,1,0,0,0,0,2,0x38490a3307856b595e9808029b274121 +42,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,41,9,0,1,1,0,0,0,0,2,0x068cd92f747b2f10dfae955c61ef5d1b +42,1,0,42,10,0,1,1,0,0,0,0,2,0xc1cc627c2639b781bae4b7f356d2d8df +42,1,0,43,11,0,1,1,0,0,0,0,2,0xd8e653bbc208dd387f1c06c30dd93699 +42,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +42,1,0,45,13,0,1,1,0,0,0,0,2,0x18140af911e7bf76fcf20e8e411cefed +42,1,0,46,14,0,1,1,0,0,0,0,2,0x01356d3929d9af3acbd5a035260dc647 +42,1,0,47,15,0,1,1,0,0,0,0,2,0x31e44b4f8c3dd7748fb1366e25f6f01d +42,0,1,0,0,0,0,0,0,0,0,0,2,0 +42,0,1,1,1,0,0,0,0,0,0,0,2,0 +43,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,9,1,0,1,0,0,0,0,0,2,0x0e8d20484ab4461fd08c58a4c3c34043 +43,1,0,10,2,0,1,0,0,0,0,0,2,0x15b459c6ba507164c293f4286d0d64dc +43,1,0,11,3,0,1,0,0,0,0,0,2,0x994ae4e153799f3f013444788128e2a1 +43,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,13,5,0,1,0,0,0,0,0,2,0x0b7d8d364d1e46f07b130f486c5774c8 +43,1,0,14,6,0,1,0,0,0,0,0,2,0xc67935550f239d8d19974364f3e9b8b1 +43,1,0,15,7,0,1,0,0,0,0,0,2,0x682dfac1a128996a7d279b47795b5fc3 +43,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,17,9,0,1,0,0,0,0,0,2,0x018c7f954c6ebfcc0cc3d626d84bec12 +43,1,0,18,10,0,1,0,0,0,0,0,2,0x48174866d0b79f93d6bb1e90709aff64 +43,1,0,19,11,0,1,0,0,0,0,0,2,0x02b178f85680669691f8eb10916ee0c2 +43,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,21,13,0,1,0,0,0,0,0,2,0x10349a604269a5ea30ad4de22ea195fa +43,1,0,22,14,0,1,0,0,0,0,0,2,0x7c135a202c9dd1334a8bfdb04ee14cf5 +43,1,0,23,15,0,1,0,0,0,0,0,2,0x3669b600c2eb9bd224478c31b13c41ee +43,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +43,1,0,25,1,1,0,1,0,1,0,0,2,0x02ebdb241ce04560bdcf4a14b86315f9 +43,1,0,26,2,1,0,1,0,1,0,0,2,0xd2ede4838d099967c370fe64a74d3775 +43,1,0,27,3,1,0,1,0,1,0,0,2,0x8d9420567d04586d216c84efe3d9b1a2 +43,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +43,1,0,29,5,1,0,1,0,1,0,0,2,0x11b6be8a861743be508c9127471313c7 +43,1,0,30,6,1,0,1,0,1,0,0,2,0x716f981fd30b0a213fbc73473b5ce817 +43,1,0,31,7,1,0,1,0,1,0,0,2,0x408fe7e407ea3ed396d753d6ab5a5673 +43,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,33,1,0,1,1,0,0,0,0,2,0x0004b5261de7ed70fd28d39a84cbe806 +43,1,0,34,2,0,1,1,0,0,0,0,2,0x9af04ca5f4636bfa66c49c2ac3f0e329 +43,1,0,35,3,0,1,1,0,0,0,0,2,0xc8f9db29157a9e1538e70d8555059883 +43,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,37,5,0,1,1,0,0,0,0,2,0x12ba404e7dfc589c50b570a121edb1af +43,1,0,38,6,0,1,1,0,0,0,0,2,0xdb6ad99fe38f7761668fd616f81b9daa +43,1,0,39,7,0,1,1,0,0,0,0,2,0xa8cd2bcac2376ede90d02dd7f9748795 +43,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,41,9,0,1,1,0,0,0,0,2,0x0dccd8be8511df82a7565b90a770cfb9 +43,1,0,42,10,0,1,1,0,0,0,0,2,0xe9fee112e0de7aa139ce11e38ef2d8e5 +43,1,0,43,11,0,1,1,0,0,0,0,2,0x5924d2f923281305083dccd5c6226d0a +43,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +43,1,0,45,13,0,1,1,0,0,0,0,2,0x1130cc183284934919c2f33678d011ff +43,1,0,46,14,0,1,1,0,0,0,0,2,0x515639433dc4e9ab385c25de47fc52f4 +43,1,0,47,15,0,1,1,0,0,0,0,2,0x9369d056addafbe1910298466d8a6f64 +43,0,1,0,0,0,0,0,0,0,0,0,2,0 +43,0,1,1,1,0,0,0,0,0,0,0,2,0 +44,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,9,1,0,1,0,0,0,0,0,2,0x11c9b30527763d650c11d92128473b8c +44,1,0,10,2,0,1,0,0,0,0,0,2,0xb930e611c3f12385f31e76624cd676d6 +44,1,0,11,3,0,1,0,0,0,0,0,2,0x04c43218c4bf4fa1a82f02d37dba4c45 +44,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,13,5,0,1,0,0,0,0,0,2,0x078e458d198b876c41452f8550e3f098 +44,1,0,14,6,0,1,0,0,0,0,0,2,0x3631ecbdaeb11d549ed870b8369d958e +44,1,0,15,7,0,1,0,0,0,0,0,2,0x92d78803e5ca080a79fb4dad245d9473 +44,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,17,9,0,1,0,0,0,0,0,2,0x0c398b61762dde0e086dc2f4b4afcaab +44,1,0,18,10,0,1,0,0,0,0,0,2,0xd662b7c719a1ffab754da98d9a7ea8de +44,1,0,19,11,0,1,0,0,0,0,0,2,0xd0207b7d6a96f9d2825b4c27d5a96ab0 +44,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,21,13,0,1,0,0,0,0,0,2,0x05d84ffad22681d1ef9cbedd38790d27 +44,1,0,22,14,0,1,0,0,0,0,0,2,0xacfb87aa563d5b697538aa6fd1bd97e8 +44,1,0,23,15,0,1,0,0,0,0,0,2,0x777092f1e5ef6e408cad2dcd89b9d22a +44,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +44,1,0,25,1,1,0,1,0,1,0,0,2,0x0020bcf3611cec0f1e058d1984539573 +44,1,0,26,2,1,0,1,0,1,0,0,2,0xd9e1605af5518358204a7a46e7a37b17 +44,1,0,27,3,1,0,1,0,1,0,0,2,0xf261a43c380720e03a5662392683aaef +44,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +44,1,0,29,5,1,0,1,0,1,0,0,2,0x10b94dc6f290c955638767511d28db85 +44,1,0,30,6,1,0,1,0,1,0,0,2,0xf283560df866c166ae13cb3b1d386bac +44,1,0,31,7,1,0,1,0,1,0,0,2,0x73c528deef8c828d55b24ebf70fb4800 +44,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,33,1,0,1,1,0,0,0,0,2,0x067772f8e5cf515c770815326058d650 +44,1,0,34,2,0,1,1,0,0,0,0,2,0x7b7c59cdbfebd71c7cabf081ca6442bd +44,1,0,35,3,0,1,1,0,0,0,0,2,0x92e2d0030d5b044adc75a2770537c635 +44,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,37,5,0,1,1,0,0,0,0,2,0x04a3e114ddcf443be5b328951508a484 +44,1,0,38,6,0,1,1,0,0,0,0,2,0x2e10d34273e06d1e0cbeea884bdfabaa +44,1,0,39,7,0,1,1,0,0,0,0,2,0x604abb9c753d577494a893a9897d4308 +44,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,41,9,0,1,1,0,0,0,0,2,0x09598aba155fbcb3e71b820750b14eda +44,1,0,42,10,0,1,1,0,0,0,0,2,0xfa9336edee9f195a6821272dee8cf119 +44,1,0,43,11,0,1,1,0,0,0,0,2,0x1cf200d45ad822e56259db315f4246c9 +44,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +44,1,0,45,13,0,1,1,0,0,0,0,2,0x00aa97ed3246c66d794ff9aced3e7750 +44,1,0,46,14,0,1,1,0,0,0,0,2,0x31438b8b2b0f555e6ff27e1412b5c5f7 +44,1,0,47,15,0,1,1,0,0,0,0,2,0xf59f8fdca67fe7dde7bcb312b6587666 +44,0,1,0,0,0,0,0,0,0,0,0,2,0 +44,0,1,1,1,0,0,0,0,0,0,0,2,0 +45,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,9,1,0,1,0,0,0,0,0,2,0x198397bf034477b49e8a670707acddea +45,1,0,10,2,0,1,0,0,0,0,0,2,0xcd2323e5f469aa418adb73e1119e9733 +45,1,0,11,3,0,1,0,0,0,0,0,2,0xe0f13ea3d432c084e629fdc8337cc31b +45,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,13,5,0,1,0,0,0,0,0,2,0x176032d7b8c596b2fc887cd395904084 +45,1,0,14,6,0,1,0,0,0,0,0,2,0xcaebd045f2daa4dbab32273083b89062 +45,1,0,15,7,0,1,0,0,0,0,0,2,0x66622fb982ca012a05fc51912a8c4de6 +45,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,17,9,0,1,0,0,0,0,0,2,0x11d5b9ec1a793c89e5e20d19421b714e +45,1,0,18,10,0,1,0,0,0,0,0,2,0x1b6cb4c8feb5472a700864362bdd5615 +45,1,0,19,11,0,1,0,0,0,0,0,2,0x62830e0333f9a11e11f0829773266b84 +45,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,21,13,0,1,0,0,0,0,0,2,0x16ffea08a16f89d5979a77e632d035a3 +45,1,0,22,14,0,1,0,0,0,0,0,2,0xbadcc4dd0a47eb2f0a0099511fde66cd +45,1,0,23,15,0,1,0,0,0,0,0,2,0x93c16fe7e3f86757019d6aeb4c9208e7 +45,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +45,1,0,25,1,1,0,1,0,1,0,0,2,0x15e5ec1a11ca0f85e9ad953b2074fba6 +45,1,0,26,2,1,0,1,0,1,0,0,2,0x08dfbd70dbecfa7358620d6f63deb020 +45,1,0,27,3,1,0,1,0,1,0,0,2,0xdd81f7b17d9f199f63bf6986be3e54e4 +45,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +45,1,0,29,5,1,0,1,0,1,0,0,2,0x128dc046f0106a41f5adb1c5e33ddb79 +45,1,0,30,6,1,0,1,0,1,0,0,2,0xfb4e272501b2242f856e373d210e56d2 +45,1,0,31,7,1,0,1,0,1,0,0,2,0x4d9f6e990704f610d29b78781166ffd7 +45,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,33,1,0,1,1,0,0,0,0,2,0x09637730ff16bfcc248ef0b1554ac205 +45,1,0,34,2,0,1,1,0,0,0,0,2,0x450fcbbf5975877dbc99aa0866dd3240 +45,1,0,35,3,0,1,1,0,0,0,0,2,0x25bdc9c05aef432a27b2a6c3ca67f742 +45,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,37,5,0,1,1,0,0,0,0,2,0x0a140e8184c7eceb9654a057c4d4f487 +45,1,0,38,6,0,1,1,0,0,0,0,2,0x6aba92a5d4e340fe582895c8054196a5 +45,1,0,39,7,0,1,1,0,0,0,0,2,0xf70cb6b204ef28d6eafd8252e49ebd0c +45,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,41,9,0,1,1,0,0,0,0,2,0x13d302eb573db08fed11c8c8f306c343 +45,1,0,42,10,0,1,1,0,0,0,0,2,0x2aadd0549ee9a52df77bdd64cf43669f +45,1,0,43,11,0,1,1,0,0,0,0,2,0x4925352e4b095c712897e2745175bc4b +45,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +45,1,0,45,13,0,1,1,0,0,0,0,2,0x165ce9937aab67c927d898b8359f20ff +45,1,0,46,14,0,1,1,0,0,0,0,2,0xfcc604b5eb075478550b349b07eaae7c +45,1,0,47,15,0,1,1,0,0,0,0,2,0xaea3075439567e80c47255c14050748d +45,0,1,0,0,0,0,0,0,0,0,0,2,0 +45,0,1,1,1,0,0,0,0,0,0,0,2,0 +46,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,8,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,9,1,0,1,0,0,0,0,0,2,0x070a4310b0a7a8235c4dc54e2535b3b7 +46,1,0,10,2,0,1,0,0,0,0,0,2,0xf76dccc248062325d8b2ee432532a79b +46,1,0,11,3,0,1,0,0,0,0,0,2,0xc8007c743ce100c844bfd1cca76ca02d +46,1,0,12,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,13,5,0,1,0,0,0,0,0,2,0x16578cee6339692c09611c92f06b1c1b +46,1,0,14,6,0,1,0,0,0,0,0,2,0x3df0d73783092eb0d11e2192274a5838 +46,1,0,15,7,0,1,0,0,0,0,0,2,0xe80969627a49d90b99c580950803fdb0 +46,1,0,16,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,17,9,0,1,0,0,0,0,0,2,0x0740aee72d1fb2d2368e23b4386c7ce2 +46,1,0,18,10,0,1,0,0,0,0,0,2,0x6723f87115f9f8b77c1885d3c2a4bdf7 +46,1,0,19,11,0,1,0,0,0,0,0,2,0x84cf4f08ea4b180550462f5f2b03ad9c +46,1,0,20,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,21,13,0,1,0,0,0,0,0,2,0x09949359be69091b7017bdb5f9fca5d4 +46,1,0,22,14,0,1,0,0,0,0,0,2,0xf208da94575a83f2fcae632668101309 +46,1,0,23,15,0,1,0,0,0,0,0,2,0x1855f5639e6b33779dee637efceebce8 +46,1,0,24,0,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +46,1,0,25,1,1,0,1,0,1,0,0,2,0x042c6678f88f1cced0c4154a5c99b70a +46,1,0,26,2,1,0,1,0,1,0,0,2,0x7754cb5f223eeb55b6dc6a33c645909c +46,1,0,27,3,1,0,1,0,1,0,0,2,0x6a0d055cbd864afa3a74e2b285fe3378 +46,1,0,28,4,1,0,1,0,1,0,0,2,0x00000000000000000000000000000000 +46,1,0,29,5,1,0,1,0,1,0,0,2,0x0781af8933543f3c36b8eeca45f3ff00 +46,1,0,30,6,1,0,1,0,1,0,0,2,0x1c138445c6e73e9edf7a1f0568bb5d05 +46,1,0,31,7,1,0,1,0,1,0,0,2,0x0063af060b3c6918f86e5662bfaaae83 +46,1,0,32,0,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,33,1,0,1,1,0,0,0,0,2,0x0697f5502321ee11a12f4f86993751c1 +46,1,0,34,2,0,1,1,0,0,0,0,2,0x1a3561c3ed3f31f14bff5ffa53250308 +46,1,0,35,3,0,1,1,0,0,0,0,2,0xc15fc2b10c94a11f0baa457e69c22cb2 +46,1,0,36,4,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,37,5,0,1,1,0,0,0,0,2,0x1563a78da54420640e8926a080c617f9 +46,1,0,38,6,0,1,1,0,0,0,0,2,0x6e9069264a66869cf363a8a3c75eddbb +46,1,0,39,7,0,1,1,0,0,0,0,2,0x7637387c52ea2bf0c92cdfb10df1553f +46,1,0,40,8,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,41,9,0,1,1,0,0,0,0,2,0x10457c1dd35555d6743a290757efc4aa +46,1,0,42,10,0,1,1,0,0,0,0,2,0x6548e4f757c1c8a67e484e7ef1e38421 +46,1,0,43,11,0,1,1,0,0,0,0,2,0x7965a6f6077947db5195327b2311a306 +46,1,0,44,12,0,1,1,0,0,0,0,2,0x00000000000000000000000000000000 +46,1,0,45,13,0,1,1,0,0,0,0,2,0x155d3753ffafd662ad8db818c13ab30e +46,1,0,46,14,0,1,1,0,0,0,0,2,0xc7e0382a342626698dbfdec86ba17293 +46,1,0,47,15,0,1,1,0,0,0,0,2,0x833f4a1273bad1122f1a97e239ffe6f7 +46,0,1,0,0,0,0,0,0,0,0,0,2,0 +46,0,1,1,1,0,0,0,0,0,0,0,2,0 +47,1,0,0,0,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,1,1,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,2,2,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,3,3,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,4,4,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,5,5,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,6,6,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,7,7,1,0,0,0,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,8,0,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +47,1,0,9,1,0,1,0,0,0,1,1,2,0x19c488e1d2f5c9e6e2fb2923d9424453 +47,1,0,10,2,0,1,0,0,0,1,1,2,0x19310a9a3958e0dff6c5ddbe5ca20cdc +47,1,0,11,3,0,1,0,0,0,1,1,2,0xb8a22da86b35740cf2c4c19cd2c3fb2f +47,1,0,12,4,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +47,1,0,13,5,0,1,0,0,0,1,1,2,0x1254c3c1f45eabbcd55ab515615b7fab +47,1,0,14,6,0,1,0,0,0,1,1,2,0x9044b3206872f6b1d40849a9c1eaae9b +47,1,0,15,7,0,1,0,0,0,1,1,2,0xcacb3c21f7ca3500c06b971feaa66539 +47,1,0,16,8,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +47,1,0,17,9,0,1,0,0,0,1,1,2,0x048cae3b181e9d2c9c9a232f12105482 +47,1,0,18,10,0,1,0,0,0,1,1,2,0x4045de993789be315b2ef9df849eff00 +47,1,0,19,11,0,1,0,0,0,1,1,2,0x7c6cbf0a1b46b32acc52d28e61060a07 +47,1,0,20,12,0,1,0,0,0,1,1,2,0x00000000000000000000000000000000 +47,1,0,21,13,0,1,0,0,0,1,1,2,0x16127a2823382f9b149064cfc75e9d46 +47,1,0,22,14,0,1,0,0,0,1,1,2,0x60a8d1584ec49cbdb8ddd53b46d10480 +47,1,0,23,15,0,1,0,0,0,1,1,2,0x507277db2a23b8d39db2f6fe9f8855eb +47,1,0,24,0,1,0,1,1,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,25,1,1,0,1,1,0,0,1,2,0x00b70190564c29c20d59ae5c916328df +47,1,0,26,2,1,0,1,1,0,0,1,2,0x9cf110d7015e1cae056c7b73f69a5a31 +47,1,0,27,3,1,0,1,1,0,0,1,2,0x004d85d86570fa196cbc2b4b90ca80b4 +47,1,0,28,4,1,0,1,1,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,29,5,1,0,1,1,0,0,1,2,0x089c9c9258af4d68054e839d10488a01 +47,1,0,30,6,1,0,1,1,0,0,1,2,0x6c7f140e92f62d49dc4795a2bfbe7bc4 +47,1,0,31,7,1,0,1,1,0,0,1,2,0xcd0707af52bc1a9f09e2a52f83a13eb2 +47,1,0,32,0,0,1,1,1,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,33,1,0,1,1,1,0,0,1,2,0x0672eb1ac16b3daf590a56046518e5a9 +47,1,0,34,2,0,1,1,1,0,0,1,2,0xfa24ebd63ce041e80365866036530054 +47,1,0,35,3,0,1,1,1,0,0,1,2,0xc7af72b89a6f6c9a6b3fc7a32020885f +47,1,0,36,4,0,1,1,1,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,37,5,0,1,1,1,0,0,1,2,0x0c0c3420779145be28a214d544cde50f +47,1,0,38,6,0,1,1,1,0,0,1,2,0xbbf1d7c0651910ca7700b2f32c8ac9df +47,1,0,39,7,0,1,1,1,0,0,1,2,0xdc5a50e6f4e0d84864274fbcc2c3f6a5 +47,1,0,40,8,0,1,1,1,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,41,9,0,1,1,1,0,0,1,2,0x12883aaf387a45bf48b3ed3867952d78 +47,1,0,42,10,0,1,1,1,0,0,1,2,0x374649d27a169a55139c0f7428082cbe +47,1,0,43,11,0,1,1,1,0,0,1,2,0x4cd68ee36cd230dcad30345c2cc689f3 +47,1,0,44,12,0,1,1,1,0,0,1,2,0x00000000000000000000000000000000 +47,1,0,45,13,0,1,1,1,0,0,1,2,0x0616c04f228402c16828b663b9db1d16 +47,1,0,46,14,0,1,1,1,0,0,1,2,0xdd6fa467eec98907bdadc42ce86e6dbe +47,1,0,47,15,0,1,1,1,0,0,1,2,0x19243ad9a22fb731df345471f93bf1bf +47,0,1,0,0,0,0,0,1,0,0,1,2,0 +47,0,1,1,1,0,0,0,1,0,0,1,2,0 +48,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,8,0,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +48,1,0,9,1,0,1,0,0,0,1,0,2,0x149c2412305107eab1426db5fb45a466 +48,1,0,10,2,0,1,0,0,0,1,0,2,0xa9ff4892d57a7d9b77b21a79292714f2 +48,1,0,11,3,0,1,0,0,0,1,0,2,0x1c0d4614661aa0d76290d8a565be8f1c +48,1,0,12,4,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +48,1,0,13,5,0,1,0,0,0,1,0,2,0x0693bb9f7b6db34fd738c16f2c923ec0 +48,1,0,14,6,0,1,0,0,0,1,0,2,0xe6dc6627d03a66e5ab6301c3fe1c645d +48,1,0,15,7,0,1,0,0,0,1,0,2,0x8a8a5e1e6ff3016ed3f8421a6ada867e +48,1,0,16,8,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +48,1,0,17,9,0,1,0,0,0,1,0,2,0x0aa594d61a63ca80301712bc432f7d08 +48,1,0,18,10,0,1,0,0,0,1,0,2,0x0e8d4347660ceaecc90a63cd4e096e45 +48,1,0,19,11,0,1,0,0,0,1,0,2,0x4dab36fff552a5311e29d7517ce003f7 +48,1,0,20,12,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +48,1,0,21,13,0,1,0,0,0,1,0,2,0x0d92cfb2c25db4e76d27a2b797e9e29c +48,1,0,22,14,0,1,0,0,0,1,0,2,0x654ecfde8546368a9233aebe7ac302e5 +48,1,0,23,15,0,1,0,0,0,1,0,2,0xfaf531944c86df928de06a7fd7edbaa9 +48,1,0,24,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,25,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,26,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,27,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,28,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,29,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,30,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,31,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,32,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,33,1,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,34,2,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,35,3,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,36,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,37,5,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,38,6,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,39,7,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,40,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,41,9,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,42,10,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,43,11,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,44,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,45,13,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,46,14,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,1,0,47,15,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +48,0,1,0,0,0,0,0,0,0,0,0,2,0 +48,0,1,1,1,0,0,0,0,0,0,0,2,0 +49,1,0,0,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,1,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,2,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,3,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,4,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,5,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,6,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,7,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,8,0,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +49,1,0,9,1,0,1,0,0,0,1,0,2,0x12922654b5e867c507add882c7667358 +49,1,0,10,2,0,1,0,0,0,1,0,2,0x5fc19bcea61d645ebd067a61b34adce7 +49,1,0,11,3,0,1,0,0,0,1,0,2,0x7adab31dc1efa065cfbd8ad598f2629e +49,1,0,12,4,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +49,1,0,13,5,0,1,0,0,0,1,0,2,0x0aafab13aa22d67b69a87db02b0acdd9 +49,1,0,14,6,0,1,0,0,0,1,0,2,0x88fde3df0fb0187fa21f1da53a11bd60 +49,1,0,15,7,0,1,0,0,0,1,0,2,0x425155b82ba6928e917fa9da565b8a48 +49,1,0,16,8,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +49,1,0,17,9,0,1,0,0,0,1,0,2,0x186aaecabbfd5d2d7630d7b4f5bff704 +49,1,0,18,10,0,1,0,0,0,1,0,2,0x80cc5dbd24a26004fdce030e896a4a32 +49,1,0,19,11,0,1,0,0,0,1,0,2,0x3ca3e38885fe824ff0bb2280f39a3366 +49,1,0,20,12,0,1,0,0,0,1,0,2,0x00000000000000000000000000000000 +49,1,0,21,13,0,1,0,0,0,1,0,2,0x18bd0dc697cf3972b13269c4733099db +49,1,0,22,14,0,1,0,0,0,1,0,2,0x39dec4fb23fe829580ec4fd2710a338a +49,1,0,23,15,0,1,0,0,0,1,0,2,0x92b202db960a135434f47f47f97ed6aa +49,1,0,24,0,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,25,1,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,26,2,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,27,3,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,28,4,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,29,5,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,30,6,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,31,7,1,0,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,32,0,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,33,1,0,1,0,0,0,0,0,2,0x102aa69b86fe8224dbdbaa21ad0187fa +49,1,0,34,2,0,1,0,0,0,0,0,2,0xc1d84d5c493d28dda2bcab08f62c394a +49,1,0,35,3,0,1,0,0,0,0,0,2,0x2657a13cd92483234b072ca4ab771fc5 +49,1,0,36,4,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,37,5,0,1,0,0,0,0,0,2,0x133bb23ae2e1e8b0f4de08312bd76eb9 +49,1,0,38,6,0,1,0,0,0,0,0,2,0xfd519628fd10e674183631a07c54799b +49,1,0,39,7,0,1,0,0,0,0,0,2,0x15f8f6e11cc93506657afe6c0a74b1dc +49,1,0,40,8,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,41,9,0,1,0,0,0,0,0,2,0x093c898a7e36d667e010ec73fb5dde98 +49,1,0,42,10,0,1,0,0,0,0,0,2,0x8994d6c61cf032599f203c25905b3ef7 +49,1,0,43,11,0,1,0,0,0,0,0,2,0x799cd22d72de16c655343d4af8a62849 +49,1,0,44,12,0,1,0,0,0,0,0,2,0x00000000000000000000000000000000 +49,1,0,45,13,0,1,0,0,0,0,0,2,0x0c48126a59b93eff404b306cf784b6a9 +49,1,0,46,14,0,1,0,0,0,0,0,2,0xf7b75598d14987d76ebe932782f98a5d +49,1,0,47,15,0,1,0,0,0,0,0,2,0xf00bcb6dd166e70afefefc7e6fd2b9ac +49,0,1,0,0,0,0,0,0,0,0,0,2,0 +49,0,1,1,1,0,0,0,0,0,0,0,2,0 diff --git a/prover/zkevm/prover/bls/testdata/bls_pointeval_inputs-0.csv b/prover/zkevm/prover/bls/testdata/bls_pointeval_inputs-0.csv new file mode 100644 index 0000000000..d213068e2e --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/bls_pointeval_inputs-0.csv @@ -0,0 +1,801 @@ +ID,DATA_POINT_EVALUATION,RSLT_POINT_EVALUATION,INDEX,CT,IS_FIRST_INPUT,IS_SECOND_INPUT,CIRCUIT_SELECTOR_POINT_EVALUATION,CIRCUIT_SELECTOR_POINT_EVALUATION_FAILURE,LIMB +0,1,0,0,0,1,0,1,0,0x01ebafe97d6875d272c58da0fbaa7433 +0,1,0,1,1,1,0,1,0,0x0eaa8200f9649082458cbf049685affc +0,1,0,2,2,1,0,1,0,0x0857db27096f332a654b08efcd4ccfdb +0,1,0,3,3,1,0,1,0,0x853c4a60089cb88c8b7f95254711a952 +0,1,0,4,4,1,0,1,0,0x31f395beb92f53a72bee1367784382df +0,1,0,5,5,1,0,1,0,0xac1f73db6fa0b98538367d9804b0d795 +0,1,0,6,6,1,0,1,0,0x932e3821e04f9224aae3f677423be5a1 +0,1,0,7,7,1,0,1,0,0x9a35bdb45eb6cd2fdccd2465cdc95a7c +0,1,0,8,8,1,0,1,0,0xe9ec6767d5c78e43be3fb1dd94bbeb87 +0,1,0,9,9,1,0,1,0,0x9619c6c8596d69ba217141178476c8e2 +0,1,0,10,10,1,0,1,0,0x94cb512d126fcd29e049a1739f0f775a +0,1,0,11,11,1,0,1,0,0x3a9c45d9764901af8c621401bee516dd +0,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +0,0,1,1,1,0,0,1,0,0x00000000000000000000000000001000 +0,0,1,2,2,0,0,1,0,0x73eda753299d7d483339d80809a1d805 +0,0,1,3,3,0,0,1,0,0x53bda402fffe5bfeffffffff00000001 +1,1,0,0,0,1,0,0,1,0x018294e0800761732078c88146d80fa9 +1,1,0,1,1,1,0,0,1,0x00ab871bd97d365d652671ad5d853fa9 +1,1,0,2,2,1,0,0,1,0x73a2a1e1f69921023df0c7e8da62fbb0 +1,1,0,3,3,1,0,0,1,0x9e23be016e25473f580bcf1b79b5699e +1,1,0,4,4,1,0,0,1,0x3e9e824a540bade09fe43b70d167bacc +1,1,0,5,5,1,0,0,1,0xbea91efb50776f8a30777c5f97f3ee33 +1,1,0,6,6,1,0,0,1,0x94e02c05350147d3de3e52a0ac791680 +1,1,0,7,7,1,0,0,1,0xab8c8cebf89d9e96b22cf3189be9b4d5 +1,1,0,8,8,1,0,0,1,0xce8c15043dfaf1feba91ee0029cbc5f8 +1,1,0,9,9,1,0,0,1,0x96f068ecb21124575c426d3426924a48 +1,1,0,10,10,1,0,0,1,0xd7137cdc88e72ebd3b2b37179d70cb5f +1,1,0,11,11,1,0,0,1,0xb9b81ec2f6193278f9cae642784f0b0a +1,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +1,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +1,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +1,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +2,1,0,0,0,1,0,1,0,0x01b22e6dd0f04aab817bfccbfbe453aa +2,1,0,1,1,1,0,1,0,0x783044186436a7c53c88fb2692867025 +2,1,0,2,2,1,0,1,0,0x53e2832d165d0960c0e0db8188afbd71 +2,1,0,3,3,1,0,1,0,0x7e72a6c3f4d5fef9f7cac7b3da1ba30e +2,1,0,4,4,1,0,1,0,0x008ce8910544fbce5658f254e51dbf18 +2,1,0,5,5,1,0,1,0,0xb11311bcfefc82a71e38aa48e77718e2 +2,1,0,6,6,1,0,1,0,0x926e49ed0f3429c406646cd474ee9902 +2,1,0,7,7,1,0,1,0,0x3f3b1ab4517ae7122570efa3fc6acb5a +2,1,0,8,8,1,0,1,0,0xf0db7bef832d77fa27e594f01160166e +2,1,0,9,9,1,0,1,0,0xb7ba4696e6e790da79ac8ed0045aeebc +2,1,0,10,10,1,0,1,0,0x6567a16966da40cfbf771c247b120c57 +2,1,0,11,11,1,0,1,0,0xa2b53be91568cb897e57f414fd96e54a +2,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +2,0,1,1,1,0,0,1,0,0x00000000000000000000000000001000 +2,0,1,2,2,0,0,1,0,0x73eda753299d7d483339d80809a1d805 +2,0,1,3,3,0,0,1,0,0x53bda402fffe5bfeffffffff00000001 +3,1,0,0,0,1,0,0,1,0x015c6e0b05b3f98fe06052a7dafc9679 +3,1,0,1,1,1,0,0,1,0xf665ed956a92e5ddc1de5e05e0b2076d +3,1,0,2,2,1,0,0,1,0x68dd9edb33ce3fd43e20f3923d250e17 +3,1,0,3,3,1,0,0,1,0xc288a937cc54ee1540703afde981d070 +3,1,0,4,4,1,0,0,1,0x2db1422261465e27badc3a014892ee20 +3,1,0,5,5,1,0,0,1,0x8b52580ad3723541911abc5ab3162527 +3,1,0,6,6,1,0,0,1,0x8a8ef00bbd3539d3d5dfee7c62be406b +3,1,0,7,7,1,0,0,1,0x1d9cb463674399c4b4b13a12064fdb89 +3,1,0,8,8,1,0,0,1,0xb46ec1cb9772b37469e80b4ad9f6726c +3,1,0,9,9,1,0,0,1,0xa40fae51fba1daf252f014bdc684fd6c +3,1,0,10,10,1,0,0,1,0x5cc97a2eaea12229204040d403f9bbdf +3,1,0,11,11,1,0,0,1,0xd48eb68f091b360136e73f2b92768f02 +3,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +3,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +3,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +3,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +4,1,0,0,0,1,0,1,0,0x01f04c0766de350715eb827c6d974938 +4,1,0,1,1,1,0,1,0,0x8b5aaabe1b8037f80144e7551dc5fb88 +4,1,0,2,2,1,0,1,0,0x370fdc485c840f5286adaba8f51544bb +4,1,0,3,3,1,0,1,0,0xd1800500c37d15011d89bcb7506f92df +4,1,0,4,4,1,0,1,0,0x605d3429876a128303ebbdef6d31481a +4,1,0,5,5,1,0,1,0,0xc771855e4460f6aa62bc1da047af19c6 +4,1,0,6,6,1,0,1,0,0x8756cedc07c1cd0a9e2f7cf40388f00c +4,1,0,7,7,1,0,1,0,0xcd31d02639df6dbcabc9bf632ac0dd89 +4,1,0,8,8,1,0,1,0,0xcdf20983f0c1f974a6c7c929426a9699 +4,1,0,9,9,1,0,1,0,0x8d99ff087e6e5d18ac747714071b5ace +4,1,0,10,10,1,0,1,0,0x730f25725aa484f71afbfa14a748bbac +4,1,0,11,11,1,0,1,0,0x6bb1198579af29668c6251d39390782d +4,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +4,0,1,1,1,0,0,1,0,0x00000000000000000000000000001000 +4,0,1,2,2,0,0,1,0,0x73eda753299d7d483339d80809a1d805 +4,0,1,3,3,0,0,1,0,0x53bda402fffe5bfeffffffff00000001 +5,1,0,0,0,1,0,0,1,0x0163e78166153944e197d770674cdfdb +5,1,0,1,1,1,0,0,1,0x905e94051240ddf060eac60c24d4ab55 +5,1,0,2,2,1,0,0,1,0x6992243d284d989da69445f7e2979ead +5,1,0,3,3,1,0,0,1,0xf01a3ad3f5b1a515c4ce4bdf94137d2a +5,1,0,4,4,1,0,0,1,0x3a9da09703240e89afd0e425f9a47204 +5,1,0,5,5,1,0,0,1,0x61ff9b308be39910f1e559903e78e8f8 +5,1,0,6,6,1,0,0,1,0x87cf8e71d8b6cb9bcf141166d6322eba +5,1,0,7,7,1,0,0,1,0xfbca3253e1ea0be3fecd72de71cec0e2 +5,1,0,8,8,1,0,0,1,0x5efeb279d10202c0de3a7ef370a9038d +5,1,0,9,9,1,0,0,1,0x98071e24ce19e02574496fe38ecae0a2 +5,1,0,10,10,1,0,0,1,0xa26777f32b68037cb1746c5b46dd1d8c +5,1,0,11,11,1,0,0,1,0x99429287d426038a6ef8a371edaf1cd2 +5,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +5,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +5,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +5,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +6,1,0,0,0,1,0,0,1,0x01d6ad5b4bff35ffb070de92b1341a08 +6,1,0,1,1,1,0,0,1,0x56286182e96b9fe1c42b712f987b2e37 +6,1,0,2,2,1,0,0,1,0x1f71b749c6d3a983b9bd354fc7a6dbfb +6,1,0,3,3,1,0,0,1,0xed2b5a193b961169036f5d762a72651e +6,1,0,4,4,1,0,0,1,0x2d76a4721c6bd7115bfa3f15bea5c4fa +6,1,0,5,5,1,0,0,1,0x504ba848b9608690b01ae6b37aeb9cad +6,1,0,6,6,1,0,0,1,0x919e30ddda0041176b21c1058fcfa66a +6,1,0,7,7,1,0,0,1,0x47660416367a662e4e6de4df4e2dca2b +6,1,0,8,8,1,0,0,1,0x8b81982532433c70a2908eb683299fbb +6,1,0,9,9,1,0,0,1,0xaa9fb4b71c371940963db17c85b439e0 +6,1,0,10,10,1,0,0,1,0x72274083feda15c6a05b86ea8a41f9bb +6,1,0,11,11,1,0,0,1,0xd2fa8456d202aa9618090be3de0236de +6,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +6,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +6,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +6,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +7,1,0,0,0,1,0,0,1,0x0129b823ffba461370bd4be6b447ae56 +7,1,0,1,1,1,0,0,1,0x7db5d52229bcf9f6bffa1ca56ed21d38 +7,1,0,2,2,1,0,0,1,0x33d80483569a93b51ad2a28e7e995cb2 +7,1,0,3,3,1,0,0,1,0x89498857001f627f062cf553cdedc95c +7,1,0,4,4,1,0,0,1,0x20c043819325de3af50591653ec24c96 +7,1,0,5,5,1,0,0,1,0x573c63ff87435dcc21055fca6978ee8e +7,1,0,6,6,1,0,0,1,0x9129ffccdf990c0eb03e56fc7bd78385 +7,1,0,7,7,1,0,0,1,0x5865284f7b4d96449da19b0612338b4f +7,1,0,8,8,1,0,0,1,0x8114f6097aa7985e233c310abad46fbf +7,1,0,9,9,1,0,0,1,0xb18688f8810b241a037960ccdf989db2 +7,1,0,10,10,1,0,0,1,0x21036fe69896d6d5dd86f4837b522778 +7,1,0,11,11,1,0,0,1,0xe34b5a83a388a528ec6768b630902566 +7,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +7,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +7,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +7,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +8,1,0,0,0,1,0,0,1,0x01788dd1391000f8f3f73d0411af11eb +8,1,0,1,1,1,0,0,1,0x3001fbf43d69df9494da430d9b150c09 +8,1,0,2,2,1,0,0,1,0x659c4a06336808994184219fc478a181 +8,1,0,3,3,1,0,0,1,0x32f71ef903e00b9b8e69b1ce48351cf3 +8,1,0,4,4,1,0,0,1,0x2336283e3a01abf0f58f844eeca6f256 +8,1,0,5,5,1,0,0,1,0x356ddf3e420610a890e07bc0a93c423e +8,1,0,6,6,1,0,0,1,0x90720de5cb90a42acf4a74172275df6e +8,1,0,7,7,1,0,0,1,0xb5257d76dee527e3bcd14180913d9a5c +8,1,0,8,8,1,0,0,1,0x70525ed7f6ea6677ce06fdaa17288297 +8,1,0,9,9,1,0,0,1,0x93f0cafaba7c9001c1eeb97ec0f434ef +8,1,0,10,10,1,0,0,1,0x1e0ae55604d3de8f2edd400ad34590f2 +8,1,0,11,11,1,0,0,1,0x057fd3d0532217c793546f2155ef8e27 +8,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +8,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +8,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +8,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +9,1,0,0,0,1,0,0,1,0x016495a5616b40f0bf1887cecea43393 +9,1,0,1,1,1,0,0,1,0xe0c2568407fdd5b56be33bb9b2aa3811 +9,1,0,2,2,1,0,0,1,0x6b6eea084e0e2283cd5db22a42edd7c5 +9,1,0,3,3,1,0,0,1,0x14893da9775ed1f396235c3a0bcca2fe +9,1,0,4,4,1,0,0,1,0x604eb47aeec974b7575cb16f56c06a0b +9,1,0,5,5,1,0,0,1,0x9f417099224a74f40a1e24256ec5165f +9,1,0,6,6,1,0,0,1,0x86402b8188ed7cd64ccffa9b2c86f426 +9,1,0,7,7,1,0,0,1,0xa17d97443773bfb06b55775d9b52a399 +9,1,0,8,8,1,0,0,1,0x237cb4fe87fe201f82e1975e48ac2994 +9,1,0,9,9,1,0,0,1,0x9754d56949b359cb6f0652129c9777c0 +9,1,0,10,10,1,0,0,1,0x7a35cbf9d422fd2ca0b1c14fa5429818 +9,1,0,11,11,1,0,0,1,0xaddaa136000028812c5797e7b8e25144 +9,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +9,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +9,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +9,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +10,1,0,0,0,1,0,0,1,0x014995159873f69033edc791e4ec53fb +10,1,0,1,1,1,0,0,1,0x67ff010952bd9b4a147186c875723fbe +10,1,0,2,2,1,0,0,1,0x34421a30b894dd2eb854b3755d424df2 +10,1,0,3,3,1,0,0,1,0xd6345fc95ea3e62be1fbae98dd909199 +10,1,0,4,4,1,0,0,1,0x048b688fcdc1c98acd2bd91880d7a09d +10,1,0,5,5,1,0,0,1,0xdae03ea2cbbab7c6dc2f9743e9955868 +10,1,0,6,6,1,0,0,1,0x8c12777fa2c0c0ab1ea2fb58f1a0f4af +10,1,0,7,7,1,0,0,1,0xec9cd80702d9c7167b7e2189509607b2 +10,1,0,8,8,1,0,0,1,0xa147d4ed8fc9bf169509bdf9bcb7cc20 +10,1,0,9,9,1,0,0,1,0xcf7bde7d4a31868a5b505e96c78fc39a +10,1,0,10,10,1,0,0,1,0xbc47f31bdcf06b589fa385dffd810ec9 +10,1,0,11,11,1,0,0,1,0x470d70523b8d4404a7e0598717d07d7d +10,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +10,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +10,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +10,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +11,1,0,0,0,1,0,0,1,0x015c378661b375d0170cb180ec2ec438 +11,1,0,1,1,1,0,0,1,0x7030d226f0c665a43913a870324b2a50 +11,1,0,2,2,1,0,0,1,0x0c4e769457708ae04292d62d202cb2f8 +11,1,0,3,3,1,0,0,1,0x3413291610e35ab68e029e513d72116c +11,1,0,4,4,1,0,0,1,0x43d8b0cbc28c4ba47db2828a3f9a9576 +11,1,0,5,5,1,0,0,1,0xd70af01ea30602ce3dfdcb610ba2afd4 +11,1,0,6,6,1,0,0,1,0x95fc17d8e1f790b4f5b5199a1538d6c0 +11,1,0,7,7,1,0,0,1,0x4fa8511c17c4ecf8060505e839be769d +11,1,0,8,8,1,0,0,1,0x4aa0f61977cc6d937843fe55bdc57a11 +11,1,0,9,9,1,0,0,1,0xd5a6b73a986513bee8aca72ae28f3ca3 +11,1,0,10,10,1,0,0,1,0x87eecf591ff3b83a52a53da19c6a2bbd +11,1,0,11,11,1,0,0,1,0x8c524bd1954ea4ef03f0dd0cde43adab +11,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +11,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +11,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +11,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +12,1,0,0,0,1,0,0,1,0x0182daf59da19835aba0b534d93d1270 +12,1,0,1,1,1,0,0,1,0xfdb2d6e027676d23838eb11b5711d4fa +12,1,0,2,2,1,0,0,1,0x6d1b5d1babb7462f79b84ec5c7e25bbd +12,1,0,3,3,1,0,0,1,0x0c52090dcf4aca284521886d716fc4ad +12,1,0,4,4,1,0,0,1,0x683d7984e52dcce4ef0800e46e1ddcdd +12,1,0,5,5,1,0,0,1,0x0ce39c66d892eec1fa0297efeecef888 +12,1,0,6,6,1,0,0,1,0x98fee14da8dc391ad1ae1962ff6c48e2 +12,1,0,7,7,1,0,0,1,0x81317c64f6a0665bf85e42f685df63fc +12,1,0,8,8,1,0,0,1,0x6965dd61d5339ac36f9f9127cd5b9560 +12,1,0,9,9,1,0,0,1,0x80000000000000000000000000000000 +12,1,0,10,10,1,0,0,1,0x00000000000000000000000000000000 +12,1,0,11,11,1,0,0,1,0x00000000000000000000000000000000 +12,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +12,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +12,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +12,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +13,1,0,0,0,1,0,0,1,0x01368808f78a021502c62527c60f2dc9 +13,1,0,1,1,1,0,0,1,0xbe1721765514e14ec654cef652fc9bc7 +13,1,0,2,2,1,0,0,1,0x5279e2e3235870285790fc09d94746d7 +13,1,0,3,3,1,0,0,1,0x47a4c104136df8cc18a5f09d48ea298c +13,1,0,4,4,1,0,0,1,0x2d304c67cd36f7ef8321057e4188154f +13,1,0,5,5,1,0,0,1,0x3b5704e694cb22eea6b4a454da33823c +13,1,0,6,6,1,0,0,1,0x8c81630b34580b0e097ad8d2691d3b1a +13,1,0,7,7,1,0,0,1,0xaeefd57363af031ec780180c538a29f8 +13,1,0,8,8,1,0,0,1,0x756374dde4abb64214d84819ba4744e9 +13,1,0,9,9,1,0,0,1,0x80000000000000000000000000000000 +13,1,0,10,10,1,0,0,1,0x00000000000000000000000000000000 +13,1,0,11,11,1,0,0,1,0x00000000000000000000000000000000 +13,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +13,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +13,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +13,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +14,1,0,0,0,1,0,0,1,0x01033c203383be1fae680d1ce71c5b6a +14,1,0,1,1,1,0,0,1,0xa4b909583f08d284b847c2ad57faf3d0 +14,1,0,2,2,1,0,0,1,0x5e738dc6f53f48b438a8c1a53dc58f20 +14,1,0,3,3,1,0,0,1,0x73184724c04af330eb7620a48f0d2fc3 +14,1,0,4,4,1,0,0,1,0x01f4c1b6f9e10370294a3c7add8af208 +14,1,0,5,5,1,0,0,1,0xe5138dbc7ec3024b41e2ff7da8622a9a +14,1,0,6,6,1,0,0,1,0x88ef90f43956906946efd1f646f06bb1 +14,1,0,7,7,1,0,0,1,0x96c2c8faef608bfedefa5d22f111edc3 +14,1,0,8,8,1,0,0,1,0xdf812ef89efe4514ac121128f9c204ec +14,1,0,9,9,1,0,0,1,0xa0000000000000000000000000000000 +14,1,0,10,10,1,0,0,1,0x00000000000000000000000000000000 +14,1,0,11,11,1,0,0,1,0x00000000000000000000000000000000 +14,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +14,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +14,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +14,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +15,1,0,0,0,1,0,0,1,0x011b84d10b61878c465a4cb24195f876 +15,1,0,1,1,1,0,0,1,0x4f37610eb6a50ec93e477e47f86db262 +15,1,0,2,2,1,0,0,1,0x5ee626d83d55d30e2a837e09eeb4ee2f +15,1,0,3,3,1,0,0,1,0x7517155aec6cabb1a38532f3f7368dfd +15,1,0,4,4,1,0,0,1,0x3e341de2e6149c5cfe5dd5bbde81295d +15,1,0,5,5,1,0,0,1,0x75e772d7460161a44068420817ccbccb +15,1,0,6,6,1,0,0,1,0x835bde9df8533b65664e2ad3175b8b9b +15,1,0,7,7,1,0,0,1,0xf42c5b59602a7b154dbe7b53e29d2a90 +15,1,0,8,8,1,0,0,1,0x5ba43057c07d326592d634c83c3dfbd9 +15,1,0,9,9,1,0,0,1,0xa0000000000000000000000000000000 +15,1,0,10,10,1,0,0,1,0x00000000000000000000000000000000 +15,1,0,11,11,1,0,0,1,0x00000000000000000000000000000000 +15,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +15,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +15,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +15,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +16,1,0,0,0,1,0,0,1,0x017128f6acfa9d0252a5474612da1a5f +16,1,0,1,1,1,0,0,1,0x167a795f52fb87441f298ad62a88ec0b +16,1,0,2,2,1,0,0,1,0x09db3f5bc5f86efbff67471986764910 +16,1,0,3,3,1,0,0,1,0x81f954d1b7e1625601bee28f7a0f6507 +16,1,0,4,4,1,0,0,1,0x6c526b8c369cf2409120d16965c1543f +16,1,0,5,5,1,0,0,1,0x35dbf8e6879f017cfdec9c46cb223c0e +16,1,0,6,6,1,0,0,1,0x8386deb868f1efff6cc6c9df81e07110 +16,1,0,7,7,1,0,0,1,0x5e192b62af0a366e575f1b3a8fefaf5b +16,1,0,8,8,1,0,0,1,0xe6f7cc2775faf4c425110566d1897eea +16,1,0,9,9,1,0,0,1,0xb1c06d9842500ca5caaa331b74dac300 +16,1,0,10,10,1,0,0,1,0x17dc917872550e79ea7584c2c736cd9a +16,1,0,11,11,1,0,0,1,0xd9827a2b2c7efa00b52668d1a4695750 +16,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +16,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +16,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +16,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +17,1,0,0,0,1,0,0,1,0x010fab8ffd21de8aa05f1ef53eddc656 +17,1,0,1,1,1,0,0,1,0xdc2068166a5ee8ef6e95a83dc45176ed +17,1,0,2,2,1,0,0,1,0x0d2bf08f202643d5b930f3c833b5b3bf +17,1,0,3,3,1,0,0,1,0x8f7fc21d45f2b79cddf072ec248fec7b +17,1,0,4,4,1,0,0,1,0x61b5a724cfee23c39521865d9c286290 +17,1,0,5,5,1,0,0,1,0x2dc619ea1e50fc4acf90a3c15f8796b1 +17,1,0,6,6,1,0,0,1,0x82897f62c65b99761c2debd42b5f781d +17,1,0,7,7,1,0,0,1,0xea05d8d75ec93cb884db46d65396ac0a +17,1,0,8,8,1,0,0,1,0x8c5522d654d125cf4dcbdf760cb94ec2 +17,1,0,9,9,1,0,0,1,0xabbafd44fcc2f446b304e06bcf1b1fc2 +17,1,0,10,10,1,0,0,1,0xd441e58c32d35974ea43a6a8d0c763cb +17,1,0,11,11,1,0,0,1,0xa1e44735f6b1a43914bc354546a618fc +17,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +17,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +17,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +17,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +18,1,0,0,0,1,0,0,1,0x01e82d0a3191e084918c8767efdd9aa5 +18,1,0,1,1,1,0,0,1,0x7b27f1aa1cc7acb294fc1ea9c6ad09a0 +18,1,0,2,2,1,0,0,1,0x29232297d5d75df9f26481bca171dde7 +18,1,0,3,3,1,0,0,1,0xbc2b327a5f15b61605ce6bf8d7583fe1 +18,1,0,4,4,1,0,0,1,0x190c56c25ac0feb7fe51cb1208d36014 +18,1,0,5,5,1,0,0,1,0x6dd8962cb07dc61a80d1c59b6ae0f5ef +18,1,0,6,6,1,0,0,1,0x90b289346eac948887b2d2723c527ada +18,1,0,7,7,1,0,0,1,0xc277d61c05b26473e30ba6074785f391 +18,1,0,8,8,1,0,0,1,0xed72efd768109caccebe74d8167aaf51 +18,1,0,9,9,1,0,0,1,0xb5ebb94e806d0d87c618a26d224d96e3 +18,1,0,10,10,1,0,0,1,0x1439f1f8abeb75b1a8bfd61036144a1c +18,1,0,11,11,1,0,0,1,0xf388e7e81b5522334f95447c892c1008 +18,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +18,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +18,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +18,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +19,1,0,0,0,1,0,0,1,0x018970cf2dc6770b51709385d9ba2fe3 +19,1,0,1,1,1,0,0,1,0xd0ef15f8ac7c46b77bf1da34e7bd2c0c +19,1,0,2,2,1,0,0,1,0x728fae7ccea3ff21d8cb644bb1a81c90 +19,1,0,3,3,1,0,0,1,0x7c469e3d45fed006416d3f26624788b5 +19,1,0,4,4,1,0,0,1,0x0774b6135908723a4afa8a0c61985a8b +19,1,0,5,5,1,0,0,1,0x021ac673f2744b9a3f558cdb6b19579e +19,1,0,6,6,1,0,0,1,0x88338483b50e1698a9c8913c95a40450 +19,1,0,7,7,1,0,0,1,0x7be77a560038e3b338cc15bed1890369 +19,1,0,8,8,1,0,0,1,0x92653c5f83d0ed75d8966459f57ad7b6 +19,1,0,9,9,1,0,0,1,0x83970b863c05058219460d5d6ad0f9ce +19,1,0,10,10,1,0,0,1,0xb77c71df7f2cf869fa4de3c564ac379b +19,1,0,11,11,1,0,0,1,0x08b6167a9c37d6754bc657ba4d3faf18 +19,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +19,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +19,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +19,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +20,1,0,0,0,1,0,0,1,0x018cff8e5c887d6ca71a4978b671f717 +20,1,0,1,1,1,0,0,1,0xe0082a00cbceef3a35abf822d319e643 +20,1,0,2,2,1,0,0,1,0x28698617b3ed41dd92c23a5d44aecbdc +20,1,0,3,3,1,0,0,1,0xa31d48389cdcdd5f4c0b2bb5d3c46009 +20,1,0,4,4,1,0,0,1,0x45d08b2d55540c5a1ce1aedef207dd04 +20,1,0,5,5,1,0,0,1,0x9664c751875b4a82426240ab02c2383a +20,1,0,6,6,1,0,0,1,0x82f3b171ca6171b36b113ebb9d4ccde9 +20,1,0,7,7,1,0,0,1,0xfc3ac0840450c848e50d76964b868ac2 +20,1,0,8,8,1,0,0,1,0x6896f3734de3eeb74a591dd66b4f12ba +20,1,0,9,9,1,0,0,1,0x0e27be3f5fb7fc81fe45b2a02a9b3cc5 +20,1,0,10,10,1,0,0,1,0x8ae0fe79611b40f22fbc1dac550892d1 +20,1,0,11,11,1,0,0,1,0x24395f3ae1f88badcec338675a81a3c1 +20,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +20,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +20,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +20,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +21,1,0,0,0,1,0,0,1,0x0192f9875e2f3d2f02e672b125d827ad +21,1,0,1,1,1,0,0,1,0x1665678918569cf70f91eeb2143c0c74 +21,1,0,2,2,1,0,0,1,0x44685f1c0b3935ba73a647de0e5c1e37 +21,1,0,3,3,1,0,0,1,0xed197b50f3f0531e988e4533e754052d +21,1,0,4,4,1,0,0,1,0x23cc43e1acf211ade1ef1f3f098510d5 +21,1,0,5,5,1,0,0,1,0x85870e062b64d5e8b5ac1ecba77d95ac +21,1,0,6,6,1,0,0,1,0x8f57ed907a536a1818873805450cfa63 +21,1,0,7,7,1,0,0,1,0xce1853c2114142a447ceb9aa3bcf0a22 +21,1,0,8,8,1,0,0,1,0x6aa44b049e347ac414d5e6d291b29a0b +21,1,0,9,9,1,0,0,1,0x1495b69970dbb10d1aac644caeb8488c +21,1,0,10,10,1,0,0,1,0x1f31886575a44946c63f3b90df3252c8 +21,1,0,11,11,1,0,0,1,0x692e5eb947a002bc75b0fbd178c705fb +21,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +21,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +21,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +21,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +22,1,0,0,0,1,0,0,1,0x01555516d41c559eaec555cd71acf0e3 +22,1,0,1,1,1,0,0,1,0x9c2680a52b303fdca0e4534e366d6ad3 +22,1,0,2,2,1,0,0,1,0x5379c3f2d14d197ce4998beba95eadbe +22,1,0,3,3,1,0,0,1,0x8c07f241e1f962c1288d94b0896ff755 +22,1,0,4,4,1,0,0,1,0x0f034be4825e4d1dc253b3003ecf096d +22,1,0,5,5,1,0,0,1,0xe77f6b03ade2ee2e2f5c5f8dd0bfdda8 +22,1,0,6,6,1,0,0,1,0x88a49d3abc71d0703eaf149618d6654d +22,1,0,7,7,1,0,0,1,0x1dd124a178a7f9433ae5361ffe083b18 +22,1,0,8,8,1,0,0,1,0x438f5d24b23ea2060973a3e9ef7185b5 +22,1,0,9,9,1,0,0,1,0x411917bed63aa5eb225bee67e92ce5c8 +22,1,0,10,10,1,0,0,1,0x215d83110fe02d9ea0dc31170316a7fb +22,1,0,11,11,1,0,0,1,0x1b926ec386fe9e096e62454b8e3af019 +22,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +22,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +22,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +22,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +23,1,0,0,0,1,0,0,1,0x01e855cdc91c78c5b0ddb72242c174c2 +23,1,0,1,1,1,0,0,1,0xbe11244737277be4968fe3a732de3ea3 +23,1,0,2,2,1,0,0,1,0x6478bb4dcab98cf91ba737b770dd9578 +23,1,0,3,3,1,0,0,1,0x35482509a0a4a6c7a716ff53de233aeb +23,1,0,4,4,1,0,0,1,0x2b6c476af357874a043cb0542a2136c8 +23,1,0,5,5,1,0,0,1,0x6ebd3d84cf25aafe93bd94756c30718b +23,1,0,6,6,1,0,0,1,0x84536ea855a955c1e736309aa5dd4b86 +23,1,0,7,7,1,0,0,1,0x24c49c39e4f143324ca852f09558f3a4 +23,1,0,8,8,1,0,0,1,0xf9bdd7323b8df98582d1a719dc78984a +23,1,0,9,9,1,0,0,1,0x479f8549e80bab5d5caa42a65603dc28 +23,1,0,10,10,1,0,0,1,0x203c44d7c2d09c3ef050942c0ae33287 +23,1,0,11,11,1,0,0,1,0xa6913e30924b513d63ee9c3e51133ba9 +23,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +23,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +23,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +23,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +24,1,0,0,0,1,0,0,1,0x0111cd51390a2adec0fdb849c57767ae +24,1,0,1,1,1,0,0,1,0xdb0aca9ea974006347df49fca1598fa8 +24,1,0,2,2,1,0,0,1,0x6820cd8f5e97d1ed9edef6f6e5bf21d1 +24,1,0,3,3,1,0,0,1,0x287d94415dc5c7129d665de391d20061 +24,1,0,4,4,1,0,0,1,0x4c944b4bc5729b738213327e764c30f7 +24,1,0,5,5,1,0,0,1,0xfb1c942de843c2cfb5c557f811ee58b5 +24,1,0,6,6,1,0,0,1,0x9418a6e78ad1a9d3c09bef1d67a3a338 +24,1,0,7,7,1,0,0,1,0xe779293f224ae41e7f1d7ce04c83500d +24,1,0,8,8,1,0,0,1,0xc043c099d7379dfc3aed831de7c8586e +24,1,0,9,9,1,0,0,1,0x364259051bcb45a29ac93623795d083c +24,1,0,10,10,1,0,0,1,0x0b88581c41e4b1515c9a90cc3bdbbf7b +24,1,0,11,11,1,0,0,1,0xf21c311e2c0fad388168276a9990e596 +24,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +24,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +24,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +24,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +25,1,0,0,0,1,0,0,1,0x01e20ddc7d31e2a7f2b0f591a0b5af83 +25,1,0,1,1,1,0,0,1,0x78f1311218368789eb4860950f75f261 +25,1,0,2,2,1,0,0,1,0x60fea853aa5d6f33d464ba61092306fd +25,1,0,3,3,1,0,0,1,0x10d1ec43005d3c8ed8cbf4c43c38f678 +25,1,0,4,4,1,0,0,1,0x4c6cb8690300f52980bf9351d3e8c22e +25,1,0,5,5,1,0,0,1,0x37532a74ebd2c1fb8c15c21531a43f37 +25,1,0,6,6,1,0,0,1,0x994331e6350764463241736bf8210f39 +25,1,0,7,7,1,0,0,1,0x7cef489ffd493a8c57277580eb6334de +25,1,0,8,8,1,0,0,1,0x60d80ec38865a7f647422c513caa6379 +25,1,0,9,9,1,0,0,1,0x260e1894d3c75688c15f4e9d1cc602d5 +25,1,0,10,10,1,0,0,1,0x8fccd6cb37466ea0255e3a7fcd8aa648 +25,1,0,11,11,1,0,0,1,0x157663cd116db726353c18b41260ff50 +25,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +25,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +25,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +25,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +26,1,0,0,0,1,0,0,1,0x01204446d31a7ff3c0f8d7f95d3f9c4c +26,1,0,1,1,1,0,0,1,0x928d70f1cea1737518be616365753ff1 +26,1,0,2,2,1,0,0,1,0x6f70e28bd5a7dc29e185b505b022bf15 +26,1,0,3,3,1,0,0,1,0x50051a30ba69e4781bdd22165c223fe7 +26,1,0,4,4,1,0,0,1,0x5b95a76ec3469137869bd9dd33d7c874 +26,1,0,5,5,1,0,0,1,0x3330e54ec7d160733b90ad9edc1db679 +26,1,0,6,6,1,0,0,1,0x8ff4cd64dedd0dc7e9beae26516eb1c1 +26,1,0,7,7,1,0,0,1,0x7762d79f8f23f1d6d3fc03a4adc14014 +26,1,0,8,8,1,0,0,1,0xd0cb05e71e12ec1d5e32dfb34bf7d0fa +26,1,0,9,9,1,0,0,1,0x73e239631dfe6d38139e18788614dd48 +26,1,0,10,10,1,0,0,1,0x4686cccfa63f6fbf004046b8e335452e +26,1,0,11,11,1,0,0,1,0x59c7ac01ff9277f6b7f1271d95f6e809 +26,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +26,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +26,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +26,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +27,1,0,0,0,1,0,0,1,0x0177a759b543e1d4b591b735de6c0744 +27,1,0,1,1,1,0,0,1,0x0e7b38b9eadc0ad09ea2c714019b769d +27,1,0,2,2,1,0,0,1,0x18d491072b6f022c9845ac0014ea224f +27,1,0,3,3,1,0,0,1,0x86cd25c9e8729147f1d0bbcf118b93c6 +27,1,0,4,4,1,0,0,1,0x16463cab38eb9a026f0fd376a84a9703 +27,1,0,5,5,1,0,0,1,0x30d55f8818642bc68b71a2ff34679817 +27,1,0,6,6,1,0,0,1,0x93aed295c6fbb5e131d74f4d4a21b06b +27,1,0,7,7,1,0,0,1,0x550526333939879d695efb7f749122ad +27,1,0,8,8,1,0,0,1,0x483bd960a6aeccb9a7c0818ddac26581 +27,1,0,9,9,1,0,0,1,0x6ebab14f867f81caaf5e323b286f9701 +27,1,0,10,10,1,0,0,1,0xf3b5225f7900ee76d8f037e6581cc1b1 +27,1,0,11,11,1,0,0,1,0x2ef714a165f70f59376132445b3c4344 +27,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +27,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +27,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +27,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +28,1,0,0,0,1,0,0,1,0x01962bc3be7a178b61ac86f2b7791fdf +28,1,0,1,1,1,0,0,1,0xf9efece54f2f055233787e961fb27452 +28,1,0,2,2,1,0,0,1,0x3c3cdeacd7b19a64523509a3f6d4af95 +28,1,0,3,3,1,0,0,1,0xeecb5c8f9a3bf10ad91db18bdf76bdb8 +28,1,0,4,4,1,0,0,1,0x0cc4484982cd5c0554ce5af97adf53ed +28,1,0,5,5,1,0,0,1,0x8398c948ef7770bbacb631ba85f5f6f1 +28,1,0,6,6,1,0,0,1,0x81d148e3ce09f74535ec50e2add53078 +28,1,0,7,7,1,0,0,1,0x5bda8b750f5d0be00c3247a16aba5db6 +28,1,0,8,8,1,0,0,1,0x3f0706c4a14b966dccedc574716b752d +28,1,0,9,9,1,0,0,1,0xeaedf3bf65df12060b6a620bcc400903 +28,1,0,10,10,1,0,0,1,0xf90cd5545c3e6741187d3e88fd376add +28,1,0,11,11,1,0,0,1,0xe60950dbff1c73bbb2a0720a7b418144 +28,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +28,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +28,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +28,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +29,1,0,0,0,1,0,0,1,0x01c4840083deb5dea6935e0a3a459946 +29,1,0,1,1,1,0,0,1,0xdc2cf27af3c6d93323135d0a4dd9ac7e +29,1,0,2,2,1,0,0,1,0x516ce73b020958dbe306126f08f71aaf +29,1,0,3,3,1,0,0,1,0x404e90d9067370f8245920b4256cc8ed +29,1,0,4,4,1,0,0,1,0x19f5a2eaec6d4979b980dc3e1395e176 +29,1,0,5,5,1,0,0,1,0x843d8f2a6fe99f9bb12af41f6487b7b7 +29,1,0,6,6,1,0,0,1,0x835111f2f9ceba9d0ba8b12e89e642ce +29,1,0,7,7,1,0,0,1,0x11fd65ce021d9282b78b4a24e7282ba7 +29,1,0,8,8,1,0,0,1,0x13649fdeaa25438a78042c98f1ff764b +29,1,0,9,9,1,0,0,1,0xec66edd9b44275c16881d0a9840449a8 +29,1,0,10,10,1,0,0,1,0x455426ad4d238782e36789be520596bb +29,1,0,11,11,1,0,0,1,0x1a4a24e668307f7847ca13179aa344da +29,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +29,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +29,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +29,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +30,1,0,0,0,1,0,1,0,0x01d46ed1dbe6efb3dab7bb9e4e082704 +30,1,0,1,1,1,0,1,0,0xb0bc2b8f61dc0e0e00f77553d7d54ce1 +30,1,0,2,2,1,0,1,0,0x2ef834f305862e33b6c9414ec132a823 +30,1,0,3,3,1,0,1,0,0x66a8f0dcd6f25efc65cb2b052a6102e5 +30,1,0,4,4,1,0,1,0,0x1eaf94b5477a14dbeef5193151ab378c +30,1,0,5,5,1,0,1,0,0x8a62da486bb479aa244330aab4756f59 +30,1,0,6,6,1,0,1,0,0xb352d02f9fbaebaf8c5f7bbd9abfc316 +30,1,0,7,7,1,0,1,0,0x2c648a49c565564494c3f7f054740a2a +30,1,0,8,8,1,0,1,0,0x235671defa501f8a78b4b19a83c85b1d +30,1,0,9,9,1,0,1,0,0x8d412c01c750f609298709de90e40538 +30,1,0,10,10,1,0,1,0,0xd8d8d6fff285bb500e92049e02a991ac +30,1,0,11,11,1,0,1,0,0xa2747a59d5324e625705bf4d8e86943d +30,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +30,0,1,1,1,0,0,1,0,0x00000000000000000000000000001000 +30,0,1,2,2,0,0,1,0,0x73eda753299d7d483339d80809a1d805 +30,0,1,3,3,0,0,1,0,0x53bda402fffe5bfeffffffff00000001 +31,1,0,0,0,1,0,0,1,0x01238db4e4ed4b15fbcab93cd95107a2 +31,1,0,1,1,1,0,0,1,0xadb7222dcce4f10d548b163b827a13f8 +31,1,0,2,2,1,0,0,1,0x3d4d75c614a8d469b692d1721bd381c3 +31,1,0,3,3,1,0,0,1,0x4ffded9b70afa3554c17353647a39221 +31,1,0,4,4,1,0,0,1,0x0fc311811c22b987b3fc9d0eb684b64e +31,1,0,5,5,1,0,0,1,0xa690e4d8fea9c692a6a9c06950dfdf41 +31,1,0,6,6,1,0,0,1,0xa08a0dfc4006b6dc1df4879666467766 +31,1,0,7,7,1,0,0,1,0x6b87ecf9fc1da8e3ee35bda52810d25b +31,1,0,8,8,1,0,0,1,0x26a0cbf9f3dd15ac7a804a06ccabe171 +31,1,0,9,9,1,0,0,1,0x96b66a8d6d4413ca0348c452516a084e +31,1,0,10,10,1,0,0,1,0x5d77d3b3441cec4895892662313cf653 +31,1,0,11,11,1,0,0,1,0xdabc5d9af5d7684064ec3c53aef6cb73 +31,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +31,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +31,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +31,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +32,1,0,0,0,1,0,1,0,0x018a1c6dfb1b9154c8ce680afef9aa56 +32,1,0,1,1,1,0,1,0,0x1ed09603049dd5e35ed381f142ad5001 +32,1,0,2,2,1,0,1,0,0x5d2ec1398898b4655acdb2374739b4da +32,1,0,3,3,1,0,1,0,0x48865c5e52354ba5de7ddbfc8f297558 +32,1,0,4,4,1,0,1,0,0x06c03106fc44c21c1f647ba35a622d6a +32,1,0,5,5,1,0,1,0,0x38d28d5da95708fee4b3f270ccc9fe93 +32,1,0,6,6,1,0,1,0,0xb79fdbacac303e1179c22352c24094c4 +32,1,0,7,7,1,0,1,0,0xd7e532d5228b597f17a2d5bc4d4afc97 +32,1,0,8,8,1,0,1,0,0x7275314ba52c7faa12250a0d185f0b2f +32,1,0,9,9,1,0,1,0,0xb044739af01cb255a3569f9f7275192c +32,1,0,10,10,1,0,1,0,0x4653b6ca2e2edf163041eebf97cf1c36 +32,1,0,11,11,1,0,1,0,0x30e33aec14231dcd9d59210da0122334 +32,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +32,0,1,1,1,0,0,1,0,0x00000000000000000000000000001000 +32,0,1,2,2,0,0,1,0,0x73eda753299d7d483339d80809a1d805 +32,0,1,3,3,0,0,1,0,0x53bda402fffe5bfeffffffff00000001 +33,1,0,0,0,1,0,0,1,0x01483966205b8a40e7e27c2e68e127c9 +33,1,0,1,1,1,0,0,1,0xb4ccc22187aabf55bae3f3091aca8a5f +33,1,0,2,2,1,0,0,1,0x2796ce248c9d2cf7367e7b18ec254f2e +33,1,0,3,3,1,0,0,1,0x5852178996e24a87bb9187dd359dd98f +33,1,0,4,4,1,0,0,1,0x5f5d890da14f360e4e627c43c9d03d34 +33,1,0,5,5,1,0,0,1,0x201e42b58d7784d637edc47b5b51dd86 +33,1,0,6,6,1,0,0,1,0xaaa566f787372c1137d5af2d438338bc +33,1,0,7,7,1,0,0,1,0x8109575081bb97679c096c648d86bfcd +33,1,0,8,8,1,0,0,1,0x63910a5d5dc74d19bf3a64896642dcc3 +33,1,0,9,9,1,0,0,1,0xa1918fbd130cfb324cc734c0dc2c5b62 +33,1,0,10,10,1,0,0,1,0xa2391aba6d942f8e817fd4ff4962a75e +33,1,0,11,11,1,0,0,1,0x190c2c32f523ed1a3be142b7ba5371c0 +33,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +33,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +33,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +33,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +34,1,0,0,0,1,0,1,0,0x01283ef099172a38b5f1f0850e9e1b99 +34,1,0,1,1,1,0,1,0,0xb75af50d27f44e16f37f75a2f8b475e8 +34,1,0,2,2,1,0,1,0,0x174ea96edc8623a6298fc11e3abbf0ad +34,1,0,3,3,1,0,1,0,0x93d760e290f6eb302e18710982ea63c0 +34,1,0,4,4,1,0,1,0,0x175b752a251a34325717eaea6a0b7ee8 +34,1,0,5,5,1,0,1,0,0x326a28a38cc9cfdbec1ad32d1d438d02 +34,1,0,6,6,1,0,1,0,0xa106e8156a2b6a9ca1aa9d83793b8416 +34,1,0,7,7,1,0,1,0,0x5157c55f2099bf4c3147b1e5c3f4b444 +34,1,0,8,8,1,0,1,0,0xd752f18f99fe80a11f2e74bfcb5a15ea +34,1,0,9,9,1,0,1,0,0x96e4cfe1429b3abe0faa167df6f7d3f8 +34,1,0,10,10,1,0,1,0,0x028269b6f198cc400a85dd5d9d677313 +34,1,0,11,11,1,0,1,0,0x38b15b8276d611fedd8ef0bb572ad811 +34,0,1,0,0,0,0,1,0,0x00000000000000000000000000000000 +34,0,1,1,1,0,0,1,0,0x00000000000000000000000000001000 +34,0,1,2,2,0,0,1,0,0x73eda753299d7d483339d80809a1d805 +34,0,1,3,3,0,0,1,0,0x53bda402fffe5bfeffffffff00000001 +35,1,0,0,0,1,0,0,1,0x016eabe1b904232c31f9ef309bfab897 +35,1,0,1,1,1,0,0,1,0x6890e4a13f225357723a19bf0f2aa076 +35,1,0,2,2,1,0,0,1,0x16b016dc071c00d5b9610e3d9e61989b +35,1,0,3,3,1,0,0,1,0x8d2e080521f2a89fa60cb7311fdb2a76 +35,1,0,4,4,1,0,0,1,0x6486746a7ee4690f129d8ce12eb7fd27 +35,1,0,5,5,1,0,0,1,0x3be7640efb26f8014c8b4e40a25e8644 +35,1,0,6,6,1,0,0,1,0xa5befe5a02ff1308cc32906892da6d55 +35,1,0,7,7,1,0,0,1,0x935e0dcc6e68fe6c5675cea6b5dc7be0 +35,1,0,8,8,1,0,0,1,0xef263f51f2549077add6ec7b5ad44cc4 +35,1,0,9,9,1,0,0,1,0x845479d168d13848fa2c3f2ef7b17d83 +35,1,0,10,10,1,0,0,1,0xd7c75047060377f122a125c9543b6913 +35,1,0,11,11,1,0,0,1,0xe51a8f6e38f562b6ead28049fbc1475e +35,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +35,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +35,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +35,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +36,1,0,0,0,1,0,0,1,0x01b7a6f3b3abefe21bd93b08729478b8 +36,1,0,1,1,1,0,0,1,0xd0f9d39ab769b2e77e568ab7c5d3be9a +36,1,0,2,2,1,0,0,1,0x43b2da0e5522b5a212e92932edd7d11d +36,1,0,3,3,1,0,0,1,0xea90e4d52cd6acb43475b62196c1c7e5 +36,1,0,4,4,1,0,0,1,0x35edb1853b6c36c953db96b4170195db +36,1,0,5,5,1,0,0,1,0x7bfd68ab97c3fcd258f7add14d325d29 +36,1,0,6,6,1,0,0,1,0xb1863888e0784ad3057da4aa9ae6d1e4 +36,1,0,7,7,1,0,0,1,0x850921f7a37526c84072fa73d71fd1fc +36,1,0,8,8,1,0,0,1,0x5fa014bfa0140617a6ec9e96ce824216 +36,1,0,9,9,1,0,0,1,0xaeb88923ef0872751c1e5166c8c938b8 +36,1,0,10,10,1,0,0,1,0x804ddc1ecefc853035af68fa311214ce +36,1,0,11,11,1,0,0,1,0xdef1e89baceb85d1b373dcbe76f49126 +36,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +36,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +36,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +36,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +37,1,0,0,0,1,0,0,1,0x0194846ee2571780c9bb482e7072ad00 +37,1,0,1,1,1,0,0,1,0x52f6c97851ccbe69797f5927f5b090e1 +37,1,0,2,2,1,0,0,1,0x503e2fba8adc6952bc71b553e66c3365 +37,1,0,3,3,1,0,0,1,0x086f4148f0262121bc3ec6857e78d191 +37,1,0,4,4,1,0,0,1,0x4fd62689002d89e47b48ae647daa6941 +37,1,0,5,5,1,0,0,1,0x794a0574fd0152fd78c9276090c5d4f2 +37,1,0,6,6,1,0,0,1,0xb81c36fcd3a8bf8927c1467ffdf251bb +37,1,0,7,7,1,0,0,1,0x1e95b32464fee3f55457a079c048df2c +37,1,0,8,8,1,0,0,1,0xb00a0a238730024ef314cd2b4ac72899 +37,1,0,9,9,1,0,0,1,0xa4233deaa5be87e1689b0f79a32b6ae6 +37,1,0,10,10,1,0,0,1,0x253840c0f8a83d127891a18456bd2c7c +37,1,0,11,11,1,0,0,1,0xc6bf8fc579bbcded2f9dda755ead6649 +37,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +37,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +37,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +37,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +38,1,0,0,0,1,0,0,1,0x01b936d0be150cd5c891d7e1445d0141 +38,1,0,1,1,1,0,0,1,0xeeb70b6b67a18f1657f1c41331f55c0d +38,1,0,2,2,1,0,0,1,0x578a7eab4d95d1599858835d2516c1ef +38,1,0,3,3,1,0,0,1,0x5f326be642e199270050cad442147031 +38,1,0,4,4,1,0,0,1,0x0487938d442b3fbe770f94f52ea3dba8 +38,1,0,5,5,1,0,0,1,0xd65a8ef6d0236e500f030879007f53d2 +38,1,0,6,6,1,0,0,1,0xa296bb61a5a5850cf903a7490c9d50fd +38,1,0,7,7,1,0,0,1,0xf6d6e79bc51e0ff2cca7cefdabfdf590 +38,1,0,8,8,1,0,0,1,0xd48120ec9379c4a1621bb6dfccb361ea +38,1,0,9,9,1,0,0,1,0x8f0634eef906ef1aae96df536916e12f +38,1,0,10,10,1,0,0,1,0x1d3befcff2dc60e4847d413309eb5c8d +38,1,0,11,11,1,0,0,1,0x6d3f470e2fc4d12d7a82ace3d03acd5b +38,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +38,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +38,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +38,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +39,1,0,0,0,1,0,0,1,0x0189d600898aaad330196bb4eab24d90 +39,1,0,1,1,1,0,0,1,0x85c71ed8fadb67c319071022f2483ea8 +39,1,0,2,2,1,0,0,1,0x2e0da5947d50ca0c28c3cc36db9210b8 +39,1,0,3,3,1,0,0,1,0x67f4f49ea9a643ea175b3e658aa7da52 +39,1,0,4,4,1,0,0,1,0x360ed6210b5147446b0c0d6abf950e6b +39,1,0,5,5,1,0,0,1,0xfe69ff23ac033324da476e6480b5fb55 +39,1,0,6,6,1,0,0,1,0xb2044d39dc8bce44140163df24dbf53e +39,1,0,7,7,1,0,0,1,0x6aadf165eee84e2bf8a8eb2f812604e2 +39,1,0,8,8,1,0,0,1,0xbbd5bd20a39c912d668da364a80dd284 +39,1,0,9,9,1,0,0,1,0x85f5475cb2811dc1db7b3448a588461d +39,1,0,10,10,1,0,0,1,0x6480d31f93076c43118ffb2c7f0b3194 +39,1,0,11,11,1,0,0,1,0x46fd3e7f450fac59f692f7eacf49eb01 +39,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +39,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +39,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +39,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +40,1,0,0,0,1,0,0,1,0x0194d81423869b8976d41215ea06e30e +40,1,0,1,1,1,0,0,1,0x86426ef9a0bd382a67d4deb8c9287caf +40,1,0,2,2,1,0,0,1,0x5cb3c3ef6889a74a39872f865a41ab71 +40,1,0,3,3,1,0,0,1,0x6d01981f484334c74f69c13328db809f +40,1,0,4,4,1,0,0,1,0x605d8ed56ed88b973fce964c65e45d7e +40,1,0,5,5,1,0,0,1,0x1717d2302b66f97d849dbc5f1c2c8b1c +40,1,0,6,6,1,0,0,1,0xac77be9d7eca3898c6da2cf09d05f9f7 +40,1,0,7,7,1,0,0,1,0x9d44b702f7b0beadcbb1f44081981293 +40,1,0,8,8,1,0,0,1,0x05e2c043f4fc0acea6868849a0cd2a85 +40,1,0,9,9,1,0,0,1,0xc9a78473f9e61810d8f912de81a25d20 +40,1,0,10,10,1,0,0,1,0x97be3375dfdd23fada996bb58df94801 +40,1,0,11,11,1,0,0,1,0xce5952d35d8bd85a2b91e78eaf7602ba +40,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +40,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +40,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +40,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +41,1,0,0,0,1,0,0,1,0x01903afee68b733f89f3e3ede0dbcc24 +41,1,0,1,1,1,0,0,1,0xab90a2229709e118453b0fa653867b32 +41,1,0,2,2,1,0,0,1,0x427fa8f82162c8fddf6b6b2830b9e2db +41,1,0,3,3,1,0,0,1,0xcaab0604002cb4cdd57e32a2cec47fd4 +41,1,0,4,4,1,0,0,1,0x0b1bcb0a8a3aeceba2cc23acd4702d1c +41,1,0,5,5,1,0,0,1,0x0c3f87830912d88fa8db31064d390515 +41,1,0,6,6,1,0,0,1,0xa34266788c807f120efd61d10eac1eca +41,1,0,7,7,1,0,0,1,0xf54ca9bc38fe6aed034618244ff89e7a +41,1,0,8,8,1,0,0,1,0x36496596782658291b0db60a5e734745 +41,1,0,9,9,1,0,0,1,0xd936ea44eb6c4b3592ccf5df4fd2bfab +41,1,0,10,10,1,0,0,1,0xfd1ab2b8992f562722c4b3ee5e578b99 +41,1,0,11,11,1,0,0,1,0x7b13a53e60be609c579fa4328afeb786 +41,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +41,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +41,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +41,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +42,1,0,0,0,1,0,0,1,0x016dc214711b38bb1c1657200dd9ad7c +42,1,0,1,1,1,0,0,1,0x2a9e5c359978e033476fddce66b7f922 +42,1,0,2,2,1,0,0,1,0x57aa09d5526d8f1e7fedd1276dc1e22c +42,1,0,3,3,1,0,0,1,0x4b6dd409b6d300c2b843fe413d2501a1 +42,1,0,4,4,1,0,0,1,0x4f095875d8d47b3449d901c4f537eff3 +42,1,0,5,5,1,0,0,1,0x20f84e076c90a3925b19e2370824f994 +42,1,0,6,6,1,0,0,1,0xb7d98ed096640c5ee160ac30dca132bd +42,1,0,7,7,1,0,0,1,0x96ebaa83a6ae402c988af202681e3cd2 +42,1,0,8,8,1,0,0,1,0x79d2cefdce407af739ef7adfd4a66d9d +42,1,0,9,9,1,0,0,1,0x80000000000000000000000000000000 +42,1,0,10,10,1,0,0,1,0x00000000000000000000000000000000 +42,1,0,11,11,1,0,0,1,0x00000000000000000000000000000000 +42,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +42,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +42,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +42,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +43,1,0,0,0,1,0,0,1,0x01898bfaaeb4c50962ea78c6f58bf695 +43,1,0,1,1,1,0,0,1,0xbeb006cbe4c5a2158bdfb739b10bddf7 +43,1,0,2,2,1,0,0,1,0x2a18fd2a62e26310f0425fd4cfe167e7 +43,1,0,3,3,1,0,0,1,0x1ea648dfd5e2a08b4988e1d01572b6b3 +43,1,0,4,4,1,0,0,1,0x60627607cc6e9dbf20b7d89d273c48a0 +43,1,0,5,5,1,0,0,1,0x2769a570efa86e11fb8847922934b512 +43,1,0,6,6,1,0,0,1,0xacfe908cacce262746741642676a476a +43,1,0,7,7,1,0,0,1,0x03dae9fd2a4c6798a469a908be472ae1 +43,1,0,8,8,1,0,0,1,0xbe9073142e1b67c61ee7e7b2afb51932 +43,1,0,9,9,1,0,0,1,0x80000000000000000000000000000000 +43,1,0,10,10,1,0,0,1,0x00000000000000000000000000000000 +43,1,0,11,11,1,0,0,1,0x00000000000000000000000000000000 +43,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +43,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +43,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +43,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +44,1,0,0,0,1,0,0,1,0x01a56ef328acb1e94d1a5405ecee0844 +44,1,0,1,1,1,0,0,1,0xcae424cc731e81b237bf3f7487ae5e01 +44,1,0,2,2,1,0,0,1,0x432f785eed6d218a4821b80b478877e1 +44,1,0,3,3,1,0,0,1,0xa02a6994ba871f122dc299d9a03df79a +44,1,0,4,4,1,0,0,1,0x1ce28e21daee3cd5766d9badde09aca0 +44,1,0,5,5,1,0,0,1,0xb8038622b6b3f4aa6d9bbdc12cd90def +44,1,0,6,6,1,0,0,1,0xb5570e72905f74b6e6f696e17eb373a5 +44,1,0,7,7,1,0,0,1,0x6e7a47b657b14888ec962f32638902ae +44,1,0,8,8,1,0,0,1,0x14d4e573cbb1d82d479fb781e62bfff3 +44,1,0,9,9,1,0,0,1,0xa0000000000000000000000000000000 +44,1,0,10,10,1,0,0,1,0x00000000000000000000000000000000 +44,1,0,11,11,1,0,0,1,0x00000000000000000000000000000000 +44,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +44,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +44,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +44,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +45,1,0,0,0,1,0,0,1,0x01f6301bbe126d3337aad8ad97d08937 +45,1,0,1,1,1,0,0,1,0xb9c5af272c3bd6de8f19d6f8990ad27b +45,1,0,2,2,1,0,0,1,0x4e330596a6fa17596f235470eb2bc332 +45,1,0,3,3,1,0,0,1,0x162e1bcc86e5c4672af918e102349638 +45,1,0,4,4,1,0,0,1,0x63dcd18343b6a5097f288f4caade30ee +45,1,0,5,5,1,0,0,1,0x58d70104b71388f954522092205bb622 +45,1,0,6,6,1,0,0,1,0xa8e41e44b8eade597477fa30e33abfef +45,1,0,7,7,1,0,0,1,0xbe950e9a79b24f89be2f2807bc13874b +45,1,0,8,8,1,0,0,1,0x82858d7257a35ade1199f6b41375a11b +45,1,0,9,9,1,0,0,1,0xa0000000000000000000000000000000 +45,1,0,10,10,1,0,0,1,0x00000000000000000000000000000000 +45,1,0,11,11,1,0,0,1,0x00000000000000000000000000000000 +45,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +45,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +45,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +45,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +46,1,0,0,0,1,0,0,1,0x019592e9e1c62f558d5583756534d622 +46,1,0,1,1,1,0,0,1,0x8f3999ac81fe3458000e7b1e7d974a08 +46,1,0,2,2,1,0,0,1,0x2dc15bdda14f80c9d9266cbad212385d +46,1,0,3,3,1,0,0,1,0x5ae8fda66797461ce3892ecd68f821c0 +46,1,0,4,4,1,0,0,1,0x695ccc3a6da19238b522c0d711c4ad92 +46,1,0,5,5,1,0,0,1,0x368506c00c4df2470345d211a3090283 +46,1,0,6,6,1,0,0,1,0xb38b809af4eba0708764e354da8bb172 +46,1,0,7,7,1,0,0,1,0xe5a9ee2ab3ae4d3705fe249b0c1a32bb +46,1,0,8,8,1,0,0,1,0x24cc6dbe283fd0199f5ab1bd1a6145b1 +46,1,0,9,9,1,0,0,1,0xb8593e0e79f34398c574827863a0130f +46,1,0,10,10,1,0,0,1,0x331b3c552db65d02c7d2dec80d76f0af +46,1,0,11,11,1,0,0,1,0x19230e4b776a2f66647e4783803398c6 +46,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +46,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +46,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +46,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +47,1,0,0,0,1,0,0,1,0x01ecf5bfb7de5bf0fb39a2716dfe5c0e +47,1,0,1,1,1,0,0,1,0x326baa272268745fb8983717c99c8a95 +47,1,0,2,2,1,0,0,1,0x17d23c16a4d69d910c2e2b65a5c2ac74 +47,1,0,3,3,1,0,0,1,0xcdabe5f88ecf7435ffbdf7726b436dc0 +47,1,0,4,4,1,0,0,1,0x0efe80c539e7aba7a952f17812eb432b +47,1,0,5,5,1,0,0,1,0xead5da73e8e7969a32ff0dbf214c3e1d +47,1,0,6,6,1,0,0,1,0xae1bb33ee39d4b8f9de4cc200c8ec217 +47,1,0,7,7,1,0,0,1,0x26522ed3f16536b1f0c5539efb1687ab +47,1,0,8,8,1,0,0,1,0x53f7b2836ea073db7c35b55cfbd91c53 +47,1,0,9,9,1,0,0,1,0x92b8e7ee9f865ae41dca195b43407e3d +47,1,0,10,10,1,0,0,1,0xf817f718183e11f933d8e0a1d23eba40 +47,1,0,11,11,1,0,0,1,0xeb0475ef0a182b1a1a411f90f4507737 +47,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +47,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +47,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +47,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +48,1,0,0,0,1,0,0,1,0x01208c7f2d947d716244ab36ff6757f9 +48,1,0,1,1,1,0,0,1,0xec1a3c42e06bbb62ef82ab3c9a0ea467 +48,1,0,2,2,1,0,0,1,0x6b42a83c4c7698c07759e18546149df0 +48,1,0,3,3,1,0,0,1,0xfd84ad3d3c5076adb9fa7835f0d4efc4 +48,1,0,4,4,1,0,0,1,0x2e0ed1eb1f89f152662ee169c88172d0 +48,1,0,5,5,1,0,0,1,0x5dbd506bf61a15edbf2dd49e79a3ca8c +48,1,0,6,6,1,0,0,1,0xa78593e13669f523702a9d8083449d23 +48,1,0,7,7,1,0,0,1,0x6ae581ad2b8994acdf07cba130ffb736 +48,1,0,8,8,1,0,0,1,0xf6f3efc5fdf0b9103a67c096f914d580 +48,1,0,9,9,1,0,0,1,0xb694321a063ad923f5cca8d1735037d0 +48,1,0,10,10,1,0,0,1,0xe6127e80c4206394a5be10883a674f8d +48,1,0,11,11,1,0,0,1,0x9a49f300bf3a51f3f0c77c778ad83f34 +48,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +48,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +48,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +48,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 +49,1,0,0,0,1,0,0,1,0x014cc0c62db39c31cd5c6688a7fb6c44 +49,1,0,1,1,1,0,0,1,0x8bb05ab35b0539e17d95aa3a465af375 +49,1,0,2,2,1,0,0,1,0x1a077fc237ee1d179e6a6e4ba789755e +49,1,0,3,3,1,0,0,1,0x26b0b836302b5af6136d85cfa0347ddd +49,1,0,4,4,1,0,0,1,0x24c039f7b66cd6ef55cebc25bda4d266 +49,1,0,5,5,1,0,0,1,0xe5ccf292a50e79c15a345b826977ebec +49,1,0,6,6,1,0,0,1,0xb00d9f703d71ee8b178237c9320b0a50 +49,1,0,7,7,1,0,0,1,0x9b261b3753dc0c1821985486f6a7f9a2 +49,1,0,8,8,1,0,0,1,0xf751e71a570c0e31e147bf2f8f9dc682 +49,1,0,9,9,1,0,0,1,0xa4786f4264f1b9a9235e07084d77d968 +49,1,0,10,10,1,0,0,1,0xc7493c49ef0fc4525b29d454e9584ed6 +49,1,0,11,11,1,0,0,1,0xeef6eed4c4d23d039a133edac947d915 +49,0,1,0,0,0,0,0,1,0x00000000000000000000000000000000 +49,0,1,1,1,0,0,0,1,0x00000000000000000000000000001000 +49,0,1,2,2,0,0,0,1,0x73eda753299d7d483339d80809a1d805 +49,0,1,3,3,0,0,0,1,0x53bda402fffe5bfeffffffff00000001 diff --git a/prover/zkevm/prover/bls/testdata/main.go b/prover/zkevm/prover/bls/testdata/main.go new file mode 100644 index 0000000000..e7c8d070a2 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/main.go @@ -0,0 +1,59 @@ +package main + +import "log/slog" + +const ( + path_add_g1 = "bls_g1_add_inputs.csv" + path_add_g2 = "bls_g2_add_inputs.csv" + path_msm_g1 = "bls_g1_msm_inputs-%d.csv" + path_msm_g2 = "bls_g2_msm_inputs-%d.csv" + path_pairing = "bls_pairing_inputs-%d.csv" + path_map_g1 = "bls_g1_map_inputs.csv" + path_map_g2 = "bls_g2_map_inputs.csv" + path_pointeval = "bls_pointeval_inputs-%d.csv" +) + +const ( + maxNbPairingInputs = 3 + maxNbMsmInputs = 3 + nbRepetitionsMap = 1 +) + +const ( + nbMsmPerOutput = 100 + nbPairingPerOutput = 50 + nbPointEvalPerOutput = 50 +) + +//go:generate go run . +func main() { + logger := slog.Default() + + logger.Info("Generating test data for BLS operations") + logger.Info("Generating ADD test data", "path_g1", path_add_g1, "path_g2", path_add_g2) + if err := mainAdd(); err != nil { + logger.Error("Failed to generate ADD test data", "error", err) + return + } + logger.Info("Generating MAP test data", "path_g1", path_msm_g1, "path_g2", path_msm_g2) + if err := mainMsm(); err != nil { + logger.Error("Failed to generate MSM test data", "error", err) + return + } + logger.Info("Generating PAIRING test data", "path_pairing", path_pairing) + if err := mainPairing(); err != nil { + logger.Error("Failed to generate PAIRING test data", "error", err) + return + } + logger.Info("Generating MAP test data", "path_g1", path_map_g1, "path_g2", path_map_g2) + if err := mainMap(); err != nil { + logger.Error("Failed to generate MAP test data", "error", err) + return + } + logger.Info("Generating POINT EVALUATION test data", "path_pointeval", path_pointeval) + if err := mainPointEval(); err != nil { + logger.Error("Failed to generate POINT EVALUATION test data", "error", err) + return + } + logger.Info("Test data generation completed successfully") +} diff --git a/prover/zkevm/prover/bls/testdata/testdata_generate.go b/prover/zkevm/prover/bls/testdata/testdata_generate.go new file mode 100644 index 0000000000..8779957fd7 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/testdata_generate.go @@ -0,0 +1,278 @@ +package main + +import ( + "crypto/rand" + "fmt" + "iter" + "math/big" + "slices" + + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" + fp_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/fp" + fr_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" +) + +type affine interface { + bls12381.G1Affine | bls12381.G2Affine +} + +func generateG1Trivial() bls12381.G1Affine { + var p bls12381.G1Affine + p.SetInfinity() + return p +} + +func generateG2Trivial() bls12381.G2Affine { + var p bls12381.G2Affine + p.SetInfinity() + return p +} + +func generateTrivial[T affine]() T { + var res T + switch vv := any(&res).(type) { + case *bls12381.G1Affine: + v := generateG1Trivial() + *vv = v + case *bls12381.G2Affine: + v := generateG2Trivial() + *vv = v + } + return res +} + +func generateG1OnCurve() bls12381.G1Affine { + var x fp_bls12381.Element + x.MustSetRandom() + P := bls12381.GeneratePointNotInG1(x) + var pa bls12381.G1Affine + pa.FromJacobian(&P) + if !pa.IsOnCurve() { + panic("generated point is not on curve") + } + if pa.IsInSubGroup() { + panic("generated point is in subgroup") + } + return pa +} + +func generateG2OnCurve() bls12381.G2Affine { + var x, y fp_bls12381.Element + x.MustSetRandom() + y.MustSetRandom() + e := bls12381.E2{A0: x, A1: y} + P := bls12381.GeneratePointNotInG2(e) + var pa bls12381.G2Affine + pa.FromJacobian(&P) + if !pa.IsOnCurve() { + panic("generated point is not on curve") + } + if pa.IsInSubGroup() { + panic("generated point is in subgroup") + } + return pa +} + +func generateOnCurve[T affine]() T { + var res T + switch vv := any(&res).(type) { + case *bls12381.G1Affine: + v := generateG1OnCurve() + *vv = v + case *bls12381.G2Affine: + v := generateG2OnCurve() + *vv = v + } + return res +} + +func generateG1InSubgroup() bls12381.G1Affine { + var p bls12381.G1Affine + var s fr_bls12381.Element + s.MustSetRandom() + p.ScalarMultiplicationBase(s.BigInt(new(big.Int))) + return p +} + +func generateG2InSubgroup() bls12381.G2Affine { + var p bls12381.G2Affine + var s fr_bls12381.Element + s.MustSetRandom() + p.ScalarMultiplicationBase(s.BigInt(new(big.Int))) + return p +} + +func generateInSubgroup[T affine]() T { + var res T + switch vv := any(&res).(type) { + case *bls12381.G1Affine: + v := generateG1InSubgroup() + *vv = v + case *bls12381.G2Affine: + v := generateG2InSubgroup() + *vv = v + } + return res +} + +func generateG1Invalid() bls12381.G1Affine { + var p bls12381.G1Affine + for { + p.X.SetRandom() + p.Y.SetRandom() + if !p.IsOnCurve() { + return p + } + } +} + +func generateG2Invalid() bls12381.G2Affine { + var p bls12381.G2Affine + for { + p.X.A0.SetRandom() + p.X.A1.SetRandom() + p.Y.A0.SetRandom() + p.Y.A1.SetRandom() + if !p.IsOnCurve() { + return p + } + } +} + +func generateInvalid[T affine]() T { + var res T + switch vv := any(&res).(type) { + case *bls12381.G1Affine: + v := generateG1Invalid() + *vv = v + case *bls12381.G2Affine: + v := generateG2Invalid() + *vv = v + } + return res +} + +func generateScalar(scalarType msmInputType) *big.Int { + switch scalarType { + case msmScalarTrivial: + return big.NewInt(0) + case msmScalarRange: + r, err := rand.Int(rand.Reader, fr_bls12381.Modulus()) + if err != nil { + panic(fmt.Sprintf("failed to generate random scalar: %v", err)) + } + return r + case msmScalarBig: + bound := new(big.Int).Lsh(big.NewInt(1), fr_bls12381.Bits) + bound.Sub(bound, fr_bls12381.Modulus()) // ensure the scalar is less than the modulus + // Generate a random scalar that is guaranteed to be big + r, err := rand.Int(rand.Reader, bound) + if err != nil { + panic(fmt.Sprintf("failed to generate random scalar: %v", err)) + } + r.Add(r, fr_bls12381.Modulus()) // ensure the scalar is larger than modulus + return r + default: + panic(fmt.Sprintf("unknown scalar type: %d", scalarType)) + } +} + +func recIt[T any](newIterator func() iter.Seq2[int, func() T], yield func([]T) bool, width int, vals []func() T) { + if width == 0 { + return + } + for _, v := range newIterator() { + newVals := append(vals, v) + if len(newVals) == width { + ret := make([]T, len(newVals)) + for i, f := range newVals { + ret[i] = f() + } + if !yield(ret) { + return + } + } else { + recIt(newIterator, yield, width, newVals) + } + } +} + +func cartesianProduct[T any](width int, newIterator func() iter.Seq2[int, func() T]) iter.Seq[[]T] { + return func(yield func([]T) bool) { + recIt(newIterator, yield, width, []func() T{}) + } +} + +func splitG1ToLimbs(p bls12381.G1Affine) []string { + limbs := slices.Concat( + splitBaseToLimbs(p.X), + splitBaseToLimbs(p.Y), + ) + return limbs +} + +func splitG2ToLimbs(q bls12381.G2Affine) []string { + limbs := slices.Concat( + splitBaseToLimbs(q.X.A0), + splitBaseToLimbs(q.X.A1), + splitBaseToLimbs(q.Y.A0), + splitBaseToLimbs(q.Y.A1), + ) + return limbs +} + +func splitToLimbs[T affine](p T) []string { + switch vv := any(p).(type) { + case bls12381.G1Affine: + return splitG1ToLimbs(vv) + case bls12381.G2Affine: + return splitG2ToLimbs(vv) + default: + panic(fmt.Sprintf("unknown type for splitting to limbs: %T", p)) + } +} + +func splitScalarToLimbs(s *big.Int) []string { + var sb [32]byte + s.FillBytes(sb[:]) + limbs := []string{ + fmt.Sprintf("0x%x", sb[0:16]), + fmt.Sprintf("0x%x", sb[16:32]), + } + return limbs +} + +func splitBaseToLimbs(x fp_bls12381.Element) []string { + xb := x.Bytes() + limbs := []string{ + "0x00000000000000000000000000000000", + fmt.Sprintf("0x%x", xb[0:16]), + fmt.Sprintf("0x%x", xb[16:32]), + fmt.Sprintf("0x%x", xb[32:48]), + } + return limbs +} + +func formatBoolAsInt(b bool) string { + if b { + return "1" + } + return "0" +} + +func splitG1CompressedLimbs(bts [bls12381.SizeOfG1AffineCompressed]byte) []string { + limbs := []string{ + fmt.Sprintf("0x%x", bts[0:16]), + fmt.Sprintf("0x%x", bts[16:32]), + fmt.Sprintf("0x%x", bts[32:48]), + } + return limbs +} + +func splitVersionedHashToLimbs(h [32]byte) []string { + limbs := []string{ + fmt.Sprintf("0x%x", h[0:16]), + fmt.Sprintf("0x%x", h[16:32]), + } + return limbs +} diff --git a/prover/zkevm/prover/bls/testdata/testdata_generate_add.go b/prover/zkevm/prover/bls/testdata/testdata_generate_add.go new file mode 100644 index 0000000000..2907758429 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/testdata_generate_add.go @@ -0,0 +1,211 @@ +package main + +import ( + "encoding/csv" + "fmt" + "iter" + "os" + "strconv" + + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" +) + +type addInputType int + +// for addition tests, we combine all possible cases from below +const ( + addTrivial addInputType = iota // 0 + addOnCurve // P on curve not in subgroup + addInSubgroup // P in subgroup + addInvalid // P not on curve +) + +type addInputCase[T affine] struct { + left addInputType + right addInputType + + P, Q, Res T + + ToAddCircuit bool + LeftToCurveCheckCircuit bool + RightToCurveCheckCircuit bool +} + +func generateAddInputCases[T affine]() iter.Seq2[int, addInputCase[T]] { + return func(yield func(int, addInputCase[T]) bool) { + var id int + for _, left := range []addInputType{addTrivial, addOnCurve, addInSubgroup, addInvalid} { + for _, right := range []addInputType{addTrivial, addOnCurve, addInSubgroup, addInvalid} { + tc := addInputCase[T]{ + left: left, + right: right, + ToAddCircuit: true, + } + switch left { + case addTrivial: + tc.P = generateTrivial[T]() + case addOnCurve: + tc.P = generateOnCurve[T]() + case addInSubgroup: + tc.P = generateInSubgroup[T]() + case addInvalid: + tc.P = generateInvalid[T]() + tc.LeftToCurveCheckCircuit = true + tc.ToAddCircuit = false + } + switch right { + case addTrivial: + tc.Q = generateTrivial[T]() + case addOnCurve: + tc.Q = generateOnCurve[T]() + case addInSubgroup: + tc.Q = generateInSubgroup[T]() + case addInvalid: + tc.Q = generateInvalid[T]() + if !tc.LeftToCurveCheckCircuit { + // if the left point is invalid, we don't need to check the right point + tc.RightToCurveCheckCircuit = true + tc.ToAddCircuit = false + } + } + if tc.left != addInvalid && tc.right != addInvalid { + switch vv := any(&tc.Res).(type) { + case *bls12381.G1Affine: + vv.Add(any(&tc.P).(*bls12381.G1Affine), any(&tc.Q).(*bls12381.G1Affine)) + case *bls12381.G2Affine: + vv.Add(any(&tc.P).(*bls12381.G2Affine), any(&tc.Q).(*bls12381.G2Affine)) + } + } + if !yield(id, tc) { + return + } + id++ + } + } + } +} + +func (a addInputCase[T]) WriteCSV(w *csv.Writer, id int) error { + // columns: + // - id + // - data_T_add + // - RSLT_T_add + // - index (0-15 for inputs and then 0-7 for result) + // - ct (0-7 three times) + // - is_first_input + // - is_second_input + // - circuit_selector_T_add + // - circuit_selector_membership + PLimbs := splitToLimbs(a.P) + QLimbs := splitToLimbs(a.Q) + ResLimbs := splitToLimbs(a.Res) + + records := make([][]string, len(PLimbs)+len(QLimbs)+len(ResLimbs)) + + for i := range PLimbs { + records[i] = []string{ + strconv.Itoa(id), + "1", + "0", + strconv.Itoa(i), + strconv.Itoa(i), + "1", + "0", + formatBoolAsInt(a.ToAddCircuit), + formatBoolAsInt(a.LeftToCurveCheckCircuit), + PLimbs[i], + } + } + for i := range QLimbs { + records[len(PLimbs)+i] = []string{ + strconv.Itoa(id), + "1", + "0", + strconv.Itoa(len(PLimbs) + i), + strconv.Itoa(i), + "0", + "1", + formatBoolAsInt(a.ToAddCircuit), + formatBoolAsInt(a.RightToCurveCheckCircuit), + QLimbs[i], + } + } + for i := range ResLimbs { + records[len(PLimbs)+len(QLimbs)+i] = []string{ + strconv.Itoa(id), + "0", + "1", + strconv.Itoa(i), + strconv.Itoa(i), + "0", + "0", + formatBoolAsInt(a.ToAddCircuit), + "0", + ResLimbs[i], + } + } + if err := w.WriteAll(records); err != nil { + return fmt.Errorf("write all records: %w", err) + } + return nil +} + +func headersAdd[T affine]() []string { + var t, tt string + switch any(new(T)).(type) { + case *bls12381.G1Affine: + t = "G1" + tt = "C1" + case *bls12381.G2Affine: + t = "G2" + tt = "C2" + default: + panic(fmt.Sprintf("unknown type for headersAdd: %T", new(T))) + } + return []string{ + "ID", + fmt.Sprintf("DATA_%s_ADD", t), + fmt.Sprintf("RSLT_%s_ADD", t), + "INDEX", + "CT", + "IS_FIRST_INPUT", + "IS_SECOND_INPUT", + fmt.Sprintf("CIRCUIT_SELECTOR_%s_ADD", t), + fmt.Sprintf("CIRCUIT_SELECTOR_%s_MEMBERSHIP", tt), + "LIMB", + } +} + +func mainAdd() error { + f, err := os.Create(path_add_g1) + if err != nil { + return fmt.Errorf("create file: %w", err) + } + defer f.Close() + w := csv.NewWriter(f) + defer w.Flush() + if err := w.Write(headersAdd[bls12381.G1Affine]()); err != nil { + return fmt.Errorf("write headers: %w", err) + } + for i, tc := range generateAddInputCases[bls12381.G1Affine]() { + if err := tc.WriteCSV(w, i); err != nil { + return fmt.Errorf("write csv: %w", err) + } + } + + f, err = os.Create(path_add_g2) + if err != nil { + return fmt.Errorf("create file: %w", err) + } + defer f.Close() + w = csv.NewWriter(f) + if err := w.Write(headersAdd[bls12381.G2Affine]()); err != nil { + return fmt.Errorf("write headers: %w", err) + } + for i, tc := range generateAddInputCases[bls12381.G2Affine]() { + if err := tc.WriteCSV(w, i); err != nil { + return fmt.Errorf("write csv: %w", err) + } + } + return nil +} diff --git a/prover/zkevm/prover/bls/testdata/testdata_generate_map.go b/prover/zkevm/prover/bls/testdata/testdata_generate_map.go new file mode 100644 index 0000000000..601946699a --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/testdata_generate_map.go @@ -0,0 +1,213 @@ +package main + +import ( + "encoding/csv" + "fmt" + "iter" + "os" + "strconv" + + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" + fp_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/fp" +) + +type mapInputType int + +const ( + mapTrivial mapInputType = iota // 0 + mapInRange // element is in range of the field +) + +type mapInput[T affine] struct { + P []fp_bls12381.Element // element to map. In case for G1 it is 1, in case for G2 it is 2 + Res T + + ToMapCircuit bool // whether to map. Always true, we don't perform error checks in circuit +} + +func generateTrivialMapInput[T affine]() [][]fp_bls12381.Element { + var res [][]fp_bls12381.Element + switch any(new(T)).(type) { + case *bls12381.G1Affine: + res = append(res, []fp_bls12381.Element{fp_bls12381.NewElement(0)}) + case *bls12381.G2Affine: + v0 := make([]fp_bls12381.Element, 2) + v0[0].SetZero() + v0[1].SetZero() + res = append(res, v0) + + v1 := make([]fp_bls12381.Element, 2) + v1[0].SetZero() + v1[1].MustSetRandom() + res = append(res, v1) + + v2 := make([]fp_bls12381.Element, 2) + v2[0].MustSetRandom() + v2[1].SetZero() + res = append(res, v2) + } + return res +} + +func generateNonTrivialMapInput[T affine]() []fp_bls12381.Element { + var v []fp_bls12381.Element + switch any(new(T)).(type) { + case *bls12381.G1Affine: + v = make([]fp_bls12381.Element, 1) + v[0].MustSetRandom() + case *bls12381.G2Affine: + v = make([]fp_bls12381.Element, 2) + v[0].MustSetRandom() + v[1].MustSetRandom() + } + return v +} + +func computeMap[T affine](p []fp_bls12381.Element) mapInput[T] { + res := mapInput[T]{ + P: p, + ToMapCircuit: true, + } + switch vv := any(&res.Res).(type) { + case *bls12381.G1Affine: + if len(p) != 1 { + panic("G1 map expects 1 element") + } + *vv = bls12381.MapToG1(p[0]) + case *bls12381.G2Affine: + if len(p) != 2 { + panic("G2 map expects 2 elements") + } + *vv = bls12381.MapToG2(bls12381.E2{A0: p[0], A1: p[1]}) + } + return res +} + +func generateMapInput[T affine](nbNonTrivial int) iter.Seq2[int, mapInput[T]] { + return func(yield func(int, mapInput[T]) bool) { + var id int + for _, inputType := range []mapInputType{mapTrivial, mapInRange} { + if inputType == mapTrivial { + inputs := generateTrivialMapInput[T]() + outputs := make([]mapInput[T], len(inputs)) + for i := range inputs { + outputs[i] = computeMap[T](inputs[i]) + } + for _, output := range outputs { + if !yield(id, output) { + return + } + id++ + } + } else if inputType == mapInRange { + for i := 0; i < nbNonTrivial; i++ { + input := generateNonTrivialMapInput[T]() + output := computeMap[T](input) + if !yield(id, output) { + return + } + id++ + } + } + } + } +} + +func (tc mapInput[T]) WriteCSV(w *csv.Writer, id int) error { + var index int + for i := range tc.P { + plimbs := splitBaseToLimbs(tc.P[i]) + for j := range plimbs { + if err := w.Write([]string{ + strconv.Itoa(id), // ID + "1", // DATA_MAP_T_TO_T + "0", // RSLT_MAP_T_TO_T + strconv.Itoa(index), // INDEX + strconv.Itoa(index), // CT. CT==INDEX + "1", // IS_FIRST_INPUT + "0", // IS_SECOND_INPUT. Never have second input + formatBoolAsInt(tc.ToMapCircuit), // CIRCUIT_SELECTOR_MAP_T_TO_T + plimbs[j], // LIMB + }); err != nil { + return fmt.Errorf("write map input: %w", err) + } + index++ + } + } + resLimbs := splitToLimbs(tc.Res) + for i := range resLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), // ID + "0", // DATA_MAP_T_TO_T + "1", // RSLT_MAP_T_TO_T + strconv.Itoa(i), // INDEX + strconv.Itoa(i), // CT. CT==INDEX + "0", // IS_FIRST_INPUT + "0", // IS_SECOND_INPUT. Never have second input + formatBoolAsInt(tc.ToMapCircuit), // CIRCUIT_SELECTOR_MAP_T_TO_T + resLimbs[i], // LIMB + }); err != nil { + return fmt.Errorf("write map result: %w", err) + } + } + return nil +} + +func headerMap[T affine]() []string { + var t, tt string + switch any(new(T)).(type) { + case *bls12381.G1Affine: + t = "G1" + tt = "FP" + case *bls12381.G2Affine: + t = "G2" + tt = "FP2" + default: + panic("unknown type") + } + return []string{ + "ID", + fmt.Sprintf("DATA_MAP_%s_TO_%s", tt, t), + fmt.Sprintf("RSLT_MAP_%s_TO_%s", tt, t), + "INDEX", + "CT", + "IS_FIRST_INPUT", + "IS_SECOND_INPUT", + fmt.Sprintf("CIRCUIT_SELECTOR_MAP_%s_TO_%s", tt, t), + "LIMB", + } +} + +func mainMap() error { + f, err := os.Create(path_map_g1) + if err != nil { + return fmt.Errorf("create file: %w", err) + } + defer f.Close() + w := csv.NewWriter(f) + defer w.Flush() + if err := w.Write(headerMap[bls12381.G1Affine]()); err != nil { + return fmt.Errorf("write headers: %w", err) + } + for i, tc := range generateMapInput[bls12381.G1Affine](nbRepetitionsMap) { + if err := tc.WriteCSV(w, i); err != nil { + return fmt.Errorf("write csv: %w", err) + } + } + f, err = os.Create(path_map_g2) + if err != nil { + return fmt.Errorf("create file: %w", err) + } + defer f.Close() + w = csv.NewWriter(f) + defer w.Flush() + if err := w.Write(headerMap[bls12381.G2Affine]()); err != nil { + return fmt.Errorf("write headers: %w", err) + } + for i, tc := range generateMapInput[bls12381.G2Affine](nbRepetitionsMap) { + if err := tc.WriteCSV(w, i); err != nil { + return fmt.Errorf("write csv: %w", err) + } + } + return nil +} diff --git a/prover/zkevm/prover/bls/testdata/testdata_generate_msm.go b/prover/zkevm/prover/bls/testdata/testdata_generate_msm.go new file mode 100644 index 0000000000..f4571724d4 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/testdata_generate_msm.go @@ -0,0 +1,270 @@ +package main + +import ( + "encoding/csv" + "fmt" + "iter" + "math/big" + "os" + "strconv" + + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" +) + +type msmInputType int + +const ( + msmScalarTrivial msmInputType = iota // 0 + msmScalarRange // scalar is in range of the scalar field + msmScalarBig // scalar is not in range of the scalar field. But it is still a valid scalar + + msmPointTrivial // point is 0 + msmPointOnCurve // point is on curve but not in subgroup + msmPointInSubgroup // point is in subgroup + msmPointInvalid // point is not on curve +) + +type msmInput[T affine] struct { + scalar msmInputType + point msmInputType + + n *big.Int + P T + + ToMSMCircuit bool + ToGroupCheckCircuit bool +} + +type msmInputCase[T affine] struct { + inputs []msmInput[T] + + Res T +} + +func generateMsmInput[T affine]() iter.Seq2[int, func() msmInput[T]] { + return func(yield func(int, func() msmInput[T]) bool) { + var id int + for _, scalar := range []msmInputType{msmScalarTrivial, msmScalarRange, msmScalarBig} { + for _, point := range []msmInputType{msmPointTrivial, msmPointOnCurve, msmPointInSubgroup, msmPointInvalid} { + tcf := func() msmInput[T] { + tc := msmInput[T]{ + scalar: scalar, + point: point, + n: generateScalar(scalar), + ToMSMCircuit: true, + } + switch point { + case msmPointTrivial: + tc.P = generateTrivial[T]() + case msmPointOnCurve: + tc.P = generateOnCurve[T]() + case msmPointInSubgroup: + tc.P = generateInSubgroup[T]() + case msmPointInvalid: + tc.P = generateInvalid[T]() + } + return tc + } + if !yield(id, tcf) { + return + } + id++ + } + } + } +} + +func generateMsmInputCases[T affine](msmLength int) iter.Seq2[int, msmInputCase[T]] { + return func(yield func(int, msmInputCase[T]) bool) { + var id int + for v := range cartesianProduct(msmLength, generateMsmInput[T]) { + tc := msmInputCase[T]{ + inputs: v, + } + var hasFailure bool + for _, input := range v { + if input.point == msmPointInvalid || input.point == msmPointOnCurve { + hasFailure = true + } + } + // in case of failure, we don't need to compute the result. Also we + // don't need to send the inputs to the MSM circuit, but we need to + // send the first failing input to the group check circuit + if hasFailure { + for i := range tc.inputs { + tc.inputs[i].ToMSMCircuit = false + } + for i := range tc.inputs { + if tc.inputs[i].point == msmPointInvalid || tc.inputs[i].point == msmPointOnCurve { + tc.inputs[i].ToGroupCheckCircuit = true + break + } + } + } else { + switch vv := any(&tc.Res).(type) { + case *bls12381.G1Affine: + for _, input := range v { + var tmp bls12381.G1Affine + tmp.ScalarMultiplication(any(&input.P).(*bls12381.G1Affine), input.n) + vv.Add(vv, &tmp) + } + case *bls12381.G2Affine: + for _, input := range v { + var tmp bls12381.G2Affine + tmp.ScalarMultiplication(any(&input.P).(*bls12381.G2Affine), input.n) + vv.Add(vv, &tmp) + } + } + } + if !yield(id, tc) { + return + } + id++ + } + } +} + +func (tc msmInputCase[T]) WriteCSV(w *csv.Writer, id int) error { + // columns: + // - ID + // - data_T_MSM + // - RSLT_T_MSM + // - INDEX (0-N for the inputs, then 0-7 for the result) + // - CT (0-7 for point, 0-1 for scalar, 0-7 for result) + // - IS_FIRST_INPUT point + // - IS_SECOND_INPUT scalar + // - CIRCUIT_SELECTOR_T_MSM - in case all goes to MSM + // - CIRCUIT_SELECTOR_T_MEMBERSHIP - in case goes to subgroup non-membership check + // - LIMB - limb of the scalar or point + var index int + var hasGroupCheck bool + for _, input := range tc.inputs { + hasGroupCheck = hasGroupCheck || input.ToGroupCheckCircuit + nLimbs := splitScalarToLimbs(input.n) + pLimbs := splitToLimbs(input.P) + for j, limb := range pLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), + "1", + "0", + strconv.Itoa(index), + strconv.Itoa(j), + "1", + "0", + formatBoolAsInt(input.ToMSMCircuit), + formatBoolAsInt(input.ToGroupCheckCircuit), + limb, + }); err != nil { + return fmt.Errorf("write point limb: %w", err) + } + index++ + } + for j, limb := range nLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), + "1", + "0", + strconv.Itoa(index), + strconv.Itoa(j), + "0", + "1", + formatBoolAsInt(input.ToMSMCircuit), + "0", // formatBoolAsInt(input.ToGroupCheckCircuit), /* scalars never go to group check circuit */ + limb, + }); err != nil { + return fmt.Errorf("write scalar limb: %w", err) + } + index++ + } + } + resLimbs := splitToLimbs(tc.Res) + for j, limb := range resLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), + "0", + "1", + strconv.Itoa(j), + strconv.Itoa(j), + "0", + "0", + formatBoolAsInt(!hasGroupCheck), + formatBoolAsInt(false), + limb, + }); err != nil { + return fmt.Errorf("write result limb: %w", err) + } + index++ + } + return nil +} + +func headersMsm[T affine]() []string { + var t string + switch any(new(T)).(type) { + case *bls12381.G1Affine: + t = "G1" + case *bls12381.G2Affine: + t = "G2" + default: + panic("unknown type") + } + return []string{ + "ID", + fmt.Sprintf("DATA_%s_MSM", t), + fmt.Sprintf("RSLT_%s_MSM", t), + "INDEX", + "CT", + "IS_FIRST_INPUT", + "IS_SECOND_INPUT", + fmt.Sprintf("CIRCUIT_SELECTOR_%s_MSM", t), + fmt.Sprintf("CIRCUIT_SELECTOR_%s_MEMBERSHIP", t), + "LIMB", + } +} + +func mainMsmGroup[T affine](path string, maxLength int) error { + var err error + var f *os.File + var w *csv.Writer + id := 0 + fileNr := 0 + + for msmLength := 1; msmLength <= maxLength; msmLength++ { + for _, tc := range generateMsmInputCases[T](msmLength) { + if id%nbMsmPerOutput == 0 { + if f != nil { + w.Flush() + f.Close() + } + f, err = os.Create(fmt.Sprintf(path, fileNr)) + if err != nil { + return fmt.Errorf("create file: %w", err) + } + w = csv.NewWriter(f) + if err := w.Write(headersMsm[T]()); err != nil { + return fmt.Errorf("write headers: %w", err) + } + fileNr++ + } + if err := tc.WriteCSV(w, id); err != nil { + return fmt.Errorf("write csv: %w", err) + } + id++ + } + } + if f != nil { + w.Flush() + f.Close() + } + return nil +} + +func mainMsm() error { + if err := mainMsmGroup[bls12381.G1Affine](path_msm_g1, maxNbMsmInputs); err != nil { + return fmt.Errorf("generate g1 msm: %w", err) + } + if err := mainMsmGroup[bls12381.G2Affine](path_msm_g2, maxNbMsmInputs); err != nil { + return fmt.Errorf("generate g2 msm: %w", err) + } + return nil +} diff --git a/prover/zkevm/prover/bls/testdata/testdata_generate_pair.go b/prover/zkevm/prover/bls/testdata/testdata_generate_pair.go new file mode 100644 index 0000000000..2768ba365e --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/testdata_generate_pair.go @@ -0,0 +1,652 @@ +package main + +import ( + "encoding/csv" + "fmt" + "iter" + "math/big" + "os" + "strconv" + "strings" + + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" + fr "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" +) + +type pairInputType int + +const ( + pairFullTrivial pairInputType = iota // (0, 0) + pairLeftTrivialValid // (0, Q) + pairLeftTrivialInvalidCurve // (0, Q') where Q' is not in C2 + pairLeftTrivialInvalidGroup // (0, Q') where Q' is not in G2 subgroup + pairRightTrivialValid // (P, 0) + pairRightTrivialInvalidCurve // (P', 0) where P' is not in C1 + pairRightTrivialInvalidGroup // (P', 0) where P' is not in G1 subgroup + pairNonTrivialLeftInvalidCurve // (P, Q) where P is not in C1 + pairNonTrivialLeftInvalidGroup // (P, Q) where P is not in G1 subgroup + pairNonTrivialRightInvalidCurve // (P, Q) where Q is not in C2 + pairNonTrivialRightInvalidGroup // (P, Q) where Q is not in G2 subgroup + pairFullInvalidCurveCurve // (P, Q) where P and Q not in C1 and C2 respectively + pairFullInvalidCurveGroup // (P, Q) where P and Q not in C1 and G2 respectively + pairFullInvalidGroupCurve // (P, Q) where P and Q not in G1 and C2 respectively + pairFullInvalidGroupGroup // (P, Q) where P and Q not in G1 and G2 subgroups respectively + pairNonTrivial // (P, Q) +) + +func (p pairInputType) String() string { + switch p { + case pairFullTrivial: + return "pairFullTrivial" + case pairLeftTrivialValid: + return "pairLeftTrivialValid" + case pairLeftTrivialInvalidCurve: + return "pairLeftTrivialInvalidCurve" + case pairLeftTrivialInvalidGroup: + return "pairLeftTrivialInvalidGroup" + case pairRightTrivialValid: + return "pairRightTrivialValid" + case pairRightTrivialInvalidCurve: + return "pairRightTrivialInvalidCurve" + case pairRightTrivialInvalidGroup: + return "pairRightTrivialInvalidGroup" + case pairNonTrivialLeftInvalidCurve: + return "pairNonTrivialLeftInvalidCurve" + case pairNonTrivialLeftInvalidGroup: + return "pairNonTrivialLeftInvalidGroup" + case pairNonTrivialRightInvalidCurve: + return "pairNonTrivialRightInvalidCurve" + case pairNonTrivialRightInvalidGroup: + return "pairNonTrivialRightInvalidGroup" + case pairFullInvalidCurveCurve: + return "pairFullInvalidCurveCurve" + case pairFullInvalidCurveGroup: + return "pairFullInvalidCurveGroup" + case pairFullInvalidGroupCurve: + return "pairFullInvalidGroupCurve" + case pairFullInvalidGroupGroup: + return "pairFullInvalidGroupGroup" + case pairNonTrivial: + return "pairNonTrivial" + default: + panic("unknown input type") + } +} + +type pairInput struct { + P bls12381.G1Affine + Q bls12381.G2Affine + + // ToPairingCircuit is true if the input is wellformed and fully non-trivial + ToPairingCircuit bool + // ToG1MembershipCircuit is true if P should be sent to the G1 membership circuit. The membership result should be in SUCCESS_BIT + ToG1MembershipCircuit bool + // ToG2MembershipCircuit is true if Q should be sent to the G2 membership circuit. The membership result should be in SUCCESS_BIT + ToG2MembershipCircuit bool + + // Indicates if the G1/G2 membership check should pass + MembershipSuccess bool + // IsTrivialG1 is true if P is trivial (0, 0) + IsTrivialG1 bool + // IsTrivialG2 is true if Q is trivial (0, 0) + IsTrivialG2 bool + // IsTrivialAcc is true if either of the inputs is trivial + IsTrivialAcc bool + + inputType pairInputType +} + +func (p pairInput) String() string { + return fmt.Sprintf("pairInput{P: %s, Q: %s, ToPairingCircuit: %t, ToG1MembershipCircuit: %t, ToG2MembershipCircuit: %t, MembershipSuccess: %t, IsTrivialG1: %t, IsTrivialG2: %t, IsTrivialAcc: %t, inputType: %s}", + p.P.String(), p.Q.String(), p.ToPairingCircuit, p.ToG1MembershipCircuit, p.ToG2MembershipCircuit, + p.MembershipSuccess, p.IsTrivialG1, p.IsTrivialG2, p.IsTrivialAcc, p.inputType) +} + +type pairInputCase struct { + inputs []pairInput + result bool +} + +func (p pairInputCase) String() string { + var inputStrs []string + for _, input := range p.inputs { + inputStrs = append(inputStrs, input.String()) + } + return fmt.Sprintf("[]{%s}, result: %t", strings.Join(inputStrs, ", "), p.result) +} + +func generatePairInput() iter.Seq2[int, func() pairInput] { + return func(yield func(int, func() pairInput) bool) { + for i, inputType := range []pairInputType{ + pairFullTrivial, + pairLeftTrivialValid, + pairLeftTrivialInvalidCurve, + pairLeftTrivialInvalidGroup, + pairRightTrivialValid, + pairRightTrivialInvalidCurve, + pairRightTrivialInvalidGroup, + pairNonTrivialLeftInvalidCurve, + pairNonTrivialLeftInvalidGroup, + pairNonTrivialRightInvalidCurve, + pairNonTrivialRightInvalidGroup, + pairFullInvalidCurveCurve, + pairFullInvalidCurveGroup, + pairFullInvalidGroupCurve, + pairFullInvalidGroupGroup, + pairNonTrivial, + } { + tcf := func() pairInput { + var ip pairInput + switch inputType { + case pairFullTrivial: + ip = pairInput{ + P: generateG1Trivial(), + Q: generateG2Trivial(), + ToPairingCircuit: false, + ToG1MembershipCircuit: false, + ToG2MembershipCircuit: false, + MembershipSuccess: true, + IsTrivialG1: true, + IsTrivialG2: true, + IsTrivialAcc: true, + inputType: inputType, + } + case pairLeftTrivialValid: + ip = pairInput{ + P: generateG1Trivial(), + Q: generateG2InSubgroup(), + ToPairingCircuit: false, + ToG1MembershipCircuit: false, + ToG2MembershipCircuit: true, + MembershipSuccess: true, + IsTrivialG1: true, + IsTrivialG2: false, + IsTrivialAcc: true, + inputType: inputType, + } + case pairLeftTrivialInvalidCurve: + ip = pairInput{ + P: generateG1Trivial(), + Q: generateG2Invalid(), + ToPairingCircuit: false, + ToG1MembershipCircuit: false, + ToG2MembershipCircuit: true, + MembershipSuccess: false, + IsTrivialG1: true, + IsTrivialG2: false, + IsTrivialAcc: true, + inputType: inputType, + } + case pairLeftTrivialInvalidGroup: + ip = pairInput{ + P: generateG1Trivial(), + Q: generateG2OnCurve(), + ToPairingCircuit: false, + ToG1MembershipCircuit: false, + ToG2MembershipCircuit: true, + MembershipSuccess: false, + IsTrivialG1: true, + IsTrivialG2: false, + IsTrivialAcc: true, + inputType: inputType, + } + case pairRightTrivialValid: + ip = pairInput{ + P: generateG1InSubgroup(), + Q: generateG2Trivial(), + ToPairingCircuit: false, + ToG1MembershipCircuit: true, + ToG2MembershipCircuit: false, + MembershipSuccess: true, + IsTrivialG1: false, + IsTrivialG2: true, + IsTrivialAcc: true, + inputType: inputType, + } + case pairRightTrivialInvalidCurve: + ip = pairInput{ + P: generateG1Invalid(), + Q: generateG2Trivial(), + ToPairingCircuit: false, + ToG1MembershipCircuit: true, + ToG2MembershipCircuit: false, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: true, + IsTrivialAcc: true, + inputType: inputType, + } + case pairRightTrivialInvalidGroup: + ip = pairInput{ + P: generateG1OnCurve(), + Q: generateG2Trivial(), + ToPairingCircuit: false, + ToG1MembershipCircuit: true, + ToG2MembershipCircuit: false, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: true, + IsTrivialAcc: true, + inputType: inputType, + } + case pairNonTrivialLeftInvalidCurve: + ip = pairInput{ + P: generateG1InSubgroup(), + Q: generateG2Invalid(), + ToPairingCircuit: false, + // right is invalid, we send it to the G2 membership circuit + ToG1MembershipCircuit: false, + ToG2MembershipCircuit: true, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: false, + IsTrivialAcc: false, + inputType: inputType, + } + case pairNonTrivialLeftInvalidGroup: + ip = pairInput{ + P: generateG1InSubgroup(), + Q: generateG2OnCurve(), + ToPairingCircuit: false, + ToG1MembershipCircuit: false, + ToG2MembershipCircuit: true, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: false, + IsTrivialAcc: false, + inputType: inputType, + } + case pairNonTrivialRightInvalidCurve: + ip = pairInput{ + P: generateG1Invalid(), + Q: generateG2InSubgroup(), + ToPairingCircuit: false, + ToG1MembershipCircuit: true, + ToG2MembershipCircuit: false, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: false, + IsTrivialAcc: false, + inputType: inputType, + } + case pairNonTrivialRightInvalidGroup: + ip = pairInput{ + P: generateG1OnCurve(), + Q: generateG2InSubgroup(), + ToPairingCircuit: false, + ToG1MembershipCircuit: true, + ToG2MembershipCircuit: false, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: false, + IsTrivialAcc: false, + inputType: inputType, + } + case pairFullInvalidCurveCurve: + ip = pairInput{ + P: generateG1Invalid(), + Q: generateG2Invalid(), + ToPairingCircuit: false, + // when both points are invalid, then we only send the easiest one for checking (G1) + ToG1MembershipCircuit: true, + ToG2MembershipCircuit: false, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: false, + IsTrivialAcc: false, + inputType: inputType, + } + case pairFullInvalidCurveGroup: + ip = pairInput{ + P: generateG1Invalid(), + Q: generateG2OnCurve(), + ToPairingCircuit: false, + ToG1MembershipCircuit: true, + ToG2MembershipCircuit: false, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: false, + IsTrivialAcc: false, + inputType: inputType, + } + case pairFullInvalidGroupCurve: + ip = pairInput{ + P: generateG1OnCurve(), + Q: generateG2Invalid(), + ToPairingCircuit: false, + ToG1MembershipCircuit: true, + ToG2MembershipCircuit: false, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: false, + IsTrivialAcc: false, + inputType: inputType, + } + case pairFullInvalidGroupGroup: + ip = pairInput{ + P: generateG1OnCurve(), + Q: generateG2OnCurve(), + ToPairingCircuit: false, + ToG1MembershipCircuit: true, + ToG2MembershipCircuit: false, + MembershipSuccess: false, + IsTrivialG1: false, + IsTrivialG2: false, + IsTrivialAcc: false, + inputType: inputType, + } + case pairNonTrivial: + // this will be overwritten to obtain input such that pairing check is 1 or 0 + ip = pairInput{ + P: generateG1InSubgroup(), + Q: generateG2InSubgroup(), + ToPairingCircuit: true, + ToG1MembershipCircuit: false, + ToG2MembershipCircuit: false, + MembershipSuccess: true, + IsTrivialG1: false, + IsTrivialG2: false, + IsTrivialAcc: false, + inputType: inputType, + } + } + return ip + } + if !yield(i, tcf) { + return + } + } + } +} + +func generateValidPairing(nb int) ([]bls12381.G1Affine, []bls12381.G2Affine) { + sp := make([]fr.Element, nb) + sq := make([]fr.Element, nb) + for i := 0; i < nb; i++ { + sp[i].SetRandom() + sq[i].SetRandom() + } + var acc, tmp fr.Element + for i := 0; i < nb-1; i++ { + tmp.Mul(&sp[i], &sq[i]) + acc.Add(&acc, &tmp) + } + acc.Neg(&acc) + sq[nb-1].Div(&acc, &sp[nb-1]) + Ps := make([]bls12381.G1Affine, nb) + Qs := make([]bls12381.G2Affine, nb) + bi := new(big.Int) + for i := 0; i < nb; i++ { + Ps[i].ScalarMultiplicationBase(sp[i].BigInt(bi)) + Qs[i].ScalarMultiplicationBase(sq[i].BigInt(bi)) + } + // sanity check + ok, err := bls12381.PairingCheck(Ps, Qs) + if err != nil { + panic(err) + } + if !ok { + panic("generated pairing check is not valid") + } + return Ps, Qs +} + +func processPairInputs(v []pairInput) []pairInputCase { + // count how many instances of what we have + counts := make(map[pairInputType]int) + for _, input := range v { + counts[input.inputType]++ + } + // if there is invalid point, we need to run membership check on that point + if counts[pairLeftTrivialInvalidCurve] > 0 || + counts[pairLeftTrivialInvalidGroup] > 0 || + counts[pairNonTrivialLeftInvalidCurve] > 0 || + counts[pairNonTrivialLeftInvalidGroup] > 0 || + counts[pairRightTrivialInvalidCurve] > 0 || + counts[pairRightTrivialInvalidGroup] > 0 || + counts[pairNonTrivialRightInvalidCurve] > 0 || + counts[pairNonTrivialRightInvalidGroup] > 0 || + counts[pairFullInvalidCurveCurve] > 0 || + counts[pairFullInvalidCurveGroup] > 0 || + counts[pairFullInvalidGroupCurve] > 0 || + counts[pairFullInvalidGroupGroup] > 0 { + isFirstInvalid := true + for i := range v { + v[i].ToPairingCircuit = false + switch { + case (v[i].ToG2MembershipCircuit || v[i].ToG1MembershipCircuit) && v[i].MembershipSuccess: + // ensure that we only check non-membership + v[i].ToG1MembershipCircuit = false + v[i].ToG2MembershipCircuit = false + case isFirstInvalid && (v[i].ToG1MembershipCircuit || v[i].ToG2MembershipCircuit) && !v[i].MembershipSuccess: + // we only run membership check on the first invalid point. This + // means we keep it as is + isFirstInvalid = false + case !isFirstInvalid && (v[i].ToG1MembershipCircuit || v[i].ToG2MembershipCircuit) && !v[i].MembershipSuccess: + // we do not run membership check on the rest of invalid points, + // so we set ToG1MembershipCircuit and ToG2MembershipCircuit to + // false + v[i].ToG1MembershipCircuit = false + v[i].ToG2MembershipCircuit = false + } + } + // now we set the success_bit to false on all inputs for this test case + // (even if we have something where the membership check passes) + for i := range v { + v[i].MembershipSuccess = false + } + return []pairInputCase{pairInputCase{ + inputs: v, + result: false, + }} + } + if counts[pairNonTrivial] == 0 { + // there is no non-trivial input, so every pair has trivial component. + // In this case, the pairing result is always 0 + return []pairInputCase{pairInputCase{ + inputs: v, + result: true, + }} + } + if counts[pairNonTrivial] == 1 { + // there is only a single non-trivial input. But it cannot be 0 (it is + // not trivial), so it must be failing + return []pairInputCase{pairInputCase{ + inputs: v, + result: false, + }} + } + if counts[pairNonTrivial] > 1 { + // validV := v + validV := make([]pairInput, len(v)) + copy(validV, v) + // there are multiple non-trivial inputs. We generate two test cases - + // one where the pairing check result is 1 and other where it is 0. + Ps, Qs := generateValidPairing(counts[pairNonTrivial]) + for i := range validV { + if validV[i].inputType == pairNonTrivial { + validV[i].P = Ps[0] + validV[i].Q = Qs[0] + Ps = Ps[1:] + Qs = Qs[1:] + } + } + return []pairInputCase{ + pairInputCase{ + inputs: validV, + result: true, + }, + pairInputCase{ + inputs: v, + result: false, + }, + } + } + panic("unexpected input case") +} + +func generatePairInputCases(length int) iter.Seq2[int, pairInputCase] { + return func(yield func(int, pairInputCase) bool) { + var id int + for v := range cartesianProduct(length, generatePairInput) { + tc := processPairInputs(v) + for _, input := range tc { + if !yield(id, input) { + return + } + id++ + } + } + } +} + +func (tc pairInputCase) WriteCSV(w *csv.Writer, id int) error { + var index int + hasPairing := false + // we first need to check if there are inputs which don't belong to the + // subgroup. In that case nothing goes to the pairing circuit + for _, input := range tc.inputs { + if input.ToPairingCircuit { + hasPairing = true + } + } + for i, input := range tc.inputs { + pLimbs := splitToLimbs(input.P) + qLimbs := splitToLimbs(input.Q) + for j, limb := range pLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), // ID + "1", // DATA_PAIRING_CHECK + "0", // RSLT_PAIRING_CHECK + strconv.Itoa(index), // INDEX + strconv.Itoa(j), // CT + "1", // IS_FIRST_INPUT + "0", // IS_SECOND_INPUT + formatBoolAsInt(!input.IsTrivialAcc), // NONTRIVIAL_POP_BIT + formatBoolAsInt(input.ToPairingCircuit), // CS_PAIRING_CHECK + formatBoolAsInt(input.ToG1MembershipCircuit), // CS_G1_MEMBERSHIP + "0", // CS_G2_MEMBERSHIP. Always zero as P only goes to G1 membership + formatBoolAsInt(input.MembershipSuccess), // SUCCESS_BIT + strconv.Itoa(len(tc.inputs)), // ACC_INPUTS + limb, // LIMB + }); err != nil { + return fmt.Errorf("failed to write pairing input P %d/%d: %w", i, j, err) + } + index++ + } + for j, limb := range qLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), // ID + "1", // DATA_PAIRING_CHECK + "0", // RSLT_PAIRING_CHECK + strconv.Itoa(index), // INDEX + strconv.Itoa(j), // CT + "0", // IS_FIRST_INPUT + "1", // IS_SECOND_INPUT + formatBoolAsInt(!input.IsTrivialAcc), // NONTRIVIAL_POP_BIT + formatBoolAsInt(input.ToPairingCircuit), // CS_PAIRING_CHECK + "0", // CS_G1_MEMBERSHIP. Always zero as Q only goes to G2 membership + formatBoolAsInt(input.ToG2MembershipCircuit), // CS_G2_MEMBERSHIP + formatBoolAsInt(input.MembershipSuccess), // SUCCESS_BIT + strconv.Itoa(len(tc.inputs)), // ACC_INPUTS + limb, // LIMB + }); err != nil { + return fmt.Errorf("failed to write pairing input Q %d/%d: %w", i, j, err) + } + index++ + } + } + if err := w.Write([]string{ + strconv.Itoa(id), // ID + "0", // DATA_PAIRING_CHECK + "1", // RSLT_PAIRING_CHECK + "0", // INDEX + "0", // CT + "0", // IS_FIRST_INPUT + "0", // IS_SECOND_INPUT + "0", // NONTRIVIAL_POP_BIT + formatBoolAsInt(hasPairing), // CS_PAIRING_CHECK + "0", // CS_G1_MEMBERSHIP + "0", // CS_G2_MEMBERSHIP + formatBoolAsInt(tc.inputs[0].MembershipSuccess), // SUCCESS_BIT + strconv.Itoa(len(tc.inputs)), // ACC_INPUTS + "0", // LIMB + }); err != nil { + return fmt.Errorf("failed to write pairing result: %w", err) + } + if err := w.Write([]string{ + strconv.Itoa(id), // ID + "0", // DATA_PAIRING_CHECK + "1", // RSLT_PAIRING_CHECK + "1", // INDEX + "1", // CT + "0", // IS_FIRST_INPUT + "0", // IS_SECOND_INPUT + "0", // NONTRIVIAL_POP_BIT + formatBoolAsInt(hasPairing), // CS_PAIRING_CHECK + "0", // CS_G1_MEMBERSHIP + "0", // CS_G2_MEMBERSHIP + formatBoolAsInt(tc.inputs[0].MembershipSuccess), // SUCCESS_BIT + strconv.Itoa(len(tc.inputs)), // ACC_INPUTS + formatBoolAsInt(tc.result), // LIMB + }); err != nil { + return fmt.Errorf("failed to write pairing result: %w", err) + } + return nil +} + +func pairHeader() []string { + return []string{ + "ID", + "DATA_PAIRING_CHECK", + "RSLT_PAIRING_CHECK", + "INDEX", + "CT", + "IS_FIRST_INPUT", + "IS_SECOND_INPUT", + "NONTRIVIAL_POP_BIT", + "CS_PAIRING_CHECK", + "CS_G1_MEMBERSHIP", + "CS_G2_MEMBERSHIP", + "SUCCESS_BIT", + "ACC_INPUTS", + "LIMB", + } +} + +func mainPairing() error { + var err error + var f *os.File + var w *csv.Writer + + id := 0 + fileNr := 0 + for pairingLength := 1; pairingLength <= maxNbPairingInputs; pairingLength++ { + for _, v := range generatePairInputCases(pairingLength) { + if id%nbPairingPerOutput == 0 { + if f != nil { + w.Flush() + f.Close() + } + f, err = os.Create(fmt.Sprintf(path_pairing, fileNr)) + if err != nil { + return fmt.Errorf("failed to create pairing file: %w", err) + } + w = csv.NewWriter(f) + if err := w.Write(pairHeader()); err != nil { + return fmt.Errorf("failed to write pairing header: %w", err) + } + fileNr++ + } + if err := v.WriteCSV(w, id); err != nil { + return fmt.Errorf("failed to write pairing case %d: %w", id, err) + } + id++ + } + } + if f != nil { + w.Flush() + f.Close() + } + return nil +} diff --git a/prover/zkevm/prover/bls/testdata/testdata_generate_pointeval.go b/prover/zkevm/prover/bls/testdata/testdata_generate_pointeval.go new file mode 100644 index 0000000000..9331edf378 --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/testdata_generate_pointeval.go @@ -0,0 +1,606 @@ +package main + +import ( + "crypto/rand" + "crypto/sha256" + "encoding/csv" + "fmt" + "iter" + "math/big" + "os" + "slices" + "strconv" + + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" + fp_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/fp" + fr_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" + kzg_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/kzg" +) + +const ( + mMask byte = 0b111 << 5 + mUncompressed byte = 0b000 << 5 + _ byte = 0b001 << 5 // invalid + mUncompressedInfinity byte = 0b010 << 5 + _ byte = 0b011 << 5 // invalid + mCompressedSmallest byte = 0b100 << 5 + mCompressedLargest byte = 0b101 << 5 + mCompressedInfinity byte = 0b110 << 5 + _ byte = 0b111 << 5 // invalid +) + +const ( + // blobCommitmentVersionKZG is the version byte for the KZG point evaluation precompile. + blobCommitmentVersionKZG uint8 = 0x01 + // evmBlockSize is the size of the SRS used in the KZG precompile. This + // defines the polynomial degree and therefore the size of the blob. It is also the expected + // return value of the POINTEVAL precompile. + evmBlockSize = 4096 +) + +var ( + evmBlsModulus = fr_bls12381.Modulus() +) + +type pointEvalInput struct { + versionedHashCase pointEvalInputHashType + evaluationPointCase pointEvalInputScalarType + claimedValueCase pointEvalInputScalarType + commitmentCase pointEvalInputG1ElementType + proofCase pointEvalInputG1ElementType + expectedBlobSizeCase pointEvalInputExpectedBlobSizeType + expectedBlsModulusCase pointEvalInputExpectedModulusType + + inputType pointEvalInputType // it is usually invalid, only in case where previous fields are valid in which case we toggle this value + + VersionedHash [32]byte + EvaluationPoint *big.Int + ClaimedValue *big.Int + Commitment [bls12381.SizeOfG1AffineCompressed]byte + Proof [bls12381.SizeOfG1AffineCompressed]byte + ExpectedBlobSize *big.Int + ExpectedBlsModulus *big.Int + + // arithmetization determines where to send the input to. In case evaluation + // point or claimed value overflows, or the expected results are incorrect, it is sent to neither. + ToPointEvalCircuit bool // if the input is valid, we send it to the point evaluation circuit + ToPointEvalInvalidCircuit bool // if the input is invalid, we send it to the invalid circuit +} + +func generateInvalidCompressedPoint(c pointEvalInputG1ElementType) [bls12381.SizeOfG1AffineCompressed]byte { + var res [bls12381.SizeOfG1AffineCompressed]byte + switch c { + case invalidPointEvalG1_MaskYLarge_YSmall: + var p bls12381.G1Affine + var s fr_bls12381.Element + b := new(big.Int) + _, _, g, _ := bls12381.Generators() + for { + s.MustSetRandom() + p.ScalarMultiplication(&g, s.BigInt(b)) + if !p.Y.LexicographicallyLargest() { + break + } + } + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&mMask != mCompressedSmallest { + panic("mask should be for smallest y coordinate") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | mCompressedLargest // modify the mask + res = pMarshalled + case invalidPointEvalG1_MaskYSmall_YLarge: + var p bls12381.G1Affine + var s fr_bls12381.Element + b := new(big.Int) + _, _, g, _ := bls12381.Generators() + for { + s.MustSetRandom() + p.ScalarMultiplication(&g, s.BigInt(b)) + if p.Y.LexicographicallyLargest() { + break + } + } + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&mMask != mCompressedLargest { + panic("mask should be for largest y coordinate") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | mCompressedSmallest // modify the mask + res = pMarshalled + case invalidPointEvalG1_MaskInfinity_NotInfinity: + var p bls12381.G1Affine + var s fr_bls12381.Element + b := new(big.Int) + _, _, g, _ := bls12381.Generators() + s.MustSetRandom() + p.ScalarMultiplication(&g, s.BigInt(b)) + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&(0b110<<5) != byte(0b100)<<5 { + panic("mask should be for compressed point") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | mCompressedInfinity // modify the mask + res = pMarshalled + case invalidPointEvalG1_MaskSmallY_Infinity: + var p bls12381.G1Affine + p.SetInfinity() + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&mMask != mCompressedInfinity { + panic("mask should be for compressed infinity point") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | mCompressedSmallest // modify the mask + res = pMarshalled + case invalidPointEvalG1_MaskLargeY_Infinity: + var p bls12381.G1Affine + p.SetInfinity() + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&mMask != mCompressedInfinity { + panic("mask should be for compressed infinity point") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | mCompressedLargest // modify the mask + res = pMarshalled + case invalidPointEvalG1_MaskValid_NotInGroup: + var p bls12381.G1Affine + var s fp_bls12381.Element + s.MustSetRandom() + pj := bls12381.GeneratePointNotInG1(s) + p.FromJacobian(&pj) + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&(0b110<<5) != byte(0b100)<<5 { + panic("mask should be for compressed regular point") + } + res = pMarshalled + case invalidPointEvalG1_MaskValid_NotOnCurve: + var p bls12381.G1Affine + for { + p.X.SetRandom() + p.Y.SetRandom() + if !p.IsOnCurve() { + break + } + } + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&(0b110<<5) != byte(0b100)<<5 { + panic("mask should be for compressed regular point") + } + res = pMarshalled + case invalidPointEvalG1_Mask0b000_Random: + var p bls12381.G1Affine + var s fr_bls12381.Element + b := new(big.Int) + _, _, g, _ := bls12381.Generators() + s.MustSetRandom() + p.ScalarMultiplication(&g, s.BigInt(b)) + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&(0b110<<5) != byte(0b100)<<5 { + panic("mask should be for compressed regular point") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | mUncompressed // modify the mask + res = pMarshalled + case invalidPointEvalG1_Mask0b010_Random: + var p bls12381.G1Affine + var s fr_bls12381.Element + b := new(big.Int) + _, _, g, _ := bls12381.Generators() + s.MustSetRandom() + p.ScalarMultiplication(&g, s.BigInt(b)) + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&(0b110<<5) != byte(0b100)<<5 { + panic("mask should be for compressed regular point") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | mUncompressedInfinity // modify the mask + res = pMarshalled + case invalidPointEvalG1_Mask0b001_Random: + var p bls12381.G1Affine + var s fr_bls12381.Element + b := new(big.Int) + _, _, g, _ := bls12381.Generators() + s.MustSetRandom() + p.ScalarMultiplication(&g, s.BigInt(b)) + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&(0b110<<5) != byte(0b100)<<5 { + panic("mask should be for compressed regular point") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | (0b001 << 5) // modify the mask + res = pMarshalled + case invalidPointEvalG1_Mask0b011_Random: + var p bls12381.G1Affine + var s fr_bls12381.Element + b := new(big.Int) + _, _, g, _ := bls12381.Generators() + s.MustSetRandom() + p.ScalarMultiplication(&g, s.BigInt(b)) + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&(0b110<<5) != byte(0b100)<<5 { + panic("mask should be for compressed regular point") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | (0b011 << 5) // modify the mask + res = pMarshalled + case invalidPointEvalG1_Mask0b111_Random: + var p bls12381.G1Affine + var s fr_bls12381.Element + b := new(big.Int) + _, _, g, _ := bls12381.Generators() + s.MustSetRandom() + p.ScalarMultiplication(&g, s.BigInt(b)) + pMarshalled := p.Bytes() + // check that mask is what we expect + if pMarshalled[0]&(0b110<<5) != byte(0b100)<<5 { + panic("mask should be for compressed regular point") + } + // swap out the mask + pMarshalled[0] = (pMarshalled[0] &^ mMask) | (0b111 << 5) // modify the mask + res = pMarshalled + // case invalidPointEvalG1_Mask0b010_Infinity: + // case invalidPointEvalG1_Mask0b001_Infinity: + // case invalidPointEvalG1_Mask0b011_Infinity: + // case invalidPointEvalG1_Mask0b111_Infinity: + default: + panic("unhandled case" + strconv.Itoa(int(c))) + } + return res +} + +func (i *pointEvalInput) generate() (bool, error) { + var err error + // we first generate a valid input, then modify the values according to the input type + randPoly := make(fr_bls12381.Vector, evmBlockSize) + var evaluationPoint fr_bls12381.Element + var kzgCommitment bls12381.G1Affine + var kzgProof kzg_bls12381.OpeningProof + for { + switch i.inputType { + case validPointEval: + randPoly.MustSetRandom() + case validPointEvalZero: + // when poly is zero, then everything is zero + if i.commitmentCase != validPointEvalG1_ElementInfinity { + return false, nil + } + if i.proofCase != validPointEvalG1_ElementInfinity { + return false, nil + } + for i := range randPoly { + randPoly[i].SetZero() + } + case invalidPointEval: + // we generate a random poly, we will modify the values later + randPoly.MustSetRandom() + } + kzgCommitment, err = kzg_bls12381.Commit(randPoly, *srsPk) + if err != nil { + return false, fmt.Errorf("failed to commit random polynomial: %w", err) + } + // -- check that the commitment value is according to the test case, otherwise regenerate + i.Commitment = kzgCommitment.Bytes() + switch i.commitmentCase { + case validPointEvalG1_ElementSmallY: + if i.Commitment[0]&mMask != mCompressedSmallest { + continue + } + case validPointEvalG1_ElementLargeY: + if i.Commitment[0]&mMask != mCompressedLargest { + continue + } + default: + // we don't care about other cases, we will modify the bytes later + } + switch i.evaluationPointCase { + case validPointEvalScalar: + evaluationPoint.MustSetRandom() + i.EvaluationPoint = evaluationPoint.BigInt(new(big.Int)) + case validPointEvalScalar_Zero: + evaluationPoint.SetZero() + i.EvaluationPoint = big.NewInt(0) + case invalidPointEvalScalar_Overflow: + i.EvaluationPoint = generateScalar(msmScalarBig) + evaluationPoint.SetBigInt(i.EvaluationPoint) + } + // -- check that the proof value is according to the test case, otherwise regenerate + kzgProof, err = kzg_bls12381.Open(randPoly, evaluationPoint, *srsPk) + if err != nil { + return false, fmt.Errorf("failed to open random polynomial: %w", err) + } + i.Proof = kzgProof.H.Bytes() + switch i.proofCase { + case validPointEvalG1_ElementSmallY: + if i.Proof[0]&mMask != mCompressedSmallest { + continue + } + case validPointEvalG1_ElementLargeY: + if i.Proof[0]&mMask != mCompressedLargest { + continue + } + default: + // we don't care about other cases, we will modify the bytes later + } + break + } + // sanity check + if err = kzg_bls12381.Verify(&kzgCommitment, &kzgProof, evaluationPoint, *srsVk); err != nil { + return false, fmt.Errorf("failed to verify KZG proof: %w", err) + } + switch i.inputType { + case invalidPointEval: + i.ClaimedValue = generateScalar(msmScalarRange) + default: + i.ClaimedValue = kzgProof.ClaimedValue.BigInt(new(big.Int)) + } + switch i.claimedValueCase { + case validPointEvalScalar: + // do nothing, it is already valid + case validPointEvalScalar_Zero: + // set the claimed value to zero. This invalidates the proof + i.ClaimedValue = big.NewInt(0) + case invalidPointEvalScalar_Overflow: + // add modulus to the claimed value to ensure it always overflows + i.ClaimedValue.Add(i.ClaimedValue, evmBlsModulus) + } + + switch i.commitmentCase { + case validPointEvalG1_ElementSmallY: + // do nothing, it is already valid + case validPointEvalG1_ElementLargeY: + // do nothing, it is already valid + case validPointEvalG1_ElementInfinity: + // do nothing, it is already valid + default: + i.Commitment = generateInvalidCompressedPoint(i.commitmentCase) + } + switch i.proofCase { + case validPointEvalG1_ElementSmallY: + // do nothing, it is already valid + case validPointEvalG1_ElementLargeY: + // do nothing, it is already valid + case validPointEvalG1_ElementInfinity: + // do nothing, it is already valid + default: + i.Proof = generateInvalidCompressedPoint(i.proofCase) + } + + i.VersionedHash = sha256.Sum256(i.Commitment[:]) + i.VersionedHash[0] = blobCommitmentVersionKZG + var hashModifiers [2]byte + for { + _, err = rand.Read(hashModifiers[:]) + if err != nil { + return false, fmt.Errorf("failed to read random bytes: %w", err) + } + if hashModifiers[1] != 0 { + break + } + } + switch i.versionedHashCase { + case validPointEvalHash: + // do nothing, it is already valid + case invalidPointEvalHash_WrongVersion: + i.VersionedHash[0] ^= hashModifiers[1] + case invalidPointEvalHash_WrongHash: + i.VersionedHash[(hashModifiers[0]%31)+1] ^= hashModifiers[1] + } + + switch i.expectedBlobSizeCase { + case validPointEvalExpectedBlobSize: + i.ExpectedBlobSize = big.NewInt(evmBlockSize) + case invalidPointEvalExpectedBlobSize_Zero: + i.ExpectedBlobSize = big.NewInt(0) + case invalidPointEvalExpectedBlobSize_TooSmall: + i.ExpectedBlobSize, err = rand.Int(rand.Reader, big.NewInt(evmBlockSize)) + if err != nil { + return false, fmt.Errorf("failed to generate random expected blob size: %w", err) + } + case invalidPointEvalExpectedBlobSize_TooLarge: + bound := new(big.Int).Lsh(big.NewInt(1), 128) + i.ExpectedBlobSize, err = rand.Int(rand.Reader, bound) + if err != nil { + return false, fmt.Errorf("failed to generate random expected blob size: %w", err) + } + case invalidPointEvalExpectedBlobSize_TooLargeTwoWords: + bound := new(big.Int).Lsh(big.NewInt(1), 256) + i.ExpectedBlobSize, err = rand.Int(rand.Reader, bound) + if err != nil { + return false, fmt.Errorf("failed to generate random expected blob size: %w", err) + } + } + switch i.expectedBlsModulusCase { + case validPointEvalExpectedModulus: + i.ExpectedBlsModulus = new(big.Int).Set(evmBlsModulus) + case invalidPointEvalExpectedModulus_Zero: + i.ExpectedBlsModulus = big.NewInt(0) + case invalidPointEvalExpectedModulus_TooSmall: + i.ExpectedBlsModulus, err = rand.Int(rand.Reader, evmBlsModulus) + if err != nil { + return false, fmt.Errorf("failed to generate random expected modulus: %w", err) + } + case invalidPointEvalExpectedModulus_TooLarge: + i.ExpectedBlsModulus, err = rand.Int(rand.Reader, evmBlsModulus) + if err != nil { + return false, fmt.Errorf("failed to generate random expected modulus: %w", err) + } + i.ExpectedBlsModulus.Add(i.ExpectedBlsModulus, evmBlsModulus) + } + + // in case the claimed value or evaluation point overflow, we cannot send it to any circuit + if i.evaluationPointCase == invalidPointEvalScalar_Overflow || i.claimedValueCase == invalidPointEvalScalar_Overflow { + return true, nil + } + // we send the input to the success circuit only if the field are valid and we haven't invalidated the result + if slices.Contains(validPointEvalHashes, i.versionedHashCase) && + slices.Contains(validPointEvalScalars, i.evaluationPointCase) && + (i.claimedValueCase == validPointEvalScalar || + (i.claimedValueCase == validPointEvalScalar_Zero && + i.inputType == validPointEvalZero)) && + slices.Contains(validPointEvalG1Elements, i.commitmentCase) && + slices.Contains(validPointEvalG1Elements, i.proofCase) && + slices.Contains(validPointEvalExpectedBlobSizes, i.expectedBlobSizeCase) && + slices.Contains(validPointEvalExpectedModuli, i.expectedBlsModulusCase) && + slices.Contains(validPointEvals, i.inputType) { + i.ToPointEvalCircuit = true + return true, nil + } + // otherwise we send it to the invalid circuit + i.ToPointEvalInvalidCircuit = true + return true, nil +} + +func generatePointEvalInput() iter.Seq2[int, pointEvalInput] { + return func(yield func(int, pointEvalInput) bool) { + var id int + for _, versionedHashCase := range allPointEvalHashes { + for _, evaluationPointCase := range allPointEvalScalars { + for _, claimedValueCase := range allPointEvalScalars { + for _, commitmentCase := range allPointEvalG1Elements { + for _, proofCase := range allPointEvalG1Elements { + for _, expectedBlobSizeCase := range allPointEvalExpectedBlobSizes { + for _, expectedBlsModulusCase := range allPointEvalExpectedModuli { + for _, inputType := range allPointEvals { + input := pointEvalInput{ + versionedHashCase: versionedHashCase, + evaluationPointCase: evaluationPointCase, + claimedValueCase: claimedValueCase, + commitmentCase: commitmentCase, + proofCase: proofCase, + expectedBlobSizeCase: expectedBlobSizeCase, + expectedBlsModulusCase: expectedBlsModulusCase, + inputType: inputType, + } + ok, err := input.generate() + if err != nil { + panic(fmt.Sprintf("failed to generate point evaluation input: %v", err)) + } + if !ok { + continue + } + + if !yield(id, input) { + return + } + id++ + } + } + } + } + } + } + } + } + } +} + +func (i *pointEvalInput) WriteCSV(w *csv.Writer, id int) error { + dataLimbs := slices.Concat( + splitVersionedHashToLimbs(i.VersionedHash), + splitScalarToLimbs(i.EvaluationPoint), + splitScalarToLimbs(i.ClaimedValue), + splitG1CompressedLimbs(i.Commitment), + splitG1CompressedLimbs(i.Proof), + ) + resultLimbs := slices.Concat( + splitScalarToLimbs(i.ExpectedBlobSize), + splitScalarToLimbs(i.ExpectedBlsModulus), + ) + + for index, v := range dataLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), + "1", // DATA + "0", // RSTL + strconv.Itoa(index), // INDEX + strconv.Itoa(index), // CT + "1", // IS_FIRST_INPUT + "0", // IS_SECOND_INPUT + formatBoolAsInt(i.ToPointEvalCircuit), // CIRCUIT_SELECTOR_POINTEVAL + formatBoolAsInt(i.ToPointEvalInvalidCircuit), // CIRCUIT_SELECTOR_POINTEVAL_FAILURE + v, // LIMB + }); err != nil { + return fmt.Errorf("write versioned hash limb: %w", err) + } + index++ + } + for index, v := range resultLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), + "0", // DATA + "1", // RSTL + strconv.Itoa(index), // INDEX + strconv.Itoa(index), // CT + "0", // IS_FIRST_INPUT + "0", // IS_SECOND_INPUT + formatBoolAsInt(i.ToPointEvalCircuit), // CIRCUIT_SELECTOR_POINTEVAL + formatBoolAsInt(i.ToPointEvalInvalidCircuit), // CIRCUIT_SELECTOR_POINTEVAL_FAILURE + v, // LIMB + }); err != nil { + return fmt.Errorf("write expected blob size limb: %w", err) + } + index++ + } + return nil +} + +func headerPointEval() []string { + return []string{ + "ID", + "DATA_POINT_EVALUATION", + "RSLT_POINT_EVALUATION", + "INDEX", + "CT", + "IS_FIRST_INPUT", + "IS_SECOND_INPUT", + "CIRCUIT_SELECTOR_POINT_EVALUATION", + "CIRCUIT_SELECTOR_POINT_EVALUATION_FAILURE", + "LIMB", + } +} + +func mainPointEval() error { + id := 0 + fileNr := 0 + testcases := generatePointEvalInput() + var f *os.File + var w *csv.Writer + var err error + for _, input := range testcases { + if id%nbPointEvalPerOutput == 0 { + if f != nil { + w.Flush() + f.Close() + } + f, err = os.Create(fmt.Sprintf(path_pointeval, fileNr)) + if err != nil { + return fmt.Errorf("create file: %w", err) + } + w = csv.NewWriter(f) + if err := w.Write(headerPointEval()); err != nil { + return fmt.Errorf("write header: %w", err) + } + fileNr++ + } + if err := input.WriteCSV(w, id); err != nil { + return fmt.Errorf("write point evaluation input: %w", err) + } + id++ + } + if f != nil { + w.Flush() + f.Close() + } + return nil +} diff --git a/prover/zkevm/prover/bls/testdata/testdata_generate_pointeval_trusted.go b/prover/zkevm/prover/bls/testdata/testdata_generate_pointeval_trusted.go new file mode 100644 index 0000000000..758af4b79b --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/testdata_generate_pointeval_trusted.go @@ -0,0 +1,147 @@ +package main + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "io" + "os" + "strings" + + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" + kzg_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/kzg" +) + +// copied from gnark/std/evmprecompiles/10-kzg_point_evaluation_test.go. +// The trusted setup is not exported there as it is only used in tests. Current package is +// not imported elsewhere, so the included trusted setup is not embedded in the binary. + +const ( + // locTrustedSetup is the location of the trusted setup file for the KZG precompile. + locTrustedSetup = "kzg_trusted_setup.json" +) + +var srsPk *kzg_bls12381.ProvingKey +var srsVk *kzg_bls12381.VerifyingKey + +func init() { + f, err := os.Open(locTrustedSetup) + if err != nil { + panic(fmt.Sprintf("failed to open trusted setup file: %v", err)) + } + defer f.Close() + setup, err := parseTrustedSetup(f) + if err != nil { + panic(fmt.Sprintf("failed to parse trusted setup: %v", err)) + } + srsPk, err = setup.toProvingKey() + if err != nil { + panic(fmt.Sprintf("failed to convert trusted setup to proving key: %v", err)) + } + srsVk, err = setup.toVerifyingKey() + if err != nil { + panic(fmt.Sprintf("failed to convert trusted setup to verifying key: %v", err)) + } +} + +// trustedSetupJSON represents the trusted setup for the KZG precompile. It is +// used to verify the KZG commitments and openings. The setup is available at +// https://github.com/ethereum/go-ethereum/blob/master/crypto/kzg4844/trusted_setup.json. +// It was generated during the KZG Ceremony. +type trustedSetupJSON struct { + G1 []string `json:"g1_monomial"` + G1Lagrange []string `json:"g1_lagrange"` + G2 []string `json:"g2_monomial"` +} + +// parseTrustedSetup reads the trusted setup from the given reader and returns a +// trustedSetupJSON struct. It validates the setup to ensure it has the correct +// number of elements in G1, G2, and G1Lagrange. The G1 and G1Lagrange arrays +// must have exactly `evmBlockSize` elements, while G2 must have at least 2 +// elements (but in practice has more for future extensibility). If the setup is +// invalid, it returns an error. +func parseTrustedSetup(r io.Reader) (*trustedSetupJSON, error) { + var setup trustedSetupJSON + dec := json.NewDecoder(r) + if err := dec.Decode(&setup); err != nil { + return nil, fmt.Errorf("decode trusted setup: %w", err) + } + if len(setup.G1) == 0 || len(setup.G2) == 0 || len(setup.G1Lagrange) == 0 { + return nil, fmt.Errorf("invalid trusted setup: missing G1 or G2 or G1Lagrange") + } + if len(setup.G1) != evmBlockSize || len(setup.G1Lagrange) != evmBlockSize { + return nil, fmt.Errorf("invalid trusted setup: G1 must have %d elements, got %d", evmBlockSize, len(setup.G1)) + } + return &setup, nil +} + +// toProvingKey converts the trusted setup JSON to a ProvingKey for allowing to +// compute the commitment and opening proof. +func (t *trustedSetupJSON) toProvingKey() (*kzg_bls12381.ProvingKey, error) { + pk := kzg_bls12381.ProvingKey{ + G1: make([]bls12381.G1Affine, len(t.G1)), + } + for i, g1 := range t.G1 { + decoded, err := decodePrefixed(g1) + if err != nil { + return nil, fmt.Errorf("decode G1 element %d: %w", i, err) + } + nbDec, err := pk.G1[i].SetBytes(decoded) + if err != nil { + return nil, fmt.Errorf("set G1 element %d: %w", i, err) + } + if nbDec != len(decoded) { + return nil, fmt.Errorf("set G1 element %d: expected %d bytes, got %d", i, len(decoded), nbDec) + } + } + return &pk, nil +} + +// toVerifyingKey converts the trusted setup JSON to a VerifyingKey for allowing +// to verify the opening proof. +func (t *trustedSetupJSON) toVerifyingKey() (*kzg_bls12381.VerifyingKey, error) { + var vk kzg_bls12381.VerifyingKey + if len(t.G2) < 2 { + return nil, fmt.Errorf("invalid trusted setup: G2 must have at least 2 elements") + } + if len(t.G1) < 1 { + return nil, fmt.Errorf("invalid trusted setup: G1 must have at least 1 element") + } + decoded, err := decodePrefixed(t.G1[0]) + if err != nil { + return nil, fmt.Errorf("decode G1 element 0: %w", err) + } + nbDec, err := vk.G1.SetBytes(decoded) + if err != nil { + return nil, fmt.Errorf("set G1 element 0: %w", err) + } + if nbDec != len(decoded) { + return nil, fmt.Errorf("set G1 element 0: expected %d bytes, got %d", len(decoded), nbDec) + } + for i := range 2 { + decoded, err := decodePrefixed(t.G2[i]) + if err != nil { + return nil, fmt.Errorf("decode G2 element %d: %w", i, err) + } + nbDec, err := vk.G2[i].SetBytes(decoded) + if err != nil { + return nil, fmt.Errorf("set G2 element %d: %w", i, err) + } + if nbDec != len(decoded) { + return nil, fmt.Errorf("set G2 element %d: expected %d bytes, got %d", i, len(decoded), nbDec) + } + vk.Lines[i] = bls12381.PrecomputeLines(vk.G2[i]) + } + return &vk, nil +} + +func decodePrefixed(line string) ([]byte, error) { + if !strings.HasPrefix(line, "0x") { + return nil, fmt.Errorf("invalid prefix in line: %s", line) + } + decoded, err := hex.DecodeString(line[2:]) + if err != nil { + return nil, fmt.Errorf("decode hex string: %w", err) + } + return decoded, nil +} diff --git a/prover/zkevm/prover/bls/testdata/testdata_generate_pointeval_types.go b/prover/zkevm/prover/bls/testdata/testdata_generate_pointeval_types.go new file mode 100644 index 0000000000..e22759044e --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/testdata_generate_pointeval_types.go @@ -0,0 +1,134 @@ +package main + +type pointEvalInputType int +type pointEvalInputHashType int +type pointEvalInputScalarType int +type pointEvalInputG1ElementType int +type pointEvalInputExpectedBlobSizeType int +type pointEvalInputExpectedModulusType int + +const ( + validPointEval pointEvalInputType = iota // claimed value is correct + validPointEvalZero // the polynomial is all zero + invalidPointEval // in case that all inputs are valid but claimed value is incorrect +) + +var validPointEvals = []pointEvalInputType{ + validPointEval, + validPointEvalZero, +} +var invalidPointEvals = []pointEvalInputType{ + invalidPointEval, +} +var allPointEvals = append(validPointEvals, invalidPointEvals...) + +const ( + validPointEvalHash pointEvalInputHashType = iota // valid point evaluation hash + invalidPointEvalHash_WrongVersion // valid point evaluation hash but wrong version + invalidPointEvalHash_WrongHash // wrong hash for the hash of claimed value +) + +var validPointEvalHashes = []pointEvalInputHashType{ + validPointEvalHash, +} +var invalidPointEvalHashes = []pointEvalInputHashType{ + invalidPointEvalHash_WrongVersion, + invalidPointEvalHash_WrongHash, +} +var allPointEvalHashes = append(validPointEvalHashes, invalidPointEvalHashes...) + +const ( + validPointEvalScalar pointEvalInputScalarType = iota // valid point evaluation scalar + validPointEvalScalar_Zero // valid point evaluation scalar but zero + invalidPointEvalScalar_Overflow // invalid point evaluation scalar, overflows. Checked by the arithmetization. +) + +var validPointEvalScalars = []pointEvalInputScalarType{ + validPointEvalScalar, + validPointEvalScalar_Zero, +} +var invalidPointEvalScalars = []pointEvalInputScalarType{invalidPointEvalScalar_Overflow} +var allPointEvalScalars = append(validPointEvalScalars, invalidPointEvalScalars...) + +const ( + validPointEvalG1_ElementSmallY pointEvalInputG1ElementType = iota // valid compressed point with small y + validPointEvalG1_ElementLargeY // valid compressed point with large y + validPointEvalG1_ElementInfinity // valid compressed point at infinity + invalidPointEvalG1_MaskYLarge_YSmall // mask for large y, but encoded small y + invalidPointEvalG1_MaskYSmall_YLarge // mask for small y, but encoded large y + invalidPointEvalG1_MaskInfinity_NotInfinity // mask for infinity, but encoded not infinity + invalidPointEvalG1_MaskSmallY_Infinity // mask for small y, but encoded infinity + invalidPointEvalG1_MaskLargeY_Infinity // mask for large y, but encoded infinity + invalidPointEvalG1_MaskValid_NotInGroup // mask for valid point, but not in the group + invalidPointEvalG1_MaskValid_NotOnCurve // mask for valid point, but not on the curve + invalidPointEvalG1_Mask0b000_Random // mask for invalid mask 0b000, encoded random point + invalidPointEvalG1_Mask0b010_Random // mask for invalid 0b010, encoded random point + invalidPointEvalG1_Mask0b010_Infinity // mask for invalid 0b010, encoded infinity point + invalidPointEvalG1_Mask0b001_Random // mask for invalid 0b001, encoded random point + invalidPointEvalG1_Mask0b001_Infinity // mask for invalid 0b001, encoded infinity point + invalidPointEvalG1_Mask0b011_Random // mask for invalid 0b011, encoded random point + invalidPointEvalG1_Mask0b011_Infinity // mask for invalid 0b011, encoded infinity point + invalidPointEvalG1_Mask0b111_Random // mask for invalid 0b111, encoded random point + invalidPointEvalG1_Mask0b111_Infinity // mask for invalid 0b111, encoded infinity point +) + +var validPointEvalG1Elements = []pointEvalInputG1ElementType{ + validPointEvalG1_ElementSmallY, + validPointEvalG1_ElementLargeY, + validPointEvalG1_ElementInfinity, +} +var invalidPointEvalG1Elements = []pointEvalInputG1ElementType{ + invalidPointEvalG1_MaskYLarge_YSmall, + invalidPointEvalG1_MaskYSmall_YLarge, + invalidPointEvalG1_MaskInfinity_NotInfinity, + invalidPointEvalG1_MaskSmallY_Infinity, + invalidPointEvalG1_MaskLargeY_Infinity, + invalidPointEvalG1_MaskValid_NotInGroup, + invalidPointEvalG1_MaskValid_NotOnCurve, + invalidPointEvalG1_Mask0b000_Random, + invalidPointEvalG1_Mask0b010_Random, + // invalidPointEvalG1_Mask0b010_Infinity, + invalidPointEvalG1_Mask0b001_Random, + // invalidPointEvalG1_Mask0b001_Infinity, + invalidPointEvalG1_Mask0b011_Random, + // invalidPointEvalG1_Mask0b011_Infinity, + invalidPointEvalG1_Mask0b111_Random, + // invalidPointEvalG1_Mask0b111_Infinity, +} +var allPointEvalG1Elements = append(validPointEvalG1Elements, invalidPointEvalG1Elements...) + +const ( + validPointEvalExpectedBlobSize pointEvalInputExpectedBlobSizeType = iota // valid expected blob size + invalidPointEvalExpectedBlobSize_Zero // invalid expected blob size, zero. Checked by arithmetization + invalidPointEvalExpectedBlobSize_TooSmall // invalid expected blob size, too small. Checked by arithmetization + invalidPointEvalExpectedBlobSize_TooLarge // invalid expected blob size, too large. Checked by arithmetization + invalidPointEvalExpectedBlobSize_TooLargeTwoWords // invalid expected blob size, too larg value encoded on two words. Checked by arithmetization +) + +var validPointEvalExpectedBlobSizes = []pointEvalInputExpectedBlobSizeType{ + validPointEvalExpectedBlobSize, +} +var invalidPointEvalExpectedBlobSizes = []pointEvalInputExpectedBlobSizeType{ + // invalidPointEvalExpectedBlobSize_Zero, + // invalidPointEvalExpectedBlobSize_TooSmall, + // invalidPointEvalExpectedBlobSize_TooLarge, + // invalidPointEvalExpectedBlobSize_TooLargeTwoWords, +} +var allPointEvalExpectedBlobSizes = append(validPointEvalExpectedBlobSizes, invalidPointEvalExpectedBlobSizes...) + +const ( + validPointEvalExpectedModulus pointEvalInputExpectedModulusType = iota // valid expected modulus + invalidPointEvalExpectedModulus_Zero // invalid expected modulus, zero. Checked by arithmetization + invalidPointEvalExpectedModulus_TooSmall // invalid expected modulus, too small. Checked by arithmetization + invalidPointEvalExpectedModulus_TooLarge // invalid expected modulus, too large. Checked by arithmetization +) + +var validPointEvalExpectedModuli = []pointEvalInputExpectedModulusType{ + validPointEvalExpectedModulus, +} +var invalidPointEvalExpectedModuli = []pointEvalInputExpectedModulusType{ + // invalidPointEvalExpectedModulus_Zero, + // invalidPointEvalExpectedModulus_TooSmall, + // invalidPointEvalExpectedModulus_TooLarge, +} +var allPointEvalExpectedModuli = append(validPointEvalExpectedModuli, invalidPointEvalExpectedModuli...) diff --git a/prover/zkevm/prover/bls/testdata/testdata_test.go b/prover/zkevm/prover/bls/testdata/testdata_test.go new file mode 100644 index 0000000000..9e12f54bee --- /dev/null +++ b/prover/zkevm/prover/bls/testdata/testdata_test.go @@ -0,0 +1,76 @@ +package main + +import ( + "testing" + + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" +) + +func TestGenerators(t *testing.T) { + // --- trivial + p := generateTrivial[bls12381.G1Affine]() + if !p.IsInfinity() { + t.Errorf("G1 trivial generator is not infinity: %s", p.String()) + } + q := generateTrivial[bls12381.G2Affine]() + if !q.IsInfinity() { + t.Errorf("G2 trivial generator is not infinity: %s", q.String()) + } + // -- valid points + p = generateInSubgroup[bls12381.G1Affine]() + if !p.IsOnCurve() { + t.Errorf("generated G1 point is not on curve: %s", p.String()) + } + if !p.IsInSubGroup() { + t.Errorf("generated G1 point is not in subgroup: %s", p.String()) + } + if p.IsInfinity() { + t.Errorf("generated G1 point is infinity: %s", p.String()) + } + q = generateInSubgroup[bls12381.G2Affine]() + if !q.IsOnCurve() { + t.Errorf("generated G2 point is not on curve: %s", q.String()) + } + if !q.IsInSubGroup() { + t.Errorf("generated G2 point is not in subgroup: %s", q.String()) + } + if q.IsInfinity() { + t.Errorf("generated G2 point is infinity: %s", q.String()) + } + // -- point on curve not in subgroup + p = generateOnCurve[bls12381.G1Affine]() + if !p.IsOnCurve() { + t.Errorf("generated G1 point is not on curve: %s", p.String()) + } + if p.IsInSubGroup() { + t.Errorf("generated G1 point is in subgroup: %s", p.String()) + } + q = generateOnCurve[bls12381.G2Affine]() + if !q.IsOnCurve() { + t.Errorf("generated G2 point is not on curve: %s", q.String()) + } + if q.IsInSubGroup() { + t.Errorf("generated G2 point is in subgroup: %s", q.String()) + } + // -- invalid points + p = generateInvalid[bls12381.G1Affine]() + if p.IsOnCurve() { + t.Errorf("generated G1 point is on curve: %s", p.String()) + } + if p.IsInSubGroup() { + t.Errorf("generated G1 point is in subgroup: %s", p.String()) + } + if p.IsInfinity() { + t.Errorf("generated G1 point is infinity: %s", p.String()) + } + q = generateInvalid[bls12381.G2Affine]() + if q.IsOnCurve() { + t.Errorf("generated G2 point is on curve: %s", q.String()) + } + if q.IsInSubGroup() { + t.Errorf("generated G2 point is in subgroup: %s", q.String()) + } + if q.IsInfinity() { + t.Errorf("generated G2 point is infinity: %s", q.String()) + } +} diff --git a/prover/zkevm/prover/bls/zkevm_modules.go b/prover/zkevm/prover/bls/zkevm_modules.go new file mode 100644 index 0000000000..b968c97958 --- /dev/null +++ b/prover/zkevm/prover/bls/zkevm_modules.go @@ -0,0 +1,37 @@ +package bls + +import ( + "github.com/consensys/linea-monorepo/prover/protocol/wizard" +) + +func NewG1AddZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsAdd { + return newAdd(comp, G1, limits, newAddDataSource(comp, G1)) +} + +func NewG2AddZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsAdd { + return newAdd(comp, G2, limits, newAddDataSource(comp, G2)) +} + +func NewG1MsmZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsMsm { + return newMsm(comp, G1, limits, newMsmDataSource(comp, G1)) +} + +func NewG2MsmZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsMsm { + return newMsm(comp, G2, limits, newMsmDataSource(comp, G2)) +} + +func NewPairingZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsPair { + return newPair(comp, limits, newPairDataSource(comp)) +} + +func NewG1MapZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsMap { + return newMap(comp, G1, limits, newMapDataSource(comp, G1)) +} + +func NewG2MapZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsMap { + return newMap(comp, G2, limits, newMapDataSource(comp, G2)) +} + +func NewPointEvalZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsPointEval { + return newPointEval(comp, limits, newPointEvalDataSource(comp)) +} diff --git a/prover/zkevm/settings.go b/prover/zkevm/settings.go index a435c378f2..eadecb2dda 100644 --- a/prover/zkevm/settings.go +++ b/prover/zkevm/settings.go @@ -3,6 +3,7 @@ package zkevm import ( "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/zkevm/arithmetization" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/bls" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecarith" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecdsa" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecpair" @@ -27,6 +28,7 @@ type Settings struct { Ecadd, Ecmul ecarith.Limits Ecpair ecpair.Limits Sha2 sha2.Settings + Bls bls.Limits PublicInput publicInput.Settings CompilationSuite CompilationSuite Metadata wizard.VersionMetadata diff --git a/prover/zkevm/zkevm.go b/prover/zkevm/zkevm.go index d4b225f8f0..816cd47701 100644 --- a/prover/zkevm/zkevm.go +++ b/prover/zkevm/zkevm.go @@ -5,6 +5,7 @@ import ( "github.com/consensys/linea-monorepo/prover/protocol/serialization" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/zkevm/arithmetization" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/bls" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecarith" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecdsa" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecpair" @@ -45,6 +46,22 @@ type ZkEvm struct { // Sha2 is the module responsible for doing the computation of the Sha2 // precompile. Sha2 *sha2.Sha2SingleProvider `json:"sha2"` + // BlsG1Add is responsible for BLS G1 addition precompile. + BlsG1Add *bls.BlsAdd `json:"blsG1Add"` + // BlsG2Add is responsible for BLS G2 addition precompile. + BlsG2Add *bls.BlsAdd `json:"blsG2Add"` + // BlsG1Msm is responsible for BLS G1 multi-scalar multiplicaton precompile. + BlsG1Msm *bls.BlsMsm `json:"blsG1Msm"` + // BlsG2Msm is responsible for BLS G2 multi-scalar multiplication precompile. + BlsG2Msm *bls.BlsMsm `json:"blsG2Msm"` + // BlsG1Map is responsible for BLS Fp map to G1 precompile. + BlsG1Map *bls.BlsMap `json:"blsG1Map"` + // BlsG2Map is responsible for BLS Fp2 map to G2 precompile. + BlsG2Map *bls.BlsMap `json:"blsG2Map"` + // BlsPairingCheck is responsible for BLS pairing check precompile. + BlsPairingCheck *bls.BlsPair `json:"blsPairingCheck"` + // PointEval is responsible for EIP-4844 point evaluation precompile. + PointEval *bls.BlsPointEval `json:"pointEval"` // Contains the actual wizard-IOP compiled object. This object is called to // generate the inner-proof. WizardIOP *wizard.CompiledIOP `json:"wizardIOP"` @@ -93,17 +110,25 @@ func (z *ZkEvm) VerifyInner(proof wizard.Proof) error { func newZkEVM(b *wizard.Builder, s *Settings) *ZkEvm { var ( - comp = b.CompiledIOP - arith = arithmetization.NewArithmetization(b, s.Arithmetization) - ecdsa = ecdsa.NewEcdsaZkEvm(comp, &s.Ecdsa) - stateManager = statemanager.NewStateManager(comp, s.Statemanager) - keccak = keccak.NewKeccakZkEVM(comp, s.Keccak, ecdsa.GetProviders()) - modexp = modexp.NewModuleZkEvm(comp, s.Modexp) - ecadd = ecarith.NewEcAddZkEvm(comp, &s.Ecadd) - ecmul = ecarith.NewEcMulZkEvm(comp, &s.Ecmul) - ecpair = ecpair.NewECPairZkEvm(comp, &s.Ecpair) - sha2 = sha2.NewSha2ZkEvm(comp, s.Sha2) - publicInput = publicInput.NewPublicInputZkEVM(comp, &s.PublicInput, &stateManager.StateSummary) + comp = b.CompiledIOP + arith = arithmetization.NewArithmetization(b, s.Arithmetization) + ecdsa = ecdsa.NewEcdsaZkEvm(comp, &s.Ecdsa) + stateManager = statemanager.NewStateManager(comp, s.Statemanager) + keccak = keccak.NewKeccakZkEVM(comp, s.Keccak, ecdsa.GetProviders()) + modexp = modexp.NewModuleZkEvm(comp, s.Modexp) + ecadd = ecarith.NewEcAddZkEvm(comp, &s.Ecadd) + ecmul = ecarith.NewEcMulZkEvm(comp, &s.Ecmul) + ecpair = ecpair.NewECPairZkEvm(comp, &s.Ecpair) + sha2 = sha2.NewSha2ZkEvm(comp, s.Sha2) + blsG1Add = bls.NewG1AddZkEvm(comp, &s.Bls) + blsG1Msm = bls.NewG1MsmZkEvm(comp, &s.Bls) + blsG1Map = bls.NewG1MapZkEvm(comp, &s.Bls) + blsG2Add = bls.NewG2AddZkEvm(comp, &s.Bls) + blsG2Msm = bls.NewG2MsmZkEvm(comp, &s.Bls) + blsG2Map = bls.NewG2MapZkEvm(comp, &s.Bls) + blsPairingCheck = bls.NewPairingZkEvm(comp, &s.Bls) + pointEval = bls.NewPointEvalZkEvm(comp, &s.Bls) + publicInput = publicInput.NewPublicInputZkEVM(comp, &s.PublicInput, &stateManager.StateSummary) ) return &ZkEvm{ @@ -116,6 +141,14 @@ func newZkEVM(b *wizard.Builder, s *Settings) *ZkEvm { Ecmul: ecmul, Ecpair: ecpair, Sha2: sha2, + BlsG1Add: blsG1Add, + BlsG2Add: blsG2Add, + BlsG1Msm: blsG1Msm, + BlsG2Msm: blsG2Msm, + BlsG1Map: blsG1Map, + BlsG2Map: blsG2Map, + BlsPairingCheck: blsPairingCheck, + PointEval: pointEval, PublicInput: &publicInput, } } @@ -139,6 +172,14 @@ func (z *ZkEvm) GetMainProverStep(input *Witness) (prover wizard.MainProverStep) z.Ecmul.Assign(run) z.Ecpair.Assign(run) z.Sha2.Run(run) + z.BlsG1Add.Assign(run) + z.BlsG2Add.Assign(run) + z.BlsG1Msm.Assign(run) + z.BlsG2Msm.Assign(run) + z.BlsG1Map.Assign(run) + z.BlsG2Map.Assign(run) + z.BlsPairingCheck.Assign(run) + z.PointEval.Assign(run) z.PublicInput.Assign(run, input.L2BridgeAddress, input.BlockHashList) } } From 67b51ef53e23a225b3007de41ca158687ae42848 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Mon, 24 Nov 2025 12:58:58 +0000 Subject: [PATCH 12/36] feat: P256Verify precompile glue (#1739) commit 7b785704f591f2d2301aace766e0e381b60396c0 Author: Ivo Kubjas Date: Mon Nov 24 12:50:12 2025 +0000 chore: gnark update to master commit 9c191679e5e6ed1860ee5398a4f016a7bfcf6182 Author: Ivo Kubjas Date: Wed Nov 19 03:19:28 2025 +0000 fix: ensure assignment is called commit 03437cf26669b810bd6881e94dc35365eafa7239 Author: Ivo Kubjas Date: Wed Nov 19 02:53:20 2025 +0000 feat: define p256 input instance count commit 1cf0482044dffd68459c580463a7867883484682 Merge: 81d63772a c5117f95f Author: Ivo Kubjas Date: Wed Nov 19 02:50:51 2025 +0000 Merge branch 'feat/bls-glue' into feat/secp256r1 commit c5117f95f1f1ecdbe78b2e670116e0cd977bc0e1 Author: Ivo Kubjas Date: Wed Nov 19 02:48:12 2025 +0000 feat: add default circuit sizes commit 81d63772aedc0d200fdfd88e559179975d20c72c Author: Ivo Kubjas Date: Wed Nov 19 02:47:29 2025 +0000 feat: loat p256 module commit abedf2e598418429293d8dcd2689205f4477539f Author: Ivo Kubjas Date: Wed Nov 19 02:45:28 2025 +0000 fix: correct instance number calculation commit 0aab08d35544611acf90bd4b5356921fcd753cb5 Author: Ivo Kubjas Date: Wed Nov 19 02:44:58 2025 +0000 docs: circuit size commit bdfa261cd8b9d0c4c5dcf94d0de5f61095d88eb9 Author: Ivo Kubjas Date: Wed Nov 19 02:44:24 2025 +0000 chore: gnark update commit 1ae0accec44d19431f03582ff1eef77faf6d7ef9 Author: Ivo Kubjas Date: Tue Nov 18 12:06:59 2025 +0000 docs: refer to test vector location commit 2aa908b465c946f4533bccfcf5a7f4fa1188c4e6 Author: Ivo Kubjas Date: Tue Nov 18 12:05:31 2025 +0000 test: include generated tests commit d4094d38c98e0fc96bfb11fbd6c221ade5beb5c3 Author: Ivo Kubjas Date: Tue Nov 18 12:05:18 2025 +0000 test: implement unit tests commit dae26516a37149da24c38ed33575fcd8349eb05d Author: Ivo Kubjas Date: Tue Nov 18 12:05:05 2025 +0000 test: do not write noop test cases commit 119bd713b83fa5424746b6aedaaf423e6b66275e Author: Ivo Kubjas Date: Tue Nov 18 12:04:38 2025 +0000 feat: implement inputfiller commit 7620614db4939437804b170aff9b9777fec9c155 Author: Ivo Kubjas Date: Tue Nov 18 11:27:39 2025 +0000 test: add testdata generator commit 332f4971ccb8f8831b387cf8d77d3a12a65f3c8d Author: Ivo Kubjas Date: Tue Nov 18 11:27:07 2025 +0000 fix: enforce public vars commit cb05285b84a480fbc8f8448f2a9609a5b095ac93 Author: Ivo Kubjas Date: Mon Nov 17 11:45:14 2025 +0000 chore: implement p256verify glue commit e19129c5cc8f3b8e86c676d824f01314123ebf1e Author: Ivo Kubjas Date: Mon Nov 17 11:44:58 2025 +0000 chore: gnark update commit 439b91138cadcd41a738f3f8097a385978d1d3ff Author: Ivo Kubjas Date: Sun Nov 16 21:08:48 2025 +0000 fix: more unique constraint names commit be09cf79d8fb0f1d1c884c496935e62e881d710b Author: Ivo Kubjas Date: Sun Nov 16 20:52:05 2025 +0000 fix: incorrect limb count for scalar commit 206ee014a61e0f38744994ac20efc133a47e13df Author: Ivo Kubjas Date: Sun Nov 16 20:48:05 2025 +0000 fix: ensure unique constraints commit afbfaee9e3ee70872dfe4b491d6a5c4a00031575 Author: Ivo Kubjas Date: Sun Nov 16 20:43:31 2025 +0000 fix: store new rangechecker commit dd4e1eb257bd7a375f6772c1f49a6f22ca2f7559 Author: Ivo Kubjas Date: Sun Nov 16 20:20:59 2025 +0000 chore: clarify error message commit f76c7c46e3836960f5e31ec13467e76bc71c3c37 Author: Ivo Kubjas Date: Sun Nov 16 20:18:36 2025 +0000 chore: remove excessive logging commit b83d78c6add1c455e3bb4579add803ac01047ee7 Author: Ivo Kubjas Date: Sun Nov 16 20:14:15 2025 +0000 fix: compilation errors commit 6f60e01ad3cb150107ed5a6879d73edf33145eb4 Merge: 5fdb03972 cbf344e13 Author: Ivo Kubjas Date: Sun Nov 16 20:12:33 2025 +0000 Merge branch 'main' into feat/bls-glue commit 5fdb039726a9031eefefdf27ec306aeee188cbbe Author: Ivo Kubjas Date: Fri Sep 26 08:14:18 2025 +0000 test: make source local commit 4d526edd0300f146eab0f1f2733f24d1beb24a26 Author: Ivo Kubjas Date: Mon Sep 29 22:18:09 2025 +0000 feat: integrate BLS precompile with zkevm commit 81a88769d995f780224a79bc3bdce7ba5845cb58 Author: Ivo Kubjas Date: Mon Sep 29 22:17:48 2025 +0000 docs: limits documentation commit a102526835b0abbaaece8e659d82a02df1b83d69 Author: Ivo Kubjas Date: Mon Sep 29 22:17:26 2025 +0000 feat: precise bls source getters commit d312c3d161a23db88ee600f18d4753c221f6ffa8 Author: Ivo Kubjas Date: Mon Sep 29 13:14:35 2025 +0000 test: regenerate testdata commit b392c30ce900044aa4ff7039ae82f154cd459611 Author: Ivo Kubjas Date: Mon Sep 29 11:36:29 2025 +0000 fix: align G2 tower order with gnark commit e823165a8e619f44d93c84003a86ccb04ec82628 Author: Ivo Kubjas Date: Fri Sep 26 13:09:09 2025 +0000 feat: remove circuit number limits commit 152d2a0bee5188adb8e6b229c0159a89e34249ac Author: Ivo Kubjas Date: Wed Sep 24 11:28:54 2025 +0000 test: update included test files commit 3bf1ff6087be1d93f805f0590b2f47d3cf87ce5d Author: Ivo Kubjas Date: Wed Sep 24 10:49:29 2025 +0000 fix: change ordering of serialized values commit c1bb5b6bcd606678ebf3aa74bee966026277015a Author: Ivo Kubjas Date: Thu Sep 18 09:36:56 2025 +0000 chore: go mod tidy commit 9b138df0d01a157f1cbdde06fec5f31a6efc4773 Author: Ivo Kubjas Date: Fri Sep 5 11:37:24 2025 +0000 test: add BLS testdata generator commit 44d925150597f3ebed53178f8fe911cfa9c42469 Author: Ivo Kubjas Date: Tue Sep 2 11:05:12 2025 +0000 test: include minimal number of test files commit 81d4abf18c7d950915841a395dfbcf646cc7b0e1 Author: Ivo Kubjas Date: Fri Aug 29 15:09:24 2025 +0000 feat: add BLS precompile glue commit 6902d280a653c917f9f8a7e4202794c2759eab4d Author: Ivo Kubjas Date: Fri Aug 29 15:09:01 2025 +0000 feat: csvtraces fill up to column size commit ae6bc69b9f0ff0d53a80291fc457959476b52b0d Author: Ivo Kubjas Date: Fri Aug 29 15:07:38 2025 +0000 fix: gnark schema walker field commit 896ba9858725f0ea01e7e3156fa4e8866e9fd8fd Author: Ivo Kubjas Date: Fri Aug 29 15:07:17 2025 +0000 fix: typed builder commit af228c75f4ae28f818d0466b0ac80b132d93bfd2 Author: Ivo Kubjas Date: Fri Aug 29 15:06:50 2025 +0000 fix: remove unused test engine option commit 8bbd5ba8aec4446b5488ff6aca3f63f6a196c97a Author: Ivo Kubjas Date: Fri Aug 29 15:06:38 2025 +0000 fix: gnark logderiv interface change commit 2d1d55ee5305a8047dfbc5163c0324312568d48d Author: Ivo Kubjas Date: Fri Aug 29 15:05:50 2025 +0000 chore: cherry pick gkr changes from smallfield commit b6a374a4913e89bde2434876ec534d12982ddd12 Author: Ivo Kubjas Date: Thu Sep 18 09:35:46 2025 +0000 chore: gnark dependency update --- prover/go.mod | 12 +- prover/go.sum | 24 +- prover/zkevm/full.go | 4 + prover/zkevm/prover/p256verify/circuit.go | 99 + .../zkevm/prover/p256verify/input_filler.go | 34 + prover/zkevm/prover/p256verify/limits.go | 10 + prover/zkevm/prover/p256verify/module.go | 83 + prover/zkevm/prover/p256verify/module_test.go | 71 + .../zkevm/prover/p256verify/testdata/main.go | 249 + .../p256verify/testdata/p256verify_inputs.csv | 7561 +++++++++++++++++ prover/zkevm/settings.go | 2 + prover/zkevm/zkevm.go | 6 + 12 files changed, 8137 insertions(+), 18 deletions(-) create mode 100644 prover/zkevm/prover/p256verify/circuit.go create mode 100644 prover/zkevm/prover/p256verify/input_filler.go create mode 100644 prover/zkevm/prover/p256verify/limits.go create mode 100644 prover/zkevm/prover/p256verify/module.go create mode 100644 prover/zkevm/prover/p256verify/module_test.go create mode 100644 prover/zkevm/prover/p256verify/testdata/main.go create mode 100644 prover/zkevm/prover/p256verify/testdata/p256verify_inputs.csv diff --git a/prover/go.mod b/prover/go.mod index f869118835..94d1718bfe 100644 --- a/prover/go.mod +++ b/prover/go.mod @@ -5,7 +5,7 @@ go 1.24.6 require ( github.com/bits-and-blooms/bitset v1.24.0 github.com/consensys/compress v0.2.5 - github.com/consensys/gnark v0.14.1-0.20251115181224-9c9cf0deb462 + github.com/consensys/gnark v0.14.1-0.20251124124756-6a0918db4556 github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19 github.com/consensys/go-corset v1.1.28 github.com/crate-crypto/go-kzg-4844 v1.1.0 @@ -28,9 +28,9 @@ require ( github.com/spf13/cobra v1.10.1 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.11.1 - golang.org/x/crypto v0.42.0 - golang.org/x/net v0.43.0 - golang.org/x/sync v0.17.0 + golang.org/x/crypto v0.45.0 + golang.org/x/net v0.47.0 + golang.org/x/sync v0.18.0 golang.org/x/time v0.9.0 ) @@ -83,7 +83,7 @@ require ( github.com/x448/float16 v0.8.4 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/text v0.29.0 // indirect + golang.org/x/text v0.31.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) @@ -94,6 +94,6 @@ require ( github.com/pkg/profile v1.7.0 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b - golang.org/x/sys v0.36.0 // indirect + golang.org/x/sys v0.38.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/prover/go.sum b/prover/go.sum index 0ffb726416..a60f7dae24 100644 --- a/prover/go.sum +++ b/prover/go.sum @@ -74,8 +74,8 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/consensys/compress v0.2.5 h1:gJr1hKzbOD36JFsF1AN8lfXz1yevnJi1YolffY19Ntk= github.com/consensys/compress v0.2.5/go.mod h1:pyM+ZXiNUh7/0+AUjUf9RKUM6vSH7T/fsn5LLS0j1Tk= -github.com/consensys/gnark v0.14.1-0.20251115181224-9c9cf0deb462 h1:X2GtytWZIH0PT0g4RfFWu/56Fhus9Uf08cEacDmbN+E= -github.com/consensys/gnark v0.14.1-0.20251115181224-9c9cf0deb462/go.mod h1:y3yL/y4fe6pg5Hakknn5r8ukr19T6l8OZq90+PHVM1o= +github.com/consensys/gnark v0.14.1-0.20251124124756-6a0918db4556 h1:DLtPn4esNLrqdP0FIZJhPu4yxIzvjSPxEkz68c7R/ew= +github.com/consensys/gnark v0.14.1-0.20251124124756-6a0918db4556/go.mod h1:XBV7LkFSZq5AyQhdEN1Y6ntm/QNdu7lnKNvZnh25O7I= github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19 h1:uUbFaofcFwkv5T/zbR/Gyfm06v84Rua9a1xv9VZrPAA= github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19/go.mod h1:OgCH7cSoJ46c+nOzvQuwOrIE9fawpXMYOQFzj22Vy3E= github.com/consensys/go-corset v1.1.28 h1:4vaaIFAWCzEgGTz6YGm8rt7+0F6mHDT8DS2u+WWslFw= @@ -459,8 +459,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -540,8 +540,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -567,8 +567,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -625,8 +625,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -641,8 +641,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/prover/zkevm/full.go b/prover/zkevm/full.go index 927d935348..7b747e01b1 100644 --- a/prover/zkevm/full.go +++ b/prover/zkevm/full.go @@ -23,6 +23,7 @@ import ( "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/keccak" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/sha2" "github.com/consensys/linea-monorepo/prover/zkevm/prover/modexp" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/p256verify" "github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager" "github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/accumulator" ) @@ -250,6 +251,9 @@ func FullZKEVMWithSuite(tl *config.TracesLimits, suite CompilationSuite, cfg *co NbPointEvalInputInstances: NbInputPerInstanceBLSPointEval, NbPointEvalFailureInputInstances: NbInputPerInstanceBLSPointEvalFailure, }, + P256Verify: p256verify.Limits{ + NbInputInstances: NbInputPerInstanceP256Verify, + }, } // Initialize the Full zkEVM arithmetization diff --git a/prover/zkevm/prover/p256verify/circuit.go b/prover/zkevm/prover/p256verify/circuit.go new file mode 100644 index 0000000000..7dff3862c4 --- /dev/null +++ b/prover/zkevm/prover/p256verify/circuit.go @@ -0,0 +1,99 @@ +package p256verify + +import ( + "fmt" + + "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/std/evmprecompiles" + "github.com/consensys/gnark/std/math/bitslice" + "github.com/consensys/gnark/std/math/emulated" + "github.com/consensys/gnark/std/math/emulated/emparams" +) + +const ( + nbBits = 128 // for large-field we use 128-bit limbs both for base and scalar fields + nbBytes = nbBits / 8 + + nbFrLimbs = 2 // P-256 scalar field represented with 2 limbs of 128 bits + nbFpLimbs = 2 // P-256 base field represented with 2 limbs of 128 bits + nbResLimbs = 2 + + nbG1Limbs = 2 * nbFpLimbs // (Ax, Ay) + + nbRows = 3*nbFrLimbs + nbG1Limbs + nbResLimbs // msg +) + +type scalarfield = emparams.P256Fr +type basefield = emparams.P256Fp + +var fpParams basefield +var frParams scalarfield + +type scalarElementWizard struct { + S [nbFrLimbs]frontend.Variable +} + +func (c scalarElementWizard) ToElement(api frontend.API, fr *emulated.Field[scalarfield]) *emulated.Element[scalarfield] { + Slimbs := make([]frontend.Variable, frParams.NbLimbs()) + Slimbs[2], Slimbs[3] = bitslice.Partition(api, c.S[0], 64, bitslice.WithNbDigits(128)) + Slimbs[0], Slimbs[1] = bitslice.Partition(api, c.S[1], 64, bitslice.WithNbDigits(128)) + return fr.NewElement(Slimbs) +} + +type baseElementWizard struct { + P [nbFpLimbs]frontend.Variable +} + +func (c baseElementWizard) ToElement(api frontend.API, fp *emulated.Field[basefield]) *emulated.Element[basefield] { + Plimbs := make([]frontend.Variable, fpParams.NbLimbs()) + Plimbs[2], Plimbs[3] = bitslice.Partition(api, c.P[0], 64, bitslice.WithNbDigits(128)) + Plimbs[0], Plimbs[1] = bitslice.Partition(api, c.P[1], 64, bitslice.WithNbDigits(128)) + return fp.NewElement(Plimbs) +} + +type p256VerifyInstance struct { + H scalarElementWizard `gnark:",public"` + R scalarElementWizard `gnark:",public"` + S scalarElementWizard `gnark:",public"` + Qx baseElementWizard `gnark:",public"` + Qy baseElementWizard `gnark:",public"` + Expected [nbResLimbs]frontend.Variable `gnark:",public"` +} + +type multiP256VerifyInstanceCircuit struct { + Instances []p256VerifyInstance +} + +func (c *multiP256VerifyInstanceCircuit) Define(api frontend.API) error { + scalarApi, err := emulated.NewField[scalarfield](api) + if err != nil { + return fmt.Errorf("new scalar field: %w", err) + } + baseApi, err := emulated.NewField[basefield](api) + if err != nil { + return fmt.Errorf("new base field: %w", err) + } + + nbInstances := len(c.Instances) + for i := 0; i < nbInstances; i++ { + h := c.Instances[i].H.ToElement(api, scalarApi) + r := c.Instances[i].R.ToElement(api, scalarApi) + s := c.Instances[i].S.ToElement(api, scalarApi) + qx := c.Instances[i].Qx.ToElement(api, baseApi) + qy := c.Instances[i].Qy.ToElement(api, baseApi) + // the high limb of the result is always zero + api.AssertIsEqual(c.Instances[i].Expected[0], 0) + // the expected result should be boolean + expected := c.Instances[i].Expected[1] + api.AssertIsBoolean(expected) + res := evmprecompiles.P256Verify(api, h, r, s, qx, qy) + api.AssertIsEqual(res, expected) + } + return nil +} + +func newP256VerifyCircuit(limits *Limits) frontend.Circuit { + return &multiP256VerifyInstanceCircuit{ + Instances: make([]p256VerifyInstance, limits.NbInputInstances), + } +} diff --git a/prover/zkevm/prover/p256verify/input_filler.go b/prover/zkevm/prover/p256verify/input_filler.go new file mode 100644 index 0000000000..d348b50f19 --- /dev/null +++ b/prover/zkevm/prover/p256verify/input_filler.go @@ -0,0 +1,34 @@ +package p256verify + +import ( + "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" +) + +const ( + input_filler_key = "p256-verify-input-filler" +) + +func init() { + plonk.RegisterInputFiller(input_filler_key, inputFiller) +} + +func inputFiller(circuitInstance, inputIndex int) field.Element { + datas := []string{ + // h + "0", "0", + // r + "0", "1", + // s + "0", "1", + // qx + "0x77037d812deb33a0f4a13945d898c296", + "0x6b17d1f2e12c4247f8bce6e563a440f2", + // qy + "0x2bce33576b315ececbb6406837bf51f5", + "0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16", + // expected result + "0", "0", + } + return field.NewFromString(datas[inputIndex%nbRows]) +} diff --git a/prover/zkevm/prover/p256verify/limits.go b/prover/zkevm/prover/p256verify/limits.go new file mode 100644 index 0000000000..11b6b4726f --- /dev/null +++ b/prover/zkevm/prover/p256verify/limits.go @@ -0,0 +1,10 @@ +package p256verify + +// Limits defines limits for P256Verify module. +type Limits struct { + // NbInputInstances is the number of P256 input instances per a single + // verification circuit. gnark circuit size approximately 709k constraints + // and in Plonk-in-Wizard (with externalized range checks) approximately + // 183k rows per instance. + NbInputInstances int +} diff --git a/prover/zkevm/prover/p256verify/module.go b/prover/zkevm/prover/p256verify/module.go new file mode 100644 index 0000000000..dc8e61ffc0 --- /dev/null +++ b/prover/zkevm/prover/p256verify/module.go @@ -0,0 +1,83 @@ +package p256verify + +import ( + "fmt" + + "github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk" + "github.com/consensys/linea-monorepo/prover/protocol/ifaces" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" +) + +const ( + NAME_P256_VERIFY = "P256_VERIFY" + moduleName = "ECDATA" + ROUND_NR = 0 +) + +func colNameFn(colName string) ifaces.ColID { + return ifaces.ColID(fmt.Sprintf("%s.%s", moduleName, colName)) +} + +type p256VerifyDataSource struct { + ID ifaces.Column + CS ifaces.Column + Limb ifaces.Column + Index ifaces.Column + IsData ifaces.Column + IsResult ifaces.Column +} + +func newP256VerifyDataSource(comp *wizard.CompiledIOP) *p256VerifyDataSource { + return &p256VerifyDataSource{ + ID: comp.Columns.GetHandle(colNameFn("ID")), + CS: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_P256_VERIFY")), + Limb: comp.Columns.GetHandle(colNameFn("LIMB")), + Index: comp.Columns.GetHandle(colNameFn("INDEX")), + IsData: comp.Columns.GetHandle(colNameFn("DATA_P256_VERIFY_FLAG")), + IsResult: comp.Columns.GetHandle(colNameFn("RSLT_P256_VERIFY_FLAG")), + } +} + +type P256Verify struct { + *p256VerifyDataSource + p256VerifyGnarkData *plonk.Alignment + *Limits +} + +func newP256Verify(_ *wizard.CompiledIOP, limits *Limits, src *p256VerifyDataSource) *P256Verify { + res := &P256Verify{ + p256VerifyDataSource: src, + Limits: limits, + } + + return res +} + +func (pv *P256Verify) WithCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *P256Verify { + nbRowsPerCircuit := nbRows * pv.Limits.NbInputInstances + maxNbCircuits := (pv.p256VerifyDataSource.CS.Size() + nbRowsPerCircuit - 1) / nbRowsPerCircuit + + toAlign := &plonk.CircuitAlignmentInput{ + Name: fmt.Sprintf("%s_ALIGNMENT", NAME_P256_VERIFY), + Round: ROUND_NR, + DataToCircuitMask: pv.p256VerifyDataSource.CS, + DataToCircuit: pv.p256VerifyDataSource.Limb, + Circuit: newP256VerifyCircuit(pv.Limits), + NbCircuitInstances: maxNbCircuits, + PlonkOptions: options, + InputFillerKey: input_filler_key, + } + pv.p256VerifyGnarkData = plonk.DefineAlignment(comp, toAlign) + return pv +} + +func (pv *P256Verify) Assign(run *wizard.ProverRuntime) { + if pv.p256VerifyGnarkData != nil { + pv.p256VerifyGnarkData.Assign(run) + } +} + +func NewP256VerifyZkEvm(comp *wizard.CompiledIOP, limits *Limits) *P256Verify { + return newP256Verify(comp, limits, newP256VerifyDataSource(comp)) +} diff --git a/prover/zkevm/prover/p256verify/module_test.go b/prover/zkevm/prover/p256verify/module_test.go new file mode 100644 index 0000000000..db23c1fbb9 --- /dev/null +++ b/prover/zkevm/prover/p256verify/module_test.go @@ -0,0 +1,71 @@ +package p256verify + +import ( + "errors" + "os" + "testing" + + "github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy" + "github.com/consensys/linea-monorepo/prover/protocol/query" + "github.com/consensys/linea-monorepo/prover/protocol/wizard" + "github.com/consensys/linea-monorepo/prover/utils/csvtraces" +) + +func testP256Verify(t *testing.T, withCircuit bool, path string, limits *Limits) { + f, err := os.Open(path) + if errors.Is(err, os.ErrNotExist) { + t.Fatal("csv file does not exist, please run `go generate` to generate the test data") + } + if err != nil { + t.Fatal("failed to open csv file", err) + } + defer f.Close() + ct, err := csvtraces.NewCsvTrace(f) + if err != nil { + t.Fatal("failed to create csv trace", err) + } + var p256Verify *P256Verify + cmp := wizard.Compile( + func(b *wizard.Builder) { + p256VerifySource := &p256VerifyDataSource{ + ID: ct.GetCommit(b, "ID"), + CS: ct.GetCommit(b, "CIRCUIT_SELECTOR_P256_VERIFY"), + Limb: ct.GetCommit(b, "LIMB"), + Index: ct.GetCommit(b, "INDEX"), + IsData: ct.GetCommit(b, "DATA_P256_VERIFY_FLAG"), + IsResult: ct.GetCommit(b, "RSLT_P256_VERIFY_FLAG"), + } + p256Verify = newP256Verify(b.CompiledIOP, limits, p256VerifySource) + if withCircuit { + p256Verify = p256Verify. + WithCircuit(b.CompiledIOP, query.PlonkRangeCheckOption(16, 6, true)) + } + }, + dummy.Compile, + ) + + proof := wizard.Prove(cmp, + func(run *wizard.ProverRuntime) { + ct.Assign(run, "ID", "CIRCUIT_SELECTOR_P256_VERIFY", "LIMB", "INDEX", "DATA_P256_VERIFY_FLAG", "RSLT_P256_VERIFY_FLAG") + p256Verify.Assign(run) + }) + + if err := wizard.Verify(cmp, proof); err != nil { + t.Fatal("proof failed", err) + } + t.Log("proof succeeded") +} + +func TestP256VerifyNoCircuit(t *testing.T) { + limits := &Limits{ + NbInputInstances: 6, + } + testP256Verify(t, false, "testdata/p256verify_inputs.csv", limits) +} + +func TestP256VerifyWithCircuit(t *testing.T) { + limits := &Limits{ + NbInputInstances: 6, + } + testP256Verify(t, true, "testdata/p256verify_inputs.csv", limits) +} diff --git a/prover/zkevm/prover/p256verify/testdata/main.go b/prover/zkevm/prover/p256verify/testdata/main.go new file mode 100644 index 0000000000..32c49d2855 --- /dev/null +++ b/prover/zkevm/prover/p256verify/testdata/main.go @@ -0,0 +1,249 @@ +package main + +import ( + "bytes" + "crypto/elliptic" + "encoding/csv" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "log/slog" + "math/big" + "os" + "slices" + "strconv" + + cryptoecdsa "crypto/ecdsa" + + "github.com/consensys/gnark-crypto/ecc/secp256r1" + fp_secp256r1 "github.com/consensys/gnark-crypto/ecc/secp256r1/fp" + fr_secp256r1 "github.com/consensys/gnark-crypto/ecc/secp256r1/fr" +) + +const ( + outputFile = "p256verify_inputs.csv" + // get from https://eips.ethereum.org/assets/eip-7951/test-vectors.json + testvectors = "test-vectors.json" +) + +//go:generate go run main.go +func main() { + logger := slog.Default() + fout, err := os.Create(outputFile) + if err != nil { + logger.Error("failed to create output file", "error", err) + return + } + defer fout.Close() + + ftc, err := os.Open(testvectors) + if err != nil { + logger.Error("failed to open test vectors file", "error", err) + return + } + defer ftc.Close() + + w := csv.NewWriter(fout) + defer w.Flush() + if err := w.Write([]string{ + "ID", + "DATA_P256_VERIFY_FLAG", + "RSLT_P256_VERIFY_FLAG", + "INDEX", + "LIMB", + "CIRCUIT_SELECTOR_P256_VERIFY", + }); err != nil { + logger.Error("failed to write csv headers", "error", err) + return + } + var testcases []vector + dec := json.NewDecoder(ftc) + if err := dec.Decode(&testcases); err != nil { + logger.Error("failed to decode test vectors", "error", err) + return + } + var id int + for _, tc := range testcases { + isValid, h, r, s, qx, qy, err := mockedArithmetization(&tc) + if errors.Is(err, errInputSplit) { + logger.Debug("skipping test case due to input error", "id", tc.Name) + continue + } + tcVerified := expectedBool(tc.Expected) + if err != nil && tcVerified { + // arithmetization said test case failed, but test case indicates success + logger.Error("supposed successful verification but arithmetization failed: %v", err) + return + } + if isValid != tcVerified { + logger.Error("mismatch between arithmetization and test case", "id", tc.Name, "arithmetization", isValid, "testcase", tcVerified) + return + } + if err != nil { + logger.Debug("skipping test case as not going to circuit") + continue + } + toCircuit := "1" + hLimbs := splitBigToLimbs(h) + rLimbs := splitBigToLimbs(r) + sLimbs := splitBigToLimbs(s) + qxLimbs := splitBigToLimbs(qx) + qyLimbs := splitBigToLimbs(qy) + dataLimbs := slices.Concat( + hLimbs, + rLimbs, + sLimbs, + qxLimbs, + qyLimbs, + ) + resLimbs := []string{"0"} + if isValid { + resLimbs = append(resLimbs, "1") + } else { + resLimbs = append(resLimbs, "0") + } + for i, limb := range dataLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), + "1", + "0", + strconv.Itoa(i), + limb, + toCircuit, + }); err != nil { + logger.Error("failed to write csv record", "error", err) + return + } + } + for i, limb := range resLimbs { + if err := w.Write([]string{ + strconv.Itoa(id), + "0", + "1", + strconv.Itoa(i), + limb, + toCircuit, + }); err != nil { + logger.Error("failed to write csv record", "error", err) + return + } + } + id++ + } +} + +func splitBigToLimbs(s *big.Int) []string { + var sb [32]byte + s.FillBytes(sb[:]) + limbs := []string{ + fmt.Sprintf("0x%x", sb[0:16]), + fmt.Sprintf("0x%x", sb[16:32]), + } + return limbs +} + +type vector struct { + Name string `json:"Name,omitempty"` + Input string `json:"Input"` + Expected string `json:"Expected"` +} + +// mockedArithmetization performs the checks what the arithmetization would +// perform. It returns a boolean indicating if the signature is valid or not and +// and an error if the test case would fail already at the arithmetization +// level. +func mockedArithmetization(testcase *vector) (isValid bool, h, r, s, qx, qy *big.Int, err error) { + // arithmetization checks: + // * Input length: Input MUST be exactly 160 bytes !!!! + // * Signature component bounds: Both r and s MUST satisfy 0 < r < n and 0 < s < n !!! + // * Public key bounds: Both qx and qy MUST satisfy 0 ≤ qx < p and 0 ≤ qy < p !!! + // * Point validity: The point (qx, qy) MUST satisfy the curve equation qy^2 ≡ qx^3 + a*qx + b (mod p) !!! + // * Point not at infinity: The point (qx, qy) MUST NOT be the point at infinity (represented as (0, 0)) !!! + + // 1. first check the input length: + h, r, s, qx, qy, err = splitInput160(testcase.Input) + if err != nil { + return + } + // 2. check signature component bounds + modFr := fr_secp256r1.Modulus() + if r.Cmp(big.NewInt(0)) != 1 || r.Cmp(modFr) != -1 { + err = errors.New("r out of bounds") + return + } + if s.Cmp(big.NewInt(0)) != 1 || s.Cmp(modFr) != -1 { + err = errors.New("s out of bounds") + return + } + // 3. check public key bounds + modFp := fp_secp256r1.Modulus() + if qx.Cmp(big.NewInt(0)) == -1 || qx.Cmp(modFp) != -1 { + err = errors.New("qx out of bounds") + return + } + if qy.Cmp(big.NewInt(0)) == -1 || qy.Cmp(modFp) != -1 { + err = errors.New("qy out of bounds") + return + } + // 4. check that point is on the curve + var P secp256r1.G1Affine + P.X.SetBigInt(qx) + P.Y.SetBigInt(qy) + if !P.IsOnCurve() { + err = errors.New("point not on curve") + return + } + // 5. check that point is not at infinity + if P.IsInfinity() { + err = errors.New("point at infinity") + return + } + // if we reached this point, all arithmetization checks passed. Now check + // signature validity + pk := cryptoecdsa.PublicKey{ + Curve: elliptic.P256(), + X: qx, + Y: qy, + } + msgBytes := h.Bytes() + ok := cryptoecdsa.Verify(&pk, msgBytes, r, s) + if !ok { + return + } + isValid = true + return +} + +var errInputSplit = errors.New("input error") + +func splitInput160(hexInput string) (h, r, s, qx, qy *big.Int, err error) { + var raw []byte + raw, err = hex.DecodeString(hexInput) + if err != nil { + err = errInputSplit + // invalid hex encoding + return + } + if len(raw) != 160 { + // invalid length + err = errInputSplit + return + } + h = new(big.Int).SetBytes(raw[0:32]) + r = new(big.Int).SetBytes(raw[32:64]) + s = new(big.Int).SetBytes(raw[64:96]) + qx = new(big.Int).SetBytes(raw[96:128]) + qy = new(big.Int).SetBytes(raw[128:160]) + return +} + +func expectedBool(s string) bool { + raw, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + one := make([]byte, 32) + one[31] = 1 + return bytes.Equal(raw, one) +} diff --git a/prover/zkevm/prover/p256verify/testdata/p256verify_inputs.csv b/prover/zkevm/prover/p256verify/testdata/p256verify_inputs.csv new file mode 100644 index 0000000000..eb06f089bc --- /dev/null +++ b/prover/zkevm/prover/p256verify/testdata/p256verify_inputs.csv @@ -0,0 +1,7561 @@ +ID,DATA_P256_VERIFY_FLAG,RSLT_P256_VERIFY_FLAG,INDEX,LIMB,CIRCUIT_SELECTOR_P256_VERIFY +0,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +0,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +0,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +0,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +0,1,0,4,0x4cd60b855d442f5b3c7b11eb6c4e0ae7,1 +0,1,0,5,0x525fe710fab9aa7c77a67f79e6fadd76,1 +0,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +0,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +0,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +0,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +0,0,1,0,0,1 +0,0,1,1,1,1 +1,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +1,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +1,1,0,2,0xd45c5740946b2a147f59262ee6f5bc90,1 +1,1,0,3,0xbd01ed280528b62b3aed5fc93f06f739,1 +1,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +1,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +1,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +1,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +1,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +1,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +1,0,1,0,0,1 +1,0,1,1,0,1 +2,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +2,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +2,1,0,2,0xd45c5741946b2a137f59262ee6f5bc91,1 +2,1,0,3,0x001af27a5e1117a64733950642a3d1e8,1 +2,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +2,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +2,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +2,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +2,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +2,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +2,0,1,0,0,1 +2,0,1,1,0,1 +3,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +3,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +3,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +3,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +3,1,0,4,0x4cd60b865d442f5a3c7b11eb6c4e0ae7,1 +3,1,0,5,0x9578ec6353a20bf783ecb4b6ea97b825,1 +3,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +3,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +3,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +3,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +3,0,1,0,0,1 +3,0,1,1,0,1 +4,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +4,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +4,1,0,2,0x00000000000000000000000000000000,1 +4,1,0,3,0x00000000000000000000000000000001,1 +4,1,0,4,0x00000000000000000000000000000000,1 +4,1,0,5,0x00000000000000000000000000000001,1 +4,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +4,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +4,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +4,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +4,0,1,0,0,1 +4,0,1,1,0,1 +5,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +5,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +5,1,0,2,0x00000000000000000000000000000000,1 +5,1,0,3,0x00000000000000000000000000000001,1 +5,1,0,4,0xffffffff00000000ffffffffffffffff,1 +5,1,0,5,0xbce6faada7179e84f3b9cac2fc632550,1 +5,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +5,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +5,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +5,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +5,0,1,0,0,1 +5,0,1,1,0,1 +6,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +6,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +6,1,0,2,0xffffffff00000000ffffffffffffffff,1 +6,1,0,3,0xbce6faada7179e84f3b9cac2fc632550,1 +6,1,0,4,0x00000000000000000000000000000000,1 +6,1,0,5,0x00000000000000000000000000000001,1 +6,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +6,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +6,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +6,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +6,0,1,0,0,1 +6,0,1,1,0,1 +7,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +7,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +7,1,0,2,0xffffffff00000000ffffffffffffffff,1 +7,1,0,3,0xbce6faada7179e84f3b9cac2fc632550,1 +7,1,0,4,0xffffffff00000000ffffffffffffffff,1 +7,1,0,5,0xbce6faada7179e84f3b9cac2fc632550,1 +7,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +7,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +7,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +7,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +7,0,1,0,0,1 +7,0,1,1,0,1 +8,1,0,0,0x70239dd877f7c944c422f44dea4ed1a5,1 +8,1,0,1,0x2f2627416faf2f072fa50c772ed6f807,1 +8,1,0,2,0x64a1aab5000d0e804f3e2fc02bdee9be,1 +8,1,0,3,0x8ff312334e2ba16d11547c97711c898e,1 +8,1,0,4,0x6af015971cc30be6d1a206d4e013e099,1 +8,1,0,5,0x7772a2f91d73286ffd683b9bb2cf4f1b,1 +8,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +8,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +8,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +8,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +8,0,1,0,0,1 +8,0,1,1,1,1 +9,1,0,0,0x00000000690ed426ccf17803ebe2bd08,1 +9,1,0,1,0x84bcd58a1bb5e7477ead3645f356e7a9,1 +9,1,0,2,0x16aea964a2f6506d6f78c81c91fc7e8b,1 +9,1,0,3,0xded7d397738448de1e19a0ec580bf266,1 +9,1,0,4,0x252cd762130c6667cfe8b7bc47d27d78,1 +9,1,0,5,0x391e8e80c578d1cd38c3ff033be928e9,1 +9,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +9,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +9,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +9,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +9,0,1,0,0,1 +9,0,1,1,1,1 +10,1,0,0,0x7300000000213f2a525c6035725235c2,1 +10,1,0,1,0xf696ad3ebb5ee47f140697ad25770d91,1 +10,1,0,2,0x9cc98be2347d469bf476dfc26b9b733d,1 +10,1,0,3,0xf2d26d6ef524af917c665baccb23c882,1 +10,1,0,4,0x093496459effe2d8d70727b82462f61d,1 +10,1,0,5,0x0ec1b7847929d10ea631dacb16b56c32,1 +10,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +10,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +10,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +10,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +10,0,1,0,0,1 +10,0,1,1,1,1 +11,1,0,0,0xddf2000000005e0be0635b245f0b9797,1 +11,1,0,1,0x8afd25daadeb3edb4a0161c27fe06045,1 +11,1,0,2,0x73b3c90ecd390028058164524dde8927,1 +11,1,0,3,0x03dce3dea0d53fa8093999f07ab8aa43,1 +11,1,0,4,0x2f67b0b8e20636695bb7d8bf0a651c80,1 +11,1,0,5,0x2ed25a395387b5f4188c0c4075c88634,1 +11,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +11,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +11,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +11,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +11,0,1,0,0,1 +11,0,1,1,1,1 +12,1,0,0,0x67ab1900000000784769c4ecb9e164d6,1 +12,1,0,1,0x642b8499588b89855be1ec355d0841a0,1 +12,1,0,2,0xbfab3098252847b328fadf2f89b95c85,1 +12,1,0,3,0x1a7f0eb390763378f37e90119d5ba3dd,1 +12,1,0,4,0xbdd64e234e832b1067c2d058ccb44d97,1 +12,1,0,5,0x8195ccebb65c2aaf1e2da9b8b4987e3b,1 +12,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +12,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +12,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +12,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +12,0,1,0,0,1 +12,0,1,1,1,1 +13,1,0,0,0xa2bf09460000000076d7dbeffe125eaf,1 +13,1,0,1,0x02095dff252ee905e296b6350fc311cf,1 +13,1,0,2,0x204a9784074b246d8bf8bf04a4ceb1c1,1 +13,1,0,3,0xf1c9aaab168b1596d17093c5cd21d2cd,1 +13,1,0,4,0x51cce41670636783dc06a759c8847868,1 +13,1,0,5,0xa406c2506fe17975582fe648d1d88b52,1 +13,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +13,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +13,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +13,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +13,0,1,0,0,1 +13,0,1,1,1,1 +14,1,0,0,0x3554e827c700000000e1e75e624a06b3,1 +14,1,0,1,0xa0a353171160858129e15c544e4f0e65,1 +14,1,0,2,0xed66dc34f551ac82f63d4aa4f81fe2cb,1 +14,1,0,3,0x0031a91d1314f835027bca0f1ceeaa03,1 +14,1,0,4,0x99ca123aa09b13cd194a422e18d5fda1,1 +14,1,0,5,0x67623c3f6e5d4d6abb8953d67c0c48c7,1 +14,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +14,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +14,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +14,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +14,0,1,0,0,1 +14,0,1,1,1,1 +15,1,0,0,0x9b6cd3b812610000000026941a0f0bb5,1 +15,1,0,1,0x3255ea4c9fd0cb3426e3a54b9fc6965c,1 +15,1,0,2,0x060b700bef665c68899d44f2356a578d,1 +15,1,0,3,0x126b062023ccc3c056bf0f60a237012b,1 +15,1,0,4,0x8d186c027832965f4fcc78a3366ca95d,1 +15,1,0,5,0xedbb410cbef3f26d6be5d581c11d3610,1 +15,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +15,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +15,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +15,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +15,0,1,0,0,1 +15,0,1,1,1,1 +16,1,0,0,0x883ae39f50bf0100000000e7561c26fc,1 +16,1,0,1,0x82a52baa51c71ca877162f93c4ae0186,1 +16,1,0,2,0x9f6adfe8d5eb5b2c24d7aa7934b6cf29,1 +16,1,0,3,0xc93ea76cd313c9132bb0c8e38c96831d,1 +16,1,0,4,0xb26a9c9e40e55ee0890c944cf271756c,1 +16,1,0,5,0x906a33e66b5bd15e051593883b5e9902,1 +16,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +16,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +16,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +16,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +16,0,1,0,0,1 +16,0,1,1,1,1 +17,1,0,0,0xa1ce5d6e5ecaf28b0000000000fa7cd0,1 +17,1,0,1,0x10540f420fb4ff7401fe9fce011d0ba6,1 +17,1,0,2,0xa1af03ca91677b673ad2f33615e56174,1 +17,1,0,3,0xa1abf6da168cebfa8868f4ba273f16b7,1 +17,1,0,4,0x20aa73ffe48afa6435cd258b173d0c23,1 +17,1,0,5,0x77d69022e7d098d75caf24c8c5e06b1c,1 +17,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +17,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +17,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +17,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +17,0,1,0,0,1 +17,0,1,1,1,1 +18,1,0,0,0x8ea5f645f373f5809300000000383453,1 +18,1,0,1,0x97330012a8ee836c5494cdffd5ee8054,1 +18,1,0,2,0xfdc70602766f8eed11a6c99a71c973d5,1 +18,1,0,3,0x659355507b843da6e327a28c11893db9,1 +18,1,0,4,0x3df5349688a085b137b1eacf456a9e9e,1 +18,1,0,5,0x0f6d15ec0078ca60a7f83f2b10d21350,1 +18,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +18,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +18,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +18,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +18,0,1,0,0,1 +18,0,1,1,1,1 +19,1,0,0,0x660570d323e9f75fa734000000008792,1 +19,1,0,1,0xd65ce93eabb7d60d8d9c1bbdcb5ef305,1 +19,1,0,2,0xb516a314f2fce530d6537f6a6c49966c,1 +19,1,0,3,0x23456f63c643cf8e0dc738f7b876e675,1 +19,1,0,4,0xd39ffd033c92b6d717dd536fbc5efdf1,1 +19,1,0,5,0x967c4bd80954479ba66b0120cd16fff2,1 +19,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +19,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +19,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +19,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +19,0,1,0,0,1 +19,0,1,1,1,1 +20,1,0,0,0xd0462673154cce587dde8800000000e9,1 +20,1,0,1,0x8d35f1f45cf9c3bf46ada2de4c568c34,1 +20,1,0,2,0x3b2cbf046eac45842ecb7984d4758315,1 +20,1,0,3,0x82717bebb6492fd0a485c101e29ff0a8,1 +20,1,0,4,0x4c9b7b47a98b0f82de512bc9313aaf51,1 +20,1,0,5,0x701099cac5f76e68c8595fc1c1d99258,1 +20,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +20,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +20,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +20,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +20,0,1,0,0,1 +20,0,1,1,1,1 +21,1,0,0,0xbd90640269a7822680cedfef00000000,1 +21,1,0,1,0x0caef15a6171059ab83e7b4418d7278f,1 +21,1,0,2,0x30c87d35e636f540841f14af54e2f9ed,1 +21,1,0,3,0xd79d0312cfa1ab656c3fb15bfde48dcf,1 +21,1,0,4,0x47c15a5a82d24b75c85a692bd6ecafeb,1 +21,1,0,5,0x71409ede23efd08e0db9abf6340677ed,1 +21,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +21,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +21,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +21,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +21,0,1,0,0,1 +21,0,1,1,1,1 +22,1,0,0,0x33239a52d72f1311512e41222a000000,1 +22,1,0,1,0x00d2dcceb301c54b4beae8e284788a73,1 +22,1,0,2,0x38686ff0fda2cef6bc43b58cfe6647b9,1 +22,1,0,3,0xe2e8176d168dec3c68ff262113760f52,1 +22,1,0,4,0x067ec3b651f422669601662167fa8717,1 +22,1,0,5,0xe976e2db5e6a4cf7c2ddabb3fde9d67d,1 +22,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +22,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +22,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +22,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +22,0,1,0,0,1 +22,0,1,1,1,1 +23,1,0,0,0xb8d64fbcd4a1c10f1365d4e6d95c0000,1 +23,1,0,1,0x00007ee4a21a1cbe1dc84c2d941ffaf1,1 +23,1,0,2,0x44a3e23bf314f2b344fc25c7f2de8b6a,1 +23,1,0,3,0xf3e17d27f5ee844b225985ab6e2775cf,1 +23,1,0,4,0x2d48e223205e98041ddc87be532abed5,1 +23,1,0,5,0x84f0411f5729500493c9cc3f4dd15e86,1 +23,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +23,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +23,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +23,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +23,0,1,0,0,1 +23,0,1,1,1,1 +24,1,0,0,0x01603d3982bf77d7a3fef3183ed09200,1 +24,1,0,1,0x0000003a227420db4088b20fe0e9d84a,1 +24,1,0,2,0x2ded5b7ec8e90e7bf11f967a3d95110c,1 +24,1,0,3,0x41b99db3b5aa8d330eb9d638781688e9,1 +24,1,0,4,0x7d5792c53628155e1bfc46fb1a67e308,1 +24,1,0,5,0x8de049c328ae1f44ec69238a009808f9,1 +24,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +24,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +24,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +24,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +24,0,1,0,0,1 +24,0,1,1,1,1 +25,1,0,0,0x9ea6994f1e0384c8599aa02e6cf66d9c,1 +25,1,0,1,0x000000004d89ef50b7e9eb0cfbff7363,1 +25,1,0,2,0xbdae7bcb580bf335efd3bc3d31870f92,1 +25,1,0,3,0x3eaccafcd40ec2f605976f15137d8b8f,1 +25,1,0,4,0xf6dfa12f19e525270b0106eecfe25749,1 +25,1,0,5,0x9f373a4fb318994f24838122ce7ec3c7,1 +25,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +25,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +25,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +25,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +25,0,1,0,0,1 +25,0,1,1,1,1 +26,1,0,0,0xd03215a8401bcf16693979371a01068a,1 +26,1,0,1,0x4700000000e2fa5bf692bc670905b18c,1 +26,1,0,2,0x50f9c4f0cd6940e162720957ffff5137,1 +26,1,0,3,0x99209b78596956d21ece251c2401f1c6,1 +26,1,0,4,0xd7033a0a787d338e889defaaabb106b9,1 +26,1,0,5,0x5a4355e411a59c32aa5167dfab244726,1 +26,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +26,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +26,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +26,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +26,0,1,0,0,1 +26,0,1,1,1,1 +27,1,0,0,0x307bfaaffb650c889c84bf83f0300e5d,1 +27,1,0,1,0xc87e000000008408fd5f64b582e3bb14,1 +27,1,0,2,0xf612820687604fa01906066a378d6754,1 +27,1,0,3,0x0982e29575d019aabe90924ead5c860d,1 +27,1,0,4,0x3f9367702dd7dd4f75ea98afd20e328a,1 +27,1,0,5,0x1a99f4857b316525328230ce294b0fef,1 +27,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +27,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +27,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +27,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +27,0,1,0,0,1 +27,0,1,1,1,1 +28,1,0,0,0xbab5c4f4df540d7b33324d36bb0c1575,1 +28,1,0,1,0x51527c00000000e4af574bb4d54ea6b8,1 +28,1,0,2,0x9505e407657d6e8bc93db5da7aa6f508,1 +28,1,0,3,0x1f61980c1949f56b0f2f507da5782a7a,1 +28,1,0,4,0xc60d31904e3669738ffbeccab6c3656c,1 +28,1,0,5,0x08e0ed5cb92b3cfa5e7f71784f9c5021,1 +28,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +28,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +28,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +28,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +28,0,1,0,0,1 +28,0,1,1,1,1 +29,1,0,0,0xd4ba47f6ae28f274e4f58d8036f9c36e,1 +29,1,0,1,0xc2456f5b00000000c3b869197ef5e15e,1 +29,1,0,2,0xbbd16fbbb656b6d0d83e6a7787cd691b,1 +29,1,0,3,0x08735aed371732723e1c68a40404517d,1 +29,1,0,4,0x9d8e35dba96028b7787d91315be67587,1 +29,1,0,5,0x7d2d097be5e8ee34560e3e7fd25c0f00,1 +29,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +29,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +29,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +29,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +29,0,1,0,0,1 +29,0,1,1,1,1 +30,1,0,0,0x79fd19c7235ea212f29f1fa00984342a,1 +30,1,0,1,0xfe0f10aafd00000000801e47f8c184e1,1 +30,1,0,2,0x2ec9760122db98fd06ea76848d35a6da,1 +30,1,0,3,0x442d2ceef7559a30cf57c61e92df327e,1 +30,1,0,4,0x7ab271da90859479701fccf86e462ee3,1 +30,1,0,5,0x393fb6814c27b760c4963625c0a19878,1 +30,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +30,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +30,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +30,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +30,0,1,0,0,1 +30,0,1,1,1,1 +31,1,0,0,0x8c291e8eeaa45adbaf9aba5c0583462d,1 +31,1,0,1,0x79cbeb7ac97300000000a37ea6700cda,1 +31,1,0,2,0x54e76b7683b6650baa6a7fc49b1c51ee,1 +31,1,0,3,0xd9ba9dd463221f7a4f1005a89fe00c59,1 +31,1,0,4,0x2ea076886c773eb937ec1cc8374b7915,1 +31,1,0,5,0xcfd11b1c1ae1166152f2f7806a31c8fd,1 +31,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +31,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +31,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +31,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +31,0,1,0,0,1 +31,0,1,1,1,1 +32,1,0,0,0x0eaae8641084fa979803efbfb8140732,1 +32,1,0,1,0xf4cdcf66c3f78a000000003c278a6b21,1 +32,1,0,2,0x5291deaf24659ffbbce6e3c26f602109,1 +32,1,0,3,0x7a74abdbb69be4fb10419c0c496c9466,1 +32,1,0,4,0x65d6fcf336d27cc7cdb982bb4e4ecef5,1 +32,1,0,5,0x827f84742f29f10abf83469270a03dc3,1 +32,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +32,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +32,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +32,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +32,0,1,0,0,1 +32,0,1,1,1,1 +33,1,0,0,0xe02716d01fb23a5a0068399bf01bab42,1 +33,1,0,1,0xef17c6d96e13846c00000000afc0f89d,1 +33,1,0,2,0x207a3241812d75d947419dc58efb05e8,1 +33,1,0,3,0x003b33fc17eb50f9d15166a88479f107,1 +33,1,0,4,0xcdee749f2e492b213ce80b32d0574f62,1 +33,1,0,5,0xf1c5d70793cf55e382d5caadf7592767,1 +33,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +33,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +33,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +33,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +33,0,1,0,0,1 +33,0,1,1,1,1 +34,1,0,0,0x9eb0bf583a1a6b9a194e9a16bc7dab2a,1 +34,1,0,1,0x9061768af89d00659a00000000fc7de1,1 +34,1,0,2,0x6554e49f82a855204328ac94913bf01b,1 +34,1,0,3,0xbe84437a355a0a37c0dee3cf81aa7728,1 +34,1,0,4,0xaea00de2507ddaf5c94e1e126980d3df,1 +34,1,0,5,0x16250a2eaebc8be486effe7f22b4f929,1 +34,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +34,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +34,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +34,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +34,0,1,0,0,1 +34,0,1,1,1,1 +35,1,0,0,0x62aac98818b3b84a2c214f0d5e72ef28,1 +35,1,0,1,0x6e1030cb53d9a82b690e00000000cd15,1 +35,1,0,2,0xa54c5062648339d2bff06f71c88216c2,1 +35,1,0,3,0x6c6e19b4d80a8c602990ac82707efdfc,1 +35,1,0,4,0xe99bbe7fcfafae3e69fd016777517aa0,1 +35,1,0,5,0x1056317f467ad09aff09be73c9731b0d,1 +35,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +35,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +35,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +35,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +35,0,1,0,0,1 +35,0,1,1,1,1 +36,1,0,0,0x3760a7f37cf96218f29ae43732e513ef,1 +36,1,0,1,0xd2b6f552ea4b6895464b9300000000c8,1 +36,1,0,2,0x975bd7157a8d363b309f1f444012b1a1,1 +36,1,0,3,0xd23096593133e71b4ca8b059cff37eaf,1 +36,1,0,4,0x7faa7a28b1c822baa241793f2abc930b,1 +36,1,0,5,0xd4c69840fe090f2aacc46786bf919622,1 +36,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +36,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +36,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +36,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +36,0,1,0,0,1 +36,0,1,1,1,1 +37,1,0,0,0x0da0a1d2851d33023834f2098c088009,1 +37,1,0,1,0x6b4320bea836cd9cbb6ff6c800000000,1 +37,1,0,2,0x5694a6f84b8f875c276afd2ebcfe4d61,1 +37,1,0,3,0xde9ec90305afb1357b95b3e0da43885e,1 +37,1,0,4,0x0dffad9ffd0b757d8051dec02ebdf70d,1 +37,1,0,5,0x8ee2dc5c7870c0823b6ccc7c679cbaa4,1 +37,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +37,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +37,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +37,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +37,0,1,0,0,1 +37,0,1,1,1,1 +38,1,0,0,0xffffffff293886d3086fd567aafd598f,1 +38,1,0,1,0x0fe975f735887194a764a231e82d289a,1 +38,1,0,2,0xa0c30e8026fdb2b4b4968a27d16a6d08,1 +38,1,0,3,0xf7098f1a98d21620d7454ba9790f1ba6,1 +38,1,0,4,0x5e470453a8a399f15baf463f9deceb53,1 +38,1,0,5,0xacc5ca64459149688bd2760c65424339,1 +38,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +38,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +38,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +38,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +38,0,1,0,0,1 +38,0,1,1,1,1 +39,1,0,0,0x7bffffffff2376d1e3c03445a072e243,1 +39,1,0,1,0x26acdc4ce127ec2e0e8d9ca99527e7b7,1 +39,1,0,2,0x614ea84acf736527dd73602cd4bb4eea,1 +39,1,0,3,0x1dfebebd5ad8aca52aa0228cf7b99a88,1 +39,1,0,4,0x737cc85f5f2d2f60d1b8183f3ed490e4,1 +39,1,0,5,0xde14368e96a9482c2a4dd193195c902f,1 +39,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +39,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +39,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +39,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +39,0,1,0,0,1 +39,0,1,1,1,1 +40,1,0,0,0xa2b5ffffffffebb251b085377605a224,1 +40,1,0,1,0xbc80872602a6e467fd016807e97fa395,1 +40,1,0,2,0xbead6734ebe44b810d3fb2ea00b17329,1 +40,1,0,3,0x45377338febfd439a8d74dfbd0f942fa,1 +40,1,0,4,0x6bb18eae36616a7d3cad35919fd21a8a,1 +40,1,0,5,0xf4bbe7a10f73b3e036a46b103ef56e2a,1 +40,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +40,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +40,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +40,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +40,0,1,0,0,1 +40,0,1,1,1,1 +41,1,0,0,0x641227ffffffff6f1b96fa5f097fcf3c,1 +41,1,0,1,0xc1a3c256870d45a67b83d0967d4b20c0,1 +41,1,0,2,0x499625479e161dacd4db9d9ce64854c9,1 +41,1,0,3,0x8d922cbf212703e9654fae182df9bad2,1 +41,1,0,4,0x42c177cf37b8193a0131108d97819edd,1 +41,1,0,5,0x9439936028864ac195b64fca76d9d693,1 +41,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +41,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +41,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +41,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +41,0,1,0,0,1 +41,0,1,1,1,1 +42,1,0,0,0x958415d8ffffffffabad03e2fc662dc3,1 +42,1,0,1,0xba203521177502298df56f36600e0f8b,1 +42,1,0,2,0x08f16b8093a8fb4d66a2c8065b541b3d,1 +42,1,0,3,0x31e3bfe694f6b89c50fb1aaa6ff6c9b2,1 +42,1,0,4,0x9d6455e2d5d1779748573b611cb95d4a,1 +42,1,0,5,0x21f967410399b39b535ba3e5af81ca2e,1 +42,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +42,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +42,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +42,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +42,0,1,0,0,1 +42,0,1,1,1,1 +43,1,0,0,0xf1d8de4858ffffffff1281093536f47f,1 +43,1,0,1,0xe13deb04e1fbe8fb954521b6975420f8,1 +43,1,0,2,0xbe26231b6191658a19dd72ddb99ed8f8,1 +43,1,0,3,0xc579b6938d19bce8eed8dc2b338cb5f8,1 +43,1,0,4,0xe1d9a32ee56cffed37f0f22b2dcb57d5,1 +43,1,0,5,0xc943c14f79694a03b9c5e96952575c89,1 +43,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +43,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +43,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +43,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +43,0,1,0,0,1 +43,0,1,1,1,1 +44,1,0,0,0x0927895f2802ffffffff10782dd14a3b,1 +44,1,0,1,0x32dc5d47c05ef6f1876b95c81fc31def,1 +44,1,0,2,0x15e76880898316b16204ac920a02d580,1 +44,1,0,3,0x45f36a229d4aa4f812638c455abe0443,1 +44,1,0,4,0xe74d357d3fcb5c8c5337bd6aba4178b4,1 +44,1,0,5,0x55ca10e226e13f9638196506a1939123,1 +44,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +44,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +44,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +44,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +44,0,1,0,0,1 +44,0,1,1,1,1 +45,1,0,0,0x60907984aa7e8effffffff4f332862a1,1 +45,1,0,1,0x0a57c3063fb5a30624cf6a0c3ac80589,1 +45,1,0,2,0x352ecb53f8df2c503a45f9846fc28d1d,1 +45,1,0,3,0x31e6307d3ddbffc1132315cc07f16dad,1 +45,1,0,4,0x1348dfa9c482c558e1d05c5242ca1c39,1 +45,1,0,5,0x436726ecd28258b1899792887dd0a3c6,1 +45,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +45,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +45,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +45,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +45,0,1,0,0,1 +45,0,1,1,1,1 +46,1,0,0,0xc6ff198484939170ffffffff0af42cda,1 +46,1,0,1,0x50f9a5f50636ea6942d6b9b8cd6ae1e2,1 +46,1,0,2,0x4a40801a7e606ba78a0da9882ab23c76,1 +46,1,0,3,0x77b8642349ed3d652c5bfa5f2a9558fb,1 +46,1,0,4,0x3a49b64848d682ef7f605f2832f7384b,1 +46,1,0,5,0xdc24ed2925825bf8ea77dc5981725782,1 +46,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +46,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +46,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +46,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +46,0,1,0,0,1 +46,0,1,1,1,1 +47,1,0,0,0xde030419345ca15c75ffffffff807479,1 +47,1,0,1,0x9b9e0956cc43135d16dfbe4d27d7e68d,1 +47,1,0,2,0xeacc5e1a8304a74d2be412b078924b3b,1 +47,1,0,3,0xb3511bac855c05c9e5e9e44df3d61e96,1 +47,1,0,4,0x7451cd8e18d6ed1885dd827714847f96,1 +47,1,0,5,0xec4bb0ed4c36ce9808db8f714204f6d1,1 +47,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +47,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +47,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +47,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +47,0,1,0,0,1 +47,0,1,1,1,1 +48,1,0,0,0x6f0e3eeaf42b28132b88fffffffff6c8,1 +48,1,0,1,0x665604d34acb19037e1ab78caaaac6ff,1 +48,1,0,2,0x2f7a5e9e5771d424f30f67fdab61e8ce,1 +48,1,0,3,0x4f8cd1214882adb65f7de94c31577052,1 +48,1,0,4,0xac4e69808345809b44acb0b2bd889175,1 +48,1,0,5,0xfb75dd050c5a449ab9528f8f78daa10c,1 +48,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +48,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +48,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +48,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +48,0,1,0,0,1 +48,0,1,1,1,1 +49,1,0,0,0xcdb549f773b3e62b3708d1ffffffffbe,1 +49,1,0,1,0x48f7c0591ddcae7d2cb222d1f8017ab9,1 +49,1,0,2,0xffcda40f792ce4d93e7e0f0e95e1a214,1 +49,1,0,3,0x7dddd7f6487621c30a03d710b3300219,1 +49,1,0,4,0x79938b55f8a17f7ed7ba9ade8f2065a1,1 +49,1,0,5,0xfa77618f0b67add8d58c422c2453a49a,1 +49,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +49,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +49,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +49,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +49,0,1,0,0,1 +49,0,1,1,1,1 +50,1,0,0,0x2c3f26f96a3ac0051df4989bffffffff,1 +50,1,0,1,0x9fd64886c1dc4f9924d8fd6f0edb0484,1 +50,1,0,2,0x81f2359c4faba6b53d3e8c8c3fcc16a9,1 +50,1,0,3,0x48350f7ab3a588b28c17603a431e39a8,1 +50,1,0,4,0xcd6f6a5cc3b55ead0ff695d06c6860b5,1 +50,1,0,5,0x09e46d99fccefb9f7f9e101857f74300,1 +50,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +50,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +50,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +50,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +50,0,1,0,0,1 +50,0,1,1,1,1 +51,1,0,0,0xac18f8418c55a2502cb7d53f9affffff,1 +51,1,0,1,0xff5c31d89fda6a6b8476397c04edf411,1 +51,1,0,2,0xdfc8bf520445cbb8ee1596fb073ea283,1 +51,1,0,3,0xea130251a6fdffa5c3f5f2aaf75ca808,1 +51,1,0,4,0x048e33efce147c9dd92823640e338e68,1 +51,1,0,5,0xbfd7d0dc7a4905b3a7ac711e577e90e7,1 +51,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +51,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +51,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +51,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +51,0,1,0,0,1 +51,0,1,1,1,1 +52,1,0,0,0x4f9618f98e2d3a15b24094f72bb5ffff,1 +52,1,0,1,0xffffa2fd3e2893683e5a6ab8cf0ee610,1 +52,1,0,2,0xad019f74c6941d20efda70b46c53db16,1 +52,1,0,3,0x6503a0e393e932f688227688ba6a5762,1 +52,1,0,4,0x93320eb7ca0710255346bdbb3102cdcf,1 +52,1,0,5,0x7964ef2e0988e712bc05efe16c199345,1 +52,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +52,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +52,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +52,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +52,0,1,0,0,1 +52,0,1,1,1,1 +53,1,0,0,0x422e82a3d56ed10a9cc21d31d37a25ff,1 +53,1,0,1,0xffffff67edf7c40204caae73ab0bc75a,1 +53,1,0,2,0xac8096842e8add68c34e78ce11dd71e4,1 +53,1,0,3,0xb54316bd3ebf7fffdeb7bd5a3ebc1883,1 +53,1,0,4,0xf5ca2f4f23d674502d4caf85d187215d,1 +53,1,0,5,0x36e3ce9f0ce219709f21a3aac003b7a8,1 +53,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +53,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +53,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +53,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +53,0,1,0,0,1 +53,0,1,1,1,1 +54,1,0,0,0x7075d245ccc3281b6e7b329ff738fbb4,1 +54,1,0,1,0x17a5ffffffffa0842d9890b5cf95d018,1 +54,1,0,2,0x677b2d3a59b18a5ff939b70ea0022508,1 +54,1,0,3,0x89ddcd7b7b9d776854b4943693fb92f7,1 +54,1,0,4,0x6b4ba856ade7677bf30307b21f3ccda3,1 +54,1,0,5,0x5d2f63aee81efd0bab6972cc0795db55,1 +54,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +54,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +54,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +54,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +54,0,1,0,0,1 +54,0,1,1,1,1 +55,1,0,0,0x3c80de54cd9226989443d593fa4fd659,1 +55,1,0,1,0x7e280ebeffffffffc1847eb76c217a95,1 +55,1,0,2,0x479e1ded14bcaed0379ba8e1b73d3115,1 +55,1,0,3,0xd84d31d4b7c30e1f05e1fc0d5957cfb0,1 +55,1,0,4,0x918f79e35b3d89487cf634a4f05b2e0c,1 +55,1,0,5,0x30857ca879f97c771e877027355b2443,1 +55,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +55,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +55,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +55,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +55,0,1,0,0,1 +55,0,1,1,1,1 +56,1,0,0,0xde21754e29b85601980bef3d697ea277,1 +56,1,0,1,0x0ce891a8cdffffffffc7906aa794b39b,1 +56,1,0,2,0x43dfccd0edb9e280d9a58f01164d55c3,1 +56,1,0,3,0xd711e14b12ac5cf3b64840ead512a0a3,1 +56,1,0,4,0x1dbe33fa8ba84533cd5c4934365b3442,1 +56,1,0,5,0xca1174899b78ef9a3199f49584389772,1 +56,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +56,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +56,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +56,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +56,0,1,0,0,1 +56,0,1,1,1,1 +57,1,0,0,0x8f65d92927cfb86a84dd59623fb531bb,1 +57,1,0,1,0x599e4d5f7289ffffffff2f1f2f57881c,1 +57,1,0,2,0x5b09ab637bd4caf0f4c7c7e4bca592fe,1 +57,1,0,3,0xa20e9087c259d26a38bb4085f0bbff11,1 +57,1,0,4,0x45b7eb467b6748af618e9d80d6fdcd6a,1 +57,1,0,5,0xa24964e5a13f885bca8101de08eb0d75,1 +57,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +57,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +57,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +57,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +57,0,1,0,0,1 +57,0,1,1,1,1 +58,1,0,0,0x6b63e9a74e092120160bea3877dace8a,1 +58,1,0,1,0x2cc7cd0e8426cbfffffffffafc8c3ca8,1 +58,1,0,2,0x5e9b1c5a028070df5728c5c8af9b74e0,1 +58,1,0,3,0x667afa570a6cfa0114a5039ed15ee06f,1 +58,1,0,4,0xb1360907e2d9785ead362bb8d7bd661b,1 +58,1,0,5,0x6c29eeffd3c5037744edaeb9ad990c20,1 +58,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +58,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +58,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +58,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +58,0,1,0,0,1 +58,0,1,1,1,1 +59,1,0,0,0xfc28259702a03845b6d75219444e8b43,1 +59,1,0,1,0xd094586e249c8699ffffffffe852512e,1 +59,1,0,2,0x0671a0a85c2b72d54a2fb0990e34538b,1 +59,1,0,3,0x4890050f5a5712f6d1a7a5fb8578f32e,1 +59,1,0,4,0xdb1846bab6b7361479ab9c3285ca4129,1 +59,1,0,5,0x1808f27fd5bd4fdac720e5854713694c,1 +59,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +59,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +59,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +59,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +59,0,1,0,0,1 +59,0,1,1,1,1 +60,1,0,0,0x1273b4502ea4e3bccee044ee8e8db7f7,1 +60,1,0,1,0x74ecbcd52e8ceb571757ffffffffe20a,1 +60,1,0,2,0x7673f8526748446477dbbb0590a45492,1 +60,1,0,3,0xc5d7d69859d301abbaedb35b2095103a,1 +60,1,0,4,0x3dc70ddf9c6b524d886bed9e6af02e0e,1 +60,1,0,5,0x4dec0d417a414fed3807ef4422913d7c,1 +60,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +60,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +60,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +60,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +60,0,1,0,0,1 +60,0,1,1,1,1 +61,1,0,0,0x08fb565610a79baa0c566c66228d8181,1 +61,1,0,1,0x4f8c53a15b96e602fb49ffffffffff6e,1 +61,1,0,2,0x7f085441070ecd2bb21285089ebb1aa6,1 +61,1,0,3,0x450d1a06c36d3ff39dfd657a796d12b5,1 +61,1,0,4,0x249712012029870a2459d18d47da9aa4,1 +61,1,0,5,0x92a5e6cb4b2d8dafa9e4c5c54a2b9a8b,1 +61,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +61,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +61,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +61,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +61,0,1,0,0,1 +61,0,1,1,1,1 +62,1,0,0,0xd59291cc2cf89f3087715fcb1aa4e79a,1 +62,1,0,1,0xa2403f748e97d7cd28ecaefeffffffff,1 +62,1,0,2,0x914c67fb61dd1e27c867398ea7322d5a,1 +62,1,0,3,0xb76df04bc5aa6683a8e0f30a5d287348,1 +62,1,0,4,0xfa07474031481dda4953e3ac1959ee8c,1 +62,1,0,5,0xea7e66ec412b38d6c96d28f6d37304ea,1 +62,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +62,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +62,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +62,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +62,0,1,0,0,1 +62,0,1,1,1,1 +63,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +63,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +63,1,0,2,0x00000000000000000000000000000000,1 +63,1,0,3,0x4319055358e8617b0c46353d039cdaab,1 +63,1,0,4,0xffffffff00000000ffffffffffffffff,1 +63,1,0,5,0xbce6faada7179e84f3b9cac2fc63254e,1 +63,1,0,6,0x0ad99500288d466940031d72a9f5445a,1 +63,1,0,7,0x4d43784640855bf0a69874d2de5fe103,1 +63,1,0,8,0xc5011e6ef2c42dcd50d5d3d29f99ae6e,1 +63,1,0,9,0xba2c80c9244f4c5422f0979ff0c3ba5e,1 +63,0,1,0,0,1 +63,0,1,1,1,1 +64,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +64,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +64,1,0,2,0xffffffff00000000ffffffffffffffff,1 +64,1,0,3,0xbce6faada7179e84f3b9cac2fc63254f,1 +64,1,0,4,0xffffffff00000000ffffffffffffffff,1 +64,1,0,5,0xbce6faada7179e84f3b9cac2fc63254e,1 +64,1,0,6,0xab05fd9d0de26b9ce6f4819652d9fc69,1 +64,1,0,7,0x193d0aa398f0fba8013e09c582204554,1 +64,1,0,8,0x19235271228c786759095d12b75af069,1 +64,1,0,9,0x2dd4103f19f6a8c32f49435a1e9b8d45,1 +64,0,1,0,0,1 +64,0,1,1,1,1 +65,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +65,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +65,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +65,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +65,1,0,4,0x909135bdb6799286170f5ead2de4f651,1 +65,1,0,5,0x1453fe50914f3df2de54a36383df8dd4,1 +65,1,0,6,0x80984f39a1ff38a86a68aa4201b6be5d,1 +65,1,0,7,0xfbfecf876219710b07badf6fdd4c6c56,1 +65,1,0,8,0x11feb97390d9826e7a06dfb41871c940,1 +65,1,0,9,0xd74415ed3cac2089f1445019bb55ed95,1 +65,0,1,0,0,1 +65,0,1,1,1,1 +66,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +66,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +66,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +66,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +66,1,0,4,0x27b4577ca009376f71303fd5dd227dce,1 +66,1,0,5,0xf5deb773ad5f5a84360644669ca249a5,1 +66,1,0,6,0x4201b4272944201c3294f5baa9a3232b,1 +66,1,0,7,0x6dd687495fcc19a70a95bc602b4f7c05,1 +66,1,0,8,0x95c37eba9ee8171c1bb5ac6feaf753bc,1 +66,1,0,9,0x36f463e3aef16629572c0c0a8fb0800e,1 +66,0,1,0,0,1 +66,0,1,1,1,1 +67,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +67,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +67,1,0,2,0x00000000000000000000000000000000,1 +67,1,0,3,0x00000000000000000000000000000005,1 +67,1,0,4,0x00000000000000000000000000000000,1 +67,1,0,5,0x00000000000000000000000000000001,1 +67,1,0,6,0xa71af64de5126a4a4e02b7922d66ce94,1 +67,1,0,7,0x15ce88a4c9d25514d91082c8725ac957,1 +67,1,0,8,0x5d47723c8fbe580bb369fec9c2665d8e,1 +67,1,0,9,0x30a435b9932645482e7c9f11e872296b,1 +67,0,1,0,0,1 +67,0,1,1,1,1 +68,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +68,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +68,1,0,2,0x00000000000000000000000000000000,1 +68,1,0,3,0x00000000000000000000000000000005,1 +68,1,0,4,0x00000000000000000000000000000000,1 +68,1,0,5,0x00000000000000000000000000000003,1 +68,1,0,6,0x6627cec4f0731ea23fc2931f90ebe5b7,1 +68,1,0,7,0x572f597d20df08fc2b31ee8ef16b1572,1 +68,1,0,8,0x6170ed77d8d0a14fc5c9c3c4c9be7f0d,1 +68,1,0,9,0x3ee18f709bb275eaf2073e258fe694a5,1 +68,0,1,0,0,1 +68,0,1,1,1,1 +69,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +69,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +69,1,0,2,0x00000000000000000000000000000000,1 +69,1,0,3,0x00000000000000000000000000000005,1 +69,1,0,4,0x00000000000000000000000000000000,1 +69,1,0,5,0x00000000000000000000000000000005,1 +69,1,0,6,0x5a7c8825e85691cce1f5e7544c54e73f,1 +69,1,0,7,0x14afc010cb731343262ca7ec5a77f5bf,1 +69,1,0,8,0xef6edf62a4497c1bd7b147fb6c3d22af,1 +69,1,0,9,0x3c39bfce95f30e13a16d3d7b2812f813,1 +69,0,1,0,0,1 +69,0,1,1,1,1 +70,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +70,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +70,1,0,2,0x00000000000000000000000000000000,1 +70,1,0,3,0x00000000000000000000000000000005,1 +70,1,0,4,0x00000000000000000000000000000000,1 +70,1,0,5,0x00000000000000000000000000000006,1 +70,1,0,6,0xcbe0c29132cd738364fedd603152990c,1 +70,1,0,7,0x048e5e2fff996d883fa6caca7978c737,1 +70,1,0,8,0x70af6a8ce44cb41224b2603606f4c04d,1 +70,1,0,9,0x188e80bff7cc31ad5189d4ab0d70e8c1,1 +70,0,1,0,0,1 +70,0,1,1,1,1 +71,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +71,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +71,1,0,2,0x00000000000000000000000000000000,1 +71,1,0,3,0x00000000000000000000000000000100,1 +71,1,0,4,0x8f1e3c7862c58b16bb76eddbb76eddbb,1 +71,1,0,5,0x516af4f63f2d74d76e0d28c9bb75ea88,1 +71,1,0,6,0xd0f73792203716afd4be4329faa48d26,1 +71,1,0,7,0x9f15313ebbba379d7783c97bf3e890d9,1 +71,1,0,8,0x971f4a3206605bec21782bf5e275c714,1 +71,1,0,9,0x417e8f566549e6bc68690d2363c89cc1,1 +71,0,1,0,0,1 +71,0,1,1,1,1 +72,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +72,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +72,1,0,2,0x00000000000000000000000000000000,1 +72,1,0,3,0x0000000000000000002d9b4d347952d6,1 +72,1,0,4,0xef3043e7329581dbb3974497710ab115,1 +72,1,0,5,0x05ee1c87ff907beebadd195a0ffe6d7a,1 +72,1,0,6,0x4838b2be35a6276a80ef9e228140f9d9,1 +72,1,0,7,0xb96ce83b7a254f71ccdebbb8054ce05f,1 +72,1,0,8,0xfa9cbc123c919b19e00238198d040690,1 +72,1,0,9,0x43bd660a828814051fcb8aac738a6c6b,1 +72,0,1,0,0,1 +72,0,1,1,1,1 +73,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +73,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +73,1,0,2,0x00000000000000000000000000000000,1 +73,1,0,3,0x0000001033e67e37b32b445580bf4eff,1 +73,1,0,4,0x8b748b74000000008b748b748b748b74,1 +73,1,0,5,0x66e769ad4a16d3dcd87129b8e91d1b4d,1 +73,1,0,6,0x7393983ca30a520bbc4783dc9960746a,1 +73,1,0,7,0xab444ef520c0a8e771119aa4e74b0f64,1 +73,1,0,8,0xe9d7be1ab01a0bf626e709863e6a486d,1 +73,1,0,9,0xbaf32793afccf774e2c6cd27b1857526,1 +73,0,1,0,0,1 +73,0,1,1,1,1 +74,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +74,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +74,1,0,2,0x00000000000000000000000000000000,1 +74,1,0,3,0x00000000000000000000000000000100,1 +74,1,0,4,0xef9f6ba4d97c09d03178fa20b4aaad83,1 +74,1,0,5,0xbe3cf9cb824a879fec3270fc4b81ef5b,1 +74,1,0,6,0x5ac331a1103fe966697379f356a937f3,1 +74,1,0,7,0x50588a05477e308851b8a502d5dfcdc5,1 +74,1,0,8,0xfe9993df4b57939b2b8da095bf6d7942,1 +74,1,0,9,0x65204cfe03be995a02e65d408c871c0b,1 +74,0,1,0,0,1 +74,0,1,1,1,1 +75,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +75,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +75,1,0,2,0x00000000000000000000000000000000,1 +75,1,0,3,0x000000062522bbd3ecbe7c39e93e7c25,1 +75,1,0,4,0xef9f6ba4d97c09d03178fa20b4aaad83,1 +75,1,0,5,0xbe3cf9cb824a879fec3270fc4b81ef5b,1 +75,1,0,6,0x1d209be8de2de877095a399d3904c74c,1 +75,1,0,7,0xc458d926e27bb8e58e5eae5767c41509,1 +75,1,0,8,0xdd59e04c214f7b18dce351fc2a549893,1 +75,1,0,9,0xa6860e80163f38cc60a4f2c9d040d8c9,1 +75,0,1,0,0,1 +75,0,1,1,1,1 +76,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +76,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +76,1,0,2,0xffffffff00000000ffffffffffffffff,1 +76,1,0,3,0xbce6faada7179e84f3b9cac2fc6324d5,1 +76,1,0,4,0x55555555000000005555555555555555,1 +76,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +76,1,0,6,0x083539fbee44625e3acaafa2fcb41349,1 +76,1,0,7,0x392cef0633a1b8fabecee0c133b10e99,1 +76,1,0,8,0x915c1ebe7bf00df8535196770a58047a,1 +76,1,0,9,0xe2a402f26326bb7d41d4d7616337911e,1 +76,0,1,0,0,1 +76,0,1,1,1,1 +77,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +77,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +77,1,0,2,0x55555555000000005555555555555555,1 +77,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +77,1,0,4,0x00000000000000000000000000000000,1 +77,1,0,5,0x00000000000000000000000000000001,1 +77,1,0,6,0x8aeb368a7027a4d64abdea37390c0c1d,1 +77,1,0,7,0x6a26f399e2d9734de1eb3d0e19373874,1 +77,1,0,8,0x05bd13834715e1dbae9b875cf07bd55e,1 +77,1,0,9,0x1b6691c7f7536aef3b19bf7a4adf576d,1 +77,0,1,0,0,1 +77,0,1,1,1,1 +78,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +78,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +78,1,0,2,0x7fffffff800000007fffffffffffffff,1 +78,1,0,3,0xde737d56d38bcf4279dce5617e3192a8,1 +78,1,0,4,0x55555555000000005555555555555555,1 +78,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +78,1,0,6,0xb533d4695dd5b8c5e07757e55e6e516f,1 +78,1,0,7,0x7e2c88fa0239e23f60e8ec07dd70f287,1 +78,1,0,8,0x1b134ee58cc583278456863f33c3a85d,1 +78,1,0,9,0x881f7d4a39850143e29d4eaf009afe47,1 +78,0,1,0,0,1 +78,0,1,1,0,1 +79,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +79,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +79,1,0,2,0x7fffffff800000007fffffffffffffff,1 +79,1,0,3,0xde737d56d38bcf4279dce5617e3192a9,1 +79,1,0,4,0x7fffffff800000007fffffffffffffff,1 +79,1,0,5,0xde737d56d38bcf4279dce5617e3192a8,1 +79,1,0,6,0xf50d371b91bfb1d7d14e1323523bc3aa,1 +79,1,0,7,0x8cbf2c57f9e284de628c8b4536787b86,1 +79,1,0,8,0xf94ad887ac94d527247cd2e7d0c8b129,1 +79,1,0,9,0x1c553c9730405380b14cbb209f5fa2dd,1 +79,0,1,0,0,1 +79,0,1,1,1,1 +80,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +80,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +80,1,0,2,0x7fffffff800000007fffffffffffffff,1 +80,1,0,3,0xde737d56d38bcf4279dce5617e3192a9,1 +80,1,0,4,0x7fffffff800000007fffffffffffffff,1 +80,1,0,5,0xde737d56d38bcf4279dce5617e3192a9,1 +80,1,0,6,0x68ec6e298eafe16539156ce57a14b04a,1 +80,1,0,7,0x7047c221bafc3a582eaeb0d857c4d946,1 +80,1,0,8,0x97bed1af17850117fdb39b2324f220a5,1 +80,1,0,9,0x698ed16c426a27335bb385ac8ca6fb30,1 +80,0,1,0,0,1 +80,0,1,1,1,1 +81,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +81,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +81,1,0,2,0x55555555000000005555555555555555,1 +81,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +81,1,0,4,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +81,1,0,5,0x0036e7c32b270c8807a419feca605023,1 +81,1,0,6,0x69da0364734d2e530fece94019265fef,1 +81,1,0,7,0xb781a0f1b08f6c8897bdf6557927c8b8,1 +81,1,0,8,0x66d2d3c7dcd518b23d726960f069ad71,1 +81,1,0,9,0xa933d86ef8abbcce8b20f71e2a847002,1 +81,0,1,0,0,1 +81,0,1,1,1,1 +82,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +82,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +82,1,0,2,0x55555555000000005555555555555555,1 +82,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +82,1,0,4,0x44a5ad0ad0636d9f12bc9e0a6bdd5e1c,1 +82,1,0,5,0xbcb012ea7bf091fcec15b0c43202d52e,1 +82,1,0,6,0xd8adc00023a8edc02576e2b63e3e3062,1 +82,1,0,7,0x1a471e2b2320620187bf067a1ac1ff32,1 +82,1,0,8,0x33e2b50ec09807accb36131fff95ed12,1 +82,1,0,9,0xa09a86b4ea9690aa32861576ba2362e1,1 +82,0,1,0,0,1 +82,0,1,1,1,1 +83,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +83,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +83,1,0,2,0x55555555000000005555555555555555,1 +83,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +83,1,0,4,0x55555555000000005555555555555555,1 +83,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +83,1,0,6,0x3623ac973ced0a56fa6d882f03a7d5c7,1 +83,1,0,7,0xedca02cfc7b2401fab3690dbe75ab785,1 +83,1,0,8,0x8db06908e64b28613da7257e737f3979,1 +83,1,0,9,0x3da8e713ba0643b92e9bb3252be7f8fe,1 +83,0,1,0,0,1 +83,0,1,1,1,1 +84,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +84,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +84,1,0,2,0x55555555000000005555555555555555,1 +84,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +84,1,0,4,0xaaaaaaaa00000000aaaaaaaaaaaaaaaa,1 +84,1,0,5,0x7def51c91a0fbf034d26872ca84218e1,1 +84,1,0,6,0xcf04ea77e9622523d894b93ff52dc302,1 +84,1,0,7,0x7b31959503b6fa3890e5e04263f922f1,1 +84,1,0,8,0xe8528fb7c006b3983c8b8400e57b4ed7,1 +84,1,0,9,0x1740c2f3975438821199bedeaecab2e9,1 +84,0,1,0,0,1 +84,0,1,1,1,1 +85,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +85,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +85,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +85,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +85,1,0,4,0xe91e1ba60fdedb76a46bcb51dc0b8b4b,1 +85,1,0,5,0x7e019f0a28721885fa5d3a8196623397,1 +85,1,0,6,0xdb7a2c8a1ab573e5929dc24077b508d7,1 +85,1,0,7,0xe683d49227996bda3e9f78dbeff77350,1 +85,1,0,8,0x4f417f3bc9a88075c2e0aadd5a133117,1 +85,1,0,9,0x30cf7cc76a82f11a36eaf08a6c99a206,1 +85,0,1,0,0,1 +85,0,1,1,1,1 +86,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +86,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +86,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +86,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +86,1,0,4,0xfdea5843ffeb73af94313ba4831b53fe,1 +86,1,0,5,0x24f799e525b1e8e8c87b59b95b430ad9,1 +86,1,0,6,0xdead11c7a5b396862f21974dc4752fad,1 +86,1,0,7,0xeff994efe9bbd05ab413765ea80b6e1f,1 +86,1,0,8,0x1de3f0640e8ac6edcf89cff53c40e265,1 +86,1,0,9,0xbb94078a343736df07aa0318fc7fe1ff,1 +86,0,1,0,0,1 +86,0,1,1,1,1 +87,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +87,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +87,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +87,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +87,1,0,4,0x03ffcabf2f1b4d2a65190db1680d62bb,1 +87,1,0,5,0x994e41c5251cd73b3c3dfc5e5bafc035,1 +87,1,0,6,0xd0bc472e0d7c81ebaed3a6ef96c18613,1 +87,1,0,7,0xbb1fea6f994326fbe80e00dfde67c7e9,1 +87,1,0,8,0x986c723ea4843d48389b946f64ad56c8,1 +87,1,0,9,0x3ad70ff17ba85335667d1bb9fa619efd,1 +87,0,1,0,0,1 +87,0,1,1,1,1 +88,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +88,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +88,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +88,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +88,1,0,4,0x4dfbc401f971cd304b33dfdb17d0fed0,1 +88,1,0,5,0xfe4c1a88ae648e0d2847f74977534989,1 +88,1,0,6,0xa0a44ca947d66a2acb736008b9c08d1a,1 +88,1,0,7,0xb2ad03776e02640f78495d458dd51c32,1 +88,1,0,8,0x6337fe5cf8c4604b1f1c409dc2d872d4,1 +88,1,0,9,0x294a4762420df43a30a2392e40426add,1 +88,0,1,0,0,1 +88,0,1,1,1,1 +89,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +89,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +89,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +89,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +89,1,0,4,0xbc4024761cd2ffd43dfdb17d0fed112b,1 +89,1,0,5,0x988977055cd3a8e54971eba9cda5ca71,1 +89,1,0,6,0xc9c2115290d008b45fb65fad0f602389,1 +89,1,0,7,0x298c25420b775019d42b62c3ce8a96b7,1 +89,1,0,8,0x3877d25a8080dc02d987ca730f0405c2,1 +89,1,0,9,0xc9dbefac46f9e601cc3f06e9713973fd,1 +89,0,1,0,0,1 +89,0,1,1,1,1 +90,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +90,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +90,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +90,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +90,1,0,4,0x788048ed39a5ffa77bfb62fa1fda2257,1 +90,1,0,5,0x742bf35d128fb3459f2a0c909ee86f91,1 +90,1,0,6,0x5eca1ef4c287dddc66b8bccf1b88e8a2,1 +90,1,0,7,0x4c0018962f3c5e7efa83bc1a5ff6033e,1 +90,1,0,8,0x5e79c4cb2c245b8c45abdce8a8e4da75,1 +90,1,0,9,0x8d92a607c32cd407ecaef22f1c934a71,1 +90,0,1,0,0,1 +90,0,1,1,1,1 +91,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +91,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +91,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +91,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +91,1,0,4,0x476d9131fd381bd917d0fed112bc9e0a,1 +91,1,0,5,0x5924b5ed5b11167edd8b23582b3cb15e,1 +91,1,0,6,0x5caaa030e7fdf0e4936bc7ab5a96353e,1 +91,1,0,7,0x0a01e4130c3f8bf22d473e317029a47a,1 +91,1,0,8,0xdeb6adc462f7058f2a20d371e9702254,1 +91,1,0,9,0xe9b201642005b3ceda926b42b178bef9,1 +91,0,1,0,0,1 +91,0,1,1,1,1 +92,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +92,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +92,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +92,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +92,1,0,4,0x8374253e3e21bd154448d0a8f640fe46,1 +92,1,0,5,0xfafa8b19ce78d538f6cc0a19662d3601,1 +92,1,0,6,0xc2fd20bac06e555bb8ac0ce69eb1ea20,1 +92,1,0,7,0xf83a1fc3501c8a66469b1a31f619b098,1 +92,1,0,8,0x6237050779f52b615bd7b8d76a25fc95,1 +92,1,0,9,0xca2ed32525c75f27ffc87ac397e6cbaf,1 +92,0,1,0,0,1 +92,0,1,1,1,1 +93,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +93,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +93,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +93,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +93,1,0,4,0x357cfd3be4d01d413c5b9ede36cba545,1 +93,1,0,5,0x2c11ee7fe14879e749ae6a2d897a52d6,1 +93,1,0,6,0x3fd6a1ca7f77fb3b0bbe726c37201006,1 +93,1,0,7,0x8426e11ea6ae78ce17bedae4bba86ced,1 +93,1,0,8,0x03ce5516406bf8cfaab8745eac1cd690,1 +93,1,0,9,0x18ad6f50b5461872ddfc56e0db3c8ff4,1 +93,0,1,0,0,1 +93,0,1,1,1,1 +94,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +94,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +94,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +94,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +94,1,0,4,0x29798c5c0ee287d4a5e8e6b799fd86b8,1 +94,1,0,5,0xdf5225298e6ffc807cd2f2bc27a0a6d8,1 +94,1,0,6,0x9cb8e51e27a5ae3b624a60d6dc32734e,1 +94,1,0,7,0x4989db20e9bca3ede1edf7b086911114,1 +94,1,0,8,0xb4c104ab3c677e4b36d6556e8ad5f523,1 +94,1,0,9,0x410a19f2e277aa895fc57322b4427544,1 +94,0,1,0,0,1 +94,0,1,1,1,1 +95,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +95,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +95,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +95,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +95,1,0,4,0x0b70f22c781092452dca1a5711fa3a5a,1 +95,1,0,5,0x1f72add1bf52c2ff7cae4820b30078dd,1 +95,1,0,6,0xa3e52c156dcaf10502620b7955bc2b40,1 +95,1,0,7,0xbc78ef3d569e1223c262512d8f49602a,1 +95,1,0,8,0x4a2039f31c1097024ad3cc86e57321de,1 +95,1,0,9,0x032355463486164cf192944977df147f,1 +95,0,1,0,0,1 +95,0,1,1,1,1 +96,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +96,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +96,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +96,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +96,1,0,4,0x16e1e458f021248a5b9434ae23f474b4,1 +96,1,0,5,0x3ee55ba37ea585fef95c90416600f1ba,1 +96,1,0,6,0xf19b78928720d5bee8e670fb90010fb1,1 +96,1,0,7,0x5c37bf91b58a5157c3f3c059b2655e88,1 +96,1,0,8,0xcf701ec962fb4a11dcf273f5dc357e58,1 +96,1,0,9,0x468560c7cfeb942d074abd4329260509,1 +96,0,1,0,0,1 +96,0,1,1,1,1 +97,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +97,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +97,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +97,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +97,1,0,4,0x2252d6856831b6cf895e4f0535eeaf0e,1 +97,1,0,5,0x5e5809753df848fe760ad86219016a97,1 +97,1,0,6,0x83a744459ecdfb01a5cf52b27a05bb73,1 +97,1,0,7,0x37482d242f235d7b4cb89345545c90a8,1 +97,1,0,8,0xc05d49337b9649813287de9ffe90355f,1 +97,1,0,9,0xd905df5f3c32945828121f37cc50de6e,1 +97,0,1,0,0,1 +97,0,1,1,1,1 +98,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +98,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +98,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +98,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +98,1,0,4,0x81ffe55f178da695b28c86d8b406b15d,1 +98,1,0,5,0xab1a9e39661a3ae017fbe390ac0972c3,1 +98,1,0,6,0xdd13c6b34c56982ddae124f039dfd23f,1 +98,1,0,7,0x4b19bbe88cee8e528ae51e5d6f3a21d7,1 +98,1,0,8,0xbfad4c2e6f263fe5eb59ca974d039fc0,1 +98,1,0,9,0xe4c3345692fb5320bdae4bd3b42a45ff,1 +98,0,1,0,0,1 +98,0,1,1,1,1 +99,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +99,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +99,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +99,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +99,1,0,4,0x7fffffffaaaaaaaaffffffffffffffff,1 +99,1,0,5,0xe9a2538f37b28a2c513dee40fecbb71a,1 +99,1,0,6,0x67e6f659cdde869a2f65f094e94e5b4d,1 +99,1,0,7,0xfad636bbf95192feeed01b0f3deb7460,1 +99,1,0,8,0xa37e0a51f258b7aeb51dfe592f5cfd56,1 +99,1,0,9,0x85bbe58712c8d9233c62886437c38ba0,1 +99,0,1,0,0,1 +99,0,1,1,1,1 +100,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +100,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +100,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +100,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +100,1,0,4,0xb62f26b5f2a2b26f6de86d42ad8a13da,1 +100,1,0,5,0x3ab3cccd0459b201de009e526adf21f2,1 +100,1,0,6,0x2eb6412505aec05c6545f029932087e4,1 +100,1,0,7,0x90d05511e8ec1f599617bb367f9ecaaf,1 +100,1,0,8,0x805f51efcc4803403f9b1ae0124890f0,1 +100,1,0,9,0x6a43fedcddb31830f6669af292895cb0,1 +100,0,1,0,0,1 +100,0,1,1,1,1 +101,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +101,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +101,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +101,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +101,1,0,4,0xbb1d9ac949dd748cd02bbbe749bd351c,1 +101,1,0,5,0xd57b38bb61403d700686aa7b4c90851e,1 +101,1,0,6,0x84db645868eab35e3a9fd80e056e2e85,1 +101,1,0,7,0x5435e3a6b68d75a50a854625fe0d7f35,1 +101,1,0,8,0x6d2589ac655edc9a11ef3e075eddda9a,1 +101,1,0,9,0xbf92e72171570ef7bf43a2ee39338cfe,1 +101,0,1,0,0,1 +101,0,1,1,1,1 +102,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +102,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +102,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +102,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +102,1,0,4,0x66755a00638cdaec1c732513ca0234ec,1 +102,1,0,5,0xe52545dac11f816e818f725b4f60aaf2,1 +102,1,0,6,0x91b9e47c56278662d75c0983b22ca8ea,1 +102,1,0,7,0x6aa5059b7a2ff7637eb2975e386ad663,1 +102,1,0,8,0x49aa8ff283d0f77c18d6d11dc062165f,1 +102,1,0,9,0xd13c3c0310679c1408302a16854ecfbd,1 +102,0,1,0,0,1 +102,0,1,1,1,1 +103,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +103,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +103,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +103,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +103,1,0,4,0x55a00c9fcdaebb6032513ca0234ecfff,1 +103,1,0,5,0xe98ebe492fdf02e48ca48e982beb3669,1 +103,1,0,6,0xf3ec2f13caf04d0192b47fb4c5311fb6,1 +103,1,0,7,0xd4dc6b0a9e802e5327f7ec5ee8e4834d,1 +103,1,0,8,0xf97e3e468b7d0db867d6ecfe81e2b0f9,1 +103,1,0,9,0x531df87efdb47c1338ac321fefe5a432,1 +103,0,1,0,0,1 +103,0,1,1,1,1 +104,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +104,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +104,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +104,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +104,1,0,4,0xab40193f9b5d76c064a27940469d9fff,1 +104,1,0,5,0xd31d7c925fbe05c919491d3057d66cd2,1 +104,1,0,6,0xd92b200aefcab6ac7dafd9acaf2fa10b,1 +104,1,0,7,0x3180235b8f46b4503e4693c670fccc88,1 +104,1,0,8,0x5ef2f3aebf5b317475336256768f7c19,1 +104,1,0,9,0xefb7352d27e4cccadc85b6b8ab922c72,1 +104,0,1,0,0,1 +104,0,1,1,1,1 +105,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +105,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +105,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +105,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +105,1,0,4,0xca0234ebb5fdcb13ca0234ecffffffff,1 +105,1,0,5,0xcb0dadbbc7f549f8a26b4408d0dc8600,1 +105,1,0,6,0x0a88361eb92ecca2625b38e5f98bbabb,1 +105,1,0,7,0x96bf179b3d76fc48140a3bcd881523cd,1 +105,1,0,8,0xe6bdf56033f84a5054035597375d9086,1 +105,1,0,9,0x6aa2c96b86a41ccf6edebf47298ad489,1 +105,0,1,0,0,1 +105,0,1,1,1,1 +106,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +106,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +106,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +106,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +106,1,0,4,0xbfffffff3ea3677e082b9310572620ae,1 +106,1,0,5,0x19933a9e65b285598711c77298815ad3,1 +106,1,0,6,0xd0fb17ccd8fafe827e0c1afc5d8d8036,1 +106,1,0,7,0x6e2b20e7f14a563a2ba50469d84375e8,1 +106,1,0,8,0x68612569d39e2bb9f554355564646de9,1 +106,1,0,9,0x9ac602cc6349cf8c1e236a7de7637d93,1 +106,0,1,0,0,1 +106,0,1,1,1,1 +107,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +107,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +107,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +107,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +107,1,0,4,0x266666663bbbbbbbe666666666666666,1 +107,1,0,5,0x5b37902e023fab7c8f055d86e5cc41f4,1 +107,1,0,6,0x836f33bbc1dc0d3d3abbcef0d91f11e2,1 +107,1,0,7,0xac4181076c9af0a22b1e4309d3edb276,1 +107,1,0,8,0x9ab443ff6f901e30c773867582997c2b,1 +107,1,0,9,0xec2b0cb8120d760236f3a95bbe881f75,1 +107,0,1,0,0,1 +107,0,1,1,1,1 +108,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +108,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +108,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +108,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +108,1,0,4,0xbfffffff36db6db7a492492492492492,1 +108,1,0,5,0x146c573f4c6dfc8d08a443e258970b09,1 +108,1,0,6,0x92f99fbe973ed4a299719baee4b43274,1 +108,1,0,7,0x1237034dec8d72ba5103cb33e55feeb8,1 +108,1,0,8,0x033dd0e91134c734174889f3ebcf1b7a,1 +108,1,0,9,0x1ac05767289280ee7a794cebd6e69697,1 +108,0,1,0,0,1 +108,0,1,1,1,1 +109,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +109,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +109,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +109,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +109,1,0,4,0xbfffffff2aaaaaab7fffffffffffffff,1 +109,1,0,5,0xc815d0e60b3e596ecb1ad3a27cfd49c4,1 +109,1,0,6,0xd35ba58da30197d378e618ec0fa7e2e2,1 +109,1,0,7,0xd12cffd73ebbb2049d130bba434af09e,1 +109,1,0,8,0xff83986e6875e41ea432b7585a49b3a6,1 +109,1,0,9,0xc77cbb3c47919f8e82874c794635c1d2,1 +109,0,1,0,0,1 +109,0,1,1,1,1 +110,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +110,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +110,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +110,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +110,1,0,4,0x7fffffff55555555ffffffffffffffff,1 +110,1,0,5,0xd344a71e6f651458a27bdc81fd976e37,1 +110,1,0,6,0x8651ce490f1b46d73f3ff475149be291,1 +110,1,0,7,0x36697334a519d7ddab0725c8d0793224,1 +110,1,0,8,0xe11c65bd8ca92dc8bc9ae82911f0b527,1 +110,1,0,9,0x51ce21dd9003ae60900bd825f590cc28,1 +110,0,1,0,0,1 +110,0,1,1,1,1 +111,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +111,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +111,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +111,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +111,1,0,4,0x3fffffff800000007fffffffffffffff,1 +111,1,0,5,0xde737d56d38bcf4279dce5617e3192aa,1 +111,1,0,6,0x6d8e1b12c831a0da8795650ff95f101e,1 +111,1,0,7,0xd921d9e2f72b15b1cdaca9826b9cfc6d,1 +111,1,0,8,0xef6d63e2bc5c089570394a4bc9f892d5,1 +111,1,0,9,0xe6c7a6a637b20469a58c106ad486bf37,1 +111,0,1,0,0,1 +111,0,1,1,1,1 +112,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +112,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +112,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +112,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +112,1,0,4,0x5d8ecd64a4eeba466815ddf3a4de9a8e,1 +112,1,0,5,0x6abd9c5db0a01eb80343553da648428f,1 +112,1,0,6,0x0ae580bae933b4ef2997cbdbb0922328,1 +112,1,0,7,0xca9a410f627a0f7dff24cb4d920e1542,1 +112,1,0,8,0x8911e7f8cc365a8a88eb81421a361ccc,1 +112,1,0,9,0x2b99e309d8dcd9a98ba83c3949d893e3,1 +112,0,1,0,0,1 +112,0,1,1,1,1 +113,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +113,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +113,1,0,2,0x6f2347cab7dd76858fe0555ac3bc9904,1 +113,1,0,3,0x8c4aacafdfb6bcbe05ea6c42c4934569,1 +113,1,0,4,0xbb726660235793aa9957a61e76e00c2c,1 +113,1,0,5,0x435109cf9a15dd624d53f4301047856b,1 +113,1,0,6,0x5b812fd521aafa69835a849cce6fbdeb,1 +113,1,0,7,0x6983b442d2444fe70e134c027fc46963,1 +113,1,0,8,0x838a40f2a36092e9004e92d8d940cf56,1 +113,1,0,9,0x38550ce672ce8b8d4e15eba5499249e9,1 +113,0,1,0,0,1 +113,0,1,1,1,1 +114,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +114,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +114,1,0,2,0x6f2347cab7dd76858fe0555ac3bc9904,1 +114,1,0,3,0x8c4aacafdfb6bcbe05ea6c42c4934569,1 +114,1,0,4,0xbb726660235793aa9957a61e76e00c2c,1 +114,1,0,5,0x435109cf9a15dd624d53f4301047856b,1 +114,1,0,6,0x5b812fd521aafa69835a849cce6fbdeb,1 +114,1,0,7,0x6983b442d2444fe70e134c027fc46963,1 +114,1,0,8,0x7c75bf0c5c9f6d17ffb16d2726bf30a9,1 +114,1,0,9,0xc7aaf31a8d317472b1ea145ab66db616,1 +114,0,1,0,0,1 +114,0,1,1,0,1 +115,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +115,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +115,1,0,2,0x00000000000000000000000000000000,1 +115,1,0,3,0x00000000000000000000000000000001,1 +115,1,0,4,0x55555555000000005555555555555555,1 +115,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +115,1,0,6,0x6adda82b90261b0f319faa0d878665a6,1 +115,1,0,7,0xb6da497f09c903176222c34acfef72a6,1 +115,1,0,8,0x47e6f50dcc40ad5d9b59f7602bb222fa,1 +115,1,0,9,0xd71a41bf5e1f9df4959a364c62e488d9,1 +115,0,1,0,0,1 +115,0,1,1,0,1 +116,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +116,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +116,1,0,2,0x55555555000000005555555555555555,1 +116,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +116,1,0,4,0x33333333000000003333333333333333,1 +116,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aa9,1 +116,1,0,6,0xdd86d3b5f4a13e8511083b78002081c5,1 +116,1,0,7,0x3ff467f11ebd98a51a633db76665d250,1 +116,1,0,8,0x45d5c8200c89f2fa10d849349226d21d,1 +116,1,0,9,0x8dfaed6ff8d5cb3e1b7e17474ebc18f7,1 +116,0,1,0,0,1 +116,0,1,1,0,1 +117,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +117,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +117,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +117,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +117,1,0,4,0x55555555000000005555555555555555,1 +117,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +117,1,0,6,0x4fea55b32cb32aca0c12c4cd0abfb4e6,1 +117,1,0,7,0x4b0f5a516e578c016591a93f5a0fbcc5,1 +117,1,0,8,0xd7d3fd10b2be668c547b212f6bb14c88,1 +117,1,0,9,0xf0fecd38a8a4b2c785ed3be62ce4b280,1 +117,0,1,0,0,1 +117,0,1,1,1,1 +118,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +118,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +118,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +118,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +118,1,0,4,0xb6db6db6249249254924924924924924,1 +118,1,0,5,0x625bd7a09bec4ca81bcdd9f8fd6b63cc,1 +118,1,0,6,0xc6a771527024227792170a6f8eee735b,1 +118,1,0,7,0xf32b7f98af669ead299802e32d7c3107,1 +118,1,0,8,0xbc3b4b5e65ab887bbd343572b3e56192,1 +118,1,0,9,0x61fe3a073e2ffd78412f726867db589e,1 +118,0,1,0,0,1 +118,0,1,1,1,1 +119,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +119,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +119,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +119,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +119,1,0,4,0xcccccccc00000000cccccccccccccccc,1 +119,1,0,5,0x971f2ef152794b9d8fc7d568c9e8eaa7,1 +119,1,0,6,0x851c2bbad08e54ec7a9af99f49f03644,1 +119,1,0,7,0xd6ec6d59b207fec98de85a7d15b956ef,1 +119,1,0,8,0xcee9960283045075684b410be8d0f749,1 +119,1,0,9,0x4b91aa2379f60727319f10ddeb0fe9d6,1 +119,0,1,0,0,1 +119,0,1,1,1,1 +120,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +120,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +120,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +120,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +120,1,0,4,0x33333333000000003333333333333333,1 +120,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aaa,1 +120,1,0,6,0xf6417c8a670584e388676949e53da7fc,1 +120,1,0,7,0x55911ff68318d1bf3061205acb19c48f,1 +120,1,0,8,0x8f2b743df34ad0f72674acb750592978,1 +120,1,0,9,0x4779cd9ac916c3669ead43026ab6d43f,1 +120,0,1,0,0,1 +120,0,1,1,1,1 +121,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +121,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +121,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +121,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +121,1,0,4,0x49249248db6db6dbb6db6db6db6db6db,1 +121,1,0,5,0x5a8b230d0b2b51dcd7ebf0c9fef7c185,1 +121,1,0,6,0x501421277be45a5eefec6c639930d636,1 +121,1,0,7,0x032565af420cf3373f557faa7f8a0643,1 +121,1,0,8,0x8673d6cb6076e1cfcdc7dfe7384c8e5c,1 +121,1,0,9,0xac08d74501f2ae6e89cad195d0aa1371,1 +121,0,1,0,0,1 +121,0,1,1,1,1 +122,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +122,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +122,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +122,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +122,1,0,4,0x16a4502e2781e11ac82cbc9d1edd8c98,1 +122,1,0,5,0x1584d13e18411e2f6e0478c34416e3bb,1 +122,1,0,6,0x0d935bf9ffc115a527735f729ca8a4ca,1 +122,1,0,7,0x23ee01a4894adf0e3415ac84e808bb34,1 +122,1,0,8,0x3195a3762fea29ed38912bd9ea6c4fde,1 +122,1,0,9,0x70c3050893a4375850ce61d82eba33c5,1 +122,0,1,0,0,1 +122,0,1,1,1,1 +123,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +123,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +123,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +123,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +123,1,0,4,0x55555555000000005555555555555555,1 +123,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +123,1,0,6,0x5e59f50708646be8a589355014308e60,1 +123,1,0,7,0xb668fb670196206c41e748e64e4dca21,1 +123,1,0,8,0x5de37fee5c97bcaf7144d5b459982f52,1 +123,1,0,9,0xeeeafbdf03aacbafef38e213624a01de,1 +123,0,1,0,0,1 +123,0,1,1,1,1 +124,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +124,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +124,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +124,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +124,1,0,4,0xb6db6db6249249254924924924924924,1 +124,1,0,5,0x625bd7a09bec4ca81bcdd9f8fd6b63cc,1 +124,1,0,6,0x169fb797325843faff2f7a5b5445da9e,1 +124,1,0,7,0x2fd6226f7ef90ef0bfe924104b02db8e,1 +124,1,0,8,0x7bbb8de662c7b9b1cf9b22f7a2e582bd,1 +124,1,0,9,0x46d581d68878efb2b861b131d8a1d667,1 +124,0,1,0,0,1 +124,0,1,1,1,1 +125,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +125,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +125,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +125,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +125,1,0,4,0xcccccccc00000000cccccccccccccccc,1 +125,1,0,5,0x971f2ef152794b9d8fc7d568c9e8eaa7,1 +125,1,0,6,0x271cd89c000143096b62d4e9e4ca885a,1 +125,1,0,7,0xef2f7023d18affdaf8b7b54898148754,1 +125,1,0,8,0x0a1c6e954e32108435b55fa385b0f764,1 +125,1,0,9,0x81a609b9149ccb4b02b2ca47fe8e4da5,1 +125,0,1,0,0,1 +125,0,1,1,1,1 +126,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +126,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +126,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +126,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +126,1,0,4,0x33333333000000003333333333333333,1 +126,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aaa,1 +126,1,0,6,0x3d0bc7ed8f09d2cb7ddb46ebc1ed799a,1 +126,1,0,7,0xb1563a9ab84bf524587a220afe499c12,1 +126,1,0,8,0xe22dc3b3c103824a4f378d96adb0a408,1 +126,1,0,9,0xabf19ce7d68aa6244f78cb216fa3f8df,1 +126,0,1,0,0,1 +126,0,1,1,1,1 +127,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +127,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +127,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +127,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +127,1,0,4,0x49249248db6db6dbb6db6db6db6db6db,1 +127,1,0,5,0x5a8b230d0b2b51dcd7ebf0c9fef7c185,1 +127,1,0,6,0xa6c885ade1a4c566f9bb010d066974ab,1 +127,1,0,7,0xb281797fa701288c721bcbd23663a9b7,1 +127,1,0,8,0x2e424b690957168d193a6096fc77a2b0,1 +127,1,0,9,0x04a9c7d467e007e1f2058458f98af316,1 +127,0,1,0,0,1 +127,0,1,1,1,1 +128,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +128,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +128,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +128,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +128,1,0,4,0x16a4502e2781e11ac82cbc9d1edd8c98,1 +128,1,0,5,0x1584d13e18411e2f6e0478c34416e3bb,1 +128,1,0,6,0x8d3c2c2c3b765ba8289e6ac3812572a2,1 +128,1,0,7,0x5bf75df62d87ab7330c3bdbad9ebfa5c,1 +128,1,0,8,0x4c6845442d66935b238578d43aec54f7,1 +128,1,0,9,0xcaa1621d1af241d4632e0b780c423f5d,1 +128,0,1,0,0,1 +128,0,1,1,1,1 +129,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +129,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +129,1,0,2,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +129,1,0,3,0x0036e7c32b270c8807a419feca605023,1 +129,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +129,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +129,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +129,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +129,1,0,8,0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16,1 +129,1,0,9,0x2bce33576b315ececbb6406837bf51f5,1 +129,0,1,0,0,1 +129,0,1,1,0,1 +130,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +130,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +130,1,0,2,0x44a5ad0ad0636d9f12bc9e0a6bdd5e1c,1 +130,1,0,3,0xbcb012ea7bf091fcec15b0c43202d52e,1 +130,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +130,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +130,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +130,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +130,1,0,8,0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16,1 +130,1,0,9,0x2bce33576b315ececbb6406837bf51f5,1 +130,0,1,0,0,1 +130,0,1,1,0,1 +131,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +131,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +131,1,0,2,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +131,1,0,3,0x0036e7c32b270c8807a419feca605023,1 +131,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +131,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +131,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +131,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +131,1,0,8,0xb01cbd1c01e58065711814b583f061e9,1 +131,1,0,9,0xd431cca994cea1313449bf97c840ae0a,1 +131,0,1,0,0,1 +131,0,1,1,0,1 +132,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +132,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +132,1,0,2,0x44a5ad0ad0636d9f12bc9e0a6bdd5e1c,1 +132,1,0,3,0xbcb012ea7bf091fcec15b0c43202d52e,1 +132,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +132,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +132,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +132,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +132,1,0,8,0xb01cbd1c01e58065711814b583f061e9,1 +132,1,0,9,0xd431cca994cea1313449bf97c840ae0a,1 +132,0,1,0,0,1 +132,0,1,1,0,1 +133,1,0,0,0xe3b0c44298fc1c149afbf4c8996fb924,1 +133,1,0,1,0x27ae41e4649b934ca495991b7852b855,1 +133,1,0,2,0xb292a619339f6e567a305c951c0dcbcc,1 +133,1,0,3,0x42d16e47f219f9e98e76e09d8770b34a,1 +133,1,0,4,0x0177e60492c5a8242f76f07bfe3661bd,1 +133,1,0,5,0xe59ec2a17ce5bd2dab2abebdf89a62e2,1 +133,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +133,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +133,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +133,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +133,0,1,0,0,1 +133,0,1,1,1,1 +134,1,0,0,0xdc1921946f4af96a2856e7be399007c9,1 +134,1,0,1,0xe807bdf4c5332f19f59ec9dd1bb8c7b3,1 +134,1,0,2,0x530bd6b0c9af2d69ba897f6b5fb59695,1 +134,1,0,3,0xcfbf33afe66dbadcf5b8d2a2a6538e23,1 +134,1,0,4,0xd85e489cb7a161fd55ededcedbf4cc0c,1 +134,1,0,5,0x0987e3e3f0f242cae934c72caa3f43e9,1 +134,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +134,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +134,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +134,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +134,0,1,0,0,1 +134,0,1,1,1,1 +135,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +135,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +135,1,0,2,0xa8ea150cb80125d7381c4c1f1da8e9de,1 +135,1,0,3,0x2711f9917060406a73d7904519e51388,1 +135,1,0,4,0xf3ab9fa68bd47973a73b2d40480c2ba5,1 +135,1,0,5,0x0c22c9d76ec217257288293285449b86,1 +135,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +135,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +135,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +135,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +135,0,1,0,0,1 +135,0,1,1,1,1 +136,1,0,0,0xde47c9b27eb8d300dbb5f2c353e632c3,1 +136,1,0,1,0x93262cf06340c4fa7f1b40c4cbd36f90,1 +136,1,0,2,0x986e65933ef2ed4ee5aada139f52b705,1 +136,1,0,3,0x39aaf63f00a91f29c69178490d57fb71,1 +136,1,0,4,0x3dafedfb8da6189d372308cbf1489bbb,1 +136,1,0,5,0xdabf0c0217d1c0ff0f701aaa7a694b9c,1 +136,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +136,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +136,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +136,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +136,0,1,0,0,1 +136,0,1,1,1,1 +137,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +137,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +137,1,0,2,0xd434e262a49eab7781e353a3565e4825,1 +137,1,0,3,0x50dd0fd5defa013c7f29745eff3569f1,1 +137,1,0,4,0x9b0c0a93f267fb6052fd8077be769c2b,1 +137,1,0,5,0x98953195d7bc10de844218305c6ba17a,1 +137,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +137,1,0,7,0xf3807eca117380239fbd816900000000,1 +137,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +137,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +137,0,1,0,0,1 +137,0,1,1,1,1 +138,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +138,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +138,1,0,2,0x0fe774355c04d060f76d79fd7a772e42,1 +138,1,0,3,0x1463489221bf0a33add0be9b1979110b,1 +138,1,0,4,0x500dcba1c69a8fbd43fa4f57f743ce12,1 +138,1,0,5,0x4ca8b91a1f325f3fac6181175df55737,1 +138,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +138,1,0,7,0xf3807eca117380239fbd816900000000,1 +138,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +138,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +138,0,1,0,0,1 +138,0,1,1,1,1 +139,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +139,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +139,1,0,2,0xbb40bf217bed3fb3950c7d39f03d36dc,1 +139,1,0,3,0x8e3b2cd79693f125bfd06595ee1135e3,1 +139,1,0,4,0x541bf3532351ebb032710bdb6a1bf1bf,1 +139,1,0,5,0xc89a1e291ac692b3fa4780745bb55677,1 +139,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +139,1,0,7,0xf3807eca117380239fbd816900000000,1 +139,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +139,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +139,0,1,0,0,1 +139,0,1,1,1,1 +140,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +140,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +140,1,0,2,0x664eb7ee6db84a34df3c86ea31389a54,1 +140,1,0,3,0x05badd5ca99231ff556d3e75a233e73a,1 +140,1,0,4,0x59f3c752e52eca46137642490a51560c,1 +140,1,0,5,0xe0badc678754b8f72e51a2901426a1bd,1 +140,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +140,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +140,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +140,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +140,0,1,0,0,1 +140,0,1,1,1,1 +141,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +141,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +141,1,0,2,0x4cd0429bbabd2827009d6fcd843d4ce3,1 +141,1,0,3,0x9c3e42e2d1631fd001985a79d1fd8b43,1 +141,1,0,4,0x9638bf12dd682f60be7ef1d0e0d98f08,1 +141,1,0,5,0xb7bca77a1a2b869ae466189d2acdabe3,1 +141,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +141,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +141,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +141,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +141,0,1,0,0,1 +141,0,1,1,1,1 +142,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +142,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +142,1,0,2,0xe56c6ea2d1b017091c44d8b6cb62b9f4,1 +142,1,0,3,0x60e3ce9aed5e5fd41e8added97c56c04,1 +142,1,0,4,0xa308ec31f281e955be20b457e463440b,1 +142,1,0,5,0x4fcf2b80258078207fc1378180f89b55,1 +142,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +142,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +142,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +142,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +142,0,1,0,0,1 +142,0,1,1,1,1 +143,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +143,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +143,1,0,2,0x1158a08d291500b4cabed3346d891eee,1 +143,1,0,3,0x57c176356a2624fb011f8fbbf3466830,1 +143,1,0,4,0x228a8c486a736006e082325b85290c5b,1 +143,1,0,5,0xc91f378b75d487dda46798c18f285519,1 +143,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +143,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +143,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +143,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +143,0,1,0,0,1 +143,0,1,1,1,1 +144,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +144,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +144,1,0,2,0xb1db9289649f59410ea36b0c0fc8d6aa,1 +144,1,0,3,0x2687b29176939dd23e0dde56d309fa9d,1 +144,1,0,4,0x3e1535e4280559015b0dbd987366dcf4,1 +144,1,0,5,0x3a6d1af5c23c7d584e1c3f48a1251336,1 +144,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +144,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +144,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +144,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +144,0,1,0,0,1 +144,0,1,1,1,1 +145,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +145,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +145,1,0,2,0xb7b16e762286cb96446aa8d4e6e7578b,1 +145,1,0,3,0x0a341a79f2dd1a220ac6f0ca4e24ed86,1 +145,1,0,4,0xddc60a700a139b04661c547d07bbb072,1 +145,1,0,5,0x1780146df799ccf55e55234ecb8f12bc,1 +145,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +145,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +145,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +145,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +145,0,1,0,0,1 +145,0,1,1,1,1 +146,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +146,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +146,1,0,2,0xd82a7c2717261187c8e00d8df963ff35,1 +146,1,0,3,0xd796edad36bc6e6bd1c91c670d9105b4,1 +146,1,0,4,0x3dcabddaf8fcaa61f4603e7cbac0f3c0,1 +146,1,0,5,0x351ecd5988efb23f680d07debd139929,1 +146,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +146,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +146,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +146,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +146,0,1,0,0,1 +146,0,1,1,1,1 +147,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +147,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +147,1,0,2,0x5eb9c8845de68eb13d5befe719f462d7,1 +147,1,0,3,0x7787802baff30ce96a5cba063254af78,1 +147,1,0,4,0x2c026ae9be2e2a5e7ca0ff9bbd92fb6e,1 +147,1,0,5,0x44972186228ee9a62b87ddbe2ef66fb5,1 +147,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +147,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +147,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +147,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +147,0,1,0,0,1 +147,0,1,1,1,1 +148,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +148,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +148,1,0,2,0x96843dd03c22abd2f3b782b170239f90,1 +148,1,0,3,0xf277921becc117d0404a8e4e36230c28,1 +148,1,0,4,0xf2be378f526f74a543f67165976de9ed,1 +148,1,0,5,0x9a31214eb4d7e6db19e1ede123dd991d,1 +148,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +148,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +148,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +148,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +148,0,1,0,0,1 +148,0,1,1,1,1 +149,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +149,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +149,1,0,2,0x766456dce1857c906f9996af72933946,1 +149,1,0,3,0x4d27e9d98edc2d0e3b760297067421f6,1 +149,1,0,4,0x402385ecadae0d8081dccaf5d19037ec,1 +149,1,0,5,0x4e55376eced699e93646bfbbf19d0b41,1 +149,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +149,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +149,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +149,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +149,0,1,0,0,1 +149,0,1,1,1,1 +150,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +150,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +150,1,0,2,0xc605c4b2edeab20419e6518a11b2dbc2,1 +150,1,0,3,0xb97ed8b07cced0b19c34f777de7b9fd9,1 +150,1,0,4,0xedf0f612c5f46e03c719647bc8af1b29,1 +150,1,0,5,0xb2cde2eda700fb1cff5e159d47326dba,1 +150,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +150,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +150,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +150,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +150,0,1,0,0,1 +150,0,1,1,1,1 +151,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +151,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +151,1,0,2,0xd48b68e6cabfe03cf6141c9ac54141f2,1 +151,1,0,3,0x10e64485d9929ad7b732bfe3b7eb8a84,1 +151,1,0,4,0xfeedae50c61bd00e19dc26f9b7e2265e,1 +151,1,0,5,0x4508c389109ad2f208f0772315b6c941,1 +151,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +151,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +151,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +151,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +151,0,1,0,0,1 +151,0,1,1,1,1 +152,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +152,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +152,1,0,2,0xb7c81457d4aeb6aa65957098569f0479,1 +152,1,0,3,0x710ad7f6595d5874c35a93d12a5dd4c7,1 +152,1,0,4,0xb7961a0b652878c2d568069a432ca18a,1 +152,1,0,5,0x1a9199f2ca574dad4b9e3a05c0a1cdb3,1 +152,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +152,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +152,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +152,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +152,0,1,0,0,1 +152,0,1,1,1,1 +153,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +153,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +153,1,0,2,0x6b01332ddb6edfa9a30a1321d5858e1e,1 +153,1,0,3,0xe3cf97e263e669f8de5e9652e76ff3f7,1 +153,1,0,4,0x5939545fced457309a6a04ace2bd0f70,1 +153,1,0,5,0x139c8f7d86b02cb1cc58f9e69e96cd5a,1 +153,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +153,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +153,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +153,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +153,0,1,0,0,1 +153,0,1,1,1,1 +154,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +154,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +154,1,0,2,0xefdb884720eaeadc349f9fc356b6c034,1 +154,1,0,3,0x4101cd2fd8436b7d0e6a4fb93f106361,1 +154,1,0,4,0xf24bee6ad5dc05f7613975473aadf3aa,1 +154,1,0,5,0xcba9e77de7d69b6ce48cb60d8113385d,1 +154,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +154,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +154,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +154,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +154,0,1,0,0,1 +154,0,1,1,1,1 +155,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +155,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +155,1,0,2,0x31230428405560dcb88fb5a646836aea,1 +155,1,0,3,0x9b23a23dd973dcbe8014c87b8b20eb07,1 +155,1,0,4,0x0f9344d6e812ce166646747694a41b0a,1 +155,1,0,5,0xaf97374e19f3c5fb8bd7ae3d9bd0beff,1 +155,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +155,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +155,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +155,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +155,0,1,0,0,1 +155,0,1,1,1,1 +156,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +156,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +156,1,0,2,0xcaa797da65b320ab0d5c470cda0b36b2,1 +156,1,0,3,0x94359c7db9841d679174db34c4855743,1 +156,1,0,4,0xcf543a62f23e212745391aaf7505f345,1 +156,1,0,5,0x123d2685ee3b941d3de6d9b36242e5a0,1 +156,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +156,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +156,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +156,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +156,0,1,0,0,1 +156,0,1,1,1,1 +157,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +157,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +157,1,0,2,0x7e5f0ab5d900d3d3d7867657e5d6d365,1 +157,1,0,3,0x19bc54084536e7d21c336ed800185945,1 +157,1,0,4,0x9450c07f201faec94b82dfb322e5ac67,1 +157,1,0,5,0x6688294aad35aa72e727ff0b19b646aa,1 +157,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +157,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +157,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +157,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +157,0,1,0,0,1 +157,0,1,1,1,1 +158,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +158,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +158,1,0,2,0xd7d70c581ae9e3f66dc6a480bf037ae2,1 +158,1,0,3,0x3f8a1e4a2136fe4b03aa69f0ca25b356,1 +158,1,0,4,0x89c460f8a5a5c2bbba962c8a3ee833a4,1 +158,1,0,5,0x13e85658e62a59e2af41d9127cc47224,1 +158,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +158,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +158,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +158,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +158,0,1,0,0,1 +158,0,1,1,1,1 +159,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +159,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +159,1,0,2,0x341c1b9ff3c83dd5e0dfa0bf68bcdf4b,1 +159,1,0,3,0xb7aa20c625975e5eeee34bb396266b34,1 +159,1,0,4,0x72b69f061b750fd5121b22b11366fad5,1 +159,1,0,5,0x49c634e77765a017902a67099e0a4469,1 +159,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +159,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +159,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +159,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +159,0,1,0,0,1 +159,0,1,1,1,1 +160,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +160,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +160,1,0,2,0x70bebe684cdcb5ca72a42f0d87387935,1 +160,1,0,3,0x9bd1781a591809947628d313a3814f67,1 +160,1,0,4,0xaec03aca8f5587a4d535fa31027bbe9c,1 +160,1,0,5,0xc0e464b1c3577f4c2dcde6b2094798a9,1 +160,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +160,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +160,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +160,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +160,0,1,0,0,1 +160,0,1,1,1,1 +161,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +161,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +161,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +161,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +161,1,0,4,0x4cd60b855d442f5b3c7b11eb6c4e0ae7,1 +161,1,0,5,0x525fe710fab9aa7c77a67f79e6fadd76,1 +161,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +161,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +161,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +161,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +161,0,1,0,0,1 +161,0,1,1,1,1 +162,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +162,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +162,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +162,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +162,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +162,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +162,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +162,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +162,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +162,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +162,0,1,0,0,1 +162,0,1,1,1,1 +163,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +163,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +163,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +163,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +163,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +163,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +163,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +163,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +163,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +163,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +163,0,1,0,0,1 +163,0,1,1,1,1 +164,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +164,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +164,1,0,2,0x29a3a8be6b94d5ec80a6d9d1190a436e,1 +164,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +164,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +164,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +164,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +164,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +164,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +164,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +164,0,1,0,0,1 +164,0,1,1,0,1 +165,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +165,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +165,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +165,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e98,1 +165,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +165,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +165,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +165,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +165,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +165,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +165,0,1,0,0,1 +165,0,1,1,0,1 +166,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +166,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +166,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +166,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +166,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +166,1,0,5,0x6a87139cac5df4087c134b491568475b,1 +166,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +166,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +166,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +166,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +166,0,1,0,0,1 +166,0,1,1,0,1 +167,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +167,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +167,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +167,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +167,1,0,4,0x00b329f479a2bbd0a5c384ee1493b1f5,1 +167,1,0,5,0x186a87139cac5df4087c134b49156847,1 +167,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +167,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +167,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +167,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +167,0,1,0,0,1 +167,0,1,1,0,1 +168,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +168,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +168,1,0,2,0xd45c5741946b2a137f59262ee6f5bc91,1 +168,1,0,3,0x001af27a5e1117a64733950642a3d1e8,1 +168,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +168,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +168,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +168,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +168,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +168,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +168,0,1,0,0,1 +168,0,1,1,0,1 +169,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +169,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +169,1,0,2,0xd45c5740946b2a147f59262ee6f5bc90,1 +169,1,0,3,0xbd01ed280528b62b3aed5fc93f06f739,1 +169,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +169,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +169,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +169,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +169,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +169,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +169,0,1,0,0,1 +169,0,1,1,0,1 +170,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +170,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +170,1,0,2,0xd45c5741946b2a137f59262ee6f5bc91,1 +170,1,0,3,0x001af27a5e1117a64733950642a3d1e8,1 +170,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +170,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +170,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +170,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +170,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +170,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +170,0,1,0,0,1 +170,0,1,1,0,1 +171,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +171,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +171,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +171,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +171,1,0,4,0xb329f47aa2bbd0a4c384ee1493b1f518,1 +171,1,0,5,0xada018ef05465583885980861905228a,1 +171,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +171,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +171,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +171,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +171,0,1,0,0,1 +171,0,1,1,0,1 +172,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +172,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +172,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +172,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +172,1,0,4,0x4cd60b865d442f5a3c7b11eb6c4e0ae7,1 +172,1,0,5,0x9578ec6353a20bf783ecb4b6ea97b825,1 +172,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +172,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +172,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +172,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +172,0,1,0,0,1 +172,0,1,1,0,1 +173,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +173,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +173,1,0,2,0xffffffff00000000ffffffffffffffff,1 +173,1,0,3,0xbce6faada7179e84f3b9cac2fc632550,1 +173,1,0,4,0xffffffff00000000ffffffffffffffff,1 +173,1,0,5,0xbce6faada7179e84f3b9cac2fc632550,1 +173,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +173,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +173,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +173,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +173,0,1,0,0,1 +173,0,1,1,0,1 +174,1,0,0,0x70239dd877f7c944c422f44dea4ed1a5,1 +174,1,0,1,0x2f2627416faf2f072fa50c772ed6f807,1 +174,1,0,2,0x64a1aab5000d0e804f3e2fc02bdee9be,1 +174,1,0,3,0x8ff312334e2ba16d11547c97711c898e,1 +174,1,0,4,0x6af015971cc30be6d1a206d4e013e099,1 +174,1,0,5,0x7772a2f91d73286ffd683b9bb2cf4f1b,1 +174,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +174,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +174,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +174,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +174,0,1,0,0,1 +174,0,1,1,1,1 +175,1,0,0,0x00000000690ed426ccf17803ebe2bd08,1 +175,1,0,1,0x84bcd58a1bb5e7477ead3645f356e7a9,1 +175,1,0,2,0x16aea964a2f6506d6f78c81c91fc7e8b,1 +175,1,0,3,0xded7d397738448de1e19a0ec580bf266,1 +175,1,0,4,0x252cd762130c6667cfe8b7bc47d27d78,1 +175,1,0,5,0x391e8e80c578d1cd38c3ff033be928e9,1 +175,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +175,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +175,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +175,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +175,0,1,0,0,1 +175,0,1,1,1,1 +176,1,0,0,0x7300000000213f2a525c6035725235c2,1 +176,1,0,1,0xf696ad3ebb5ee47f140697ad25770d91,1 +176,1,0,2,0x9cc98be2347d469bf476dfc26b9b733d,1 +176,1,0,3,0xf2d26d6ef524af917c665baccb23c882,1 +176,1,0,4,0x093496459effe2d8d70727b82462f61d,1 +176,1,0,5,0x0ec1b7847929d10ea631dacb16b56c32,1 +176,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +176,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +176,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +176,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +176,0,1,0,0,1 +176,0,1,1,1,1 +177,1,0,0,0xddf2000000005e0be0635b245f0b9797,1 +177,1,0,1,0x8afd25daadeb3edb4a0161c27fe06045,1 +177,1,0,2,0x73b3c90ecd390028058164524dde8927,1 +177,1,0,3,0x03dce3dea0d53fa8093999f07ab8aa43,1 +177,1,0,4,0x2f67b0b8e20636695bb7d8bf0a651c80,1 +177,1,0,5,0x2ed25a395387b5f4188c0c4075c88634,1 +177,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +177,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +177,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +177,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +177,0,1,0,0,1 +177,0,1,1,1,1 +178,1,0,0,0x67ab1900000000784769c4ecb9e164d6,1 +178,1,0,1,0x642b8499588b89855be1ec355d0841a0,1 +178,1,0,2,0xbfab3098252847b328fadf2f89b95c85,1 +178,1,0,3,0x1a7f0eb390763378f37e90119d5ba3dd,1 +178,1,0,4,0xbdd64e234e832b1067c2d058ccb44d97,1 +178,1,0,5,0x8195ccebb65c2aaf1e2da9b8b4987e3b,1 +178,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +178,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +178,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +178,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +178,0,1,0,0,1 +178,0,1,1,1,1 +179,1,0,0,0xa2bf09460000000076d7dbeffe125eaf,1 +179,1,0,1,0x02095dff252ee905e296b6350fc311cf,1 +179,1,0,2,0x204a9784074b246d8bf8bf04a4ceb1c1,1 +179,1,0,3,0xf1c9aaab168b1596d17093c5cd21d2cd,1 +179,1,0,4,0x51cce41670636783dc06a759c8847868,1 +179,1,0,5,0xa406c2506fe17975582fe648d1d88b52,1 +179,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +179,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +179,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +179,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +179,0,1,0,0,1 +179,0,1,1,1,1 +180,1,0,0,0x3554e827c700000000e1e75e624a06b3,1 +180,1,0,1,0xa0a353171160858129e15c544e4f0e65,1 +180,1,0,2,0xed66dc34f551ac82f63d4aa4f81fe2cb,1 +180,1,0,3,0x0031a91d1314f835027bca0f1ceeaa03,1 +180,1,0,4,0x99ca123aa09b13cd194a422e18d5fda1,1 +180,1,0,5,0x67623c3f6e5d4d6abb8953d67c0c48c7,1 +180,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +180,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +180,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +180,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +180,0,1,0,0,1 +180,0,1,1,1,1 +181,1,0,0,0x9b6cd3b812610000000026941a0f0bb5,1 +181,1,0,1,0x3255ea4c9fd0cb3426e3a54b9fc6965c,1 +181,1,0,2,0x060b700bef665c68899d44f2356a578d,1 +181,1,0,3,0x126b062023ccc3c056bf0f60a237012b,1 +181,1,0,4,0x8d186c027832965f4fcc78a3366ca95d,1 +181,1,0,5,0xedbb410cbef3f26d6be5d581c11d3610,1 +181,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +181,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +181,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +181,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +181,0,1,0,0,1 +181,0,1,1,1,1 +182,1,0,0,0x883ae39f50bf0100000000e7561c26fc,1 +182,1,0,1,0x82a52baa51c71ca877162f93c4ae0186,1 +182,1,0,2,0x9f6adfe8d5eb5b2c24d7aa7934b6cf29,1 +182,1,0,3,0xc93ea76cd313c9132bb0c8e38c96831d,1 +182,1,0,4,0xb26a9c9e40e55ee0890c944cf271756c,1 +182,1,0,5,0x906a33e66b5bd15e051593883b5e9902,1 +182,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +182,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +182,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +182,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +182,0,1,0,0,1 +182,0,1,1,1,1 +183,1,0,0,0xa1ce5d6e5ecaf28b0000000000fa7cd0,1 +183,1,0,1,0x10540f420fb4ff7401fe9fce011d0ba6,1 +183,1,0,2,0xa1af03ca91677b673ad2f33615e56174,1 +183,1,0,3,0xa1abf6da168cebfa8868f4ba273f16b7,1 +183,1,0,4,0x20aa73ffe48afa6435cd258b173d0c23,1 +183,1,0,5,0x77d69022e7d098d75caf24c8c5e06b1c,1 +183,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +183,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +183,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +183,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +183,0,1,0,0,1 +183,0,1,1,1,1 +184,1,0,0,0x8ea5f645f373f5809300000000383453,1 +184,1,0,1,0x97330012a8ee836c5494cdffd5ee8054,1 +184,1,0,2,0xfdc70602766f8eed11a6c99a71c973d5,1 +184,1,0,3,0x659355507b843da6e327a28c11893db9,1 +184,1,0,4,0x3df5349688a085b137b1eacf456a9e9e,1 +184,1,0,5,0x0f6d15ec0078ca60a7f83f2b10d21350,1 +184,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +184,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +184,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +184,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +184,0,1,0,0,1 +184,0,1,1,1,1 +185,1,0,0,0x660570d323e9f75fa734000000008792,1 +185,1,0,1,0xd65ce93eabb7d60d8d9c1bbdcb5ef305,1 +185,1,0,2,0xb516a314f2fce530d6537f6a6c49966c,1 +185,1,0,3,0x23456f63c643cf8e0dc738f7b876e675,1 +185,1,0,4,0xd39ffd033c92b6d717dd536fbc5efdf1,1 +185,1,0,5,0x967c4bd80954479ba66b0120cd16fff2,1 +185,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +185,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +185,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +185,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +185,0,1,0,0,1 +185,0,1,1,1,1 +186,1,0,0,0xd0462673154cce587dde8800000000e9,1 +186,1,0,1,0x8d35f1f45cf9c3bf46ada2de4c568c34,1 +186,1,0,2,0x3b2cbf046eac45842ecb7984d4758315,1 +186,1,0,3,0x82717bebb6492fd0a485c101e29ff0a8,1 +186,1,0,4,0x4c9b7b47a98b0f82de512bc9313aaf51,1 +186,1,0,5,0x701099cac5f76e68c8595fc1c1d99258,1 +186,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +186,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +186,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +186,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +186,0,1,0,0,1 +186,0,1,1,1,1 +187,1,0,0,0xbd90640269a7822680cedfef00000000,1 +187,1,0,1,0x0caef15a6171059ab83e7b4418d7278f,1 +187,1,0,2,0x30c87d35e636f540841f14af54e2f9ed,1 +187,1,0,3,0xd79d0312cfa1ab656c3fb15bfde48dcf,1 +187,1,0,4,0x47c15a5a82d24b75c85a692bd6ecafeb,1 +187,1,0,5,0x71409ede23efd08e0db9abf6340677ed,1 +187,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +187,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +187,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +187,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +187,0,1,0,0,1 +187,0,1,1,1,1 +188,1,0,0,0x33239a52d72f1311512e41222a000000,1 +188,1,0,1,0x00d2dcceb301c54b4beae8e284788a73,1 +188,1,0,2,0x38686ff0fda2cef6bc43b58cfe6647b9,1 +188,1,0,3,0xe2e8176d168dec3c68ff262113760f52,1 +188,1,0,4,0x067ec3b651f422669601662167fa8717,1 +188,1,0,5,0xe976e2db5e6a4cf7c2ddabb3fde9d67d,1 +188,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +188,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +188,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +188,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +188,0,1,0,0,1 +188,0,1,1,1,1 +189,1,0,0,0xb8d64fbcd4a1c10f1365d4e6d95c0000,1 +189,1,0,1,0x00007ee4a21a1cbe1dc84c2d941ffaf1,1 +189,1,0,2,0x44a3e23bf314f2b344fc25c7f2de8b6a,1 +189,1,0,3,0xf3e17d27f5ee844b225985ab6e2775cf,1 +189,1,0,4,0x2d48e223205e98041ddc87be532abed5,1 +189,1,0,5,0x84f0411f5729500493c9cc3f4dd15e86,1 +189,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +189,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +189,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +189,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +189,0,1,0,0,1 +189,0,1,1,1,1 +190,1,0,0,0x01603d3982bf77d7a3fef3183ed09200,1 +190,1,0,1,0x0000003a227420db4088b20fe0e9d84a,1 +190,1,0,2,0x2ded5b7ec8e90e7bf11f967a3d95110c,1 +190,1,0,3,0x41b99db3b5aa8d330eb9d638781688e9,1 +190,1,0,4,0x7d5792c53628155e1bfc46fb1a67e308,1 +190,1,0,5,0x8de049c328ae1f44ec69238a009808f9,1 +190,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +190,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +190,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +190,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +190,0,1,0,0,1 +190,0,1,1,1,1 +191,1,0,0,0x9ea6994f1e0384c8599aa02e6cf66d9c,1 +191,1,0,1,0x000000004d89ef50b7e9eb0cfbff7363,1 +191,1,0,2,0xbdae7bcb580bf335efd3bc3d31870f92,1 +191,1,0,3,0x3eaccafcd40ec2f605976f15137d8b8f,1 +191,1,0,4,0xf6dfa12f19e525270b0106eecfe25749,1 +191,1,0,5,0x9f373a4fb318994f24838122ce7ec3c7,1 +191,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +191,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +191,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +191,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +191,0,1,0,0,1 +191,0,1,1,1,1 +192,1,0,0,0xd03215a8401bcf16693979371a01068a,1 +192,1,0,1,0x4700000000e2fa5bf692bc670905b18c,1 +192,1,0,2,0x50f9c4f0cd6940e162720957ffff5137,1 +192,1,0,3,0x99209b78596956d21ece251c2401f1c6,1 +192,1,0,4,0xd7033a0a787d338e889defaaabb106b9,1 +192,1,0,5,0x5a4355e411a59c32aa5167dfab244726,1 +192,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +192,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +192,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +192,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +192,0,1,0,0,1 +192,0,1,1,1,1 +193,1,0,0,0x307bfaaffb650c889c84bf83f0300e5d,1 +193,1,0,1,0xc87e000000008408fd5f64b582e3bb14,1 +193,1,0,2,0xf612820687604fa01906066a378d6754,1 +193,1,0,3,0x0982e29575d019aabe90924ead5c860d,1 +193,1,0,4,0x3f9367702dd7dd4f75ea98afd20e328a,1 +193,1,0,5,0x1a99f4857b316525328230ce294b0fef,1 +193,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +193,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +193,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +193,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +193,0,1,0,0,1 +193,0,1,1,1,1 +194,1,0,0,0xbab5c4f4df540d7b33324d36bb0c1575,1 +194,1,0,1,0x51527c00000000e4af574bb4d54ea6b8,1 +194,1,0,2,0x9505e407657d6e8bc93db5da7aa6f508,1 +194,1,0,3,0x1f61980c1949f56b0f2f507da5782a7a,1 +194,1,0,4,0xc60d31904e3669738ffbeccab6c3656c,1 +194,1,0,5,0x08e0ed5cb92b3cfa5e7f71784f9c5021,1 +194,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +194,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +194,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +194,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +194,0,1,0,0,1 +194,0,1,1,1,1 +195,1,0,0,0xd4ba47f6ae28f274e4f58d8036f9c36e,1 +195,1,0,1,0xc2456f5b00000000c3b869197ef5e15e,1 +195,1,0,2,0xbbd16fbbb656b6d0d83e6a7787cd691b,1 +195,1,0,3,0x08735aed371732723e1c68a40404517d,1 +195,1,0,4,0x9d8e35dba96028b7787d91315be67587,1 +195,1,0,5,0x7d2d097be5e8ee34560e3e7fd25c0f00,1 +195,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +195,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +195,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +195,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +195,0,1,0,0,1 +195,0,1,1,1,1 +196,1,0,0,0x79fd19c7235ea212f29f1fa00984342a,1 +196,1,0,1,0xfe0f10aafd00000000801e47f8c184e1,1 +196,1,0,2,0x2ec9760122db98fd06ea76848d35a6da,1 +196,1,0,3,0x442d2ceef7559a30cf57c61e92df327e,1 +196,1,0,4,0x7ab271da90859479701fccf86e462ee3,1 +196,1,0,5,0x393fb6814c27b760c4963625c0a19878,1 +196,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +196,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +196,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +196,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +196,0,1,0,0,1 +196,0,1,1,1,1 +197,1,0,0,0x8c291e8eeaa45adbaf9aba5c0583462d,1 +197,1,0,1,0x79cbeb7ac97300000000a37ea6700cda,1 +197,1,0,2,0x54e76b7683b6650baa6a7fc49b1c51ee,1 +197,1,0,3,0xd9ba9dd463221f7a4f1005a89fe00c59,1 +197,1,0,4,0x2ea076886c773eb937ec1cc8374b7915,1 +197,1,0,5,0xcfd11b1c1ae1166152f2f7806a31c8fd,1 +197,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +197,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +197,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +197,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +197,0,1,0,0,1 +197,0,1,1,1,1 +198,1,0,0,0x0eaae8641084fa979803efbfb8140732,1 +198,1,0,1,0xf4cdcf66c3f78a000000003c278a6b21,1 +198,1,0,2,0x5291deaf24659ffbbce6e3c26f602109,1 +198,1,0,3,0x7a74abdbb69be4fb10419c0c496c9466,1 +198,1,0,4,0x65d6fcf336d27cc7cdb982bb4e4ecef5,1 +198,1,0,5,0x827f84742f29f10abf83469270a03dc3,1 +198,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +198,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +198,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +198,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +198,0,1,0,0,1 +198,0,1,1,1,1 +199,1,0,0,0xe02716d01fb23a5a0068399bf01bab42,1 +199,1,0,1,0xef17c6d96e13846c00000000afc0f89d,1 +199,1,0,2,0x207a3241812d75d947419dc58efb05e8,1 +199,1,0,3,0x003b33fc17eb50f9d15166a88479f107,1 +199,1,0,4,0xcdee749f2e492b213ce80b32d0574f62,1 +199,1,0,5,0xf1c5d70793cf55e382d5caadf7592767,1 +199,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +199,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +199,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +199,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +199,0,1,0,0,1 +199,0,1,1,1,1 +200,1,0,0,0x9eb0bf583a1a6b9a194e9a16bc7dab2a,1 +200,1,0,1,0x9061768af89d00659a00000000fc7de1,1 +200,1,0,2,0x6554e49f82a855204328ac94913bf01b,1 +200,1,0,3,0xbe84437a355a0a37c0dee3cf81aa7728,1 +200,1,0,4,0xaea00de2507ddaf5c94e1e126980d3df,1 +200,1,0,5,0x16250a2eaebc8be486effe7f22b4f929,1 +200,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +200,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +200,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +200,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +200,0,1,0,0,1 +200,0,1,1,1,1 +201,1,0,0,0x62aac98818b3b84a2c214f0d5e72ef28,1 +201,1,0,1,0x6e1030cb53d9a82b690e00000000cd15,1 +201,1,0,2,0xa54c5062648339d2bff06f71c88216c2,1 +201,1,0,3,0x6c6e19b4d80a8c602990ac82707efdfc,1 +201,1,0,4,0xe99bbe7fcfafae3e69fd016777517aa0,1 +201,1,0,5,0x1056317f467ad09aff09be73c9731b0d,1 +201,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +201,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +201,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +201,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +201,0,1,0,0,1 +201,0,1,1,1,1 +202,1,0,0,0x3760a7f37cf96218f29ae43732e513ef,1 +202,1,0,1,0xd2b6f552ea4b6895464b9300000000c8,1 +202,1,0,2,0x975bd7157a8d363b309f1f444012b1a1,1 +202,1,0,3,0xd23096593133e71b4ca8b059cff37eaf,1 +202,1,0,4,0x7faa7a28b1c822baa241793f2abc930b,1 +202,1,0,5,0xd4c69840fe090f2aacc46786bf919622,1 +202,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +202,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +202,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +202,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +202,0,1,0,0,1 +202,0,1,1,1,1 +203,1,0,0,0x0da0a1d2851d33023834f2098c088009,1 +203,1,0,1,0x6b4320bea836cd9cbb6ff6c800000000,1 +203,1,0,2,0x5694a6f84b8f875c276afd2ebcfe4d61,1 +203,1,0,3,0xde9ec90305afb1357b95b3e0da43885e,1 +203,1,0,4,0x0dffad9ffd0b757d8051dec02ebdf70d,1 +203,1,0,5,0x8ee2dc5c7870c0823b6ccc7c679cbaa4,1 +203,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +203,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +203,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +203,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +203,0,1,0,0,1 +203,0,1,1,1,1 +204,1,0,0,0xffffffff293886d3086fd567aafd598f,1 +204,1,0,1,0x0fe975f735887194a764a231e82d289a,1 +204,1,0,2,0xa0c30e8026fdb2b4b4968a27d16a6d08,1 +204,1,0,3,0xf7098f1a98d21620d7454ba9790f1ba6,1 +204,1,0,4,0x5e470453a8a399f15baf463f9deceb53,1 +204,1,0,5,0xacc5ca64459149688bd2760c65424339,1 +204,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +204,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +204,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +204,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +204,0,1,0,0,1 +204,0,1,1,1,1 +205,1,0,0,0x7bffffffff2376d1e3c03445a072e243,1 +205,1,0,1,0x26acdc4ce127ec2e0e8d9ca99527e7b7,1 +205,1,0,2,0x614ea84acf736527dd73602cd4bb4eea,1 +205,1,0,3,0x1dfebebd5ad8aca52aa0228cf7b99a88,1 +205,1,0,4,0x737cc85f5f2d2f60d1b8183f3ed490e4,1 +205,1,0,5,0xde14368e96a9482c2a4dd193195c902f,1 +205,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +205,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +205,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +205,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +205,0,1,0,0,1 +205,0,1,1,1,1 +206,1,0,0,0xa2b5ffffffffebb251b085377605a224,1 +206,1,0,1,0xbc80872602a6e467fd016807e97fa395,1 +206,1,0,2,0xbead6734ebe44b810d3fb2ea00b17329,1 +206,1,0,3,0x45377338febfd439a8d74dfbd0f942fa,1 +206,1,0,4,0x6bb18eae36616a7d3cad35919fd21a8a,1 +206,1,0,5,0xf4bbe7a10f73b3e036a46b103ef56e2a,1 +206,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +206,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +206,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +206,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +206,0,1,0,0,1 +206,0,1,1,1,1 +207,1,0,0,0x641227ffffffff6f1b96fa5f097fcf3c,1 +207,1,0,1,0xc1a3c256870d45a67b83d0967d4b20c0,1 +207,1,0,2,0x499625479e161dacd4db9d9ce64854c9,1 +207,1,0,3,0x8d922cbf212703e9654fae182df9bad2,1 +207,1,0,4,0x42c177cf37b8193a0131108d97819edd,1 +207,1,0,5,0x9439936028864ac195b64fca76d9d693,1 +207,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +207,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +207,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +207,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +207,0,1,0,0,1 +207,0,1,1,1,1 +208,1,0,0,0x958415d8ffffffffabad03e2fc662dc3,1 +208,1,0,1,0xba203521177502298df56f36600e0f8b,1 +208,1,0,2,0x08f16b8093a8fb4d66a2c8065b541b3d,1 +208,1,0,3,0x31e3bfe694f6b89c50fb1aaa6ff6c9b2,1 +208,1,0,4,0x9d6455e2d5d1779748573b611cb95d4a,1 +208,1,0,5,0x21f967410399b39b535ba3e5af81ca2e,1 +208,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +208,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +208,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +208,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +208,0,1,0,0,1 +208,0,1,1,1,1 +209,1,0,0,0xf1d8de4858ffffffff1281093536f47f,1 +209,1,0,1,0xe13deb04e1fbe8fb954521b6975420f8,1 +209,1,0,2,0xbe26231b6191658a19dd72ddb99ed8f8,1 +209,1,0,3,0xc579b6938d19bce8eed8dc2b338cb5f8,1 +209,1,0,4,0xe1d9a32ee56cffed37f0f22b2dcb57d5,1 +209,1,0,5,0xc943c14f79694a03b9c5e96952575c89,1 +209,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +209,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +209,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +209,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +209,0,1,0,0,1 +209,0,1,1,1,1 +210,1,0,0,0x0927895f2802ffffffff10782dd14a3b,1 +210,1,0,1,0x32dc5d47c05ef6f1876b95c81fc31def,1 +210,1,0,2,0x15e76880898316b16204ac920a02d580,1 +210,1,0,3,0x45f36a229d4aa4f812638c455abe0443,1 +210,1,0,4,0xe74d357d3fcb5c8c5337bd6aba4178b4,1 +210,1,0,5,0x55ca10e226e13f9638196506a1939123,1 +210,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +210,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +210,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +210,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +210,0,1,0,0,1 +210,0,1,1,1,1 +211,1,0,0,0x60907984aa7e8effffffff4f332862a1,1 +211,1,0,1,0x0a57c3063fb5a30624cf6a0c3ac80589,1 +211,1,0,2,0x352ecb53f8df2c503a45f9846fc28d1d,1 +211,1,0,3,0x31e6307d3ddbffc1132315cc07f16dad,1 +211,1,0,4,0x1348dfa9c482c558e1d05c5242ca1c39,1 +211,1,0,5,0x436726ecd28258b1899792887dd0a3c6,1 +211,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +211,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +211,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +211,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +211,0,1,0,0,1 +211,0,1,1,1,1 +212,1,0,0,0xc6ff198484939170ffffffff0af42cda,1 +212,1,0,1,0x50f9a5f50636ea6942d6b9b8cd6ae1e2,1 +212,1,0,2,0x4a40801a7e606ba78a0da9882ab23c76,1 +212,1,0,3,0x77b8642349ed3d652c5bfa5f2a9558fb,1 +212,1,0,4,0x3a49b64848d682ef7f605f2832f7384b,1 +212,1,0,5,0xdc24ed2925825bf8ea77dc5981725782,1 +212,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +212,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +212,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +212,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +212,0,1,0,0,1 +212,0,1,1,1,1 +213,1,0,0,0xde030419345ca15c75ffffffff807479,1 +213,1,0,1,0x9b9e0956cc43135d16dfbe4d27d7e68d,1 +213,1,0,2,0xeacc5e1a8304a74d2be412b078924b3b,1 +213,1,0,3,0xb3511bac855c05c9e5e9e44df3d61e96,1 +213,1,0,4,0x7451cd8e18d6ed1885dd827714847f96,1 +213,1,0,5,0xec4bb0ed4c36ce9808db8f714204f6d1,1 +213,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +213,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +213,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +213,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +213,0,1,0,0,1 +213,0,1,1,1,1 +214,1,0,0,0x6f0e3eeaf42b28132b88fffffffff6c8,1 +214,1,0,1,0x665604d34acb19037e1ab78caaaac6ff,1 +214,1,0,2,0x2f7a5e9e5771d424f30f67fdab61e8ce,1 +214,1,0,3,0x4f8cd1214882adb65f7de94c31577052,1 +214,1,0,4,0xac4e69808345809b44acb0b2bd889175,1 +214,1,0,5,0xfb75dd050c5a449ab9528f8f78daa10c,1 +214,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +214,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +214,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +214,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +214,0,1,0,0,1 +214,0,1,1,1,1 +215,1,0,0,0xcdb549f773b3e62b3708d1ffffffffbe,1 +215,1,0,1,0x48f7c0591ddcae7d2cb222d1f8017ab9,1 +215,1,0,2,0xffcda40f792ce4d93e7e0f0e95e1a214,1 +215,1,0,3,0x7dddd7f6487621c30a03d710b3300219,1 +215,1,0,4,0x79938b55f8a17f7ed7ba9ade8f2065a1,1 +215,1,0,5,0xfa77618f0b67add8d58c422c2453a49a,1 +215,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +215,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +215,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +215,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +215,0,1,0,0,1 +215,0,1,1,1,1 +216,1,0,0,0x2c3f26f96a3ac0051df4989bffffffff,1 +216,1,0,1,0x9fd64886c1dc4f9924d8fd6f0edb0484,1 +216,1,0,2,0x81f2359c4faba6b53d3e8c8c3fcc16a9,1 +216,1,0,3,0x48350f7ab3a588b28c17603a431e39a8,1 +216,1,0,4,0xcd6f6a5cc3b55ead0ff695d06c6860b5,1 +216,1,0,5,0x09e46d99fccefb9f7f9e101857f74300,1 +216,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +216,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +216,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +216,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +216,0,1,0,0,1 +216,0,1,1,1,1 +217,1,0,0,0xac18f8418c55a2502cb7d53f9affffff,1 +217,1,0,1,0xff5c31d89fda6a6b8476397c04edf411,1 +217,1,0,2,0xdfc8bf520445cbb8ee1596fb073ea283,1 +217,1,0,3,0xea130251a6fdffa5c3f5f2aaf75ca808,1 +217,1,0,4,0x048e33efce147c9dd92823640e338e68,1 +217,1,0,5,0xbfd7d0dc7a4905b3a7ac711e577e90e7,1 +217,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +217,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +217,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +217,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +217,0,1,0,0,1 +217,0,1,1,1,1 +218,1,0,0,0x4f9618f98e2d3a15b24094f72bb5ffff,1 +218,1,0,1,0xffffa2fd3e2893683e5a6ab8cf0ee610,1 +218,1,0,2,0xad019f74c6941d20efda70b46c53db16,1 +218,1,0,3,0x6503a0e393e932f688227688ba6a5762,1 +218,1,0,4,0x93320eb7ca0710255346bdbb3102cdcf,1 +218,1,0,5,0x7964ef2e0988e712bc05efe16c199345,1 +218,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +218,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +218,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +218,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +218,0,1,0,0,1 +218,0,1,1,1,1 +219,1,0,0,0x422e82a3d56ed10a9cc21d31d37a25ff,1 +219,1,0,1,0xffffff67edf7c40204caae73ab0bc75a,1 +219,1,0,2,0xac8096842e8add68c34e78ce11dd71e4,1 +219,1,0,3,0xb54316bd3ebf7fffdeb7bd5a3ebc1883,1 +219,1,0,4,0xf5ca2f4f23d674502d4caf85d187215d,1 +219,1,0,5,0x36e3ce9f0ce219709f21a3aac003b7a8,1 +219,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +219,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +219,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +219,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +219,0,1,0,0,1 +219,0,1,1,1,1 +220,1,0,0,0x7075d245ccc3281b6e7b329ff738fbb4,1 +220,1,0,1,0x17a5ffffffffa0842d9890b5cf95d018,1 +220,1,0,2,0x677b2d3a59b18a5ff939b70ea0022508,1 +220,1,0,3,0x89ddcd7b7b9d776854b4943693fb92f7,1 +220,1,0,4,0x6b4ba856ade7677bf30307b21f3ccda3,1 +220,1,0,5,0x5d2f63aee81efd0bab6972cc0795db55,1 +220,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +220,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +220,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +220,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +220,0,1,0,0,1 +220,0,1,1,1,1 +221,1,0,0,0x3c80de54cd9226989443d593fa4fd659,1 +221,1,0,1,0x7e280ebeffffffffc1847eb76c217a95,1 +221,1,0,2,0x479e1ded14bcaed0379ba8e1b73d3115,1 +221,1,0,3,0xd84d31d4b7c30e1f05e1fc0d5957cfb0,1 +221,1,0,4,0x918f79e35b3d89487cf634a4f05b2e0c,1 +221,1,0,5,0x30857ca879f97c771e877027355b2443,1 +221,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +221,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +221,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +221,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +221,0,1,0,0,1 +221,0,1,1,1,1 +222,1,0,0,0xde21754e29b85601980bef3d697ea277,1 +222,1,0,1,0x0ce891a8cdffffffffc7906aa794b39b,1 +222,1,0,2,0x43dfccd0edb9e280d9a58f01164d55c3,1 +222,1,0,3,0xd711e14b12ac5cf3b64840ead512a0a3,1 +222,1,0,4,0x1dbe33fa8ba84533cd5c4934365b3442,1 +222,1,0,5,0xca1174899b78ef9a3199f49584389772,1 +222,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +222,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +222,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +222,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +222,0,1,0,0,1 +222,0,1,1,1,1 +223,1,0,0,0x8f65d92927cfb86a84dd59623fb531bb,1 +223,1,0,1,0x599e4d5f7289ffffffff2f1f2f57881c,1 +223,1,0,2,0x5b09ab637bd4caf0f4c7c7e4bca592fe,1 +223,1,0,3,0xa20e9087c259d26a38bb4085f0bbff11,1 +223,1,0,4,0x45b7eb467b6748af618e9d80d6fdcd6a,1 +223,1,0,5,0xa24964e5a13f885bca8101de08eb0d75,1 +223,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +223,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +223,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +223,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +223,0,1,0,0,1 +223,0,1,1,1,1 +224,1,0,0,0x6b63e9a74e092120160bea3877dace8a,1 +224,1,0,1,0x2cc7cd0e8426cbfffffffffafc8c3ca8,1 +224,1,0,2,0x5e9b1c5a028070df5728c5c8af9b74e0,1 +224,1,0,3,0x667afa570a6cfa0114a5039ed15ee06f,1 +224,1,0,4,0xb1360907e2d9785ead362bb8d7bd661b,1 +224,1,0,5,0x6c29eeffd3c5037744edaeb9ad990c20,1 +224,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +224,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +224,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +224,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +224,0,1,0,0,1 +224,0,1,1,1,1 +225,1,0,0,0xfc28259702a03845b6d75219444e8b43,1 +225,1,0,1,0xd094586e249c8699ffffffffe852512e,1 +225,1,0,2,0x0671a0a85c2b72d54a2fb0990e34538b,1 +225,1,0,3,0x4890050f5a5712f6d1a7a5fb8578f32e,1 +225,1,0,4,0xdb1846bab6b7361479ab9c3285ca4129,1 +225,1,0,5,0x1808f27fd5bd4fdac720e5854713694c,1 +225,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +225,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +225,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +225,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +225,0,1,0,0,1 +225,0,1,1,1,1 +226,1,0,0,0x1273b4502ea4e3bccee044ee8e8db7f7,1 +226,1,0,1,0x74ecbcd52e8ceb571757ffffffffe20a,1 +226,1,0,2,0x7673f8526748446477dbbb0590a45492,1 +226,1,0,3,0xc5d7d69859d301abbaedb35b2095103a,1 +226,1,0,4,0x3dc70ddf9c6b524d886bed9e6af02e0e,1 +226,1,0,5,0x4dec0d417a414fed3807ef4422913d7c,1 +226,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +226,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +226,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +226,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +226,0,1,0,0,1 +226,0,1,1,1,1 +227,1,0,0,0x08fb565610a79baa0c566c66228d8181,1 +227,1,0,1,0x4f8c53a15b96e602fb49ffffffffff6e,1 +227,1,0,2,0x7f085441070ecd2bb21285089ebb1aa6,1 +227,1,0,3,0x450d1a06c36d3ff39dfd657a796d12b5,1 +227,1,0,4,0x249712012029870a2459d18d47da9aa4,1 +227,1,0,5,0x92a5e6cb4b2d8dafa9e4c5c54a2b9a8b,1 +227,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +227,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +227,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +227,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +227,0,1,0,0,1 +227,0,1,1,1,1 +228,1,0,0,0xd59291cc2cf89f3087715fcb1aa4e79a,1 +228,1,0,1,0xa2403f748e97d7cd28ecaefeffffffff,1 +228,1,0,2,0x914c67fb61dd1e27c867398ea7322d5a,1 +228,1,0,3,0xb76df04bc5aa6683a8e0f30a5d287348,1 +228,1,0,4,0xfa07474031481dda4953e3ac1959ee8c,1 +228,1,0,5,0xea7e66ec412b38d6c96d28f6d37304ea,1 +228,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +228,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +228,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +228,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +228,0,1,0,0,1 +228,0,1,1,1,1 +229,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +229,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +229,1,0,2,0xffffffff00000000ffffffffffffffff,1 +229,1,0,3,0xbce6faada7179e84f3b9cac2fc63254f,1 +229,1,0,4,0xffffffff00000000ffffffffffffffff,1 +229,1,0,5,0xbce6faada7179e84f3b9cac2fc63254e,1 +229,1,0,6,0xab05fd9d0de26b9ce6f4819652d9fc69,1 +229,1,0,7,0x193d0aa398f0fba8013e09c582204554,1 +229,1,0,8,0x19235271228c786759095d12b75af069,1 +229,1,0,9,0x2dd4103f19f6a8c32f49435a1e9b8d45,1 +229,0,1,0,0,1 +229,0,1,1,1,1 +230,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +230,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +230,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +230,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +230,1,0,4,0x909135bdb6799286170f5ead2de4f651,1 +230,1,0,5,0x1453fe50914f3df2de54a36383df8dd4,1 +230,1,0,6,0x80984f39a1ff38a86a68aa4201b6be5d,1 +230,1,0,7,0xfbfecf876219710b07badf6fdd4c6c56,1 +230,1,0,8,0x11feb97390d9826e7a06dfb41871c940,1 +230,1,0,9,0xd74415ed3cac2089f1445019bb55ed95,1 +230,0,1,0,0,1 +230,0,1,1,1,1 +231,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +231,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +231,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +231,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +231,1,0,4,0x27b4577ca009376f71303fd5dd227dce,1 +231,1,0,5,0xf5deb773ad5f5a84360644669ca249a5,1 +231,1,0,6,0x4201b4272944201c3294f5baa9a3232b,1 +231,1,0,7,0x6dd687495fcc19a70a95bc602b4f7c05,1 +231,1,0,8,0x95c37eba9ee8171c1bb5ac6feaf753bc,1 +231,1,0,9,0x36f463e3aef16629572c0c0a8fb0800e,1 +231,0,1,0,0,1 +231,0,1,1,1,1 +232,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +232,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +232,1,0,2,0xffffffff00000000ffffffffffffffff,1 +232,1,0,3,0xbce6faada7179e84f3b9cac2fc6324d5,1 +232,1,0,4,0x55555555000000005555555555555555,1 +232,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +232,1,0,6,0x083539fbee44625e3acaafa2fcb41349,1 +232,1,0,7,0x392cef0633a1b8fabecee0c133b10e99,1 +232,1,0,8,0x915c1ebe7bf00df8535196770a58047a,1 +232,1,0,9,0xe2a402f26326bb7d41d4d7616337911e,1 +232,0,1,0,0,1 +232,0,1,1,1,1 +233,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +233,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +233,1,0,2,0x7fffffff800000007fffffffffffffff,1 +233,1,0,3,0xde737d56d38bcf4279dce5617e3192a8,1 +233,1,0,4,0x55555555000000005555555555555555,1 +233,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +233,1,0,6,0xb533d4695dd5b8c5e07757e55e6e516f,1 +233,1,0,7,0x7e2c88fa0239e23f60e8ec07dd70f287,1 +233,1,0,8,0x1b134ee58cc583278456863f33c3a85d,1 +233,1,0,9,0x881f7d4a39850143e29d4eaf009afe47,1 +233,0,1,0,0,1 +233,0,1,1,0,1 +234,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +234,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +234,1,0,2,0x7fffffff800000007fffffffffffffff,1 +234,1,0,3,0xde737d56d38bcf4279dce5617e3192a9,1 +234,1,0,4,0x7fffffff800000007fffffffffffffff,1 +234,1,0,5,0xde737d56d38bcf4279dce5617e3192a8,1 +234,1,0,6,0xf50d371b91bfb1d7d14e1323523bc3aa,1 +234,1,0,7,0x8cbf2c57f9e284de628c8b4536787b86,1 +234,1,0,8,0xf94ad887ac94d527247cd2e7d0c8b129,1 +234,1,0,9,0x1c553c9730405380b14cbb209f5fa2dd,1 +234,0,1,0,0,1 +234,0,1,1,1,1 +235,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +235,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +235,1,0,2,0x7fffffff800000007fffffffffffffff,1 +235,1,0,3,0xde737d56d38bcf4279dce5617e3192a9,1 +235,1,0,4,0x7fffffff800000007fffffffffffffff,1 +235,1,0,5,0xde737d56d38bcf4279dce5617e3192a9,1 +235,1,0,6,0x68ec6e298eafe16539156ce57a14b04a,1 +235,1,0,7,0x7047c221bafc3a582eaeb0d857c4d946,1 +235,1,0,8,0x97bed1af17850117fdb39b2324f220a5,1 +235,1,0,9,0x698ed16c426a27335bb385ac8ca6fb30,1 +235,0,1,0,0,1 +235,0,1,1,1,1 +236,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +236,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +236,1,0,2,0x55555555000000005555555555555555,1 +236,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +236,1,0,4,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +236,1,0,5,0x0036e7c32b270c8807a419feca605023,1 +236,1,0,6,0x69da0364734d2e530fece94019265fef,1 +236,1,0,7,0xb781a0f1b08f6c8897bdf6557927c8b8,1 +236,1,0,8,0x66d2d3c7dcd518b23d726960f069ad71,1 +236,1,0,9,0xa933d86ef8abbcce8b20f71e2a847002,1 +236,0,1,0,0,1 +236,0,1,1,1,1 +237,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +237,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +237,1,0,2,0x55555555000000005555555555555555,1 +237,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +237,1,0,4,0x44a5ad0ad0636d9f12bc9e0a6bdd5e1c,1 +237,1,0,5,0xbcb012ea7bf091fcec15b0c43202d52e,1 +237,1,0,6,0xd8adc00023a8edc02576e2b63e3e3062,1 +237,1,0,7,0x1a471e2b2320620187bf067a1ac1ff32,1 +237,1,0,8,0x33e2b50ec09807accb36131fff95ed12,1 +237,1,0,9,0xa09a86b4ea9690aa32861576ba2362e1,1 +237,0,1,0,0,1 +237,0,1,1,1,1 +238,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +238,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +238,1,0,2,0x55555555000000005555555555555555,1 +238,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +238,1,0,4,0x55555555000000005555555555555555,1 +238,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +238,1,0,6,0x3623ac973ced0a56fa6d882f03a7d5c7,1 +238,1,0,7,0xedca02cfc7b2401fab3690dbe75ab785,1 +238,1,0,8,0x8db06908e64b28613da7257e737f3979,1 +238,1,0,9,0x3da8e713ba0643b92e9bb3252be7f8fe,1 +238,0,1,0,0,1 +238,0,1,1,1,1 +239,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +239,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +239,1,0,2,0x55555555000000005555555555555555,1 +239,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +239,1,0,4,0xaaaaaaaa00000000aaaaaaaaaaaaaaaa,1 +239,1,0,5,0x7def51c91a0fbf034d26872ca84218e1,1 +239,1,0,6,0xcf04ea77e9622523d894b93ff52dc302,1 +239,1,0,7,0x7b31959503b6fa3890e5e04263f922f1,1 +239,1,0,8,0xe8528fb7c006b3983c8b8400e57b4ed7,1 +239,1,0,9,0x1740c2f3975438821199bedeaecab2e9,1 +239,0,1,0,0,1 +239,0,1,1,1,1 +240,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +240,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +240,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +240,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +240,1,0,4,0xe91e1ba60fdedb76a46bcb51dc0b8b4b,1 +240,1,0,5,0x7e019f0a28721885fa5d3a8196623397,1 +240,1,0,6,0xdb7a2c8a1ab573e5929dc24077b508d7,1 +240,1,0,7,0xe683d49227996bda3e9f78dbeff77350,1 +240,1,0,8,0x4f417f3bc9a88075c2e0aadd5a133117,1 +240,1,0,9,0x30cf7cc76a82f11a36eaf08a6c99a206,1 +240,0,1,0,0,1 +240,0,1,1,1,1 +241,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +241,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +241,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +241,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +241,1,0,4,0xfdea5843ffeb73af94313ba4831b53fe,1 +241,1,0,5,0x24f799e525b1e8e8c87b59b95b430ad9,1 +241,1,0,6,0xdead11c7a5b396862f21974dc4752fad,1 +241,1,0,7,0xeff994efe9bbd05ab413765ea80b6e1f,1 +241,1,0,8,0x1de3f0640e8ac6edcf89cff53c40e265,1 +241,1,0,9,0xbb94078a343736df07aa0318fc7fe1ff,1 +241,0,1,0,0,1 +241,0,1,1,1,1 +242,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +242,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +242,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +242,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +242,1,0,4,0x03ffcabf2f1b4d2a65190db1680d62bb,1 +242,1,0,5,0x994e41c5251cd73b3c3dfc5e5bafc035,1 +242,1,0,6,0xd0bc472e0d7c81ebaed3a6ef96c18613,1 +242,1,0,7,0xbb1fea6f994326fbe80e00dfde67c7e9,1 +242,1,0,8,0x986c723ea4843d48389b946f64ad56c8,1 +242,1,0,9,0x3ad70ff17ba85335667d1bb9fa619efd,1 +242,0,1,0,0,1 +242,0,1,1,1,1 +243,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +243,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +243,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +243,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +243,1,0,4,0x4dfbc401f971cd304b33dfdb17d0fed0,1 +243,1,0,5,0xfe4c1a88ae648e0d2847f74977534989,1 +243,1,0,6,0xa0a44ca947d66a2acb736008b9c08d1a,1 +243,1,0,7,0xb2ad03776e02640f78495d458dd51c32,1 +243,1,0,8,0x6337fe5cf8c4604b1f1c409dc2d872d4,1 +243,1,0,9,0x294a4762420df43a30a2392e40426add,1 +243,0,1,0,0,1 +243,0,1,1,1,1 +244,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +244,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +244,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +244,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +244,1,0,4,0xbc4024761cd2ffd43dfdb17d0fed112b,1 +244,1,0,5,0x988977055cd3a8e54971eba9cda5ca71,1 +244,1,0,6,0xc9c2115290d008b45fb65fad0f602389,1 +244,1,0,7,0x298c25420b775019d42b62c3ce8a96b7,1 +244,1,0,8,0x3877d25a8080dc02d987ca730f0405c2,1 +244,1,0,9,0xc9dbefac46f9e601cc3f06e9713973fd,1 +244,0,1,0,0,1 +244,0,1,1,1,1 +245,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +245,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +245,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +245,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +245,1,0,4,0x788048ed39a5ffa77bfb62fa1fda2257,1 +245,1,0,5,0x742bf35d128fb3459f2a0c909ee86f91,1 +245,1,0,6,0x5eca1ef4c287dddc66b8bccf1b88e8a2,1 +245,1,0,7,0x4c0018962f3c5e7efa83bc1a5ff6033e,1 +245,1,0,8,0x5e79c4cb2c245b8c45abdce8a8e4da75,1 +245,1,0,9,0x8d92a607c32cd407ecaef22f1c934a71,1 +245,0,1,0,0,1 +245,0,1,1,1,1 +246,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +246,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +246,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +246,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +246,1,0,4,0x476d9131fd381bd917d0fed112bc9e0a,1 +246,1,0,5,0x5924b5ed5b11167edd8b23582b3cb15e,1 +246,1,0,6,0x5caaa030e7fdf0e4936bc7ab5a96353e,1 +246,1,0,7,0x0a01e4130c3f8bf22d473e317029a47a,1 +246,1,0,8,0xdeb6adc462f7058f2a20d371e9702254,1 +246,1,0,9,0xe9b201642005b3ceda926b42b178bef9,1 +246,0,1,0,0,1 +246,0,1,1,1,1 +247,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +247,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +247,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +247,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +247,1,0,4,0x8374253e3e21bd154448d0a8f640fe46,1 +247,1,0,5,0xfafa8b19ce78d538f6cc0a19662d3601,1 +247,1,0,6,0xc2fd20bac06e555bb8ac0ce69eb1ea20,1 +247,1,0,7,0xf83a1fc3501c8a66469b1a31f619b098,1 +247,1,0,8,0x6237050779f52b615bd7b8d76a25fc95,1 +247,1,0,9,0xca2ed32525c75f27ffc87ac397e6cbaf,1 +247,0,1,0,0,1 +247,0,1,1,1,1 +248,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +248,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +248,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +248,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +248,1,0,4,0x357cfd3be4d01d413c5b9ede36cba545,1 +248,1,0,5,0x2c11ee7fe14879e749ae6a2d897a52d6,1 +248,1,0,6,0x3fd6a1ca7f77fb3b0bbe726c37201006,1 +248,1,0,7,0x8426e11ea6ae78ce17bedae4bba86ced,1 +248,1,0,8,0x03ce5516406bf8cfaab8745eac1cd690,1 +248,1,0,9,0x18ad6f50b5461872ddfc56e0db3c8ff4,1 +248,0,1,0,0,1 +248,0,1,1,1,1 +249,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +249,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +249,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +249,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +249,1,0,4,0x29798c5c0ee287d4a5e8e6b799fd86b8,1 +249,1,0,5,0xdf5225298e6ffc807cd2f2bc27a0a6d8,1 +249,1,0,6,0x9cb8e51e27a5ae3b624a60d6dc32734e,1 +249,1,0,7,0x4989db20e9bca3ede1edf7b086911114,1 +249,1,0,8,0xb4c104ab3c677e4b36d6556e8ad5f523,1 +249,1,0,9,0x410a19f2e277aa895fc57322b4427544,1 +249,0,1,0,0,1 +249,0,1,1,1,1 +250,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +250,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +250,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +250,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +250,1,0,4,0x0b70f22c781092452dca1a5711fa3a5a,1 +250,1,0,5,0x1f72add1bf52c2ff7cae4820b30078dd,1 +250,1,0,6,0xa3e52c156dcaf10502620b7955bc2b40,1 +250,1,0,7,0xbc78ef3d569e1223c262512d8f49602a,1 +250,1,0,8,0x4a2039f31c1097024ad3cc86e57321de,1 +250,1,0,9,0x032355463486164cf192944977df147f,1 +250,0,1,0,0,1 +250,0,1,1,1,1 +251,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +251,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +251,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +251,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +251,1,0,4,0x16e1e458f021248a5b9434ae23f474b4,1 +251,1,0,5,0x3ee55ba37ea585fef95c90416600f1ba,1 +251,1,0,6,0xf19b78928720d5bee8e670fb90010fb1,1 +251,1,0,7,0x5c37bf91b58a5157c3f3c059b2655e88,1 +251,1,0,8,0xcf701ec962fb4a11dcf273f5dc357e58,1 +251,1,0,9,0x468560c7cfeb942d074abd4329260509,1 +251,0,1,0,0,1 +251,0,1,1,1,1 +252,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +252,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +252,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +252,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +252,1,0,4,0x2252d6856831b6cf895e4f0535eeaf0e,1 +252,1,0,5,0x5e5809753df848fe760ad86219016a97,1 +252,1,0,6,0x83a744459ecdfb01a5cf52b27a05bb73,1 +252,1,0,7,0x37482d242f235d7b4cb89345545c90a8,1 +252,1,0,8,0xc05d49337b9649813287de9ffe90355f,1 +252,1,0,9,0xd905df5f3c32945828121f37cc50de6e,1 +252,0,1,0,0,1 +252,0,1,1,1,1 +253,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +253,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +253,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +253,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +253,1,0,4,0x81ffe55f178da695b28c86d8b406b15d,1 +253,1,0,5,0xab1a9e39661a3ae017fbe390ac0972c3,1 +253,1,0,6,0xdd13c6b34c56982ddae124f039dfd23f,1 +253,1,0,7,0x4b19bbe88cee8e528ae51e5d6f3a21d7,1 +253,1,0,8,0xbfad4c2e6f263fe5eb59ca974d039fc0,1 +253,1,0,9,0xe4c3345692fb5320bdae4bd3b42a45ff,1 +253,0,1,0,0,1 +253,0,1,1,1,1 +254,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +254,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +254,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +254,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +254,1,0,4,0x7fffffffaaaaaaaaffffffffffffffff,1 +254,1,0,5,0xe9a2538f37b28a2c513dee40fecbb71a,1 +254,1,0,6,0x67e6f659cdde869a2f65f094e94e5b4d,1 +254,1,0,7,0xfad636bbf95192feeed01b0f3deb7460,1 +254,1,0,8,0xa37e0a51f258b7aeb51dfe592f5cfd56,1 +254,1,0,9,0x85bbe58712c8d9233c62886437c38ba0,1 +254,0,1,0,0,1 +254,0,1,1,1,1 +255,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +255,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +255,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +255,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +255,1,0,4,0xb62f26b5f2a2b26f6de86d42ad8a13da,1 +255,1,0,5,0x3ab3cccd0459b201de009e526adf21f2,1 +255,1,0,6,0x2eb6412505aec05c6545f029932087e4,1 +255,1,0,7,0x90d05511e8ec1f599617bb367f9ecaaf,1 +255,1,0,8,0x805f51efcc4803403f9b1ae0124890f0,1 +255,1,0,9,0x6a43fedcddb31830f6669af292895cb0,1 +255,0,1,0,0,1 +255,0,1,1,1,1 +256,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +256,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +256,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +256,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +256,1,0,4,0xbb1d9ac949dd748cd02bbbe749bd351c,1 +256,1,0,5,0xd57b38bb61403d700686aa7b4c90851e,1 +256,1,0,6,0x84db645868eab35e3a9fd80e056e2e85,1 +256,1,0,7,0x5435e3a6b68d75a50a854625fe0d7f35,1 +256,1,0,8,0x6d2589ac655edc9a11ef3e075eddda9a,1 +256,1,0,9,0xbf92e72171570ef7bf43a2ee39338cfe,1 +256,0,1,0,0,1 +256,0,1,1,1,1 +257,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +257,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +257,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +257,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +257,1,0,4,0x66755a00638cdaec1c732513ca0234ec,1 +257,1,0,5,0xe52545dac11f816e818f725b4f60aaf2,1 +257,1,0,6,0x91b9e47c56278662d75c0983b22ca8ea,1 +257,1,0,7,0x6aa5059b7a2ff7637eb2975e386ad663,1 +257,1,0,8,0x49aa8ff283d0f77c18d6d11dc062165f,1 +257,1,0,9,0xd13c3c0310679c1408302a16854ecfbd,1 +257,0,1,0,0,1 +257,0,1,1,1,1 +258,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +258,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +258,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +258,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +258,1,0,4,0x55a00c9fcdaebb6032513ca0234ecfff,1 +258,1,0,5,0xe98ebe492fdf02e48ca48e982beb3669,1 +258,1,0,6,0xf3ec2f13caf04d0192b47fb4c5311fb6,1 +258,1,0,7,0xd4dc6b0a9e802e5327f7ec5ee8e4834d,1 +258,1,0,8,0xf97e3e468b7d0db867d6ecfe81e2b0f9,1 +258,1,0,9,0x531df87efdb47c1338ac321fefe5a432,1 +258,0,1,0,0,1 +258,0,1,1,1,1 +259,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +259,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +259,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +259,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +259,1,0,4,0xab40193f9b5d76c064a27940469d9fff,1 +259,1,0,5,0xd31d7c925fbe05c919491d3057d66cd2,1 +259,1,0,6,0xd92b200aefcab6ac7dafd9acaf2fa10b,1 +259,1,0,7,0x3180235b8f46b4503e4693c670fccc88,1 +259,1,0,8,0x5ef2f3aebf5b317475336256768f7c19,1 +259,1,0,9,0xefb7352d27e4cccadc85b6b8ab922c72,1 +259,0,1,0,0,1 +259,0,1,1,1,1 +260,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +260,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +260,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +260,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +260,1,0,4,0xca0234ebb5fdcb13ca0234ecffffffff,1 +260,1,0,5,0xcb0dadbbc7f549f8a26b4408d0dc8600,1 +260,1,0,6,0x0a88361eb92ecca2625b38e5f98bbabb,1 +260,1,0,7,0x96bf179b3d76fc48140a3bcd881523cd,1 +260,1,0,8,0xe6bdf56033f84a5054035597375d9086,1 +260,1,0,9,0x6aa2c96b86a41ccf6edebf47298ad489,1 +260,0,1,0,0,1 +260,0,1,1,1,1 +261,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +261,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +261,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +261,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +261,1,0,4,0xbfffffff3ea3677e082b9310572620ae,1 +261,1,0,5,0x19933a9e65b285598711c77298815ad3,1 +261,1,0,6,0xd0fb17ccd8fafe827e0c1afc5d8d8036,1 +261,1,0,7,0x6e2b20e7f14a563a2ba50469d84375e8,1 +261,1,0,8,0x68612569d39e2bb9f554355564646de9,1 +261,1,0,9,0x9ac602cc6349cf8c1e236a7de7637d93,1 +261,0,1,0,0,1 +261,0,1,1,1,1 +262,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +262,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +262,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +262,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +262,1,0,4,0x266666663bbbbbbbe666666666666666,1 +262,1,0,5,0x5b37902e023fab7c8f055d86e5cc41f4,1 +262,1,0,6,0x836f33bbc1dc0d3d3abbcef0d91f11e2,1 +262,1,0,7,0xac4181076c9af0a22b1e4309d3edb276,1 +262,1,0,8,0x9ab443ff6f901e30c773867582997c2b,1 +262,1,0,9,0xec2b0cb8120d760236f3a95bbe881f75,1 +262,0,1,0,0,1 +262,0,1,1,1,1 +263,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +263,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +263,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +263,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +263,1,0,4,0xbfffffff36db6db7a492492492492492,1 +263,1,0,5,0x146c573f4c6dfc8d08a443e258970b09,1 +263,1,0,6,0x92f99fbe973ed4a299719baee4b43274,1 +263,1,0,7,0x1237034dec8d72ba5103cb33e55feeb8,1 +263,1,0,8,0x033dd0e91134c734174889f3ebcf1b7a,1 +263,1,0,9,0x1ac05767289280ee7a794cebd6e69697,1 +263,0,1,0,0,1 +263,0,1,1,1,1 +264,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +264,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +264,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +264,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +264,1,0,4,0xbfffffff2aaaaaab7fffffffffffffff,1 +264,1,0,5,0xc815d0e60b3e596ecb1ad3a27cfd49c4,1 +264,1,0,6,0xd35ba58da30197d378e618ec0fa7e2e2,1 +264,1,0,7,0xd12cffd73ebbb2049d130bba434af09e,1 +264,1,0,8,0xff83986e6875e41ea432b7585a49b3a6,1 +264,1,0,9,0xc77cbb3c47919f8e82874c794635c1d2,1 +264,0,1,0,0,1 +264,0,1,1,1,1 +265,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +265,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +265,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +265,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +265,1,0,4,0x7fffffff55555555ffffffffffffffff,1 +265,1,0,5,0xd344a71e6f651458a27bdc81fd976e37,1 +265,1,0,6,0x8651ce490f1b46d73f3ff475149be291,1 +265,1,0,7,0x36697334a519d7ddab0725c8d0793224,1 +265,1,0,8,0xe11c65bd8ca92dc8bc9ae82911f0b527,1 +265,1,0,9,0x51ce21dd9003ae60900bd825f590cc28,1 +265,0,1,0,0,1 +265,0,1,1,1,1 +266,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +266,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +266,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +266,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +266,1,0,4,0x3fffffff800000007fffffffffffffff,1 +266,1,0,5,0xde737d56d38bcf4279dce5617e3192aa,1 +266,1,0,6,0x6d8e1b12c831a0da8795650ff95f101e,1 +266,1,0,7,0xd921d9e2f72b15b1cdaca9826b9cfc6d,1 +266,1,0,8,0xef6d63e2bc5c089570394a4bc9f892d5,1 +266,1,0,9,0xe6c7a6a637b20469a58c106ad486bf37,1 +266,0,1,0,0,1 +266,0,1,1,1,1 +267,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +267,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +267,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +267,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +267,1,0,4,0x5d8ecd64a4eeba466815ddf3a4de9a8e,1 +267,1,0,5,0x6abd9c5db0a01eb80343553da648428f,1 +267,1,0,6,0x0ae580bae933b4ef2997cbdbb0922328,1 +267,1,0,7,0xca9a410f627a0f7dff24cb4d920e1542,1 +267,1,0,8,0x8911e7f8cc365a8a88eb81421a361ccc,1 +267,1,0,9,0x2b99e309d8dcd9a98ba83c3949d893e3,1 +267,0,1,0,0,1 +267,0,1,1,1,1 +268,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +268,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +268,1,0,2,0x6f2347cab7dd76858fe0555ac3bc9904,1 +268,1,0,3,0x8c4aacafdfb6bcbe05ea6c42c4934569,1 +268,1,0,4,0xbb726660235793aa9957a61e76e00c2c,1 +268,1,0,5,0x435109cf9a15dd624d53f4301047856b,1 +268,1,0,6,0x5b812fd521aafa69835a849cce6fbdeb,1 +268,1,0,7,0x6983b442d2444fe70e134c027fc46963,1 +268,1,0,8,0x838a40f2a36092e9004e92d8d940cf56,1 +268,1,0,9,0x38550ce672ce8b8d4e15eba5499249e9,1 +268,0,1,0,0,1 +268,0,1,1,1,1 +269,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +269,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +269,1,0,2,0x6f2347cab7dd76858fe0555ac3bc9904,1 +269,1,0,3,0x8c4aacafdfb6bcbe05ea6c42c4934569,1 +269,1,0,4,0xbb726660235793aa9957a61e76e00c2c,1 +269,1,0,5,0x435109cf9a15dd624d53f4301047856b,1 +269,1,0,6,0x5b812fd521aafa69835a849cce6fbdeb,1 +269,1,0,7,0x6983b442d2444fe70e134c027fc46963,1 +269,1,0,8,0x7c75bf0c5c9f6d17ffb16d2726bf30a9,1 +269,1,0,9,0xc7aaf31a8d317472b1ea145ab66db616,1 +269,0,1,0,0,1 +269,0,1,1,0,1 +270,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +270,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +270,1,0,2,0x55555555000000005555555555555555,1 +270,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +270,1,0,4,0x33333333000000003333333333333333,1 +270,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aa9,1 +270,1,0,6,0xdd86d3b5f4a13e8511083b78002081c5,1 +270,1,0,7,0x3ff467f11ebd98a51a633db76665d250,1 +270,1,0,8,0x45d5c8200c89f2fa10d849349226d21d,1 +270,1,0,9,0x8dfaed6ff8d5cb3e1b7e17474ebc18f7,1 +270,0,1,0,0,1 +270,0,1,1,0,1 +271,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +271,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +271,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +271,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +271,1,0,4,0x55555555000000005555555555555555,1 +271,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +271,1,0,6,0x4fea55b32cb32aca0c12c4cd0abfb4e6,1 +271,1,0,7,0x4b0f5a516e578c016591a93f5a0fbcc5,1 +271,1,0,8,0xd7d3fd10b2be668c547b212f6bb14c88,1 +271,1,0,9,0xf0fecd38a8a4b2c785ed3be62ce4b280,1 +271,0,1,0,0,1 +271,0,1,1,1,1 +272,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +272,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +272,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +272,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +272,1,0,4,0xb6db6db6249249254924924924924924,1 +272,1,0,5,0x625bd7a09bec4ca81bcdd9f8fd6b63cc,1 +272,1,0,6,0xc6a771527024227792170a6f8eee735b,1 +272,1,0,7,0xf32b7f98af669ead299802e32d7c3107,1 +272,1,0,8,0xbc3b4b5e65ab887bbd343572b3e56192,1 +272,1,0,9,0x61fe3a073e2ffd78412f726867db589e,1 +272,0,1,0,0,1 +272,0,1,1,1,1 +273,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +273,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +273,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +273,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +273,1,0,4,0xcccccccc00000000cccccccccccccccc,1 +273,1,0,5,0x971f2ef152794b9d8fc7d568c9e8eaa7,1 +273,1,0,6,0x851c2bbad08e54ec7a9af99f49f03644,1 +273,1,0,7,0xd6ec6d59b207fec98de85a7d15b956ef,1 +273,1,0,8,0xcee9960283045075684b410be8d0f749,1 +273,1,0,9,0x4b91aa2379f60727319f10ddeb0fe9d6,1 +273,0,1,0,0,1 +273,0,1,1,1,1 +274,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +274,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +274,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +274,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +274,1,0,4,0x33333333000000003333333333333333,1 +274,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aaa,1 +274,1,0,6,0xf6417c8a670584e388676949e53da7fc,1 +274,1,0,7,0x55911ff68318d1bf3061205acb19c48f,1 +274,1,0,8,0x8f2b743df34ad0f72674acb750592978,1 +274,1,0,9,0x4779cd9ac916c3669ead43026ab6d43f,1 +274,0,1,0,0,1 +274,0,1,1,1,1 +275,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +275,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +275,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +275,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +275,1,0,4,0x49249248db6db6dbb6db6db6db6db6db,1 +275,1,0,5,0x5a8b230d0b2b51dcd7ebf0c9fef7c185,1 +275,1,0,6,0x501421277be45a5eefec6c639930d636,1 +275,1,0,7,0x032565af420cf3373f557faa7f8a0643,1 +275,1,0,8,0x8673d6cb6076e1cfcdc7dfe7384c8e5c,1 +275,1,0,9,0xac08d74501f2ae6e89cad195d0aa1371,1 +275,0,1,0,0,1 +275,0,1,1,1,1 +276,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +276,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +276,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +276,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +276,1,0,4,0x16a4502e2781e11ac82cbc9d1edd8c98,1 +276,1,0,5,0x1584d13e18411e2f6e0478c34416e3bb,1 +276,1,0,6,0x0d935bf9ffc115a527735f729ca8a4ca,1 +276,1,0,7,0x23ee01a4894adf0e3415ac84e808bb34,1 +276,1,0,8,0x3195a3762fea29ed38912bd9ea6c4fde,1 +276,1,0,9,0x70c3050893a4375850ce61d82eba33c5,1 +276,0,1,0,0,1 +276,0,1,1,1,1 +277,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +277,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +277,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +277,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +277,1,0,4,0x55555555000000005555555555555555,1 +277,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +277,1,0,6,0x5e59f50708646be8a589355014308e60,1 +277,1,0,7,0xb668fb670196206c41e748e64e4dca21,1 +277,1,0,8,0x5de37fee5c97bcaf7144d5b459982f52,1 +277,1,0,9,0xeeeafbdf03aacbafef38e213624a01de,1 +277,0,1,0,0,1 +277,0,1,1,1,1 +278,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +278,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +278,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +278,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +278,1,0,4,0xb6db6db6249249254924924924924924,1 +278,1,0,5,0x625bd7a09bec4ca81bcdd9f8fd6b63cc,1 +278,1,0,6,0x169fb797325843faff2f7a5b5445da9e,1 +278,1,0,7,0x2fd6226f7ef90ef0bfe924104b02db8e,1 +278,1,0,8,0x7bbb8de662c7b9b1cf9b22f7a2e582bd,1 +278,1,0,9,0x46d581d68878efb2b861b131d8a1d667,1 +278,0,1,0,0,1 +278,0,1,1,1,1 +279,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +279,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +279,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +279,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +279,1,0,4,0xcccccccc00000000cccccccccccccccc,1 +279,1,0,5,0x971f2ef152794b9d8fc7d568c9e8eaa7,1 +279,1,0,6,0x271cd89c000143096b62d4e9e4ca885a,1 +279,1,0,7,0xef2f7023d18affdaf8b7b54898148754,1 +279,1,0,8,0x0a1c6e954e32108435b55fa385b0f764,1 +279,1,0,9,0x81a609b9149ccb4b02b2ca47fe8e4da5,1 +279,0,1,0,0,1 +279,0,1,1,1,1 +280,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +280,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +280,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +280,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +280,1,0,4,0x33333333000000003333333333333333,1 +280,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aaa,1 +280,1,0,6,0x3d0bc7ed8f09d2cb7ddb46ebc1ed799a,1 +280,1,0,7,0xb1563a9ab84bf524587a220afe499c12,1 +280,1,0,8,0xe22dc3b3c103824a4f378d96adb0a408,1 +280,1,0,9,0xabf19ce7d68aa6244f78cb216fa3f8df,1 +280,0,1,0,0,1 +280,0,1,1,1,1 +281,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +281,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +281,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +281,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +281,1,0,4,0x49249248db6db6dbb6db6db6db6db6db,1 +281,1,0,5,0x5a8b230d0b2b51dcd7ebf0c9fef7c185,1 +281,1,0,6,0xa6c885ade1a4c566f9bb010d066974ab,1 +281,1,0,7,0xb281797fa701288c721bcbd23663a9b7,1 +281,1,0,8,0x2e424b690957168d193a6096fc77a2b0,1 +281,1,0,9,0x04a9c7d467e007e1f2058458f98af316,1 +281,0,1,0,0,1 +281,0,1,1,1,1 +282,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +282,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +282,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +282,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +282,1,0,4,0x16a4502e2781e11ac82cbc9d1edd8c98,1 +282,1,0,5,0x1584d13e18411e2f6e0478c34416e3bb,1 +282,1,0,6,0x8d3c2c2c3b765ba8289e6ac3812572a2,1 +282,1,0,7,0x5bf75df62d87ab7330c3bdbad9ebfa5c,1 +282,1,0,8,0x4c6845442d66935b238578d43aec54f7,1 +282,1,0,9,0xcaa1621d1af241d4632e0b780c423f5d,1 +282,0,1,0,0,1 +282,0,1,1,1,1 +283,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +283,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +283,1,0,2,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +283,1,0,3,0x0036e7c32b270c8807a419feca605023,1 +283,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +283,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +283,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +283,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +283,1,0,8,0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16,1 +283,1,0,9,0x2bce33576b315ececbb6406837bf51f5,1 +283,0,1,0,0,1 +283,0,1,1,0,1 +284,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +284,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +284,1,0,2,0x44a5ad0ad0636d9f12bc9e0a6bdd5e1c,1 +284,1,0,3,0xbcb012ea7bf091fcec15b0c43202d52e,1 +284,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +284,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +284,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +284,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +284,1,0,8,0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16,1 +284,1,0,9,0x2bce33576b315ececbb6406837bf51f5,1 +284,0,1,0,0,1 +284,0,1,1,0,1 +285,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +285,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +285,1,0,2,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +285,1,0,3,0x0036e7c32b270c8807a419feca605023,1 +285,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +285,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +285,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +285,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +285,1,0,8,0xb01cbd1c01e58065711814b583f061e9,1 +285,1,0,9,0xd431cca994cea1313449bf97c840ae0a,1 +285,0,1,0,0,1 +285,0,1,1,0,1 +286,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +286,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +286,1,0,2,0x44a5ad0ad0636d9f12bc9e0a6bdd5e1c,1 +286,1,0,3,0xbcb012ea7bf091fcec15b0c43202d52e,1 +286,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +286,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +286,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +286,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +286,1,0,8,0xb01cbd1c01e58065711814b583f061e9,1 +286,1,0,9,0xd431cca994cea1313449bf97c840ae0a,1 +286,0,1,0,0,1 +286,0,1,1,0,1 +287,1,0,0,0xe3b0c44298fc1c149afbf4c8996fb924,1 +287,1,0,1,0x27ae41e4649b934ca495991b7852b855,1 +287,1,0,2,0xb292a619339f6e567a305c951c0dcbcc,1 +287,1,0,3,0x42d16e47f219f9e98e76e09d8770b34a,1 +287,1,0,4,0x0177e60492c5a8242f76f07bfe3661bd,1 +287,1,0,5,0xe59ec2a17ce5bd2dab2abebdf89a62e2,1 +287,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +287,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +287,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +287,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +287,0,1,0,0,1 +287,0,1,1,1,1 +288,1,0,0,0xdc1921946f4af96a2856e7be399007c9,1 +288,1,0,1,0xe807bdf4c5332f19f59ec9dd1bb8c7b3,1 +288,1,0,2,0x530bd6b0c9af2d69ba897f6b5fb59695,1 +288,1,0,3,0xcfbf33afe66dbadcf5b8d2a2a6538e23,1 +288,1,0,4,0xd85e489cb7a161fd55ededcedbf4cc0c,1 +288,1,0,5,0x0987e3e3f0f242cae934c72caa3f43e9,1 +288,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +288,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +288,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +288,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +288,0,1,0,0,1 +288,0,1,1,1,1 +289,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +289,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +289,1,0,2,0xa8ea150cb80125d7381c4c1f1da8e9de,1 +289,1,0,3,0x2711f9917060406a73d7904519e51388,1 +289,1,0,4,0xf3ab9fa68bd47973a73b2d40480c2ba5,1 +289,1,0,5,0x0c22c9d76ec217257288293285449b86,1 +289,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +289,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +289,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +289,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +289,0,1,0,0,1 +289,0,1,1,1,1 +290,1,0,0,0xde47c9b27eb8d300dbb5f2c353e632c3,1 +290,1,0,1,0x93262cf06340c4fa7f1b40c4cbd36f90,1 +290,1,0,2,0x986e65933ef2ed4ee5aada139f52b705,1 +290,1,0,3,0x39aaf63f00a91f29c69178490d57fb71,1 +290,1,0,4,0x3dafedfb8da6189d372308cbf1489bbb,1 +290,1,0,5,0xdabf0c0217d1c0ff0f701aaa7a694b9c,1 +290,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +290,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +290,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +290,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +290,0,1,0,0,1 +290,0,1,1,1,1 +291,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +291,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +291,1,0,2,0xd434e262a49eab7781e353a3565e4825,1 +291,1,0,3,0x50dd0fd5defa013c7f29745eff3569f1,1 +291,1,0,4,0x9b0c0a93f267fb6052fd8077be769c2b,1 +291,1,0,5,0x98953195d7bc10de844218305c6ba17a,1 +291,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +291,1,0,7,0xf3807eca117380239fbd816900000000,1 +291,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +291,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +291,0,1,0,0,1 +291,0,1,1,1,1 +292,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +292,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +292,1,0,2,0x0fe774355c04d060f76d79fd7a772e42,1 +292,1,0,3,0x1463489221bf0a33add0be9b1979110b,1 +292,1,0,4,0x500dcba1c69a8fbd43fa4f57f743ce12,1 +292,1,0,5,0x4ca8b91a1f325f3fac6181175df55737,1 +292,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +292,1,0,7,0xf3807eca117380239fbd816900000000,1 +292,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +292,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +292,0,1,0,0,1 +292,0,1,1,1,1 +293,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +293,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +293,1,0,2,0xbb40bf217bed3fb3950c7d39f03d36dc,1 +293,1,0,3,0x8e3b2cd79693f125bfd06595ee1135e3,1 +293,1,0,4,0x541bf3532351ebb032710bdb6a1bf1bf,1 +293,1,0,5,0xc89a1e291ac692b3fa4780745bb55677,1 +293,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +293,1,0,7,0xf3807eca117380239fbd816900000000,1 +293,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +293,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +293,0,1,0,0,1 +293,0,1,1,1,1 +294,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +294,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +294,1,0,2,0x664eb7ee6db84a34df3c86ea31389a54,1 +294,1,0,3,0x05badd5ca99231ff556d3e75a233e73a,1 +294,1,0,4,0x59f3c752e52eca46137642490a51560c,1 +294,1,0,5,0xe0badc678754b8f72e51a2901426a1bd,1 +294,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +294,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +294,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +294,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +294,0,1,0,0,1 +294,0,1,1,1,1 +295,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +295,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +295,1,0,2,0x4cd0429bbabd2827009d6fcd843d4ce3,1 +295,1,0,3,0x9c3e42e2d1631fd001985a79d1fd8b43,1 +295,1,0,4,0x9638bf12dd682f60be7ef1d0e0d98f08,1 +295,1,0,5,0xb7bca77a1a2b869ae466189d2acdabe3,1 +295,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +295,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +295,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +295,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +295,0,1,0,0,1 +295,0,1,1,1,1 +296,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +296,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +296,1,0,2,0xe56c6ea2d1b017091c44d8b6cb62b9f4,1 +296,1,0,3,0x60e3ce9aed5e5fd41e8added97c56c04,1 +296,1,0,4,0xa308ec31f281e955be20b457e463440b,1 +296,1,0,5,0x4fcf2b80258078207fc1378180f89b55,1 +296,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +296,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +296,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +296,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +296,0,1,0,0,1 +296,0,1,1,1,1 +297,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +297,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +297,1,0,2,0x1158a08d291500b4cabed3346d891eee,1 +297,1,0,3,0x57c176356a2624fb011f8fbbf3466830,1 +297,1,0,4,0x228a8c486a736006e082325b85290c5b,1 +297,1,0,5,0xc91f378b75d487dda46798c18f285519,1 +297,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +297,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +297,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +297,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +297,0,1,0,0,1 +297,0,1,1,1,1 +298,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +298,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +298,1,0,2,0xb1db9289649f59410ea36b0c0fc8d6aa,1 +298,1,0,3,0x2687b29176939dd23e0dde56d309fa9d,1 +298,1,0,4,0x3e1535e4280559015b0dbd987366dcf4,1 +298,1,0,5,0x3a6d1af5c23c7d584e1c3f48a1251336,1 +298,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +298,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +298,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +298,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +298,0,1,0,0,1 +298,0,1,1,1,1 +299,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +299,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +299,1,0,2,0xb7b16e762286cb96446aa8d4e6e7578b,1 +299,1,0,3,0x0a341a79f2dd1a220ac6f0ca4e24ed86,1 +299,1,0,4,0xddc60a700a139b04661c547d07bbb072,1 +299,1,0,5,0x1780146df799ccf55e55234ecb8f12bc,1 +299,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +299,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +299,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +299,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +299,0,1,0,0,1 +299,0,1,1,1,1 +300,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +300,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +300,1,0,2,0xd82a7c2717261187c8e00d8df963ff35,1 +300,1,0,3,0xd796edad36bc6e6bd1c91c670d9105b4,1 +300,1,0,4,0x3dcabddaf8fcaa61f4603e7cbac0f3c0,1 +300,1,0,5,0x351ecd5988efb23f680d07debd139929,1 +300,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +300,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +300,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +300,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +300,0,1,0,0,1 +300,0,1,1,1,1 +301,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +301,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +301,1,0,2,0x5eb9c8845de68eb13d5befe719f462d7,1 +301,1,0,3,0x7787802baff30ce96a5cba063254af78,1 +301,1,0,4,0x2c026ae9be2e2a5e7ca0ff9bbd92fb6e,1 +301,1,0,5,0x44972186228ee9a62b87ddbe2ef66fb5,1 +301,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +301,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +301,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +301,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +301,0,1,0,0,1 +301,0,1,1,1,1 +302,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +302,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +302,1,0,2,0x96843dd03c22abd2f3b782b170239f90,1 +302,1,0,3,0xf277921becc117d0404a8e4e36230c28,1 +302,1,0,4,0xf2be378f526f74a543f67165976de9ed,1 +302,1,0,5,0x9a31214eb4d7e6db19e1ede123dd991d,1 +302,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +302,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +302,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +302,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +302,0,1,0,0,1 +302,0,1,1,1,1 +303,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +303,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +303,1,0,2,0x766456dce1857c906f9996af72933946,1 +303,1,0,3,0x4d27e9d98edc2d0e3b760297067421f6,1 +303,1,0,4,0x402385ecadae0d8081dccaf5d19037ec,1 +303,1,0,5,0x4e55376eced699e93646bfbbf19d0b41,1 +303,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +303,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +303,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +303,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +303,0,1,0,0,1 +303,0,1,1,1,1 +304,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +304,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +304,1,0,2,0xc605c4b2edeab20419e6518a11b2dbc2,1 +304,1,0,3,0xb97ed8b07cced0b19c34f777de7b9fd9,1 +304,1,0,4,0xedf0f612c5f46e03c719647bc8af1b29,1 +304,1,0,5,0xb2cde2eda700fb1cff5e159d47326dba,1 +304,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +304,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +304,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +304,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +304,0,1,0,0,1 +304,0,1,1,1,1 +305,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +305,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +305,1,0,2,0xd48b68e6cabfe03cf6141c9ac54141f2,1 +305,1,0,3,0x10e64485d9929ad7b732bfe3b7eb8a84,1 +305,1,0,4,0xfeedae50c61bd00e19dc26f9b7e2265e,1 +305,1,0,5,0x4508c389109ad2f208f0772315b6c941,1 +305,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +305,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +305,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +305,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +305,0,1,0,0,1 +305,0,1,1,1,1 +306,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +306,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +306,1,0,2,0xb7c81457d4aeb6aa65957098569f0479,1 +306,1,0,3,0x710ad7f6595d5874c35a93d12a5dd4c7,1 +306,1,0,4,0xb7961a0b652878c2d568069a432ca18a,1 +306,1,0,5,0x1a9199f2ca574dad4b9e3a05c0a1cdb3,1 +306,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +306,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +306,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +306,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +306,0,1,0,0,1 +306,0,1,1,1,1 +307,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +307,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +307,1,0,2,0x6b01332ddb6edfa9a30a1321d5858e1e,1 +307,1,0,3,0xe3cf97e263e669f8de5e9652e76ff3f7,1 +307,1,0,4,0x5939545fced457309a6a04ace2bd0f70,1 +307,1,0,5,0x139c8f7d86b02cb1cc58f9e69e96cd5a,1 +307,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +307,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +307,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +307,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +307,0,1,0,0,1 +307,0,1,1,1,1 +308,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +308,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +308,1,0,2,0xefdb884720eaeadc349f9fc356b6c034,1 +308,1,0,3,0x4101cd2fd8436b7d0e6a4fb93f106361,1 +308,1,0,4,0xf24bee6ad5dc05f7613975473aadf3aa,1 +308,1,0,5,0xcba9e77de7d69b6ce48cb60d8113385d,1 +308,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +308,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +308,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +308,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +308,0,1,0,0,1 +308,0,1,1,1,1 +309,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +309,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +309,1,0,2,0x31230428405560dcb88fb5a646836aea,1 +309,1,0,3,0x9b23a23dd973dcbe8014c87b8b20eb07,1 +309,1,0,4,0x0f9344d6e812ce166646747694a41b0a,1 +309,1,0,5,0xaf97374e19f3c5fb8bd7ae3d9bd0beff,1 +309,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +309,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +309,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +309,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +309,0,1,0,0,1 +309,0,1,1,1,1 +310,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +310,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +310,1,0,2,0xcaa797da65b320ab0d5c470cda0b36b2,1 +310,1,0,3,0x94359c7db9841d679174db34c4855743,1 +310,1,0,4,0xcf543a62f23e212745391aaf7505f345,1 +310,1,0,5,0x123d2685ee3b941d3de6d9b36242e5a0,1 +310,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +310,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +310,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +310,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +310,0,1,0,0,1 +310,0,1,1,1,1 +311,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +311,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +311,1,0,2,0x7e5f0ab5d900d3d3d7867657e5d6d365,1 +311,1,0,3,0x19bc54084536e7d21c336ed800185945,1 +311,1,0,4,0x9450c07f201faec94b82dfb322e5ac67,1 +311,1,0,5,0x6688294aad35aa72e727ff0b19b646aa,1 +311,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +311,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +311,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +311,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +311,0,1,0,0,1 +311,0,1,1,1,1 +312,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +312,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +312,1,0,2,0xd7d70c581ae9e3f66dc6a480bf037ae2,1 +312,1,0,3,0x3f8a1e4a2136fe4b03aa69f0ca25b356,1 +312,1,0,4,0x89c460f8a5a5c2bbba962c8a3ee833a4,1 +312,1,0,5,0x13e85658e62a59e2af41d9127cc47224,1 +312,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +312,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +312,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +312,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +312,0,1,0,0,1 +312,0,1,1,1,1 +313,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +313,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +313,1,0,2,0x341c1b9ff3c83dd5e0dfa0bf68bcdf4b,1 +313,1,0,3,0xb7aa20c625975e5eeee34bb396266b34,1 +313,1,0,4,0x72b69f061b750fd5121b22b11366fad5,1 +313,1,0,5,0x49c634e77765a017902a67099e0a4469,1 +313,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +313,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +313,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +313,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +313,0,1,0,0,1 +313,0,1,1,1,1 +314,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +314,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +314,1,0,2,0x70bebe684cdcb5ca72a42f0d87387935,1 +314,1,0,3,0x9bd1781a591809947628d313a3814f67,1 +314,1,0,4,0xaec03aca8f5587a4d535fa31027bbe9c,1 +314,1,0,5,0xc0e464b1c3577f4c2dcde6b2094798a9,1 +314,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +314,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +314,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +314,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +314,0,1,0,0,1 +314,0,1,1,1,1 +315,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +315,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +315,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +315,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +315,1,0,4,0x4cd60b855d442f5b3c7b11eb6c4e0ae7,1 +315,1,0,5,0x525fe710fab9aa7c77a67f79e6fadd76,1 +315,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +315,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +315,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +315,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +315,0,1,0,0,1 +315,0,1,1,1,1 +316,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +316,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +316,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +316,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +316,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +316,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +316,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +316,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +316,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +316,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +316,0,1,0,0,1 +316,0,1,1,1,1 +317,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +317,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +317,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +317,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +317,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +317,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +317,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +317,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +317,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +317,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +317,0,1,0,0,1 +317,0,1,1,1,1 +318,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +318,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +318,1,0,2,0x29a3a8be6b94d5ec80a6d9d1190a436e,1 +318,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +318,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +318,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +318,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +318,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +318,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +318,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +318,0,1,0,0,1 +318,0,1,1,0,1 +319,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +319,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +319,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +319,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e98,1 +319,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +319,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +319,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +319,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +319,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +319,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +319,0,1,0,0,1 +319,0,1,1,0,1 +320,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +320,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +320,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +320,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +320,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +320,1,0,5,0x6a87139cac5df4087c134b491568475b,1 +320,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +320,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +320,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +320,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +320,0,1,0,0,1 +320,0,1,1,0,1 +321,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +321,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +321,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +321,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +321,1,0,4,0x00b329f479a2bbd0a5c384ee1493b1f5,1 +321,1,0,5,0x186a87139cac5df4087c134b49156847,1 +321,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +321,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +321,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +321,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +321,0,1,0,0,1 +321,0,1,1,0,1 +322,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +322,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +322,1,0,2,0xd45c5741946b2a137f59262ee6f5bc91,1 +322,1,0,3,0x001af27a5e1117a64733950642a3d1e8,1 +322,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +322,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +322,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +322,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +322,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +322,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +322,0,1,0,0,1 +322,0,1,1,0,1 +323,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +323,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +323,1,0,2,0xd45c5740946b2a147f59262ee6f5bc90,1 +323,1,0,3,0xbd01ed280528b62b3aed5fc93f06f739,1 +323,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +323,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +323,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +323,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +323,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +323,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +323,0,1,0,0,1 +323,0,1,1,0,1 +324,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +324,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +324,1,0,2,0xd45c5741946b2a137f59262ee6f5bc91,1 +324,1,0,3,0x001af27a5e1117a64733950642a3d1e8,1 +324,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +324,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +324,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +324,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +324,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +324,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +324,0,1,0,0,1 +324,0,1,1,0,1 +325,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +325,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +325,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +325,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +325,1,0,4,0xb329f47aa2bbd0a4c384ee1493b1f518,1 +325,1,0,5,0xada018ef05465583885980861905228a,1 +325,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +325,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +325,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +325,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +325,0,1,0,0,1 +325,0,1,1,0,1 +326,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +326,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +326,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +326,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +326,1,0,4,0x4cd60b865d442f5a3c7b11eb6c4e0ae7,1 +326,1,0,5,0x9578ec6353a20bf783ecb4b6ea97b825,1 +326,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +326,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +326,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +326,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +326,0,1,0,0,1 +326,0,1,1,0,1 +327,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +327,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +327,1,0,2,0xffffffff00000000ffffffffffffffff,1 +327,1,0,3,0xbce6faada7179e84f3b9cac2fc632550,1 +327,1,0,4,0xffffffff00000000ffffffffffffffff,1 +327,1,0,5,0xbce6faada7179e84f3b9cac2fc632550,1 +327,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +327,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +327,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +327,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +327,0,1,0,0,1 +327,0,1,1,0,1 +328,1,0,0,0x70239dd877f7c944c422f44dea4ed1a5,1 +328,1,0,1,0x2f2627416faf2f072fa50c772ed6f807,1 +328,1,0,2,0x64a1aab5000d0e804f3e2fc02bdee9be,1 +328,1,0,3,0x8ff312334e2ba16d11547c97711c898e,1 +328,1,0,4,0x6af015971cc30be6d1a206d4e013e099,1 +328,1,0,5,0x7772a2f91d73286ffd683b9bb2cf4f1b,1 +328,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +328,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +328,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +328,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +328,0,1,0,0,1 +328,0,1,1,1,1 +329,1,0,0,0x00000000690ed426ccf17803ebe2bd08,1 +329,1,0,1,0x84bcd58a1bb5e7477ead3645f356e7a9,1 +329,1,0,2,0x16aea964a2f6506d6f78c81c91fc7e8b,1 +329,1,0,3,0xded7d397738448de1e19a0ec580bf266,1 +329,1,0,4,0x252cd762130c6667cfe8b7bc47d27d78,1 +329,1,0,5,0x391e8e80c578d1cd38c3ff033be928e9,1 +329,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +329,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +329,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +329,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +329,0,1,0,0,1 +329,0,1,1,1,1 +330,1,0,0,0x7300000000213f2a525c6035725235c2,1 +330,1,0,1,0xf696ad3ebb5ee47f140697ad25770d91,1 +330,1,0,2,0x9cc98be2347d469bf476dfc26b9b733d,1 +330,1,0,3,0xf2d26d6ef524af917c665baccb23c882,1 +330,1,0,4,0x093496459effe2d8d70727b82462f61d,1 +330,1,0,5,0x0ec1b7847929d10ea631dacb16b56c32,1 +330,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +330,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +330,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +330,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +330,0,1,0,0,1 +330,0,1,1,1,1 +331,1,0,0,0xddf2000000005e0be0635b245f0b9797,1 +331,1,0,1,0x8afd25daadeb3edb4a0161c27fe06045,1 +331,1,0,2,0x73b3c90ecd390028058164524dde8927,1 +331,1,0,3,0x03dce3dea0d53fa8093999f07ab8aa43,1 +331,1,0,4,0x2f67b0b8e20636695bb7d8bf0a651c80,1 +331,1,0,5,0x2ed25a395387b5f4188c0c4075c88634,1 +331,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +331,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +331,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +331,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +331,0,1,0,0,1 +331,0,1,1,1,1 +332,1,0,0,0x67ab1900000000784769c4ecb9e164d6,1 +332,1,0,1,0x642b8499588b89855be1ec355d0841a0,1 +332,1,0,2,0xbfab3098252847b328fadf2f89b95c85,1 +332,1,0,3,0x1a7f0eb390763378f37e90119d5ba3dd,1 +332,1,0,4,0xbdd64e234e832b1067c2d058ccb44d97,1 +332,1,0,5,0x8195ccebb65c2aaf1e2da9b8b4987e3b,1 +332,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +332,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +332,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +332,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +332,0,1,0,0,1 +332,0,1,1,1,1 +333,1,0,0,0xa2bf09460000000076d7dbeffe125eaf,1 +333,1,0,1,0x02095dff252ee905e296b6350fc311cf,1 +333,1,0,2,0x204a9784074b246d8bf8bf04a4ceb1c1,1 +333,1,0,3,0xf1c9aaab168b1596d17093c5cd21d2cd,1 +333,1,0,4,0x51cce41670636783dc06a759c8847868,1 +333,1,0,5,0xa406c2506fe17975582fe648d1d88b52,1 +333,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +333,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +333,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +333,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +333,0,1,0,0,1 +333,0,1,1,1,1 +334,1,0,0,0x3554e827c700000000e1e75e624a06b3,1 +334,1,0,1,0xa0a353171160858129e15c544e4f0e65,1 +334,1,0,2,0xed66dc34f551ac82f63d4aa4f81fe2cb,1 +334,1,0,3,0x0031a91d1314f835027bca0f1ceeaa03,1 +334,1,0,4,0x99ca123aa09b13cd194a422e18d5fda1,1 +334,1,0,5,0x67623c3f6e5d4d6abb8953d67c0c48c7,1 +334,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +334,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +334,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +334,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +334,0,1,0,0,1 +334,0,1,1,1,1 +335,1,0,0,0x9b6cd3b812610000000026941a0f0bb5,1 +335,1,0,1,0x3255ea4c9fd0cb3426e3a54b9fc6965c,1 +335,1,0,2,0x060b700bef665c68899d44f2356a578d,1 +335,1,0,3,0x126b062023ccc3c056bf0f60a237012b,1 +335,1,0,4,0x8d186c027832965f4fcc78a3366ca95d,1 +335,1,0,5,0xedbb410cbef3f26d6be5d581c11d3610,1 +335,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +335,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +335,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +335,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +335,0,1,0,0,1 +335,0,1,1,1,1 +336,1,0,0,0x883ae39f50bf0100000000e7561c26fc,1 +336,1,0,1,0x82a52baa51c71ca877162f93c4ae0186,1 +336,1,0,2,0x9f6adfe8d5eb5b2c24d7aa7934b6cf29,1 +336,1,0,3,0xc93ea76cd313c9132bb0c8e38c96831d,1 +336,1,0,4,0xb26a9c9e40e55ee0890c944cf271756c,1 +336,1,0,5,0x906a33e66b5bd15e051593883b5e9902,1 +336,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +336,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +336,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +336,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +336,0,1,0,0,1 +336,0,1,1,1,1 +337,1,0,0,0xa1ce5d6e5ecaf28b0000000000fa7cd0,1 +337,1,0,1,0x10540f420fb4ff7401fe9fce011d0ba6,1 +337,1,0,2,0xa1af03ca91677b673ad2f33615e56174,1 +337,1,0,3,0xa1abf6da168cebfa8868f4ba273f16b7,1 +337,1,0,4,0x20aa73ffe48afa6435cd258b173d0c23,1 +337,1,0,5,0x77d69022e7d098d75caf24c8c5e06b1c,1 +337,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +337,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +337,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +337,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +337,0,1,0,0,1 +337,0,1,1,1,1 +338,1,0,0,0x8ea5f645f373f5809300000000383453,1 +338,1,0,1,0x97330012a8ee836c5494cdffd5ee8054,1 +338,1,0,2,0xfdc70602766f8eed11a6c99a71c973d5,1 +338,1,0,3,0x659355507b843da6e327a28c11893db9,1 +338,1,0,4,0x3df5349688a085b137b1eacf456a9e9e,1 +338,1,0,5,0x0f6d15ec0078ca60a7f83f2b10d21350,1 +338,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +338,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +338,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +338,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +338,0,1,0,0,1 +338,0,1,1,1,1 +339,1,0,0,0x660570d323e9f75fa734000000008792,1 +339,1,0,1,0xd65ce93eabb7d60d8d9c1bbdcb5ef305,1 +339,1,0,2,0xb516a314f2fce530d6537f6a6c49966c,1 +339,1,0,3,0x23456f63c643cf8e0dc738f7b876e675,1 +339,1,0,4,0xd39ffd033c92b6d717dd536fbc5efdf1,1 +339,1,0,5,0x967c4bd80954479ba66b0120cd16fff2,1 +339,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +339,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +339,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +339,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +339,0,1,0,0,1 +339,0,1,1,1,1 +340,1,0,0,0xd0462673154cce587dde8800000000e9,1 +340,1,0,1,0x8d35f1f45cf9c3bf46ada2de4c568c34,1 +340,1,0,2,0x3b2cbf046eac45842ecb7984d4758315,1 +340,1,0,3,0x82717bebb6492fd0a485c101e29ff0a8,1 +340,1,0,4,0x4c9b7b47a98b0f82de512bc9313aaf51,1 +340,1,0,5,0x701099cac5f76e68c8595fc1c1d99258,1 +340,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +340,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +340,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +340,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +340,0,1,0,0,1 +340,0,1,1,1,1 +341,1,0,0,0xbd90640269a7822680cedfef00000000,1 +341,1,0,1,0x0caef15a6171059ab83e7b4418d7278f,1 +341,1,0,2,0x30c87d35e636f540841f14af54e2f9ed,1 +341,1,0,3,0xd79d0312cfa1ab656c3fb15bfde48dcf,1 +341,1,0,4,0x47c15a5a82d24b75c85a692bd6ecafeb,1 +341,1,0,5,0x71409ede23efd08e0db9abf6340677ed,1 +341,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +341,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +341,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +341,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +341,0,1,0,0,1 +341,0,1,1,1,1 +342,1,0,0,0x33239a52d72f1311512e41222a000000,1 +342,1,0,1,0x00d2dcceb301c54b4beae8e284788a73,1 +342,1,0,2,0x38686ff0fda2cef6bc43b58cfe6647b9,1 +342,1,0,3,0xe2e8176d168dec3c68ff262113760f52,1 +342,1,0,4,0x067ec3b651f422669601662167fa8717,1 +342,1,0,5,0xe976e2db5e6a4cf7c2ddabb3fde9d67d,1 +342,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +342,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +342,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +342,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +342,0,1,0,0,1 +342,0,1,1,1,1 +343,1,0,0,0xb8d64fbcd4a1c10f1365d4e6d95c0000,1 +343,1,0,1,0x00007ee4a21a1cbe1dc84c2d941ffaf1,1 +343,1,0,2,0x44a3e23bf314f2b344fc25c7f2de8b6a,1 +343,1,0,3,0xf3e17d27f5ee844b225985ab6e2775cf,1 +343,1,0,4,0x2d48e223205e98041ddc87be532abed5,1 +343,1,0,5,0x84f0411f5729500493c9cc3f4dd15e86,1 +343,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +343,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +343,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +343,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +343,0,1,0,0,1 +343,0,1,1,1,1 +344,1,0,0,0x01603d3982bf77d7a3fef3183ed09200,1 +344,1,0,1,0x0000003a227420db4088b20fe0e9d84a,1 +344,1,0,2,0x2ded5b7ec8e90e7bf11f967a3d95110c,1 +344,1,0,3,0x41b99db3b5aa8d330eb9d638781688e9,1 +344,1,0,4,0x7d5792c53628155e1bfc46fb1a67e308,1 +344,1,0,5,0x8de049c328ae1f44ec69238a009808f9,1 +344,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +344,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +344,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +344,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +344,0,1,0,0,1 +344,0,1,1,1,1 +345,1,0,0,0x9ea6994f1e0384c8599aa02e6cf66d9c,1 +345,1,0,1,0x000000004d89ef50b7e9eb0cfbff7363,1 +345,1,0,2,0xbdae7bcb580bf335efd3bc3d31870f92,1 +345,1,0,3,0x3eaccafcd40ec2f605976f15137d8b8f,1 +345,1,0,4,0xf6dfa12f19e525270b0106eecfe25749,1 +345,1,0,5,0x9f373a4fb318994f24838122ce7ec3c7,1 +345,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +345,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +345,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +345,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +345,0,1,0,0,1 +345,0,1,1,1,1 +346,1,0,0,0xd03215a8401bcf16693979371a01068a,1 +346,1,0,1,0x4700000000e2fa5bf692bc670905b18c,1 +346,1,0,2,0x50f9c4f0cd6940e162720957ffff5137,1 +346,1,0,3,0x99209b78596956d21ece251c2401f1c6,1 +346,1,0,4,0xd7033a0a787d338e889defaaabb106b9,1 +346,1,0,5,0x5a4355e411a59c32aa5167dfab244726,1 +346,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +346,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +346,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +346,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +346,0,1,0,0,1 +346,0,1,1,1,1 +347,1,0,0,0x307bfaaffb650c889c84bf83f0300e5d,1 +347,1,0,1,0xc87e000000008408fd5f64b582e3bb14,1 +347,1,0,2,0xf612820687604fa01906066a378d6754,1 +347,1,0,3,0x0982e29575d019aabe90924ead5c860d,1 +347,1,0,4,0x3f9367702dd7dd4f75ea98afd20e328a,1 +347,1,0,5,0x1a99f4857b316525328230ce294b0fef,1 +347,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +347,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +347,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +347,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +347,0,1,0,0,1 +347,0,1,1,1,1 +348,1,0,0,0xbab5c4f4df540d7b33324d36bb0c1575,1 +348,1,0,1,0x51527c00000000e4af574bb4d54ea6b8,1 +348,1,0,2,0x9505e407657d6e8bc93db5da7aa6f508,1 +348,1,0,3,0x1f61980c1949f56b0f2f507da5782a7a,1 +348,1,0,4,0xc60d31904e3669738ffbeccab6c3656c,1 +348,1,0,5,0x08e0ed5cb92b3cfa5e7f71784f9c5021,1 +348,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +348,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +348,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +348,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +348,0,1,0,0,1 +348,0,1,1,1,1 +349,1,0,0,0xd4ba47f6ae28f274e4f58d8036f9c36e,1 +349,1,0,1,0xc2456f5b00000000c3b869197ef5e15e,1 +349,1,0,2,0xbbd16fbbb656b6d0d83e6a7787cd691b,1 +349,1,0,3,0x08735aed371732723e1c68a40404517d,1 +349,1,0,4,0x9d8e35dba96028b7787d91315be67587,1 +349,1,0,5,0x7d2d097be5e8ee34560e3e7fd25c0f00,1 +349,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +349,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +349,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +349,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +349,0,1,0,0,1 +349,0,1,1,1,1 +350,1,0,0,0x79fd19c7235ea212f29f1fa00984342a,1 +350,1,0,1,0xfe0f10aafd00000000801e47f8c184e1,1 +350,1,0,2,0x2ec9760122db98fd06ea76848d35a6da,1 +350,1,0,3,0x442d2ceef7559a30cf57c61e92df327e,1 +350,1,0,4,0x7ab271da90859479701fccf86e462ee3,1 +350,1,0,5,0x393fb6814c27b760c4963625c0a19878,1 +350,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +350,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +350,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +350,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +350,0,1,0,0,1 +350,0,1,1,1,1 +351,1,0,0,0x8c291e8eeaa45adbaf9aba5c0583462d,1 +351,1,0,1,0x79cbeb7ac97300000000a37ea6700cda,1 +351,1,0,2,0x54e76b7683b6650baa6a7fc49b1c51ee,1 +351,1,0,3,0xd9ba9dd463221f7a4f1005a89fe00c59,1 +351,1,0,4,0x2ea076886c773eb937ec1cc8374b7915,1 +351,1,0,5,0xcfd11b1c1ae1166152f2f7806a31c8fd,1 +351,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +351,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +351,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +351,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +351,0,1,0,0,1 +351,0,1,1,1,1 +352,1,0,0,0x0eaae8641084fa979803efbfb8140732,1 +352,1,0,1,0xf4cdcf66c3f78a000000003c278a6b21,1 +352,1,0,2,0x5291deaf24659ffbbce6e3c26f602109,1 +352,1,0,3,0x7a74abdbb69be4fb10419c0c496c9466,1 +352,1,0,4,0x65d6fcf336d27cc7cdb982bb4e4ecef5,1 +352,1,0,5,0x827f84742f29f10abf83469270a03dc3,1 +352,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +352,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +352,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +352,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +352,0,1,0,0,1 +352,0,1,1,1,1 +353,1,0,0,0xe02716d01fb23a5a0068399bf01bab42,1 +353,1,0,1,0xef17c6d96e13846c00000000afc0f89d,1 +353,1,0,2,0x207a3241812d75d947419dc58efb05e8,1 +353,1,0,3,0x003b33fc17eb50f9d15166a88479f107,1 +353,1,0,4,0xcdee749f2e492b213ce80b32d0574f62,1 +353,1,0,5,0xf1c5d70793cf55e382d5caadf7592767,1 +353,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +353,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +353,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +353,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +353,0,1,0,0,1 +353,0,1,1,1,1 +354,1,0,0,0x9eb0bf583a1a6b9a194e9a16bc7dab2a,1 +354,1,0,1,0x9061768af89d00659a00000000fc7de1,1 +354,1,0,2,0x6554e49f82a855204328ac94913bf01b,1 +354,1,0,3,0xbe84437a355a0a37c0dee3cf81aa7728,1 +354,1,0,4,0xaea00de2507ddaf5c94e1e126980d3df,1 +354,1,0,5,0x16250a2eaebc8be486effe7f22b4f929,1 +354,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +354,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +354,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +354,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +354,0,1,0,0,1 +354,0,1,1,1,1 +355,1,0,0,0x62aac98818b3b84a2c214f0d5e72ef28,1 +355,1,0,1,0x6e1030cb53d9a82b690e00000000cd15,1 +355,1,0,2,0xa54c5062648339d2bff06f71c88216c2,1 +355,1,0,3,0x6c6e19b4d80a8c602990ac82707efdfc,1 +355,1,0,4,0xe99bbe7fcfafae3e69fd016777517aa0,1 +355,1,0,5,0x1056317f467ad09aff09be73c9731b0d,1 +355,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +355,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +355,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +355,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +355,0,1,0,0,1 +355,0,1,1,1,1 +356,1,0,0,0x3760a7f37cf96218f29ae43732e513ef,1 +356,1,0,1,0xd2b6f552ea4b6895464b9300000000c8,1 +356,1,0,2,0x975bd7157a8d363b309f1f444012b1a1,1 +356,1,0,3,0xd23096593133e71b4ca8b059cff37eaf,1 +356,1,0,4,0x7faa7a28b1c822baa241793f2abc930b,1 +356,1,0,5,0xd4c69840fe090f2aacc46786bf919622,1 +356,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +356,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +356,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +356,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +356,0,1,0,0,1 +356,0,1,1,1,1 +357,1,0,0,0x0da0a1d2851d33023834f2098c088009,1 +357,1,0,1,0x6b4320bea836cd9cbb6ff6c800000000,1 +357,1,0,2,0x5694a6f84b8f875c276afd2ebcfe4d61,1 +357,1,0,3,0xde9ec90305afb1357b95b3e0da43885e,1 +357,1,0,4,0x0dffad9ffd0b757d8051dec02ebdf70d,1 +357,1,0,5,0x8ee2dc5c7870c0823b6ccc7c679cbaa4,1 +357,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +357,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +357,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +357,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +357,0,1,0,0,1 +357,0,1,1,1,1 +358,1,0,0,0xffffffff293886d3086fd567aafd598f,1 +358,1,0,1,0x0fe975f735887194a764a231e82d289a,1 +358,1,0,2,0xa0c30e8026fdb2b4b4968a27d16a6d08,1 +358,1,0,3,0xf7098f1a98d21620d7454ba9790f1ba6,1 +358,1,0,4,0x5e470453a8a399f15baf463f9deceb53,1 +358,1,0,5,0xacc5ca64459149688bd2760c65424339,1 +358,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +358,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +358,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +358,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +358,0,1,0,0,1 +358,0,1,1,1,1 +359,1,0,0,0x7bffffffff2376d1e3c03445a072e243,1 +359,1,0,1,0x26acdc4ce127ec2e0e8d9ca99527e7b7,1 +359,1,0,2,0x614ea84acf736527dd73602cd4bb4eea,1 +359,1,0,3,0x1dfebebd5ad8aca52aa0228cf7b99a88,1 +359,1,0,4,0x737cc85f5f2d2f60d1b8183f3ed490e4,1 +359,1,0,5,0xde14368e96a9482c2a4dd193195c902f,1 +359,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +359,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +359,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +359,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +359,0,1,0,0,1 +359,0,1,1,1,1 +360,1,0,0,0xa2b5ffffffffebb251b085377605a224,1 +360,1,0,1,0xbc80872602a6e467fd016807e97fa395,1 +360,1,0,2,0xbead6734ebe44b810d3fb2ea00b17329,1 +360,1,0,3,0x45377338febfd439a8d74dfbd0f942fa,1 +360,1,0,4,0x6bb18eae36616a7d3cad35919fd21a8a,1 +360,1,0,5,0xf4bbe7a10f73b3e036a46b103ef56e2a,1 +360,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +360,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +360,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +360,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +360,0,1,0,0,1 +360,0,1,1,1,1 +361,1,0,0,0x641227ffffffff6f1b96fa5f097fcf3c,1 +361,1,0,1,0xc1a3c256870d45a67b83d0967d4b20c0,1 +361,1,0,2,0x499625479e161dacd4db9d9ce64854c9,1 +361,1,0,3,0x8d922cbf212703e9654fae182df9bad2,1 +361,1,0,4,0x42c177cf37b8193a0131108d97819edd,1 +361,1,0,5,0x9439936028864ac195b64fca76d9d693,1 +361,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +361,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +361,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +361,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +361,0,1,0,0,1 +361,0,1,1,1,1 +362,1,0,0,0x958415d8ffffffffabad03e2fc662dc3,1 +362,1,0,1,0xba203521177502298df56f36600e0f8b,1 +362,1,0,2,0x08f16b8093a8fb4d66a2c8065b541b3d,1 +362,1,0,3,0x31e3bfe694f6b89c50fb1aaa6ff6c9b2,1 +362,1,0,4,0x9d6455e2d5d1779748573b611cb95d4a,1 +362,1,0,5,0x21f967410399b39b535ba3e5af81ca2e,1 +362,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +362,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +362,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +362,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +362,0,1,0,0,1 +362,0,1,1,1,1 +363,1,0,0,0xf1d8de4858ffffffff1281093536f47f,1 +363,1,0,1,0xe13deb04e1fbe8fb954521b6975420f8,1 +363,1,0,2,0xbe26231b6191658a19dd72ddb99ed8f8,1 +363,1,0,3,0xc579b6938d19bce8eed8dc2b338cb5f8,1 +363,1,0,4,0xe1d9a32ee56cffed37f0f22b2dcb57d5,1 +363,1,0,5,0xc943c14f79694a03b9c5e96952575c89,1 +363,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +363,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +363,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +363,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +363,0,1,0,0,1 +363,0,1,1,1,1 +364,1,0,0,0x0927895f2802ffffffff10782dd14a3b,1 +364,1,0,1,0x32dc5d47c05ef6f1876b95c81fc31def,1 +364,1,0,2,0x15e76880898316b16204ac920a02d580,1 +364,1,0,3,0x45f36a229d4aa4f812638c455abe0443,1 +364,1,0,4,0xe74d357d3fcb5c8c5337bd6aba4178b4,1 +364,1,0,5,0x55ca10e226e13f9638196506a1939123,1 +364,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +364,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +364,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +364,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +364,0,1,0,0,1 +364,0,1,1,1,1 +365,1,0,0,0x60907984aa7e8effffffff4f332862a1,1 +365,1,0,1,0x0a57c3063fb5a30624cf6a0c3ac80589,1 +365,1,0,2,0x352ecb53f8df2c503a45f9846fc28d1d,1 +365,1,0,3,0x31e6307d3ddbffc1132315cc07f16dad,1 +365,1,0,4,0x1348dfa9c482c558e1d05c5242ca1c39,1 +365,1,0,5,0x436726ecd28258b1899792887dd0a3c6,1 +365,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +365,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +365,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +365,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +365,0,1,0,0,1 +365,0,1,1,1,1 +366,1,0,0,0xc6ff198484939170ffffffff0af42cda,1 +366,1,0,1,0x50f9a5f50636ea6942d6b9b8cd6ae1e2,1 +366,1,0,2,0x4a40801a7e606ba78a0da9882ab23c76,1 +366,1,0,3,0x77b8642349ed3d652c5bfa5f2a9558fb,1 +366,1,0,4,0x3a49b64848d682ef7f605f2832f7384b,1 +366,1,0,5,0xdc24ed2925825bf8ea77dc5981725782,1 +366,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +366,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +366,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +366,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +366,0,1,0,0,1 +366,0,1,1,1,1 +367,1,0,0,0xde030419345ca15c75ffffffff807479,1 +367,1,0,1,0x9b9e0956cc43135d16dfbe4d27d7e68d,1 +367,1,0,2,0xeacc5e1a8304a74d2be412b078924b3b,1 +367,1,0,3,0xb3511bac855c05c9e5e9e44df3d61e96,1 +367,1,0,4,0x7451cd8e18d6ed1885dd827714847f96,1 +367,1,0,5,0xec4bb0ed4c36ce9808db8f714204f6d1,1 +367,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +367,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +367,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +367,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +367,0,1,0,0,1 +367,0,1,1,1,1 +368,1,0,0,0x6f0e3eeaf42b28132b88fffffffff6c8,1 +368,1,0,1,0x665604d34acb19037e1ab78caaaac6ff,1 +368,1,0,2,0x2f7a5e9e5771d424f30f67fdab61e8ce,1 +368,1,0,3,0x4f8cd1214882adb65f7de94c31577052,1 +368,1,0,4,0xac4e69808345809b44acb0b2bd889175,1 +368,1,0,5,0xfb75dd050c5a449ab9528f8f78daa10c,1 +368,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +368,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +368,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +368,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +368,0,1,0,0,1 +368,0,1,1,1,1 +369,1,0,0,0xcdb549f773b3e62b3708d1ffffffffbe,1 +369,1,0,1,0x48f7c0591ddcae7d2cb222d1f8017ab9,1 +369,1,0,2,0xffcda40f792ce4d93e7e0f0e95e1a214,1 +369,1,0,3,0x7dddd7f6487621c30a03d710b3300219,1 +369,1,0,4,0x79938b55f8a17f7ed7ba9ade8f2065a1,1 +369,1,0,5,0xfa77618f0b67add8d58c422c2453a49a,1 +369,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +369,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +369,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +369,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +369,0,1,0,0,1 +369,0,1,1,1,1 +370,1,0,0,0x2c3f26f96a3ac0051df4989bffffffff,1 +370,1,0,1,0x9fd64886c1dc4f9924d8fd6f0edb0484,1 +370,1,0,2,0x81f2359c4faba6b53d3e8c8c3fcc16a9,1 +370,1,0,3,0x48350f7ab3a588b28c17603a431e39a8,1 +370,1,0,4,0xcd6f6a5cc3b55ead0ff695d06c6860b5,1 +370,1,0,5,0x09e46d99fccefb9f7f9e101857f74300,1 +370,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +370,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +370,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +370,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +370,0,1,0,0,1 +370,0,1,1,1,1 +371,1,0,0,0xac18f8418c55a2502cb7d53f9affffff,1 +371,1,0,1,0xff5c31d89fda6a6b8476397c04edf411,1 +371,1,0,2,0xdfc8bf520445cbb8ee1596fb073ea283,1 +371,1,0,3,0xea130251a6fdffa5c3f5f2aaf75ca808,1 +371,1,0,4,0x048e33efce147c9dd92823640e338e68,1 +371,1,0,5,0xbfd7d0dc7a4905b3a7ac711e577e90e7,1 +371,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +371,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +371,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +371,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +371,0,1,0,0,1 +371,0,1,1,1,1 +372,1,0,0,0x4f9618f98e2d3a15b24094f72bb5ffff,1 +372,1,0,1,0xffffa2fd3e2893683e5a6ab8cf0ee610,1 +372,1,0,2,0xad019f74c6941d20efda70b46c53db16,1 +372,1,0,3,0x6503a0e393e932f688227688ba6a5762,1 +372,1,0,4,0x93320eb7ca0710255346bdbb3102cdcf,1 +372,1,0,5,0x7964ef2e0988e712bc05efe16c199345,1 +372,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +372,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +372,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +372,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +372,0,1,0,0,1 +372,0,1,1,1,1 +373,1,0,0,0x422e82a3d56ed10a9cc21d31d37a25ff,1 +373,1,0,1,0xffffff67edf7c40204caae73ab0bc75a,1 +373,1,0,2,0xac8096842e8add68c34e78ce11dd71e4,1 +373,1,0,3,0xb54316bd3ebf7fffdeb7bd5a3ebc1883,1 +373,1,0,4,0xf5ca2f4f23d674502d4caf85d187215d,1 +373,1,0,5,0x36e3ce9f0ce219709f21a3aac003b7a8,1 +373,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +373,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +373,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +373,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +373,0,1,0,0,1 +373,0,1,1,1,1 +374,1,0,0,0x7075d245ccc3281b6e7b329ff738fbb4,1 +374,1,0,1,0x17a5ffffffffa0842d9890b5cf95d018,1 +374,1,0,2,0x677b2d3a59b18a5ff939b70ea0022508,1 +374,1,0,3,0x89ddcd7b7b9d776854b4943693fb92f7,1 +374,1,0,4,0x6b4ba856ade7677bf30307b21f3ccda3,1 +374,1,0,5,0x5d2f63aee81efd0bab6972cc0795db55,1 +374,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +374,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +374,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +374,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +374,0,1,0,0,1 +374,0,1,1,1,1 +375,1,0,0,0x3c80de54cd9226989443d593fa4fd659,1 +375,1,0,1,0x7e280ebeffffffffc1847eb76c217a95,1 +375,1,0,2,0x479e1ded14bcaed0379ba8e1b73d3115,1 +375,1,0,3,0xd84d31d4b7c30e1f05e1fc0d5957cfb0,1 +375,1,0,4,0x918f79e35b3d89487cf634a4f05b2e0c,1 +375,1,0,5,0x30857ca879f97c771e877027355b2443,1 +375,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +375,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +375,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +375,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +375,0,1,0,0,1 +375,0,1,1,1,1 +376,1,0,0,0xde21754e29b85601980bef3d697ea277,1 +376,1,0,1,0x0ce891a8cdffffffffc7906aa794b39b,1 +376,1,0,2,0x43dfccd0edb9e280d9a58f01164d55c3,1 +376,1,0,3,0xd711e14b12ac5cf3b64840ead512a0a3,1 +376,1,0,4,0x1dbe33fa8ba84533cd5c4934365b3442,1 +376,1,0,5,0xca1174899b78ef9a3199f49584389772,1 +376,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +376,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +376,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +376,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +376,0,1,0,0,1 +376,0,1,1,1,1 +377,1,0,0,0x8f65d92927cfb86a84dd59623fb531bb,1 +377,1,0,1,0x599e4d5f7289ffffffff2f1f2f57881c,1 +377,1,0,2,0x5b09ab637bd4caf0f4c7c7e4bca592fe,1 +377,1,0,3,0xa20e9087c259d26a38bb4085f0bbff11,1 +377,1,0,4,0x45b7eb467b6748af618e9d80d6fdcd6a,1 +377,1,0,5,0xa24964e5a13f885bca8101de08eb0d75,1 +377,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +377,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +377,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +377,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +377,0,1,0,0,1 +377,0,1,1,1,1 +378,1,0,0,0x6b63e9a74e092120160bea3877dace8a,1 +378,1,0,1,0x2cc7cd0e8426cbfffffffffafc8c3ca8,1 +378,1,0,2,0x5e9b1c5a028070df5728c5c8af9b74e0,1 +378,1,0,3,0x667afa570a6cfa0114a5039ed15ee06f,1 +378,1,0,4,0xb1360907e2d9785ead362bb8d7bd661b,1 +378,1,0,5,0x6c29eeffd3c5037744edaeb9ad990c20,1 +378,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +378,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +378,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +378,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +378,0,1,0,0,1 +378,0,1,1,1,1 +379,1,0,0,0xfc28259702a03845b6d75219444e8b43,1 +379,1,0,1,0xd094586e249c8699ffffffffe852512e,1 +379,1,0,2,0x0671a0a85c2b72d54a2fb0990e34538b,1 +379,1,0,3,0x4890050f5a5712f6d1a7a5fb8578f32e,1 +379,1,0,4,0xdb1846bab6b7361479ab9c3285ca4129,1 +379,1,0,5,0x1808f27fd5bd4fdac720e5854713694c,1 +379,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +379,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +379,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +379,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +379,0,1,0,0,1 +379,0,1,1,1,1 +380,1,0,0,0x1273b4502ea4e3bccee044ee8e8db7f7,1 +380,1,0,1,0x74ecbcd52e8ceb571757ffffffffe20a,1 +380,1,0,2,0x7673f8526748446477dbbb0590a45492,1 +380,1,0,3,0xc5d7d69859d301abbaedb35b2095103a,1 +380,1,0,4,0x3dc70ddf9c6b524d886bed9e6af02e0e,1 +380,1,0,5,0x4dec0d417a414fed3807ef4422913d7c,1 +380,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +380,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +380,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +380,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +380,0,1,0,0,1 +380,0,1,1,1,1 +381,1,0,0,0x08fb565610a79baa0c566c66228d8181,1 +381,1,0,1,0x4f8c53a15b96e602fb49ffffffffff6e,1 +381,1,0,2,0x7f085441070ecd2bb21285089ebb1aa6,1 +381,1,0,3,0x450d1a06c36d3ff39dfd657a796d12b5,1 +381,1,0,4,0x249712012029870a2459d18d47da9aa4,1 +381,1,0,5,0x92a5e6cb4b2d8dafa9e4c5c54a2b9a8b,1 +381,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +381,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +381,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +381,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +381,0,1,0,0,1 +381,0,1,1,1,1 +382,1,0,0,0xd59291cc2cf89f3087715fcb1aa4e79a,1 +382,1,0,1,0xa2403f748e97d7cd28ecaefeffffffff,1 +382,1,0,2,0x914c67fb61dd1e27c867398ea7322d5a,1 +382,1,0,3,0xb76df04bc5aa6683a8e0f30a5d287348,1 +382,1,0,4,0xfa07474031481dda4953e3ac1959ee8c,1 +382,1,0,5,0xea7e66ec412b38d6c96d28f6d37304ea,1 +382,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +382,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +382,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +382,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +382,0,1,0,0,1 +382,0,1,1,1,1 +383,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +383,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +383,1,0,2,0xffffffff00000000ffffffffffffffff,1 +383,1,0,3,0xbce6faada7179e84f3b9cac2fc63254f,1 +383,1,0,4,0xffffffff00000000ffffffffffffffff,1 +383,1,0,5,0xbce6faada7179e84f3b9cac2fc63254e,1 +383,1,0,6,0x3cd8d2f81d6953b0844c09d7b560d527,1 +383,1,0,7,0xcd2ef67056893eadafa52c8501387d59,1 +383,1,0,8,0xee41fdb4d10402ce7a0c5e3b747adfa3,1 +383,1,0,9,0xa490b62a6b7719068903485c0bb6dc2d,1 +383,0,1,0,0,1 +383,0,1,1,1,1 +384,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +384,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +384,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +384,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +384,1,0,4,0x909135bdb6799286170f5ead2de4f651,1 +384,1,0,5,0x1453fe50914f3df2de54a36383df8dd4,1 +384,1,0,6,0x8240cd81edd91cb6936133508c391510,1 +384,1,0,7,0x0e81f332c4545d41189b481196851378,1 +384,1,0,8,0xe05b06e72d4a1bff80ea5db514aa2f93,1 +384,1,0,9,0xea6dd6d9c0ae27b7837dc432f9ce89d9,1 +384,0,1,0,0,1 +384,0,1,1,1,1 +385,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +385,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +385,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +385,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +385,1,0,4,0x27b4577ca009376f71303fd5dd227dce,1 +385,1,0,5,0xf5deb773ad5f5a84360644669ca249a5,1 +385,1,0,6,0xb062947356748b0fc17f1704c65aa1dc,1 +385,1,0,7,0xa6e1bfe6779756fa616d91eaad13df2c,1 +385,1,0,8,0x0b38c17f3d0672e7409cfc5992a99fff,1 +385,1,0,9,0x12b84a4f8432293b431113f1b2fb579d,1 +385,0,1,0,0,1 +385,0,1,1,1,1 +386,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +386,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +386,1,0,2,0xffffffff00000000ffffffffffffffff,1 +386,1,0,3,0xbce6faada7179e84f3b9cac2fc6324d5,1 +386,1,0,4,0x55555555000000005555555555555555,1 +386,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +386,1,0,6,0x7a736d8e326a9ca62bbe25a34ea4e363,1 +386,1,0,7,0x3b499a96afa7aaa3fcf3fd88f8e07ede,1 +386,1,0,8,0xb3e45879d8622b93e818443a686e869e,1 +386,1,0,9,0xeda7bf9ae46aa3eafcc48a5934864627,1 +386,0,1,0,0,1 +386,0,1,1,1,1 +387,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +387,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +387,1,0,2,0x7fffffff800000007fffffffffffffff,1 +387,1,0,3,0xde737d56d38bcf4279dce5617e3192a8,1 +387,1,0,4,0x55555555000000005555555555555555,1 +387,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +387,1,0,6,0x0203736fcb198b15d8d7a0c80f66dddd,1 +387,1,0,7,0x15259240aa78d08aae67c467de045034,1 +387,1,0,8,0x34383438d5041ea9a387ee8e4d4e84b4,1 +387,1,0,9,0x471b160c6bcf2568b072f8f20e87a996,1 +387,0,1,0,0,1 +387,0,1,1,0,1 +388,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +388,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +388,1,0,2,0x7fffffff800000007fffffffffffffff,1 +388,1,0,3,0xde737d56d38bcf4279dce5617e3192a9,1 +388,1,0,4,0x7fffffff800000007fffffffffffffff,1 +388,1,0,5,0xde737d56d38bcf4279dce5617e3192a8,1 +388,1,0,6,0x78d844dc7f16b73b1f2a39730da5d8cd,1 +388,1,0,7,0x99fe2e70a18482384e37dcd2bfea02e1,1 +388,1,0,8,0xed6572e01eb7a8d113d02c666c45ef22,1 +388,1,0,9,0xd3b9a6a6dea99aa43a8183c26e75d336,1 +388,0,1,0,0,1 +388,0,1,1,1,1 +389,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +389,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +389,1,0,2,0x7fffffff800000007fffffffffffffff,1 +389,1,0,3,0xde737d56d38bcf4279dce5617e3192a9,1 +389,1,0,4,0x7fffffff800000007fffffffffffffff,1 +389,1,0,5,0xde737d56d38bcf4279dce5617e3192a9,1 +389,1,0,6,0xdec6c8257dde94110eacc8c09d2e5789,1 +389,1,0,7,0xcc5beb81a958b02b4d62da9599a74014,1 +389,1,0,8,0x66fae1614174be63970b83f652442106,1 +389,1,0,9,0x7b06dd6f4e9c56baca4e344fdd690f1d,1 +389,0,1,0,0,1 +389,0,1,1,1,1 +390,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +390,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +390,1,0,2,0x55555555000000005555555555555555,1 +390,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +390,1,0,4,0x532eaabd9574880dbf76b9b8cc00832c,1 +390,1,0,5,0x20a6ec113d682299550d7a6e0f345e25,1 +390,1,0,6,0xa17f5b75a35ed64623ca5cbf1f919512,1 +390,1,0,7,0x92db0c23f0c2ea24c3d0cad0988cabc0,1 +390,1,0,8,0x83a7a618625c228940730b4fa3ee64fa,1 +390,1,0,9,0xecbb2fc20fdde7c58b3a3f6300424dc6,1 +390,0,1,0,0,1 +390,0,1,1,1,1 +391,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +391,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +391,1,0,2,0x55555555000000005555555555555555,1 +391,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +391,1,0,4,0xacd155416a8b77f34089464733ff7cd3,1 +391,1,0,5,0x9c400e9c69af7beb9eac5054ed2ec72c,1 +391,1,0,6,0x04ba0cba291a37db13f33bf90dab628c,1 +391,1,0,7,0x04ec8393a0200419e9eaa1ebcc9fb5c3,1 +391,1,0,8,0x1f3a0a0e6823a49b625ad57b12a32d40,1 +391,1,0,9,0x47970fc3428f0f0049ecf4265dc12f62,1 +391,0,1,0,0,1 +391,0,1,1,1,1 +392,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +392,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +392,1,0,2,0x55555555000000005555555555555555,1 +392,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +392,1,0,4,0x55555555000000005555555555555555,1 +392,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +392,1,0,6,0x692b6c828e0feed63d8aeaa2b7322f9c,1 +392,1,0,7,0xcbe8723a1ed39f229f204a434b8900ef,1 +392,1,0,8,0xa1f6f6abcb38ea3b8fde38b98c7c271f,1 +392,1,0,9,0x274af56a8c5628dc3329069ae4dd5716,1 +392,0,1,0,0,1 +392,0,1,1,1,1 +393,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +393,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +393,1,0,2,0x55555555000000005555555555555555,1 +393,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +393,1,0,4,0xaaaaaaaa00000000aaaaaaaaaaaaaaaa,1 +393,1,0,5,0x7def51c91a0fbf034d26872ca84218e1,1 +393,1,0,6,0x00cefd9162d13e64cb93687a9cd8f975,1 +393,1,0,7,0x5ebb5a3ef7632f800f84871874ccef09,1 +393,1,0,8,0x543ecbeaf7e8044ef721be2fb5f549e4,1 +393,1,0,9,0xb8480d2587404ebf7dbbef2c54bc0cb1,1 +393,0,1,0,0,1 +393,0,1,1,1,1 +394,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +394,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +394,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +394,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +394,1,0,4,0x710f8e3edc7c2d5a3fd23de844002bb9,1 +394,1,0,5,0x49d9f794f6d5405f6d97c1bb03dd2bd2,1 +394,1,0,6,0xb975183b42551cf52f291d5c1921fd5e,1 +394,1,0,7,0x12f50c8c85a4beb9de03efa3f0f24486,1 +394,1,0,8,0x2243018e6866df922dc313612020311f,1 +394,1,0,9,0xf21e242ce3fb15bc78c406b25ab43091,1 +394,0,1,0,0,1 +394,0,1,1,1,1 +395,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +395,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +395,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +395,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +395,1,0,4,0xedffbc270f722c243069a7e5f40335a6,1 +395,1,0,5,0x1a58525c7b4db2e7a8e269274ffe4e1b,1 +395,1,0,6,0xc25f1d166f3e211cdf042a26f8abf609,1 +395,1,0,7,0x4d48b8d17191d74ed717149274466999,1 +395,1,0,8,0x65d06dd6a88abfa49e8b4c5da6bb9228,1 +395,1,0,9,0x51969adf9604b5accfb52a114e77ccdb,1 +395,0,1,0,0,1 +395,0,1,1,1,1 +396,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +396,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +396,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +396,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +396,1,0,4,0xa25adcae105ed7ff4f95d2344e24ee52,1 +396,1,0,5,0x3314c3e178525d007904b68919ba4d53,1 +396,1,0,6,0x8fe5e88243a76e41a004236218a3c3a2,1 +396,1,0,7,0xd6eee398a23c3a0b008d7f0164cbc0ca,1 +396,1,0,8,0x98a20d1bdcf573513c7cfd9b83c63e3a,1 +396,1,0,9,0x82d40127c897697c86b8cb387af7f240,1 +396,0,1,0,0,1 +396,0,1,1,1,1 +397,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +397,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +397,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +397,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +397,1,0,4,0x2e4348c645707dce6760d773de3f3e87,1 +397,1,0,5,0x346924b2f64bd3dd0297e766b5805ebb,1 +397,1,0,6,0x02148256b530fbc470c7b341970b3824,1 +397,1,0,7,0x3ecee6d5a840a37beca2efb37e8dff2c,1 +397,1,0,8,0xc0adbea0882482a7489ca703a399864b,1 +397,1,0,9,0xa987eeb6ddb738af53a83573473cb30d,1 +397,0,1,0,0,1 +397,0,1,1,1,1 +398,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +398,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +398,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +398,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +398,1,0,4,0x348c673b07dce3920d773de3f3e87408,1 +398,1,0,5,0x869e916dbcf797d8f9684fb67753d1dc,1 +398,1,0,6,0xa34db012ce6eda1e9c7375c5fcf3e54e,1 +398,1,0,7,0xd698e19615124273b3a621d021c76f8e,1 +398,1,0,8,0x777458d6f55a364c221e39e1205d5510,1 +398,1,0,9,0xbb4fbb7ddf08d8d8fdde13d1d6df7f14,1 +398,0,1,0,0,1 +398,0,1,1,1,1 +399,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +399,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +399,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +399,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +399,1,0,4,0x6918ce760fb9c7241aee7bc7e7d0e811,1 +399,1,0,5,0x0d3d22db79ef2fb1f2d09f6ceea7a3b8,1 +399,1,0,6,0xb97af3fe78be15f2912b6271dd8a43ba,1 +399,1,0,7,0xdb6dd2a1b315b2ce7ae37b4e7778041d,1 +399,1,0,8,0x930d71ee1992d2466495c42102d08e81,1 +399,1,0,9,0x154c305307d1dcd52d0fa4c479b278e7,1 +399,0,1,0,0,1 +399,0,1,1,1,1 +400,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +400,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +400,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +400,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +400,1,0,4,0x73b3c694391d8eadde3f3e8740894647,1 +400,1,0,5,0x15ac20e4c126bbf6d864d648969f5b5a,1 +400,1,0,6,0x81e7198a3c3f23901cedc7a1d6eff6e9,1 +400,1,0,7,0xbf81108e6c35cd8559139af3135dbcbb,1 +400,1,0,8,0x9ef1568530291a8061b90c9f4285eefc,1 +400,1,0,9,0xba990d4570a4e3b7b737525b5d580034,1 +400,0,1,0,0,1 +400,0,1,1,1,1 +401,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +401,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +401,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +401,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +401,1,0,4,0xbb07ac7a86948c2c2989a16db1930ef1,1 +401,1,0,5,0xb89ce112595197656877e53c41457f28,1 +401,1,0,6,0xab4d792ca121d1dba39cb9de645149c2,1 +401,1,0,7,0xab573e8becc6ddff3cc9960f188ddf73,1 +401,1,0,8,0x7f90ba23664153e93262ff7335541519,1 +401,1,0,9,0x5858d7be1315a69456386de68285a3c8,1 +401,0,1,0,0,1 +401,0,1,1,1,1 +402,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +402,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +402,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +402,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +402,1,0,4,0x27e4d82cb6c061dd9337c69bf9332ed3,1 +402,1,0,5,0xd198662d6f2299443f62c861187db648,1 +402,1,0,6,0x518412b69af43aae084476a68d59bbde,1 +402,1,0,7,0x51fbfa9e5be80563f587c9c2652f88ef,1 +402,1,0,8,0x2d3b90d25baa6bdb7b0c55e5240a3a98,1 +402,1,0,9,0xfbc24afed8523edec1c70503fc10f233,1 +402,0,1,0,0,1 +402,0,1,1,1,1 +403,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +403,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +403,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +403,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +403,1,0,4,0xe7c5cf3aac2e88923b77850515fff6a1,1 +403,1,0,5,0x2d13b356dfe9ec275c3dd81ae94609a4,1 +403,1,0,6,0xa08f14a644b9a935dffea4761ebaf592,1 +403,1,0,7,0xd1f66fe6cd373aa7f5d370af34f8352d,1 +403,1,0,8,0xa54b5bc4025cf335900a914c2934ec2f,1 +403,1,0,9,0xec7a396d0a7affcad732a5741c7aaaf5,1 +403,0,1,0,0,1 +403,0,1,1,1,1 +404,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +404,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +404,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +404,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +404,1,0,4,0xc77838df91c1e953e016e10bddffea23,1 +404,1,0,5,0x17f9fee32bacfe553cede9e57a748f68,1 +404,1,0,6,0xccf2296a6a89b62b90739d38af4ae3a2,1 +404,1,0,7,0x0e9f45715b90044639241061e33f8f8c,1 +404,1,0,8,0xaace0046491eeaa1c6e9a472b96d88f4,1 +404,1,0,9,0xaf83e7ff1bb84438c7e058034412ae08,1 +404,0,1,0,0,1 +404,0,1,1,1,1 +405,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +405,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +405,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +405,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +405,1,0,4,0x8ef071c02383d2a6c02dc217bbffd446,1 +405,1,0,5,0x730d0318b0425e2586220907f885f97f,1 +405,1,0,6,0x94b0fc1525bcabf82b1f34895e5819a0,1 +405,1,0,7,0x6c02b23e04002276e165f962c86e3927,1 +405,1,0,8,0xbe7c2ab4d0b25303204fb32a1f829290,1 +405,1,0,9,0x2792225e16a6d2dbfb29fbc89a9c3376,1 +405,0,1,0,0,1 +405,0,1,1,1,1 +406,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +406,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +406,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +406,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +406,1,0,4,0x5668aaa0b545bbf9a044a32399ffbe69,1 +406,1,0,5,0xce20074e34d7bdf5cf56282a76976396,1 +406,1,0,6,0x5351f37e1de0c88c508527d89882d183,1 +406,1,0,7,0xccdcf2efca407edb0627cadfd16de6ec,1 +406,1,0,8,0x44b4b57cdf960d32ebcc4c97847eed21,1 +406,1,0,9,0x8425853b5b675eb781b766a1a1300349,1 +406,0,1,0,0,1 +406,0,1,1,1,1 +407,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +407,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +407,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +407,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +407,1,0,4,0xd12d6e56882f6c0027cae91a27127728,1 +407,1,0,5,0xf7fddf478fb4fdc2b65f40a60b0eb952,1 +407,1,0,6,0x748bbafc320e6735cb64019710a269c6,1 +407,1,0,7,0xc2b5d147bdc831325cb2fb276ac971a6,1 +407,1,0,8,0x9d655e9a755bc9d800ad21ee3fd4d980,1 +407,1,0,9,0xd93a7a49a8c5ccd37005177578f51163,1 +407,0,1,0,0,1 +407,0,1,1,1,1 +408,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +408,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +408,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +408,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +408,1,0,4,0x7fffffffaaaaaaaaffffffffffffffff,1 +408,1,0,5,0xe9a2538f37b28a2c513dee40fecbb71a,1 +408,1,0,6,0x14b3bbd75c5e1c0c36535a934d4ab851,1 +408,1,0,7,0x12410b3b90fa97a31c33038964fd85cc,1 +408,1,0,8,0x112f7d837f8f9c36b460d636c965a5f8,1 +408,1,0,9,0x18f2b50c5d00fb3f9705561dd6631883,1 +408,0,1,0,0,1 +408,0,1,1,1,1 +409,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +409,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +409,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +409,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +409,1,0,4,0xb62f26b5f2a2b26f6de86d42ad8a13da,1 +409,1,0,5,0x3ab3cccd0459b201de009e526adf21f2,1 +409,1,0,6,0xd823533c04cd8edc6d6f950a8e08ade0,1 +409,1,0,7,0x4a9bafa2f14a590356935671ae9305bf,1 +409,1,0,8,0x43178d1f88b6a57a96924c265f0ddb75,1 +409,1,0,9,0xb58312907b195acb59d7797303123775,1 +409,0,1,0,0,1 +409,0,1,1,1,1 +410,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +410,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +410,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +410,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +410,1,0,4,0xbb1d9ac949dd748cd02bbbe749bd351c,1 +410,1,0,5,0xd57b38bb61403d700686aa7b4c90851e,1 +410,1,0,6,0xdb2b3408b3167d91030624c6328e8ce3,1 +410,1,0,7,0xec108c105575c2f3d209b92e654bab69,1 +410,1,0,8,0xc34318139c50b0802c6e612f0fd3189d,1 +410,1,0,9,0x800df7c996d5d7b7c3d6be82836fa258,1 +410,0,1,0,0,1 +410,0,1,1,1,1 +411,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +411,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +411,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +411,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +411,1,0,4,0x66755a00638cdaec1c732513ca0234ec,1 +411,1,0,5,0xe52545dac11f816e818f725b4f60aaf2,1 +411,1,0,6,0x09179ce7c59225392216453b2ac1e9d1,1 +411,1,0,7,0x78c24837dfae26bc1dd7ab6063852742,1 +411,1,0,8,0x5556b42e330289f3b826b2db7a86d19d,1 +411,1,0,9,0x45c2860a59f2be1ddcc3b691f95a9255,1 +411,0,1,0,0,1 +411,0,1,1,1,1 +412,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +412,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +412,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +412,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +412,1,0,4,0x55a00c9fcdaebb6032513ca0234ecfff,1 +412,1,0,5,0xe98ebe492fdf02e48ca48e982beb3669,1 +412,1,0,6,0x01959fb8deda56e5467b7e4b214ea4c2,1 +412,1,0,7,0xd0c2fb29d70ff19b6b1eccebd6568d7e,1 +412,1,0,8,0xd9dbd77a918297fd970bff01e1343f69,1 +412,1,0,9,0x25167db5a14d098a211c39cc3a413398,1 +412,0,1,0,0,1 +412,0,1,1,1,1 +413,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +413,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +413,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +413,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +413,1,0,4,0xab40193f9b5d76c064a27940469d9fff,1 +413,1,0,5,0xd31d7c925fbe05c919491d3057d66cd2,1 +413,1,0,6,0x567f1fdc387e5350c852b4e8f8ba9d6d,1 +413,1,0,7,0x947e1c5dd7ccc61a5938245dd6bcab3a,1 +413,1,0,8,0x9960bebaf919514f9535c22eaaf0b581,1 +413,1,0,9,0x2857970e26662267b1f3eb1011130a11,1 +413,0,1,0,0,1 +413,0,1,1,1,1 +414,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +414,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +414,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +414,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +414,1,0,4,0xca0234ebb5fdcb13ca0234ecffffffff,1 +414,1,0,5,0xcb0dadbbc7f549f8a26b4408d0dc8600,1 +414,1,0,6,0x3499f974ff4ca6bbb2f51682fd5f5176,1 +414,1,0,7,0x2f9dd6dd2855262660b36d46d3e4bec2,1 +414,1,0,8,0xf498fae2487807e220119152f0122476,1 +414,1,0,9,0xc64d4fa46ddce85c4546630f0d5c5e81,1 +414,0,1,0,0,1 +414,0,1,1,1,1 +415,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +415,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +415,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +415,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +415,1,0,4,0xbfffffff3ea3677e082b9310572620ae,1 +415,1,0,5,0x19933a9e65b285598711c77298815ad3,1 +415,1,0,6,0x2c5c01662cf00c1929596257db13b26e,1 +415,1,0,7,0xcf30d0f3ec4b9f0351b0f27094473426,1 +415,1,0,8,0xe986a086060d086eee822ddd2fc74424,1 +415,1,0,9,0x7a0154b57f7a69c51d9fdafa484e4ac7,1 +415,0,1,0,0,1 +415,0,1,1,1,1 +416,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +416,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +416,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +416,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +416,1,0,4,0x266666663bbbbbbbe666666666666666,1 +416,1,0,5,0x5b37902e023fab7c8f055d86e5cc41f4,1 +416,1,0,6,0x91d4cba813a04d86dbae94c23be6f52c,1 +416,1,0,7,0x15774183be7ba5b2d9f3cf010b160501,1 +416,1,0,8,0x900b8adfea6491019a9ac080d516025a,1 +416,1,0,9,0x541bf4b952b0ad7be4b1874b02fd544a,1 +416,0,1,0,0,1 +416,0,1,1,1,1 +417,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +417,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +417,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +417,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +417,1,0,4,0xbfffffff36db6db7a492492492492492,1 +417,1,0,5,0x146c573f4c6dfc8d08a443e258970b09,1 +417,1,0,6,0xef7fd0a3a36386638330ecad41e1a3b3,1 +417,1,0,7,0x02af36960831d0210c614b948e8aa124,1 +417,1,0,8,0xef0d6d800e4047d6d3c1be0fdeaf11fc,1 +417,1,0,9,0xd8cab5ab59c730eb34116e35a8c7d098,1 +417,0,1,0,0,1 +417,0,1,1,1,1 +418,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +418,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +418,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +418,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +418,1,0,4,0xbfffffff2aaaaaab7fffffffffffffff,1 +418,1,0,5,0xc815d0e60b3e596ecb1ad3a27cfd49c4,1 +418,1,0,6,0xa521dab13cc9152d8ca77035a607fea0,1 +418,1,0,7,0x6c55cc3ca5dbeb868cea92eafe93df2a,1 +418,1,0,8,0x7bfb9b28531996635e6a5ccaa2826a40,1 +418,1,0,9,0x6ce1111bdb9c2e0ca36500418a2f43de,1 +418,0,1,0,0,1 +418,0,1,1,1,1 +419,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +419,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +419,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +419,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +419,1,0,4,0x7fffffff55555555ffffffffffffffff,1 +419,1,0,5,0xd344a71e6f651458a27bdc81fd976e37,1 +419,1,0,6,0x474d58a4eec16e0d565f2187fe11d4e8,1 +419,1,0,7,0xe7a2683a12f38b4fc01d1237a81a1097,1 +419,1,0,8,0x6e55f73bb7cdda46bdb67ef77f6fd296,1 +419,1,0,9,0x9df2b67920fb5945fde3a517a6ded4cd,1 +419,0,1,0,0,1 +419,0,1,1,1,1 +420,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +420,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +420,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +420,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +420,1,0,4,0x3fffffff800000007fffffffffffffff,1 +420,1,0,5,0xde737d56d38bcf4279dce5617e3192aa,1 +420,1,0,6,0x692da5cd4309d9a6e5cb525c37da8fa0,1 +420,1,0,7,0x879f7b57208cdabbf47d223a5b23a621,1 +420,1,0,8,0x40e0daa78cfdd207a7389aaed61738b1,1 +420,1,0,9,0x7fc5fc3e6a5ed3397d2902e9125e6ab4,1 +420,0,1,0,0,1 +420,0,1,1,1,1 +421,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +421,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +421,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +421,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +421,1,0,4,0x5d8ecd64a4eeba466815ddf3a4de9a8e,1 +421,1,0,5,0x6abd9c5db0a01eb80343553da648428f,1 +421,1,0,6,0x85689b3e0775c7718a90279f14a8082c,1 +421,1,0,7,0xfcd4d1f1679274f4e9b8805c570a0670,1 +421,1,0,8,0x167fcc5ca734552e09afa3640f4a034e,1 +421,1,0,9,0x15b9b7ca661ec7ff70d3f240ebe705b1,1 +421,0,1,0,0,1 +421,0,1,1,1,1 +422,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +422,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +422,1,0,2,0x6f2347cab7dd76858fe0555ac3bc9904,1 +422,1,0,3,0x8c4aacafdfb6bcbe05ea6c42c4934569,1 +422,1,0,4,0xf21d907e3890916dc4fa1f4703c1e50d,1 +422,1,0,5,0x3f54ddf7383e44023a41de562aa18ed8,1 +422,1,0,6,0x0158137755b901f797a90d4ca8887e02,1 +422,1,0,7,0x3cb2ef63b2ba2c0d455edaef42cf237e,1 +422,1,0,8,0x2a964fc00d377a8592b8b61aafa7a4aa,1 +422,1,0,9,0xa7c7b9fd2b41d6e0e17bd1ba5677edcd,1 +422,0,1,0,0,1 +422,0,1,1,1,1 +423,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +423,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +423,1,0,2,0x6f2347cab7dd76858fe0555ac3bc9904,1 +423,1,0,3,0x8c4aacafdfb6bcbe05ea6c42c4934569,1 +423,1,0,4,0xf21d907e3890916dc4fa1f4703c1e50d,1 +423,1,0,5,0x3f54ddf7383e44023a41de562aa18ed8,1 +423,1,0,6,0x0158137755b901f797a90d4ca8887e02,1 +423,1,0,7,0x3cb2ef63b2ba2c0d455edaef42cf237e,1 +423,1,0,8,0xd569b03ef2c8857b6d4749e550585b55,1 +423,1,0,9,0x58384603d4be291f1e842e45a9881232,1 +423,0,1,0,0,1 +423,0,1,1,0,1 +424,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +424,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +424,1,0,2,0x55555555000000005555555555555555,1 +424,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +424,1,0,4,0x33333333000000003333333333333333,1 +424,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aa9,1 +424,1,0,6,0x664ce273320d918d8bdb2e61201b4549,1 +424,1,0,7,0xb36b7cdc54e33b84adb6f2c10aac831e,1 +424,1,0,8,0x49e68831f18bda2973ac3d76bfbc8c5e,1 +424,1,0,9,0xe1cceed2dd862e2dc7c915c736cef1f4,1 +424,0,1,0,0,1 +424,0,1,1,0,1 +425,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +425,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +425,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +425,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +425,1,0,4,0x55555555000000005555555555555555,1 +425,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +425,1,0,6,0x961691a5e960d07a301dbbad4d86247e,1 +425,1,0,7,0xc27d7089faeb3ddd1add395efff1e0fe,1 +425,1,0,8,0x7254622cc371866cdf990d2c5377790e,1 +425,1,0,9,0x37d1f1519817f09a231bd260a9e78aeb,1 +425,0,1,0,0,1 +425,0,1,1,1,1 +426,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +426,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +426,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +426,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +426,1,0,4,0xb6db6db6249249254924924924924924,1 +426,1,0,5,0x625bd7a09bec4ca81bcdd9f8fd6b63cc,1 +426,1,0,6,0x5d283e13ce8ca60da868e3b0fb33e6b4,1 +426,1,0,7,0xf1074793274e2928250e71e2aca63e9c,1 +426,1,0,8,0x214dc74fa25371fb4d9e506d418ed9a1,1 +426,1,0,9,0xbfd6d0c8bb6591d3e0f44505a84886ce,1 +426,0,1,0,0,1 +426,0,1,1,1,1 +427,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +427,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +427,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +427,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +427,1,0,4,0xcccccccc00000000cccccccccccccccc,1 +427,1,0,5,0x971f2ef152794b9d8fc7d568c9e8eaa7,1 +427,1,0,6,0x0fc351da038ae0803bd1d86514ae0462,1 +427,1,0,7,0xf9f8216551d9315aa9d297f792eef6a3,1 +427,1,0,8,0x41c74eed786f2d33da35360ca7aa925e,1 +427,1,0,9,0x753f00d6077a1e9e5fc339d634019c73,1 +427,0,1,0,0,1 +427,0,1,1,1,1 +428,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +428,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +428,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +428,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +428,1,0,4,0x33333333000000003333333333333333,1 +428,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aaa,1 +428,1,0,6,0xa1e34c8f16d138673fee55c080547c2b,1 +428,1,0,7,0xfd4de7550065f638322bba9430ce4b60,1 +428,1,0,8,0x662be9bb512663aa4d7df8ab3f3b4181,1 +428,1,0,9,0xc5d44a7bdf42436620b7d8a6b81ac936,1 +428,0,1,0,0,1 +428,0,1,1,1,1 +429,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +429,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +429,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +429,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +429,1,0,4,0x49249248db6db6dbb6db6db6db6db6db,1 +429,1,0,5,0x5a8b230d0b2b51dcd7ebf0c9fef7c185,1 +429,1,0,6,0x7e1a8a8338d7fd8cf41d322a302d2078,1 +429,1,0,7,0xa87a23c7186150ed7cda6e52817c1bdf,1 +429,1,0,8,0xd0a9135a89d21ce821e29014b2898349,1 +429,1,0,9,0x254d748272b2d4eb8d59ee34c615377f,1 +429,0,1,0,0,1 +429,0,1,1,1,1 +430,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +430,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +430,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +430,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +430,1,0,4,0x16a4502e2781e11ac82cbc9d1edd8c98,1 +430,1,0,5,0x1584d13e18411e2f6e0478c34416e3bb,1 +430,1,0,6,0x5c19fe227a61abc65c61ee7a018cc957,1 +430,1,0,7,0x1b2c6f663ea33583f76a686f64be078b,1 +430,1,0,8,0x7b4a0d734940f613d52bc48673b457c2,1 +430,1,0,9,0xcf78492490a5cc5606c0541d17b24ddb,1 +430,0,1,0,0,1 +430,0,1,1,1,1 +431,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +431,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +431,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +431,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +431,1,0,4,0x55555555000000005555555555555555,1 +431,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +431,1,0,6,0xdb02d1f3421d600e9d9ef9e47419dba3,1 +431,1,0,7,0x208eed08c2d4189a5db63abeb2739666,1 +431,1,0,8,0xe0ed26967b9ada9ed7ffe480827f90a0,1 +431,1,0,9,0xd210d5fd8ec628e31715e6b24125512a,1 +431,0,1,0,0,1 +431,0,1,1,1,1 +432,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +432,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +432,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +432,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +432,1,0,4,0xb6db6db6249249254924924924924924,1 +432,1,0,5,0x625bd7a09bec4ca81bcdd9f8fd6b63cc,1 +432,1,0,6,0x6222d1962655501893c29e441395b6c0,1 +432,1,0,7,0x5711bd3ed5a0ef72cfab338b88229c4b,1 +432,1,0,8,0xaaae079cb44a1af070362aaa520ee24c,1 +432,1,0,9,0xac2626423b0bf81af1c54311d8e2fd23,1 +432,0,1,0,0,1 +432,0,1,1,1,1 +433,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +433,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +433,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +433,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +433,1,0,4,0xcccccccc00000000cccccccccccccccc,1 +433,1,0,5,0x971f2ef152794b9d8fc7d568c9e8eaa7,1 +433,1,0,6,0x4ccfa24c67f3def7fa81bc99c70bb041,1 +433,1,0,7,0x9c0952ba599f4c03361da184b04cdca5,1 +433,1,0,8,0xdb76b797f7f41d9c729a2219478a7e62,1 +433,1,0,9,0x9728df870800be8cf6ca7a0a82153bfa,1 +433,0,1,0,0,1 +433,0,1,1,1,1 +434,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +434,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +434,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +434,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +434,1,0,4,0x33333333000000003333333333333333,1 +434,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aaa,1 +434,1,0,6,0xea1c72c91034036bac71402b6e9ecc4a,1 +434,1,0,7,0xf3dbde7a99dc574061e99fefff9d84da,1 +434,1,0,8,0xb7dd057e75b78ac6f56e34eb048f0a9d,1 +434,1,0,9,0x29d5d055408c90d02bc2ea918c18cb63,1 +434,0,1,0,0,1 +434,0,1,1,1,1 +435,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +435,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +435,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +435,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +435,1,0,4,0x49249248db6db6dbb6db6db6db6db6db,1 +435,1,0,5,0x5a8b230d0b2b51dcd7ebf0c9fef7c185,1 +435,1,0,6,0xc2879a66d86cb20b820b7795da2da62b,1 +435,1,0,7,0x38924f7817d1cd350d936988e90e79bc,1 +435,1,0,8,0x5431a7268ff6931c7a759de024eff90b,1 +435,1,0,9,0xcb0177216db6fd1f3aaaa11fa3b6a083,1 +435,0,1,0,0,1 +435,0,1,1,1,1 +436,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +436,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +436,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +436,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +436,1,0,4,0x16a4502e2781e11ac82cbc9d1edd8c98,1 +436,1,0,5,0x1584d13e18411e2f6e0478c34416e3bb,1 +436,1,0,6,0xab1c0f273f74abc2b848c75006f2ef3c,1 +436,1,0,7,0x54c26df27711b06558f455079aee0ba3,1 +436,1,0,8,0xdf510f2ecef6d9a05997c776f14ad645,1 +436,1,0,9,0x6c179f0a13af1771e4d6c37fa48b47f2,1 +436,0,1,0,0,1 +436,0,1,1,1,1 +437,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +437,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +437,1,0,2,0x532eaabd9574880dbf76b9b8cc00832c,1 +437,1,0,3,0x20a6ec113d682299550d7a6e0f345e25,1 +437,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +437,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +437,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +437,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +437,1,0,8,0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16,1 +437,1,0,9,0x2bce33576b315ececbb6406837bf51f5,1 +437,0,1,0,0,1 +437,0,1,1,0,1 +438,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +438,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +438,1,0,2,0xacd155416a8b77f34089464733ff7cd3,1 +438,1,0,3,0x9c400e9c69af7beb9eac5054ed2ec72c,1 +438,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +438,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +438,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +438,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +438,1,0,8,0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16,1 +438,1,0,9,0x2bce33576b315ececbb6406837bf51f5,1 +438,0,1,0,0,1 +438,0,1,1,0,1 +439,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +439,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +439,1,0,2,0x532eaabd9574880dbf76b9b8cc00832c,1 +439,1,0,3,0x20a6ec113d682299550d7a6e0f345e25,1 +439,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +439,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +439,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +439,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +439,1,0,8,0xb01cbd1c01e58065711814b583f061e9,1 +439,1,0,9,0xd431cca994cea1313449bf97c840ae0a,1 +439,0,1,0,0,1 +439,0,1,1,0,1 +440,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +440,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +440,1,0,2,0xacd155416a8b77f34089464733ff7cd3,1 +440,1,0,3,0x9c400e9c69af7beb9eac5054ed2ec72c,1 +440,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +440,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +440,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +440,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +440,1,0,8,0xb01cbd1c01e58065711814b583f061e9,1 +440,1,0,9,0xd431cca994cea1313449bf97c840ae0a,1 +440,0,1,0,0,1 +440,0,1,1,0,1 +441,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +441,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +441,1,0,2,0xa8ea150cb80125d7381c4c1f1da8e9de,1 +441,1,0,3,0x2711f9917060406a73d7904519e51388,1 +441,1,0,4,0xf3ab9fa68bd47973a73b2d40480c2ba5,1 +441,1,0,5,0x0c22c9d76ec217257288293285449b86,1 +441,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +441,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +441,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +441,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +441,0,1,0,0,1 +441,0,1,1,1,1 +442,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +442,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +442,1,0,2,0x30e782f964b2e2ff065a051bc7adc206,1 +442,1,0,3,0x15d8c43a1365713c88268822c253bcce,1 +442,1,0,4,0x5b16df652aa1ecb2dc8b46c515f9604e,1 +442,1,0,5,0x2e84cacfa7c6eec30428d2d3f4e08ed5,1 +442,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +442,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +442,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +442,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +442,0,1,0,0,1 +442,0,1,1,1,1 +443,1,0,0,0xe3b0c44298fc1c149afbf4c8996fb924,1 +443,1,0,1,0x27ae41e4649b934ca495991b7852b855,1 +443,1,0,2,0xb292a619339f6e567a305c951c0dcbcc,1 +443,1,0,3,0x42d16e47f219f9e98e76e09d8770b34a,1 +443,1,0,4,0x0177e60492c5a8242f76f07bfe3661bd,1 +443,1,0,5,0xe59ec2a17ce5bd2dab2abebdf89a62e2,1 +443,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +443,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +443,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +443,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +443,0,1,0,0,1 +443,0,1,1,1,1 +444,1,0,0,0xde47c9b27eb8d300dbb5f2c353e632c3,1 +444,1,0,1,0x93262cf06340c4fa7f1b40c4cbd36f90,1 +444,1,0,2,0x986e65933ef2ed4ee5aada139f52b705,1 +444,1,0,3,0x39aaf63f00a91f29c69178490d57fb71,1 +444,1,0,4,0x3dafedfb8da6189d372308cbf1489bbb,1 +444,1,0,5,0xdabf0c0217d1c0ff0f701aaa7a694b9c,1 +444,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +444,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +444,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +444,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +444,0,1,0,0,1 +444,0,1,1,1,1 +445,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +445,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +445,1,0,2,0xd434e262a49eab7781e353a3565e4825,1 +445,1,0,3,0x50dd0fd5defa013c7f29745eff3569f1,1 +445,1,0,4,0x9b0c0a93f267fb6052fd8077be769c2b,1 +445,1,0,5,0x98953195d7bc10de844218305c6ba17a,1 +445,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +445,1,0,7,0xf3807eca117380239fbd816900000000,1 +445,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +445,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +445,0,1,0,0,1 +445,0,1,1,1,1 +446,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +446,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +446,1,0,2,0x0fe774355c04d060f76d79fd7a772e42,1 +446,1,0,3,0x1463489221bf0a33add0be9b1979110b,1 +446,1,0,4,0x500dcba1c69a8fbd43fa4f57f743ce12,1 +446,1,0,5,0x4ca8b91a1f325f3fac6181175df55737,1 +446,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +446,1,0,7,0xf3807eca117380239fbd816900000000,1 +446,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +446,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +446,0,1,0,0,1 +446,0,1,1,1,1 +447,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +447,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +447,1,0,2,0xbb40bf217bed3fb3950c7d39f03d36dc,1 +447,1,0,3,0x8e3b2cd79693f125bfd06595ee1135e3,1 +447,1,0,4,0x541bf3532351ebb032710bdb6a1bf1bf,1 +447,1,0,5,0xc89a1e291ac692b3fa4780745bb55677,1 +447,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +447,1,0,7,0xf3807eca117380239fbd816900000000,1 +447,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +447,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +447,0,1,0,0,1 +447,0,1,1,1,1 +448,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +448,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +448,1,0,2,0x664eb7ee6db84a34df3c86ea31389a54,1 +448,1,0,3,0x05badd5ca99231ff556d3e75a233e73a,1 +448,1,0,4,0x59f3c752e52eca46137642490a51560c,1 +448,1,0,5,0xe0badc678754b8f72e51a2901426a1bd,1 +448,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +448,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +448,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +448,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +448,0,1,0,0,1 +448,0,1,1,1,1 +449,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +449,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +449,1,0,2,0x4cd0429bbabd2827009d6fcd843d4ce3,1 +449,1,0,3,0x9c3e42e2d1631fd001985a79d1fd8b43,1 +449,1,0,4,0x9638bf12dd682f60be7ef1d0e0d98f08,1 +449,1,0,5,0xb7bca77a1a2b869ae466189d2acdabe3,1 +449,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +449,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +449,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +449,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +449,0,1,0,0,1 +449,0,1,1,1,1 +450,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +450,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +450,1,0,2,0xe56c6ea2d1b017091c44d8b6cb62b9f4,1 +450,1,0,3,0x60e3ce9aed5e5fd41e8added97c56c04,1 +450,1,0,4,0xa308ec31f281e955be20b457e463440b,1 +450,1,0,5,0x4fcf2b80258078207fc1378180f89b55,1 +450,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +450,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +450,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +450,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +450,0,1,0,0,1 +450,0,1,1,1,1 +451,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +451,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +451,1,0,2,0x1158a08d291500b4cabed3346d891eee,1 +451,1,0,3,0x57c176356a2624fb011f8fbbf3466830,1 +451,1,0,4,0x228a8c486a736006e082325b85290c5b,1 +451,1,0,5,0xc91f378b75d487dda46798c18f285519,1 +451,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +451,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +451,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +451,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +451,0,1,0,0,1 +451,0,1,1,1,1 +452,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +452,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +452,1,0,2,0xb1db9289649f59410ea36b0c0fc8d6aa,1 +452,1,0,3,0x2687b29176939dd23e0dde56d309fa9d,1 +452,1,0,4,0x3e1535e4280559015b0dbd987366dcf4,1 +452,1,0,5,0x3a6d1af5c23c7d584e1c3f48a1251336,1 +452,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +452,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +452,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +452,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +452,0,1,0,0,1 +452,0,1,1,1,1 +453,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +453,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +453,1,0,2,0xb7b16e762286cb96446aa8d4e6e7578b,1 +453,1,0,3,0x0a341a79f2dd1a220ac6f0ca4e24ed86,1 +453,1,0,4,0xddc60a700a139b04661c547d07bbb072,1 +453,1,0,5,0x1780146df799ccf55e55234ecb8f12bc,1 +453,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +453,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +453,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +453,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +453,0,1,0,0,1 +453,0,1,1,1,1 +454,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +454,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +454,1,0,2,0xd82a7c2717261187c8e00d8df963ff35,1 +454,1,0,3,0xd796edad36bc6e6bd1c91c670d9105b4,1 +454,1,0,4,0x3dcabddaf8fcaa61f4603e7cbac0f3c0,1 +454,1,0,5,0x351ecd5988efb23f680d07debd139929,1 +454,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +454,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +454,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +454,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +454,0,1,0,0,1 +454,0,1,1,1,1 +455,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +455,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +455,1,0,2,0x5eb9c8845de68eb13d5befe719f462d7,1 +455,1,0,3,0x7787802baff30ce96a5cba063254af78,1 +455,1,0,4,0x2c026ae9be2e2a5e7ca0ff9bbd92fb6e,1 +455,1,0,5,0x44972186228ee9a62b87ddbe2ef66fb5,1 +455,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +455,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +455,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +455,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +455,0,1,0,0,1 +455,0,1,1,1,1 +456,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +456,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +456,1,0,2,0x96843dd03c22abd2f3b782b170239f90,1 +456,1,0,3,0xf277921becc117d0404a8e4e36230c28,1 +456,1,0,4,0xf2be378f526f74a543f67165976de9ed,1 +456,1,0,5,0x9a31214eb4d7e6db19e1ede123dd991d,1 +456,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +456,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +456,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +456,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +456,0,1,0,0,1 +456,0,1,1,1,1 +457,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +457,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +457,1,0,2,0x766456dce1857c906f9996af72933946,1 +457,1,0,3,0x4d27e9d98edc2d0e3b760297067421f6,1 +457,1,0,4,0x402385ecadae0d8081dccaf5d19037ec,1 +457,1,0,5,0x4e55376eced699e93646bfbbf19d0b41,1 +457,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +457,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +457,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +457,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +457,0,1,0,0,1 +457,0,1,1,1,1 +458,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +458,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +458,1,0,2,0xc605c4b2edeab20419e6518a11b2dbc2,1 +458,1,0,3,0xb97ed8b07cced0b19c34f777de7b9fd9,1 +458,1,0,4,0xedf0f612c5f46e03c719647bc8af1b29,1 +458,1,0,5,0xb2cde2eda700fb1cff5e159d47326dba,1 +458,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +458,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +458,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +458,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +458,0,1,0,0,1 +458,0,1,1,1,1 +459,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +459,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +459,1,0,2,0xd48b68e6cabfe03cf6141c9ac54141f2,1 +459,1,0,3,0x10e64485d9929ad7b732bfe3b7eb8a84,1 +459,1,0,4,0xfeedae50c61bd00e19dc26f9b7e2265e,1 +459,1,0,5,0x4508c389109ad2f208f0772315b6c941,1 +459,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +459,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +459,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +459,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +459,0,1,0,0,1 +459,0,1,1,1,1 +460,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +460,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +460,1,0,2,0xb7c81457d4aeb6aa65957098569f0479,1 +460,1,0,3,0x710ad7f6595d5874c35a93d12a5dd4c7,1 +460,1,0,4,0xb7961a0b652878c2d568069a432ca18a,1 +460,1,0,5,0x1a9199f2ca574dad4b9e3a05c0a1cdb3,1 +460,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +460,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +460,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +460,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +460,0,1,0,0,1 +460,0,1,1,1,1 +461,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +461,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +461,1,0,2,0x6b01332ddb6edfa9a30a1321d5858e1e,1 +461,1,0,3,0xe3cf97e263e669f8de5e9652e76ff3f7,1 +461,1,0,4,0x5939545fced457309a6a04ace2bd0f70,1 +461,1,0,5,0x139c8f7d86b02cb1cc58f9e69e96cd5a,1 +461,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +461,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +461,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +461,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +461,0,1,0,0,1 +461,0,1,1,1,1 +462,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +462,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +462,1,0,2,0xefdb884720eaeadc349f9fc356b6c034,1 +462,1,0,3,0x4101cd2fd8436b7d0e6a4fb93f106361,1 +462,1,0,4,0xf24bee6ad5dc05f7613975473aadf3aa,1 +462,1,0,5,0xcba9e77de7d69b6ce48cb60d8113385d,1 +462,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +462,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +462,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +462,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +462,0,1,0,0,1 +462,0,1,1,1,1 +463,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +463,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +463,1,0,2,0x31230428405560dcb88fb5a646836aea,1 +463,1,0,3,0x9b23a23dd973dcbe8014c87b8b20eb07,1 +463,1,0,4,0x0f9344d6e812ce166646747694a41b0a,1 +463,1,0,5,0xaf97374e19f3c5fb8bd7ae3d9bd0beff,1 +463,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +463,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +463,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +463,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +463,0,1,0,0,1 +463,0,1,1,1,1 +464,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +464,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +464,1,0,2,0xcaa797da65b320ab0d5c470cda0b36b2,1 +464,1,0,3,0x94359c7db9841d679174db34c4855743,1 +464,1,0,4,0xcf543a62f23e212745391aaf7505f345,1 +464,1,0,5,0x123d2685ee3b941d3de6d9b36242e5a0,1 +464,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +464,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +464,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +464,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +464,0,1,0,0,1 +464,0,1,1,1,1 +465,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +465,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +465,1,0,2,0x7e5f0ab5d900d3d3d7867657e5d6d365,1 +465,1,0,3,0x19bc54084536e7d21c336ed800185945,1 +465,1,0,4,0x9450c07f201faec94b82dfb322e5ac67,1 +465,1,0,5,0x6688294aad35aa72e727ff0b19b646aa,1 +465,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +465,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +465,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +465,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +465,0,1,0,0,1 +465,0,1,1,1,1 +466,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +466,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +466,1,0,2,0xd7d70c581ae9e3f66dc6a480bf037ae2,1 +466,1,0,3,0x3f8a1e4a2136fe4b03aa69f0ca25b356,1 +466,1,0,4,0x89c460f8a5a5c2bbba962c8a3ee833a4,1 +466,1,0,5,0x13e85658e62a59e2af41d9127cc47224,1 +466,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +466,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +466,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +466,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +466,0,1,0,0,1 +466,0,1,1,1,1 +467,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +467,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +467,1,0,2,0x341c1b9ff3c83dd5e0dfa0bf68bcdf4b,1 +467,1,0,3,0xb7aa20c625975e5eeee34bb396266b34,1 +467,1,0,4,0x72b69f061b750fd5121b22b11366fad5,1 +467,1,0,5,0x49c634e77765a017902a67099e0a4469,1 +467,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +467,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +467,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +467,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +467,0,1,0,0,1 +467,0,1,1,1,1 +468,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +468,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +468,1,0,2,0x70bebe684cdcb5ca72a42f0d87387935,1 +468,1,0,3,0x9bd1781a591809947628d313a3814f67,1 +468,1,0,4,0xaec03aca8f5587a4d535fa31027bbe9c,1 +468,1,0,5,0xc0e464b1c3577f4c2dcde6b2094798a9,1 +468,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +468,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +468,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +468,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +468,0,1,0,0,1 +468,0,1,1,1,1 +469,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +469,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +469,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +469,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +469,1,0,4,0x4cd60b855d442f5b3c7b11eb6c4e0ae7,1 +469,1,0,5,0x525fe710fab9aa7c77a67f79e6fadd76,1 +469,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +469,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +469,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +469,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +469,0,1,0,0,1 +469,0,1,1,1,1 +470,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +470,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +470,1,0,2,0xd45c5740946b2a147f59262ee6f5bc90,1 +470,1,0,3,0xbd01ed280528b62b3aed5fc93f06f739,1 +470,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +470,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +470,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +470,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +470,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +470,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +470,0,1,0,0,1 +470,0,1,1,0,1 +471,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +471,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +471,1,0,2,0xd45c5741946b2a137f59262ee6f5bc91,1 +471,1,0,3,0x001af27a5e1117a64733950642a3d1e8,1 +471,1,0,4,0xb329f479a2bbd0a5c384ee1493b1f518,1 +471,1,0,5,0x6a87139cac5df4087c134b49156847db,1 +471,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +471,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +471,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +471,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +471,0,1,0,0,1 +471,0,1,1,0,1 +472,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +472,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +472,1,0,2,0x2ba3a8be6b94d5ec80a6d9d1190a436e,1 +472,1,0,3,0xffe50d85a1eee859b8cc6af9bd5c2e18,1 +472,1,0,4,0x4cd60b865d442f5a3c7b11eb6c4e0ae7,1 +472,1,0,5,0x9578ec6353a20bf783ecb4b6ea97b825,1 +472,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +472,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +472,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +472,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +472,0,1,0,0,1 +472,0,1,1,0,1 +473,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +473,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +473,1,0,2,0x00000000000000000000000000000000,1 +473,1,0,3,0x00000000000000000000000000000001,1 +473,1,0,4,0x00000000000000000000000000000000,1 +473,1,0,5,0x00000000000000000000000000000001,1 +473,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +473,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +473,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +473,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +473,0,1,0,0,1 +473,0,1,1,0,1 +474,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +474,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +474,1,0,2,0x00000000000000000000000000000000,1 +474,1,0,3,0x00000000000000000000000000000001,1 +474,1,0,4,0xffffffff00000000ffffffffffffffff,1 +474,1,0,5,0xbce6faada7179e84f3b9cac2fc632550,1 +474,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +474,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +474,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +474,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +474,0,1,0,0,1 +474,0,1,1,0,1 +475,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +475,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +475,1,0,2,0xffffffff00000000ffffffffffffffff,1 +475,1,0,3,0xbce6faada7179e84f3b9cac2fc632550,1 +475,1,0,4,0x00000000000000000000000000000000,1 +475,1,0,5,0x00000000000000000000000000000001,1 +475,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +475,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +475,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +475,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +475,0,1,0,0,1 +475,0,1,1,0,1 +476,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +476,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +476,1,0,2,0xffffffff00000000ffffffffffffffff,1 +476,1,0,3,0xbce6faada7179e84f3b9cac2fc632550,1 +476,1,0,4,0xffffffff00000000ffffffffffffffff,1 +476,1,0,5,0xbce6faada7179e84f3b9cac2fc632550,1 +476,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +476,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +476,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +476,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +476,0,1,0,0,1 +476,0,1,1,0,1 +477,1,0,0,0x70239dd877f7c944c422f44dea4ed1a5,1 +477,1,0,1,0x2f2627416faf2f072fa50c772ed6f807,1 +477,1,0,2,0x64a1aab5000d0e804f3e2fc02bdee9be,1 +477,1,0,3,0x8ff312334e2ba16d11547c97711c898e,1 +477,1,0,4,0x6af015971cc30be6d1a206d4e013e099,1 +477,1,0,5,0x7772a2f91d73286ffd683b9bb2cf4f1b,1 +477,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +477,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +477,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +477,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +477,0,1,0,0,1 +477,0,1,1,1,1 +478,1,0,0,0x00000000690ed426ccf17803ebe2bd08,1 +478,1,0,1,0x84bcd58a1bb5e7477ead3645f356e7a9,1 +478,1,0,2,0x16aea964a2f6506d6f78c81c91fc7e8b,1 +478,1,0,3,0xded7d397738448de1e19a0ec580bf266,1 +478,1,0,4,0x252cd762130c6667cfe8b7bc47d27d78,1 +478,1,0,5,0x391e8e80c578d1cd38c3ff033be928e9,1 +478,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +478,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +478,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +478,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +478,0,1,0,0,1 +478,0,1,1,1,1 +479,1,0,0,0x7300000000213f2a525c6035725235c2,1 +479,1,0,1,0xf696ad3ebb5ee47f140697ad25770d91,1 +479,1,0,2,0x9cc98be2347d469bf476dfc26b9b733d,1 +479,1,0,3,0xf2d26d6ef524af917c665baccb23c882,1 +479,1,0,4,0x093496459effe2d8d70727b82462f61d,1 +479,1,0,5,0x0ec1b7847929d10ea631dacb16b56c32,1 +479,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +479,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +479,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +479,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +479,0,1,0,0,1 +479,0,1,1,1,1 +480,1,0,0,0xddf2000000005e0be0635b245f0b9797,1 +480,1,0,1,0x8afd25daadeb3edb4a0161c27fe06045,1 +480,1,0,2,0x73b3c90ecd390028058164524dde8927,1 +480,1,0,3,0x03dce3dea0d53fa8093999f07ab8aa43,1 +480,1,0,4,0x2f67b0b8e20636695bb7d8bf0a651c80,1 +480,1,0,5,0x2ed25a395387b5f4188c0c4075c88634,1 +480,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +480,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +480,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +480,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +480,0,1,0,0,1 +480,0,1,1,1,1 +481,1,0,0,0x67ab1900000000784769c4ecb9e164d6,1 +481,1,0,1,0x642b8499588b89855be1ec355d0841a0,1 +481,1,0,2,0xbfab3098252847b328fadf2f89b95c85,1 +481,1,0,3,0x1a7f0eb390763378f37e90119d5ba3dd,1 +481,1,0,4,0xbdd64e234e832b1067c2d058ccb44d97,1 +481,1,0,5,0x8195ccebb65c2aaf1e2da9b8b4987e3b,1 +481,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +481,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +481,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +481,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +481,0,1,0,0,1 +481,0,1,1,1,1 +482,1,0,0,0xa2bf09460000000076d7dbeffe125eaf,1 +482,1,0,1,0x02095dff252ee905e296b6350fc311cf,1 +482,1,0,2,0x204a9784074b246d8bf8bf04a4ceb1c1,1 +482,1,0,3,0xf1c9aaab168b1596d17093c5cd21d2cd,1 +482,1,0,4,0x51cce41670636783dc06a759c8847868,1 +482,1,0,5,0xa406c2506fe17975582fe648d1d88b52,1 +482,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +482,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +482,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +482,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +482,0,1,0,0,1 +482,0,1,1,1,1 +483,1,0,0,0x3554e827c700000000e1e75e624a06b3,1 +483,1,0,1,0xa0a353171160858129e15c544e4f0e65,1 +483,1,0,2,0xed66dc34f551ac82f63d4aa4f81fe2cb,1 +483,1,0,3,0x0031a91d1314f835027bca0f1ceeaa03,1 +483,1,0,4,0x99ca123aa09b13cd194a422e18d5fda1,1 +483,1,0,5,0x67623c3f6e5d4d6abb8953d67c0c48c7,1 +483,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +483,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +483,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +483,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +483,0,1,0,0,1 +483,0,1,1,1,1 +484,1,0,0,0x9b6cd3b812610000000026941a0f0bb5,1 +484,1,0,1,0x3255ea4c9fd0cb3426e3a54b9fc6965c,1 +484,1,0,2,0x060b700bef665c68899d44f2356a578d,1 +484,1,0,3,0x126b062023ccc3c056bf0f60a237012b,1 +484,1,0,4,0x8d186c027832965f4fcc78a3366ca95d,1 +484,1,0,5,0xedbb410cbef3f26d6be5d581c11d3610,1 +484,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +484,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +484,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +484,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +484,0,1,0,0,1 +484,0,1,1,1,1 +485,1,0,0,0x883ae39f50bf0100000000e7561c26fc,1 +485,1,0,1,0x82a52baa51c71ca877162f93c4ae0186,1 +485,1,0,2,0x9f6adfe8d5eb5b2c24d7aa7934b6cf29,1 +485,1,0,3,0xc93ea76cd313c9132bb0c8e38c96831d,1 +485,1,0,4,0xb26a9c9e40e55ee0890c944cf271756c,1 +485,1,0,5,0x906a33e66b5bd15e051593883b5e9902,1 +485,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +485,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +485,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +485,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +485,0,1,0,0,1 +485,0,1,1,1,1 +486,1,0,0,0xa1ce5d6e5ecaf28b0000000000fa7cd0,1 +486,1,0,1,0x10540f420fb4ff7401fe9fce011d0ba6,1 +486,1,0,2,0xa1af03ca91677b673ad2f33615e56174,1 +486,1,0,3,0xa1abf6da168cebfa8868f4ba273f16b7,1 +486,1,0,4,0x20aa73ffe48afa6435cd258b173d0c23,1 +486,1,0,5,0x77d69022e7d098d75caf24c8c5e06b1c,1 +486,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +486,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +486,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +486,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +486,0,1,0,0,1 +486,0,1,1,1,1 +487,1,0,0,0x8ea5f645f373f5809300000000383453,1 +487,1,0,1,0x97330012a8ee836c5494cdffd5ee8054,1 +487,1,0,2,0xfdc70602766f8eed11a6c99a71c973d5,1 +487,1,0,3,0x659355507b843da6e327a28c11893db9,1 +487,1,0,4,0x3df5349688a085b137b1eacf456a9e9e,1 +487,1,0,5,0x0f6d15ec0078ca60a7f83f2b10d21350,1 +487,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +487,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +487,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +487,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +487,0,1,0,0,1 +487,0,1,1,1,1 +488,1,0,0,0x660570d323e9f75fa734000000008792,1 +488,1,0,1,0xd65ce93eabb7d60d8d9c1bbdcb5ef305,1 +488,1,0,2,0xb516a314f2fce530d6537f6a6c49966c,1 +488,1,0,3,0x23456f63c643cf8e0dc738f7b876e675,1 +488,1,0,4,0xd39ffd033c92b6d717dd536fbc5efdf1,1 +488,1,0,5,0x967c4bd80954479ba66b0120cd16fff2,1 +488,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +488,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +488,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +488,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +488,0,1,0,0,1 +488,0,1,1,1,1 +489,1,0,0,0xd0462673154cce587dde8800000000e9,1 +489,1,0,1,0x8d35f1f45cf9c3bf46ada2de4c568c34,1 +489,1,0,2,0x3b2cbf046eac45842ecb7984d4758315,1 +489,1,0,3,0x82717bebb6492fd0a485c101e29ff0a8,1 +489,1,0,4,0x4c9b7b47a98b0f82de512bc9313aaf51,1 +489,1,0,5,0x701099cac5f76e68c8595fc1c1d99258,1 +489,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +489,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +489,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +489,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +489,0,1,0,0,1 +489,0,1,1,1,1 +490,1,0,0,0xbd90640269a7822680cedfef00000000,1 +490,1,0,1,0x0caef15a6171059ab83e7b4418d7278f,1 +490,1,0,2,0x30c87d35e636f540841f14af54e2f9ed,1 +490,1,0,3,0xd79d0312cfa1ab656c3fb15bfde48dcf,1 +490,1,0,4,0x47c15a5a82d24b75c85a692bd6ecafeb,1 +490,1,0,5,0x71409ede23efd08e0db9abf6340677ed,1 +490,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +490,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +490,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +490,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +490,0,1,0,0,1 +490,0,1,1,1,1 +491,1,0,0,0x33239a52d72f1311512e41222a000000,1 +491,1,0,1,0x00d2dcceb301c54b4beae8e284788a73,1 +491,1,0,2,0x38686ff0fda2cef6bc43b58cfe6647b9,1 +491,1,0,3,0xe2e8176d168dec3c68ff262113760f52,1 +491,1,0,4,0x067ec3b651f422669601662167fa8717,1 +491,1,0,5,0xe976e2db5e6a4cf7c2ddabb3fde9d67d,1 +491,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +491,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +491,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +491,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +491,0,1,0,0,1 +491,0,1,1,1,1 +492,1,0,0,0xb8d64fbcd4a1c10f1365d4e6d95c0000,1 +492,1,0,1,0x00007ee4a21a1cbe1dc84c2d941ffaf1,1 +492,1,0,2,0x44a3e23bf314f2b344fc25c7f2de8b6a,1 +492,1,0,3,0xf3e17d27f5ee844b225985ab6e2775cf,1 +492,1,0,4,0x2d48e223205e98041ddc87be532abed5,1 +492,1,0,5,0x84f0411f5729500493c9cc3f4dd15e86,1 +492,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +492,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +492,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +492,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +492,0,1,0,0,1 +492,0,1,1,1,1 +493,1,0,0,0x01603d3982bf77d7a3fef3183ed09200,1 +493,1,0,1,0x0000003a227420db4088b20fe0e9d84a,1 +493,1,0,2,0x2ded5b7ec8e90e7bf11f967a3d95110c,1 +493,1,0,3,0x41b99db3b5aa8d330eb9d638781688e9,1 +493,1,0,4,0x7d5792c53628155e1bfc46fb1a67e308,1 +493,1,0,5,0x8de049c328ae1f44ec69238a009808f9,1 +493,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +493,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +493,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +493,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +493,0,1,0,0,1 +493,0,1,1,1,1 +494,1,0,0,0x9ea6994f1e0384c8599aa02e6cf66d9c,1 +494,1,0,1,0x000000004d89ef50b7e9eb0cfbff7363,1 +494,1,0,2,0xbdae7bcb580bf335efd3bc3d31870f92,1 +494,1,0,3,0x3eaccafcd40ec2f605976f15137d8b8f,1 +494,1,0,4,0xf6dfa12f19e525270b0106eecfe25749,1 +494,1,0,5,0x9f373a4fb318994f24838122ce7ec3c7,1 +494,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +494,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +494,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +494,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +494,0,1,0,0,1 +494,0,1,1,1,1 +495,1,0,0,0xd03215a8401bcf16693979371a01068a,1 +495,1,0,1,0x4700000000e2fa5bf692bc670905b18c,1 +495,1,0,2,0x50f9c4f0cd6940e162720957ffff5137,1 +495,1,0,3,0x99209b78596956d21ece251c2401f1c6,1 +495,1,0,4,0xd7033a0a787d338e889defaaabb106b9,1 +495,1,0,5,0x5a4355e411a59c32aa5167dfab244726,1 +495,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +495,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +495,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +495,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +495,0,1,0,0,1 +495,0,1,1,1,1 +496,1,0,0,0x307bfaaffb650c889c84bf83f0300e5d,1 +496,1,0,1,0xc87e000000008408fd5f64b582e3bb14,1 +496,1,0,2,0xf612820687604fa01906066a378d6754,1 +496,1,0,3,0x0982e29575d019aabe90924ead5c860d,1 +496,1,0,4,0x3f9367702dd7dd4f75ea98afd20e328a,1 +496,1,0,5,0x1a99f4857b316525328230ce294b0fef,1 +496,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +496,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +496,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +496,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +496,0,1,0,0,1 +496,0,1,1,1,1 +497,1,0,0,0xbab5c4f4df540d7b33324d36bb0c1575,1 +497,1,0,1,0x51527c00000000e4af574bb4d54ea6b8,1 +497,1,0,2,0x9505e407657d6e8bc93db5da7aa6f508,1 +497,1,0,3,0x1f61980c1949f56b0f2f507da5782a7a,1 +497,1,0,4,0xc60d31904e3669738ffbeccab6c3656c,1 +497,1,0,5,0x08e0ed5cb92b3cfa5e7f71784f9c5021,1 +497,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +497,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +497,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +497,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +497,0,1,0,0,1 +497,0,1,1,1,1 +498,1,0,0,0xd4ba47f6ae28f274e4f58d8036f9c36e,1 +498,1,0,1,0xc2456f5b00000000c3b869197ef5e15e,1 +498,1,0,2,0xbbd16fbbb656b6d0d83e6a7787cd691b,1 +498,1,0,3,0x08735aed371732723e1c68a40404517d,1 +498,1,0,4,0x9d8e35dba96028b7787d91315be67587,1 +498,1,0,5,0x7d2d097be5e8ee34560e3e7fd25c0f00,1 +498,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +498,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +498,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +498,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +498,0,1,0,0,1 +498,0,1,1,1,1 +499,1,0,0,0x79fd19c7235ea212f29f1fa00984342a,1 +499,1,0,1,0xfe0f10aafd00000000801e47f8c184e1,1 +499,1,0,2,0x2ec9760122db98fd06ea76848d35a6da,1 +499,1,0,3,0x442d2ceef7559a30cf57c61e92df327e,1 +499,1,0,4,0x7ab271da90859479701fccf86e462ee3,1 +499,1,0,5,0x393fb6814c27b760c4963625c0a19878,1 +499,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +499,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +499,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +499,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +499,0,1,0,0,1 +499,0,1,1,1,1 +500,1,0,0,0x8c291e8eeaa45adbaf9aba5c0583462d,1 +500,1,0,1,0x79cbeb7ac97300000000a37ea6700cda,1 +500,1,0,2,0x54e76b7683b6650baa6a7fc49b1c51ee,1 +500,1,0,3,0xd9ba9dd463221f7a4f1005a89fe00c59,1 +500,1,0,4,0x2ea076886c773eb937ec1cc8374b7915,1 +500,1,0,5,0xcfd11b1c1ae1166152f2f7806a31c8fd,1 +500,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +500,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +500,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +500,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +500,0,1,0,0,1 +500,0,1,1,1,1 +501,1,0,0,0x0eaae8641084fa979803efbfb8140732,1 +501,1,0,1,0xf4cdcf66c3f78a000000003c278a6b21,1 +501,1,0,2,0x5291deaf24659ffbbce6e3c26f602109,1 +501,1,0,3,0x7a74abdbb69be4fb10419c0c496c9466,1 +501,1,0,4,0x65d6fcf336d27cc7cdb982bb4e4ecef5,1 +501,1,0,5,0x827f84742f29f10abf83469270a03dc3,1 +501,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +501,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +501,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +501,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +501,0,1,0,0,1 +501,0,1,1,1,1 +502,1,0,0,0xe02716d01fb23a5a0068399bf01bab42,1 +502,1,0,1,0xef17c6d96e13846c00000000afc0f89d,1 +502,1,0,2,0x207a3241812d75d947419dc58efb05e8,1 +502,1,0,3,0x003b33fc17eb50f9d15166a88479f107,1 +502,1,0,4,0xcdee749f2e492b213ce80b32d0574f62,1 +502,1,0,5,0xf1c5d70793cf55e382d5caadf7592767,1 +502,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +502,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +502,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +502,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +502,0,1,0,0,1 +502,0,1,1,1,1 +503,1,0,0,0x9eb0bf583a1a6b9a194e9a16bc7dab2a,1 +503,1,0,1,0x9061768af89d00659a00000000fc7de1,1 +503,1,0,2,0x6554e49f82a855204328ac94913bf01b,1 +503,1,0,3,0xbe84437a355a0a37c0dee3cf81aa7728,1 +503,1,0,4,0xaea00de2507ddaf5c94e1e126980d3df,1 +503,1,0,5,0x16250a2eaebc8be486effe7f22b4f929,1 +503,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +503,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +503,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +503,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +503,0,1,0,0,1 +503,0,1,1,1,1 +504,1,0,0,0x62aac98818b3b84a2c214f0d5e72ef28,1 +504,1,0,1,0x6e1030cb53d9a82b690e00000000cd15,1 +504,1,0,2,0xa54c5062648339d2bff06f71c88216c2,1 +504,1,0,3,0x6c6e19b4d80a8c602990ac82707efdfc,1 +504,1,0,4,0xe99bbe7fcfafae3e69fd016777517aa0,1 +504,1,0,5,0x1056317f467ad09aff09be73c9731b0d,1 +504,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +504,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +504,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +504,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +504,0,1,0,0,1 +504,0,1,1,1,1 +505,1,0,0,0x3760a7f37cf96218f29ae43732e513ef,1 +505,1,0,1,0xd2b6f552ea4b6895464b9300000000c8,1 +505,1,0,2,0x975bd7157a8d363b309f1f444012b1a1,1 +505,1,0,3,0xd23096593133e71b4ca8b059cff37eaf,1 +505,1,0,4,0x7faa7a28b1c822baa241793f2abc930b,1 +505,1,0,5,0xd4c69840fe090f2aacc46786bf919622,1 +505,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +505,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +505,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +505,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +505,0,1,0,0,1 +505,0,1,1,1,1 +506,1,0,0,0x0da0a1d2851d33023834f2098c088009,1 +506,1,0,1,0x6b4320bea836cd9cbb6ff6c800000000,1 +506,1,0,2,0x5694a6f84b8f875c276afd2ebcfe4d61,1 +506,1,0,3,0xde9ec90305afb1357b95b3e0da43885e,1 +506,1,0,4,0x0dffad9ffd0b757d8051dec02ebdf70d,1 +506,1,0,5,0x8ee2dc5c7870c0823b6ccc7c679cbaa4,1 +506,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +506,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +506,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +506,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +506,0,1,0,0,1 +506,0,1,1,1,1 +507,1,0,0,0xffffffff293886d3086fd567aafd598f,1 +507,1,0,1,0x0fe975f735887194a764a231e82d289a,1 +507,1,0,2,0xa0c30e8026fdb2b4b4968a27d16a6d08,1 +507,1,0,3,0xf7098f1a98d21620d7454ba9790f1ba6,1 +507,1,0,4,0x5e470453a8a399f15baf463f9deceb53,1 +507,1,0,5,0xacc5ca64459149688bd2760c65424339,1 +507,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +507,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +507,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +507,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +507,0,1,0,0,1 +507,0,1,1,1,1 +508,1,0,0,0x7bffffffff2376d1e3c03445a072e243,1 +508,1,0,1,0x26acdc4ce127ec2e0e8d9ca99527e7b7,1 +508,1,0,2,0x614ea84acf736527dd73602cd4bb4eea,1 +508,1,0,3,0x1dfebebd5ad8aca52aa0228cf7b99a88,1 +508,1,0,4,0x737cc85f5f2d2f60d1b8183f3ed490e4,1 +508,1,0,5,0xde14368e96a9482c2a4dd193195c902f,1 +508,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +508,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +508,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +508,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +508,0,1,0,0,1 +508,0,1,1,1,1 +509,1,0,0,0xa2b5ffffffffebb251b085377605a224,1 +509,1,0,1,0xbc80872602a6e467fd016807e97fa395,1 +509,1,0,2,0xbead6734ebe44b810d3fb2ea00b17329,1 +509,1,0,3,0x45377338febfd439a8d74dfbd0f942fa,1 +509,1,0,4,0x6bb18eae36616a7d3cad35919fd21a8a,1 +509,1,0,5,0xf4bbe7a10f73b3e036a46b103ef56e2a,1 +509,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +509,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +509,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +509,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +509,0,1,0,0,1 +509,0,1,1,1,1 +510,1,0,0,0x641227ffffffff6f1b96fa5f097fcf3c,1 +510,1,0,1,0xc1a3c256870d45a67b83d0967d4b20c0,1 +510,1,0,2,0x499625479e161dacd4db9d9ce64854c9,1 +510,1,0,3,0x8d922cbf212703e9654fae182df9bad2,1 +510,1,0,4,0x42c177cf37b8193a0131108d97819edd,1 +510,1,0,5,0x9439936028864ac195b64fca76d9d693,1 +510,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +510,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +510,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +510,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +510,0,1,0,0,1 +510,0,1,1,1,1 +511,1,0,0,0x958415d8ffffffffabad03e2fc662dc3,1 +511,1,0,1,0xba203521177502298df56f36600e0f8b,1 +511,1,0,2,0x08f16b8093a8fb4d66a2c8065b541b3d,1 +511,1,0,3,0x31e3bfe694f6b89c50fb1aaa6ff6c9b2,1 +511,1,0,4,0x9d6455e2d5d1779748573b611cb95d4a,1 +511,1,0,5,0x21f967410399b39b535ba3e5af81ca2e,1 +511,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +511,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +511,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +511,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +511,0,1,0,0,1 +511,0,1,1,1,1 +512,1,0,0,0xf1d8de4858ffffffff1281093536f47f,1 +512,1,0,1,0xe13deb04e1fbe8fb954521b6975420f8,1 +512,1,0,2,0xbe26231b6191658a19dd72ddb99ed8f8,1 +512,1,0,3,0xc579b6938d19bce8eed8dc2b338cb5f8,1 +512,1,0,4,0xe1d9a32ee56cffed37f0f22b2dcb57d5,1 +512,1,0,5,0xc943c14f79694a03b9c5e96952575c89,1 +512,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +512,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +512,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +512,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +512,0,1,0,0,1 +512,0,1,1,1,1 +513,1,0,0,0x0927895f2802ffffffff10782dd14a3b,1 +513,1,0,1,0x32dc5d47c05ef6f1876b95c81fc31def,1 +513,1,0,2,0x15e76880898316b16204ac920a02d580,1 +513,1,0,3,0x45f36a229d4aa4f812638c455abe0443,1 +513,1,0,4,0xe74d357d3fcb5c8c5337bd6aba4178b4,1 +513,1,0,5,0x55ca10e226e13f9638196506a1939123,1 +513,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +513,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +513,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +513,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +513,0,1,0,0,1 +513,0,1,1,1,1 +514,1,0,0,0x60907984aa7e8effffffff4f332862a1,1 +514,1,0,1,0x0a57c3063fb5a30624cf6a0c3ac80589,1 +514,1,0,2,0x352ecb53f8df2c503a45f9846fc28d1d,1 +514,1,0,3,0x31e6307d3ddbffc1132315cc07f16dad,1 +514,1,0,4,0x1348dfa9c482c558e1d05c5242ca1c39,1 +514,1,0,5,0x436726ecd28258b1899792887dd0a3c6,1 +514,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +514,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +514,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +514,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +514,0,1,0,0,1 +514,0,1,1,1,1 +515,1,0,0,0xc6ff198484939170ffffffff0af42cda,1 +515,1,0,1,0x50f9a5f50636ea6942d6b9b8cd6ae1e2,1 +515,1,0,2,0x4a40801a7e606ba78a0da9882ab23c76,1 +515,1,0,3,0x77b8642349ed3d652c5bfa5f2a9558fb,1 +515,1,0,4,0x3a49b64848d682ef7f605f2832f7384b,1 +515,1,0,5,0xdc24ed2925825bf8ea77dc5981725782,1 +515,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +515,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +515,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +515,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +515,0,1,0,0,1 +515,0,1,1,1,1 +516,1,0,0,0xde030419345ca15c75ffffffff807479,1 +516,1,0,1,0x9b9e0956cc43135d16dfbe4d27d7e68d,1 +516,1,0,2,0xeacc5e1a8304a74d2be412b078924b3b,1 +516,1,0,3,0xb3511bac855c05c9e5e9e44df3d61e96,1 +516,1,0,4,0x7451cd8e18d6ed1885dd827714847f96,1 +516,1,0,5,0xec4bb0ed4c36ce9808db8f714204f6d1,1 +516,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +516,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +516,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +516,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +516,0,1,0,0,1 +516,0,1,1,1,1 +517,1,0,0,0x6f0e3eeaf42b28132b88fffffffff6c8,1 +517,1,0,1,0x665604d34acb19037e1ab78caaaac6ff,1 +517,1,0,2,0x2f7a5e9e5771d424f30f67fdab61e8ce,1 +517,1,0,3,0x4f8cd1214882adb65f7de94c31577052,1 +517,1,0,4,0xac4e69808345809b44acb0b2bd889175,1 +517,1,0,5,0xfb75dd050c5a449ab9528f8f78daa10c,1 +517,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +517,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +517,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +517,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +517,0,1,0,0,1 +517,0,1,1,1,1 +518,1,0,0,0xcdb549f773b3e62b3708d1ffffffffbe,1 +518,1,0,1,0x48f7c0591ddcae7d2cb222d1f8017ab9,1 +518,1,0,2,0xffcda40f792ce4d93e7e0f0e95e1a214,1 +518,1,0,3,0x7dddd7f6487621c30a03d710b3300219,1 +518,1,0,4,0x79938b55f8a17f7ed7ba9ade8f2065a1,1 +518,1,0,5,0xfa77618f0b67add8d58c422c2453a49a,1 +518,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +518,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +518,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +518,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +518,0,1,0,0,1 +518,0,1,1,1,1 +519,1,0,0,0x2c3f26f96a3ac0051df4989bffffffff,1 +519,1,0,1,0x9fd64886c1dc4f9924d8fd6f0edb0484,1 +519,1,0,2,0x81f2359c4faba6b53d3e8c8c3fcc16a9,1 +519,1,0,3,0x48350f7ab3a588b28c17603a431e39a8,1 +519,1,0,4,0xcd6f6a5cc3b55ead0ff695d06c6860b5,1 +519,1,0,5,0x09e46d99fccefb9f7f9e101857f74300,1 +519,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +519,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +519,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +519,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +519,0,1,0,0,1 +519,0,1,1,1,1 +520,1,0,0,0xac18f8418c55a2502cb7d53f9affffff,1 +520,1,0,1,0xff5c31d89fda6a6b8476397c04edf411,1 +520,1,0,2,0xdfc8bf520445cbb8ee1596fb073ea283,1 +520,1,0,3,0xea130251a6fdffa5c3f5f2aaf75ca808,1 +520,1,0,4,0x048e33efce147c9dd92823640e338e68,1 +520,1,0,5,0xbfd7d0dc7a4905b3a7ac711e577e90e7,1 +520,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +520,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +520,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +520,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +520,0,1,0,0,1 +520,0,1,1,1,1 +521,1,0,0,0x4f9618f98e2d3a15b24094f72bb5ffff,1 +521,1,0,1,0xffffa2fd3e2893683e5a6ab8cf0ee610,1 +521,1,0,2,0xad019f74c6941d20efda70b46c53db16,1 +521,1,0,3,0x6503a0e393e932f688227688ba6a5762,1 +521,1,0,4,0x93320eb7ca0710255346bdbb3102cdcf,1 +521,1,0,5,0x7964ef2e0988e712bc05efe16c199345,1 +521,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +521,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +521,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +521,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +521,0,1,0,0,1 +521,0,1,1,1,1 +522,1,0,0,0x422e82a3d56ed10a9cc21d31d37a25ff,1 +522,1,0,1,0xffffff67edf7c40204caae73ab0bc75a,1 +522,1,0,2,0xac8096842e8add68c34e78ce11dd71e4,1 +522,1,0,3,0xb54316bd3ebf7fffdeb7bd5a3ebc1883,1 +522,1,0,4,0xf5ca2f4f23d674502d4caf85d187215d,1 +522,1,0,5,0x36e3ce9f0ce219709f21a3aac003b7a8,1 +522,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +522,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +522,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +522,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +522,0,1,0,0,1 +522,0,1,1,1,1 +523,1,0,0,0x7075d245ccc3281b6e7b329ff738fbb4,1 +523,1,0,1,0x17a5ffffffffa0842d9890b5cf95d018,1 +523,1,0,2,0x677b2d3a59b18a5ff939b70ea0022508,1 +523,1,0,3,0x89ddcd7b7b9d776854b4943693fb92f7,1 +523,1,0,4,0x6b4ba856ade7677bf30307b21f3ccda3,1 +523,1,0,5,0x5d2f63aee81efd0bab6972cc0795db55,1 +523,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +523,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +523,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +523,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +523,0,1,0,0,1 +523,0,1,1,1,1 +524,1,0,0,0x3c80de54cd9226989443d593fa4fd659,1 +524,1,0,1,0x7e280ebeffffffffc1847eb76c217a95,1 +524,1,0,2,0x479e1ded14bcaed0379ba8e1b73d3115,1 +524,1,0,3,0xd84d31d4b7c30e1f05e1fc0d5957cfb0,1 +524,1,0,4,0x918f79e35b3d89487cf634a4f05b2e0c,1 +524,1,0,5,0x30857ca879f97c771e877027355b2443,1 +524,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +524,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +524,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +524,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +524,0,1,0,0,1 +524,0,1,1,1,1 +525,1,0,0,0xde21754e29b85601980bef3d697ea277,1 +525,1,0,1,0x0ce891a8cdffffffffc7906aa794b39b,1 +525,1,0,2,0x43dfccd0edb9e280d9a58f01164d55c3,1 +525,1,0,3,0xd711e14b12ac5cf3b64840ead512a0a3,1 +525,1,0,4,0x1dbe33fa8ba84533cd5c4934365b3442,1 +525,1,0,5,0xca1174899b78ef9a3199f49584389772,1 +525,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +525,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +525,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +525,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +525,0,1,0,0,1 +525,0,1,1,1,1 +526,1,0,0,0x8f65d92927cfb86a84dd59623fb531bb,1 +526,1,0,1,0x599e4d5f7289ffffffff2f1f2f57881c,1 +526,1,0,2,0x5b09ab637bd4caf0f4c7c7e4bca592fe,1 +526,1,0,3,0xa20e9087c259d26a38bb4085f0bbff11,1 +526,1,0,4,0x45b7eb467b6748af618e9d80d6fdcd6a,1 +526,1,0,5,0xa24964e5a13f885bca8101de08eb0d75,1 +526,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +526,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +526,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +526,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +526,0,1,0,0,1 +526,0,1,1,1,1 +527,1,0,0,0x6b63e9a74e092120160bea3877dace8a,1 +527,1,0,1,0x2cc7cd0e8426cbfffffffffafc8c3ca8,1 +527,1,0,2,0x5e9b1c5a028070df5728c5c8af9b74e0,1 +527,1,0,3,0x667afa570a6cfa0114a5039ed15ee06f,1 +527,1,0,4,0xb1360907e2d9785ead362bb8d7bd661b,1 +527,1,0,5,0x6c29eeffd3c5037744edaeb9ad990c20,1 +527,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +527,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +527,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +527,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +527,0,1,0,0,1 +527,0,1,1,1,1 +528,1,0,0,0xfc28259702a03845b6d75219444e8b43,1 +528,1,0,1,0xd094586e249c8699ffffffffe852512e,1 +528,1,0,2,0x0671a0a85c2b72d54a2fb0990e34538b,1 +528,1,0,3,0x4890050f5a5712f6d1a7a5fb8578f32e,1 +528,1,0,4,0xdb1846bab6b7361479ab9c3285ca4129,1 +528,1,0,5,0x1808f27fd5bd4fdac720e5854713694c,1 +528,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +528,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +528,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +528,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +528,0,1,0,0,1 +528,0,1,1,1,1 +529,1,0,0,0x1273b4502ea4e3bccee044ee8e8db7f7,1 +529,1,0,1,0x74ecbcd52e8ceb571757ffffffffe20a,1 +529,1,0,2,0x7673f8526748446477dbbb0590a45492,1 +529,1,0,3,0xc5d7d69859d301abbaedb35b2095103a,1 +529,1,0,4,0x3dc70ddf9c6b524d886bed9e6af02e0e,1 +529,1,0,5,0x4dec0d417a414fed3807ef4422913d7c,1 +529,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +529,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +529,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +529,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +529,0,1,0,0,1 +529,0,1,1,1,1 +530,1,0,0,0x08fb565610a79baa0c566c66228d8181,1 +530,1,0,1,0x4f8c53a15b96e602fb49ffffffffff6e,1 +530,1,0,2,0x7f085441070ecd2bb21285089ebb1aa6,1 +530,1,0,3,0x450d1a06c36d3ff39dfd657a796d12b5,1 +530,1,0,4,0x249712012029870a2459d18d47da9aa4,1 +530,1,0,5,0x92a5e6cb4b2d8dafa9e4c5c54a2b9a8b,1 +530,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +530,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +530,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +530,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +530,0,1,0,0,1 +530,0,1,1,1,1 +531,1,0,0,0xd59291cc2cf89f3087715fcb1aa4e79a,1 +531,1,0,1,0xa2403f748e97d7cd28ecaefeffffffff,1 +531,1,0,2,0x914c67fb61dd1e27c867398ea7322d5a,1 +531,1,0,3,0xb76df04bc5aa6683a8e0f30a5d287348,1 +531,1,0,4,0xfa07474031481dda4953e3ac1959ee8c,1 +531,1,0,5,0xea7e66ec412b38d6c96d28f6d37304ea,1 +531,1,0,6,0x2927b10512bae3eddcfe467828128bad,1 +531,1,0,7,0x2903269919f7086069c8c4df6c732838,1 +531,1,0,8,0xc7787964eaac00e5921fb1498a60f460,1 +531,1,0,9,0x6766b3d9685001558d1a974e7341513e,1 +531,0,1,0,0,1 +531,0,1,1,1,1 +532,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +532,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +532,1,0,2,0x00000000000000000000000000000000,1 +532,1,0,3,0x4319055358e8617b0c46353d039cdaab,1 +532,1,0,4,0xffffffff00000000ffffffffffffffff,1 +532,1,0,5,0xbce6faada7179e84f3b9cac2fc63254e,1 +532,1,0,6,0xd705d16f80987e2d9b1a6957d29ce22f,1 +532,1,0,7,0xebf7d10fa515153182415c8361baaca4,1 +532,1,0,8,0xb1fc105ee5ce80d514ec1238beae2037,1 +532,1,0,9,0xa6f83625593620d460819e8682160926,1 +532,0,1,0,0,1 +532,0,1,1,1,1 +533,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +533,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +533,1,0,2,0xffffffff00000000ffffffffffffffff,1 +533,1,0,3,0xbce6faada7179e84f3b9cac2fc63254f,1 +533,1,0,4,0xffffffff00000000ffffffffffffffff,1 +533,1,0,5,0xbce6faada7179e84f3b9cac2fc63254e,1 +533,1,0,6,0x3cd8d2f81d6953b0844c09d7b560d527,1 +533,1,0,7,0xcd2ef67056893eadafa52c8501387d59,1 +533,1,0,8,0xee41fdb4d10402ce7a0c5e3b747adfa3,1 +533,1,0,9,0xa490b62a6b7719068903485c0bb6dc2d,1 +533,0,1,0,0,1 +533,0,1,1,1,1 +534,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +534,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +534,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +534,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +534,1,0,4,0x909135bdb6799286170f5ead2de4f651,1 +534,1,0,5,0x1453fe50914f3df2de54a36383df8dd4,1 +534,1,0,6,0x8240cd81edd91cb6936133508c391510,1 +534,1,0,7,0x0e81f332c4545d41189b481196851378,1 +534,1,0,8,0xe05b06e72d4a1bff80ea5db514aa2f93,1 +534,1,0,9,0xea6dd6d9c0ae27b7837dc432f9ce89d9,1 +534,0,1,0,0,1 +534,0,1,1,1,1 +535,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +535,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +535,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +535,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +535,1,0,4,0x27b4577ca009376f71303fd5dd227dce,1 +535,1,0,5,0xf5deb773ad5f5a84360644669ca249a5,1 +535,1,0,6,0xb062947356748b0fc17f1704c65aa1dc,1 +535,1,0,7,0xa6e1bfe6779756fa616d91eaad13df2c,1 +535,1,0,8,0x0b38c17f3d0672e7409cfc5992a99fff,1 +535,1,0,9,0x12b84a4f8432293b431113f1b2fb579d,1 +535,0,1,0,0,1 +535,0,1,1,1,1 +536,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +536,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +536,1,0,2,0x00000000000000000000000000000000,1 +536,1,0,3,0x00000000000000000000000000000005,1 +536,1,0,4,0x00000000000000000000000000000000,1 +536,1,0,5,0x00000000000000000000000000000001,1 +536,1,0,6,0x4a03ef9f92eb268cafa601072489a563,1 +536,1,0,7,0x80fa0dc43171d7712813b3a19a1eb5e5,1 +536,1,0,8,0x3e213e28a608ce9a2f4a17fd830c6654,1 +536,1,0,9,0x018a79b3e0263d91a8ba90622df6f2f0,1 +536,0,1,0,0,1 +536,0,1,1,1,1 +537,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +537,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +537,1,0,2,0x00000000000000000000000000000000,1 +537,1,0,3,0x00000000000000000000000000000005,1 +537,1,0,4,0x00000000000000000000000000000000,1 +537,1,0,5,0x00000000000000000000000000000003,1 +537,1,0,6,0x091194c1cba17f34e286b4833701606a,1 +537,1,0,7,0x41cef26177ada8850b601ea1f859e701,1 +537,1,0,8,0x27242fcec708828758403ce2fe501983,1 +537,1,0,9,0xa7984e6209f4d6b95db9ad77767f55eb,1 +537,0,1,0,0,1 +537,0,1,1,1,1 +538,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +538,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +538,1,0,2,0x00000000000000000000000000000000,1 +538,1,0,3,0x00000000000000000000000000000005,1 +538,1,0,4,0x00000000000000000000000000000000,1 +538,1,0,5,0x00000000000000000000000000000005,1 +538,1,0,6,0x103c6ecceff59e71ea8f56fee3a4b2b1,1 +538,1,0,7,0x48e81c2bdbdd39c195812c96dcfb41a7,1 +538,1,0,8,0x2303a193dc591be150b883d770ec51eb,1 +538,1,0,9,0xb4ebce8b09042c2ecb16c448d8e57bf5,1 +538,0,1,0,0,1 +538,0,1,1,1,1 +539,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +539,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +539,1,0,2,0x00000000000000000000000000000000,1 +539,1,0,3,0x00000000000000000000000000000005,1 +539,1,0,4,0x00000000000000000000000000000000,1 +539,1,0,5,0x00000000000000000000000000000006,1 +539,1,0,6,0x3b66b829fe604638bcb2bfe8c22228be,1 +539,1,0,7,0x67390c20111bd2b451468927e87fb6ea,1 +539,1,0,8,0xbc8e59c009361758b274ba2cad36b58f,1 +539,1,0,9,0xde485a3ed09dade76712fa9e9c4ac212,1 +539,0,1,0,0,1 +539,0,1,1,1,1 +540,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +540,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +540,1,0,2,0x00000000000000000000000000000000,1 +540,1,0,3,0x00000000000000000000000000000100,1 +540,1,0,4,0x8f1e3c7862c58b16bb76eddbb76eddbb,1 +540,1,0,5,0x516af4f63f2d74d76e0d28c9bb75ea88,1 +540,1,0,6,0x84b959080bb30859cd53c2fb973cf14d,1 +540,1,0,7,0x60cdaa8ee00587889b5bc657ac588175,1 +540,1,0,8,0xa02ce5c1e53cb196113c78b4cb8dc7d3,1 +540,1,0,9,0x60e5ea7850b0f6650b0c45af2c3cd7ca,1 +540,0,1,0,0,1 +540,0,1,1,1,1 +541,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +541,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +541,1,0,2,0x00000000000000000000000000000000,1 +541,1,0,3,0x0000000000000000002d9b4d347952d6,1 +541,1,0,4,0xef3043e7329581dbb3974497710ab115,1 +541,1,0,5,0x05ee1c87ff907beebadd195a0ffe6d7a,1 +541,1,0,6,0xdf4083bd6ecbda5a77ae578e5d835fa7,1 +541,1,0,7,0xf74a07ebb91e0570e1ff32a563354e99,1 +541,1,0,8,0x25af80b09a167d9ef647df28e2d9acd0,1 +541,1,0,9,0xd4bc4f2deec5723818edaf9071e311f8,1 +541,0,1,0,0,1 +541,0,1,1,1,1 +542,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +542,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +542,1,0,2,0x00000000000000000000000000000000,1 +542,1,0,3,0x0000001033e67e37b32b445580bf4eff,1 +542,1,0,4,0x8b748b74000000008b748b748b748b74,1 +542,1,0,5,0x66e769ad4a16d3dcd87129b8e91d1b4d,1 +542,1,0,6,0xc2569a3c9bf8c1838ca821f7ba6f000c,1 +542,1,0,7,0xc8679d278f3736b414a34a7c956a0377,1 +542,1,0,8,0x0387ea85bc4f28804b4a91c9b7d65bc6,1 +542,1,0,9,0x434c975806795ab7d441a4e9683aeb09,1 +542,0,1,0,0,1 +542,0,1,1,1,1 +543,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +543,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +543,1,0,2,0x00000000000000000000000000000000,1 +543,1,0,3,0x00000000000000000000000000000100,1 +543,1,0,4,0xef9f6ba4d97c09d03178fa20b4aaad83,1 +543,1,0,5,0xbe3cf9cb824a879fec3270fc4b81ef5b,1 +543,1,0,6,0x4a9f7da2a6c359a16540c271774a6bf1,1 +543,1,0,7,0xc586357c978256f44a6496d80670968a,1 +543,1,0,8,0xc496e73a44563f8d56fbd7bb9e4e3ae3,1 +543,1,0,9,0x04c86f2c508eb777b03924755beb40d4,1 +543,0,1,0,0,1 +543,0,1,1,1,1 +544,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +544,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +544,1,0,2,0x00000000000000000000000000000000,1 +544,1,0,3,0x000000062522bbd3ecbe7c39e93e7c25,1 +544,1,0,4,0xef9f6ba4d97c09d03178fa20b4aaad83,1 +544,1,0,5,0xbe3cf9cb824a879fec3270fc4b81ef5b,1 +544,1,0,6,0x874146432b3cd2c9e26204c0a3413699,1 +544,1,0,7,0x6067d466dde4917a8ff23a8e95ca106b,1 +544,1,0,8,0x709b3d50976ef8b385a813bc35f3a207,1 +544,1,0,9,0x10bdc6edd465e6f43ac4866703a6608c,1 +544,0,1,0,0,1 +544,0,1,1,1,1 +545,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +545,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +545,1,0,2,0xffffffff00000000ffffffffffffffff,1 +545,1,0,3,0xbce6faada7179e84f3b9cac2fc6324d5,1 +545,1,0,4,0x55555555000000005555555555555555,1 +545,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +545,1,0,6,0x7a736d8e326a9ca62bbe25a34ea4e363,1 +545,1,0,7,0x3b499a96afa7aaa3fcf3fd88f8e07ede,1 +545,1,0,8,0xb3e45879d8622b93e818443a686e869e,1 +545,1,0,9,0xeda7bf9ae46aa3eafcc48a5934864627,1 +545,0,1,0,0,1 +545,0,1,1,1,1 +546,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +546,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +546,1,0,2,0x55555555000000005555555555555555,1 +546,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +546,1,0,4,0x00000000000000000000000000000000,1 +546,1,0,5,0x00000000000000000000000000000001,1 +546,1,0,6,0xe84d9b232e971a43382630f99725e423,1 +546,1,0,7,0xec1ecb41e55172e9c69748a03f0d5988,1 +546,1,0,8,0x618b15b427ad83363bd041ff75fac98e,1 +546,1,0,9,0xf2ee923714e7d1dfe31753793c7588d4,1 +546,0,1,0,0,1 +546,0,1,1,1,1 +547,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +547,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +547,1,0,2,0x7fffffff800000007fffffffffffffff,1 +547,1,0,3,0xde737d56d38bcf4279dce5617e3192a8,1 +547,1,0,4,0x55555555000000005555555555555555,1 +547,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +547,1,0,6,0x0203736fcb198b15d8d7a0c80f66dddd,1 +547,1,0,7,0x15259240aa78d08aae67c467de045034,1 +547,1,0,8,0x34383438d5041ea9a387ee8e4d4e84b4,1 +547,1,0,9,0x471b160c6bcf2568b072f8f20e87a996,1 +547,0,1,0,0,1 +547,0,1,1,0,1 +548,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +548,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +548,1,0,2,0x7fffffff800000007fffffffffffffff,1 +548,1,0,3,0xde737d56d38bcf4279dce5617e3192a9,1 +548,1,0,4,0x7fffffff800000007fffffffffffffff,1 +548,1,0,5,0xde737d56d38bcf4279dce5617e3192a8,1 +548,1,0,6,0x78d844dc7f16b73b1f2a39730da5d8cd,1 +548,1,0,7,0x99fe2e70a18482384e37dcd2bfea02e1,1 +548,1,0,8,0xed6572e01eb7a8d113d02c666c45ef22,1 +548,1,0,9,0xd3b9a6a6dea99aa43a8183c26e75d336,1 +548,0,1,0,0,1 +548,0,1,1,1,1 +549,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +549,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +549,1,0,2,0x7fffffff800000007fffffffffffffff,1 +549,1,0,3,0xde737d56d38bcf4279dce5617e3192a9,1 +549,1,0,4,0x7fffffff800000007fffffffffffffff,1 +549,1,0,5,0xde737d56d38bcf4279dce5617e3192a9,1 +549,1,0,6,0xdec6c8257dde94110eacc8c09d2e5789,1 +549,1,0,7,0xcc5beb81a958b02b4d62da9599a74014,1 +549,1,0,8,0x66fae1614174be63970b83f652442106,1 +549,1,0,9,0x7b06dd6f4e9c56baca4e344fdd690f1d,1 +549,0,1,0,0,1 +549,0,1,1,1,1 +550,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +550,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +550,1,0,2,0x55555555000000005555555555555555,1 +550,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +550,1,0,4,0x532eaabd9574880dbf76b9b8cc00832c,1 +550,1,0,5,0x20a6ec113d682299550d7a6e0f345e25,1 +550,1,0,6,0xa17f5b75a35ed64623ca5cbf1f919512,1 +550,1,0,7,0x92db0c23f0c2ea24c3d0cad0988cabc0,1 +550,1,0,8,0x83a7a618625c228940730b4fa3ee64fa,1 +550,1,0,9,0xecbb2fc20fdde7c58b3a3f6300424dc6,1 +550,0,1,0,0,1 +550,0,1,1,1,1 +551,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +551,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +551,1,0,2,0x55555555000000005555555555555555,1 +551,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +551,1,0,4,0xacd155416a8b77f34089464733ff7cd3,1 +551,1,0,5,0x9c400e9c69af7beb9eac5054ed2ec72c,1 +551,1,0,6,0x04ba0cba291a37db13f33bf90dab628c,1 +551,1,0,7,0x04ec8393a0200419e9eaa1ebcc9fb5c3,1 +551,1,0,8,0x1f3a0a0e6823a49b625ad57b12a32d40,1 +551,1,0,9,0x47970fc3428f0f0049ecf4265dc12f62,1 +551,0,1,0,0,1 +551,0,1,1,1,1 +552,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +552,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +552,1,0,2,0x55555555000000005555555555555555,1 +552,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +552,1,0,4,0x55555555000000005555555555555555,1 +552,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +552,1,0,6,0x692b6c828e0feed63d8aeaa2b7322f9c,1 +552,1,0,7,0xcbe8723a1ed39f229f204a434b8900ef,1 +552,1,0,8,0xa1f6f6abcb38ea3b8fde38b98c7c271f,1 +552,1,0,9,0x274af56a8c5628dc3329069ae4dd5716,1 +552,0,1,0,0,1 +552,0,1,1,1,1 +553,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +553,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +553,1,0,2,0x55555555000000005555555555555555,1 +553,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +553,1,0,4,0xaaaaaaaa00000000aaaaaaaaaaaaaaaa,1 +553,1,0,5,0x7def51c91a0fbf034d26872ca84218e1,1 +553,1,0,6,0x00cefd9162d13e64cb93687a9cd8f975,1 +553,1,0,7,0x5ebb5a3ef7632f800f84871874ccef09,1 +553,1,0,8,0x543ecbeaf7e8044ef721be2fb5f549e4,1 +553,1,0,9,0xb8480d2587404ebf7dbbef2c54bc0cb1,1 +553,0,1,0,0,1 +553,0,1,1,1,1 +554,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +554,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +554,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +554,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +554,1,0,4,0x710f8e3edc7c2d5a3fd23de844002bb9,1 +554,1,0,5,0x49d9f794f6d5405f6d97c1bb03dd2bd2,1 +554,1,0,6,0xb975183b42551cf52f291d5c1921fd5e,1 +554,1,0,7,0x12f50c8c85a4beb9de03efa3f0f24486,1 +554,1,0,8,0x2243018e6866df922dc313612020311f,1 +554,1,0,9,0xf21e242ce3fb15bc78c406b25ab43091,1 +554,0,1,0,0,1 +554,0,1,1,1,1 +555,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +555,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +555,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +555,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +555,1,0,4,0xedffbc270f722c243069a7e5f40335a6,1 +555,1,0,5,0x1a58525c7b4db2e7a8e269274ffe4e1b,1 +555,1,0,6,0xc25f1d166f3e211cdf042a26f8abf609,1 +555,1,0,7,0x4d48b8d17191d74ed717149274466999,1 +555,1,0,8,0x65d06dd6a88abfa49e8b4c5da6bb9228,1 +555,1,0,9,0x51969adf9604b5accfb52a114e77ccdb,1 +555,0,1,0,0,1 +555,0,1,1,1,1 +556,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +556,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +556,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +556,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +556,1,0,4,0xa25adcae105ed7ff4f95d2344e24ee52,1 +556,1,0,5,0x3314c3e178525d007904b68919ba4d53,1 +556,1,0,6,0x8fe5e88243a76e41a004236218a3c3a2,1 +556,1,0,7,0xd6eee398a23c3a0b008d7f0164cbc0ca,1 +556,1,0,8,0x98a20d1bdcf573513c7cfd9b83c63e3a,1 +556,1,0,9,0x82d40127c897697c86b8cb387af7f240,1 +556,0,1,0,0,1 +556,0,1,1,1,1 +557,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +557,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +557,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +557,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +557,1,0,4,0x2e4348c645707dce6760d773de3f3e87,1 +557,1,0,5,0x346924b2f64bd3dd0297e766b5805ebb,1 +557,1,0,6,0x02148256b530fbc470c7b341970b3824,1 +557,1,0,7,0x3ecee6d5a840a37beca2efb37e8dff2c,1 +557,1,0,8,0xc0adbea0882482a7489ca703a399864b,1 +557,1,0,9,0xa987eeb6ddb738af53a83573473cb30d,1 +557,0,1,0,0,1 +557,0,1,1,1,1 +558,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +558,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +558,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +558,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +558,1,0,4,0x348c673b07dce3920d773de3f3e87408,1 +558,1,0,5,0x869e916dbcf797d8f9684fb67753d1dc,1 +558,1,0,6,0xa34db012ce6eda1e9c7375c5fcf3e54e,1 +558,1,0,7,0xd698e19615124273b3a621d021c76f8e,1 +558,1,0,8,0x777458d6f55a364c221e39e1205d5510,1 +558,1,0,9,0xbb4fbb7ddf08d8d8fdde13d1d6df7f14,1 +558,0,1,0,0,1 +558,0,1,1,1,1 +559,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +559,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +559,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +559,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +559,1,0,4,0x6918ce760fb9c7241aee7bc7e7d0e811,1 +559,1,0,5,0x0d3d22db79ef2fb1f2d09f6ceea7a3b8,1 +559,1,0,6,0xb97af3fe78be15f2912b6271dd8a43ba,1 +559,1,0,7,0xdb6dd2a1b315b2ce7ae37b4e7778041d,1 +559,1,0,8,0x930d71ee1992d2466495c42102d08e81,1 +559,1,0,9,0x154c305307d1dcd52d0fa4c479b278e7,1 +559,0,1,0,0,1 +559,0,1,1,1,1 +560,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +560,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +560,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +560,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +560,1,0,4,0x73b3c694391d8eadde3f3e8740894647,1 +560,1,0,5,0x15ac20e4c126bbf6d864d648969f5b5a,1 +560,1,0,6,0x81e7198a3c3f23901cedc7a1d6eff6e9,1 +560,1,0,7,0xbf81108e6c35cd8559139af3135dbcbb,1 +560,1,0,8,0x9ef1568530291a8061b90c9f4285eefc,1 +560,1,0,9,0xba990d4570a4e3b7b737525b5d580034,1 +560,0,1,0,0,1 +560,0,1,1,1,1 +561,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +561,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +561,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +561,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +561,1,0,4,0xbb07ac7a86948c2c2989a16db1930ef1,1 +561,1,0,5,0xb89ce112595197656877e53c41457f28,1 +561,1,0,6,0xab4d792ca121d1dba39cb9de645149c2,1 +561,1,0,7,0xab573e8becc6ddff3cc9960f188ddf73,1 +561,1,0,8,0x7f90ba23664153e93262ff7335541519,1 +561,1,0,9,0x5858d7be1315a69456386de68285a3c8,1 +561,0,1,0,0,1 +561,0,1,1,1,1 +562,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +562,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +562,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +562,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +562,1,0,4,0x27e4d82cb6c061dd9337c69bf9332ed3,1 +562,1,0,5,0xd198662d6f2299443f62c861187db648,1 +562,1,0,6,0x518412b69af43aae084476a68d59bbde,1 +562,1,0,7,0x51fbfa9e5be80563f587c9c2652f88ef,1 +562,1,0,8,0x2d3b90d25baa6bdb7b0c55e5240a3a98,1 +562,1,0,9,0xfbc24afed8523edec1c70503fc10f233,1 +562,0,1,0,0,1 +562,0,1,1,1,1 +563,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +563,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +563,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +563,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +563,1,0,4,0xe7c5cf3aac2e88923b77850515fff6a1,1 +563,1,0,5,0x2d13b356dfe9ec275c3dd81ae94609a4,1 +563,1,0,6,0xa08f14a644b9a935dffea4761ebaf592,1 +563,1,0,7,0xd1f66fe6cd373aa7f5d370af34f8352d,1 +563,1,0,8,0xa54b5bc4025cf335900a914c2934ec2f,1 +563,1,0,9,0xec7a396d0a7affcad732a5741c7aaaf5,1 +563,0,1,0,0,1 +563,0,1,1,1,1 +564,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +564,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +564,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +564,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +564,1,0,4,0xc77838df91c1e953e016e10bddffea23,1 +564,1,0,5,0x17f9fee32bacfe553cede9e57a748f68,1 +564,1,0,6,0xccf2296a6a89b62b90739d38af4ae3a2,1 +564,1,0,7,0x0e9f45715b90044639241061e33f8f8c,1 +564,1,0,8,0xaace0046491eeaa1c6e9a472b96d88f4,1 +564,1,0,9,0xaf83e7ff1bb84438c7e058034412ae08,1 +564,0,1,0,0,1 +564,0,1,1,1,1 +565,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +565,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +565,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +565,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +565,1,0,4,0x8ef071c02383d2a6c02dc217bbffd446,1 +565,1,0,5,0x730d0318b0425e2586220907f885f97f,1 +565,1,0,6,0x94b0fc1525bcabf82b1f34895e5819a0,1 +565,1,0,7,0x6c02b23e04002276e165f962c86e3927,1 +565,1,0,8,0xbe7c2ab4d0b25303204fb32a1f829290,1 +565,1,0,9,0x2792225e16a6d2dbfb29fbc89a9c3376,1 +565,0,1,0,0,1 +565,0,1,1,1,1 +566,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +566,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +566,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +566,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +566,1,0,4,0x5668aaa0b545bbf9a044a32399ffbe69,1 +566,1,0,5,0xce20074e34d7bdf5cf56282a76976396,1 +566,1,0,6,0x5351f37e1de0c88c508527d89882d183,1 +566,1,0,7,0xccdcf2efca407edb0627cadfd16de6ec,1 +566,1,0,8,0x44b4b57cdf960d32ebcc4c97847eed21,1 +566,1,0,9,0x8425853b5b675eb781b766a1a1300349,1 +566,0,1,0,0,1 +566,0,1,1,1,1 +567,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +567,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +567,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +567,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +567,1,0,4,0xd12d6e56882f6c0027cae91a27127728,1 +567,1,0,5,0xf7fddf478fb4fdc2b65f40a60b0eb952,1 +567,1,0,6,0x748bbafc320e6735cb64019710a269c6,1 +567,1,0,7,0xc2b5d147bdc831325cb2fb276ac971a6,1 +567,1,0,8,0x9d655e9a755bc9d800ad21ee3fd4d980,1 +567,1,0,9,0xd93a7a49a8c5ccd37005177578f51163,1 +567,0,1,0,0,1 +567,0,1,1,1,1 +568,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +568,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +568,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +568,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +568,1,0,4,0x7fffffffaaaaaaaaffffffffffffffff,1 +568,1,0,5,0xe9a2538f37b28a2c513dee40fecbb71a,1 +568,1,0,6,0x14b3bbd75c5e1c0c36535a934d4ab851,1 +568,1,0,7,0x12410b3b90fa97a31c33038964fd85cc,1 +568,1,0,8,0x112f7d837f8f9c36b460d636c965a5f8,1 +568,1,0,9,0x18f2b50c5d00fb3f9705561dd6631883,1 +568,0,1,0,0,1 +568,0,1,1,1,1 +569,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +569,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +569,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +569,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +569,1,0,4,0xb62f26b5f2a2b26f6de86d42ad8a13da,1 +569,1,0,5,0x3ab3cccd0459b201de009e526adf21f2,1 +569,1,0,6,0xd823533c04cd8edc6d6f950a8e08ade0,1 +569,1,0,7,0x4a9bafa2f14a590356935671ae9305bf,1 +569,1,0,8,0x43178d1f88b6a57a96924c265f0ddb75,1 +569,1,0,9,0xb58312907b195acb59d7797303123775,1 +569,0,1,0,0,1 +569,0,1,1,1,1 +570,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +570,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +570,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +570,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +570,1,0,4,0xbb1d9ac949dd748cd02bbbe749bd351c,1 +570,1,0,5,0xd57b38bb61403d700686aa7b4c90851e,1 +570,1,0,6,0xdb2b3408b3167d91030624c6328e8ce3,1 +570,1,0,7,0xec108c105575c2f3d209b92e654bab69,1 +570,1,0,8,0xc34318139c50b0802c6e612f0fd3189d,1 +570,1,0,9,0x800df7c996d5d7b7c3d6be82836fa258,1 +570,0,1,0,0,1 +570,0,1,1,1,1 +571,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +571,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +571,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +571,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +571,1,0,4,0x66755a00638cdaec1c732513ca0234ec,1 +571,1,0,5,0xe52545dac11f816e818f725b4f60aaf2,1 +571,1,0,6,0x09179ce7c59225392216453b2ac1e9d1,1 +571,1,0,7,0x78c24837dfae26bc1dd7ab6063852742,1 +571,1,0,8,0x5556b42e330289f3b826b2db7a86d19d,1 +571,1,0,9,0x45c2860a59f2be1ddcc3b691f95a9255,1 +571,0,1,0,0,1 +571,0,1,1,1,1 +572,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +572,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +572,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +572,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +572,1,0,4,0x55a00c9fcdaebb6032513ca0234ecfff,1 +572,1,0,5,0xe98ebe492fdf02e48ca48e982beb3669,1 +572,1,0,6,0x01959fb8deda56e5467b7e4b214ea4c2,1 +572,1,0,7,0xd0c2fb29d70ff19b6b1eccebd6568d7e,1 +572,1,0,8,0xd9dbd77a918297fd970bff01e1343f69,1 +572,1,0,9,0x25167db5a14d098a211c39cc3a413398,1 +572,0,1,0,0,1 +572,0,1,1,1,1 +573,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +573,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +573,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +573,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +573,1,0,4,0xab40193f9b5d76c064a27940469d9fff,1 +573,1,0,5,0xd31d7c925fbe05c919491d3057d66cd2,1 +573,1,0,6,0x567f1fdc387e5350c852b4e8f8ba9d6d,1 +573,1,0,7,0x947e1c5dd7ccc61a5938245dd6bcab3a,1 +573,1,0,8,0x9960bebaf919514f9535c22eaaf0b581,1 +573,1,0,9,0x2857970e26662267b1f3eb1011130a11,1 +573,0,1,0,0,1 +573,0,1,1,1,1 +574,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +574,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +574,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +574,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +574,1,0,4,0xca0234ebb5fdcb13ca0234ecffffffff,1 +574,1,0,5,0xcb0dadbbc7f549f8a26b4408d0dc8600,1 +574,1,0,6,0x3499f974ff4ca6bbb2f51682fd5f5176,1 +574,1,0,7,0x2f9dd6dd2855262660b36d46d3e4bec2,1 +574,1,0,8,0xf498fae2487807e220119152f0122476,1 +574,1,0,9,0xc64d4fa46ddce85c4546630f0d5c5e81,1 +574,0,1,0,0,1 +574,0,1,1,1,1 +575,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +575,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +575,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +575,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +575,1,0,4,0xbfffffff3ea3677e082b9310572620ae,1 +575,1,0,5,0x19933a9e65b285598711c77298815ad3,1 +575,1,0,6,0x2c5c01662cf00c1929596257db13b26e,1 +575,1,0,7,0xcf30d0f3ec4b9f0351b0f27094473426,1 +575,1,0,8,0xe986a086060d086eee822ddd2fc74424,1 +575,1,0,9,0x7a0154b57f7a69c51d9fdafa484e4ac7,1 +575,0,1,0,0,1 +575,0,1,1,1,1 +576,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +576,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +576,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +576,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +576,1,0,4,0x266666663bbbbbbbe666666666666666,1 +576,1,0,5,0x5b37902e023fab7c8f055d86e5cc41f4,1 +576,1,0,6,0x91d4cba813a04d86dbae94c23be6f52c,1 +576,1,0,7,0x15774183be7ba5b2d9f3cf010b160501,1 +576,1,0,8,0x900b8adfea6491019a9ac080d516025a,1 +576,1,0,9,0x541bf4b952b0ad7be4b1874b02fd544a,1 +576,0,1,0,0,1 +576,0,1,1,1,1 +577,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +577,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +577,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +577,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +577,1,0,4,0xbfffffff36db6db7a492492492492492,1 +577,1,0,5,0x146c573f4c6dfc8d08a443e258970b09,1 +577,1,0,6,0xef7fd0a3a36386638330ecad41e1a3b3,1 +577,1,0,7,0x02af36960831d0210c614b948e8aa124,1 +577,1,0,8,0xef0d6d800e4047d6d3c1be0fdeaf11fc,1 +577,1,0,9,0xd8cab5ab59c730eb34116e35a8c7d098,1 +577,0,1,0,0,1 +577,0,1,1,1,1 +578,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +578,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +578,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +578,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +578,1,0,4,0xbfffffff2aaaaaab7fffffffffffffff,1 +578,1,0,5,0xc815d0e60b3e596ecb1ad3a27cfd49c4,1 +578,1,0,6,0xa521dab13cc9152d8ca77035a607fea0,1 +578,1,0,7,0x6c55cc3ca5dbeb868cea92eafe93df2a,1 +578,1,0,8,0x7bfb9b28531996635e6a5ccaa2826a40,1 +578,1,0,9,0x6ce1111bdb9c2e0ca36500418a2f43de,1 +578,0,1,0,0,1 +578,0,1,1,1,1 +579,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +579,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +579,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +579,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +579,1,0,4,0x7fffffff55555555ffffffffffffffff,1 +579,1,0,5,0xd344a71e6f651458a27bdc81fd976e37,1 +579,1,0,6,0x474d58a4eec16e0d565f2187fe11d4e8,1 +579,1,0,7,0xe7a2683a12f38b4fc01d1237a81a1097,1 +579,1,0,8,0x6e55f73bb7cdda46bdb67ef77f6fd296,1 +579,1,0,9,0x9df2b67920fb5945fde3a517a6ded4cd,1 +579,0,1,0,0,1 +579,0,1,1,1,1 +580,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +580,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +580,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +580,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +580,1,0,4,0x3fffffff800000007fffffffffffffff,1 +580,1,0,5,0xde737d56d38bcf4279dce5617e3192aa,1 +580,1,0,6,0x692da5cd4309d9a6e5cb525c37da8fa0,1 +580,1,0,7,0x879f7b57208cdabbf47d223a5b23a621,1 +580,1,0,8,0x40e0daa78cfdd207a7389aaed61738b1,1 +580,1,0,9,0x7fc5fc3e6a5ed3397d2902e9125e6ab4,1 +580,0,1,0,0,1 +580,0,1,1,1,1 +581,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +581,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +581,1,0,2,0x7fffffffffffffffffffffffffffffff,1 +581,1,0,3,0xfffffffffffffffffffffffffffffffd,1 +581,1,0,4,0x5d8ecd64a4eeba466815ddf3a4de9a8e,1 +581,1,0,5,0x6abd9c5db0a01eb80343553da648428f,1 +581,1,0,6,0x85689b3e0775c7718a90279f14a8082c,1 +581,1,0,7,0xfcd4d1f1679274f4e9b8805c570a0670,1 +581,1,0,8,0x167fcc5ca734552e09afa3640f4a034e,1 +581,1,0,9,0x15b9b7ca661ec7ff70d3f240ebe705b1,1 +581,0,1,0,0,1 +581,0,1,1,1,1 +582,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +582,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +582,1,0,2,0x6f2347cab7dd76858fe0555ac3bc9904,1 +582,1,0,3,0x8c4aacafdfb6bcbe05ea6c42c4934569,1 +582,1,0,4,0xf21d907e3890916dc4fa1f4703c1e50d,1 +582,1,0,5,0x3f54ddf7383e44023a41de562aa18ed8,1 +582,1,0,6,0x0158137755b901f797a90d4ca8887e02,1 +582,1,0,7,0x3cb2ef63b2ba2c0d455edaef42cf237e,1 +582,1,0,8,0x2a964fc00d377a8592b8b61aafa7a4aa,1 +582,1,0,9,0xa7c7b9fd2b41d6e0e17bd1ba5677edcd,1 +582,0,1,0,0,1 +582,0,1,1,1,1 +583,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +583,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +583,1,0,2,0x6f2347cab7dd76858fe0555ac3bc9904,1 +583,1,0,3,0x8c4aacafdfb6bcbe05ea6c42c4934569,1 +583,1,0,4,0xf21d907e3890916dc4fa1f4703c1e50d,1 +583,1,0,5,0x3f54ddf7383e44023a41de562aa18ed8,1 +583,1,0,6,0x0158137755b901f797a90d4ca8887e02,1 +583,1,0,7,0x3cb2ef63b2ba2c0d455edaef42cf237e,1 +583,1,0,8,0xd569b03ef2c8857b6d4749e550585b55,1 +583,1,0,9,0x58384603d4be291f1e842e45a9881232,1 +583,0,1,0,0,1 +583,0,1,1,0,1 +584,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +584,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +584,1,0,2,0x00000000000000000000000000000000,1 +584,1,0,3,0x00000000000000000000000000000001,1 +584,1,0,4,0x55555555000000005555555555555555,1 +584,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +584,1,0,6,0x38a084ffccc4ae2f8204be2abca9fb8a,1 +584,1,0,7,0xd4ab283b2aa50f13b6bb2347adabc69c,1 +584,1,0,8,0xa699799b77b1cc6dad271e88b899c129,1 +584,1,0,9,0x31986e958e1f5cf5653dddf7389365e2,1 +584,0,1,0,0,1 +584,0,1,1,0,1 +585,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +585,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +585,1,0,2,0x55555555000000005555555555555555,1 +585,1,0,3,0x3ef7a8e48d07df81a693439654210c70,1 +585,1,0,4,0x33333333000000003333333333333333,1 +585,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aa9,1 +585,1,0,6,0x664ce273320d918d8bdb2e61201b4549,1 +585,1,0,7,0xb36b7cdc54e33b84adb6f2c10aac831e,1 +585,1,0,8,0x49e68831f18bda2973ac3d76bfbc8c5e,1 +585,1,0,9,0xe1cceed2dd862e2dc7c915c736cef1f4,1 +585,0,1,0,0,1 +585,0,1,1,0,1 +586,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +586,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +586,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +586,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +586,1,0,4,0x55555555000000005555555555555555,1 +586,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +586,1,0,6,0x961691a5e960d07a301dbbad4d86247e,1 +586,1,0,7,0xc27d7089faeb3ddd1add395efff1e0fe,1 +586,1,0,8,0x7254622cc371866cdf990d2c5377790e,1 +586,1,0,9,0x37d1f1519817f09a231bd260a9e78aeb,1 +586,0,1,0,0,1 +586,0,1,1,1,1 +587,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +587,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +587,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +587,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +587,1,0,4,0xb6db6db6249249254924924924924924,1 +587,1,0,5,0x625bd7a09bec4ca81bcdd9f8fd6b63cc,1 +587,1,0,6,0x5d283e13ce8ca60da868e3b0fb33e6b4,1 +587,1,0,7,0xf1074793274e2928250e71e2aca63e9c,1 +587,1,0,8,0x214dc74fa25371fb4d9e506d418ed9a1,1 +587,1,0,9,0xbfd6d0c8bb6591d3e0f44505a84886ce,1 +587,0,1,0,0,1 +587,0,1,1,1,1 +588,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +588,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +588,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +588,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +588,1,0,4,0xcccccccc00000000cccccccccccccccc,1 +588,1,0,5,0x971f2ef152794b9d8fc7d568c9e8eaa7,1 +588,1,0,6,0x0fc351da038ae0803bd1d86514ae0462,1 +588,1,0,7,0xf9f8216551d9315aa9d297f792eef6a3,1 +588,1,0,8,0x41c74eed786f2d33da35360ca7aa925e,1 +588,1,0,9,0x753f00d6077a1e9e5fc339d634019c73,1 +588,0,1,0,0,1 +588,0,1,1,1,1 +589,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +589,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +589,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +589,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +589,1,0,4,0x33333333000000003333333333333333,1 +589,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aaa,1 +589,1,0,6,0xa1e34c8f16d138673fee55c080547c2b,1 +589,1,0,7,0xfd4de7550065f638322bba9430ce4b60,1 +589,1,0,8,0x662be9bb512663aa4d7df8ab3f3b4181,1 +589,1,0,9,0xc5d44a7bdf42436620b7d8a6b81ac936,1 +589,0,1,0,0,1 +589,0,1,1,1,1 +590,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +590,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +590,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +590,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +590,1,0,4,0x49249248db6db6dbb6db6db6db6db6db,1 +590,1,0,5,0x5a8b230d0b2b51dcd7ebf0c9fef7c185,1 +590,1,0,6,0x7e1a8a8338d7fd8cf41d322a302d2078,1 +590,1,0,7,0xa87a23c7186150ed7cda6e52817c1bdf,1 +590,1,0,8,0xd0a9135a89d21ce821e29014b2898349,1 +590,1,0,9,0x254d748272b2d4eb8d59ee34c615377f,1 +590,0,1,0,0,1 +590,0,1,1,1,1 +591,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +591,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +591,1,0,2,0x7cf27b188d034f7e8a52380304b51ac3,1 +591,1,0,3,0xc08969e277f21b35a60b48fc47669978,1 +591,1,0,4,0x16a4502e2781e11ac82cbc9d1edd8c98,1 +591,1,0,5,0x1584d13e18411e2f6e0478c34416e3bb,1 +591,1,0,6,0x5c19fe227a61abc65c61ee7a018cc957,1 +591,1,0,7,0x1b2c6f663ea33583f76a686f64be078b,1 +591,1,0,8,0x7b4a0d734940f613d52bc48673b457c2,1 +591,1,0,9,0xcf78492490a5cc5606c0541d17b24ddb,1 +591,0,1,0,0,1 +591,0,1,1,1,1 +592,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +592,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +592,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +592,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +592,1,0,4,0x55555555000000005555555555555555,1 +592,1,0,5,0x3ef7a8e48d07df81a693439654210c70,1 +592,1,0,6,0xdb02d1f3421d600e9d9ef9e47419dba3,1 +592,1,0,7,0x208eed08c2d4189a5db63abeb2739666,1 +592,1,0,8,0xe0ed26967b9ada9ed7ffe480827f90a0,1 +592,1,0,9,0xd210d5fd8ec628e31715e6b24125512a,1 +592,0,1,0,0,1 +592,0,1,1,1,1 +593,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +593,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +593,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +593,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +593,1,0,4,0xb6db6db6249249254924924924924924,1 +593,1,0,5,0x625bd7a09bec4ca81bcdd9f8fd6b63cc,1 +593,1,0,6,0x6222d1962655501893c29e441395b6c0,1 +593,1,0,7,0x5711bd3ed5a0ef72cfab338b88229c4b,1 +593,1,0,8,0xaaae079cb44a1af070362aaa520ee24c,1 +593,1,0,9,0xac2626423b0bf81af1c54311d8e2fd23,1 +593,0,1,0,0,1 +593,0,1,1,1,1 +594,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +594,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +594,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +594,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +594,1,0,4,0xcccccccc00000000cccccccccccccccc,1 +594,1,0,5,0x971f2ef152794b9d8fc7d568c9e8eaa7,1 +594,1,0,6,0x4ccfa24c67f3def7fa81bc99c70bb041,1 +594,1,0,7,0x9c0952ba599f4c03361da184b04cdca5,1 +594,1,0,8,0xdb76b797f7f41d9c729a2219478a7e62,1 +594,1,0,9,0x9728df870800be8cf6ca7a0a82153bfa,1 +594,0,1,0,0,1 +594,0,1,1,1,1 +595,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +595,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +595,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +595,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +595,1,0,4,0x33333333000000003333333333333333,1 +595,1,0,5,0x25c7cbbc549e52e763f1f55a327a3aaa,1 +595,1,0,6,0xea1c72c91034036bac71402b6e9ecc4a,1 +595,1,0,7,0xf3dbde7a99dc574061e99fefff9d84da,1 +595,1,0,8,0xb7dd057e75b78ac6f56e34eb048f0a9d,1 +595,1,0,9,0x29d5d055408c90d02bc2ea918c18cb63,1 +595,0,1,0,0,1 +595,0,1,1,1,1 +596,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +596,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +596,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +596,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +596,1,0,4,0x49249248db6db6dbb6db6db6db6db6db,1 +596,1,0,5,0x5a8b230d0b2b51dcd7ebf0c9fef7c185,1 +596,1,0,6,0xc2879a66d86cb20b820b7795da2da62b,1 +596,1,0,7,0x38924f7817d1cd350d936988e90e79bc,1 +596,1,0,8,0x5431a7268ff6931c7a759de024eff90b,1 +596,1,0,9,0xcb0177216db6fd1f3aaaa11fa3b6a083,1 +596,0,1,0,0,1 +596,0,1,1,1,1 +597,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +597,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +597,1,0,2,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +597,1,0,3,0x77037d812deb33a0f4a13945d898c296,1 +597,1,0,4,0x16a4502e2781e11ac82cbc9d1edd8c98,1 +597,1,0,5,0x1584d13e18411e2f6e0478c34416e3bb,1 +597,1,0,6,0xab1c0f273f74abc2b848c75006f2ef3c,1 +597,1,0,7,0x54c26df27711b06558f455079aee0ba3,1 +597,1,0,8,0xdf510f2ecef6d9a05997c776f14ad645,1 +597,1,0,9,0x6c179f0a13af1771e4d6c37fa48b47f2,1 +597,0,1,0,0,1 +597,0,1,1,1,1 +598,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +598,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +598,1,0,2,0x532eaabd9574880dbf76b9b8cc00832c,1 +598,1,0,3,0x20a6ec113d682299550d7a6e0f345e25,1 +598,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +598,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +598,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +598,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +598,1,0,8,0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16,1 +598,1,0,9,0x2bce33576b315ececbb6406837bf51f5,1 +598,0,1,0,0,1 +598,0,1,1,0,1 +599,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +599,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +599,1,0,2,0xacd155416a8b77f34089464733ff7cd3,1 +599,1,0,3,0x9c400e9c69af7beb9eac5054ed2ec72c,1 +599,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +599,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +599,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +599,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +599,1,0,8,0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16,1 +599,1,0,9,0x2bce33576b315ececbb6406837bf51f5,1 +599,0,1,0,0,1 +599,0,1,1,0,1 +600,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +600,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +600,1,0,2,0x532eaabd9574880dbf76b9b8cc00832c,1 +600,1,0,3,0x20a6ec113d682299550d7a6e0f345e25,1 +600,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +600,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +600,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +600,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +600,1,0,8,0xb01cbd1c01e58065711814b583f061e9,1 +600,1,0,9,0xd431cca994cea1313449bf97c840ae0a,1 +600,0,1,0,0,1 +600,0,1,1,0,1 +601,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +601,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +601,1,0,2,0xacd155416a8b77f34089464733ff7cd3,1 +601,1,0,3,0x9c400e9c69af7beb9eac5054ed2ec72c,1 +601,1,0,4,0x249249246db6db6ddb6db6db6db6db6d,1 +601,1,0,5,0xad4591868595a8ee6bf5f864ff7be0c2,1 +601,1,0,6,0x6b17d1f2e12c4247f8bce6e563a440f2,1 +601,1,0,7,0x77037d812deb33a0f4a13945d898c296,1 +601,1,0,8,0xb01cbd1c01e58065711814b583f061e9,1 +601,1,0,9,0xd431cca994cea1313449bf97c840ae0a,1 +601,0,1,0,0,1 +601,0,1,1,0,1 +602,1,0,0,0xbb5a52f42f9c9261ed4361f59422a1e3,1 +602,1,0,1,0x0036e7c32b270c8807a419feca605023,1 +602,1,0,2,0xa8ea150cb80125d7381c4c1f1da8e9de,1 +602,1,0,3,0x2711f9917060406a73d7904519e51388,1 +602,1,0,4,0xf3ab9fa68bd47973a73b2d40480c2ba5,1 +602,1,0,5,0x0c22c9d76ec217257288293285449b86,1 +602,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +602,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +602,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +602,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +602,0,1,0,0,1 +602,0,1,1,1,1 +603,1,0,0,0x532eaabd9574880dbf76b9b8cc00832c,1 +603,1,0,1,0x20a6ec113d682299550d7a6e0f345e25,1 +603,1,0,2,0x30e782f964b2e2ff065a051bc7adc206,1 +603,1,0,3,0x15d8c43a1365713c88268822c253bcce,1 +603,1,0,4,0x5b16df652aa1ecb2dc8b46c515f9604e,1 +603,1,0,5,0x2e84cacfa7c6eec30428d2d3f4e08ed5,1 +603,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +603,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +603,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +603,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +603,0,1,0,0,1 +603,0,1,1,1,1 +604,1,0,0,0xe3b0c44298fc1c149afbf4c8996fb924,1 +604,1,0,1,0x27ae41e4649b934ca495991b7852b855,1 +604,1,0,2,0xb292a619339f6e567a305c951c0dcbcc,1 +604,1,0,3,0x42d16e47f219f9e98e76e09d8770b34a,1 +604,1,0,4,0x0177e60492c5a8242f76f07bfe3661bd,1 +604,1,0,5,0xe59ec2a17ce5bd2dab2abebdf89a62e2,1 +604,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +604,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +604,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +604,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +604,0,1,0,0,1 +604,0,1,1,1,1 +605,1,0,0,0xde47c9b27eb8d300dbb5f2c353e632c3,1 +605,1,0,1,0x93262cf06340c4fa7f1b40c4cbd36f90,1 +605,1,0,2,0x986e65933ef2ed4ee5aada139f52b705,1 +605,1,0,3,0x39aaf63f00a91f29c69178490d57fb71,1 +605,1,0,4,0x3dafedfb8da6189d372308cbf1489bbb,1 +605,1,0,5,0xdabf0c0217d1c0ff0f701aaa7a694b9c,1 +605,1,0,6,0x04aaec73635726f213fb8a9e64da3b86,1 +605,1,0,7,0x32e41495a944d0045b522eba7240fad5,1 +605,1,0,8,0x87d9315798aaa3a5ba01775787ced05e,1 +605,1,0,9,0xaaf7b4e09fc81d6d1aa546e8365d525d,1 +605,0,1,0,0,1 +605,0,1,1,1,1 +606,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +606,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +606,1,0,2,0xd434e262a49eab7781e353a3565e4825,1 +606,1,0,3,0x50dd0fd5defa013c7f29745eff3569f1,1 +606,1,0,4,0x9b0c0a93f267fb6052fd8077be769c2b,1 +606,1,0,5,0x98953195d7bc10de844218305c6ba17a,1 +606,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +606,1,0,7,0xf3807eca117380239fbd816900000000,1 +606,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +606,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +606,0,1,0,0,1 +606,0,1,1,1,1 +607,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +607,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +607,1,0,2,0x0fe774355c04d060f76d79fd7a772e42,1 +607,1,0,3,0x1463489221bf0a33add0be9b1979110b,1 +607,1,0,4,0x500dcba1c69a8fbd43fa4f57f743ce12,1 +607,1,0,5,0x4ca8b91a1f325f3fac6181175df55737,1 +607,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +607,1,0,7,0xf3807eca117380239fbd816900000000,1 +607,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +607,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +607,0,1,0,0,1 +607,0,1,1,1,1 +608,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +608,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +608,1,0,2,0xbb40bf217bed3fb3950c7d39f03d36dc,1 +608,1,0,3,0x8e3b2cd79693f125bfd06595ee1135e3,1 +608,1,0,4,0x541bf3532351ebb032710bdb6a1bf1bf,1 +608,1,0,5,0xc89a1e291ac692b3fa4780745bb55677,1 +608,1,0,6,0x4f337ccfd67726a805e4f1600ae2849d,1 +608,1,0,7,0xf3807eca117380239fbd816900000000,1 +608,1,0,8,0xed9dea124cc8c396416411e988c30f42,1 +608,1,0,9,0x7eb504af43a3146cd5df7ea60666d685,1 +608,0,1,0,0,1 +608,0,1,1,1,1 +609,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +609,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +609,1,0,2,0x664eb7ee6db84a34df3c86ea31389a54,1 +609,1,0,3,0x05badd5ca99231ff556d3e75a233e73a,1 +609,1,0,4,0x59f3c752e52eca46137642490a51560c,1 +609,1,0,5,0xe0badc678754b8f72e51a2901426a1bd,1 +609,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +609,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +609,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +609,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +609,0,1,0,0,1 +609,0,1,1,1,1 +610,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +610,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +610,1,0,2,0x4cd0429bbabd2827009d6fcd843d4ce3,1 +610,1,0,3,0x9c3e42e2d1631fd001985a79d1fd8b43,1 +610,1,0,4,0x9638bf12dd682f60be7ef1d0e0d98f08,1 +610,1,0,5,0xb7bca77a1a2b869ae466189d2acdabe3,1 +610,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +610,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +610,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +610,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +610,0,1,0,0,1 +610,0,1,1,1,1 +611,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +611,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +611,1,0,2,0xe56c6ea2d1b017091c44d8b6cb62b9f4,1 +611,1,0,3,0x60e3ce9aed5e5fd41e8added97c56c04,1 +611,1,0,4,0xa308ec31f281e955be20b457e463440b,1 +611,1,0,5,0x4fcf2b80258078207fc1378180f89b55,1 +611,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +611,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +611,1,0,8,0x84fa174d791c72bf2ce3880a8960dd2a,1 +611,1,0,9,0x7c7a1338a82f85a9e59cdbde80000000,1 +611,0,1,0,0,1 +611,0,1,1,1,1 +612,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +612,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +612,1,0,2,0x1158a08d291500b4cabed3346d891eee,1 +612,1,0,3,0x57c176356a2624fb011f8fbbf3466830,1 +612,1,0,4,0x228a8c486a736006e082325b85290c5b,1 +612,1,0,5,0xc91f378b75d487dda46798c18f285519,1 +612,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +612,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +612,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +612,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +612,0,1,0,0,1 +612,0,1,1,1,1 +613,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +613,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +613,1,0,2,0xb1db9289649f59410ea36b0c0fc8d6aa,1 +613,1,0,3,0x2687b29176939dd23e0dde56d309fa9d,1 +613,1,0,4,0x3e1535e4280559015b0dbd987366dcf4,1 +613,1,0,5,0x3a6d1af5c23c7d584e1c3f48a1251336,1 +613,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +613,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +613,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +613,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +613,0,1,0,0,1 +613,0,1,1,1,1 +614,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +614,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +614,1,0,2,0xb7b16e762286cb96446aa8d4e6e7578b,1 +614,1,0,3,0x0a341a79f2dd1a220ac6f0ca4e24ed86,1 +614,1,0,4,0xddc60a700a139b04661c547d07bbb072,1 +614,1,0,5,0x1780146df799ccf55e55234ecb8f12bc,1 +614,1,0,6,0x3cf03d614d8939cfd499a07873fac281,1 +614,1,0,7,0x618f06b8ff87e8015c3f497265004935,1 +614,1,0,8,0x7b05e8b186e38d41d31c77f5769f22d5,1 +614,1,0,9,0x8385ecc857d07a561a6324217fffffff,1 +614,0,1,0,0,1 +614,0,1,1,1,1 +615,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +615,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +615,1,0,2,0xd82a7c2717261187c8e00d8df963ff35,1 +615,1,0,3,0xd796edad36bc6e6bd1c91c670d9105b4,1 +615,1,0,4,0x3dcabddaf8fcaa61f4603e7cbac0f3c0,1 +615,1,0,5,0x351ecd5988efb23f680d07debd139929,1 +615,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +615,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +615,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +615,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +615,0,1,0,0,1 +615,0,1,1,1,1 +616,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +616,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +616,1,0,2,0x5eb9c8845de68eb13d5befe719f462d7,1 +616,1,0,3,0x7787802baff30ce96a5cba063254af78,1 +616,1,0,4,0x2c026ae9be2e2a5e7ca0ff9bbd92fb6e,1 +616,1,0,5,0x44972186228ee9a62b87ddbe2ef66fb5,1 +616,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +616,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +616,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +616,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +616,0,1,0,0,1 +616,0,1,1,1,1 +617,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +617,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +617,1,0,2,0x96843dd03c22abd2f3b782b170239f90,1 +617,1,0,3,0xf277921becc117d0404a8e4e36230c28,1 +617,1,0,4,0xf2be378f526f74a543f67165976de9ed,1 +617,1,0,5,0x9a31214eb4d7e6db19e1ede123dd991d,1 +617,1,0,6,0x2829c31faa2e400e344ed94bca3fcd05,1 +617,1,0,7,0x45956ebcfe8ad0f6dfa5ff8effffffff,1 +617,1,0,8,0xa01aafaf000e52585855afa7676ade28,1 +617,1,0,9,0x4113099052df57e7eb3bd37ebeb9222e,1 +617,0,1,0,0,1 +617,0,1,1,1,1 +618,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +618,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +618,1,0,2,0x766456dce1857c906f9996af72933946,1 +618,1,0,3,0x4d27e9d98edc2d0e3b760297067421f6,1 +618,1,0,4,0x402385ecadae0d8081dccaf5d19037ec,1 +618,1,0,5,0x4e55376eced699e93646bfbbf19d0b41,1 +618,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +618,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +618,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +618,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +618,0,1,0,0,1 +618,0,1,1,1,1 +619,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +619,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +619,1,0,2,0xc605c4b2edeab20419e6518a11b2dbc2,1 +619,1,0,3,0xb97ed8b07cced0b19c34f777de7b9fd9,1 +619,1,0,4,0xedf0f612c5f46e03c719647bc8af1b29,1 +619,1,0,5,0xb2cde2eda700fb1cff5e159d47326dba,1 +619,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +619,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +619,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +619,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +619,0,1,0,0,1 +619,0,1,1,1,1 +620,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +620,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +620,1,0,2,0xd48b68e6cabfe03cf6141c9ac54141f2,1 +620,1,0,3,0x10e64485d9929ad7b732bfe3b7eb8a84,1 +620,1,0,4,0xfeedae50c61bd00e19dc26f9b7e2265e,1 +620,1,0,5,0x4508c389109ad2f208f0772315b6c941,1 +620,1,0,6,0xfffffff948081e6a0458dd8f9e738f26,1 +620,1,0,7,0x65ff9059ad6aac0708318c4ca9a7a4f5,1 +620,1,0,8,0x5a8abcba2dda8474311ee54149b973ca,1 +620,1,0,9,0xe0c0fb89557ad0bf78e6529a1663bd73,1 +620,0,1,0,0,1 +620,0,1,1,1,1 +621,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +621,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +621,1,0,2,0xb7c81457d4aeb6aa65957098569f0479,1 +621,1,0,3,0x710ad7f6595d5874c35a93d12a5dd4c7,1 +621,1,0,4,0xb7961a0b652878c2d568069a432ca18a,1 +621,1,0,5,0x1a9199f2ca574dad4b9e3a05c0a1cdb3,1 +621,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +621,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +621,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +621,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +621,0,1,0,0,1 +621,0,1,1,1,1 +622,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +622,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +622,1,0,2,0x6b01332ddb6edfa9a30a1321d5858e1e,1 +622,1,0,3,0xe3cf97e263e669f8de5e9652e76ff3f7,1 +622,1,0,4,0x5939545fced457309a6a04ace2bd0f70,1 +622,1,0,5,0x139c8f7d86b02cb1cc58f9e69e96cd5a,1 +622,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +622,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +622,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +622,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +622,0,1,0,0,1 +622,0,1,1,1,1 +623,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +623,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +623,1,0,2,0xefdb884720eaeadc349f9fc356b6c034,1 +623,1,0,3,0x4101cd2fd8436b7d0e6a4fb93f106361,1 +623,1,0,4,0xf24bee6ad5dc05f7613975473aadf3aa,1 +623,1,0,5,0xcba9e77de7d69b6ce48cb60d8113385d,1 +623,1,0,6,0x00000003fa15f963949d5f03a6f5c7f8,1 +623,1,0,7,0x6f9e0015eeb23aebbff1173937ba748e,1 +623,1,0,8,0x1099872070e8e87c555fa13659cca5d7,1 +623,1,0,9,0xfadcfcb0023ea889548ca48af2ba7e71,1 +623,0,1,0,0,1 +623,0,1,1,1,1 +624,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +624,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +624,1,0,2,0x31230428405560dcb88fb5a646836aea,1 +624,1,0,3,0x9b23a23dd973dcbe8014c87b8b20eb07,1 +624,1,0,4,0x0f9344d6e812ce166646747694a41b0a,1 +624,1,0,5,0xaf97374e19f3c5fb8bd7ae3d9bd0beff,1 +624,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +624,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +624,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +624,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +624,0,1,0,0,1 +624,0,1,1,1,1 +625,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +625,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +625,1,0,2,0xcaa797da65b320ab0d5c470cda0b36b2,1 +625,1,0,3,0x94359c7db9841d679174db34c4855743,1 +625,1,0,4,0xcf543a62f23e212745391aaf7505f345,1 +625,1,0,5,0x123d2685ee3b941d3de6d9b36242e5a0,1 +625,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +625,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +625,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +625,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +625,0,1,0,0,1 +625,0,1,1,1,1 +626,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +626,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +626,1,0,2,0x7e5f0ab5d900d3d3d7867657e5d6d365,1 +626,1,0,3,0x19bc54084536e7d21c336ed800185945,1 +626,1,0,4,0x9450c07f201faec94b82dfb322e5ac67,1 +626,1,0,5,0x6688294aad35aa72e727ff0b19b646aa,1 +626,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +626,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +626,1,0,8,0x000000001352bb4a0fa2ea4cceb9ab63,1 +626,1,0,9,0xdd684ade5a1127bcf300a698a7193bc2,1 +626,0,1,0,0,1 +626,0,1,1,1,1 +627,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +627,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +627,1,0,2,0xd7d70c581ae9e3f66dc6a480bf037ae2,1 +627,1,0,3,0x3f8a1e4a2136fe4b03aa69f0ca25b356,1 +627,1,0,4,0x89c460f8a5a5c2bbba962c8a3ee833a4,1 +627,1,0,5,0x13e85658e62a59e2af41d9127cc47224,1 +627,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +627,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +627,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +627,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +627,0,1,0,0,1 +627,0,1,1,1,1 +628,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +628,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +628,1,0,2,0x341c1b9ff3c83dd5e0dfa0bf68bcdf4b,1 +628,1,0,3,0xb7aa20c625975e5eeee34bb396266b34,1 +628,1,0,4,0x72b69f061b750fd5121b22b11366fad5,1 +628,1,0,5,0x49c634e77765a017902a67099e0a4469,1 +628,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +628,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +628,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +628,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +628,0,1,0,0,1 +628,0,1,1,1,1 +629,1,0,0,0x2f77668a9dfbf8d5848b9eeb4a7145ca,1 +629,1,0,1,0x94c6ed9236e4a773f6dcafa5132b2f91,1 +629,1,0,2,0x70bebe684cdcb5ca72a42f0d87387935,1 +629,1,0,3,0x9bd1781a591809947628d313a3814f67,1 +629,1,0,4,0xaec03aca8f5587a4d535fa31027bbe9c,1 +629,1,0,5,0xc0e464b1c3577f4c2dcde6b2094798a9,1 +629,1,0,6,0xbcbb2914c79f045eaa6ecbbc612816b3,1 +629,1,0,7,0xbe5d2d6796707d8125e9f851c18af015,1 +629,1,0,8,0xfffffffeecad44b6f05d15b33146549c,1 +629,1,0,9,0x2297b522a5eed8430cff596758e6c43d,1 +629,0,1,0,0,1 +629,0,1,1,1,1 diff --git a/prover/zkevm/settings.go b/prover/zkevm/settings.go index eadecb2dda..1f08dc9046 100644 --- a/prover/zkevm/settings.go +++ b/prover/zkevm/settings.go @@ -10,6 +10,7 @@ import ( "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/keccak" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/sha2" "github.com/consensys/linea-monorepo/prover/zkevm/prover/modexp" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/p256verify" "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput" "github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager" ) @@ -29,6 +30,7 @@ type Settings struct { Ecpair ecpair.Limits Sha2 sha2.Settings Bls bls.Limits + P256Verify p256verify.Limits PublicInput publicInput.Settings CompilationSuite CompilationSuite Metadata wizard.VersionMetadata diff --git a/prover/zkevm/zkevm.go b/prover/zkevm/zkevm.go index 816cd47701..8b01307643 100644 --- a/prover/zkevm/zkevm.go +++ b/prover/zkevm/zkevm.go @@ -12,6 +12,7 @@ import ( "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/keccak" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/sha2" "github.com/consensys/linea-monorepo/prover/zkevm/prover/modexp" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/p256verify" "github.com/consensys/linea-monorepo/prover/zkevm/prover/publicInput" "github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager" ) @@ -62,6 +63,8 @@ type ZkEvm struct { BlsPairingCheck *bls.BlsPair `json:"blsPairingCheck"` // PointEval is responsible for EIP-4844 point evaluation precompile. PointEval *bls.BlsPointEval `json:"pointEval"` + // P256Verify is responsible for P256 signature verification precompile. + P256Verify *p256verify.P256Verify `json:"p256Verify"` // Contains the actual wizard-IOP compiled object. This object is called to // generate the inner-proof. WizardIOP *wizard.CompiledIOP `json:"wizardIOP"` @@ -128,6 +131,7 @@ func newZkEVM(b *wizard.Builder, s *Settings) *ZkEvm { blsG2Map = bls.NewG2MapZkEvm(comp, &s.Bls) blsPairingCheck = bls.NewPairingZkEvm(comp, &s.Bls) pointEval = bls.NewPointEvalZkEvm(comp, &s.Bls) + p256verify = p256verify.NewP256VerifyZkEvm(comp, &s.P256Verify) publicInput = publicInput.NewPublicInputZkEVM(comp, &s.PublicInput, &stateManager.StateSummary) ) @@ -149,6 +153,7 @@ func newZkEVM(b *wizard.Builder, s *Settings) *ZkEvm { BlsG2Map: blsG2Map, BlsPairingCheck: blsPairingCheck, PointEval: pointEval, + P256Verify: p256verify, PublicInput: &publicInput, } } @@ -180,6 +185,7 @@ func (z *ZkEvm) GetMainProverStep(input *Witness) (prover wizard.MainProverStep) z.BlsG2Map.Assign(run) z.BlsPairingCheck.Assign(run) z.PointEval.Assign(run) + z.P256Verify.Assign(run) z.PublicInput.Assign(run, input.L2BridgeAddress, input.BlockHashList) } } From f15c708dcf9c2550602a6461d0a5d8b7437c4ac5 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Mon, 24 Nov 2025 14:26:32 +0000 Subject: [PATCH 13/36] fix: column names --- prover/zkevm/prover/p256verify/module.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/prover/zkevm/prover/p256verify/module.go b/prover/zkevm/prover/p256verify/module.go index dc8e61ffc0..f6e0693dd5 100644 --- a/prover/zkevm/prover/p256verify/module.go +++ b/prover/zkevm/prover/p256verify/module.go @@ -11,7 +11,7 @@ import ( const ( NAME_P256_VERIFY = "P256_VERIFY" - moduleName = "ECDATA" + moduleName = "ecdata" ROUND_NR = 0 ) @@ -34,8 +34,8 @@ func newP256VerifyDataSource(comp *wizard.CompiledIOP) *p256VerifyDataSource { CS: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_P256_VERIFY")), Limb: comp.Columns.GetHandle(colNameFn("LIMB")), Index: comp.Columns.GetHandle(colNameFn("INDEX")), - IsData: comp.Columns.GetHandle(colNameFn("DATA_P256_VERIFY_FLAG")), - IsResult: comp.Columns.GetHandle(colNameFn("RSLT_P256_VERIFY_FLAG")), + IsData: comp.Columns.GetHandle(colNameFn("IS_P256_VERIFY_DATA")), + IsResult: comp.Columns.GetHandle(colNameFn("IS_P256_VERIFY_RESULT")), } } From ad45e77c00daadc4b3ea38368f8112e2017b1a90 Mon Sep 17 00:00:00 2001 From: gusiri Date: Mon, 24 Nov 2025 15:25:23 +0000 Subject: [PATCH 14/36] add missing discovery advices --- prover/zkevm/limitless.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index e0136981c1..4eab24337b 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -343,6 +343,16 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7873,MIMC_STACKED_NEW_STATES_0_7874,MIMC_STACKED_OLD_STATES_0_7872_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7883,MIMC_STACKED_NEW_STATES_0_7884,MIMC_STACKED_OLD_STATES_0_7882_0_LOGDERIVATIVE_M"}, + {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7903,MIMC_STACKED_NEW_STATES_0_7904,MIMC_STACKED_OLD_STATES_0_7902_0_LOGDERIVATIVE_M"}, + {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_8105,MIMC_STACKED_NEW_STATES_0_8106,MIMC_STACKED_OLD_STATES_0_8104_0_LOGDERIVATIVE_M"}, + + // ELLIPTIC CURVES + // + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G1_BLS_MSM_CURRENT_ACCUMULATOR_0"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G2_BLS_MSM_CURRENT_ACCUMULATOR_0"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_IS_ACTIVE"}, + {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_ML"}, + {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_FE"}, // HUB-KECCAK (EUCLIDEAN variants) {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT,euc.REMAINDER_0_LOGDERIVATIVE_M"}, From 07f5c3e0e6d635aad8481151d6f65a2474dc0494 Mon Sep 17 00:00:00 2001 From: gusiri Date: Mon, 24 Nov 2025 17:33:30 +0000 Subject: [PATCH 15/36] fix(prover): workaround ChainIDFetcher offset incompatibility with distributed module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix panic "local constraint has both negative and positive offsets" in ChainIDFetcher introduced in commit 62308c09. The constraint had mixed offsets (ChainID at 0, DataLo at -3), which the distributed module rejects when handling segmented columns in limitless. This pattern should ideally be supported but currently triggers a validation error. As a workaround, apply ChainIDOffset=-3 to both constraint sides and add MustBeConstant(fetcher.ChainID). Since ChainID is constant, ChainID[-3] ≡ ChainID[0], preserving semantics while satisfying the distributed module's offset uniformity requirement. --- .../chain_id_fetcher.go | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher.go b/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher.go index 2d2ff4c17a..2f65ba100f 100644 --- a/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher.go +++ b/prover/zkevm/prover/publicInput/fetchers_arithmetization/chain_id_fetcher.go @@ -25,7 +25,7 @@ type ChainIDFetcher struct { NBytesChainID ifaces.Column // a column used to fetch the number of bytes of the ChainID limb data } -// NewTimestampFetcher returns a new TimestampFetcher with initialized columns that are not constrained. +// NewChainIDFetcher returns a new ChainIDFetcher with initialized columns that are not constrained. func NewChainIDFetcher(comp *wizard.CompiledIOP, name string, bdc *arith.BlockDataCols) ChainIDFetcher { size := bdc.Ct.Size() res := ChainIDFetcher{ @@ -36,16 +36,19 @@ func NewChainIDFetcher(comp *wizard.CompiledIOP, name string, bdc *arith.BlockDa return res } -// DefineTimestampFetcher specifies the constraints of the TimestampFetcher with respect to the BlockDataCols +// DefineChainIDFetcher specifies the constraints of the ChainIDFetcher with respect to the BlockDataCols func DefineChainIDFetcher(comp *wizard.CompiledIOP, fetcher *ChainIDFetcher, name string, bdc *arith.BlockDataCols) { - // constrain fetcher ChainID to contain the value of the last block's chainID - // we only populate the first entry of the ChainID column + // Constrain fetcher ChainID to equal the last block's chainID from BlockDataCols. + // Both sides are shifted by ChainIDOffset=-3 to maintain consistent negative offsets, + // which is required by the distributed module's limitless feature. The constraint + // ChainID[-3] == DataLo[-3] is enforced, and ChainID must be constant (see below), + // ensuring the chain ID value is consistent across all positions. comp.InsertLocal( 0, ifaces.QueryIDf("%s_%s", name, "LAST_LOCAL"), sym.Sub( - fetcher.ChainID, // first position of the ChainID column - column.Shift(bdc.DataLo, ChainIDOffset), // corresponding position in the arithmetization's BlockDataCols + column.Shift(fetcher.ChainID, ChainIDOffset), // ChainID at offset -3 + column.Shift(bdc.DataLo, ChainIDOffset), // DataLo at offset -3 (last block's chain ID) ), ) @@ -59,11 +62,12 @@ func DefineChainIDFetcher(comp *wizard.CompiledIOP, fetcher *ChainIDFetcher, nam ), ) - // require this to be a constant column + // require both ChainID and NBytesChainID to be constant columns. + commonconstraints.MustBeConstant(comp, fetcher.ChainID) commonconstraints.MustBeConstant(comp, fetcher.NBytesChainID) } -// AssignTimestampFetcher assigns the data in the TimestampFetcher using data fetched from the BlockDataCols +// AssignChainIDFetcher assigns the data in the ChainIDFetcher using data fetched from the BlockDataCols func AssignChainIDFetcher(run *wizard.ProverRuntime, fetcher *ChainIDFetcher, bdc *arith.BlockDataCols) { size := bdc.Ct.Size() var ( From 7d29796fa1ac1cf33d29ffc2d26055bc1288db45 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Mon, 24 Nov 2025 23:17:57 +0000 Subject: [PATCH 16/36] fix: bls PR fixes --- prover/go.mod | 2 +- prover/go.sum | 4 +-- .../distributed/module_discovery_standard.go | 5 ++- prover/zkevm/limitless.go | 6 ++++ prover/zkevm/prover/bls/zkevm_modules.go | 31 ++++++++++++++----- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/prover/go.mod b/prover/go.mod index 94d1718bfe..b12f349376 100644 --- a/prover/go.mod +++ b/prover/go.mod @@ -5,7 +5,7 @@ go 1.24.6 require ( github.com/bits-and-blooms/bitset v1.24.0 github.com/consensys/compress v0.2.5 - github.com/consensys/gnark v0.14.1-0.20251124124756-6a0918db4556 + github.com/consensys/gnark v0.14.1-0.20251124224808-f1057a2e93b2 github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19 github.com/consensys/go-corset v1.1.28 github.com/crate-crypto/go-kzg-4844 v1.1.0 diff --git a/prover/go.sum b/prover/go.sum index a60f7dae24..57124f75a6 100644 --- a/prover/go.sum +++ b/prover/go.sum @@ -74,8 +74,8 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/consensys/compress v0.2.5 h1:gJr1hKzbOD36JFsF1AN8lfXz1yevnJi1YolffY19Ntk= github.com/consensys/compress v0.2.5/go.mod h1:pyM+ZXiNUh7/0+AUjUf9RKUM6vSH7T/fsn5LLS0j1Tk= -github.com/consensys/gnark v0.14.1-0.20251124124756-6a0918db4556 h1:DLtPn4esNLrqdP0FIZJhPu4yxIzvjSPxEkz68c7R/ew= -github.com/consensys/gnark v0.14.1-0.20251124124756-6a0918db4556/go.mod h1:XBV7LkFSZq5AyQhdEN1Y6ntm/QNdu7lnKNvZnh25O7I= +github.com/consensys/gnark v0.14.1-0.20251124224808-f1057a2e93b2 h1:lKyn1QQCbzRAmLzYlWHj97vWq6voczRbN/UaOctiOxo= +github.com/consensys/gnark v0.14.1-0.20251124224808-f1057a2e93b2/go.mod h1:XBV7LkFSZq5AyQhdEN1Y6ntm/QNdu7lnKNvZnh25O7I= github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19 h1:uUbFaofcFwkv5T/zbR/Gyfm06v84Rua9a1xv9VZrPAA= github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19/go.mod h1:OgCH7cSoJ46c+nOzvQuwOrIE9fawpXMYOQFzj22Vy3E= github.com/consensys/go-corset v1.1.28 h1:4vaaIFAWCzEgGTz6YGm8rt7+0F6mHDT8DS2u+WWslFw= diff --git a/prover/protocol/distributed/module_discovery_standard.go b/prover/protocol/distributed/module_discovery_standard.go index 3eaa187762..6fed9425aa 100644 --- a/prover/protocol/distributed/module_discovery_standard.go +++ b/prover/protocol/distributed/module_discovery_standard.go @@ -1207,7 +1207,10 @@ func countConstraintsOfPlonkCirc(piw *query.PlonkInWizard) int { hasAddGates = piw.PlonkOptions[0].RangeCheckAddGateForRangeCheck } - ccs, _, _ := plonkinternal.CompileCircuitWithRangeCheck(piw.Circuit, hasAddGates) + ccs, _, err := plonkinternal.CompileCircuitWithRangeCheck(piw.Circuit, hasAddGates) + if err != nil { + utils.Panic("unable to compile plonk-in-wizard circuit %s: %v", piw.ID, err) + } nbConstraints := ccs.GetNbConstraints() return nbConstraints } diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index 4eab24337b..80667eb678 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -189,6 +189,7 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ // // ARITH-OPS: MIMC {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7681,MIMC_STACKED_NEW_STATES_0_7682,MIMC_STACKED_OLD_STATES_0_7680_0_LOGDERIVATIVE_M"}, + {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7903,MIMC_STACKED_NEW_STATES_0_7904,MIMC_STACKED_OLD_STATES_0_7902_0_LOGDERIVATIVE_M"}, // ECDSA // @@ -202,6 +203,11 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "TABLE_ecdata.ID,ecdata.INDEX,ecdata.LIMB,ecdata.PHASE,ecdata.SUCCESS_BIT,ecdata.TOTAL_SIZE_0_LOGDERIVATIVE_M"}, {BaseSize: 2048, Cluster: "ELLIPTIC_CURVES", Column: "ECADD_INTEGRATION_ALIGNMENT_PI"}, {BaseSize: 256, Cluster: "ELLIPTIC_CURVES", Column: "ECMUL_INTEGRATION_ALIGNMENT_IS_ACTIVE"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G1_BLS_MSM_CURRENT_ACCUMULATOR_0"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G2_BLS_MSM_CURRENT_ACCUMULATOR_0"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_IS_ACTIVE"}, + {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_ML"}, + {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_FE"}, // ECPAIRING // diff --git a/prover/zkevm/prover/bls/zkevm_modules.go b/prover/zkevm/prover/bls/zkevm_modules.go index b968c97958..c0796415ce 100644 --- a/prover/zkevm/prover/bls/zkevm_modules.go +++ b/prover/zkevm/prover/bls/zkevm_modules.go @@ -1,37 +1,52 @@ package bls import ( + "github.com/consensys/linea-monorepo/prover/protocol/query" "github.com/consensys/linea-monorepo/prover/protocol/wizard" ) func NewG1AddZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsAdd { - return newAdd(comp, G1, limits, newAddDataSource(comp, G1)) + return newAdd(comp, G1, limits, newAddDataSource(comp, G1)). + WithAddCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)). + WithCurveMembershipCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)) } func NewG2AddZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsAdd { - return newAdd(comp, G2, limits, newAddDataSource(comp, G2)) + return newAdd(comp, G2, limits, newAddDataSource(comp, G2)). + WithAddCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)). + WithCurveMembershipCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)) } func NewG1MsmZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsMsm { - return newMsm(comp, G1, limits, newMsmDataSource(comp, G1)) + return newMsm(comp, G1, limits, newMsmDataSource(comp, G1)). + WithMsmCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)). + WithGroupMembershipCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)) } func NewG2MsmZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsMsm { - return newMsm(comp, G2, limits, newMsmDataSource(comp, G2)) + return newMsm(comp, G2, limits, newMsmDataSource(comp, G2)). + WithMsmCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)). + WithGroupMembershipCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)) } func NewPairingZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsPair { - return newPair(comp, limits, newPairDataSource(comp)) + return newPair(comp, limits, newPairDataSource(comp)). + WithPairingCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)). + WithG1MembershipCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)) } func NewG1MapZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsMap { - return newMap(comp, G1, limits, newMapDataSource(comp, G1)) + return newMap(comp, G1, limits, newMapDataSource(comp, G1)). + WithMapCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)) } func NewG2MapZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsMap { - return newMap(comp, G2, limits, newMapDataSource(comp, G2)) + return newMap(comp, G2, limits, newMapDataSource(comp, G2)). + WithMapCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)) } func NewPointEvalZkEvm(comp *wizard.CompiledIOP, limits *Limits) *BlsPointEval { - return newPointEval(comp, limits, newPointEvalDataSource(comp)) + return newPointEval(comp, limits, newPointEvalDataSource(comp)). + WithPointEvalCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)). + WithPointEvalFailureCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)) } From d650f5bb3a55431c0674b5d35826fe236d6562e1 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Mon, 24 Nov 2025 23:20:29 +0000 Subject: [PATCH 17/36] chore: remove duplicate advice --- prover/zkevm/limitless.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index 80667eb678..882f39886c 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -352,14 +352,6 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7903,MIMC_STACKED_NEW_STATES_0_7904,MIMC_STACKED_OLD_STATES_0_7902_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_8105,MIMC_STACKED_NEW_STATES_0_8106,MIMC_STACKED_OLD_STATES_0_8104_0_LOGDERIVATIVE_M"}, - // ELLIPTIC CURVES - // - {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G1_BLS_MSM_CURRENT_ACCUMULATOR_0"}, - {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G2_BLS_MSM_CURRENT_ACCUMULATOR_0"}, - {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_IS_ACTIVE"}, - {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_ML"}, - {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_FE"}, - // HUB-KECCAK (EUCLIDEAN variants) {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT,euc.REMAINDER_0_LOGDERIVATIVE_M"}, {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT_0_LOGDERIVATIVE_M"}, From 598949b8789d099935e1b69d74b176522569b6b1 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Mon, 24 Nov 2025 23:21:22 +0000 Subject: [PATCH 18/36] fix: secp256 PR fixes --- prover/zkevm/prover/p256verify/module.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/prover/zkevm/prover/p256verify/module.go b/prover/zkevm/prover/p256verify/module.go index f6e0693dd5..d0b876c233 100644 --- a/prover/zkevm/prover/p256verify/module.go +++ b/prover/zkevm/prover/p256verify/module.go @@ -79,5 +79,6 @@ func (pv *P256Verify) Assign(run *wizard.ProverRuntime) { } func NewP256VerifyZkEvm(comp *wizard.CompiledIOP, limits *Limits) *P256Verify { - return newP256Verify(comp, limits, newP256VerifyDataSource(comp)) + return newP256Verify(comp, limits, newP256VerifyDataSource(comp)). + WithCircuit(comp, query.PlonkRangeCheckOption(16, 6, true)) } From f8cd1216d187fa9e1cfc71aa71ce10c90f54011f Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Mon, 24 Nov 2025 23:58:40 +0000 Subject: [PATCH 19/36] fix: add missing advice --- prover/zkevm/limitless.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index 882f39886c..280be43c2f 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -205,6 +205,8 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 256, Cluster: "ELLIPTIC_CURVES", Column: "ECMUL_INTEGRATION_ALIGNMENT_IS_ACTIVE"}, {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G1_BLS_MSM_CURRENT_ACCUMULATOR_0"}, {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G2_BLS_MSM_CURRENT_ACCUMULATOR_0"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G1_BLS_MSM_GNARK_DATA_MSM"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G2_BLS_MSM_GNARK_DATA_MSM"}, {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_IS_ACTIVE"}, {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_ML"}, {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_FE"}, @@ -351,6 +353,7 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7883,MIMC_STACKED_NEW_STATES_0_7884,MIMC_STACKED_OLD_STATES_0_7882_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7903,MIMC_STACKED_NEW_STATES_0_7904,MIMC_STACKED_OLD_STATES_0_7902_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_8105,MIMC_STACKED_NEW_STATES_0_8106,MIMC_STACKED_OLD_STATES_0_8104_0_LOGDERIVATIVE_M"}, + {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "MIMC_ROUND_0_SUM_POW4_0_8235"}, // HUB-KECCAK (EUCLIDEAN variants) {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT,euc.REMAINDER_0_LOGDERIVATIVE_M"}, @@ -380,6 +383,39 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7420_64_PATTERN,REPEATED_PATTERN_7420_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7551_20_PATTERN,REPEATED_PATTERN_7551_20_PATTERNPOS_0_LOGDERIVATIVE_M"}, {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7563_64_PATTERN,REPEATED_PATTERN_7563_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7897_32_PATTERN,REPEATED_PATTERN_7897_32_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7905_32_PATTERN,REPEATED_PATTERN_7905_32_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7628_64_PATTERN,REPEATED_PATTERN_7628_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7889_64_PATTERN,REPEATED_PATTERN_7889_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7571_512_PATTERN,REPEATED_PATTERN_7571_512_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 128, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7579_128_PATTERN,REPEATED_PATTERN_7579_128_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 128, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7725_128_PATTERN,REPEATED_PATTERN_7725_128_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 128, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7733_128_PATTERN,REPEATED_PATTERN_7733_128_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 128, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7913_128_PATTERN,REPEATED_PATTERN_7913_128_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 256, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7620_256_PATTERN,REPEATED_PATTERN_7620_256_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 256, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7636_256_PATTERN,REPEATED_PATTERN_7636_256_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 256, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7652_256_PATTERN,REPEATED_PATTERN_7652_256_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7717_512_PATTERN,REPEATED_PATTERN_7717_512_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7873_512_PATTERN,REPEATED_PATTERN_7873_512_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7881_512_PATTERN,REPEATED_PATTERN_7881_512_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 1024, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7644_1024_PATTERN,REPEATED_PATTERN_7644_1024_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7574_512_0_COUNTER"}, + {BaseSize: 128, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7582_128_0_COUNTER"}, + {BaseSize: 256, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7623_256_0_COUNTER"}, + {BaseSize: 64, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7631_64_0_COUNTER"}, + {BaseSize: 256, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7639_256_0_COUNTER"}, + {BaseSize: 1024, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7647_1024_0_COUNTER"}, + {BaseSize: 256, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7655_256_0_COUNTER"}, + {BaseSize: 512, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7720_512_0_COUNTER"}, + {BaseSize: 128, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7728_128_0_COUNTER"}, + {BaseSize: 128, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7736_128_0_COUNTER"}, + {BaseSize: 512, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7876_512_0_COUNTER"}, + {BaseSize: 512, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7884_512_0_COUNTER"}, + {BaseSize: 64, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7892_64_0_COUNTER"}, + {BaseSize: 32, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7900_32_0_COUNTER"}, + {BaseSize: 32, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7908_32_0_COUNTER"}, + {BaseSize: 128, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7916_128_0_COUNTER"}, + // End of new discovery advices for Osaka } From c5c3f7b9a3ae18276cb1ea5998a660cddab09eaa Mon Sep 17 00:00:00 2001 From: gusiri Date: Tue, 25 Nov 2025 02:46:36 +0000 Subject: [PATCH 20/36] fix(prover): enforce BaseSize floor constraint for Plonk circuit modules The size reduction algorithm now respects BaseSize as a minimum floor for submodules with Plonk circuits (NbConstraintsOfPlonkCirc > 0), preventing reduction below the required public input count while still optimizing non-circuit submodules. Fixes panic: nbPub=256 data-size=2 name=MODEXP_LARGE nbPub=384 data-size=256 selector-size=256, name=BLS_ADD_G1_ALIGNMENT --- .../distributed/module_discovery_standard.go | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/prover/protocol/distributed/module_discovery_standard.go b/prover/protocol/distributed/module_discovery_standard.go index 6fed9425aa..c77eb7b6a6 100644 --- a/prover/protocol/distributed/module_discovery_standard.go +++ b/prover/protocol/distributed/module_discovery_standard.go @@ -195,12 +195,11 @@ func (disc *StandardModuleDiscoverer) analyzeWithAdvices(comp *wizard.CompiledIO // weight. for i := range disc.Modules { - // If there's only one submodule, keep the BaseSize from advice as-is. - // The reduction algorithm is meant to balance multiple submodules, but with - // a single submodule, the BaseSize specification is already the answer. - if len(disc.Modules[i].SubModules) == 1 { - continue - } + // Store the original BaseSize from advice for each submodule as the minimum allowed size. + // For submodules with Plonk circuits, BaseSize represents the required number of public + // inputs and must not be reduced. + baseSizes := make([]int, len(disc.Modules[i].NewSizes)) + copy(baseSizes, disc.Modules[i].NewSizes) // weightTotalInitial is the weight of the module using the initial // number of rows. @@ -236,6 +235,11 @@ func (disc *StandardModuleDiscoverer) analyzeWithAdvices(comp *wizard.CompiledIO numRow := disc.Modules[i].NewSizes[j] if !disc.Modules[i].SubModules[j].HasPrecomputed { numRow /= reduction + // Only enforce BaseSize floor for submodules with Plonk circuits, as they have + // strict requirements for the number of public inputs matching the circuit size + if disc.Modules[i].SubModules[j].NbConstraintsOfPlonkCirc > 0 && numRow < baseSizes[j] { + numRow = baseSizes[j] + } } if numRow < 1 { @@ -256,6 +260,10 @@ func (disc *StandardModuleDiscoverer) analyzeWithAdvices(comp *wizard.CompiledIO for j := range disc.Modules[i].SubModules { if !disc.Modules[i].SubModules[j].HasPrecomputed { disc.Modules[i].NewSizes[j] /= bestReduction + // Only enforce BaseSize floor for submodules with Plonk circuits + if disc.Modules[i].SubModules[j].NbConstraintsOfPlonkCirc > 0 && disc.Modules[i].NewSizes[j] < baseSizes[j] { + disc.Modules[i].NewSizes[j] = baseSizes[j] + } } } } From 0f4bf215570737c92f3e064dcab46d44a398ad63 Mon Sep 17 00:00:00 2001 From: gusiri Date: Tue, 25 Nov 2025 02:51:39 +0000 Subject: [PATCH 21/36] chore: put new osaka advices together for readability --- prover/zkevm/limitless.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index 280be43c2f..bf9a606722 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -189,7 +189,6 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ // // ARITH-OPS: MIMC {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7681,MIMC_STACKED_NEW_STATES_0_7682,MIMC_STACKED_OLD_STATES_0_7680_0_LOGDERIVATIVE_M"}, - {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7903,MIMC_STACKED_NEW_STATES_0_7904,MIMC_STACKED_OLD_STATES_0_7902_0_LOGDERIVATIVE_M"}, // ECDSA // @@ -203,13 +202,6 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "TABLE_ecdata.ID,ecdata.INDEX,ecdata.LIMB,ecdata.PHASE,ecdata.SUCCESS_BIT,ecdata.TOTAL_SIZE_0_LOGDERIVATIVE_M"}, {BaseSize: 2048, Cluster: "ELLIPTIC_CURVES", Column: "ECADD_INTEGRATION_ALIGNMENT_PI"}, {BaseSize: 256, Cluster: "ELLIPTIC_CURVES", Column: "ECMUL_INTEGRATION_ALIGNMENT_IS_ACTIVE"}, - {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G1_BLS_MSM_CURRENT_ACCUMULATOR_0"}, - {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G2_BLS_MSM_CURRENT_ACCUMULATOR_0"}, - {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G1_BLS_MSM_GNARK_DATA_MSM"}, - {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G2_BLS_MSM_GNARK_DATA_MSM"}, - {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_IS_ACTIVE"}, - {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_ML"}, - {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_FE"}, // ECPAIRING // @@ -307,7 +299,6 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_ROLLING_MSG_EXTRACTED_HI"}, {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_ROLLING_HASH_EXTRACTED_HI"}, {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_ROLLING_SEL_EXISTS_MSG"}, - {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_CHAIN_ID_FETCHER_N_BYTES_CHAIN_ID"}, {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "BLOCK_TX_METADATA_BLOCK_ID"}, {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_TXN_DATA_FETCHER_ABS_TX_NUM"}, {BaseSize: 16384, Cluster: "TINY-STUFFS", Column: "STATE_SUMMARY_WORLD_STATE_ROOT"}, @@ -352,9 +343,20 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7873,MIMC_STACKED_NEW_STATES_0_7874,MIMC_STACKED_OLD_STATES_0_7872_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7883,MIMC_STACKED_NEW_STATES_0_7884,MIMC_STACKED_OLD_STATES_0_7882_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7903,MIMC_STACKED_NEW_STATES_0_7904,MIMC_STACKED_OLD_STATES_0_7902_0_LOGDERIVATIVE_M"}, + {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7903,MIMC_STACKED_NEW_STATES_0_7904,MIMC_STACKED_OLD_STATES_0_7902_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_8105,MIMC_STACKED_NEW_STATES_0_8106,MIMC_STACKED_OLD_STATES_0_8104_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "MIMC_ROUND_0_SUM_POW4_0_8235"}, + // ELLIPTIC CURVES + // + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G1_BLS_MSM_CURRENT_ACCUMULATOR_0"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G2_BLS_MSM_CURRENT_ACCUMULATOR_0"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G1_BLS_MSM_GNARK_DATA_MSM"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_G2_BLS_MSM_GNARK_DATA_MSM"}, + {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_IS_ACTIVE"}, + {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_ML"}, + {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_FE"}, + // HUB-KECCAK (EUCLIDEAN variants) {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT,euc.REMAINDER_0_LOGDERIVATIVE_M"}, {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT_0_LOGDERIVATIVE_M"}, @@ -416,6 +418,9 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 32, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7908_32_0_COUNTER"}, {BaseSize: 128, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7916_128_0_COUNTER"}, + // TINY-STUFFS + // + {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_CHAIN_ID_FETCHER_N_BYTES_CHAIN_ID"}, // End of new discovery advices for Osaka } From 5549d3e4c61193a208ea9b044977a7828b237b83 Mon Sep 17 00:00:00 2001 From: gusiri Date: Tue, 25 Nov 2025 05:10:55 +0000 Subject: [PATCH 22/36] fix(prover): register BLS and P256 circuit types for serialization Register all missing BLS and P256 circuit types in the serialization registry to fix TestSerdeZKEVMFull failures. The serialization requires explicit registration of all types that may be serialized as interface implementations. BLS and P256verify packages use private (lowercase) circuit types that need to be exported via type aliases for registration. Changes: - Add prover/zkevm/prover/bls/serialization_types.go - Export all BLS circuit type instantiations (G1/G2 variants) - Covers Add, Mul, Map, Checkable (group/curve), MillerLoop, and PointEval circuits - Add prover/zkevm/prover/p256verify/serialization_types.go - Export P256 verification circuit type - Update prover/protocol/serialization/implementation_registry.go - Import bls and p256verify packages - Register all exported BLS circuit types - Register P256 verification circuit type --- .../serialization/implementation_registry.go | 23 ++++++++ .../zkevm/prover/bls/serialization_types.go | 53 +++++++++++++++++++ .../prover/p256verify/serialization_types.go | 4 ++ 3 files changed, 80 insertions(+) create mode 100644 prover/zkevm/prover/bls/serialization_types.go create mode 100644 prover/zkevm/prover/p256verify/serialization_types.go diff --git a/prover/protocol/serialization/implementation_registry.go b/prover/protocol/serialization/implementation_registry.go index ded6f39f55..00d5aa91ff 100644 --- a/prover/protocol/serialization/implementation_registry.go +++ b/prover/protocol/serialization/implementation_registry.go @@ -44,6 +44,7 @@ import ( "github.com/consensys/linea-monorepo/prover/symbolic" "github.com/consensys/linea-monorepo/prover/utils" "github.com/consensys/linea-monorepo/prover/utils/collection" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/bls" "github.com/consensys/linea-monorepo/prover/zkevm/prover/common" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecarith" "github.com/consensys/linea-monorepo/prover/zkevm/prover/ecdsa" @@ -55,6 +56,7 @@ import ( "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/packing" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/sha2" "github.com/consensys/linea-monorepo/prover/zkevm/prover/modexp" + "github.com/consensys/linea-monorepo/prover/zkevm/prover/p256verify" ded "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/packing/dedicated" "github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/packing/dedicated/spaghettifier" @@ -160,6 +162,27 @@ func init() { RegisterImplementation(ecpair.MultiMillerLoopFinalExpCircuit{}) RegisterImplementation(sha2.SHA2Circuit{}) + // BLS circuit implementations - register concrete generic instantiations + // These types are needed for serializing BLS circuits with their specific type parameters + // Register zero-value instances so the serialization system can identify the types + RegisterImplementation(bls.MultiAddCircuitG1{}) + RegisterImplementation(bls.MultiMulCircuitG1{}) + RegisterImplementation(bls.MultiMapCircuitG1{}) + RegisterImplementation(bls.MultiAddCircuitG2{}) + RegisterImplementation(bls.MultiMulCircuitG2{}) + RegisterImplementation(bls.MultiMapCircuitG2{}) + RegisterImplementation(bls.MultiCheckableG1NonGroup{}) + RegisterImplementation(bls.MultiCheckableG1NonCurve{}) + RegisterImplementation(bls.MultiCheckableG2NonGroup{}) + RegisterImplementation(bls.MultiCheckableG2NonCurve{}) + RegisterImplementation(bls.MultiMillerLoopMulCircuit{}) + RegisterImplementation(bls.MultiMillerLoopFinalExpCircuit{}) + RegisterImplementation(bls.MultiPointEvalCircuit{}) + RegisterImplementation(bls.MultiPointEvalFailureCircuit{}) + + // P256 verify circuit implementations + RegisterImplementation(p256verify.MultiP256VerifyInstanceCircuit{}) + // Dedicated and common types RegisterImplementation(byte32cmp.MultiLimbCmp{}) RegisterImplementation(byte32cmp.OneLimbCmpCtx{}) diff --git a/prover/zkevm/prover/bls/serialization_types.go b/prover/zkevm/prover/bls/serialization_types.go new file mode 100644 index 0000000000..fa5f68ee7b --- /dev/null +++ b/prover/zkevm/prover/bls/serialization_types.go @@ -0,0 +1,53 @@ +package bls + +import ( + "github.com/consensys/gnark/std/algebra/emulated/sw_bls12381" + "github.com/consensys/gnark/std/algebra/emulated/sw_emulated" + "github.com/consensys/gnark/std/math/emulated/emparams" +) + +// Type aliases for serialization registration +// These provide access to the concrete generic types needed by the serialization package + +type ( + // G1 circuit types with sw_emulated.AffinePoint + MultiAddCircuitG1 = multiAddCircuit[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]] + MultiMulCircuitG1 = multiMulCircuit[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]] + MultiMapCircuitG1 = multiMapCircuit[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]] + MultiCheckableG1NonGroup = multiCheckableCircuit[nonGroupMembershipInstance[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]]] + MultiCheckableG1NonCurve = multiCheckableCircuit[nonCurveMembershipInstance[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]]] + + // G2 circuit types + MultiAddCircuitG2 = multiAddCircuit[g2ElementWizard, sw_bls12381.G2Affine] + MultiMulCircuitG2 = multiMulCircuit[g2ElementWizard, sw_bls12381.G2Affine] + MultiMapCircuitG2 = multiMapCircuit[g2ElementWizard, sw_bls12381.G2Affine] + MultiCheckableG2NonGroup = multiCheckableCircuit[nonGroupMembershipInstance[g2ElementWizard, sw_bls12381.G2Affine]] + MultiCheckableG2NonCurve = multiCheckableCircuit[nonCurveMembershipInstance[g2ElementWizard, sw_bls12381.G2Affine]] + + // Non-generic pairing and point eval circuits + MultiMillerLoopMulCircuit = multiMillerLoopMulCircuit + MultiMillerLoopFinalExpCircuit = multiMillerLoopFinalExpCircuit + MultiPointEvalCircuit = multiPointEvalCircuit + MultiPointEvalFailureCircuit = multiPointEvalFailureCircuit +) + +// Constructor functions for serialization registration +func NewMultiAddCircuitG1() *MultiAddCircuitG1 { + return &MultiAddCircuitG1{} +} + +func NewMultiMulCircuitG1() *MultiMulCircuitG1 { + return &MultiMulCircuitG1{} +} + +func NewMultiMulCircuitG2() *MultiMulCircuitG2 { + return &MultiMulCircuitG2{} +} + +func NewMultiCheckableCircuitG1NonGroup() *MultiCheckableG1NonGroup { + return &MultiCheckableG1NonGroup{} +} + +func NewMultiCheckableCircuitG2NonGroup() *MultiCheckableG2NonGroup { + return &MultiCheckableG2NonGroup{} +} diff --git a/prover/zkevm/prover/p256verify/serialization_types.go b/prover/zkevm/prover/p256verify/serialization_types.go new file mode 100644 index 0000000000..912dbf59e0 --- /dev/null +++ b/prover/zkevm/prover/p256verify/serialization_types.go @@ -0,0 +1,4 @@ +package p256verify + +// Type alias for serialization registration +type MultiP256VerifyInstanceCircuit = multiP256VerifyInstanceCircuit From a91d33dd8299b4edf4060f44c7a1e1c65095cc9e Mon Sep 17 00:00:00 2001 From: gusiri Date: Tue, 25 Nov 2025 11:15:13 +0000 Subject: [PATCH 23/36] fix(prover): export BLS and P256 fields for serialization Export private fields in BLS and P256verify modules to fix serialization errors in TestSerdeZKEVMFull. The serialization system cannot access private (lowercase) struct fields. This was causing warnings during serialization/deserialization: === RUN TestSerdeZKEVMFull time="2025-11-25T10:32:12Z" level=info msg="Starting to serialize:ZkEVM \n" field bls.BlsAdd.blsAddDataSource is not exported field bls.BlsAdd.alignedAddGnarkData is not exported field bls.BlsAdd.alignedCurveMembershipGnarkData is not exported field bls.BlsAdd.group is not exported field bls.BlsAdd.blsAddDataSource is not exported field bls.BlsAdd.alignedAddGnarkData is not exported field bls.BlsAdd.alignedCurveMembershipGnarkData is not exported field bls.BlsAdd.group is not exported field bls.BlsMsm.blsMsmDataSource is not exported field bls.BlsMsm.unalignedMsmData is not exported field bls.BlsMsm.group is not exported field bls.BlsMsm.blsMsmDataSource is not exported field bls.BlsMsm.unalignedMsmData is not exported field bls.BlsMsm.group is not exported field bls.BlsMap.blsMapDataSource is not exported field bls.BlsMap.alignedGnarkData is not exported field bls.BlsMap.group is not exported field bls.BlsMap.blsMapDataSource is not exported field bls.BlsMap.alignedGnarkData is not exported field bls.BlsMap.group is not exported field bls.BlsPair.blsPairDataSource is not exported field bls.BlsPair.unalignedPairData is not exported field bls.BlsPair.alignedMillerLoopData is not exported field bls.BlsPair.alignedFinalExpData is not exported field bls.BlsPair.alignedG1MembershipGnarkData is not exported field bls.BlsPair.alignedG2MembershipGnarkData is not exported field bls.BlsPointEval.blsPointEvalDataSource is not exported field bls.BlsPointEval.alignedGnarkData is not exported field bls.BlsPointEval.alignedFailureGnarkData is not exported field p256verify.P256Verify.p256VerifyDataSource is not exported field p256verify.P256Verify.p256VerifyGnarkData is not exported --- prover/zkevm/prover/bls/bls.go | 10 +- prover/zkevm/prover/bls/circuits_add.go | 4 +- prover/zkevm/prover/bls/circuits_element.go | 2 +- prover/zkevm/prover/bls/circuits_maps.go | 4 +- .../zkevm/prover/bls/circuits_membership.go | 2 +- prover/zkevm/prover/bls/circuits_msm.go | 4 +- prover/zkevm/prover/bls/input_fillers.go | 6 +- prover/zkevm/prover/bls/limits.go | 10 +- prover/zkevm/prover/bls/module_add.go | 56 ++++----- prover/zkevm/prover/bls/module_add_test.go | 4 +- prover/zkevm/prover/bls/module_map.go | 38 +++--- prover/zkevm/prover/bls/module_map_test.go | 4 +- prover/zkevm/prover/bls/module_msm.go | 115 +++++++++--------- prover/zkevm/prover/bls/module_msm_test.go | 4 +- prover/zkevm/prover/bls/module_pair.go | 112 ++++++++--------- prover/zkevm/prover/bls/module_pair_test.go | 2 +- prover/zkevm/prover/bls/module_pointeval.go | 40 +++--- .../zkevm/prover/bls/module_pointeval_test.go | 2 +- prover/zkevm/prover/bls/native_ops.go | 2 +- prover/zkevm/prover/p256verify/circuit.go | 6 +- prover/zkevm/prover/p256verify/module.go | 26 ++-- prover/zkevm/prover/p256verify/module_test.go | 2 +- 22 files changed, 227 insertions(+), 228 deletions(-) diff --git a/prover/zkevm/prover/bls/bls.go b/prover/zkevm/prover/bls/bls.go index a0521fd516..cb86d885d1 100644 --- a/prover/zkevm/prover/bls/bls.go +++ b/prover/zkevm/prover/bls/bls.go @@ -11,10 +11,10 @@ const ( moduleName = "blsdata" ) -type group int +type Group int const ( - G1 group = iota + G1 Group = iota G2 ) @@ -27,7 +27,7 @@ const ( const ROUND_NR = 0 -func (g group) String() string { +func (g Group) String() string { switch g { case G1: return "G1" @@ -38,7 +38,7 @@ func (g group) String() string { } } -func (g group) StringCurve() string { +func (g Group) StringCurve() string { switch g { case G1: return "C1" @@ -49,7 +49,7 @@ func (g group) StringCurve() string { } } -func (g group) StringMap() string { +func (g Group) StringMap() string { switch g { case G1: return "FP" diff --git a/prover/zkevm/prover/bls/circuits_add.go b/prover/zkevm/prover/bls/circuits_add.go index 88d8fe9b7f..399afafce5 100644 --- a/prover/zkevm/prover/bls/circuits_add.go +++ b/prover/zkevm/prover/bls/circuits_add.go @@ -14,7 +14,7 @@ const ( nbRowsPerG2Add = 3 * nbG2Limbs // 2 for the inputs, 1 for the output ) -func nbRowsPerAdd(g group) int { +func nbRowsPerAdd(g Group) int { switch g { case G1: return nbRowsPerG1Add @@ -61,7 +61,7 @@ func (c *multiAddCircuit[C, T]) Define(api frontend.API) error { return nil } -func newAddCircuit(g group, limits *Limits) frontend.Circuit { +func newAddCircuit(g Group, limits *Limits) frontend.Circuit { switch g { case G1: return &multiAddCircuit[g1ElementWizard, sw_bls12381.G1Affine]{Instances: make([]addInstance[g1ElementWizard, sw_bls12381.G1Affine], limits.NbG1AddInputInstances)} diff --git a/prover/zkevm/prover/bls/circuits_element.go b/prover/zkevm/prover/bls/circuits_element.go index ea21d85729..ccacd72640 100644 --- a/prover/zkevm/prover/bls/circuits_element.go +++ b/prover/zkevm/prover/bls/circuits_element.go @@ -28,7 +28,7 @@ const ( nbGtLimbs = 12 * nbFpLimbs // representation according to gnark - we don't use Gt in arithmetization, only in glue for accumulation ) -func nbLimbs(g group) int { +func nbLimbs(g Group) int { switch g { case G1: return nbG1Limbs diff --git a/prover/zkevm/prover/bls/circuits_maps.go b/prover/zkevm/prover/bls/circuits_maps.go index 2ed0dc08d0..e0676af9c4 100644 --- a/prover/zkevm/prover/bls/circuits_maps.go +++ b/prover/zkevm/prover/bls/circuits_maps.go @@ -15,7 +15,7 @@ const ( nbRowsPerG2Map = 2*nbFpLimbs + nbG2Limbs // input is Fp2 element and expected output is G2 element ) -func nbRowsPerMap(g group) int { +func nbRowsPerMap(g Group) int { switch g { case G1: return nbRowsPerG1Map @@ -71,7 +71,7 @@ func (c *multiMapCircuit[C, T]) Define(api frontend.API) error { return nil } -func NewMapCircuit(g group, limits *Limits) frontend.Circuit { +func NewMapCircuit(g Group, limits *Limits) frontend.Circuit { switch g { case G1: res := &multiMapCircuit[g1ElementWizard, sw_bls12381.G1Affine]{ diff --git a/prover/zkevm/prover/bls/circuits_membership.go b/prover/zkevm/prover/bls/circuits_membership.go index e1a0dac19b..7e72f0b2ef 100644 --- a/prover/zkevm/prover/bls/circuits_membership.go +++ b/prover/zkevm/prover/bls/circuits_membership.go @@ -86,7 +86,7 @@ func newMultiCheckableCircuit[T checkableInstance](nbInstances int) *multiChecka } } -func newCheckCircuit(g group, membership membership, limits *Limits) frontend.Circuit { +func newCheckCircuit(g Group, membership membership, limits *Limits) frontend.Circuit { switch g { case G1: switch membership { diff --git a/prover/zkevm/prover/bls/circuits_msm.go b/prover/zkevm/prover/bls/circuits_msm.go index e2256fed9a..16888e1fac 100644 --- a/prover/zkevm/prover/bls/circuits_msm.go +++ b/prover/zkevm/prover/bls/circuits_msm.go @@ -14,7 +14,7 @@ const ( nbRowsPerG2Mul = nbFrLimbs + 3*nbG2Limbs // 1 scalar, 1 point, 1 previous accumulator, 1 next accumulator ) -func nbRowsPerMul(g group) int { +func nbRowsPerMul(g Group) int { switch g { case G1: return nbRowsPerG1Mul @@ -73,7 +73,7 @@ func (c *multiMulCircuit[C, T]) Define(api frontend.API) error { return nil } -func newMulCircuit(g group, limits *Limits) frontend.Circuit { +func newMulCircuit(g Group, limits *Limits) frontend.Circuit { switch g { case G1: return &multiMulCircuit[g1ElementWizard, sw_bls12381.G1Affine]{Instances: make([]mulInstance[g1ElementWizard, sw_bls12381.G1Affine], limits.NbG1MulInputInstances)} diff --git a/prover/zkevm/prover/bls/input_fillers.go b/prover/zkevm/prover/bls/input_fillers.go index fd752b635a..a485efb94e 100644 --- a/prover/zkevm/prover/bls/input_fillers.go +++ b/prover/zkevm/prover/bls/input_fillers.go @@ -27,7 +27,7 @@ func init() { plonk.RegisterInputFiller(pointEvalFailureInputFillerKey, inputFillerPointEvaluationFailure) } -func membershipInputFillerKey(g group, m membership) string { +func membershipInputFillerKey(g Group, m membership) string { base := "bls12381-%s-membership-input-filler" switch m { case CURVE: @@ -39,7 +39,7 @@ func membershipInputFillerKey(g group, m membership) string { } } -func newMembershipInputFiller(g group, _ membership) plonk.InputFiller { +func newMembershipInputFiller(g Group, _ membership) plonk.InputFiller { // we generate points not on curve --> also not in group return func(circuitInstance, inputIndex int) field.Element { nbL := nbLimbs(g) @@ -137,7 +137,7 @@ func inputFillerFinalExp(circuitInstance, inputIndex int) field.Element { return res } -func mapToGroupInputFillerKey(g group) string { +func mapToGroupInputFillerKey(g Group) string { return fmt.Sprintf("bls12381-map-%s-to-%s-input-filler", g.StringMap(), g.String()) } diff --git a/prover/zkevm/prover/bls/limits.go b/prover/zkevm/prover/bls/limits.go index ab27b6b7d1..7ca2a0853e 100644 --- a/prover/zkevm/prover/bls/limits.go +++ b/prover/zkevm/prover/bls/limits.go @@ -52,7 +52,7 @@ type Limits struct { NbPointEvalFailureInputInstances int } -func (l *Limits) nbAddInputInstances(g group) int { +func (l *Limits) nbAddInputInstances(g Group) int { switch g { case G1: return l.NbG1AddInputInstances @@ -63,7 +63,7 @@ func (l *Limits) nbAddInputInstances(g group) int { } } -func (l *Limits) nbMapInputInstances(g group) int { +func (l *Limits) nbMapInputInstances(g Group) int { switch g { case G1: return l.NbG1MapToInputInstances @@ -74,7 +74,7 @@ func (l *Limits) nbMapInputInstances(g group) int { } } -func (l *Limits) nbMulInputInstances(g group) int { +func (l *Limits) nbMulInputInstances(g Group) int { switch g { case G1: return l.NbG1MulInputInstances @@ -85,7 +85,7 @@ func (l *Limits) nbMulInputInstances(g group) int { } } -func (l *Limits) nbCurveMembershipInputInstances(g group) int { +func (l *Limits) nbCurveMembershipInputInstances(g Group) int { switch g { case G1: return l.NbC1MembershipInputInstances @@ -96,7 +96,7 @@ func (l *Limits) nbCurveMembershipInputInstances(g group) int { } } -func (l *Limits) nbGroupMembershipInputInstances(g group) int { +func (l *Limits) nbGroupMembershipInputInstances(g Group) int { switch g { case G1: return l.NbG1MembershipInputInstances diff --git a/prover/zkevm/prover/bls/module_add.go b/prover/zkevm/prover/bls/module_add.go index 516d54b8b0..cd7d0a3f47 100644 --- a/prover/zkevm/prover/bls/module_add.go +++ b/prover/zkevm/prover/bls/module_add.go @@ -13,7 +13,7 @@ const ( NAME_BLS_ADD = "BLS_ADD" ) -type blsAddDataSource struct { +type BlsAddDataSource struct { ID ifaces.Column CsAdd ifaces.Column CsCurveMembership ifaces.Column @@ -24,8 +24,8 @@ type blsAddDataSource struct { IsRes ifaces.Column } -func newAddDataSource(comp *wizard.CompiledIOP, g group) *blsAddDataSource { - return &blsAddDataSource{ +func newAddDataSource(comp *wizard.CompiledIOP, g Group) *BlsAddDataSource { + return &BlsAddDataSource{ ID: comp.Columns.GetHandle(colNameFn("ID")), CsAdd: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_BLS_" + g.String() + "_ADD")), Limb: comp.Columns.GetHandle(colNameFn("LIMB")), @@ -38,19 +38,19 @@ func newAddDataSource(comp *wizard.CompiledIOP, g group) *blsAddDataSource { } type BlsAdd struct { - *blsAddDataSource - alignedAddGnarkData *plonk.Alignment - alignedCurveMembershipGnarkData *plonk.Alignment + *BlsAddDataSource + AlignedAddGnarkData *plonk.Alignment + AlignedCurveMembershipGnarkData *plonk.Alignment *Limits - group + Group } -func newAdd(_ *wizard.CompiledIOP, g group, limits *Limits, src *blsAddDataSource) *BlsAdd { +func newAdd(_ *wizard.CompiledIOP, g Group, limits *Limits, src *BlsAddDataSource) *BlsAdd { res := &BlsAdd{ - blsAddDataSource: src, + BlsAddDataSource: src, Limits: limits, - group: g, + Group: g, } return res @@ -60,44 +60,44 @@ func (ba *BlsAdd) WithAddCircuit(comp *wizard.CompiledIOP, options ...query.Plon // the gnark circuit takes exactly the same rows as provided by the arithmetization. So // to get the bound on the number of circuits we just need to divide by the size of the // addition circuit input instances - maxNbInstances := ba.blsAddDataSource.CsAdd.Size() / nbRowsPerAdd(ba.group) - maxNbCircuits := maxNbInstances/ba.Limits.nbAddInputInstances(ba.group) + 1 + maxNbInstances := ba.BlsAddDataSource.CsAdd.Size() / nbRowsPerAdd(ba.Group) + maxNbCircuits := maxNbInstances/ba.Limits.nbAddInputInstances(ba.Group) + 1 toAlignAdd := &plonk.CircuitAlignmentInput{ - Name: fmt.Sprintf("%s_%s_ALIGNMENT", NAME_BLS_ADD, ba.group.String()), + Name: fmt.Sprintf("%s_%s_ALIGNMENT", NAME_BLS_ADD, ba.Group.String()), Round: ROUND_NR, - DataToCircuitMask: ba.blsAddDataSource.CsAdd, - DataToCircuit: ba.blsAddDataSource.Limb, - Circuit: newAddCircuit(ba.group, ba.Limits), + DataToCircuitMask: ba.BlsAddDataSource.CsAdd, + DataToCircuit: ba.BlsAddDataSource.Limb, + Circuit: newAddCircuit(ba.Group, ba.Limits), NbCircuitInstances: maxNbCircuits, PlonkOptions: options, } - ba.alignedAddGnarkData = plonk.DefineAlignment(comp, toAlignAdd) + ba.AlignedAddGnarkData = plonk.DefineAlignment(comp, toAlignAdd) return ba } func (ba *BlsAdd) WithCurveMembershipCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsAdd { - maxNbCircuits := ba.blsAddDataSource.CsCurveMembership.Size() / ba.Limits.nbCurveMembershipInputInstances(ba.group) + maxNbCircuits := ba.BlsAddDataSource.CsCurveMembership.Size() / ba.Limits.nbCurveMembershipInputInstances(ba.Group) toAlignCurveMembership := &plonk.CircuitAlignmentInput{ - Name: fmt.Sprintf("%s_%s_CURVE_MEMBERSHIP_ALIGNMENT", NAME_BLS_ADD, ba.group.StringCurve()), + Name: fmt.Sprintf("%s_%s_CURVE_MEMBERSHIP_ALIGNMENT", NAME_BLS_ADD, ba.Group.StringCurve()), Round: ROUND_NR, - DataToCircuitMask: ba.blsAddDataSource.CsCurveMembership, - DataToCircuit: ba.blsAddDataSource.Limb, - Circuit: newCheckCircuit(ba.group, CURVE, ba.Limits), + DataToCircuitMask: ba.BlsAddDataSource.CsCurveMembership, + DataToCircuit: ba.BlsAddDataSource.Limb, + Circuit: newCheckCircuit(ba.Group, CURVE, ba.Limits), NbCircuitInstances: maxNbCircuits, PlonkOptions: options, - InputFillerKey: membershipInputFillerKey(ba.group, CURVE), + InputFillerKey: membershipInputFillerKey(ba.Group, CURVE), } - ba.alignedCurveMembershipGnarkData = plonk.DefineAlignment(comp, toAlignCurveMembership) + ba.AlignedCurveMembershipGnarkData = plonk.DefineAlignment(comp, toAlignCurveMembership) return ba } func (ba *BlsAdd) Assign(run *wizard.ProverRuntime) { - if ba.alignedAddGnarkData != nil { - ba.alignedAddGnarkData.Assign(run) + if ba.AlignedAddGnarkData != nil { + ba.AlignedAddGnarkData.Assign(run) } - if ba.alignedCurveMembershipGnarkData != nil { - ba.alignedCurveMembershipGnarkData.Assign(run) + if ba.AlignedCurveMembershipGnarkData != nil { + ba.AlignedCurveMembershipGnarkData.Assign(run) } } diff --git a/prover/zkevm/prover/bls/module_add_test.go b/prover/zkevm/prover/bls/module_add_test.go index 0e010ccfa7..101a9e9c42 100644 --- a/prover/zkevm/prover/bls/module_add_test.go +++ b/prover/zkevm/prover/bls/module_add_test.go @@ -11,7 +11,7 @@ import ( "github.com/consensys/linea-monorepo/prover/utils/csvtraces" ) -func testBlsAdd(t *testing.T, withCircuit bool, g group, path string, limits *Limits) { +func testBlsAdd(t *testing.T, withCircuit bool, g Group, path string, limits *Limits) { f, err := os.Open(path) if errors.Is(err, os.ErrNotExist) { t.Fatal("csv file does not exist, please run `go generate` to generate the test data") @@ -27,7 +27,7 @@ func testBlsAdd(t *testing.T, withCircuit bool, g group, path string, limits *Li var blsAdd *BlsAdd cmp := wizard.Compile( func(b *wizard.Builder) { - blsAddSource := &blsAddDataSource{ + blsAddSource := &BlsAddDataSource{ CsAdd: ct.GetCommit(b, "CIRCUIT_SELECTOR_"+g.String()+"_ADD"), Limb: ct.GetCommit(b, "LIMB"), Index: ct.GetCommit(b, "INDEX"), diff --git a/prover/zkevm/prover/bls/module_map.go b/prover/zkevm/prover/bls/module_map.go index 798bb504ba..e1b5cf3f4f 100644 --- a/prover/zkevm/prover/bls/module_map.go +++ b/prover/zkevm/prover/bls/module_map.go @@ -13,7 +13,7 @@ const ( NAME_BLS_MAP = "BLS_MAP" ) -type blsMapDataSource struct { +type BlsMapDataSource struct { ID ifaces.Column CsMap ifaces.Column Limb ifaces.Column @@ -23,14 +23,14 @@ type blsMapDataSource struct { IsRes ifaces.Column } -func newMapDataSource(comp *wizard.CompiledIOP, g group) *blsMapDataSource { +func newMapDataSource(comp *wizard.CompiledIOP, g Group) *BlsMapDataSource { var mapString string if g == G1 { mapString = "MAP_FP_TO_G1" } else { mapString = "MAP_FP2_TO_G2" } - return &blsMapDataSource{ + return &BlsMapDataSource{ ID: comp.Columns.GetHandle(colNameFn("ID")), CsMap: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_BLS_" + mapString)), Index: comp.Columns.GetHandle(colNameFn("INDEX")), @@ -42,17 +42,17 @@ func newMapDataSource(comp *wizard.CompiledIOP, g group) *blsMapDataSource { } type BlsMap struct { - *blsMapDataSource - alignedGnarkData *plonk.Alignment + *BlsMapDataSource + AlignedGnarkData *plonk.Alignment *Limits - group + Group } -func newMap(_ *wizard.CompiledIOP, g group, limits *Limits, src *blsMapDataSource) *BlsMap { +func newMap(_ *wizard.CompiledIOP, g Group, limits *Limits, src *BlsMapDataSource) *BlsMap { res := &BlsMap{ - blsMapDataSource: src, + BlsMapDataSource: src, Limits: limits, - group: g, + Group: g, } return res } @@ -60,24 +60,24 @@ func newMap(_ *wizard.CompiledIOP, g group, limits *Limits, src *blsMapDataSourc func (bm *BlsMap) WithMapCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsMap { // gnark circuits takes the inputs as is. To get the bound on the number of circuits we need // to divide the maximum number of inputs instances with the number of instances per circuit - maxNbInstances := bm.blsMapDataSource.CsMap.Size() / nbRowsPerMap(bm.group) - maxNbCircuits := maxNbInstances/bm.Limits.nbMapInputInstances(bm.group) + 1 + maxNbInstances := bm.BlsMapDataSource.CsMap.Size() / nbRowsPerMap(bm.Group) + maxNbCircuits := maxNbInstances/bm.Limits.nbMapInputInstances(bm.Group) + 1 toAlign := &plonk.CircuitAlignmentInput{ - Name: fmt.Sprintf("%s_%s_ALIGNMENT", NAME_BLS_MAP, bm.group.String()), + Name: fmt.Sprintf("%s_%s_ALIGNMENT", NAME_BLS_MAP, bm.Group.String()), Round: ROUND_NR, - DataToCircuitMask: bm.blsMapDataSource.CsMap, - DataToCircuit: bm.blsMapDataSource.Limb, - Circuit: NewMapCircuit(bm.group, bm.Limits), + DataToCircuitMask: bm.BlsMapDataSource.CsMap, + DataToCircuit: bm.BlsMapDataSource.Limb, + Circuit: NewMapCircuit(bm.Group, bm.Limits), NbCircuitInstances: maxNbCircuits, - InputFillerKey: mapToGroupInputFillerKey(bm.group), + InputFillerKey: mapToGroupInputFillerKey(bm.Group), PlonkOptions: options, } - bm.alignedGnarkData = plonk.DefineAlignment(comp, toAlign) + bm.AlignedGnarkData = plonk.DefineAlignment(comp, toAlign) return bm } func (bm *BlsMap) Assign(run *wizard.ProverRuntime) { - if bm.alignedGnarkData != nil { - bm.alignedGnarkData.Assign(run) + if bm.AlignedGnarkData != nil { + bm.AlignedGnarkData.Assign(run) } } diff --git a/prover/zkevm/prover/bls/module_map_test.go b/prover/zkevm/prover/bls/module_map_test.go index 965577ceb1..35ed8f5124 100644 --- a/prover/zkevm/prover/bls/module_map_test.go +++ b/prover/zkevm/prover/bls/module_map_test.go @@ -11,7 +11,7 @@ import ( "github.com/consensys/linea-monorepo/prover/utils/csvtraces" ) -func testBlsMap(t *testing.T, withCircuit bool, g group, path string, limits *Limits) { +func testBlsMap(t *testing.T, withCircuit bool, g Group, path string, limits *Limits) { f, err := os.Open(path) if errors.Is(err, os.ErrNotExist) { t.Fatal("csv file does not exist, please run `go generate` to generate the test data") @@ -33,7 +33,7 @@ func testBlsMap(t *testing.T, withCircuit bool, g group, path string, limits *Li var blsMap *BlsMap cmp := wizard.Compile( func(b *wizard.Builder) { - blsMapSource := &blsMapDataSource{ + blsMapSource := &BlsMapDataSource{ ID: ct.GetCommit(b, "ID"), CsMap: ct.GetCommit(b, "CIRCUIT_SELECTOR_"+mapString), Index: ct.GetCommit(b, "INDEX"), diff --git a/prover/zkevm/prover/bls/module_msm.go b/prover/zkevm/prover/bls/module_msm.go index afd3236bc9..c165ca9108 100644 --- a/prover/zkevm/prover/bls/module_msm.go +++ b/prover/zkevm/prover/bls/module_msm.go @@ -19,7 +19,7 @@ const ( NAME_UNALIGNED_MSM = "UNALIGNED_BLS_MSM" ) -type blsMsmDataSource struct { +type BlsMsmDataSource struct { ID ifaces.Column CsMul ifaces.Column CsMembership ifaces.Column @@ -30,8 +30,8 @@ type blsMsmDataSource struct { IsRes ifaces.Column } -func newMsmDataSource(comp *wizard.CompiledIOP, g group) *blsMsmDataSource { - return &blsMsmDataSource{ +func newMsmDataSource(comp *wizard.CompiledIOP, g Group) *BlsMsmDataSource { + return &BlsMsmDataSource{ ID: comp.Columns.GetHandle(colNameFn("ID")), CsMul: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_BLS_" + g.String() + "_MSM")), CsMembership: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_" + g.String() + "_MEMBERSHIP")), @@ -44,33 +44,33 @@ func newMsmDataSource(comp *wizard.CompiledIOP, g group) *blsMsmDataSource { } type BlsMsm struct { - *blsMsmDataSource - *unalignedMsmData + *BlsMsmDataSource + *UnalignedMsmData AlignedGnarkMsmData *plonk.Alignment AlignedGnarkGroupMembershipData *plonk.Alignment *Limits - group + Group } -func newMsm(comp *wizard.CompiledIOP, g group, limits *Limits, src *blsMsmDataSource) *BlsMsm { +func newMsm(comp *wizard.CompiledIOP, g Group, limits *Limits, src *BlsMsmDataSource) *BlsMsm { umsm := newUnalignedMsmData(comp, g, src) return &BlsMsm{ - blsMsmDataSource: src, - unalignedMsmData: umsm, + BlsMsmDataSource: src, + UnalignedMsmData: umsm, Limits: limits, - group: g, + Group: g, } } func (bm *BlsMsm) WithMsmCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsMsm { - nbCircuits := bm.maxNbMsmInputs/bm.Limits.nbMulInputInstances(bm.group) + 1 + nbCircuits := bm.MaxNbMsmInputs/bm.Limits.nbMulInputInstances(bm.Group) + 1 toAlignMsm := &plonk.CircuitAlignmentInput{ - Name: fmt.Sprintf("%s_%s_MSM", NAME_BLS_MSM, bm.group.String()), + Name: fmt.Sprintf("%s_%s_MSM", NAME_BLS_MSM, bm.Group.String()), Round: ROUND_NR, - DataToCircuitMask: bm.unalignedMsmData.GnarkIsActiveMsm, - DataToCircuit: bm.unalignedMsmData.GnarkDataMsm, - Circuit: newMulCircuit(bm.group, bm.Limits), + DataToCircuitMask: bm.UnalignedMsmData.GnarkIsActiveMsm, + DataToCircuit: bm.UnalignedMsmData.GnarkDataMsm, + Circuit: newMulCircuit(bm.Group, bm.Limits), NbCircuitInstances: nbCircuits, PlonkOptions: options, } @@ -82,17 +82,17 @@ func (bm *BlsMsm) WithMsmCircuit(comp *wizard.CompiledIOP, options ...query.Plon func (bm *BlsMsm) WithGroupMembershipCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsMsm { // compute the bound on the number of circuits we need. First we estimate a bound on the number of possible // maximum number of G1/G2 points which could go to the membership circuit. - nbInputs := bm.blsMsmDataSource.CsMembership.Size() / nbLimbs(bm.group) + nbInputs := bm.BlsMsmDataSource.CsMembership.Size() / nbLimbs(bm.Group) // and by knowing how many inputs every circuit takes, we can bound the number of circuits as well - nbCircuits := nbInputs/bm.Limits.nbGroupMembershipInputInstances(bm.group) + 1 + nbCircuits := nbInputs/bm.Limits.nbGroupMembershipInputInstances(bm.Group) + 1 toAlignMembership := &plonk.CircuitAlignmentInput{ - Name: fmt.Sprintf("%s_%s_GROUP_MEMBERSHIP", NAME_BLS_MSM, bm.group.String()), + Name: fmt.Sprintf("%s_%s_GROUP_MEMBERSHIP", NAME_BLS_MSM, bm.Group.String()), Round: ROUND_NR, - DataToCircuitMask: bm.blsMsmDataSource.CsMembership, - DataToCircuit: bm.blsMsmDataSource.Limb, - Circuit: newCheckCircuit(bm.group, GROUP, bm.Limits), + DataToCircuitMask: bm.BlsMsmDataSource.CsMembership, + DataToCircuit: bm.BlsMsmDataSource.Limb, + Circuit: newCheckCircuit(bm.Group, GROUP, bm.Limits), NbCircuitInstances: nbCircuits, - InputFillerKey: membershipInputFillerKey(bm.group, GROUP), + InputFillerKey: membershipInputFillerKey(bm.Group, GROUP), PlonkOptions: options, } @@ -101,7 +101,7 @@ func (bm *BlsMsm) WithGroupMembershipCircuit(comp *wizard.CompiledIOP, options . } func (bm *BlsMsm) Assign(run *wizard.ProverRuntime) { - bm.unalignedMsmData.Assign(run) + bm.UnalignedMsmData.Assign(run) if bm.AlignedGnarkMsmData != nil { bm.AlignedGnarkMsmData.Assign(run) } @@ -110,8 +110,8 @@ func (bm *BlsMsm) Assign(run *wizard.ProverRuntime) { } } -type unalignedMsmData struct { - *blsMsmDataSource +type UnalignedMsmData struct { + *BlsMsmDataSource IsDataAndCsMul ifaces.Column // indicates if source is data and has CS_MSM set IsResultAndCsMul ifaces.Column // indicates if source is result and has CS_MSM set // this part is used to define the accumulators and indicate if the @@ -127,11 +127,11 @@ type unalignedMsmData struct { GnarkIsActiveMsm ifaces.Column GnarkDataMsm ifaces.Column - group group - maxNbMsmInputs int + Group Group + MaxNbMsmInputs int } -func newUnalignedMsmData(comp *wizard.CompiledIOP, g group, src *blsMsmDataSource) *unalignedMsmData { +func newUnalignedMsmData(comp *wizard.CompiledIOP, g Group, src *BlsMsmDataSource) *UnalignedMsmData { // obtain the maximum number of rows which are coming from the arithmetization. maxNbRows := max(src.CsMul.Size(), src.IsData.Size(), src.IsRes.Size()) // assuming the worst case where there is single long MSM. Then we have @@ -143,8 +143,8 @@ func newUnalignedMsmData(comp *wizard.CompiledIOP, g group, src *blsMsmDataSourc createCol1 := createColFn(comp, fmt.Sprintf("UNALIGNED_%s_BLS_MSM", g.String()), utils.NextPowerOfTwo(maxNbMsmInputs)) createCol2 := createColFn(comp, fmt.Sprintf("UNALIGNED_%s_BLS_MSM", g.String()), utils.NextPowerOfTwo(maxNbRowsAligned)) - res := &unalignedMsmData{ - blsMsmDataSource: src, + res := &UnalignedMsmData{ + BlsMsmDataSource: src, IsDataAndCsMul: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("UNALIGNED_%s_BLS_MSM_SRC_IS_DATA_AND_CS_MSM", g.String()), maxNbRows), IsResultAndCsMul: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("UNALIGNED_%s_BLS_MSM_SRC_IS_RESULT_AND_CS_MSM", g.String()), maxNbRows), IsActive: createCol1("IS_ACTIVE"), @@ -155,8 +155,8 @@ func newUnalignedMsmData(comp *wizard.CompiledIOP, g group, src *blsMsmDataSourc IsLastLine: createCol1("IS_LAST_LINE"), GnarkIsActiveMsm: createCol2("GNARK_IS_ACTIVE_MSM"), GnarkDataMsm: createCol2("GNARK_DATA_MSM"), - group: g, - maxNbMsmInputs: maxNbMsmInputs, + Group: g, + MaxNbMsmInputs: maxNbMsmInputs, } for i := range res.Scalar { @@ -185,18 +185,17 @@ func newUnalignedMsmData(comp *wizard.CompiledIOP, g group, src *blsMsmDataSourc return res } -func (d *unalignedMsmData) csInputMasks(comp *wizard.CompiledIOP) { +func (d *UnalignedMsmData) csInputMasks(comp *wizard.CompiledIOP) { // we need to compute the IS_DATA && CS_MUL column which is used for projection - comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_IS_DATA_AND_CS_MUL", NAME_UNALIGNED_MSM, d.group.String()), sym.Sub(d.IsDataAndCsMul, sym.Mul(d.IsData, d.CsMul))) - comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_IS_RESULT_AND_CS_MUL", NAME_UNALIGNED_MSM, d.group.String()), sym.Sub(d.IsResultAndCsMul, sym.Mul(d.IsRes, d.CsMul))) + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_IS_DATA_AND_CS_MUL", NAME_UNALIGNED_MSM, d.Group.String()), sym.Sub(d.IsDataAndCsMul, sym.Mul(d.IsData, d.CsMul))) + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_IS_RESULT_AND_CS_MUL", NAME_UNALIGNED_MSM, d.Group.String()), sym.Sub(d.IsResultAndCsMul, sym.Mul(d.IsRes, d.CsMul))) } -func (d *unalignedMsmData) csProjectionData(comp *wizard.CompiledIOP) { +func (d *UnalignedMsmData) csProjectionData(comp *wizard.CompiledIOP) { // ensures that the data limbs from source are projected into columns of the // unaligned module properly. It additionally constraints IsActive to // correspond to the number of lines in the source. - nbL := nbLimbs(d.group) - + nbL := nbLimbs(d.Group) filtersB := make([]ifaces.Column, nbL+nbFrLimbs) columnsB := make([][]ifaces.Column, nbL+nbFrLimbs) for i := range nbL { @@ -210,14 +209,14 @@ func (d *unalignedMsmData) csProjectionData(comp *wizard.CompiledIOP) { prj := query.ProjectionMultiAryInput{ FiltersA: []ifaces.Column{d.IsDataAndCsMul}, FiltersB: filtersB, - ColumnsA: [][]ifaces.Column{{d.blsMsmDataSource.Limb}}, + ColumnsA: [][]ifaces.Column{{d.BlsMsmDataSource.Limb}}, ColumnsB: columnsB, } - comp.InsertProjection(ifaces.QueryIDf("%s_%s_PROJECTION_DATA", NAME_UNALIGNED_MSM, d.group.String()), prj) + comp.InsertProjection(ifaces.QueryIDf("%s_%s_PROJECTION_DATA", NAME_UNALIGNED_MSM, d.Group.String()), prj) } -func (d *unalignedMsmData) csProjectionResult(comp *wizard.CompiledIOP) { - nbL := nbLimbs(d.group) +func (d *UnalignedMsmData) csProjectionResult(comp *wizard.CompiledIOP) { + nbL := nbLimbs(d.Group) filtersB := make([]ifaces.Column, nbL) columnsB := make([][]ifaces.Column, nbL) @@ -228,27 +227,27 @@ func (d *unalignedMsmData) csProjectionResult(comp *wizard.CompiledIOP) { prj := query.ProjectionMultiAryInput{ FiltersA: []ifaces.Column{d.IsResultAndCsMul}, FiltersB: filtersB, - ColumnsA: [][]ifaces.Column{{d.blsMsmDataSource.Limb}}, + ColumnsA: [][]ifaces.Column{{d.BlsMsmDataSource.Limb}}, ColumnsB: columnsB, } - comp.InsertProjection(ifaces.QueryIDf("%s_%s_PROJECTION_RESULT", NAME_UNALIGNED_MSM, d.group.String()), prj) + comp.InsertProjection(ifaces.QueryIDf("%s_%s_PROJECTION_RESULT", NAME_UNALIGNED_MSM, d.Group.String()), prj) } -func (d *unalignedMsmData) csAccumulatorInit(comp *wizard.CompiledIOP) { +func (d *UnalignedMsmData) csAccumulatorInit(comp *wizard.CompiledIOP) { // ensures that the first line accumulator is zero - nbL := nbLimbs(d.group) + nbL := nbLimbs(d.Group) for i := range nbL { - comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_ACCUMULATOR_INIT_%d", NAME_UNALIGNED_MSM, d.group.String(), i), sym.Mul(d.CurrentAccumulator[i], d.IsFirstLine)) + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_ACCUMULATOR_INIT_%d", NAME_UNALIGNED_MSM, d.Group.String(), i), sym.Mul(d.CurrentAccumulator[i], d.IsFirstLine)) } } -func (d *unalignedMsmData) csAccumulatorConsistency(comp *wizard.CompiledIOP) { +func (d *UnalignedMsmData) csAccumulatorConsistency(comp *wizard.CompiledIOP) { // ensure that the current accumulator is equal to the next accumulator on previous line. // we need to cancel out if current line is the first line where the current accumulator is zero - // (checked in [unalignedMsmData.csAccumulatorInit]) - nbL := nbLimbs(d.group) + // (checked in [UnalignedMsmData.csAccumulatorInit]) + nbL := nbLimbs(d.Group) for i := range nbL { - comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_ACCUMULATOR_CONSISTENCY_%d", NAME_UNALIGNED_MSM, d.group.String(), i), + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_ACCUMULATOR_CONSISTENCY_%d", NAME_UNALIGNED_MSM, d.Group.String(), i), sym.Mul( d.IsActive, sym.Sub(1, d.IsFirstLine), @@ -258,13 +257,13 @@ func (d *unalignedMsmData) csAccumulatorConsistency(comp *wizard.CompiledIOP) { } } -func (d *unalignedMsmData) Assign(run *wizard.ProverRuntime) { +func (d *UnalignedMsmData) Assign(run *wizard.ProverRuntime) { d.assignDataAndMul(run) d.assignUnaligned(run) d.assignGnarkData(run) } -func (d *unalignedMsmData) assignDataAndMul(run *wizard.ProverRuntime) { +func (d *UnalignedMsmData) assignDataAndMul(run *wizard.ProverRuntime) { var ( srcLimb = d.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() srcIsData = d.IsData.GetColAssignment(run).IntoRegVecSaveAlloc() @@ -284,7 +283,7 @@ func (d *unalignedMsmData) assignDataAndMul(run *wizard.ProverRuntime) { dstIsResultAndCs.PadAndAssign(run, field.Zero()) } -func (d *unalignedMsmData) assignUnaligned(run *wizard.ProverRuntime) { +func (d *UnalignedMsmData) assignUnaligned(run *wizard.ProverRuntime) { var ( srcID = d.ID.GetColAssignment(run).IntoRegVecSaveAlloc() srcLimb = d.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() @@ -295,7 +294,7 @@ func (d *unalignedMsmData) assignUnaligned(run *wizard.ProverRuntime) { srcIsRes = d.IsRes.GetColAssignment(run).IntoRegVecSaveAlloc() ) - nbL := nbLimbs(d.group) + nbL := nbLimbs(d.Group) var ( dstIsActive = common.NewVectorBuilder(d.IsActive) @@ -354,7 +353,7 @@ func (d *unalignedMsmData) assignUnaligned(run *wizard.ProverRuntime) { } dstIsLastLine.PushZero() // compute the next accumulator - nextAccumulator = nativeScalarMulAndSum(d.group, currAccumulator, srcLimb[ptr:ptr+nbL], srcLimb[ptr+nbL:ptr+nbL+nbFrLimbs]) + nextAccumulator = nativeScalarMulAndSum(d.Group, currAccumulator, srcLimb[ptr:ptr+nbL], srcLimb[ptr+nbL:ptr+nbL+nbFrLimbs]) for i := range nbL { // copy the next accumulator limbs dstNextAccumulator[i].PushField(nextAccumulator[i]) @@ -393,8 +392,8 @@ func (d *unalignedMsmData) assignUnaligned(run *wizard.ProverRuntime) { } } -func (d *unalignedMsmData) assignGnarkData(run *wizard.ProverRuntime) { - nbL := nbLimbs(d.group) +func (d *UnalignedMsmData) assignGnarkData(run *wizard.ProverRuntime) { + nbL := nbLimbs(d.Group) // we now need to transpose again the limbs into the gnark input format. // This is essentially mapping the lines of current accumulator, point, diff --git a/prover/zkevm/prover/bls/module_msm_test.go b/prover/zkevm/prover/bls/module_msm_test.go index 0ec2f98d80..570859b767 100644 --- a/prover/zkevm/prover/bls/module_msm_test.go +++ b/prover/zkevm/prover/bls/module_msm_test.go @@ -11,7 +11,7 @@ import ( "github.com/consensys/linea-monorepo/prover/utils/csvtraces" ) -func testBlsMsm(t *testing.T, withCircuit bool, g group, path string, limits *Limits) { +func testBlsMsm(t *testing.T, withCircuit bool, g Group, path string, limits *Limits) { files, err := filepath.Glob(path) if err != nil { t.Fatal(err) @@ -39,7 +39,7 @@ func testBlsMsm(t *testing.T, withCircuit bool, g group, path string, limits *Li if cmp == nil { cmp = wizard.Compile( func(b *wizard.Builder) { - blsMsmSource := &blsMsmDataSource{ + blsMsmSource := &BlsMsmDataSource{ ID: ct.GetCommit(b, "ID"), CsMul: ct.GetCommit(b, "CIRCUIT_SELECTOR_"+g.String()+"_MSM"), CsMembership: ct.GetCommit(b, "CIRCUIT_SELECTOR_"+g.String()+"_MEMBERSHIP"), diff --git a/prover/zkevm/prover/bls/module_pair.go b/prover/zkevm/prover/bls/module_pair.go index 2eaaeb8b05..46155b540d 100644 --- a/prover/zkevm/prover/bls/module_pair.go +++ b/prover/zkevm/prover/bls/module_pair.go @@ -19,7 +19,7 @@ const ( NAME_UNALIGNED_PAIR = "UNALIGNED_BLS_PAIR" ) -type blsPairDataSource struct { +type BlsPairDataSource struct { ID ifaces.Column CsPair ifaces.Column CsG1Membership ifaces.Column @@ -32,8 +32,8 @@ type blsPairDataSource struct { SuccessBit ifaces.Column } -func newPairDataSource(comp *wizard.CompiledIOP) *blsPairDataSource { - return &blsPairDataSource{ +func newPairDataSource(comp *wizard.CompiledIOP) *BlsPairDataSource { + return &BlsPairDataSource{ ID: comp.Columns.GetHandle(colNameFn("ID")), CsPair: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_BLS_PAIRING_CHECK")), CsG1Membership: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_G1_MEMBERSHIP")), @@ -48,21 +48,21 @@ func newPairDataSource(comp *wizard.CompiledIOP) *blsPairDataSource { } type BlsPair struct { - *blsPairDataSource - *unalignedPairData - alignedMillerLoopData *plonk.Alignment - alignedFinalExpData *plonk.Alignment - alignedG1MembershipGnarkData *plonk.Alignment - alignedG2MembershipGnarkData *plonk.Alignment + *BlsPairDataSource + *UnalignedPairData + AlignedMillerLoopData *plonk.Alignment + AlignedFinalExpData *plonk.Alignment + AlignedG1MembershipGnarkData *plonk.Alignment + AlignedG2MembershipGnarkData *plonk.Alignment *Limits } -func newPair(comp *wizard.CompiledIOP, limits *Limits, src *blsPairDataSource) *BlsPair { +func newPair(comp *wizard.CompiledIOP, limits *Limits, src *BlsPairDataSource) *BlsPair { ucmd := newUnalignedPairData(comp, src) res := &BlsPair{ - blsPairDataSource: src, - unalignedPairData: ucmd, + BlsPairDataSource: src, + UnalignedPairData: ucmd, Limits: limits, } @@ -70,13 +70,13 @@ func newPair(comp *wizard.CompiledIOP, limits *Limits, src *blsPairDataSource) * } func (bp *BlsPair) WithPairingCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsPair { - maxNbMlCircuits := bp.maxNbPairInputs/bp.Limits.NbMillerLoopInputInstances + 1 - maxNbFeCircuits := bp.maxNbPairInputs/bp.Limits.NbFinalExpInputInstances + 1 + maxNbMlCircuits := bp.MaxNbPairInputs/bp.Limits.NbMillerLoopInputInstances + 1 + maxNbFeCircuits := bp.MaxNbPairInputs/bp.Limits.NbFinalExpInputInstances + 1 toAlignMl := &plonk.CircuitAlignmentInput{ Name: fmt.Sprintf("%s_ML", NAME_BLS_PAIR), Round: ROUND_NR, - DataToCircuitMask: bp.unalignedPairData.GnarkIsActiveMillerLoop, - DataToCircuit: bp.unalignedPairData.GnarkDataMillerLoop, + DataToCircuitMask: bp.UnalignedPairData.GnarkIsActiveMillerLoop, + DataToCircuit: bp.UnalignedPairData.GnarkDataMillerLoop, Circuit: newMultiMillerLoopMulCircuit(bp.Limits), NbCircuitInstances: maxNbMlCircuits, InputFillerKey: millerLoopInputFillerKey, @@ -85,70 +85,70 @@ func (bp *BlsPair) WithPairingCircuit(comp *wizard.CompiledIOP, options ...query toAlignFe := &plonk.CircuitAlignmentInput{ Name: fmt.Sprintf("%s_FE", NAME_BLS_PAIR), Round: ROUND_NR, - DataToCircuitMask: bp.unalignedPairData.GnarkIsActiveFinalExp, - DataToCircuit: bp.unalignedPairData.GnarkDataFinalExp, + DataToCircuitMask: bp.UnalignedPairData.GnarkIsActiveFinalExp, + DataToCircuit: bp.UnalignedPairData.GnarkDataFinalExp, Circuit: newMultiMillerLoopFinalExpCircuit(bp.Limits), NbCircuitInstances: maxNbFeCircuits, InputFillerKey: finalExpInputFillerKey, PlonkOptions: options, } - bp.alignedMillerLoopData = plonk.DefineAlignment(comp, toAlignMl) - bp.alignedFinalExpData = plonk.DefineAlignment(comp, toAlignFe) + bp.AlignedMillerLoopData = plonk.DefineAlignment(comp, toAlignMl) + bp.AlignedFinalExpData = plonk.DefineAlignment(comp, toAlignFe) return bp } func (bp *BlsPair) WithG1MembershipCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsPair { - maxNbInputs := bp.unalignedPairData.GnarkIsActiveG1Membership.Size() / nbG1Limbs + maxNbInputs := bp.UnalignedPairData.GnarkIsActiveG1Membership.Size() / nbG1Limbs maxNbCircuits := maxNbInputs/bp.Limits.nbGroupMembershipInputInstances(G1) + 1 toAlignG1Ms := &plonk.CircuitAlignmentInput{ Name: fmt.Sprintf("%s_G1_MEMBERSHIP", NAME_BLS_PAIR), Round: ROUND_NR, - DataToCircuitMask: bp.unalignedPairData.GnarkIsActiveG1Membership, - DataToCircuit: bp.blsPairDataSource.Limb, + DataToCircuitMask: bp.UnalignedPairData.GnarkIsActiveG1Membership, + DataToCircuit: bp.BlsPairDataSource.Limb, Circuit: newCheckCircuit(G1, GROUP, bp.Limits), NbCircuitInstances: maxNbCircuits, InputFillerKey: membershipInputFillerKey(G1, GROUP), PlonkOptions: options, } - bp.alignedG1MembershipGnarkData = plonk.DefineAlignment(comp, toAlignG1Ms) + bp.AlignedG1MembershipGnarkData = plonk.DefineAlignment(comp, toAlignG1Ms) return bp } func (bp *BlsPair) WithG2MembershipCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsPair { - maxNbInputs := bp.unalignedPairData.GnarkIsActiveG2Membership.Size() / nbG2Limbs + maxNbInputs := bp.UnalignedPairData.GnarkIsActiveG2Membership.Size() / nbG2Limbs maxNbCircuits := maxNbInputs/bp.Limits.nbGroupMembershipInputInstances(G2) + 1 toAlignG2Ms := &plonk.CircuitAlignmentInput{ Name: fmt.Sprintf("%s_G2_MEMBERSHIP", NAME_BLS_PAIR), Round: ROUND_NR, - DataToCircuitMask: bp.unalignedPairData.GnarkIsActiveG2Membership, - DataToCircuit: bp.blsPairDataSource.Limb, + DataToCircuitMask: bp.UnalignedPairData.GnarkIsActiveG2Membership, + DataToCircuit: bp.BlsPairDataSource.Limb, Circuit: newCheckCircuit(G2, GROUP, bp.Limits), NbCircuitInstances: maxNbCircuits, InputFillerKey: membershipInputFillerKey(G2, GROUP), PlonkOptions: options, } - bp.alignedG2MembershipGnarkData = plonk.DefineAlignment(comp, toAlignG2Ms) + bp.AlignedG2MembershipGnarkData = plonk.DefineAlignment(comp, toAlignG2Ms) return bp } func (bp *BlsPair) Assign(run *wizard.ProverRuntime) { - bp.unalignedPairData.Assign(run) - if bp.alignedMillerLoopData != nil { - bp.alignedMillerLoopData.Assign(run) + bp.UnalignedPairData.Assign(run) + if bp.AlignedMillerLoopData != nil { + bp.AlignedMillerLoopData.Assign(run) } - if bp.alignedFinalExpData != nil { - bp.alignedFinalExpData.Assign(run) + if bp.AlignedFinalExpData != nil { + bp.AlignedFinalExpData.Assign(run) } - if bp.alignedG1MembershipGnarkData != nil { - bp.alignedG1MembershipGnarkData.Assign(run) + if bp.AlignedG1MembershipGnarkData != nil { + bp.AlignedG1MembershipGnarkData.Assign(run) } - if bp.alignedG2MembershipGnarkData != nil { - bp.alignedG2MembershipGnarkData.Assign(run) + if bp.AlignedG2MembershipGnarkData != nil { + bp.AlignedG2MembershipGnarkData.Assign(run) } } -type unalignedPairData struct { - *blsPairDataSource +type UnalignedPairData struct { + *BlsPairDataSource IsActive ifaces.Column IsFirstLine ifaces.Column IsLastLine ifaces.Column @@ -169,10 +169,10 @@ type unalignedPairData struct { GnarkIsActiveFinalExp ifaces.Column GnarkDataFinalExp ifaces.Column - maxNbPairInputs int + MaxNbPairInputs int } -func newUnalignedPairData(comp *wizard.CompiledIOP, src *blsPairDataSource) *unalignedPairData { +func newUnalignedPairData(comp *wizard.CompiledIOP, src *BlsPairDataSource) *UnalignedPairData { // for bounding the size of the alignment, we assume the worst case inputs where we have many pairing checks with // a single input. A single pairing check input is G1 and G2 element maxNbPairInputs := src.CsPair.Size()/(nbG1Limbs+nbG2Limbs) + 1 @@ -180,8 +180,8 @@ func newUnalignedPairData(comp *wizard.CompiledIOP, src *blsPairDataSource) *una createColFnUa := createColFn(comp, NAME_UNALIGNED_PAIR, utils.NextPowerOfTwo(maxNbPairInputs)) createColFnMl := createColFn(comp, NAME_UNALIGNED_PAIR, utils.NextPowerOfTwo(maxNbPairInputs*nbRowsPerMillerLoop)) createColFnFe := createColFn(comp, NAME_UNALIGNED_PAIR, utils.NextPowerOfTwo(maxNbPairInputs*nbRowsPerFinalExp)) - ucmd := &unalignedPairData{ - blsPairDataSource: src, + ucmd := &UnalignedPairData{ + BlsPairDataSource: src, IsActive: createColFnUa("IS_ACTIVE"), IsFirstLine: createColFnUa("IS_FIRST_LINE"), IsLastLine: createColFnUa("IS_LAST_LINE"), @@ -192,7 +192,7 @@ func newUnalignedPairData(comp *wizard.CompiledIOP, src *blsPairDataSource) *una GnarkDataFinalExp: createColFnFe("GNARK_DATA_FE"), GnarkIsActiveG1Membership: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("%s_%s", NAME_BLS_PAIR, "GNARK_IS_ACTIVE_G1_MEMBERSHIP"), max(src.SuccessBit.Size(), src.CsG1Membership.Size())), GnarkIsActiveG2Membership: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("%s_%s", NAME_BLS_PAIR, "GNARK_IS_ACTIVE_G2_MEMBERSHIP"), max(src.SuccessBit.Size(), src.CsG2Membership.Size())), - maxNbPairInputs: maxNbPairInputs, + MaxNbPairInputs: maxNbPairInputs, } for i := range ucmd.PointG1 { @@ -225,7 +225,7 @@ func newUnalignedPairData(comp *wizard.CompiledIOP, src *blsPairDataSource) *una return ucmd } -func (d *unalignedPairData) csInputMask(comp *wizard.CompiledIOP) { +func (d *UnalignedPairData) csInputMask(comp *wizard.CompiledIOP) { // assert that the GnarkIsActiveG1Membership and GnarkIsActiveG2Membership // are set correctly. We only call the subgroup membership for // non-membership checks (all membership checks are done inside Miller @@ -251,7 +251,7 @@ func (d *unalignedPairData) csInputMask(comp *wizard.CompiledIOP) { ) } -func (d *unalignedPairData) csProjectionUnaligned(comp *wizard.CompiledIOP) { +func (d *UnalignedPairData) csProjectionUnaligned(comp *wizard.CompiledIOP) { filtersB := make([]ifaces.Column, nbG1Limbs+nbG2Limbs+2) columnsB := make([][]ifaces.Column, nbG1Limbs+nbG2Limbs+2) for i := range nbG1Limbs { @@ -269,13 +269,13 @@ func (d *unalignedPairData) csProjectionUnaligned(comp *wizard.CompiledIOP) { prj := query.ProjectionMultiAryInput{ FiltersA: []ifaces.Column{d.SuccessBit}, FiltersB: filtersB, - ColumnsA: [][]ifaces.Column{{d.blsPairDataSource.Limb}}, + ColumnsA: [][]ifaces.Column{{d.BlsPairDataSource.Limb}}, ColumnsB: columnsB, } comp.InsertProjection(ifaces.QueryIDf("%s_PROJECTION_DATA", NAME_UNALIGNED_PAIR), prj) } -func (d *unalignedPairData) csProjectionGnarkDataMillerLoop(comp *wizard.CompiledIOP) { +func (d *UnalignedPairData) csProjectionGnarkDataMillerLoop(comp *wizard.CompiledIOP) { // we map everything except the last input to the Miller loop circuit. We // need to constrain the mask comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_NOT_LAST_LINE", NAME_UNALIGNED_PAIR), @@ -311,7 +311,7 @@ func (d *unalignedPairData) csProjectionGnarkDataMillerLoop(comp *wizard.Compile comp.InsertProjection(ifaces.QueryIDf("%s_PROJECTION_ML_DATA", NAME_UNALIGNED_PAIR), prj) } -func (d *unalignedPairData) csProjectionGnarkDataFinalExp(comp *wizard.CompiledIOP) { +func (d *UnalignedPairData) csProjectionGnarkDataFinalExp(comp *wizard.CompiledIOP) { filtersA := make([]ifaces.Column, nbGtLimbs+nbG1Limbs+nbG2Limbs+2) columnsA := make([][]ifaces.Column, nbGtLimbs+nbG1Limbs+nbG2Limbs+2) for i := range nbGtLimbs { @@ -339,7 +339,7 @@ func (d *unalignedPairData) csProjectionGnarkDataFinalExp(comp *wizard.CompiledI comp.InsertProjection(ifaces.QueryIDf("%s_PROJECTION_FE_DATA", NAME_UNALIGNED_PAIR), prj) } -func (d *unalignedPairData) csAccumulatorInit(comp *wizard.CompiledIOP) { +func (d *UnalignedPairData) csAccumulatorInit(comp *wizard.CompiledIOP) { // ensures that the first line accumulator is zero in Gt for i := range nbGtLimbs { if i == 3 { @@ -353,10 +353,10 @@ func (d *unalignedPairData) csAccumulatorInit(comp *wizard.CompiledIOP) { } } -func (d *unalignedPairData) csAccumulatorConsistency(comp *wizard.CompiledIOP) { +func (d *UnalignedPairData) csAccumulatorConsistency(comp *wizard.CompiledIOP) { // ensure that the current accumulator is equal to the next accumulator on previous line. // we need to cancel out if current line is the first line where the current accumulator is zero - // (checked in [unalignedPairData.csAccumulatorInit]) + // (checked in [UnalignedPairData.csAccumulatorInit]) for i := range nbGtLimbs { comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_ACCUMULATOR_CONSISTENCY_%d", NAME_UNALIGNED_PAIR, i), sym.Mul( @@ -368,13 +368,13 @@ func (d *unalignedPairData) csAccumulatorConsistency(comp *wizard.CompiledIOP) { } } -func (d *unalignedPairData) Assign(run *wizard.ProverRuntime) { +func (d *UnalignedPairData) Assign(run *wizard.ProverRuntime) { d.assignMembershipMask(run) d.assignUnaligned(run) d.assignGnarkData(run) } -func (d *unalignedPairData) assignMembershipMask(run *wizard.ProverRuntime) { +func (d *UnalignedPairData) assignMembershipMask(run *wizard.ProverRuntime) { // assigns the masks (CS_G1_MEMBERSHIP AND !SUCCESS_BIT) and // (CS_G2_MEMBERSHIP AND !SUCCESS_BIT) columns which are used for filtering // the inputs going to group non-membership circuit. @@ -400,7 +400,7 @@ func (d *unalignedPairData) assignMembershipMask(run *wizard.ProverRuntime) { dstG2Membership.PadAndAssign(run, field.Zero()) } -func (d *unalignedPairData) assignUnaligned(run *wizard.ProverRuntime) { +func (d *UnalignedPairData) assignUnaligned(run *wizard.ProverRuntime) { var ( srcID = d.ID.GetColAssignment(run).IntoRegVecSaveAlloc() srcSuccessBit = d.SuccessBit.GetColAssignment(run).IntoRegVecSaveAlloc() @@ -554,7 +554,7 @@ func (d *unalignedPairData) assignUnaligned(run *wizard.ProverRuntime) { } } -func (d *unalignedPairData) assignGnarkData(run *wizard.ProverRuntime) { +func (d *UnalignedPairData) assignGnarkData(run *wizard.ProverRuntime) { var ( srcIsActive = d.IsActive.GetColAssignment(run).IntoRegVecSaveAlloc() srcIsLastLine = d.IsLastLine.GetColAssignment(run).IntoRegVecSaveAlloc() diff --git a/prover/zkevm/prover/bls/module_pair_test.go b/prover/zkevm/prover/bls/module_pair_test.go index fb0f777bc7..0c81124ddb 100644 --- a/prover/zkevm/prover/bls/module_pair_test.go +++ b/prover/zkevm/prover/bls/module_pair_test.go @@ -45,7 +45,7 @@ func testBlsPair(t *testing.T, withCircuit bool) { if cmp == nil { cmp = wizard.Compile( func(b *wizard.Builder) { - blsPairSource := &blsPairDataSource{ + blsPairSource := &BlsPairDataSource{ ID: ct.GetCommit(b, "ID"), CsPair: ct.GetCommit(b, "CS_PAIRING_CHECK"), CsG1Membership: ct.GetCommit(b, "CS_G1_MEMBERSHIP"), diff --git a/prover/zkevm/prover/bls/module_pointeval.go b/prover/zkevm/prover/bls/module_pointeval.go index 93d85c09da..ca51ee4266 100644 --- a/prover/zkevm/prover/bls/module_pointeval.go +++ b/prover/zkevm/prover/bls/module_pointeval.go @@ -11,7 +11,7 @@ const ( NAME_BLS_POINTEVAL = "BLS_POINTEVAL" ) -type blsPointEvalDataSource struct { +type BlsPointEvalDataSource struct { ID ifaces.Column CsPointEval ifaces.Column CsPointEvalInvalid ifaces.Column @@ -22,8 +22,8 @@ type blsPointEvalDataSource struct { IsRes ifaces.Column } -func newPointEvalDataSource(comp *wizard.CompiledIOP) *blsPointEvalDataSource { - return &blsPointEvalDataSource{ +func newPointEvalDataSource(comp *wizard.CompiledIOP) *BlsPointEvalDataSource { + return &BlsPointEvalDataSource{ ID: comp.Columns.GetHandle(colNameFn("ID")), CsPointEval: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_POINT_EVALUATION")), CsPointEvalInvalid: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_POINT_EVALUATION_FAILURE")), @@ -36,15 +36,15 @@ func newPointEvalDataSource(comp *wizard.CompiledIOP) *blsPointEvalDataSource { } type BlsPointEval struct { - *blsPointEvalDataSource - alignedGnarkData *plonk.Alignment - alignedFailureGnarkData *plonk.Alignment + *BlsPointEvalDataSource + AlignedGnarkData *plonk.Alignment + AlignedFailureGnarkData *plonk.Alignment *Limits } -func newPointEval(_ *wizard.CompiledIOP, limits *Limits, src *blsPointEvalDataSource) *BlsPointEval { +func newPointEval(_ *wizard.CompiledIOP, limits *Limits, src *BlsPointEvalDataSource) *BlsPointEval { res := &BlsPointEval{ - blsPointEvalDataSource: src, + BlsPointEvalDataSource: src, Limits: limits, } return res @@ -54,44 +54,44 @@ func (bp *BlsPointEval) WithPointEvalCircuit(comp *wizard.CompiledIOP, options . // the gnark circuit takes exactly the same rows as provided by the arithmetization. So // to get the bound on the number of circuits we just need to divide by the size of the // addition circuit input instances - maxNbInstances := bp.blsPointEvalDataSource.CsPointEval.Size() / nbRowsPerPointEval + maxNbInstances := bp.BlsPointEvalDataSource.CsPointEval.Size() / nbRowsPerPointEval maxNbCircuits := maxNbInstances/bp.Limits.NbPointEvalInputInstances + 1 toAlign := &plonk.CircuitAlignmentInput{ Name: NAME_BLS_POINTEVAL, Round: ROUND_NR, - DataToCircuitMask: bp.blsPointEvalDataSource.CsPointEval, - DataToCircuit: bp.blsPointEvalDataSource.Limb, + DataToCircuitMask: bp.BlsPointEvalDataSource.CsPointEval, + DataToCircuit: bp.BlsPointEvalDataSource.Limb, Circuit: newMultiPointEvalCircuit(bp.Limits), NbCircuitInstances: maxNbCircuits, InputFillerKey: pointEvalInputFillerKey, PlonkOptions: options, } - bp.alignedGnarkData = plonk.DefineAlignment(comp, toAlign) + bp.AlignedGnarkData = plonk.DefineAlignment(comp, toAlign) return bp } func (bp *BlsPointEval) WithPointEvalFailureCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *BlsPointEval { - maxNbInstances := bp.blsPointEvalDataSource.CsPointEvalInvalid.Size() / nbRowsPerPointEval + maxNbInstances := bp.BlsPointEvalDataSource.CsPointEvalInvalid.Size() / nbRowsPerPointEval maxNbCircuits := maxNbInstances/bp.Limits.NbPointEvalFailureInputInstances + 1 toAlign := &plonk.CircuitAlignmentInput{ Name: NAME_BLS_POINTEVAL + "_FAILURE", Round: ROUND_NR, - DataToCircuitMask: bp.blsPointEvalDataSource.CsPointEvalInvalid, - DataToCircuit: bp.blsPointEvalDataSource.Limb, + DataToCircuitMask: bp.BlsPointEvalDataSource.CsPointEvalInvalid, + DataToCircuit: bp.BlsPointEvalDataSource.Limb, Circuit: newMultiPointEvalFailureCircuit(bp.Limits), NbCircuitInstances: maxNbCircuits, InputFillerKey: pointEvalFailureInputFillerKey, PlonkOptions: options, } - bp.alignedFailureGnarkData = plonk.DefineAlignment(comp, toAlign) + bp.AlignedFailureGnarkData = plonk.DefineAlignment(comp, toAlign) return bp } func (bp *BlsPointEval) Assign(run *wizard.ProverRuntime) { - if bp.alignedGnarkData != nil { - bp.alignedGnarkData.Assign(run) + if bp.AlignedGnarkData != nil { + bp.AlignedGnarkData.Assign(run) } - if bp.alignedFailureGnarkData != nil { - bp.alignedFailureGnarkData.Assign(run) + if bp.AlignedFailureGnarkData != nil { + bp.AlignedFailureGnarkData.Assign(run) } } diff --git a/prover/zkevm/prover/bls/module_pointeval_test.go b/prover/zkevm/prover/bls/module_pointeval_test.go index d7871887b2..1a9c1d56e8 100644 --- a/prover/zkevm/prover/bls/module_pointeval_test.go +++ b/prover/zkevm/prover/bls/module_pointeval_test.go @@ -43,7 +43,7 @@ func testPointEval(t *testing.T, withCircuit bool) { if cmp == nil { cmp = wizard.Compile( func(b *wizard.Builder) { - pointEvalSource := &blsPointEvalDataSource{ + pointEvalSource := &BlsPointEvalDataSource{ ID: ct.GetCommit(b, "ID"), CsPointEval: ct.GetCommit(b, "CIRCUIT_SELECTOR_POINT_EVALUATION"), CsPointEvalInvalid: ct.GetCommit(b, "CIRCUIT_SELECTOR_POINT_EVALUATION_FAILURE"), diff --git a/prover/zkevm/prover/bls/native_ops.go b/prover/zkevm/prover/bls/native_ops.go index be05c9b932..35ae41fdeb 100644 --- a/prover/zkevm/prover/bls/native_ops.go +++ b/prover/zkevm/prover/bls/native_ops.go @@ -18,7 +18,7 @@ func set(nbL int, q *fp.Element, limbs []field.Element) { q.SetBytes(buf) } -func nativeScalarMulAndSum(g group, currentAccumulator []field.Element, point []field.Element, scalar []field.Element) (nextAccumulator []field.Element) { +func nativeScalarMulAndSum(g Group, currentAccumulator []field.Element, point []field.Element, scalar []field.Element) (nextAccumulator []field.Element) { nbL := nbLimbs(g) if len(scalar) != nbFrLimbs { panic(fmt.Sprintf("scalar must have exactly %d limbs, got %d", nbFrLimbs, len(scalar))) diff --git a/prover/zkevm/prover/p256verify/circuit.go b/prover/zkevm/prover/p256verify/circuit.go index 7dff3862c4..5d454498fb 100644 --- a/prover/zkevm/prover/p256verify/circuit.go +++ b/prover/zkevm/prover/p256verify/circuit.go @@ -51,7 +51,7 @@ func (c baseElementWizard) ToElement(api frontend.API, fp *emulated.Field[basefi return fp.NewElement(Plimbs) } -type p256VerifyInstance struct { +type P256VerifyInstance struct { H scalarElementWizard `gnark:",public"` R scalarElementWizard `gnark:",public"` S scalarElementWizard `gnark:",public"` @@ -61,7 +61,7 @@ type p256VerifyInstance struct { } type multiP256VerifyInstanceCircuit struct { - Instances []p256VerifyInstance + Instances []P256VerifyInstance } func (c *multiP256VerifyInstanceCircuit) Define(api frontend.API) error { @@ -94,6 +94,6 @@ func (c *multiP256VerifyInstanceCircuit) Define(api frontend.API) error { func newP256VerifyCircuit(limits *Limits) frontend.Circuit { return &multiP256VerifyInstanceCircuit{ - Instances: make([]p256VerifyInstance, limits.NbInputInstances), + Instances: make([]P256VerifyInstance, limits.NbInputInstances), } } diff --git a/prover/zkevm/prover/p256verify/module.go b/prover/zkevm/prover/p256verify/module.go index d0b876c233..2d72594c81 100644 --- a/prover/zkevm/prover/p256verify/module.go +++ b/prover/zkevm/prover/p256verify/module.go @@ -19,7 +19,7 @@ func colNameFn(colName string) ifaces.ColID { return ifaces.ColID(fmt.Sprintf("%s.%s", moduleName, colName)) } -type p256VerifyDataSource struct { +type P256VerifyDataSource struct { ID ifaces.Column CS ifaces.Column Limb ifaces.Column @@ -28,8 +28,8 @@ type p256VerifyDataSource struct { IsResult ifaces.Column } -func newP256VerifyDataSource(comp *wizard.CompiledIOP) *p256VerifyDataSource { - return &p256VerifyDataSource{ +func newP256VerifyDataSource(comp *wizard.CompiledIOP) *P256VerifyDataSource { + return &P256VerifyDataSource{ ID: comp.Columns.GetHandle(colNameFn("ID")), CS: comp.Columns.GetHandle(colNameFn("CIRCUIT_SELECTOR_P256_VERIFY")), Limb: comp.Columns.GetHandle(colNameFn("LIMB")), @@ -40,14 +40,14 @@ func newP256VerifyDataSource(comp *wizard.CompiledIOP) *p256VerifyDataSource { } type P256Verify struct { - *p256VerifyDataSource - p256VerifyGnarkData *plonk.Alignment + *P256VerifyDataSource + P256VerifyGnarkData *plonk.Alignment *Limits } -func newP256Verify(_ *wizard.CompiledIOP, limits *Limits, src *p256VerifyDataSource) *P256Verify { +func newP256Verify(_ *wizard.CompiledIOP, limits *Limits, src *P256VerifyDataSource) *P256Verify { res := &P256Verify{ - p256VerifyDataSource: src, + P256VerifyDataSource: src, Limits: limits, } @@ -56,25 +56,25 @@ func newP256Verify(_ *wizard.CompiledIOP, limits *Limits, src *p256VerifyDataSou func (pv *P256Verify) WithCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *P256Verify { nbRowsPerCircuit := nbRows * pv.Limits.NbInputInstances - maxNbCircuits := (pv.p256VerifyDataSource.CS.Size() + nbRowsPerCircuit - 1) / nbRowsPerCircuit + maxNbCircuits := (pv.P256VerifyDataSource.CS.Size() + nbRowsPerCircuit - 1) / nbRowsPerCircuit toAlign := &plonk.CircuitAlignmentInput{ Name: fmt.Sprintf("%s_ALIGNMENT", NAME_P256_VERIFY), Round: ROUND_NR, - DataToCircuitMask: pv.p256VerifyDataSource.CS, - DataToCircuit: pv.p256VerifyDataSource.Limb, + DataToCircuitMask: pv.P256VerifyDataSource.CS, + DataToCircuit: pv.P256VerifyDataSource.Limb, Circuit: newP256VerifyCircuit(pv.Limits), NbCircuitInstances: maxNbCircuits, PlonkOptions: options, InputFillerKey: input_filler_key, } - pv.p256VerifyGnarkData = plonk.DefineAlignment(comp, toAlign) + pv.P256VerifyGnarkData = plonk.DefineAlignment(comp, toAlign) return pv } func (pv *P256Verify) Assign(run *wizard.ProverRuntime) { - if pv.p256VerifyGnarkData != nil { - pv.p256VerifyGnarkData.Assign(run) + if pv.P256VerifyGnarkData != nil { + pv.P256VerifyGnarkData.Assign(run) } } diff --git a/prover/zkevm/prover/p256verify/module_test.go b/prover/zkevm/prover/p256verify/module_test.go index db23c1fbb9..ead6c4f5ad 100644 --- a/prover/zkevm/prover/p256verify/module_test.go +++ b/prover/zkevm/prover/p256verify/module_test.go @@ -27,7 +27,7 @@ func testP256Verify(t *testing.T, withCircuit bool, path string, limits *Limits) var p256Verify *P256Verify cmp := wizard.Compile( func(b *wizard.Builder) { - p256VerifySource := &p256VerifyDataSource{ + p256VerifySource := &P256VerifyDataSource{ ID: ct.GetCommit(b, "ID"), CS: ct.GetCommit(b, "CIRCUIT_SELECTOR_P256_VERIFY"), Limb: ct.GetCommit(b, "LIMB"), From ac1e8853cce20c61086264170e8c566961c00e6f Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Tue, 25 Nov 2025 12:05:13 +0000 Subject: [PATCH 24/36] merge changes from feat/bls-glue --- .../v0/compress/internal/io.go | 2 +- prover/zkevm/prover/bls/native_ops.go | 24 ++++++------- .../zkevm/prover/bls/serialization_types.go | 34 +++---------------- 3 files changed, 18 insertions(+), 42 deletions(-) diff --git a/prover/circuits/blobdecompression/v0/compress/internal/io.go b/prover/circuits/blobdecompression/v0/compress/internal/io.go index bb347a05ad..9e18f0aa09 100644 --- a/prover/circuits/blobdecompression/v0/compress/internal/io.go +++ b/prover/circuits/blobdecompression/v0/compress/internal/io.go @@ -35,7 +35,7 @@ func (r *RangeChecker) AssertLessThan(bound uint, c ...frontend.Variable) { default: cRangeTable, ok := r.tables[bound] if !ok { - cRangeTable := logderivlookup.New(r.api) + cRangeTable = logderivlookup.New(r.api) r.tables[bound] = cRangeTable for i := uint(0); i < bound; i++ { cRangeTable.Insert(0) diff --git a/prover/zkevm/prover/bls/native_ops.go b/prover/zkevm/prover/bls/native_ops.go index 35ae41fdeb..b893f1f31e 100644 --- a/prover/zkevm/prover/bls/native_ops.go +++ b/prover/zkevm/prover/bls/native_ops.go @@ -136,19 +136,19 @@ func nativeMillerLoopAndSum(prevAccumulator []field.Element, pointG1 []field.Ele next.Mul(&prev, &mlres) nextAccumulator = make([]field.Element, nbGtLimbs) + C0B0A0Bytes := next.C0.B0.A0.Bytes() + C0B0A1Bytes := next.C0.B0.A1.Bytes() + C0B1A0Bytes := next.C0.B1.A0.Bytes() + C0B1A1Bytes := next.C0.B1.A1.Bytes() + C0B2A0Bytes := next.C0.B2.A0.Bytes() + C0B2A1Bytes := next.C0.B2.A1.Bytes() + C1B0A0Bytes := next.C1.B0.A0.Bytes() + C1B0A1Bytes := next.C1.B0.A1.Bytes() + C1B1A0Bytes := next.C1.B1.A0.Bytes() + C1B1A1Bytes := next.C1.B1.A1.Bytes() + C1B2A0Bytes := next.C1.B2.A0.Bytes() + C1B2A1Bytes := next.C1.B2.A1.Bytes() for i := range nbGtLimbs/12 - 1 { - C0B0A0Bytes := next.C0.B0.A0.Bytes() - C0B0A1Bytes := next.C0.B0.A1.Bytes() - C0B1A0Bytes := next.C0.B1.A0.Bytes() - C0B1A1Bytes := next.C0.B1.A1.Bytes() - C0B2A0Bytes := next.C0.B2.A0.Bytes() - C0B2A1Bytes := next.C0.B2.A1.Bytes() - C1B0A0Bytes := next.C1.B0.A0.Bytes() - C1B0A1Bytes := next.C1.B0.A1.Bytes() - C1B1A0Bytes := next.C1.B1.A0.Bytes() - C1B1A1Bytes := next.C1.B1.A1.Bytes() - C1B2A0Bytes := next.C1.B2.A0.Bytes() - C1B2A1Bytes := next.C1.B2.A1.Bytes() nextAccumulator[i+1].SetBytes(C0B0A0Bytes[i*nbBytes : (i+1)*nbBytes]) nextAccumulator[i+1+nbGtLimbs/12].SetBytes(C0B0A1Bytes[i*nbBytes : (i+1)*nbBytes]) nextAccumulator[i+1+2*nbGtLimbs/12].SetBytes(C0B1A0Bytes[i*nbBytes : (i+1)*nbBytes]) diff --git a/prover/zkevm/prover/bls/serialization_types.go b/prover/zkevm/prover/bls/serialization_types.go index fa5f68ee7b..e945616353 100644 --- a/prover/zkevm/prover/bls/serialization_types.go +++ b/prover/zkevm/prover/bls/serialization_types.go @@ -2,8 +2,6 @@ package bls import ( "github.com/consensys/gnark/std/algebra/emulated/sw_bls12381" - "github.com/consensys/gnark/std/algebra/emulated/sw_emulated" - "github.com/consensys/gnark/std/math/emulated/emparams" ) // Type aliases for serialization registration @@ -11,12 +9,11 @@ import ( type ( // G1 circuit types with sw_emulated.AffinePoint - MultiAddCircuitG1 = multiAddCircuit[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]] - MultiMulCircuitG1 = multiMulCircuit[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]] - MultiMapCircuitG1 = multiMapCircuit[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]] - MultiCheckableG1NonGroup = multiCheckableCircuit[nonGroupMembershipInstance[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]]] - MultiCheckableG1NonCurve = multiCheckableCircuit[nonCurveMembershipInstance[g1ElementWizard, sw_emulated.AffinePoint[emparams.BLS12381Fp]]] - + MultiAddCircuitG1 = multiAddCircuit[g1ElementWizard, sw_bls12381.G1Affine] + MultiMulCircuitG1 = multiMulCircuit[g1ElementWizard, sw_bls12381.G1Affine] + MultiMapCircuitG1 = multiMapCircuit[g1ElementWizard, sw_bls12381.G1Affine] + MultiCheckableG1NonGroup = multiCheckableCircuit[nonGroupMembershipInstance[g1ElementWizard, sw_bls12381.G1Affine]] + MultiCheckableG1NonCurve = multiCheckableCircuit[nonCurveMembershipInstance[g1ElementWizard, sw_bls12381.G1Affine]] // G2 circuit types MultiAddCircuitG2 = multiAddCircuit[g2ElementWizard, sw_bls12381.G2Affine] MultiMulCircuitG2 = multiMulCircuit[g2ElementWizard, sw_bls12381.G2Affine] @@ -30,24 +27,3 @@ type ( MultiPointEvalCircuit = multiPointEvalCircuit MultiPointEvalFailureCircuit = multiPointEvalFailureCircuit ) - -// Constructor functions for serialization registration -func NewMultiAddCircuitG1() *MultiAddCircuitG1 { - return &MultiAddCircuitG1{} -} - -func NewMultiMulCircuitG1() *MultiMulCircuitG1 { - return &MultiMulCircuitG1{} -} - -func NewMultiMulCircuitG2() *MultiMulCircuitG2 { - return &MultiMulCircuitG2{} -} - -func NewMultiCheckableCircuitG1NonGroup() *MultiCheckableG1NonGroup { - return &MultiCheckableG1NonGroup{} -} - -func NewMultiCheckableCircuitG2NonGroup() *MultiCheckableG2NonGroup { - return &MultiCheckableG2NonGroup{} -} From 2f5c889c4b6fe43b88fa6daebcb9c1549eb4e120 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Tue, 25 Nov 2025 22:04:30 +0000 Subject: [PATCH 25/36] chore: gnark update to master --- prover/go.mod | 2 +- prover/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/prover/go.mod b/prover/go.mod index b12f349376..7079cd7923 100644 --- a/prover/go.mod +++ b/prover/go.mod @@ -5,7 +5,7 @@ go 1.24.6 require ( github.com/bits-and-blooms/bitset v1.24.0 github.com/consensys/compress v0.2.5 - github.com/consensys/gnark v0.14.1-0.20251124224808-f1057a2e93b2 + github.com/consensys/gnark v0.14.1-0.20251125185647-9873a5606794 github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19 github.com/consensys/go-corset v1.1.28 github.com/crate-crypto/go-kzg-4844 v1.1.0 diff --git a/prover/go.sum b/prover/go.sum index 57124f75a6..ea95d8207e 100644 --- a/prover/go.sum +++ b/prover/go.sum @@ -74,8 +74,8 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/consensys/compress v0.2.5 h1:gJr1hKzbOD36JFsF1AN8lfXz1yevnJi1YolffY19Ntk= github.com/consensys/compress v0.2.5/go.mod h1:pyM+ZXiNUh7/0+AUjUf9RKUM6vSH7T/fsn5LLS0j1Tk= -github.com/consensys/gnark v0.14.1-0.20251124224808-f1057a2e93b2 h1:lKyn1QQCbzRAmLzYlWHj97vWq6voczRbN/UaOctiOxo= -github.com/consensys/gnark v0.14.1-0.20251124224808-f1057a2e93b2/go.mod h1:XBV7LkFSZq5AyQhdEN1Y6ntm/QNdu7lnKNvZnh25O7I= +github.com/consensys/gnark v0.14.1-0.20251125185647-9873a5606794 h1:IsFrS6WGh+uaDOEfBC+fKz0c8bcikPf67fxJmUc69ZM= +github.com/consensys/gnark v0.14.1-0.20251125185647-9873a5606794/go.mod h1:XBV7LkFSZq5AyQhdEN1Y6ntm/QNdu7lnKNvZnh25O7I= github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19 h1:uUbFaofcFwkv5T/zbR/Gyfm06v84Rua9a1xv9VZrPAA= github.com/consensys/gnark-crypto v0.19.3-0.20251115174214-022ec58e8c19/go.mod h1:OgCH7cSoJ46c+nOzvQuwOrIE9fawpXMYOQFzj22Vy3E= github.com/consensys/go-corset v1.1.28 h1:4vaaIFAWCzEgGTz6YGm8rt7+0F6mHDT8DS2u+WWslFw= From 0bdf67faf40788a5171b218be53b7b02b197ece6 Mon Sep 17 00:00:00 2001 From: gusiri Date: Wed, 26 Nov 2025 14:19:47 +0000 Subject: [PATCH 26/36] update modules and trace limits for Osaka summary from the Osaka(rc4) tracer PR https://github.com/Consensys/linea-monorepo/pull/1774/files#r2565069360 Remove modules: BLS = 0 POINT_EVAL = 0 Add new modules: PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 128 Rename modules: PrecompileBlsC1MembershipChecks --> PrecompileBlsC1MembershipCalls Update module limits: - increase the limit to 1024 PRECOMPILE_ECADD_EFFECTIVE_CALLS 256 -> 1024 - from 0 to PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 1 PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 2 PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 8 PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 4 PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 8 PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 4 PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 8 PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 2 PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 4 PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 4 PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 8 PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 8 PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 8 PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 8 Etc: Update mismatches: set BLS_REFERENCE_TABLE = 512 in config_default.go and trace_limit.go (this has been 512 in prod environment) set PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 to 2 instead of 1 --- prover/config/config-devnet-full.toml | 192 ++++++-- prover/config/config-mainnet-limitless.toml | 110 +++-- prover/config/config-sepolia-limitless.toml | 110 +++-- prover/config/config_default.go | 474 ++++++++++---------- prover/config/traces_limit.go | 321 ++++++------- 5 files changed, 706 insertions(+), 501 deletions(-) diff --git a/prover/config/config-devnet-full.toml b/prover/config/config-devnet-full.toml index 64db9b1c59..65978ee47a 100644 --- a/prover/config/config-devnet-full.toml +++ b/prover/config/config-devnet-full.toml @@ -1,5 +1,5 @@ environment = "devnet" -version = "6.0.8" # TODO @gbotrel hunt all version definitions. +version = "6.1.3" # TODO @gbotrel hunt all version definitions. assets_dir = "./prover-assets" log_level = 4 # TODO @gbotrel will be refactored with new logger. @@ -71,7 +71,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -167,28 +167,47 @@ U24 = 262144 U23 = 262144 U20 = 262144 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 1 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 2 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 8 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 2 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 8 -BLS = 0 -POINT_EVAL = 0 BLS_DATA = 4096 RLP_UTILS = 131072 POWER_REFERENCE_TABLE = 32 BLS_REFERENCE_TABLE = 512 +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 128 + +BIT_XOAN_U2 = 262144 +BIT_XOAN_U4 = 262144 +BIT_XOAN_U8 = 262144 +BIT_XOAN_U16 = 262144 +BIT_XOAN_U32 = 262144 +BIT_XOAN_U64 = 262144 +BIT_XOAN_U128 = 262144 +BIT_XOAN_U256 = 262144 +BYTE_16 = 262144 +BYTE_32 = 262144 +BYTE_64 = 262144 +BYTE_128 = 262144 +BYTE_256 = 262144 +SIGNEXTEND = 262144 +MAX3_U128 = 262144 +MAXLOG = 262144 +# End of new Osaka modules + [traces_limits_large] ADD = 524288 BIN = 524288 @@ -224,8 +243,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 @@ -239,24 +258,125 @@ BLOCK_TRANSACTIONS = 300 BIN_REFERENCE_TABLE = 262144 INSTRUCTION_DECODER = 512 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 +BIT_SHL256 = 524288 +BIT_SHL256_U7 = 524288 +BIT_SHL256_U6 = 524288 +BIT_SHL256_U5 = 524288 +BIT_SHL256_U4 = 524288 +BIT_SHL256_U3 = 524288 +BIT_SHL256_U2 = 524288 +BIT_SHL256_U1 = 524288 +BIT_SHR256 = 524288 +BIT_SHR256_U7 = 524288 +BIT_SHR256_U6 = 524288 +BIT_SHR256_U5 = 524288 +BIT_SHR256_U4 = 524288 +BIT_SHR256_U3 = 524288 +BIT_SHR256_U2 = 524288 +BIT_SHR256_U1 = 524288 +BIT_SAR256 = 524288 +BIT_SAR256_U7 = 524288 +BIT_SAR256_U6 = 524288 +BIT_SAR256_U5 = 524288 +BIT_SAR256_U4 = 524288 +BIT_SAR256_U3 = 524288 +BIT_SAR256_U2 = 524288 +BIT_SAR256_U1 = 524288 +CALL_GAS_EXTRA = 524288 +FILL_BYTES_BETWEEN = 524288 +GAS_OUT_OF_POCKET = 524288 +LOG2 = 524288 +LOG2_U128 = 524288 +LOG2_U64 = 524288 +LOG2_U32 = 524288 +LOG2_U16 = 524288 +LOG2_U8 = 524288 +LOG2_U4 = 524288 +LOG2_U2 = 524288 +LOG256 = 524288 +LOG256_U128 = 524288 +LOG256_U64 = 524288 +LOG256_U32 = 524288 +LOG256_U16 = 524288 +MIN256_64 = 524288 +SET_BYTE256 = 524288 +SET_BYTE128 = 524288 +SET_BYTE64 = 524288 +SET_BYTE32 = 524288 +SET_BYTE16 = 524288 + +U128 = 524288 +U127 = 524288 +U126 = 524288 +U125 = 524288 +U124 = 524288 +U123 = 524288 +U120 = 524288 +U119 = 524288 +U112 = 524288 +U111 = 524288 +U96 = 524288 +U95 = 524288 +U64 = 524288 +U63 = 524288 +U62 = 524288 +U61 = 524288 +U60 = 524288 +U59 = 524288 +U58 = 524288 +U56 = 524288 +U55 = 524288 +U48 = 524288 +U47 = 524288 +U36 = 524288 +U32 = 524288 +U31 = 524288 +U30 = 524288 +U29 = 524288 +U28 = 524288 +U27 = 524288 +U26 = 524288 +U24 = 524288 +U23 = 524288 +U20 = 524288 + +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 2 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 16 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 4 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 16 -BLS = 0 -POINT_EVAL = 0 BLS_DATA = 8192 RLP_UTILS = 262144 POWER_REFERENCE_TABLE = 32 BLS_REFERENCE_TABLE = 512 + +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 256 + +BIT_XOAN_U2 = 524288 +BIT_XOAN_U4 = 524288 +BIT_XOAN_U8 = 524288 +BIT_XOAN_U16 = 524288 +BIT_XOAN_U32 = 524288 +BIT_XOAN_U64 = 524288 +BIT_XOAN_U128 = 524288 +BIT_XOAN_U256 = 524288 +BYTE_16 = 524288 +BYTE_32 = 524288 +BYTE_64 = 524288 +BYTE_128 = 524288 +BYTE_256 = 524288 +SIGNEXTEND = 524288 +MAX3_U128 = 524288 +MAXLOG = 524288 +# End of new Osaka modules diff --git a/prover/config/config-mainnet-limitless.toml b/prover/config/config-mainnet-limitless.toml index cfb6627e44..c866f6a383 100644 --- a/prover/config/config-mainnet-limitless.toml +++ b/prover/config/config-mainnet-limitless.toml @@ -1,5 +1,5 @@ environment = "mainnet" -version = "6.1.1" # TODO @gbotrel hunt all version definitions. +version = "6.1.3" # TODO @gbotrel hunt all version definitions. assets_dir = "./prover-assets" log_level = 4 # TODO @gbotrel will be refactored with new logger. @@ -76,7 +76,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -172,28 +172,47 @@ U24 = 262144 U23 = 262144 U20 = 262144 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 1 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 2 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 8 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 2 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 8 -BLS = 0 -POINT_EVAL = 0 BLS_DATA = 4096 RLP_UTILS = 131072 POWER_REFERENCE_TABLE = 32 BLS_REFERENCE_TABLE = 512 +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 128 + +BIT_XOAN_U2 = 262144 +BIT_XOAN_U4 = 262144 +BIT_XOAN_U8 = 262144 +BIT_XOAN_U16 = 262144 +BIT_XOAN_U32 = 262144 +BIT_XOAN_U64 = 262144 +BIT_XOAN_U128 = 262144 +BIT_XOAN_U256 = 262144 +BYTE_16 = 262144 +BYTE_32 = 262144 +BYTE_64 = 262144 +BYTE_128 = 262144 +BYTE_256 = 262144 +SIGNEXTEND = 262144 +MAX3_U128 = 262144 +MAXLOG = 262144 +# End of new Osaka modules + [traces_limits_large] ADD = 524288 BIN = 524288 @@ -229,8 +248,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 @@ -326,24 +345,43 @@ U24 = 524288 U23 = 524288 U20 = 524288 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 2 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 16 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 4 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 16 -BLS = 0 -POINT_EVAL = 0 BLS_DATA = 8192 RLP_UTILS = 262144 POWER_REFERENCE_TABLE = 32 BLS_REFERENCE_TABLE = 512 + +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 256 + +BIT_XOAN_U2 = 524288 +BIT_XOAN_U4 = 524288 +BIT_XOAN_U8 = 524288 +BIT_XOAN_U16 = 524288 +BIT_XOAN_U32 = 524288 +BIT_XOAN_U64 = 524288 +BIT_XOAN_U128 = 524288 +BIT_XOAN_U256 = 524288 +BYTE_16 = 524288 +BYTE_32 = 524288 +BYTE_64 = 524288 +BYTE_128 = 524288 +BYTE_256 = 524288 +SIGNEXTEND = 524288 +MAX3_U128 = 524288 +MAXLOG = 524288 +# End of new Osaka modules diff --git a/prover/config/config-sepolia-limitless.toml b/prover/config/config-sepolia-limitless.toml index b83d7a049e..6d68a81348 100644 --- a/prover/config/config-sepolia-limitless.toml +++ b/prover/config/config-sepolia-limitless.toml @@ -1,5 +1,5 @@ environment = "sepolia" -version = "6.1.1" # TODO @gbotrel hunt all version definitions. +version = "6.1.3" # TODO @gbotrel hunt all version definitions. assets_dir = "./prover-assets" log_level = 4 # TODO @gbotrel will be refactored with new logger. @@ -74,7 +74,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -170,28 +170,47 @@ U24 = 262144 U23 = 262144 U20 = 262144 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 1 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 2 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 8 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 2 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 8 -BLS = 0 -POINT_EVAL = 0 BLS_DATA = 4096 RLP_UTILS = 131072 POWER_REFERENCE_TABLE = 32 BLS_REFERENCE_TABLE = 512 +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 128 + +BIT_XOAN_U2 = 262144 +BIT_XOAN_U4 = 262144 +BIT_XOAN_U8 = 262144 +BIT_XOAN_U16 = 262144 +BIT_XOAN_U32 = 262144 +BIT_XOAN_U64 = 262144 +BIT_XOAN_U128 = 262144 +BIT_XOAN_U256 = 262144 +BYTE_16 = 262144 +BYTE_32 = 262144 +BYTE_64 = 262144 +BYTE_128 = 262144 +BYTE_256 = 262144 +SIGNEXTEND = 262144 +MAX3_U128 = 262144 +MAXLOG = 262144 +# End of new Osaka modules + [traces_limits_large] ADD = 524288 BIN = 524288 @@ -227,8 +246,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 @@ -324,24 +343,43 @@ U24 = 524288 U23 = 524288 U20 = 524288 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 2 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 16 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 4 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 16 -BLS = 0 -POINT_EVAL = 0 BLS_DATA = 8192 RLP_UTILS = 262144 POWER_REFERENCE_TABLE = 32 BLS_REFERENCE_TABLE = 512 + +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 256 + +BIT_XOAN_U2 = 524288 +BIT_XOAN_U4 = 524288 +BIT_XOAN_U8 = 524288 +BIT_XOAN_U16 = 524288 +BIT_XOAN_U32 = 524288 +BIT_XOAN_U64 = 524288 +BIT_XOAN_U128 = 524288 +BIT_XOAN_U256 = 524288 +BYTE_16 = 524288 +BYTE_32 = 524288 +BYTE_64 = 524288 +BYTE_128 = 524288 +BYTE_256 = 524288 +SIGNEXTEND = 524288 +MAX3_U128 = 524288 +MAXLOG = 524288 +# End of new Osaka modules diff --git a/prover/config/config_default.go b/prover/config/config_default.go index 3156c7597e..cb7705bafe 100644 --- a/prover/config/config_default.go +++ b/prover/config/config_default.go @@ -92,7 +92,7 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits.PRECOMPILE_RIPEMD_BLOCKS", 0) viper.SetDefault("traces_limits.PRECOMPILE_MODEXP_EFFECTIVE_CALLS", 32) viper.SetDefault("traces_limits.PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096", 1) - viper.SetDefault("traces_limits.PRECOMPILE_ECADD_EFFECTIVE_CALLS", 256) + viper.SetDefault("traces_limits.PRECOMPILE_ECADD_EFFECTIVE_CALLS", 2048) viper.SetDefault("traces_limits.PRECOMPILE_ECMUL_EFFECTIVE_CALLS", 40) viper.SetDefault("traces_limits.PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS", 16) viper.SetDefault("traces_limits.PRECOMPILE_ECPAIRING_MILLER_LOOPS", 64) @@ -105,124 +105,128 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits.BLOCK_TRANSACTIONS", 300) viper.SetDefault("traces_limits.BIN_REFERENCE_TABLE", 262144) viper.SetDefault("traces_limits.INSTRUCTION_DECODER", 512) - viper.SetDefault("traces_limits.BIT_SHL256", 131072) - viper.SetDefault("traces_limits.BIT_SHL256_U7", 131072) - viper.SetDefault("traces_limits.BIT_SHL256_U6", 131072) - viper.SetDefault("traces_limits.BIT_SHL256_U5", 131072) - viper.SetDefault("traces_limits.BIT_SHL256_U4", 131072) - viper.SetDefault("traces_limits.BIT_SHL256_U3", 131072) - viper.SetDefault("traces_limits.BIT_SHL256_U2", 131072) - viper.SetDefault("traces_limits.BIT_SHL256_U1", 131072) - viper.SetDefault("traces_limits.BIT_SHR256", 131072) - viper.SetDefault("traces_limits.BIT_SHR256_U7", 131072) - viper.SetDefault("traces_limits.BIT_SHR256_U6", 131072) - viper.SetDefault("traces_limits.BIT_SHR256_U5", 131072) - viper.SetDefault("traces_limits.BIT_SHR256_U4", 131072) - viper.SetDefault("traces_limits.BIT_SHR256_U3", 131072) - viper.SetDefault("traces_limits.BIT_SHR256_U2", 131072) - viper.SetDefault("traces_limits.BIT_SHR256_U1", 131072) - viper.SetDefault("traces_limits.BIT_SAR256", 131072) - viper.SetDefault("traces_limits.BIT_SAR256_U7", 131072) - viper.SetDefault("traces_limits.BIT_SAR256_U6", 131072) - viper.SetDefault("traces_limits.BIT_SAR256_U5", 131072) - viper.SetDefault("traces_limits.BIT_SAR256_U4", 131072) - viper.SetDefault("traces_limits.BIT_SAR256_U3", 131072) - viper.SetDefault("traces_limits.BIT_SAR256_U2", 131072) - viper.SetDefault("traces_limits.BIT_SAR256_U1", 131072) - viper.SetDefault("traces_limits.CALL_GAS_EXTRA", 131072) - viper.SetDefault("traces_limits.FILL_BYTES_BETWEEN", 131072) - viper.SetDefault("traces_limits.GAS_OUT_OF_POCKET", 131072) - viper.SetDefault("traces_limits.LOG2", 131072) - viper.SetDefault("traces_limits.LOG2_U128", 131072) - viper.SetDefault("traces_limits.LOG2_U64", 131072) - viper.SetDefault("traces_limits.LOG2_U32", 131072) - viper.SetDefault("traces_limits.LOG2_U16", 131072) - viper.SetDefault("traces_limits.LOG2_U8", 131072) - viper.SetDefault("traces_limits.LOG2_U4", 131072) - viper.SetDefault("traces_limits.LOG2_U2", 131072) - viper.SetDefault("traces_limits.LOG256", 131072) - viper.SetDefault("traces_limits.LOG256_U128", 131072) - viper.SetDefault("traces_limits.LOG256_U64", 131072) - viper.SetDefault("traces_limits.LOG256_U32", 131072) - viper.SetDefault("traces_limits.LOG256_U16", 131072) - viper.SetDefault("traces_limits.MIN256_64", 131072) - viper.SetDefault("traces_limits.SET_BYTE256", 131072) - viper.SetDefault("traces_limits.SET_BYTE128", 131072) - viper.SetDefault("traces_limits.SET_BYTE64", 131072) - viper.SetDefault("traces_limits.SET_BYTE32", 131072) - viper.SetDefault("traces_limits.SET_BYTE16", 131072) - viper.SetDefault("traces_limits.U128", 131072) - viper.SetDefault("traces_limits.U127", 131072) - viper.SetDefault("traces_limits.U126", 131072) - viper.SetDefault("traces_limits.U125", 131072) - viper.SetDefault("traces_limits.U124", 131072) - viper.SetDefault("traces_limits.U123", 131072) - viper.SetDefault("traces_limits.U120", 131072) - viper.SetDefault("traces_limits.U119", 131072) - viper.SetDefault("traces_limits.U112", 131072) - viper.SetDefault("traces_limits.U111", 131072) - viper.SetDefault("traces_limits.U96", 131072) - viper.SetDefault("traces_limits.U95", 131072) - viper.SetDefault("traces_limits.U64", 131072) - viper.SetDefault("traces_limits.U63", 131072) - viper.SetDefault("traces_limits.U62", 131072) - viper.SetDefault("traces_limits.U61", 131072) - viper.SetDefault("traces_limits.U60", 131072) - viper.SetDefault("traces_limits.U59", 131072) - viper.SetDefault("traces_limits.U58", 131072) - viper.SetDefault("traces_limits.U56", 131072) - viper.SetDefault("traces_limits.U55", 131072) - viper.SetDefault("traces_limits.U48", 131072) - viper.SetDefault("traces_limits.U47", 131072) - viper.SetDefault("traces_limits.U36", 131072) - viper.SetDefault("traces_limits.U32", 131072) - viper.SetDefault("traces_limits.U31", 131072) - viper.SetDefault("traces_limits.U30", 131072) - viper.SetDefault("traces_limits.U29", 131072) - viper.SetDefault("traces_limits.U28", 131072) - viper.SetDefault("traces_limits.U27", 131072) - viper.SetDefault("traces_limits.U26", 131072) - viper.SetDefault("traces_limits.U24", 131072) - viper.SetDefault("traces_limits.U23", 131072) - viper.SetDefault("traces_limits.U20", 131072) - // Start of new modules for Osaka - viper.SetDefault("traces_limits.BIT_XOAN_U2", 131072) - viper.SetDefault("traces_limits.BIT_XOAN_U4", 131072) - viper.SetDefault("traces_limits.BIT_XOAN_U8", 131072) - viper.SetDefault("traces_limits.BIT_XOAN_U16", 131072) - viper.SetDefault("traces_limits.BIT_XOAN_U32", 131072) - viper.SetDefault("traces_limits.BIT_XOAN_U64", 131072) - viper.SetDefault("traces_limits.BIT_XOAN_U128", 131072) - viper.SetDefault("traces_limits.BIT_XOAN_U256", 131072) - viper.SetDefault("traces_limits.BYTE_16", 131072) - viper.SetDefault("traces_limits.BYTE_32", 131072) - viper.SetDefault("traces_limits.BYTE_64", 131072) - viper.SetDefault("traces_limits.BYTE_128", 131072) - viper.SetDefault("traces_limits.BYTE_256", 131072) - viper.SetDefault("traces_limits.SIGNEXTEND", 131072) - viper.SetDefault("traces_limits.MAX3_U128", 131072) - viper.SetDefault("traces_limits.MAXLOG", 131072) - // End of new modules for Osaka - viper.SetDefault("traces_limits.PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_FINAL_EXPONENTIATIONS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS", 0) - viper.SetDefault("traces_limits.PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS", 0) - viper.SetDefault("traces_limits.BLS", 0) - viper.SetDefault("traces_limits.POINT_EVAL", 0) + + viper.SetDefault("traces_limits.BIT_SHL256", 262144) + viper.SetDefault("traces_limits.BIT_SHL256_U7", 262144) + viper.SetDefault("traces_limits.BIT_SHL256_U6", 262144) + viper.SetDefault("traces_limits.BIT_SHL256_U5", 262144) + viper.SetDefault("traces_limits.BIT_SHL256_U4", 262144) + viper.SetDefault("traces_limits.BIT_SHL256_U3", 262144) + viper.SetDefault("traces_limits.BIT_SHL256_U2", 262144) + viper.SetDefault("traces_limits.BIT_SHL256_U1", 262144) + viper.SetDefault("traces_limits.BIT_SHR256", 262144) + viper.SetDefault("traces_limits.BIT_SHR256_U7", 262144) + viper.SetDefault("traces_limits.BIT_SHR256_U6", 262144) + viper.SetDefault("traces_limits.BIT_SHR256_U5", 262144) + viper.SetDefault("traces_limits.BIT_SHR256_U4", 262144) + viper.SetDefault("traces_limits.BIT_SHR256_U3", 262144) + viper.SetDefault("traces_limits.BIT_SHR256_U2", 262144) + viper.SetDefault("traces_limits.BIT_SHR256_U1", 262144) + viper.SetDefault("traces_limits.BIT_SAR256", 262144) + viper.SetDefault("traces_limits.BIT_SAR256_U7", 262144) + viper.SetDefault("traces_limits.BIT_SAR256_U6", 262144) + viper.SetDefault("traces_limits.BIT_SAR256_U5", 262144) + viper.SetDefault("traces_limits.BIT_SAR256_U4", 262144) + viper.SetDefault("traces_limits.BIT_SAR256_U3", 262144) + viper.SetDefault("traces_limits.BIT_SAR256_U2", 262144) + viper.SetDefault("traces_limits.BIT_SAR256_U1", 262144) + viper.SetDefault("traces_limits.CALL_GAS_EXTRA", 262144) + viper.SetDefault("traces_limits.FILL_BYTES_BETWEEN", 262144) + viper.SetDefault("traces_limits.GAS_OUT_OF_POCKET", 262144) + viper.SetDefault("traces_limits.LOG2", 262144) + viper.SetDefault("traces_limits.LOG2_U128", 262144) + viper.SetDefault("traces_limits.LOG2_U64", 262144) + viper.SetDefault("traces_limits.LOG2_U32", 262144) + viper.SetDefault("traces_limits.LOG2_U16", 262144) + viper.SetDefault("traces_limits.LOG2_U8", 262144) + viper.SetDefault("traces_limits.LOG2_U4", 262144) + viper.SetDefault("traces_limits.LOG2_U2", 262144) + viper.SetDefault("traces_limits.LOG256", 262144) + viper.SetDefault("traces_limits.LOG256_U128", 262144) + viper.SetDefault("traces_limits.LOG256_U64", 262144) + viper.SetDefault("traces_limits.LOG256_U32", 262144) + viper.SetDefault("traces_limits.LOG256_U16", 262144) + viper.SetDefault("traces_limits.MIN256_64", 262144) + viper.SetDefault("traces_limits.SET_BYTE256", 262144) + viper.SetDefault("traces_limits.SET_BYTE128", 262144) + viper.SetDefault("traces_limits.SET_BYTE64", 262144) + viper.SetDefault("traces_limits.SET_BYTE32", 262144) + viper.SetDefault("traces_limits.SET_BYTE16", 262144) + + viper.SetDefault("traces_limits.U128", 262144) + viper.SetDefault("traces_limits.U127", 262144) + viper.SetDefault("traces_limits.U126", 262144) + viper.SetDefault("traces_limits.U125", 262144) + viper.SetDefault("traces_limits.U124", 262144) + viper.SetDefault("traces_limits.U123", 262144) + viper.SetDefault("traces_limits.U120", 262144) + viper.SetDefault("traces_limits.U119", 262144) + viper.SetDefault("traces_limits.U112", 262144) + viper.SetDefault("traces_limits.U111", 262144) + viper.SetDefault("traces_limits.U96", 262144) + viper.SetDefault("traces_limits.U95", 262144) + viper.SetDefault("traces_limits.U64", 262144) + viper.SetDefault("traces_limits.U63", 262144) + viper.SetDefault("traces_limits.U62", 262144) + viper.SetDefault("traces_limits.U61", 262144) + viper.SetDefault("traces_limits.U60", 262144) + viper.SetDefault("traces_limits.U59", 262144) + viper.SetDefault("traces_limits.U58", 262144) + viper.SetDefault("traces_limits.U56", 262144) + viper.SetDefault("traces_limits.U55", 262144) + viper.SetDefault("traces_limits.U48", 262144) + viper.SetDefault("traces_limits.U47", 262144) + viper.SetDefault("traces_limits.U36", 262144) + viper.SetDefault("traces_limits.U32", 262144) + viper.SetDefault("traces_limits.U31", 262144) + viper.SetDefault("traces_limits.U30", 262144) + viper.SetDefault("traces_limits.U29", 262144) + viper.SetDefault("traces_limits.U28", 262144) + viper.SetDefault("traces_limits.U27", 262144) + viper.SetDefault("traces_limits.U26", 262144) + viper.SetDefault("traces_limits.U24", 262144) + viper.SetDefault("traces_limits.U23", 262144) + viper.SetDefault("traces_limits.U20", 262144) + + viper.SetDefault("traces_limits.PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS", 1) + viper.SetDefault("traces_limits.PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS", 2) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS", 8) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS", 4) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS", 8) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS", 4) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS", 8) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_FINAL_EXPONENTIATIONS", 2) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS", 4) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS", 4) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS", 8) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS", 8) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS", 8) + viper.SetDefault("traces_limits.PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS", 8) viper.SetDefault("traces_limits.BLS_DATA", 4096) viper.SetDefault("traces_limits.RLP_UTILS", 131072) viper.SetDefault("traces_limits.POWER_REFERENCE_TABLE", 32) - viper.SetDefault("traces_limits.BLS_REFERENCE_TABLE", 256) + viper.SetDefault("traces_limits.BLS_REFERENCE_TABLE", 512) + + // Start of new Osaka modules + viper.SetDefault("traces_limits.PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS", 128) + + viper.SetDefault("traces_limits.BIT_XOAN_U2", 262144) + viper.SetDefault("traces_limits.BIT_XOAN_U4", 262144) + viper.SetDefault("traces_limits.BIT_XOAN_U8", 262144) + viper.SetDefault("traces_limits.BIT_XOAN_U16", 262144) + viper.SetDefault("traces_limits.BIT_XOAN_U32", 262144) + viper.SetDefault("traces_limits.BIT_XOAN_U64", 262144) + viper.SetDefault("traces_limits.BIT_XOAN_U128", 262144) + viper.SetDefault("traces_limits.BIT_XOAN_U256", 262144) + viper.SetDefault("traces_limits.BYTE_16", 262144) + viper.SetDefault("traces_limits.BYTE_32", 262144) + viper.SetDefault("traces_limits.BYTE_64", 262144) + viper.SetDefault("traces_limits.BYTE_128", 262144) + viper.SetDefault("traces_limits.BYTE_256", 262144) + viper.SetDefault("traces_limits.SIGNEXTEND", 262144) + viper.SetDefault("traces_limits.MAX3_U128", 262144) + viper.SetDefault("traces_limits.MAXLOG", 262144) + // End of new Osaka modules // [traces_limits_large] viper.SetDefault("traces_limits_large.ADD", 524288) @@ -259,8 +263,8 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits_large.PRECOMPILE_SHA2_BLOCKS", 400) viper.SetDefault("traces_limits_large.PRECOMPILE_RIPEMD_BLOCKS", 0) viper.SetDefault("traces_limits_large.PRECOMPILE_MODEXP_EFFECTIVE_CALLS", 64) - viper.SetDefault("traces_limits_large.PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096", 1) - viper.SetDefault("traces_limits_large.PRECOMPILE_ECADD_EFFECTIVE_CALLS", 512) + viper.SetDefault("traces_limits_large.PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096", 2) + viper.SetDefault("traces_limits_large.PRECOMPILE_ECADD_EFFECTIVE_CALLS", 1024) viper.SetDefault("traces_limits_large.PRECOMPILE_ECMUL_EFFECTIVE_CALLS", 80) viper.SetDefault("traces_limits_large.PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS", 32) viper.SetDefault("traces_limits_large.PRECOMPILE_ECPAIRING_MILLER_LOOPS", 128) @@ -273,123 +277,127 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits_large.BLOCK_TRANSACTIONS", 300) viper.SetDefault("traces_limits_large.BIN_REFERENCE_TABLE", 262144) viper.SetDefault("traces_limits_large.INSTRUCTION_DECODER", 512) - viper.SetDefault("traces_limits_large.BIT_SHL256", 262144) - viper.SetDefault("traces_limits_large.BIT_SHL256_U7", 262144) - viper.SetDefault("traces_limits_large.BIT_SHL256_U6", 262144) - viper.SetDefault("traces_limits_large.BIT_SHL256_U5", 262144) - viper.SetDefault("traces_limits_large.BIT_SHL256_U4", 262144) - viper.SetDefault("traces_limits_large.BIT_SHL256_U3", 262144) - viper.SetDefault("traces_limits_large.BIT_SHL256_U2", 262144) - viper.SetDefault("traces_limits_large.BIT_SHL256_U1", 262144) - viper.SetDefault("traces_limits_large.BIT_SHR256", 262144) - viper.SetDefault("traces_limits_large.BIT_SHR256_U7", 262144) - viper.SetDefault("traces_limits_large.BIT_SHR256_U6", 262144) - viper.SetDefault("traces_limits_large.BIT_SHR256_U5", 262144) - viper.SetDefault("traces_limits_large.BIT_SHR256_U4", 262144) - viper.SetDefault("traces_limits_large.BIT_SHR256_U3", 262144) - viper.SetDefault("traces_limits_large.BIT_SHR256_U2", 262144) - viper.SetDefault("traces_limits_large.BIT_SHR256_U1", 262144) - viper.SetDefault("traces_limits_large.BIT_SAR256", 262144) - viper.SetDefault("traces_limits_large.BIT_SAR256_U7", 262144) - viper.SetDefault("traces_limits_large.BIT_SAR256_U6", 262144) - viper.SetDefault("traces_limits_large.BIT_SAR256_U5", 262144) - viper.SetDefault("traces_limits_large.BIT_SAR256_U4", 262144) - viper.SetDefault("traces_limits_large.BIT_SAR256_U3", 262144) - viper.SetDefault("traces_limits_large.BIT_SAR256_U2", 262144) - viper.SetDefault("traces_limits_large.BIT_SAR256_U1", 262144) - viper.SetDefault("traces_limits_large.CALL_GAS_EXTRA", 262144) - viper.SetDefault("traces_limits_large.FILL_BYTES_BETWEEN", 262144) - viper.SetDefault("traces_limits_large.GAS_OUT_OF_POCKET", 262144) - viper.SetDefault("traces_limits_large.LOG2", 262144) - viper.SetDefault("traces_limits_large.LOG2_U128", 262144) - viper.SetDefault("traces_limits_large.LOG2_U64", 262144) - viper.SetDefault("traces_limits_large.LOG2_U32", 262144) - viper.SetDefault("traces_limits_large.LOG2_U16", 262144) - viper.SetDefault("traces_limits_large.LOG2_U8", 262144) - viper.SetDefault("traces_limits_large.LOG2_U4", 262144) - viper.SetDefault("traces_limits_large.LOG2_U2", 262144) - viper.SetDefault("traces_limits_large.LOG256", 262144) - viper.SetDefault("traces_limits_large.LOG256_U128", 262144) - viper.SetDefault("traces_limits_large.LOG256_U64", 262144) - viper.SetDefault("traces_limits_large.LOG256_U32", 262144) - viper.SetDefault("traces_limits_large.LOG256_U16", 262144) - viper.SetDefault("traces_limits_large.MIN256_64", 262144) - viper.SetDefault("traces_limits_large.SET_BYTE256", 262144) - viper.SetDefault("traces_limits_large.SET_BYTE128", 262144) - viper.SetDefault("traces_limits_large.SET_BYTE64", 262144) - viper.SetDefault("traces_limits_large.SET_BYTE32", 262144) - viper.SetDefault("traces_limits_large.SET_BYTE16", 262144) - viper.SetDefault("traces_limits_large.U128", 262144) - viper.SetDefault("traces_limits_large.U127", 262144) - viper.SetDefault("traces_limits_large.U126", 262144) - viper.SetDefault("traces_limits_large.U125", 262144) - viper.SetDefault("traces_limits_large.U124", 262144) - viper.SetDefault("traces_limits_large.U123", 262144) - viper.SetDefault("traces_limits_large.U120", 262144) - viper.SetDefault("traces_limits_large.U119", 262144) - viper.SetDefault("traces_limits_large.U112", 262144) - viper.SetDefault("traces_limits_large.U111", 262144) - viper.SetDefault("traces_limits_large.U96", 262144) - viper.SetDefault("traces_limits_large.U95", 262144) - viper.SetDefault("traces_limits_large.U64", 262144) - viper.SetDefault("traces_limits_large.U63", 262144) - viper.SetDefault("traces_limits_large.U62", 262144) - viper.SetDefault("traces_limits_large.U61", 262144) - viper.SetDefault("traces_limits_large.U60", 262144) - viper.SetDefault("traces_limits_large.U59", 262144) - viper.SetDefault("traces_limits_large.U58", 262144) - viper.SetDefault("traces_limits_large.U56", 262144) - viper.SetDefault("traces_limits_large.U55", 262144) - viper.SetDefault("traces_limits_large.U48", 262144) - viper.SetDefault("traces_limits_large.U47", 262144) - viper.SetDefault("traces_limits_large.U36", 262144) - viper.SetDefault("traces_limits_large.U32", 262144) - viper.SetDefault("traces_limits_large.U31", 262144) - viper.SetDefault("traces_limits_large.U30", 262144) - viper.SetDefault("traces_limits_large.U29", 262144) - viper.SetDefault("traces_limits_large.U28", 262144) - viper.SetDefault("traces_limits_large.U27", 262144) - viper.SetDefault("traces_limits_large.U26", 262144) - viper.SetDefault("traces_limits_large.U24", 262144) - viper.SetDefault("traces_limits_large.U23", 262144) - viper.SetDefault("traces_limits_large.U20", 262144) - // Start of new modules for Osaka - viper.SetDefault("traces_limits_large.BIT_XOAN_U2", 262144) - viper.SetDefault("traces_limits_large.BIT_XOAN_U4", 262144) - viper.SetDefault("traces_limits_large.BIT_XOAN_U8", 262144) - viper.SetDefault("traces_limits_large.BIT_XOAN_U16", 262144) - viper.SetDefault("traces_limits_large.BIT_XOAN_U32", 262144) - viper.SetDefault("traces_limits_large.BIT_XOAN_U64", 262144) - viper.SetDefault("traces_limits_large.BIT_XOAN_U128", 262144) - viper.SetDefault("traces_limits_large.BIT_XOAN_U256", 262144) - viper.SetDefault("traces_limits_large.BYTE_16", 262144) - viper.SetDefault("traces_limits_large.BYTE_32", 262144) - viper.SetDefault("traces_limits_large.BYTE_64", 262144) - viper.SetDefault("traces_limits_large.BYTE_128", 262144) - viper.SetDefault("traces_limits_large.BYTE_256", 262144) - viper.SetDefault("traces_limits_large.SIGNEXTEND", 262144) - viper.SetDefault("traces_limits_large.MAX3_U128", 262144) - viper.SetDefault("traces_limits_large.MAXLOG", 262144) - // End of new modules for Osaka - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_FINAL_EXPONENTIATIONS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS", 0) - viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS", 0) - viper.SetDefault("traces_limits_large.BLS", 0) - viper.SetDefault("traces_limits_large.POINT_EVAL", 0) + + viper.SetDefault("traces_limits_large.BIT_SHL256", 524288) + viper.SetDefault("traces_limits_large.BIT_SHL256_U7", 524288) + viper.SetDefault("traces_limits_large.BIT_SHL256_U6", 524288) + viper.SetDefault("traces_limits_large.BIT_SHL256_U5", 524288) + viper.SetDefault("traces_limits_large.BIT_SHL256_U4", 524288) + viper.SetDefault("traces_limits_large.BIT_SHL256_U3", 524288) + viper.SetDefault("traces_limits_large.BIT_SHL256_U2", 524288) + viper.SetDefault("traces_limits_large.BIT_SHL256_U1", 524288) + viper.SetDefault("traces_limits_large.BIT_SHR256", 524288) + viper.SetDefault("traces_limits_large.BIT_SHR256_U7", 524288) + viper.SetDefault("traces_limits_large.BIT_SHR256_U6", 524288) + viper.SetDefault("traces_limits_large.BIT_SHR256_U5", 524288) + viper.SetDefault("traces_limits_large.BIT_SHR256_U4", 524288) + viper.SetDefault("traces_limits_large.BIT_SHR256_U3", 524288) + viper.SetDefault("traces_limits_large.BIT_SHR256_U2", 524288) + viper.SetDefault("traces_limits_large.BIT_SHR256_U1", 524288) + viper.SetDefault("traces_limits_large.BIT_SAR256", 524288) + viper.SetDefault("traces_limits_large.BIT_SAR256_U7", 524288) + viper.SetDefault("traces_limits_large.BIT_SAR256_U6", 524288) + viper.SetDefault("traces_limits_large.BIT_SAR256_U5", 524288) + viper.SetDefault("traces_limits_large.BIT_SAR256_U4", 524288) + viper.SetDefault("traces_limits_large.BIT_SAR256_U3", 524288) + viper.SetDefault("traces_limits_large.BIT_SAR256_U2", 524288) + viper.SetDefault("traces_limits_large.BIT_SAR256_U1", 524288) + viper.SetDefault("traces_limits_large.CALL_GAS_EXTRA", 524288) + viper.SetDefault("traces_limits_large.FILL_BYTES_BETWEEN", 524288) + viper.SetDefault("traces_limits_large.GAS_OUT_OF_POCKET", 524288) + viper.SetDefault("traces_limits_large.LOG2", 524288) + viper.SetDefault("traces_limits_large.LOG2_U128", 524288) + viper.SetDefault("traces_limits_large.LOG2_U64", 524288) + viper.SetDefault("traces_limits_large.LOG2_U32", 524288) + viper.SetDefault("traces_limits_large.LOG2_U16", 524288) + viper.SetDefault("traces_limits_large.LOG2_U8", 524288) + viper.SetDefault("traces_limits_large.LOG2_U4", 524288) + viper.SetDefault("traces_limits_large.LOG2_U2", 524288) + viper.SetDefault("traces_limits_large.LOG256", 524288) + viper.SetDefault("traces_limits_large.LOG256_U128", 524288) + viper.SetDefault("traces_limits_large.LOG256_U64", 524288) + viper.SetDefault("traces_limits_large.LOG256_U32", 524288) + viper.SetDefault("traces_limits_large.LOG256_U16", 524288) + viper.SetDefault("traces_limits_large.MIN256_64", 524288) + viper.SetDefault("traces_limits_large.SET_BYTE256", 524288) + viper.SetDefault("traces_limits_large.SET_BYTE128", 524288) + viper.SetDefault("traces_limits_large.SET_BYTE64", 524288) + viper.SetDefault("traces_limits_large.SET_BYTE32", 524288) + viper.SetDefault("traces_limits_large.SET_BYTE16", 524288) + + viper.SetDefault("traces_limits_large.U128", 524288) + viper.SetDefault("traces_limits_large.U127", 524288) + viper.SetDefault("traces_limits_large.U126", 524288) + viper.SetDefault("traces_limits_large.U125", 524288) + viper.SetDefault("traces_limits_large.U124", 524288) + viper.SetDefault("traces_limits_large.U123", 524288) + viper.SetDefault("traces_limits_large.U120", 524288) + viper.SetDefault("traces_limits_large.U119", 524288) + viper.SetDefault("traces_limits_large.U112", 524288) + viper.SetDefault("traces_limits_large.U111", 524288) + viper.SetDefault("traces_limits_large.U96", 524288) + viper.SetDefault("traces_limits_large.U95", 524288) + viper.SetDefault("traces_limits_large.U64", 524288) + viper.SetDefault("traces_limits_large.U63", 524288) + viper.SetDefault("traces_limits_large.U62", 524288) + viper.SetDefault("traces_limits_large.U61", 524288) + viper.SetDefault("traces_limits_large.U60", 524288) + viper.SetDefault("traces_limits_large.U59", 524288) + viper.SetDefault("traces_limits_large.U58", 524288) + viper.SetDefault("traces_limits_large.U56", 524288) + viper.SetDefault("traces_limits_large.U55", 524288) + viper.SetDefault("traces_limits_large.U48", 524288) + viper.SetDefault("traces_limits_large.U47", 524288) + viper.SetDefault("traces_limits_large.U36", 524288) + viper.SetDefault("traces_limits_large.U32", 524288) + viper.SetDefault("traces_limits_large.U31", 524288) + viper.SetDefault("traces_limits_large.U30", 524288) + viper.SetDefault("traces_limits_large.U29", 524288) + viper.SetDefault("traces_limits_large.U28", 524288) + viper.SetDefault("traces_limits_large.U27", 524288) + viper.SetDefault("traces_limits_large.U26", 524288) + viper.SetDefault("traces_limits_large.U24", 524288) + viper.SetDefault("traces_limits_large.U23", 524288) + viper.SetDefault("traces_limits_large.U20", 524288) + + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS", 2) + viper.SetDefault("traces_limits_large.PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS", 4) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS", 16) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS", 8) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS", 16) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS", 8) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS", 16) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_FINAL_EXPONENTIATIONS", 4) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS", 8) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS", 8) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS", 16) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS", 16) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS", 16) + viper.SetDefault("traces_limits_large.PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS", 16) viper.SetDefault("traces_limits_large.BLS_DATA", 8192) viper.SetDefault("traces_limits_large.RLP_UTILS", 262144) viper.SetDefault("traces_limits_large.POWER_REFERENCE_TABLE", 32) - viper.SetDefault("traces_limits_large.BLS_REFERENCE_TABLE", 256) + viper.SetDefault("traces_limits_large.BLS_REFERENCE_TABLE", 512) + + // Start of new Osaka modules + viper.SetDefault("traces_limits.PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS", 256) + + viper.SetDefault("traces_limits_large.BIT_XOAN_U2", 524288) + viper.SetDefault("traces_limits_large.BIT_XOAN_U4", 524288) + viper.SetDefault("traces_limits_large.BIT_XOAN_U8", 524288) + viper.SetDefault("traces_limits_large.BIT_XOAN_U16", 524288) + viper.SetDefault("traces_limits_large.BIT_XOAN_U32", 524288) + viper.SetDefault("traces_limits_large.BIT_XOAN_U64", 524288) + viper.SetDefault("traces_limits_large.BIT_XOAN_U128", 524288) + viper.SetDefault("traces_limits_large.BIT_XOAN_U256", 524288) + viper.SetDefault("traces_limits_large.BYTE_16", 524288) + viper.SetDefault("traces_limits_large.BYTE_32", 524288) + viper.SetDefault("traces_limits_large.BYTE_64", 524288) + viper.SetDefault("traces_limits_large.BYTE_128", 524288) + viper.SetDefault("traces_limits_large.BYTE_256", 524288) + viper.SetDefault("traces_limits_large.SIGNEXTEND", 524288) + viper.SetDefault("traces_limits_large.MAX3_U128", 524288) + viper.SetDefault("traces_limits_large.MAXLOG", 524288) + // End of new Osaka modules } diff --git a/prover/config/traces_limit.go b/prover/config/traces_limit.go index ad53dbdadc..927d3e27e9 100644 --- a/prover/config/traces_limit.go +++ b/prover/config/traces_limit.go @@ -125,24 +125,6 @@ type TracesLimits struct { U24 int `mapstructure:"U24" validate:"power_of_2" corset:"u24"` U23 int `mapstructure:"U23" validate:"power_of_2" corset:"u23"` U20 int `mapstructure:"U20" validate:"power_of_2" corset:"u20"` - // Start of new modules for Osaka - BIT_XOAN_U2 int `mapstructure:"BIT_XOAN_U2" validate:"power_of_2" corset:"bit_xoan_u2"` - BIT_XOAN_U4 int `mapstructure:"BIT_XOAN_U4" validate:"power_of_2" corset:"bit_xoan_u4"` - BIT_XOAN_U8 int `mapstructure:"BIT_XOAN_U8" validate:"power_of_2" corset:"bit_xoan_u8"` - BIT_XOAN_U16 int `mapstructure:"BIT_XOAN_U16" validate:"power_of_2" corset:"bit_xoan_u16"` - BIT_XOAN_U32 int `mapstructure:"BIT_XOAN_U32" validate:"power_of_2" corset:"bit_xoan_u32"` - BIT_XOAN_U64 int `mapstructure:"BIT_XOAN_U64" validate:"power_of_2" corset:"bit_xoan_u64"` - BIT_XOAN_U128 int `mapstructure:"BIT_XOAN_U128" validate:"power_of_2" corset:"bit_xoan_u128"` - BIT_XOAN_U256 int `mapstructure:"BIT_XOAN_U256" validate:"power_of_2" corset:"bit_xoan_u256"` - BYTE_16 int `mapstructure:"BYTE_16" validate:"power_of_2" corset:"byte16"` - BYTE_32 int `mapstructure:"BYTE_32" validate:"power_of_2" corset:"byte32"` - BYTE_64 int `mapstructure:"BYTE_64" validate:"power_of_2" corset:"byte64"` - BYTE_128 int `mapstructure:"BYTE_128" validate:"power_of_2" corset:"byte128"` - BYTE_256 int `mapstructure:"BYTE_256" validate:"power_of_2" corset:"byte256"` - SIGNEXTEND int `mapstructure:"SIGNEXTEND" validate:"power_of_2" corset:"signextend"` - MAX3_U128 int `mapstructure:"MAX3_U128" validate:"power_of_2" corset:"max3_u128"` - MAXLOG int `mapstructure:"MAXLOG" validate:"power_of_2" corset:"maxlog"` - // End of new modules for Osaka // reference tables Binreftable int `mapstructure:"BIN_REFERENCE_TABLE" validate:"power_of_2" corset:"binreftable"` @@ -179,16 +161,35 @@ type TracesLimits struct { PrecompileBlsFinalExponentiations int `mapstructure:"PRECOMPILE_BLS_FINAL_EXPONENTIATIONS"` PrecompileBlsMapFpToG1EffectiveCalls int `mapstructure:"PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS"` PrecompileBlsMapFp2ToG2EffectiveCalls int `mapstructure:"PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS"` - PrecompileBlsC1MembershipChecks int `mapstructure:"PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS"` + PrecompileBlsC1MembershipCalls int `mapstructure:"PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS"` PrecompileBlsC2MembershipCalls int `mapstructure:"PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS"` PrecompileBlsG1MembershipCalls int `mapstructure:"PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS"` PrecompileBlsG2MembershipCalls int `mapstructure:"PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS"` - Bls int `mapstructure:"BLS" corset:"bls"` - PointEval int `mapstructure:"POINT_EVAL" corset:"pointeval"` BlsData int `mapstructure:"BLS_DATA" validate:"power_of_2" corset:"blsdata"` RlpUtils int `mapstructure:"RLP_UTILS" validate:"power_of_2" corset:"rlputils"` PowerReferenceTable int `mapstructure:"POWER_REFERENCE_TABLE" validate:"power_of_2" corset:"power"` BlsReferenceTable int `mapstructure:"BLS_REFERENCE_TABLE" validate:"power_of_2" corset:"blsreftable"` + + // Start of new Osaka modules + PrecompileP256VerifyEffectiveCalls int `mapstructure:"PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS"` + + BIT_XOAN_U2 int `mapstructure:"BIT_XOAN_U2" validate:"power_of_2" corset:"bit_xoan_u2"` + BIT_XOAN_U4 int `mapstructure:"BIT_XOAN_U4" validate:"power_of_2" corset:"bit_xoan_u4"` + BIT_XOAN_U8 int `mapstructure:"BIT_XOAN_U8" validate:"power_of_2" corset:"bit_xoan_u8"` + BIT_XOAN_U16 int `mapstructure:"BIT_XOAN_U16" validate:"power_of_2" corset:"bit_xoan_u16"` + BIT_XOAN_U32 int `mapstructure:"BIT_XOAN_U32" validate:"power_of_2" corset:"bit_xoan_u32"` + BIT_XOAN_U64 int `mapstructure:"BIT_XOAN_U64" validate:"power_of_2" corset:"bit_xoan_u64"` + BIT_XOAN_U128 int `mapstructure:"BIT_XOAN_U128" validate:"power_of_2" corset:"bit_xoan_u128"` + BIT_XOAN_U256 int `mapstructure:"BIT_XOAN_U256" validate:"power_of_2" corset:"bit_xoan_u256"` + BYTE_16 int `mapstructure:"BYTE_16" validate:"power_of_2" corset:"byte16"` + BYTE_32 int `mapstructure:"BYTE_32" validate:"power_of_2" corset:"byte32"` + BYTE_64 int `mapstructure:"BYTE_64" validate:"power_of_2" corset:"byte64"` + BYTE_128 int `mapstructure:"BYTE_128" validate:"power_of_2" corset:"byte128"` + BYTE_256 int `mapstructure:"BYTE_256" validate:"power_of_2" corset:"byte256"` + SIGNEXTEND int `mapstructure:"SIGNEXTEND" validate:"power_of_2" corset:"signextend"` + MAX3_U128 int `mapstructure:"MAX3_U128" validate:"power_of_2" corset:"max3_u128"` + MAXLOG int `mapstructure:"MAXLOG" validate:"power_of_2" corset:"maxlog"` + // End of new Osaka modules } func (tl *TracesLimits) Checksum() string { @@ -332,24 +333,6 @@ func (tl *TracesLimits) ScaleUp(by int) { tl.U24 *= by tl.U23 *= by tl.U20 *= by - // Start of new modules for Osaka - tl.BIT_XOAN_U2 *= by - tl.BIT_XOAN_U4 *= by - tl.BIT_XOAN_U8 *= by - tl.BIT_XOAN_U16 *= by - tl.BIT_XOAN_U32 *= by - tl.BIT_XOAN_U64 *= by - tl.BIT_XOAN_U128 *= by - tl.BIT_XOAN_U256 *= by - tl.BYTE_16 *= by - tl.BYTE_32 *= by - tl.BYTE_64 *= by - tl.BYTE_128 *= by - tl.BYTE_256 *= by - tl.SIGNEXTEND *= by - tl.MAX3_U128 *= by - tl.MAXLOG *= by - // End of new modules for Osaka // beta v4.0 tl.PrecompileBlsPointEvaluationEffectiveCalls *= by tl.PrecompilePointEvaluationFailureEffectiveCalls *= by @@ -361,14 +344,33 @@ func (tl *TracesLimits) ScaleUp(by int) { tl.PrecompileBlsFinalExponentiations *= by tl.PrecompileBlsMapFpToG1EffectiveCalls *= by tl.PrecompileBlsMapFp2ToG2EffectiveCalls *= by - tl.PrecompileBlsC1MembershipChecks *= by + tl.PrecompileBlsC1MembershipCalls *= by tl.PrecompileBlsC2MembershipCalls *= by tl.PrecompileBlsG1MembershipCalls *= by tl.PrecompileBlsG2MembershipCalls *= by - tl.Bls *= by - tl.PointEval *= by tl.BlsData *= by tl.RlpUtils *= by + + // Start of new Osaka modules + tl.PrecompileP256VerifyEffectiveCalls *= by + + tl.BIT_XOAN_U2 *= by + tl.BIT_XOAN_U4 *= by + tl.BIT_XOAN_U8 *= by + tl.BIT_XOAN_U16 *= by + tl.BIT_XOAN_U32 *= by + tl.BIT_XOAN_U64 *= by + tl.BIT_XOAN_U128 *= by + tl.BIT_XOAN_U256 *= by + tl.BYTE_16 *= by + tl.BYTE_32 *= by + tl.BYTE_64 *= by + tl.BYTE_128 *= by + tl.BYTE_256 *= by + tl.SIGNEXTEND *= by + tl.MAX3_U128 *= by + tl.MAXLOG *= by + // End of new Osaka modules } func GetTestTracesLimits() *TracesLimits { @@ -412,7 +414,7 @@ func GetTestTracesLimits() *TracesLimits { PrecompileRipemdBlocks: 0, PrecompileModexpEffectiveCalls: 32, PrecompileModexpEffectiveCalls4096: 1, - PrecompileEcaddEffectiveCalls: 256, + PrecompileEcaddEffectiveCalls: 1024, PrecompileEcmulEffectiveCalls: 40, PrecompileEcpairingEffectiveCalls: 16, PrecompileEcpairingMillerLoops: 64, @@ -425,127 +427,126 @@ func GetTestTracesLimits() *TracesLimits { BlockTransactions: 300, ShomeiMerkleProofs: 16384, // Beta 4.0 internal modules - BitShl256: 131072, - BitShl256U7: 131072, - BitShl256U6: 131072, - BitShl256U5: 131072, - BitShl256U4: 131072, - BitShl256U3: 131072, - BitShl256U2: 131072, - BitShl256U1: 131072, - BitShr256: 131072, - BitShr256U7: 131072, - BitShr256U6: 131072, - BitShr256U5: 131072, - BitShr256U4: 131072, - BitShr256U3: 131072, - BitShr256U2: 131072, - BitShr256U1: 131072, - BitSar256: 131072, - BitSar256U7: 131072, - BitSar256U6: 131072, - BitSar256U5: 131072, - BitSar256U4: 131072, - BitSar256U3: 131072, - BitSar256U2: 131072, - BitSar256U1: 131072, - CallGasExtra: 131072, - FillBytesBetween: 131072, - GasOutOfPocket: 131072, - Log2: 131072, - Log2U128: 131072, - Log2U64: 131072, - Log2U32: 131072, - Log2U16: 131072, - Log2U8: 131072, - Log2U4: 131072, - Log2U2: 131072, - Log256: 131072, - Log256U128: 131072, - Log256U64: 131072, - Log256U32: 131072, - Log256U16: 131072, - SetByte256: 131072, - SetByte128: 131072, - SetByte64: 131072, - SetByte32: 131072, - SetByte16: 131072, - Min25664: 131072, - U128: 131072, - U127: 131072, - U126: 131072, - U125: 131072, - U124: 131072, - U123: 131072, - U120: 131072, - U119: 131072, - U112: 131072, - U111: 131072, - U96: 131072, - U95: 131072, - U64: 131072, - U63: 131072, - U62: 131072, - U61: 131072, - U60: 131072, - U59: 131072, - U58: 131072, - U56: 131072, - U55: 131072, - U48: 131072, - U47: 131072, - U36: 131072, - U32: 131072, - U31: 131072, - U30: 131072, - U29: 131072, - U28: 131072, - U27: 131072, - U26: 131072, - U24: 131072, - U23: 131072, - U20: 131072, - - // Start of new modules for Osaka - BIT_XOAN_U2: 131072, - BIT_XOAN_U4: 131072, - BIT_XOAN_U8: 131072, - BIT_XOAN_U16: 131072, - BIT_XOAN_U32: 131072, - BIT_XOAN_U64: 131072, - BIT_XOAN_U128: 131072, - BIT_XOAN_U256: 131072, - BYTE_16: 131072, - BYTE_32: 131072, - BYTE_64: 131072, - BYTE_128: 131072, - BYTE_256: 131072, - SIGNEXTEND: 131072, - MAX3_U128: 131072, - MAXLOG: 131072, - // End of new modules for Osaka - + BitShl256: 262144, + BitShl256U7: 262144, + BitShl256U6: 262144, + BitShl256U5: 262144, + BitShl256U4: 262144, + BitShl256U3: 262144, + BitShl256U2: 262144, + BitShl256U1: 262144, + BitShr256: 262144, + BitShr256U7: 262144, + BitShr256U6: 262144, + BitShr256U5: 262144, + BitShr256U4: 262144, + BitShr256U3: 262144, + BitShr256U2: 262144, + BitShr256U1: 262144, + BitSar256: 262144, + BitSar256U7: 262144, + BitSar256U6: 262144, + BitSar256U5: 262144, + BitSar256U4: 262144, + BitSar256U3: 262144, + BitSar256U2: 262144, + BitSar256U1: 262144, + CallGasExtra: 262144, + FillBytesBetween: 262144, + GasOutOfPocket: 262144, + Log2: 262144, + Log2U128: 262144, + Log2U64: 262144, + Log2U32: 262144, + Log2U16: 262144, + Log2U8: 262144, + Log2U4: 262144, + Log2U2: 262144, + Log256: 262144, + Log256U128: 262144, + Log256U64: 262144, + Log256U32: 262144, + Log256U16: 262144, + SetByte256: 262144, + SetByte128: 262144, + SetByte64: 262144, + SetByte32: 262144, + SetByte16: 262144, + Min25664: 262144, + U128: 262144, + U127: 262144, + U126: 262144, + U125: 262144, + U124: 262144, + U123: 262144, + U120: 262144, + U119: 262144, + U112: 262144, + U111: 262144, + U96: 262144, + U95: 262144, + U64: 262144, + U63: 262144, + U62: 262144, + U61: 262144, + U60: 262144, + U59: 262144, + U58: 262144, + U56: 262144, + U55: 262144, + U48: 262144, + U47: 262144, + U36: 262144, + U32: 262144, + U31: 262144, + U30: 262144, + U29: 262144, + U28: 262144, + U27: 262144, + U26: 262144, + U24: 262144, + U23: 262144, + U20: 262144, // beta v4.0 - PrecompileBlsPointEvaluationEffectiveCalls: 0, - PrecompilePointEvaluationFailureEffectiveCalls: 0, - PrecompileBlsG1AddEffectiveCalls: 0, - PrecompileBlsG1MsmEffectiveCalls: 0, - PrecompileBlsG2AddEffectiveCalls: 0, - PrecompileBlsG2MsmEffectiveCalls: 0, - PrecompileBlsPairingCheckMillerLoops: 0, - PrecompileBlsFinalExponentiations: 0, - PrecompileBlsMapFpToG1EffectiveCalls: 0, - PrecompileBlsMapFp2ToG2EffectiveCalls: 0, - PrecompileBlsC1MembershipChecks: 0, - PrecompileBlsC2MembershipCalls: 0, - PrecompileBlsG1MembershipCalls: 0, - PrecompileBlsG2MembershipCalls: 0, - Bls: 0, - PointEval: 0, + PrecompileBlsPointEvaluationEffectiveCalls: 1, + PrecompilePointEvaluationFailureEffectiveCalls: 2, + PrecompileBlsG1AddEffectiveCalls: 8, + PrecompileBlsG1MsmEffectiveCalls: 4, + PrecompileBlsG2AddEffectiveCalls: 8, + PrecompileBlsG2MsmEffectiveCalls: 4, + PrecompileBlsPairingCheckMillerLoops: 8, + PrecompileBlsFinalExponentiations: 2, + PrecompileBlsMapFpToG1EffectiveCalls: 4, + PrecompileBlsMapFp2ToG2EffectiveCalls: 4, + PrecompileBlsC1MembershipCalls: 8, + PrecompileBlsC2MembershipCalls: 8, + PrecompileBlsG1MembershipCalls: 8, + PrecompileBlsG2MembershipCalls: 8, BlsData: 4096, RlpUtils: 131072, PowerReferenceTable: 32, - BlsReferenceTable: 256, + BlsReferenceTable: 512, + + // Start of new Osaka modules + PrecompileP256VerifyEffectiveCalls: 128, + + BIT_XOAN_U2: 262144, + BIT_XOAN_U4: 262144, + BIT_XOAN_U8: 262144, + BIT_XOAN_U16: 262144, + BIT_XOAN_U32: 262144, + BIT_XOAN_U64: 262144, + BIT_XOAN_U128: 262144, + BIT_XOAN_U256: 262144, + BYTE_16: 262144, + BYTE_32: 262144, + BYTE_64: 262144, + BYTE_128: 262144, + BYTE_256: 262144, + SIGNEXTEND: 262144, + MAX3_U128: 262144, + MAXLOG: 262144, + // End of new Osaka modules } return traceLimits From cf5c9f01c7662a6dff647542f59d16ea7037516a Mon Sep 17 00:00:00 2001 From: gusiri Date: Wed, 26 Nov 2025 15:48:54 +0000 Subject: [PATCH 27/36] fix: update modules in the integration config files for osaka --- .../config/config-integration-benchmark.toml | 280 +++++++++++-- prover/config/config-integration-full.toml | 280 +++++++++++-- prover/config/config-integration-temp.toml | 370 ++++++++++++++++++ 3 files changed, 852 insertions(+), 78 deletions(-) create mode 100644 prover/config/config-integration-temp.toml diff --git a/prover/config/config-integration-benchmark.toml b/prover/config/config-integration-benchmark.toml index 0b5eb02a6d..7e424a7d3d 100644 --- a/prover/config/config-integration-benchmark.toml +++ b/prover/config/config-integration-benchmark.toml @@ -59,7 +59,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -73,27 +73,128 @@ BLOCK_TRANSACTIONS = 300 BIN_REFERENCE_TABLE = 262144 INSTRUCTION_DECODER = 512 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 - -BLS = 0 -POINT_EVAL = 0 +BIT_SHL256 = 262144 +BIT_SHL256_U7 = 262144 +BIT_SHL256_U6 = 262144 +BIT_SHL256_U5 = 262144 +BIT_SHL256_U4 = 262144 +BIT_SHL256_U3 = 262144 +BIT_SHL256_U2 = 262144 +BIT_SHL256_U1 = 262144 +BIT_SHR256 = 262144 +BIT_SHR256_U7 = 262144 +BIT_SHR256_U6 = 262144 +BIT_SHR256_U5 = 262144 +BIT_SHR256_U4 = 262144 +BIT_SHR256_U3 = 262144 +BIT_SHR256_U2 = 262144 +BIT_SHR256_U1 = 262144 +BIT_SAR256 = 262144 +BIT_SAR256_U7 = 262144 +BIT_SAR256_U6 = 262144 +BIT_SAR256_U5 = 262144 +BIT_SAR256_U4 = 262144 +BIT_SAR256_U3 = 262144 +BIT_SAR256_U2 = 262144 +BIT_SAR256_U1 = 262144 +CALL_GAS_EXTRA = 262144 +FILL_BYTES_BETWEEN = 262144 +GAS_OUT_OF_POCKET = 262144 +LOG2 = 262144 +LOG2_U128 = 262144 +LOG2_U64 = 262144 +LOG2_U32 = 262144 +LOG2_U16 = 262144 +LOG2_U8 = 262144 +LOG2_U4 = 262144 +LOG2_U2 = 262144 +LOG256 = 262144 +LOG256_U128 = 262144 +LOG256_U64 = 262144 +LOG256_U32 = 262144 +LOG256_U16 = 262144 +MIN256_64 = 262144 +SET_BYTE256 = 262144 +SET_BYTE128 = 262144 +SET_BYTE64 = 262144 +SET_BYTE32 = 262144 +SET_BYTE16 = 262144 + +U128 = 262144 +U127 = 262144 +U126 = 262144 +U125 = 262144 +U124 = 262144 +U123 = 262144 +U120 = 262144 +U119 = 262144 +U112 = 262144 +U111 = 262144 +U96 = 262144 +U95 = 262144 +U64 = 262144 +U63 = 262144 +U62 = 262144 +U61 = 262144 +U60 = 262144 +U59 = 262144 +U58 = 262144 +U56 = 262144 +U55 = 262144 +U48 = 262144 +U47 = 262144 +U36 = 262144 +U32 = 262144 +U31 = 262144 +U30 = 262144 +U29 = 262144 +U28 = 262144 +U27 = 262144 +U26 = 262144 +U24 = 262144 +U23 = 262144 +U20 = 262144 + +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 1 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 2 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 8 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 2 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 8 + BLS_DATA = 4096 RLP_UTILS = 131072 POWER_REFERENCE_TABLE = 32 -BLS_REFERENCE_TABLE = 256 +BLS_REFERENCE_TABLE = 512 + +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 128 + +BIT_XOAN_U2 = 262144 +BIT_XOAN_U4 = 262144 +BIT_XOAN_U8 = 262144 +BIT_XOAN_U16 = 262144 +BIT_XOAN_U32 = 262144 +BIT_XOAN_U64 = 262144 +BIT_XOAN_U128 = 262144 +BIT_XOAN_U256 = 262144 +BYTE_16 = 262144 +BYTE_32 = 262144 +BYTE_64 = 262144 +BYTE_128 = 262144 +BYTE_256 = 262144 +SIGNEXTEND = 262144 +MAX3_U128 = 262144 +MAXLOG = 262144 +# End of new Osaka modules [traces_limits_large] ADD = 524288 @@ -130,8 +231,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 @@ -145,24 +246,125 @@ BLOCK_TRANSACTIONS = 300 BIN_REFERENCE_TABLE = 262144 INSTRUCTION_DECODER = 512 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 - -BLS = 0 -POINT_EVAL = 0 +BIT_SHL256 = 524288 +BIT_SHL256_U7 = 524288 +BIT_SHL256_U6 = 524288 +BIT_SHL256_U5 = 524288 +BIT_SHL256_U4 = 524288 +BIT_SHL256_U3 = 524288 +BIT_SHL256_U2 = 524288 +BIT_SHL256_U1 = 524288 +BIT_SHR256 = 524288 +BIT_SHR256_U7 = 524288 +BIT_SHR256_U6 = 524288 +BIT_SHR256_U5 = 524288 +BIT_SHR256_U4 = 524288 +BIT_SHR256_U3 = 524288 +BIT_SHR256_U2 = 524288 +BIT_SHR256_U1 = 524288 +BIT_SAR256 = 524288 +BIT_SAR256_U7 = 524288 +BIT_SAR256_U6 = 524288 +BIT_SAR256_U5 = 524288 +BIT_SAR256_U4 = 524288 +BIT_SAR256_U3 = 524288 +BIT_SAR256_U2 = 524288 +BIT_SAR256_U1 = 524288 +CALL_GAS_EXTRA = 524288 +FILL_BYTES_BETWEEN = 524288 +GAS_OUT_OF_POCKET = 524288 +LOG2 = 524288 +LOG2_U128 = 524288 +LOG2_U64 = 524288 +LOG2_U32 = 524288 +LOG2_U16 = 524288 +LOG2_U8 = 524288 +LOG2_U4 = 524288 +LOG2_U2 = 524288 +LOG256 = 524288 +LOG256_U128 = 524288 +LOG256_U64 = 524288 +LOG256_U32 = 524288 +LOG256_U16 = 524288 +MIN256_64 = 524288 +SET_BYTE256 = 524288 +SET_BYTE128 = 524288 +SET_BYTE64 = 524288 +SET_BYTE32 = 524288 +SET_BYTE16 = 524288 + +U128 = 524288 +U127 = 524288 +U126 = 524288 +U125 = 524288 +U124 = 524288 +U123 = 524288 +U120 = 524288 +U119 = 524288 +U112 = 524288 +U111 = 524288 +U96 = 524288 +U95 = 524288 +U64 = 524288 +U63 = 524288 +U62 = 524288 +U61 = 524288 +U60 = 524288 +U59 = 524288 +U58 = 524288 +U56 = 524288 +U55 = 524288 +U48 = 524288 +U47 = 524288 +U36 = 524288 +U32 = 524288 +U31 = 524288 +U30 = 524288 +U29 = 524288 +U28 = 524288 +U27 = 524288 +U26 = 524288 +U24 = 524288 +U23 = 524288 +U20 = 524288 + +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 2 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 16 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 4 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 16 + BLS_DATA = 8192 RLP_UTILS = 262144 POWER_REFERENCE_TABLE = 32 -BLS_REFERENCE_TABLE = 256 +BLS_REFERENCE_TABLE = 512 + +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 256 + +BIT_XOAN_U2 = 524288 +BIT_XOAN_U4 = 524288 +BIT_XOAN_U8 = 524288 +BIT_XOAN_U16 = 524288 +BIT_XOAN_U32 = 524288 +BIT_XOAN_U64 = 524288 +BIT_XOAN_U128 = 524288 +BIT_XOAN_U256 = 524288 +BYTE_16 = 524288 +BYTE_32 = 524288 +BYTE_64 = 524288 +BYTE_128 = 524288 +BYTE_256 = 524288 +SIGNEXTEND = 524288 +MAX3_U128 = 524288 +MAXLOG = 524288 +# End of new Osaka modules diff --git a/prover/config/config-integration-full.toml b/prover/config/config-integration-full.toml index a036515f65..0cb4ff430a 100644 --- a/prover/config/config-integration-full.toml +++ b/prover/config/config-integration-full.toml @@ -58,7 +58,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -72,27 +72,128 @@ BLOCK_TRANSACTIONS = 300 BIN_REFERENCE_TABLE = 262144 INSTRUCTION_DECODER = 512 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 - -BLS = 0 -POINT_EVAL = 0 +BIT_SHL256 = 262144 +BIT_SHL256_U7 = 262144 +BIT_SHL256_U6 = 262144 +BIT_SHL256_U5 = 262144 +BIT_SHL256_U4 = 262144 +BIT_SHL256_U3 = 262144 +BIT_SHL256_U2 = 262144 +BIT_SHL256_U1 = 262144 +BIT_SHR256 = 262144 +BIT_SHR256_U7 = 262144 +BIT_SHR256_U6 = 262144 +BIT_SHR256_U5 = 262144 +BIT_SHR256_U4 = 262144 +BIT_SHR256_U3 = 262144 +BIT_SHR256_U2 = 262144 +BIT_SHR256_U1 = 262144 +BIT_SAR256 = 262144 +BIT_SAR256_U7 = 262144 +BIT_SAR256_U6 = 262144 +BIT_SAR256_U5 = 262144 +BIT_SAR256_U4 = 262144 +BIT_SAR256_U3 = 262144 +BIT_SAR256_U2 = 262144 +BIT_SAR256_U1 = 262144 +CALL_GAS_EXTRA = 262144 +FILL_BYTES_BETWEEN = 262144 +GAS_OUT_OF_POCKET = 262144 +LOG2 = 262144 +LOG2_U128 = 262144 +LOG2_U64 = 262144 +LOG2_U32 = 262144 +LOG2_U16 = 262144 +LOG2_U8 = 262144 +LOG2_U4 = 262144 +LOG2_U2 = 262144 +LOG256 = 262144 +LOG256_U128 = 262144 +LOG256_U64 = 262144 +LOG256_U32 = 262144 +LOG256_U16 = 262144 +MIN256_64 = 262144 +SET_BYTE256 = 262144 +SET_BYTE128 = 262144 +SET_BYTE64 = 262144 +SET_BYTE32 = 262144 +SET_BYTE16 = 262144 + +U128 = 262144 +U127 = 262144 +U126 = 262144 +U125 = 262144 +U124 = 262144 +U123 = 262144 +U120 = 262144 +U119 = 262144 +U112 = 262144 +U111 = 262144 +U96 = 262144 +U95 = 262144 +U64 = 262144 +U63 = 262144 +U62 = 262144 +U61 = 262144 +U60 = 262144 +U59 = 262144 +U58 = 262144 +U56 = 262144 +U55 = 262144 +U48 = 262144 +U47 = 262144 +U36 = 262144 +U32 = 262144 +U31 = 262144 +U30 = 262144 +U29 = 262144 +U28 = 262144 +U27 = 262144 +U26 = 262144 +U24 = 262144 +U23 = 262144 +U20 = 262144 + +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 1 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 2 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 8 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 2 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 8 + BLS_DATA = 4096 RLP_UTILS = 131072 POWER_REFERENCE_TABLE = 32 -BLS_REFERENCE_TABLE = 256 +BLS_REFERENCE_TABLE = 512 + +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 128 + +BIT_XOAN_U2 = 262144 +BIT_XOAN_U4 = 262144 +BIT_XOAN_U8 = 262144 +BIT_XOAN_U16 = 262144 +BIT_XOAN_U32 = 262144 +BIT_XOAN_U64 = 262144 +BIT_XOAN_U128 = 262144 +BIT_XOAN_U256 = 262144 +BYTE_16 = 262144 +BYTE_32 = 262144 +BYTE_64 = 262144 +BYTE_128 = 262144 +BYTE_256 = 262144 +SIGNEXTEND = 262144 +MAX3_U128 = 262144 +MAXLOG = 262144 +# End of new Osaka modules [traces_limits_large] ADD = 524288 @@ -129,8 +230,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 @@ -144,24 +245,125 @@ BLOCK_TRANSACTIONS = 300 BIN_REFERENCE_TABLE = 262144 INSTRUCTION_DECODER = 512 -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 0 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 0 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 0 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLS_C1_MEMBERSHIP_CHECKS = 0 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 0 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 0 - -BLS = 0 -POINT_EVAL = 0 +BIT_SHL256 = 524288 +BIT_SHL256_U7 = 524288 +BIT_SHL256_U6 = 524288 +BIT_SHL256_U5 = 524288 +BIT_SHL256_U4 = 524288 +BIT_SHL256_U3 = 524288 +BIT_SHL256_U2 = 524288 +BIT_SHL256_U1 = 524288 +BIT_SHR256 = 524288 +BIT_SHR256_U7 = 524288 +BIT_SHR256_U6 = 524288 +BIT_SHR256_U5 = 524288 +BIT_SHR256_U4 = 524288 +BIT_SHR256_U3 = 524288 +BIT_SHR256_U2 = 524288 +BIT_SHR256_U1 = 524288 +BIT_SAR256 = 524288 +BIT_SAR256_U7 = 524288 +BIT_SAR256_U6 = 524288 +BIT_SAR256_U5 = 524288 +BIT_SAR256_U4 = 524288 +BIT_SAR256_U3 = 524288 +BIT_SAR256_U2 = 524288 +BIT_SAR256_U1 = 524288 +CALL_GAS_EXTRA = 524288 +FILL_BYTES_BETWEEN = 524288 +GAS_OUT_OF_POCKET = 524288 +LOG2 = 524288 +LOG2_U128 = 524288 +LOG2_U64 = 524288 +LOG2_U32 = 524288 +LOG2_U16 = 524288 +LOG2_U8 = 524288 +LOG2_U4 = 524288 +LOG2_U2 = 524288 +LOG256 = 524288 +LOG256_U128 = 524288 +LOG256_U64 = 524288 +LOG256_U32 = 524288 +LOG256_U16 = 524288 +MIN256_64 = 524288 +SET_BYTE256 = 524288 +SET_BYTE128 = 524288 +SET_BYTE64 = 524288 +SET_BYTE32 = 524288 +SET_BYTE16 = 524288 + +U128 = 524288 +U127 = 524288 +U126 = 524288 +U125 = 524288 +U124 = 524288 +U123 = 524288 +U120 = 524288 +U119 = 524288 +U112 = 524288 +U111 = 524288 +U96 = 524288 +U95 = 524288 +U64 = 524288 +U63 = 524288 +U62 = 524288 +U61 = 524288 +U60 = 524288 +U59 = 524288 +U58 = 524288 +U56 = 524288 +U55 = 524288 +U48 = 524288 +U47 = 524288 +U36 = 524288 +U32 = 524288 +U31 = 524288 +U30 = 524288 +U29 = 524288 +U28 = 524288 +U27 = 524288 +U26 = 524288 +U24 = 524288 +U23 = 524288 +U20 = 524288 + +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 2 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 16 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 4 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 16 + BLS_DATA = 8192 RLP_UTILS = 262144 POWER_REFERENCE_TABLE = 32 -BLS_REFERENCE_TABLE = 256 +BLS_REFERENCE_TABLE = 512 + +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 256 + +BIT_XOAN_U2 = 524288 +BIT_XOAN_U4 = 524288 +BIT_XOAN_U8 = 524288 +BIT_XOAN_U16 = 524288 +BIT_XOAN_U32 = 524288 +BIT_XOAN_U64 = 524288 +BIT_XOAN_U128 = 524288 +BIT_XOAN_U256 = 524288 +BYTE_16 = 524288 +BYTE_32 = 524288 +BYTE_64 = 524288 +BYTE_128 = 524288 +BYTE_256 = 524288 +SIGNEXTEND = 524288 +MAX3_U128 = 524288 +MAXLOG = 524288 +# End of new Osaka modules diff --git a/prover/config/config-integration-temp.toml b/prover/config/config-integration-temp.toml new file mode 100644 index 0000000000..a784ebde63 --- /dev/null +++ b/prover/config/config-integration-temp.toml @@ -0,0 +1,370 @@ +environment = "integration-full" +version = "3.0.0" # TODO @gbotrel hunt all version definitions. +assets_dir = "./prover-assets" +log_level = 4 # TODO @gbotrel will be refactored with new logger. + +[controller] +retry_delays = [0, 1] + +[execution] +prover_mode = "full" +conflated_traces_dir = "/home/ubuntu/zkevm-monorepo/prover" + +[blob_decompression] +prover_mode = "dev" + +[aggregation] +prover_mode = "full" +num_proofs = [10] +allowed_inputs = ["execution-dummy", "execution", "blob-decompression-dummy"] +verifier_id = 1 + +[layer2] +chain_id = 59144 +message_service_contract = "0x508Ca82Df566dCD1B0DE8296e70a96332cD644ec" + +[traces_limits] +ADD = 262144 +BIN = 262144 +BLAKE_MODEXP_DATA = 16384 +BLOCK_DATA = 4096 +BLOCK_HASH = 2048 +EC_DATA = 65536 +EUC = 65536 +EXP = 65536 +EXT = 524288 +GAS = 65536 +HUB = 2097152 +LOG_DATA = 65536 +LOG_INFO = 4096 +MMIO = 2097152 +MMU = 1048576 +MOD = 131072 +MUL = 65536 +MXP = 524288 +OOB = 262144 +RLP_ADDR = 4096 +RLP_TXN = 131072 +RLP_TXN_RCPT = 65536 +ROM = 8388608 +ROM_LEX = 1024 +SHAKIRA_DATA = 65536 +SHF = 262144 +STP = 16384 +TRM = 32768 +TXN_DATA = 8192 +WCP = 262144 +PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 128 +PRECOMPILE_SHA2_BLOCKS = 200 +PRECOMPILE_RIPEMD_BLOCKS = 0 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 +PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 +PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 +PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 +PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS = 64 +PRECOMPILE_BLAKE_EFFECTIVE_CALLS = 0 +PRECOMPILE_BLAKE_ROUNDS = 0 +BLOCK_KECCAK = 8192 +BLOCK_L1_SIZE = 1000000 +BLOCK_L2_L1_LOGS = 16 +BLOCK_TRANSACTIONS = 300 +BIN_REFERENCE_TABLE = 262144 +INSTRUCTION_DECODER = 512 + +BIT_SHL256 = 262144 +BIT_SHL256_U7 = 262144 +BIT_SHL256_U6 = 262144 +BIT_SHL256_U5 = 262144 +BIT_SHL256_U4 = 262144 +BIT_SHL256_U3 = 262144 +BIT_SHL256_U2 = 262144 +BIT_SHL256_U1 = 262144 +BIT_SHR256 = 262144 +BIT_SHR256_U7 = 262144 +BIT_SHR256_U6 = 262144 +BIT_SHR256_U5 = 262144 +BIT_SHR256_U4 = 262144 +BIT_SHR256_U3 = 262144 +BIT_SHR256_U2 = 262144 +BIT_SHR256_U1 = 262144 +BIT_SAR256 = 262144 +BIT_SAR256_U7 = 262144 +BIT_SAR256_U6 = 262144 +BIT_SAR256_U5 = 262144 +BIT_SAR256_U4 = 262144 +BIT_SAR256_U3 = 262144 +BIT_SAR256_U2 = 262144 +BIT_SAR256_U1 = 262144 +CALL_GAS_EXTRA = 262144 +FILL_BYTES_BETWEEN = 262144 +GAS_OUT_OF_POCKET = 262144 +LOG2 = 262144 +LOG2_U128 = 262144 +LOG2_U64 = 262144 +LOG2_U32 = 262144 +LOG2_U16 = 262144 +LOG2_U8 = 262144 +LOG2_U4 = 262144 +LOG2_U2 = 262144 +LOG256 = 262144 +LOG256_U128 = 262144 +LOG256_U64 = 262144 +LOG256_U32 = 262144 +LOG256_U16 = 262144 +MIN256_64 = 262144 +SET_BYTE256 = 262144 +SET_BYTE128 = 262144 +SET_BYTE64 = 262144 +SET_BYTE32 = 262144 +SET_BYTE16 = 262144 + +U128 = 262144 +U127 = 262144 +U126 = 262144 +U125 = 262144 +U124 = 262144 +U123 = 262144 +U120 = 262144 +U119 = 262144 +U112 = 262144 +U111 = 262144 +U96 = 262144 +U95 = 262144 +U64 = 262144 +U63 = 262144 +U62 = 262144 +U61 = 262144 +U60 = 262144 +U59 = 262144 +U58 = 262144 +U56 = 262144 +U55 = 262144 +U48 = 262144 +U47 = 262144 +U36 = 262144 +U32 = 262144 +U31 = 262144 +U30 = 262144 +U29 = 262144 +U28 = 262144 +U27 = 262144 +U26 = 262144 +U24 = 262144 +U23 = 262144 +U20 = 262144 + +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 1 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 2 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 8 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 2 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 8 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 8 + +BLS_DATA = 4096 +RLP_UTILS = 131072 +POWER_REFERENCE_TABLE = 32 +BLS_REFERENCE_TABLE = 512 + +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 128 + +BIT_XOAN_U2 = 262144 +BIT_XOAN_U4 = 262144 +BIT_XOAN_U8 = 262144 +BIT_XOAN_U16 = 262144 +BIT_XOAN_U32 = 262144 +BIT_XOAN_U64 = 262144 +BIT_XOAN_U128 = 262144 +BIT_XOAN_U256 = 262144 +BYTE_16 = 262144 +BYTE_32 = 262144 +BYTE_64 = 262144 +BYTE_128 = 262144 +BYTE_256 = 262144 +SIGNEXTEND = 262144 +MAX3_U128 = 262144 +MAXLOG = 262144 +# End of new Osaka modules + +[traces_limits_large] +ADD = 524288 +BIN = 524288 +BLAKE_MODEXP_DATA = 32768 +BLOCK_DATA = 8192 +BLOCK_HASH = 4096 +EC_DATA = 131072 +EUC = 131072 +EXP = 131072 +EXT = 1048576 +GAS = 131072 +HUB = 4194304 +LOG_DATA = 131072 +LOG_INFO = 8192 +MMIO = 4194304 +MMU = 2097152 +MOD = 262144 +MUL = 131072 +MXP = 1048576 +OOB = 524288 +RLP_ADDR = 8192 +RLP_TXN = 262144 +RLP_TXN_RCPT = 131072 +ROM = 8388608 +ROM_LEX = 2048 +SHAKIRA_DATA = 65536 +SHF = 524288 +STP = 32768 +TRM = 65536 +TXN_DATA = 16384 +WCP = 524288 +PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 +PRECOMPILE_SHA2_BLOCKS = 400 +PRECOMPILE_RIPEMD_BLOCKS = 0 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 +PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 +PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 +PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 +PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS = 128 +PRECOMPILE_BLAKE_EFFECTIVE_CALLS = 0 +PRECOMPILE_BLAKE_ROUNDS = 0 +BLOCK_KECCAK = 8192 +BLOCK_L1_SIZE = 1000000 +BLOCK_L2_L1_LOGS = 16 +BLOCK_TRANSACTIONS = 300 +BIN_REFERENCE_TABLE = 262144 +INSTRUCTION_DECODER = 512 + +BIT_SHL256 = 524288 +BIT_SHL256_U7 = 524288 +BIT_SHL256_U6 = 524288 +BIT_SHL256_U5 = 524288 +BIT_SHL256_U4 = 524288 +BIT_SHL256_U3 = 524288 +BIT_SHL256_U2 = 524288 +BIT_SHL256_U1 = 524288 +BIT_SHR256 = 524288 +BIT_SHR256_U7 = 524288 +BIT_SHR256_U6 = 524288 +BIT_SHR256_U5 = 524288 +BIT_SHR256_U4 = 524288 +BIT_SHR256_U3 = 524288 +BIT_SHR256_U2 = 524288 +BIT_SHR256_U1 = 524288 +BIT_SAR256 = 524288 +BIT_SAR256_U7 = 524288 +BIT_SAR256_U6 = 524288 +BIT_SAR256_U5 = 524288 +BIT_SAR256_U4 = 524288 +BIT_SAR256_U3 = 524288 +BIT_SAR256_U2 = 524288 +BIT_SAR256_U1 = 524288 +CALL_GAS_EXTRA = 524288 +FILL_BYTES_BETWEEN = 524288 +GAS_OUT_OF_POCKET = 524288 +LOG2 = 524288 +LOG2_U128 = 524288 +LOG2_U64 = 524288 +LOG2_U32 = 524288 +LOG2_U16 = 524288 +LOG2_U8 = 524288 +LOG2_U4 = 524288 +LOG2_U2 = 524288 +LOG256 = 524288 +LOG256_U128 = 524288 +LOG256_U64 = 524288 +LOG256_U32 = 524288 +LOG256_U16 = 524288 +MIN256_64 = 524288 +SET_BYTE256 = 524288 +SET_BYTE128 = 524288 +SET_BYTE64 = 524288 +SET_BYTE32 = 524288 +SET_BYTE16 = 524288 + +U128 = 524288 +U127 = 524288 +U126 = 524288 +U125 = 524288 +U124 = 524288 +U123 = 524288 +U120 = 524288 +U119 = 524288 +U112 = 524288 +U111 = 524288 +U96 = 524288 +U95 = 524288 +U64 = 524288 +U63 = 524288 +U62 = 524288 +U61 = 524288 +U60 = 524288 +U59 = 524288 +U58 = 524288 +U56 = 524288 +U55 = 524288 +U48 = 524288 +U47 = 524288 +U36 = 524288 +U32 = 524288 +U31 = 524288 +U30 = 524288 +U29 = 524288 +U28 = 524288 +U27 = 524288 +U26 = 524288 +U24 = 524288 +U23 = 524288 +U20 = 524288 + +PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 2 +PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 4 +PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 16 +PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 16 +PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 4 +PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 8 +PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 16 +PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 16 + +BLS_DATA = 8192 +RLP_UTILS = 262144 +POWER_REFERENCE_TABLE = 32 +BLS_REFERENCE_TABLE = 512 + +# Start of new Osaka modules +PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 256 + +BIT_XOAN_U2 = 524288 +BIT_XOAN_U4 = 524288 +BIT_XOAN_U8 = 524288 +BIT_XOAN_U16 = 524288 +BIT_XOAN_U32 = 524288 +BIT_XOAN_U64 = 524288 +BIT_XOAN_U128 = 524288 +BIT_XOAN_U256 = 524288 +BYTE_16 = 524288 +BYTE_32 = 524288 +BYTE_64 = 524288 +BYTE_128 = 524288 +BYTE_256 = 524288 +SIGNEXTEND = 524288 +MAX3_U128 = 524288 +MAXLOG = 524288 +# End of new Osaka modules From ca12c00fcb950291743b36cffe10baff8c3b906f Mon Sep 17 00:00:00 2001 From: gusiri Date: Thu, 27 Nov 2025 10:53:24 +0000 Subject: [PATCH 28/36] revert trace limits: PRECOMPILE_ECADD_EFFECTIVE_CALLS and PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 --- prover/config/config-devnet-full.toml | 6 +++--- prover/config/config-integration-benchmark.toml | 6 +++--- prover/config/config-integration-full.toml | 6 +++--- prover/config/config-integration-temp.toml | 6 +++--- prover/config/config-mainnet-limitless.toml | 6 +++--- prover/config/config-sepolia-limitless.toml | 6 +++--- prover/config/config_default.go | 6 +++--- prover/config/traces_limit.go | 2 +- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/prover/config/config-devnet-full.toml b/prover/config/config-devnet-full.toml index 65978ee47a..4ae651d2b1 100644 --- a/prover/config/config-devnet-full.toml +++ b/prover/config/config-devnet-full.toml @@ -71,7 +71,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -243,8 +243,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 diff --git a/prover/config/config-integration-benchmark.toml b/prover/config/config-integration-benchmark.toml index 7e424a7d3d..39a4a2120c 100644 --- a/prover/config/config-integration-benchmark.toml +++ b/prover/config/config-integration-benchmark.toml @@ -59,7 +59,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -231,8 +231,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 diff --git a/prover/config/config-integration-full.toml b/prover/config/config-integration-full.toml index 0cb4ff430a..52b8f84e54 100644 --- a/prover/config/config-integration-full.toml +++ b/prover/config/config-integration-full.toml @@ -58,7 +58,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -230,8 +230,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 diff --git a/prover/config/config-integration-temp.toml b/prover/config/config-integration-temp.toml index a784ebde63..b4b39b06dc 100644 --- a/prover/config/config-integration-temp.toml +++ b/prover/config/config-integration-temp.toml @@ -59,7 +59,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -231,8 +231,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 diff --git a/prover/config/config-mainnet-limitless.toml b/prover/config/config-mainnet-limitless.toml index c866f6a383..c810d608a5 100644 --- a/prover/config/config-mainnet-limitless.toml +++ b/prover/config/config-mainnet-limitless.toml @@ -76,7 +76,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -248,8 +248,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 diff --git a/prover/config/config-sepolia-limitless.toml b/prover/config/config-sepolia-limitless.toml index 6d68a81348..66036516d9 100644 --- a/prover/config/config-sepolia-limitless.toml +++ b/prover/config/config-sepolia-limitless.toml @@ -74,7 +74,7 @@ PRECOMPILE_SHA2_BLOCKS = 200 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 @@ -246,8 +246,8 @@ PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 PRECOMPILE_SHA2_BLOCKS = 400 PRECOMPILE_RIPEMD_BLOCKS = 0 PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 2 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 2048 +PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 +PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 diff --git a/prover/config/config_default.go b/prover/config/config_default.go index cb7705bafe..13acfa7338 100644 --- a/prover/config/config_default.go +++ b/prover/config/config_default.go @@ -92,7 +92,7 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits.PRECOMPILE_RIPEMD_BLOCKS", 0) viper.SetDefault("traces_limits.PRECOMPILE_MODEXP_EFFECTIVE_CALLS", 32) viper.SetDefault("traces_limits.PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096", 1) - viper.SetDefault("traces_limits.PRECOMPILE_ECADD_EFFECTIVE_CALLS", 2048) + viper.SetDefault("traces_limits.PRECOMPILE_ECADD_EFFECTIVE_CALLS", 256) viper.SetDefault("traces_limits.PRECOMPILE_ECMUL_EFFECTIVE_CALLS", 40) viper.SetDefault("traces_limits.PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS", 16) viper.SetDefault("traces_limits.PRECOMPILE_ECPAIRING_MILLER_LOOPS", 64) @@ -263,8 +263,8 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits_large.PRECOMPILE_SHA2_BLOCKS", 400) viper.SetDefault("traces_limits_large.PRECOMPILE_RIPEMD_BLOCKS", 0) viper.SetDefault("traces_limits_large.PRECOMPILE_MODEXP_EFFECTIVE_CALLS", 64) - viper.SetDefault("traces_limits_large.PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096", 2) - viper.SetDefault("traces_limits_large.PRECOMPILE_ECADD_EFFECTIVE_CALLS", 1024) + viper.SetDefault("traces_limits_large.PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096", 1) + viper.SetDefault("traces_limits_large.PRECOMPILE_ECADD_EFFECTIVE_CALLS", 512) viper.SetDefault("traces_limits_large.PRECOMPILE_ECMUL_EFFECTIVE_CALLS", 80) viper.SetDefault("traces_limits_large.PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS", 32) viper.SetDefault("traces_limits_large.PRECOMPILE_ECPAIRING_MILLER_LOOPS", 128) diff --git a/prover/config/traces_limit.go b/prover/config/traces_limit.go index 927d3e27e9..ab4f5b3a93 100644 --- a/prover/config/traces_limit.go +++ b/prover/config/traces_limit.go @@ -414,7 +414,7 @@ func GetTestTracesLimits() *TracesLimits { PrecompileRipemdBlocks: 0, PrecompileModexpEffectiveCalls: 32, PrecompileModexpEffectiveCalls4096: 1, - PrecompileEcaddEffectiveCalls: 1024, + PrecompileEcaddEffectiveCalls: 256, PrecompileEcmulEffectiveCalls: 40, PrecompileEcpairingEffectiveCalls: 16, PrecompileEcpairingMillerLoops: 64, From 9448e58014aaea7dca1928dca15d259b4c8c2457 Mon Sep 17 00:00:00 2001 From: Lakshminarayanan Nandakumar <45759699+srinathln7@users.noreply.github.com> Date: Thu, 27 Nov 2025 12:38:38 +0100 Subject: [PATCH 29/36] Prover/fix mimc hash module err (#1800) * (fix) fmt. module segment with full module name * (fix): add pragma handler for mimccodehash module --- prover/protocol/distributed/module_witness.go | 2 +- prover/zkevm/prover/statemanager/mimccodehash/assign.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/prover/protocol/distributed/module_witness.go b/prover/protocol/distributed/module_witness.go index 8e3328eaf2..40184b80e9 100644 --- a/prover/protocol/distributed/module_witness.go +++ b/prover/protocol/distributed/module_witness.go @@ -149,7 +149,7 @@ func SegmentRuntime( } } - logger = logger.WithField(string(blueprintGLs[i].ModuleName[0]), map[string]any{ + logger = logger.WithField(string(blueprintGLs[i].ModuleName), map[string]any{ "qbm-stats": loggableQbmStats, "nb-segments": len(wGL), }) diff --git a/prover/zkevm/prover/statemanager/mimccodehash/assign.go b/prover/zkevm/prover/statemanager/mimccodehash/assign.go index e39b857c5a..2a144a9dad 100644 --- a/prover/zkevm/prover/statemanager/mimccodehash/assign.go +++ b/prover/zkevm/prover/statemanager/mimccodehash/assign.go @@ -4,6 +4,7 @@ import ( "github.com/consensys/linea-monorepo/prover/crypto/mimc" "github.com/consensys/linea-monorepo/prover/maths/common/smartvectors" "github.com/consensys/linea-monorepo/prover/maths/field" + "github.com/consensys/linea-monorepo/prover/protocol/distributed/pragmas" "github.com/consensys/linea-monorepo/prover/protocol/wizard" "github.com/consensys/linea-monorepo/prover/utils" ) @@ -218,6 +219,7 @@ func (mh *Module) Assign(run *wizard.ProverRuntime) { } // Assign the columns of the mimc code hash module + pragmas.MarkRightPadded(run.Spec.Columns.GetHandle(mh.IsActive.GetColID())) run.AssignColumn(mh.IsActive.GetColID(), smartvectors.RightZeroPadded(builder.isActive, mh.Inputs.Size)) run.AssignColumn(mh.CFI.GetColID(), smartvectors.RightZeroPadded(builder.cfi, mh.Inputs.Size)) run.AssignColumn(mh.Limb.GetColID(), smartvectors.RightZeroPadded(builder.limb, mh.Inputs.Size)) From fdcfa9859946360fb7e43b5e587614080caaed60 Mon Sep 17 00:00:00 2001 From: gusiri Date: Thu, 27 Nov 2025 12:44:36 +0000 Subject: [PATCH 30/36] fix a typo: trace_limits to trace_limits_large for P256_VERIFY --- prover/config/config_default.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prover/config/config_default.go b/prover/config/config_default.go index 13acfa7338..d508dcf4fa 100644 --- a/prover/config/config_default.go +++ b/prover/config/config_default.go @@ -380,7 +380,7 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits_large.BLS_REFERENCE_TABLE", 512) // Start of new Osaka modules - viper.SetDefault("traces_limits.PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS", 256) + viper.SetDefault("traces_limits_large.PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS", 256) viper.SetDefault("traces_limits_large.BIT_XOAN_U2", 524288) viper.SetDefault("traces_limits_large.BIT_XOAN_U4", 524288) From a114101b81f2b7a9d5dbc06db49816b279ebac4a Mon Sep 17 00:00:00 2001 From: gusiri Date: Thu, 27 Nov 2025 14:11:22 +0000 Subject: [PATCH 31/36] update constraints to beta v4.4-rc5 --- constraints | 2 +- prover/zkevm/arithmetization/zkevm.bin | Bin 1043914 -> 1043591 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/constraints b/constraints index 023539d3b6..b88da9e199 160000 --- a/constraints +++ b/constraints @@ -1 +1 @@ -Subproject commit 023539d3b660b8d6501b58096f7295044b5c924c +Subproject commit b88da9e199b6b7c8a413902f6035dd2774c43def diff --git a/prover/zkevm/arithmetization/zkevm.bin b/prover/zkevm/arithmetization/zkevm.bin index 723a8b092fcdb716d0598ad7ab899c98875cabde..ae0979b63914cff77dae156eec0c062ebec6783f 100644 GIT binary patch delta 1512 zcmYjRS##S|6t*o{UYkH5?Cp5`3^Uqn%V7z!bYlx-OVzzfle9qXEKTAjX_~aqhT_sv zQlL=iLTD*#`2!4P{LCx7_63+>rVl)`zc7;??!B6J(9D^m<(%()=R4=>`=3WQe;n-{ z?{*fJ+lPV zw64v}&J`aouD1`Y(F}ICur#~2-d;LHAIbcYLTlw{L9G-NeMGK~C`KV9Rza23Qt?Et zmxw36K7Tfm8irHb@m~hN*(Llo7tdcDSp4<$P`5wSjbC2vT}=Rjgh>!u z1Wt-}=qr-Y^z2*~JM|WtAgEyG0uF1UU_0ZQWSKqJMFB}-hBPid7dHLLWD`46C?PaMHzi_9 z0NzS6GBSKAx?Wv{e^OR}OoCL{mI5?R^D`0+W|5~@Ee+1|gfe_0vE~%r&f3n{m}7-5 znVd;7iY2(lzx5Oi{ty}0n23qzqjcTGuG4hLo+M-AtVA7^;Ug|o6+UMqWSnZ!@BkSP z2@_sWxvPlf`I9duo6Nn$3(51`RpA29*E;-BTaI8$y<_}FE$bOZV%&5?RKAPGgxHrP zOdR+-ZzC7gY2PexSaR?b3cSbYK!TkDHUs#87f{oZY1>qbr|!&!aS5b|?tWffS&gb2 zYf_Jip~`TY38%yFQY7uYi8?XTYkpO!tIpPqO2WzF~U@i zMh$7NM80%9@)dZG52XZKoTmZ*W-&2)#IaaE^&DHjn(3M?3;BZY`9lJBi9)xAzj|gM zKqL%WZ0lGpDDV}Vus)Wu8m7~7>=z`$M?K9;=m)qn;0qR|Jb6cDrqf2$ssUFbC^;!&y65*N z(C&qZi2QOCqQ?a~CAcp3D2P_&O0%{ssTDSBD1i4lDdoY07mTo#^aIC2wG45Z^n{vC zzs*^w4+v(N9e~MoxTc}d9|`C zd4W@RTA_q_$M+;$G9}RJaE8fRhBuk3z$SABe8{sZ@M+X-X?L>8HnkhoR+l2L!&w$y zeMGEH5;T$Ut-Wb>ve>WYRmtZ2SB1amNoMmch`3>Dukln(=|x_JcQ|b|mW3BZZBMAj%;>r#rvIGiNf_A^D5ko?YteAgnTTvwfci_vOjo6_%5F_HuCvcrgLy* zy1S+98$8qBe?eGINTn|P6f5^{UJ{~D delta 1651 zcmZuxNpKWZ7@nCo-Lqs8MQ|5th&M~9-e(3C?CE})Y3YrAJt4s*&SZfANq|ITQ3nBy z3yK2Tg1Dj=F9Me4?A3#1QC`F{L+{{rWM96Z08u5Jq zHKV5mg4b=zqtrLGJAmoicY&cGdP?xDAROM#d1QQuN|Z4!A?Oa+5XDi;iUB~ax|B0* zJAw#p=z&AA71*$8qUJURSi@&TwAl=0xu=MnhED>ZZx;a^3RePTMguvkX*ylsu_MtV z6-4lM(Lq~a6x0i`;}IIu3x@>{Ia}ZuL)7spfg!Ap;q%$Acd>36|Hfk%VMOx98tv|am|KaqDZzGo3!=#T}E8N*To19!YIba z8M9Hj8Aj2z0Mh#>#h9@_!y%P4AUzVY$aV%5F^HUo;~(T(Rs5RJr3J|Ns%S-!$Tx1{ zQJwfO?YxTrB&=~O@-u*(=p%jn57owkUT0Di{CAFHD0gOp=%E`2LPJ6j2H`lX)Y!^g zb&@wl>h9r-8a_(7^eiAc=eRx@zsjH`e2jS&zr)&K;Dq@qKFhnM;t%;kzYQQawu`ni zFyL4%Hy*}suv87@_!(C_j9#PRFP7-RPksS~p$Ox8Nqhqh~k83)J@UR2{!UnQQnYtD&pK0-|A$ z=P3uBZhV9WX!tD_AmjI#ui=mB6_xO{ES(JeN1i%5QF)OZFu7;tENYsnR-o?(O}7PS zIJ1FYq<{+klmaNXX54s125x$u?RHfOe?s5O_%rIX-8`xKESIa{muRwqPcRi~E{h1& zJ=ywj3}tesS*4cfx4b%xHVd={XM(l3f|qiRPlP!3z2v&P&vC%o3(Tu>mw8)N@Y@Vp z!Ke8lO89-gQ1AzQp-r<`Sx*)5X(64#XUP}$dS7V(J7-3BBv&qjmlos`U^*ijU3@uJS@`@EShH&R zQhHf#MJct6M0Gmt+3|_-@#N4KU{!K;eNjxtq~80J?=OJ->i*O!1~k^5Yp?yk&unsS zqgYPPCt!8*!x9jZU%vzoB;OqCT|Iy4A|RF}CJ+;e<%s2p6^Ipy^$;r&>m}B=aOvVL HU)TNxv-kfk From 64abfba16a27f9d67b3f8d90a3c481d71d275435 Mon Sep 17 00:00:00 2001 From: gusiri Date: Thu, 27 Nov 2025 18:29:27 +0000 Subject: [PATCH 32/36] update trace limits: BLOCK_HASH from 2048 to 4096 --- prover/config/config-devnet-full.toml | 4 +- .../config/config-integration-benchmark.toml | 4 +- prover/config/config-integration-full.toml | 4 +- prover/config/config-integration-temp.toml | 370 ------------------ prover/config/config-mainnet-limitless.toml | 4 +- prover/config/config-sepolia-limitless.toml | 4 +- prover/config/config_default.go | 4 +- prover/config/traces_limit.go | 2 +- 8 files changed, 13 insertions(+), 383 deletions(-) delete mode 100644 prover/config/config-integration-temp.toml diff --git a/prover/config/config-devnet-full.toml b/prover/config/config-devnet-full.toml index 4ae651d2b1..b0390eccc8 100644 --- a/prover/config/config-devnet-full.toml +++ b/prover/config/config-devnet-full.toml @@ -40,7 +40,7 @@ ADD = 262144 BIN = 262144 BLAKE_MODEXP_DATA = 16384 BLOCK_DATA = 4096 -BLOCK_HASH = 2048 +BLOCK_HASH = 4096 EC_DATA = 65536 EUC = 65536 EXP = 65536 @@ -213,7 +213,7 @@ ADD = 524288 BIN = 524288 BLAKE_MODEXP_DATA = 32768 BLOCK_DATA = 8192 -BLOCK_HASH = 4096 +BLOCK_HASH = 8192 EC_DATA = 131072 EUC = 131072 EXP = 131072 diff --git a/prover/config/config-integration-benchmark.toml b/prover/config/config-integration-benchmark.toml index 39a4a2120c..2ea6827b64 100644 --- a/prover/config/config-integration-benchmark.toml +++ b/prover/config/config-integration-benchmark.toml @@ -28,7 +28,7 @@ ADD = 262144 BIN = 262144 BLAKE_MODEXP_DATA = 16384 BLOCK_DATA = 4096 -BLOCK_HASH = 2048 +BLOCK_HASH = 4096 EC_DATA = 65536 EUC = 65536 EXP = 65536 @@ -201,7 +201,7 @@ ADD = 524288 BIN = 524288 BLAKE_MODEXP_DATA = 32768 BLOCK_DATA = 8192 -BLOCK_HASH = 4096 +BLOCK_HASH = 8192 EC_DATA = 131072 EUC = 131072 EXP = 131072 diff --git a/prover/config/config-integration-full.toml b/prover/config/config-integration-full.toml index 52b8f84e54..2f28060ee9 100644 --- a/prover/config/config-integration-full.toml +++ b/prover/config/config-integration-full.toml @@ -27,7 +27,7 @@ ADD = 262144 BIN = 262144 BLAKE_MODEXP_DATA = 16384 BLOCK_DATA = 4096 -BLOCK_HASH = 2048 +BLOCK_HASH = 4096 EC_DATA = 65536 EUC = 65536 EXP = 65536 @@ -200,7 +200,7 @@ ADD = 524288 BIN = 524288 BLAKE_MODEXP_DATA = 32768 BLOCK_DATA = 8192 -BLOCK_HASH = 4096 +BLOCK_HASH = 8192 EC_DATA = 131072 EUC = 131072 EXP = 131072 diff --git a/prover/config/config-integration-temp.toml b/prover/config/config-integration-temp.toml deleted file mode 100644 index b4b39b06dc..0000000000 --- a/prover/config/config-integration-temp.toml +++ /dev/null @@ -1,370 +0,0 @@ -environment = "integration-full" -version = "3.0.0" # TODO @gbotrel hunt all version definitions. -assets_dir = "./prover-assets" -log_level = 4 # TODO @gbotrel will be refactored with new logger. - -[controller] -retry_delays = [0, 1] - -[execution] -prover_mode = "full" -conflated_traces_dir = "/home/ubuntu/zkevm-monorepo/prover" - -[blob_decompression] -prover_mode = "dev" - -[aggregation] -prover_mode = "full" -num_proofs = [10] -allowed_inputs = ["execution-dummy", "execution", "blob-decompression-dummy"] -verifier_id = 1 - -[layer2] -chain_id = 59144 -message_service_contract = "0x508Ca82Df566dCD1B0DE8296e70a96332cD644ec" - -[traces_limits] -ADD = 262144 -BIN = 262144 -BLAKE_MODEXP_DATA = 16384 -BLOCK_DATA = 4096 -BLOCK_HASH = 2048 -EC_DATA = 65536 -EUC = 65536 -EXP = 65536 -EXT = 524288 -GAS = 65536 -HUB = 2097152 -LOG_DATA = 65536 -LOG_INFO = 4096 -MMIO = 2097152 -MMU = 1048576 -MOD = 131072 -MUL = 65536 -MXP = 524288 -OOB = 262144 -RLP_ADDR = 4096 -RLP_TXN = 131072 -RLP_TXN_RCPT = 65536 -ROM = 8388608 -ROM_LEX = 1024 -SHAKIRA_DATA = 65536 -SHF = 262144 -STP = 16384 -TRM = 32768 -TXN_DATA = 8192 -WCP = 262144 -PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 128 -PRECOMPILE_SHA2_BLOCKS = 200 -PRECOMPILE_RIPEMD_BLOCKS = 0 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 256 -PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40 -PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16 -PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64 -PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS = 64 -PRECOMPILE_BLAKE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLAKE_ROUNDS = 0 -BLOCK_KECCAK = 8192 -BLOCK_L1_SIZE = 1000000 -BLOCK_L2_L1_LOGS = 16 -BLOCK_TRANSACTIONS = 300 -BIN_REFERENCE_TABLE = 262144 -INSTRUCTION_DECODER = 512 - -BIT_SHL256 = 262144 -BIT_SHL256_U7 = 262144 -BIT_SHL256_U6 = 262144 -BIT_SHL256_U5 = 262144 -BIT_SHL256_U4 = 262144 -BIT_SHL256_U3 = 262144 -BIT_SHL256_U2 = 262144 -BIT_SHL256_U1 = 262144 -BIT_SHR256 = 262144 -BIT_SHR256_U7 = 262144 -BIT_SHR256_U6 = 262144 -BIT_SHR256_U5 = 262144 -BIT_SHR256_U4 = 262144 -BIT_SHR256_U3 = 262144 -BIT_SHR256_U2 = 262144 -BIT_SHR256_U1 = 262144 -BIT_SAR256 = 262144 -BIT_SAR256_U7 = 262144 -BIT_SAR256_U6 = 262144 -BIT_SAR256_U5 = 262144 -BIT_SAR256_U4 = 262144 -BIT_SAR256_U3 = 262144 -BIT_SAR256_U2 = 262144 -BIT_SAR256_U1 = 262144 -CALL_GAS_EXTRA = 262144 -FILL_BYTES_BETWEEN = 262144 -GAS_OUT_OF_POCKET = 262144 -LOG2 = 262144 -LOG2_U128 = 262144 -LOG2_U64 = 262144 -LOG2_U32 = 262144 -LOG2_U16 = 262144 -LOG2_U8 = 262144 -LOG2_U4 = 262144 -LOG2_U2 = 262144 -LOG256 = 262144 -LOG256_U128 = 262144 -LOG256_U64 = 262144 -LOG256_U32 = 262144 -LOG256_U16 = 262144 -MIN256_64 = 262144 -SET_BYTE256 = 262144 -SET_BYTE128 = 262144 -SET_BYTE64 = 262144 -SET_BYTE32 = 262144 -SET_BYTE16 = 262144 - -U128 = 262144 -U127 = 262144 -U126 = 262144 -U125 = 262144 -U124 = 262144 -U123 = 262144 -U120 = 262144 -U119 = 262144 -U112 = 262144 -U111 = 262144 -U96 = 262144 -U95 = 262144 -U64 = 262144 -U63 = 262144 -U62 = 262144 -U61 = 262144 -U60 = 262144 -U59 = 262144 -U58 = 262144 -U56 = 262144 -U55 = 262144 -U48 = 262144 -U47 = 262144 -U36 = 262144 -U32 = 262144 -U31 = 262144 -U30 = 262144 -U29 = 262144 -U28 = 262144 -U27 = 262144 -U26 = 262144 -U24 = 262144 -U23 = 262144 -U20 = 262144 - -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 1 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 2 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 8 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 4 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 8 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 4 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 8 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 2 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 4 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 4 -PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 8 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 8 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 8 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 8 - -BLS_DATA = 4096 -RLP_UTILS = 131072 -POWER_REFERENCE_TABLE = 32 -BLS_REFERENCE_TABLE = 512 - -# Start of new Osaka modules -PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 128 - -BIT_XOAN_U2 = 262144 -BIT_XOAN_U4 = 262144 -BIT_XOAN_U8 = 262144 -BIT_XOAN_U16 = 262144 -BIT_XOAN_U32 = 262144 -BIT_XOAN_U64 = 262144 -BIT_XOAN_U128 = 262144 -BIT_XOAN_U256 = 262144 -BYTE_16 = 262144 -BYTE_32 = 262144 -BYTE_64 = 262144 -BYTE_128 = 262144 -BYTE_256 = 262144 -SIGNEXTEND = 262144 -MAX3_U128 = 262144 -MAXLOG = 262144 -# End of new Osaka modules - -[traces_limits_large] -ADD = 524288 -BIN = 524288 -BLAKE_MODEXP_DATA = 32768 -BLOCK_DATA = 8192 -BLOCK_HASH = 4096 -EC_DATA = 131072 -EUC = 131072 -EXP = 131072 -EXT = 1048576 -GAS = 131072 -HUB = 4194304 -LOG_DATA = 131072 -LOG_INFO = 8192 -MMIO = 4194304 -MMU = 2097152 -MOD = 262144 -MUL = 131072 -MXP = 1048576 -OOB = 524288 -RLP_ADDR = 8192 -RLP_TXN = 262144 -RLP_TXN_RCPT = 131072 -ROM = 8388608 -ROM_LEX = 2048 -SHAKIRA_DATA = 65536 -SHF = 524288 -STP = 32768 -TRM = 65536 -TXN_DATA = 16384 -WCP = 524288 -PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256 -PRECOMPILE_SHA2_BLOCKS = 400 -PRECOMPILE_RIPEMD_BLOCKS = 0 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64 -PRECOMPILE_MODEXP_EFFECTIVE_CALLS_4096 = 1 -PRECOMPILE_ECADD_EFFECTIVE_CALLS = 512 -PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80 -PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32 -PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128 -PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS = 128 -PRECOMPILE_BLAKE_EFFECTIVE_CALLS = 0 -PRECOMPILE_BLAKE_ROUNDS = 0 -BLOCK_KECCAK = 8192 -BLOCK_L1_SIZE = 1000000 -BLOCK_L2_L1_LOGS = 16 -BLOCK_TRANSACTIONS = 300 -BIN_REFERENCE_TABLE = 262144 -INSTRUCTION_DECODER = 512 - -BIT_SHL256 = 524288 -BIT_SHL256_U7 = 524288 -BIT_SHL256_U6 = 524288 -BIT_SHL256_U5 = 524288 -BIT_SHL256_U4 = 524288 -BIT_SHL256_U3 = 524288 -BIT_SHL256_U2 = 524288 -BIT_SHL256_U1 = 524288 -BIT_SHR256 = 524288 -BIT_SHR256_U7 = 524288 -BIT_SHR256_U6 = 524288 -BIT_SHR256_U5 = 524288 -BIT_SHR256_U4 = 524288 -BIT_SHR256_U3 = 524288 -BIT_SHR256_U2 = 524288 -BIT_SHR256_U1 = 524288 -BIT_SAR256 = 524288 -BIT_SAR256_U7 = 524288 -BIT_SAR256_U6 = 524288 -BIT_SAR256_U5 = 524288 -BIT_SAR256_U4 = 524288 -BIT_SAR256_U3 = 524288 -BIT_SAR256_U2 = 524288 -BIT_SAR256_U1 = 524288 -CALL_GAS_EXTRA = 524288 -FILL_BYTES_BETWEEN = 524288 -GAS_OUT_OF_POCKET = 524288 -LOG2 = 524288 -LOG2_U128 = 524288 -LOG2_U64 = 524288 -LOG2_U32 = 524288 -LOG2_U16 = 524288 -LOG2_U8 = 524288 -LOG2_U4 = 524288 -LOG2_U2 = 524288 -LOG256 = 524288 -LOG256_U128 = 524288 -LOG256_U64 = 524288 -LOG256_U32 = 524288 -LOG256_U16 = 524288 -MIN256_64 = 524288 -SET_BYTE256 = 524288 -SET_BYTE128 = 524288 -SET_BYTE64 = 524288 -SET_BYTE32 = 524288 -SET_BYTE16 = 524288 - -U128 = 524288 -U127 = 524288 -U126 = 524288 -U125 = 524288 -U124 = 524288 -U123 = 524288 -U120 = 524288 -U119 = 524288 -U112 = 524288 -U111 = 524288 -U96 = 524288 -U95 = 524288 -U64 = 524288 -U63 = 524288 -U62 = 524288 -U61 = 524288 -U60 = 524288 -U59 = 524288 -U58 = 524288 -U56 = 524288 -U55 = 524288 -U48 = 524288 -U47 = 524288 -U36 = 524288 -U32 = 524288 -U31 = 524288 -U30 = 524288 -U29 = 524288 -U28 = 524288 -U27 = 524288 -U26 = 524288 -U24 = 524288 -U23 = 524288 -U20 = 524288 - -PRECOMPILE_BLS_POINT_EVALUATION_EFFECTIVE_CALLS = 2 -PRECOMPILE_POINT_EVALUATION_FAILURE_EFFECTIVE_CALLS = 4 -PRECOMPILE_BLS_G1_ADD_EFFECTIVE_CALLS = 16 -PRECOMPILE_BLS_G1_MSM_EFFECTIVE_CALLS = 8 -PRECOMPILE_BLS_G2_ADD_EFFECTIVE_CALLS = 16 -PRECOMPILE_BLS_G2_MSM_EFFECTIVE_CALLS = 8 -PRECOMPILE_BLS_PAIRING_CHECK_MILLER_LOOPS = 16 -PRECOMPILE_BLS_FINAL_EXPONENTIATIONS = 4 -PRECOMPILE_BLS_MAP_FP_TO_G1_EFFECTIVE_CALLS = 8 -PRECOMPILE_BLS_MAP_FP2_TO_G2_EFFECTIVE_CALLS = 8 -PRECOMPILE_BLS_C1_MEMBERSHIP_CALLS = 16 -PRECOMPILE_BLS_C2_MEMBERSHIP_CALLS = 16 -PRECOMPILE_BLS_G1_MEMBERSHIP_CALLS = 16 -PRECOMPILE_BLS_G2_MEMBERSHIP_CALLS = 16 - -BLS_DATA = 8192 -RLP_UTILS = 262144 -POWER_REFERENCE_TABLE = 32 -BLS_REFERENCE_TABLE = 512 - -# Start of new Osaka modules -PRECOMPILE_P256_VERIFY_EFFECTIVE_CALLS = 256 - -BIT_XOAN_U2 = 524288 -BIT_XOAN_U4 = 524288 -BIT_XOAN_U8 = 524288 -BIT_XOAN_U16 = 524288 -BIT_XOAN_U32 = 524288 -BIT_XOAN_U64 = 524288 -BIT_XOAN_U128 = 524288 -BIT_XOAN_U256 = 524288 -BYTE_16 = 524288 -BYTE_32 = 524288 -BYTE_64 = 524288 -BYTE_128 = 524288 -BYTE_256 = 524288 -SIGNEXTEND = 524288 -MAX3_U128 = 524288 -MAXLOG = 524288 -# End of new Osaka modules diff --git a/prover/config/config-mainnet-limitless.toml b/prover/config/config-mainnet-limitless.toml index c810d608a5..d5f6fc9e72 100644 --- a/prover/config/config-mainnet-limitless.toml +++ b/prover/config/config-mainnet-limitless.toml @@ -45,7 +45,7 @@ ADD = 262144 BIN = 262144 BLAKE_MODEXP_DATA = 16384 BLOCK_DATA = 4096 -BLOCK_HASH = 2048 +BLOCK_HASH = 4096 EC_DATA = 65536 EUC = 65536 EXP = 65536 @@ -218,7 +218,7 @@ ADD = 524288 BIN = 524288 BLAKE_MODEXP_DATA = 32768 BLOCK_DATA = 8192 -BLOCK_HASH = 4096 +BLOCK_HASH = 8192 EC_DATA = 131072 EUC = 131072 EXP = 131072 diff --git a/prover/config/config-sepolia-limitless.toml b/prover/config/config-sepolia-limitless.toml index 66036516d9..e06119d301 100644 --- a/prover/config/config-sepolia-limitless.toml +++ b/prover/config/config-sepolia-limitless.toml @@ -43,7 +43,7 @@ ADD = 262144 BIN = 262144 BLAKE_MODEXP_DATA = 16384 BLOCK_DATA = 4096 -BLOCK_HASH = 2048 +BLOCK_HASH = 4096 EC_DATA = 65536 EUC = 65536 EXP = 65536 @@ -216,7 +216,7 @@ ADD = 524288 BIN = 524288 BLAKE_MODEXP_DATA = 32768 BLOCK_DATA = 8192 -BLOCK_HASH = 4096 +BLOCK_HASH = 8192 EC_DATA = 131072 EUC = 131072 EXP = 131072 diff --git a/prover/config/config_default.go b/prover/config/config_default.go index d508dcf4fa..5fa802d02b 100644 --- a/prover/config/config_default.go +++ b/prover/config/config_default.go @@ -61,7 +61,7 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits.BIN", 262144) viper.SetDefault("traces_limits.BLAKE_MODEXP_DATA", 16384) viper.SetDefault("traces_limits.BLOCK_DATA", 4096) - viper.SetDefault("traces_limits.BLOCK_HASH", 2048) + viper.SetDefault("traces_limits.BLOCK_HASH", 4096) viper.SetDefault("traces_limits.EC_DATA", 65536) viper.SetDefault("traces_limits.EUC", 65536) viper.SetDefault("traces_limits.EXP", 65536) @@ -233,7 +233,7 @@ func setDefaultTracesLimit() { viper.SetDefault("traces_limits_large.BIN", 524288) viper.SetDefault("traces_limits_large.BLAKE_MODEXP_DATA", 32768) viper.SetDefault("traces_limits_large.BLOCK_DATA", 8192) - viper.SetDefault("traces_limits_large.BLOCK_HASH", 4096) + viper.SetDefault("traces_limits_large.BLOCK_HASH", 8192) viper.SetDefault("traces_limits_large.EC_DATA", 131072) viper.SetDefault("traces_limits_large.EUC", 131072) viper.SetDefault("traces_limits_large.EXP", 131072) diff --git a/prover/config/traces_limit.go b/prover/config/traces_limit.go index ab4f5b3a93..8ef38cfe4a 100644 --- a/prover/config/traces_limit.go +++ b/prover/config/traces_limit.go @@ -381,7 +381,7 @@ func GetTestTracesLimits() *TracesLimits { Bin: 262144, Blake2Fmodexpdata: 16384, Blockdata: 4096, - Blockhash: 2048, + Blockhash: 4096, Ecdata: 65536, Euc: 65536, Exp: 65536, From 1b1e8e13a3b138ffbfa8aa5b7b92061d925b9868 Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Thu, 27 Nov 2025 21:29:20 +0000 Subject: [PATCH 33/36] fix: correct order of point coordinates in inputfiller --- prover/zkevm/prover/p256verify/input_filler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prover/zkevm/prover/p256verify/input_filler.go b/prover/zkevm/prover/p256verify/input_filler.go index d348b50f19..ff1e7c7914 100644 --- a/prover/zkevm/prover/p256verify/input_filler.go +++ b/prover/zkevm/prover/p256verify/input_filler.go @@ -22,11 +22,11 @@ func inputFiller(circuitInstance, inputIndex int) field.Element { // s "0", "1", // qx - "0x77037d812deb33a0f4a13945d898c296", "0x6b17d1f2e12c4247f8bce6e563a440f2", + "0x77037d812deb33a0f4a13945d898c296", // qy - "0x2bce33576b315ececbb6406837bf51f5", "0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16", + "0x2bce33576b315ececbb6406837bf51f5", // expected result "0", "0", } From 2cd0b9a52b02a6d6d843c9f5a1f0f3fd1ab051bc Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Fri, 28 Nov 2025 00:50:17 +0000 Subject: [PATCH 34/36] fix: send MSM non-membership only for MSM inputs --- prover/zkevm/prover/bls/module_msm.go | 56 +++++++++++++++------------ 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/prover/zkevm/prover/bls/module_msm.go b/prover/zkevm/prover/bls/module_msm.go index c165ca9108..1017b3dcc6 100644 --- a/prover/zkevm/prover/bls/module_msm.go +++ b/prover/zkevm/prover/bls/module_msm.go @@ -88,7 +88,7 @@ func (bm *BlsMsm) WithGroupMembershipCircuit(comp *wizard.CompiledIOP, options . toAlignMembership := &plonk.CircuitAlignmentInput{ Name: fmt.Sprintf("%s_%s_GROUP_MEMBERSHIP", NAME_BLS_MSM, bm.Group.String()), Round: ROUND_NR, - DataToCircuitMask: bm.BlsMsmDataSource.CsMembership, + DataToCircuitMask: bm.UnalignedMsmData.IsMsmInstanceAndMembership, DataToCircuit: bm.BlsMsmDataSource.Limb, Circuit: newCheckCircuit(bm.Group, GROUP, bm.Limits), NbCircuitInstances: nbCircuits, @@ -112,8 +112,9 @@ func (bm *BlsMsm) Assign(run *wizard.ProverRuntime) { type UnalignedMsmData struct { *BlsMsmDataSource - IsDataAndCsMul ifaces.Column // indicates if source is data and has CS_MSM set - IsResultAndCsMul ifaces.Column // indicates if source is result and has CS_MSM set + IsMsmInstanceAndMembership ifaces.Column // indicates if line is part of an MSM instance and group membership check + IsDataAndCsMul ifaces.Column // indicates if source is data and has CS_MSM set + IsResultAndCsMul ifaces.Column // indicates if source is result and has CS_MSM set // this part is used to define the accumulators and indicate if the IsActive ifaces.Column IsFirstLine ifaces.Column @@ -144,19 +145,20 @@ func newUnalignedMsmData(comp *wizard.CompiledIOP, g Group, src *BlsMsmDataSourc createCol1 := createColFn(comp, fmt.Sprintf("UNALIGNED_%s_BLS_MSM", g.String()), utils.NextPowerOfTwo(maxNbMsmInputs)) createCol2 := createColFn(comp, fmt.Sprintf("UNALIGNED_%s_BLS_MSM", g.String()), utils.NextPowerOfTwo(maxNbRowsAligned)) res := &UnalignedMsmData{ - BlsMsmDataSource: src, - IsDataAndCsMul: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("UNALIGNED_%s_BLS_MSM_SRC_IS_DATA_AND_CS_MSM", g.String()), maxNbRows), - IsResultAndCsMul: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("UNALIGNED_%s_BLS_MSM_SRC_IS_RESULT_AND_CS_MSM", g.String()), maxNbRows), - IsActive: createCol1("IS_ACTIVE"), - Point: make([]ifaces.Column, nbLimbs(g)), - CurrentAccumulator: make([]ifaces.Column, nbLimbs(g)), - NextAccumulator: make([]ifaces.Column, nbLimbs(g)), - IsFirstLine: createCol1("IS_FIRST_LINE"), - IsLastLine: createCol1("IS_LAST_LINE"), - GnarkIsActiveMsm: createCol2("GNARK_IS_ACTIVE_MSM"), - GnarkDataMsm: createCol2("GNARK_DATA_MSM"), - Group: g, - MaxNbMsmInputs: maxNbMsmInputs, + BlsMsmDataSource: src, + IsMsmInstanceAndMembership: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("UNALIGNED_%s_BLS_MSM_IS_MSM_AND_MEMBERSHIP", g.String()), maxNbRows), + IsDataAndCsMul: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("UNALIGNED_%s_BLS_MSM_SRC_IS_DATA_AND_CS_MSM", g.String()), maxNbRows), + IsResultAndCsMul: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("UNALIGNED_%s_BLS_MSM_SRC_IS_RESULT_AND_CS_MSM", g.String()), maxNbRows), + IsActive: createCol1("IS_ACTIVE"), + Point: make([]ifaces.Column, nbLimbs(g)), + CurrentAccumulator: make([]ifaces.Column, nbLimbs(g)), + NextAccumulator: make([]ifaces.Column, nbLimbs(g)), + IsFirstLine: createCol1("IS_FIRST_LINE"), + IsLastLine: createCol1("IS_LAST_LINE"), + GnarkIsActiveMsm: createCol2("GNARK_IS_ACTIVE_MSM"), + GnarkDataMsm: createCol2("GNARK_DATA_MSM"), + Group: g, + MaxNbMsmInputs: maxNbMsmInputs, } for i := range res.Scalar { @@ -186,6 +188,8 @@ func newUnalignedMsmData(comp *wizard.CompiledIOP, g Group, src *BlsMsmDataSourc } func (d *UnalignedMsmData) csInputMasks(comp *wizard.CompiledIOP) { + // constraint: IS_MSM_AND_MEMBERSHIP == IS_MSM_DATA && IS_MEMBERSHIP + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_IS_MSM_AND_MEMBERSHIP", NAME_UNALIGNED_MSM, d.Group.String()), sym.Sub(d.IsMsmInstanceAndMembership, sym.Mul(d.IsData, d.CsMembership))) // we need to compute the IS_DATA && CS_MUL column which is used for projection comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_IS_DATA_AND_CS_MUL", NAME_UNALIGNED_MSM, d.Group.String()), sym.Sub(d.IsDataAndCsMul, sym.Mul(d.IsData, d.CsMul))) comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_%s_IS_RESULT_AND_CS_MUL", NAME_UNALIGNED_MSM, d.Group.String()), sym.Sub(d.IsResultAndCsMul, sym.Mul(d.IsRes, d.CsMul))) @@ -258,29 +262,33 @@ func (d *UnalignedMsmData) csAccumulatorConsistency(comp *wizard.CompiledIOP) { } func (d *UnalignedMsmData) Assign(run *wizard.ProverRuntime) { - d.assignDataAndMul(run) + d.assignMasks(run) d.assignUnaligned(run) d.assignGnarkData(run) } -func (d *UnalignedMsmData) assignDataAndMul(run *wizard.ProverRuntime) { +func (d *UnalignedMsmData) assignMasks(run *wizard.ProverRuntime) { var ( - srcLimb = d.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() - srcIsData = d.IsData.GetColAssignment(run).IntoRegVecSaveAlloc() - srcCsMul = d.CsMul.GetColAssignment(run).IntoRegVecSaveAlloc() - srcIsRes = d.IsRes.GetColAssignment(run).IntoRegVecSaveAlloc() + srcLimb = d.Limb.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsData = d.IsData.GetColAssignment(run).IntoRegVecSaveAlloc() + srcCsMul = d.CsMul.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsRes = d.IsRes.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsMembership = d.CsMembership.GetColAssignment(run).IntoRegVecSaveAlloc() ) var ( - dstDataAndCs = common.NewVectorBuilder(d.IsDataAndCsMul) - dstIsResultAndCs = common.NewVectorBuilder(d.IsResultAndCsMul) + dstIsMsmAndMembership = common.NewVectorBuilder(d.IsMsmInstanceAndMembership) + dstDataAndCs = common.NewVectorBuilder(d.IsDataAndCsMul) + dstIsResultAndCs = common.NewVectorBuilder(d.IsResultAndCsMul) ) // compute the IS_DATA && CS_MUL column which is used for projection for ptr := range srcLimb { dstDataAndCs.PushBoolean(srcIsData[ptr].IsOne() && srcCsMul[ptr].IsOne()) dstIsResultAndCs.PushBoolean(srcIsRes[ptr].IsOne() && srcCsMul[ptr].IsOne()) + dstIsMsmAndMembership.PushBoolean(srcIsMembership[ptr].IsOne() && srcIsData[ptr].IsOne()) } dstDataAndCs.PadAndAssign(run, field.Zero()) dstIsResultAndCs.PadAndAssign(run, field.Zero()) + dstIsMsmAndMembership.PadAndAssign(run, field.Zero()) } func (d *UnalignedMsmData) assignUnaligned(run *wizard.ProverRuntime) { From 4a3ecc0ab5ffe22d84edb91e006983c576f5b31c Mon Sep 17 00:00:00 2001 From: Ivo Kubjas Date: Fri, 28 Nov 2025 00:53:00 +0000 Subject: [PATCH 35/36] fix: send PAIR non-membership only for PAIR instances --- prover/zkevm/prover/bls/module_pair.go | 73 ++++++++++++++++++++------ 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/prover/zkevm/prover/bls/module_pair.go b/prover/zkevm/prover/bls/module_pair.go index 46155b540d..3cbf2172bc 100644 --- a/prover/zkevm/prover/bls/module_pair.go +++ b/prover/zkevm/prover/bls/module_pair.go @@ -149,15 +149,17 @@ func (bp *BlsPair) Assign(run *wizard.ProverRuntime) { type UnalignedPairData struct { *BlsPairDataSource - IsActive ifaces.Column - IsFirstLine ifaces.Column - IsLastLine ifaces.Column - IsNotLastLine ifaces.Column - PointG1 [nbG1Limbs]ifaces.Column - PointG2 [nbG2Limbs]ifaces.Column - PrevAccumulator [nbGtLimbs]ifaces.Column - CurrentAccumulator [nbGtLimbs]ifaces.Column - ExpectedResult [2]ifaces.Column + IsPairingInstance ifaces.Column + IsPairingAndSuccess ifaces.Column + IsActive ifaces.Column + IsFirstLine ifaces.Column + IsLastLine ifaces.Column + IsNotLastLine ifaces.Column + PointG1 [nbG1Limbs]ifaces.Column + PointG2 [nbG2Limbs]ifaces.Column + PrevAccumulator [nbGtLimbs]ifaces.Column + CurrentAccumulator [nbGtLimbs]ifaces.Column + ExpectedResult [2]ifaces.Column GnarkIsActiveG1Membership ifaces.Column GnarkIsActiveG2Membership ifaces.Column @@ -190,6 +192,8 @@ func newUnalignedPairData(comp *wizard.CompiledIOP, src *BlsPairDataSource) *Una GnarkDataMillerLoop: createColFnMl("GNARK_DATA_ML"), GnarkIsActiveFinalExp: createColFnFe("GNARK_IS_ACTIVE_FE"), GnarkDataFinalExp: createColFnFe("GNARK_DATA_FE"), + IsPairingInstance: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("%s_%s", NAME_BLS_PAIR, "IS_PAIRING_INSTANCE"), max(src.IsData.Size(), src.IsRes.Size())), + IsPairingAndSuccess: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("%s_%s", NAME_BLS_PAIR, "IS_PAIRING_AND_SUCCESS"), max(src.IsData.Size(), src.IsRes.Size(), src.SuccessBit.Size())), GnarkIsActiveG1Membership: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("%s_%s", NAME_BLS_PAIR, "GNARK_IS_ACTIVE_G1_MEMBERSHIP"), max(src.SuccessBit.Size(), src.CsG1Membership.Size())), GnarkIsActiveG2Membership: comp.InsertCommit(ROUND_NR, ifaces.ColIDf("%s_%s", NAME_BLS_PAIR, "GNARK_IS_ACTIVE_G2_MEMBERSHIP"), max(src.SuccessBit.Size(), src.CsG2Membership.Size())), MaxNbPairInputs: maxNbPairInputs, @@ -211,6 +215,9 @@ func newUnalignedPairData(comp *wizard.CompiledIOP, src *BlsPairDataSource) *Una ucmd.ExpectedResult[i] = createColFnUa(fmt.Sprintf("EXPECTED_RESULT_%d", i)) } + // constraint: IS_PAIR_DATA || IS_PAIR_RES + // constraint: SUCCESS_BIT && (IS_PAIR_DATA || IS_PAIR_RES) + ucmd.csIsPairingInstance(comp) // non-membership input mask ucmd.csInputMask(comp) // projection from source to unaligned @@ -225,6 +232,27 @@ func newUnalignedPairData(comp *wizard.CompiledIOP, src *BlsPairDataSource) *Una return ucmd } +func (c *UnalignedPairData) csIsPairingInstance(comp *wizard.CompiledIOP) { + // IsPairingInstance = IsData OR IsRes + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_IS_PAIRING_INSTANCE", NAME_BLS_PAIR), + sym.Sub( + c.IsPairingInstance, + c.IsData, + c.IsRes, + ), + ) + // IsPairingAndSuccess = SuccessBit AND (IsData OR IsRes) + comp.InsertGlobal(ROUND_NR, ifaces.QueryIDf("%s_IS_PAIRING_AND_SUCCESS", NAME_BLS_PAIR), + sym.Sub( + c.IsPairingAndSuccess, + sym.Mul( + c.SuccessBit, + c.IsPairingInstance, + ), + ), + ) +} + func (d *UnalignedPairData) csInputMask(comp *wizard.CompiledIOP) { // assert that the GnarkIsActiveG1Membership and GnarkIsActiveG2Membership // are set correctly. We only call the subgroup membership for @@ -236,7 +264,7 @@ func (d *UnalignedPairData) csInputMask(comp *wizard.CompiledIOP) { d.GnarkIsActiveG1Membership, sym.Mul( d.CsG1Membership, - sym.Sub(1, d.SuccessBit), + sym.Sub(1, d.IsPairingAndSuccess), ), ), ) @@ -245,7 +273,7 @@ func (d *UnalignedPairData) csInputMask(comp *wizard.CompiledIOP) { d.GnarkIsActiveG2Membership, sym.Mul( d.CsG2Membership, - sym.Sub(1, d.SuccessBit), + sym.Sub(1, d.IsPairingAndSuccess), ), ), ) @@ -267,7 +295,7 @@ func (d *UnalignedPairData) csProjectionUnaligned(comp *wizard.CompiledIOP) { columnsB[nbG1Limbs+nbG2Limbs+i] = []ifaces.Column{d.ExpectedResult[i]} } prj := query.ProjectionMultiAryInput{ - FiltersA: []ifaces.Column{d.SuccessBit}, + FiltersA: []ifaces.Column{d.IsPairingAndSuccess}, FiltersB: filtersB, ColumnsA: [][]ifaces.Column{{d.BlsPairDataSource.Limb}}, ColumnsB: columnsB, @@ -379,23 +407,36 @@ func (d *UnalignedPairData) assignMembershipMask(run *wizard.ProverRuntime) { // (CS_G2_MEMBERSHIP AND !SUCCESS_BIT) columns which are used for filtering // the inputs going to group non-membership circuit. var ( + srcIsData = d.IsData.GetColAssignment(run).IntoRegVecSaveAlloc() + srcIsRes = d.IsRes.GetColAssignment(run).IntoRegVecSaveAlloc() srcCsG1Membership = d.CsG1Membership.GetColAssignment(run).IntoRegVecSaveAlloc() srcCsG2Membership = d.CsG2Membership.GetColAssignment(run).IntoRegVecSaveAlloc() srcSuccessBit = d.SuccessBit.GetColAssignment(run).IntoRegVecSaveAlloc() ) var ( - dstG1Membership = common.NewVectorBuilder(d.GnarkIsActiveG1Membership) - dstG2Membership = common.NewVectorBuilder(d.GnarkIsActiveG2Membership) + dstIsPairingInstance = common.NewVectorBuilder(d.IsPairingInstance) + dstIsPairingAndSuccess = common.NewVectorBuilder(d.IsPairingAndSuccess) + dstG1Membership = common.NewVectorBuilder(d.GnarkIsActiveG1Membership) + dstG2Membership = common.NewVectorBuilder(d.GnarkIsActiveG2Membership) ) + for i := range max(len(srcIsData), len(srcIsRes)) { + dstIsPairingInstance.PushBoolean(srcIsData[i].IsOne() || srcIsRes[i].IsOne()) + } + for i := range max(len(srcIsData), len(srcIsRes), len(srcSuccessBit)) { + dstIsPairingAndSuccess.PushBoolean((srcIsData[i].IsOne() || srcIsRes[i].IsOne()) && srcSuccessBit[i].IsOne()) + } + for i := range srcCsG1Membership { - dstG1Membership.PushBoolean(srcCsG1Membership[i].IsOne() && srcSuccessBit[i].IsZero()) + dstG1Membership.PushBoolean((srcIsData[i].IsOne() || srcIsRes[i].IsOne()) && srcCsG1Membership[i].IsOne() && srcSuccessBit[i].IsZero()) } for i := range srcCsG2Membership { - dstG2Membership.PushBoolean(srcCsG2Membership[i].IsOne() && srcSuccessBit[i].IsZero()) + dstG2Membership.PushBoolean((srcIsData[i].IsOne() || srcIsRes[i].IsOne()) && srcCsG2Membership[i].IsOne() && srcSuccessBit[i].IsZero()) } + dstIsPairingInstance.PadAndAssign(run, field.Zero()) + dstIsPairingAndSuccess.PadAndAssign(run, field.Zero()) dstG1Membership.PadAndAssign(run, field.Zero()) dstG2Membership.PadAndAssign(run, field.Zero()) } From e6dae14dc4b393cde82d4ced54a4d41c31ba04f4 Mon Sep 17 00:00:00 2001 From: gusiri Date: Fri, 28 Nov 2025 15:13:10 +0000 Subject: [PATCH 36/36] add new discovery advices --- prover/zkevm/limitless.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/prover/zkevm/limitless.go b/prover/zkevm/limitless.go index bf9a606722..451bfbdf6a 100644 --- a/prover/zkevm/limitless.go +++ b/prover/zkevm/limitless.go @@ -345,6 +345,7 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7903,MIMC_STACKED_NEW_STATES_0_7904,MIMC_STACKED_OLD_STATES_0_7902_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_7903,MIMC_STACKED_NEW_STATES_0_7904,MIMC_STACKED_OLD_STATES_0_7902_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_8105,MIMC_STACKED_NEW_STATES_0_8106,MIMC_STACKED_OLD_STATES_0_8104_0_LOGDERIVATIVE_M"}, + {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "TABLE_MIMC_STACKED_BLOCKS_0_8237,MIMC_STACKED_NEW_STATES_0_8238,MIMC_STACKED_OLD_STATES_0_8236_0_LOGDERIVATIVE_M"}, {BaseSize: 1048576, Cluster: "ARITH-OPS", Column: "MIMC_ROUND_0_SUM_POW4_0_8235"}, // ELLIPTIC CURVES @@ -356,6 +357,21 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 4096, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_IS_ACTIVE"}, {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_ML"}, {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "UNALIGNED_BLS_PAIR_GNARK_DATA_FE"}, + // ELLIPTIC_CURVES — cyclic counters for BLS/P256 pipelines + {BaseSize: 256, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7624_256_0_COUNTER"}, + {BaseSize: 64, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7632_64_0_COUNTER"}, + {BaseSize: 256, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7640_256_0_COUNTER"}, + {BaseSize: 1024, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7648_1024_0_COUNTER"}, + {BaseSize: 256, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7656_256_0_COUNTER"}, + {BaseSize: 512, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7722_512_0_COUNTER"}, + {BaseSize: 128, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7730_128_0_COUNTER"}, + {BaseSize: 128, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7738_128_0_COUNTER"}, + {BaseSize: 512, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7880_512_0_COUNTER"}, + {BaseSize: 512, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7888_512_0_COUNTER"}, + {BaseSize: 64, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7896_64_0_COUNTER"}, + {BaseSize: 32, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7904_32_0_COUNTER"}, + {BaseSize: 32, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7912_32_0_COUNTER"}, + {BaseSize: 128, Cluster: "ELLIPTIC_CURVES", Column: "CYCLIC_COUNTER_7920_128_0_COUNTER"}, // HUB-KECCAK (EUCLIDEAN variants) {BaseSize: 65536, Cluster: "HUB-KECCAK", Column: "TABLE_euc.CEIL,euc.DIVIDEND,euc.DIVISOR,euc.QUOTIENT,euc.REMAINDER_0_LOGDERIVATIVE_M"}, @@ -417,10 +433,26 @@ var DiscoveryAdvices = []distributed.ModuleDiscoveryAdvice{ {BaseSize: 32, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7900_32_0_COUNTER"}, {BaseSize: 32, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7908_32_0_COUNTER"}, {BaseSize: 128, Cluster: "STATIC", Column: "CYCLIC_COUNTER_7916_128_0_COUNTER"}, + // STATIC — REPEATED_PATTERN tables used by cyclic counters + {BaseSize: 256, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7621_256_PATTERN,REPEATED_PATTERN_7621_256_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7629_64_PATTERN,REPEATED_PATTERN_7629_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 256, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7637_256_PATTERN,REPEATED_PATTERN_7637_256_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 1024, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7645_1024_PATTERN,REPEATED_PATTERN_7645_1024_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 256, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7653_256_PATTERN,REPEATED_PATTERN_7653_256_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7719_512_PATTERN,REPEATED_PATTERN_7719_512_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 128, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7727_128_PATTERN,REPEATED_PATTERN_7727_128_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 128, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7735_128_PATTERN,REPEATED_PATTERN_7735_128_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7877_512_PATTERN,REPEATED_PATTERN_7877_512_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 512, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7885_512_PATTERN,REPEATED_PATTERN_7885_512_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 64, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7893_64_PATTERN,REPEATED_PATTERN_7893_64_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7901_32_PATTERN,REPEATED_PATTERN_7901_32_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 32, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7909_32_PATTERN,REPEATED_PATTERN_7909_32_PATTERNPOS_0_LOGDERIVATIVE_M"}, + {BaseSize: 128, Cluster: "STATIC", Column: "TABLE_REPEATED_PATTERN_7917_128_PATTERN,REPEATED_PATTERN_7917_128_PATTERNPOS_0_LOGDERIVATIVE_M"}, // TINY-STUFFS // {BaseSize: 4096, Cluster: "TINY-STUFFS", Column: "PUBLIC_INPUT_CHAIN_ID_FETCHER_N_BYTES_CHAIN_ID"}, + // End of new discovery advices for Osaka }