summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorausiv4 <ausiv4@eb105b4a-77de-11de-a249-6bf219df57d5>2009-08-09 00:57:03 +0000
committerausiv4 <ausiv4@eb105b4a-77de-11de-a249-6bf219df57d5>2009-08-09 00:57:03 +0000
commit900dc01238f0c0f6830d487d93f9176e711104fe (patch)
treebfe947b83e7e130f68f90adc0740c95e1a752eed
parent48c6ab56a73b830c6fcddd32f44636e8b399be85 (diff)
Significant cleanup to srp.js.
-rw-r--r--javascript/jsPacker/srp.min.js2
-rw-r--r--javascript/srp.js181
-rw-r--r--upgrade-notes.txt19
3 files changed, 99 insertions, 103 deletions
diff --git a/javascript/jsPacker/srp.min.js b/javascript/jsPacker/srp.min.js
index c966315..e1c9059 100644
--- a/javascript/jsPacker/srp.min.js
+++ b/javascript/jsPacker/srp.min.js
@@ -1 +1 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('E 1D(s){D 2t=8;D 7n=0;E 1f(x,y){D 4i=(x&4h)+(y&4h);D 7v=(x>>16)+(y>>16)+(4i>>16);F(7v<<16)|(4i&4h)}E S(X,n){F(X>>>n)|(X<<(32-n))}E R(X,n){F(X>>>n)}E 7r(x,y,z){F((x&y)^((~x)&z))}E 7p(x,y,z){F((x&y)^(x&z)^(y&z))}E 7q(x){F(S(x,2)^S(x,13)^S(x,22))}E 7s(x){F(S(x,6)^S(x,11)^S(x,25))}E 7t(x){F(S(x,7)^S(x,18)^R(x,3))}E 7u(x){F(S(x,17)^S(x,19)^R(x,10))}E 7j(m,l){D K=V 1w(bk,bj,bi,bh,bg,bf,be,bd,bc,bb,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0,aZ,aY,aX,aW,aV,aU,aT,aS,aR,aQ,aP,aO,aN,aM,aL,aK,aJ,aI,aH,aG,aF,aE,aD,aC,aB,aA,az,ay,ax,aw,av,au,at,as,ar,aq,ap,ao,an,al,ak,aj,ai,ah);D 1a=V 1w(ag,af,ae,ad,ab,aa,a9,a8);D W=V 1w(64);D a,b,c,d,e,f,g,h,i,j;D 3v,4g;m[l>>5]|=2O<<(24-l%32);m[((l+64>>9)<<4)+15]=l;P(D i=0;i<m.T;i+=16){a=1a[0];b=1a[1];c=1a[2];d=1a[3];e=1a[4];f=1a[5];g=1a[6];h=1a[7];P(D j=0;j<64;j++){C(j<16)W[j]=m[j+i];J W[j]=1f(1f(1f(7u(W[j-2]),W[j-7]),7t(W[j-15])),W[j-16]);3v=1f(1f(1f(1f(h,7s(e)),7r(e,f,g)),K[j]),W[j]);4g=1f(7q(a),7p(a,b,c));h=g;g=f;f=e;e=1f(d,3v);d=c;c=b;b=a;a=1f(3v,4g)}1a[0]=1f(a,1a[0]);1a[1]=1f(b,1a[1]);1a[2]=1f(c,1a[2]);1a[3]=1f(d,1a[3]);1a[4]=1f(e,1a[4]);1a[5]=1f(f,1a[5]);1a[6]=1f(g,1a[6]);1a[7]=1f(h,1a[7])}F 1a}E 7i(1Q){D 4f=1w();D 7o=(1<<2t)-1;P(D i=0;i<1Q.T*2t;i+=2t){4f[i>>5]|=(1Q.2b(i/2t)&7o)<<(24-i%32)}F 4f}E 7l(2s){2s=2s.a7(/\\r\\n/g,"\\n");D 1U="";P(D n=0;n<2s.T;n++){D c=2s.2b(n);C(c<3u){1U+=2v.2u(c)}J C((c>60)&&(c<a6)){1U+=2v.2u((c>>6)|a5);1U+=2v.2u((c&63)|3u)}J{1U+=2v.2u((c>>12)|a4);1U+=2v.2u(((c>>6)&63)|3u);1U+=2v.2u((c&63)|3u)}}F 1U}E 7k(3t){D 4e=7n?"a3":"a2";D 1Q="";P(D i=0;i<3t.T*4;i++){1Q+=4e.2Q((3t[i>>2]>>((3-i%4)*8+4))&7m)+4e.2Q((3t[i>>2]>>((3-i%4)*8))&7m)}F 1Q}s=7l(s);F 7k(7j(7i(s),s.T*2t))}E 3s(){o.i=0;o.j=0;o.S=V 1w()}E 7h(2d){D i,j,t;P(i=0;i<1T;++i)o.S[i]=i;j=0;P(i=0;i<1T;++i){j=(j+o.S[i]+2d[i%2d.T])&1C;t=o.S[i];o.S[i]=o.S[j];o.S[j]=t}o.i=0;o.j=0}E 7g(){D t;o.i=(o.i+1)&1C;o.j=(o.j+o.S[o.i])&1C;t=o.S[o.i];o.S[o.i]=o.S[o.j];o.S[o.j]=t;F o.S[(t+o.S[o.i])&1C]}3s.H.7b=7h;3s.H.7a=7g;E 7c(){F V 3s()}D 3r=1T;D 2U;D 1s;D 1g;E 7f(x){1s[1g++]^=x&1C;1s[1g++]^=(x>>8)&1C;1s[1g++]^=(x>>16)&1C;1s[1g++]^=(x>>24)&1C;C(1g>=3r)1g-=3r}E 4d(){7f(V a1().a0())}C(1s==Z){1s=V 1w();1g=0;D t;C(3q.4a=="72"&&3q.9Z<"5"&&1W.7e){D z=1W.7e.7d(32);P(t=0;t<z.T;++t)1s[1g++]=z.2b(t)&1C}L(1g<3r){t=1e.21(9Y*1e.7d());1s[1g++]=t>>>8;1s[1g++]=t&1C}1g=0;4d();}E 78(){C(2U==Z){4d();2U=7c();2U.7b(1s);P(1g=0;1g<1s.T;++1g)1s[1g]=0;1g=0;}F 2U.7a()}E 77(ba){D i;P(i=0;i<ba.T;++i)ba[i]=78()}E 3I(){}3I.H.6g=77;D 1L;D 76=9X;D 4b=((76&9W)==9V);E G(a,b,c){C(a!=Z)C("6h"==3g a)o.3M(a,b,c);J C(b==Z&&"2s"!=3g a)o.3l(a,1T);J o.3l(a,b)}E Q(){F V G(Z)}E 70(i,x,w,j,c,n){L(--n>=0){D v=x*o[i++]+w[j]+c;c=1e.21(v/9U);w[j++]=v&9T}F c}E 74(i,x,w,j,c,n){D 2r=x&2R,2q=x>>15;L(--n>=0){D l=o[i]&2R;D h=o[i++]>>15;D m=2q*l+h*2r;l=2r*l+((m&2R)<<15)+w[j]+(c&75);c=(l>>>30)+(m>>>15)+2q*h+(c>>>30);w[j++]=l&75}F c}E 6Z(i,x,w,j,c,n){D 2r=x&4c,2q=x>>14;L(--n>=0){D l=o[i]&4c;D h=o[i++]>>14;D m=2q*l+h*2r;l=2r*l+((m&4c)<<14)+w[j]+c;c=(l>>28)+(m>>14)+2q*h;w[j++]=l&9S}F c}C(4b&&(3q.4a=="4P 9R 9Q")){G.H.am=74;1L=30}J C(4b&&(3q.4a!="72")){G.H.am=70;1L=26}J{G.H.am=6Z;1L=28}G.H.O=1L;G.H.1h=((1<<1L)-1);G.H.1m=(1<<1L);D 3p=52;G.H.6X=1e.2E(2,3p);G.H.46=3p-1L;G.H.44=2*1L-3p;D 6Y="9P";D 2T=V 1w();D 2c,1r;2c="0".2b(0);P(1r=0;1r<=9;++1r)2T[2c++]=1r;2c="a".2b(0);P(1r=10;1r<36;++1r)2T[2c++]=1r;2c="A".2b(0);P(1r=10;1r<36;++1r)2T[2c++]=1r;E 49(n){F 6Y.2Q(n)}E 3Y(s,i){D c=2T[s.2b(i)];F(c==Z)?-1:c}E 6F(r){P(D i=o.t-1;i>=0;--i)r[i]=o[i];r.t=o.t;r.s=o.s}E 6E(x){o.t=1;o.s=(x<0)?-1:0;C(x>0)o[0]=x;J C(x<-1)o[0]=x+1m;J o.t=0}E 1I(i){D r=Q();r.2h(i);F r}E 6D(s,b){D k;C(b==16)k=4;J C(b==8)k=3;J C(b==1T)k=8;J C(b==2)k=1;J C(b==32)k=5;J C(b==4)k=2;J{o.5U(s,b);F}o.t=0;o.s=0;D i=s.T,27=1o,1q=0;L(--i>=0){D x=(k==8)?s[i]&2N:3Y(s,i);C(x<0){C(s.2Q(i)=="-")27=1E;6i}27=1o;C(1q==0)o[o.t++]=x;J C(1q+k>o.O){o[o.t-1]|=(x&((1<<(o.O-1q))-1))<<1q;o[o.t++]=(x>>(o.O-1q))}J o[o.t-1]|=x<<1q;1q+=k;C(1q>=o.O)1q-=o.O}C(k==8&&(s[0]&2O)!=0){o.s=-1;C(1q>0)o[o.t-1]|=((1<<(o.O-1q))-1)<<1q}o.1n();C(27)G.1v.Y(o,o)}E 6C(){D c=o.s&o.1h;L(o.t>0&&o[o.t-1]==c)--o.t}E 6p(b){C(o.s<0)F"-"+o.2H().1y(b);D k;C(b==16)k=4;J C(b==8)k=3;J C(b==2)k=1;J C(b==32)k=5;J C(b==4)k=2;J F o.5W(b);D 2J=(1<<k)-1,d,m=1o,r="",i=o.t;D p=o.O-(i*o.O)%k;C(i-->0){C(p<o.O&&(d=o[i]>>p)>0){m=1E;r=49(d)}L(i>=0){C(p<k){d=(o[i]&((1<<p)-1))<<(k-p);d|=o[--i]>>(p+=o.O-k)}J{d=(o[i]>>(p-=k))&2J;C(p<=0){p+=o.O;--i}}C(d>0)m=1E;C(m)r+=49(d)}}F m?r:"0"}E 6o(){D r=Q();G.1v.Y(o,r);F r}E 6n(){F(o.s<0)?o.2H():o}E 6m(a){D r=o.s-a.s;C(r!=0)F r;D i=o.t;r=i-a.t;C(r!=0)F r;L(--i>=0)C((r=o[i]-a[i])!=0)F r;F 0}E 2K(x){D r=1,t;C((t=x>>>16)!=0){x=t;r+=16}C((t=x>>8)!=0){x=t;r+=8}C((t=x>>4)!=0){x=t;r+=4}C((t=x>>2)!=0){x=t;r+=2}C((t=x>>1)!=0){x=t;r+=1}F r}E 6l(){C(o.t<=0)F 0;F o.O*(o.t-1)+2K(o[o.t-1]^(o.s&o.1h))}E 6B(n,r){D i;P(i=o.t-1;i>=0;--i)r[i+n]=o[i];P(i=n-1;i>=0;--i)r[i]=0;r.t=o.t+n;r.s=o.s}E 6A(n,r){P(D i=n;i<o.t;++i)r[i-n]=o[i];r.t=1e.3J(o.t-n,0);r.s=o.s}E 6z(n,r){D 1B=n%o.O;D 2p=o.O-1B;D 2S=(1<<2p)-1;D 1p=1e.21(n/o.O),c=(o.s<<1B)&o.1h,i;P(i=o.t-1;i>=0;--i){r[i+1p+1]=(o[i]>>2p)|c;c=(o[i]&2S)<<1B}P(i=1p-1;i>=0;--i)r[i]=0;r[1p]=c;r.t=o.t+1p+1;r.s=o.s;r.1n()}E 6y(n,r){r.s=o.s;D 1p=1e.21(n/o.O);C(1p>=o.t){r.t=0;F}D 1B=n%o.O;D 2p=o.O-1B;D 2S=(1<<1B)-1;r[0]=o[1p]>>1B;P(D i=1p+1;i<o.t;++i){r[i-1p-1]|=(o[i]&2S)<<2p;r[i-1p]=o[i]>>1B}C(1B>0)r[o.t-1p-1]|=(o.s&2S)<<2p;r.t=o.t-1p;r.1n()}E 6x(a,r){D i=0,c=0,m=1e.1O(a.t,o.t);L(i<m){c+=o[i]-a[i];r[i++]=c&o.1h;c>>=o.O}C(a.t<o.t){c-=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c-=a[i];r[i++]=c&o.1h;c>>=o.O}c-=a.s}r.s=(c<0)?-1:0;C(c<-1)r[i++]=o.1m+c;J C(c>0)r[i++]=c;r.t=i;r.1n()}E 6w(a,r){D x=o.1H(),y=a.1H();D i=x.t;r.t=i+y.t;L(--i>=0)r[i]=0;P(i=0;i<y.t;++i)r[i+x.t]=x.am(0,y[i],r,i,0,x.t);r.s=0;r.1n();C(o.s!=a.s)G.1v.Y(r,r)}E 6v(r){D x=o.1H();D i=r.t=2*x.t;L(--i>=0)r[i]=0;P(i=0;i<x.t-1;++i){D c=x.am(i,x[i],r,2*i,0,1);C((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x.1m){r[i+x.t]-=x.1m;r[i+x.t+1]=1}}C(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=0;r.1n()}E 6u(m,q,r){D 2a=m.1H();C(2a.t<=0)F;D 3o=o.1H();C(3o.t<2a.t){C(q!=Z)q.2h(0);C(r!=Z)o.1J(r);F}C(r==Z)r=Q();D y=Q(),42=o.s,6U=m.s;D 2o=o.O-2K(2a[2a.t-1]);C(2o>0){2a.2i(2o,y);3o.2i(2o,r)}J{2a.1J(y);3o.1J(r)}D 1A=y.t;D 3n=y[1A-1];C(3n==0)F;D 45=3n*(1<<o.46)+((1A>1)?y[1A-2]>>o.44:0);D 6W=o.6X/45,6V=(1<<o.46)/45,e=1<<o.44;D i=r.t,j=i-1A,t=(q==Z)?Q():q;y.2m(j,t);C(r.1d(t)>=0){r[r.t++]=1;r.Y(t,r)}G.1u.2m(1A,t);t.Y(y,y);L(y.t<1A)y[y.t++]=0;L(--j>=0){D 3m=(r[--i]==3n)?o.1h:1e.21(r[i]*6W+(r[i-1]+e)*6V);C((r[i]+=y.am(0,3m,r,j,0,1A))<3m){y.2m(j,t);r.Y(t,r);L(r[i]<--3m)r.Y(t,r)}}C(q!=Z){r.2M(1A,q);C(42!=6U)G.1v.Y(q,q)}r.t=1A;r.1n();C(2o>0)r.1i(2o,r);C(42<0)G.1v.Y(r,r)}E 6k(a){D r=Q();o.1H().1K(a,Z,r);C(o.s<0&&r.1d(G.1v)>0)a.Y(r,r);F r}E 1S(m){o.m=m}E 6T(x){C(x.s<0||x.1d(o.m)>=0)F x.3S(o.m);J F x}E 6S(x){F x}E 6R(x){x.1K(o.m,Z,x)}E 6Q(x,y,r){x.2l(y,r);o.1x(r)}E 6P(x,r){x.2L(r);o.1x(r)}1S.H.2k=6T;1S.H.2j=6S;1S.H.1x=6R;1S.H.1Y=6Q;1S.H.1z=6P;E 6s(){C(o.t<1)F 0;D x=o[0];C((x&1)==0)F 0;D y=x&3;y=(y*(2-(x&3X)*y))&3X;y=(y*(2-(x&2N)*y))&2N;y=(y*(2-(((x&3k)*y)&3k)))&3k;y=(y*(2-x*y%o.1m))%o.1m;F(y>0)?o.1m-y:-y}E 1R(m){o.m=m;o.40=m.6t();o.3Z=o.40&2R;o.6N=o.40>>15;o.6M=(1<<(m.O-15))-1;o.6O=2*m.t}E 6K(x){D r=Q();x.1H().2m(o.m.t,r);r.1K(o.m,Z,r);C(x.s<0&&r.1d(G.1v)>0)o.m.Y(r,r);F r}E 6J(x){D r=Q();x.1J(r);o.1x(r);F r}E 6I(x){L(x.t<=o.6O)x[x.t++]=0;P(D i=0;i<o.m.t;++i){D j=x[i]&2R;D 6L=(j*o.3Z+(((j*o.6N+(x[i]>>15)*o.3Z)&o.6M)<<15))&x.1h;j=i+o.m.t;x[j]+=o.m.am(0,6L,x,i,0,o.m.t);L(x[j]>=x.1m){x[j]-=x.1m;x[++j]++}}x.1n();x.2M(o.m.t,x);C(x.1d(o.m)>=0)x.Y(o.m,x)}E 6G(x,r){x.2L(r);o.1x(r)}E 6H(x,y,r){x.2l(y,r);o.1x(r)}1R.H.2k=6K;1R.H.2j=6J;1R.H.1x=6I;1R.H.1Y=6H;1R.H.1z=6G;E 6r(){F((o.t>0)?(o[0]&1):o.s)==0}E 6q(e,z){C(e>9O||e<1)F G.1u;D r=Q(),1b=Q(),g=z.2k(o),i=2K(e)-1;g.1J(r);L(--i>=0){z.1z(r,1b);C((e&(1<<i))>0)z.1Y(1b,g,r);J{D t=r;r=1b;1b=t}}F z.2j(r)}E 6j(e,m){D z;C(e<1T||m.1l())z=V 1S(m);J z=V 1R(m);F o.3T(e,z)}G.H.1J=6F;G.H.2h=6E;G.H.3l=6D;G.H.1n=6C;G.H.2m=6B;G.H.2M=6A;G.H.2i=6z;G.H.1i=6y;G.H.Y=6x;G.H.2l=6w;G.H.2L=6v;G.H.1K=6u;G.H.6t=6s;G.H.1l=6r;G.H.3T=6q;G.H.1y=6p;G.H.2H=6o;G.H.1H=6n;G.H.1d=6m;G.H.3Q=6l;G.H.3S=6k;G.H.5Y=6j;G.1v=1I(0);G.1u=1I(1);E 5E(){D r=Q();o.1J(r);F r}E 5D(){C(o.s<0){C(o.t==1)F o[0]-o.1m;J C(o.t==0)F-1}J C(o.t==1)F o[0];J C(o.t==0)F 0;F((o[1]&((1<<(32-o.O))-1))<<o.O)|o[0]}E 5C(){F(o.t==0)?o.s:(o[0]<<24)>>24}E 5B(){F(o.t==0)?o.s:(o[0]<<16)>>16}E 5X(r){F 1e.21(1e.9N*o.O/1e.9M(r))}E 5A(){C(o.s<0)F-1;J C(o.t<=0||(o.t==1&&o[0]<=0))F 0;J F 1}E 5V(b){C(b==Z)b=10;C(o.1G()==0||b<2||b>36)F"0";D 2P=o.3N(b);D a=1e.2E(b,2P);D d=1I(a),y=Q(),z=Q(),r="";o.1K(d,y,z);L(y.1G()>0){r=(a+z.3K()).1y(b).9L(1)+r;y.1K(d,y,z)}F z.3K().1y(b)+r}E 5T(s,b){o.2h(0);C(b==Z)b=10;D 2P=o.3N(b);D d=1e.2E(b,2P),27=1o,j=0,w=0;P(D i=0;i<s.T;++i){D x=3Y(s,i);C(x<0){C(s.2Q(i)=="-"&&o.1G()==0)27=1E;6i}w=b*w+x;C(++j>=2P){o.3L(d);o.2f(w,0);j=0;w=0}}C(j>0){o.3L(1e.2E(b,j));o.2f(w,0)}C(27)G.1v.Y(o,o)}E 5S(a,b,c){C("6h"==3g b){C(a<2)o.2h(1);J{o.3M(a,c);C(!o.5l(a-1))o.1X(G.1u.3h(a-1),3j,o);C(o.1l())o.2f(1,0);L(!o.54(b)){o.2f(2,0);C(o.3Q()>a)o.Y(G.1u.3h(a-1),o)}}}J{D x=V 1w(),t=a&7;x.T=(a>>3)+1;b.6g(x);C(t>0)x[0]&=((1<<t)-1);J x[0]=0;o.3l(x,1T)}}E 5z(){D i=o.t,r=V 1w();r[0]=o.s;D p=o.O-(i*o.O)%8,d,k=0;C(i-->0){C(p<o.O&&(d=o[i]>>p)!=(o.s&o.1h)>>p)r[k++]=d|(o.s<<(o.O-p));L(i>=0){C(p<8){d=(o[i]&((1<<p)-1))<<(8-p);d|=o[--i]>>(p+=o.O-8)}J{d=(o[i]>>(p-=8))&2N;C(p<=0){p+=o.O;--i}}C((d&2O)!=0)d|=-1T;C(k==0&&(o.s&2O)!=(d&2O))++k;C(k>0||d!=o.s)r[k++]=d}}F r}E 5y(a){F(o.1d(a)==0)}E 5x(a){F(o.1d(a)<0)?o:a}E 5w(a){F(o.1d(a)>0)?o:a}E 5R(a,20,r){D i,f,m=1e.1O(a.t,o.t);P(i=0;i<m;++i)r[i]=20(o[i],a[i]);C(a.t<o.t){f=a.s&o.1h;P(i=m;i<o.t;++i)r[i]=20(o[i],f);r.t=o.t}J{f=o.s&o.1h;P(i=m;i<a.t;++i)r[i]=20(f,a[i]);r.t=a.t}r.s=20(o.s,a.s);r.1n()}E 6f(x,y){F x&y}E 5v(a){D r=Q();o.1X(a,6f,r);F r}E 3j(x,y){F x|y}E 5u(a){D r=Q();o.1X(a,3j,r);F r}E 3V(x,y){F x^y}E 5t(a){D r=Q();o.1X(a,3V,r);F r}E 3W(x,y){F x&~y}E 5s(a){D r=Q();o.1X(a,3W,r);F r}E 5r(){D r=Q();P(D i=0;i<o.t;++i)r[i]=o.1h&~o[i];r.t=o.t;r.s=~o.s;F r}E 5q(n){D r=Q();C(n<0)o.1i(-n,r);J o.2i(n,r);F r}E 5o(n){D r=Q();C(n<0)o.2i(-n,r);J o.1i(n,r);F r}E 6e(x){C(x==0)F-1;D r=0;C((x&3k)==0){x>>=16;r+=16}C((x&2N)==0){x>>=8;r+=8}C((x&3X)==0){x>>=4;r+=4}C((x&3)==0){x>>=2;r+=2}C((x&1)==0)++r;F r}E 5n(){P(D i=0;i<o.t;++i)C(o[i]!=0)F i*o.O+6e(o[i]);C(o.s<0)F o.t*o.O;F-1}E 6d(x){D r=0;L(x!=0){x&=x-1;++r}F r}E 5m(){D r=0,x=o.s&o.1h;P(D i=0;i<o.t;++i)r+=6d(o[i]^x);F r}E 5k(n){D j=1e.21(n/o.O);C(j>=o.t)F(o.s!=0);F((o[j]&(1<<(n%o.O)))!=0)}E 5Q(n,20){D r=G.1u.3h(n);o.1X(r,20,r);F r}E 5j(n){F o.3i(n,3j)}E 5i(n){F o.3i(n,3W)}E 5h(n){F o.3i(n,3V)}E 5P(a,r){D i=0,c=0,m=1e.1O(a.t,o.t);L(i<m){c+=o[i]+a[i];r[i++]=c&o.1h;c>>=o.O}C(a.t<o.t){c+=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c+=a[i];r[i++]=c&o.1h;c>>=o.O}c+=a.s}r.s=(c<0)?-1:0;C(c>0)r[i++]=c;J C(c<-1)r[i++]=o.1m+c;r.t=i;r.1n()}E 5g(a){D r=Q();o.2G(a,r);F r}E 5f(a){D r=Q();o.Y(a,r);F r}E 5e(a){D r=Q();o.2l(a,r);F r}E 5c(a){D r=Q();o.1K(a,r,Z);F r}E 5b(a){D r=Q();o.1K(a,Z,r);F r}E 5a(a){D q=Q(),r=Q();o.1K(a,q,r);F V 1w(q,r)}E 5O(n){o[o.t]=o.am(0,n-1,o,0,0,o.t);++o.t;o.1n()}E 5N(n,w){L(o.t<=w)o[o.t++]=0;o[w]+=n;L(o[w]>=o.1m){o[w]-=o.1m;C(++w>=o.t)o[o.t++]=0;++o[w]}}E 2n(){}E 3U(x){F x}E 6c(x,y,r){x.2l(y,r)}E 6b(x,r){x.2L(r)}2n.H.2k=3U;2n.H.2j=3U;2n.H.1Y=6c;2n.H.1z=6b;E 56(e){F o.3T(e,V 2n())}E 5L(a,n,r){D i=1e.1O(o.t+a.t,n);r.s=0;r.t=i;L(i>0)r[--i]=0;D j;P(j=r.t-o.t;i<j;++i)r[i+o.t]=o.am(0,a[i],r,i,0,o.t);P(j=1e.1O(a.t,n);i<j;++i)o.am(0,a[i],r,i,0,n-i);r.1n()}E 5J(a,n,r){--n;D i=r.t=o.t+a.t-n;r.s=0;L(--i>=0)r[i]=0;P(i=1e.3J(n-o.t,0);i<a.t;++i)r[o.t+i-n]=o.am(n-i,a[i],r,0,0,o.t+i-n);r.1n();r.2M(1,r)}E 1Z(m){o.1b=Q();o.3R=Q();G.1u.2m(2*m.t,o.1b);o.6a=o.1b.5d(m);o.m=m}E 69(x){C(x.s<0||x.t>2*o.m.t)F x.3S(o.m);J C(x.1d(o.m)<0)F x;J{D r=Q();x.1J(r);o.1x(r);F r}}E 68(x){F x}E 66(x){x.2M(o.m.t-1,o.1b);C(x.t>o.m.t+1){x.t=o.m.t+1;x.1n()}o.6a.5K(o.1b,o.m.t+1,o.3R);o.m.5M(o.3R,o.m.t+1,o.1b);L(x.1d(o.1b)<0)x.2f(1,o.m.t+1);x.Y(o.1b,x);L(x.1d(o.m)>=0)x.Y(o.m,x)}E 62(x,r){x.2L(r);o.1x(r)}E 65(x,y,r){x.2l(y,r);o.1x(r)}1Z.H.2k=69;1Z.H.2j=68;1Z.H.1x=66;1Z.H.1Y=65;1Z.H.1z=62;E 58(e,m){D i=e.3Q(),k,r=1I(1),z;C(i<=0)F r;J C(i<18)k=1;J C(i<48)k=3;J C(i<9K)k=4;J C(i<9J)k=5;J k=6;C(i<8)z=V 1S(m);J C(m.1l())z=V 1Z(m);J z=V 1R(m);D g=V 1w(),n=3,2I=k-1,2J=(1<<k)-1;g[1]=z.2k(o);C(k>1){D 3P=Q();z.1z(g[1],3P);L(n<=2J){g[n]=Q();z.1Y(3P,g[n-2],g[n]);n+=2}}D j=e.t-1,w,3O=1E,1b=Q(),t;i=2K(e[j])-1;L(j>=0){C(i>=2I)w=(e[j]>>(i-2I))&2J;J{w=(e[j]&((1<<(i+1))-1))<<(2I-i);C(j>0)w|=e[j-1]>>(o.O+i-2I)}n=k;L((w&1)==0){w>>=1;--n}C((i-=n)<0){i+=o.O;--j}C(3O){g[w].1J(r);3O=1o}J{L(n>1){z.1z(r,1b);z.1z(1b,r);n-=2}C(n>0)z.1z(r,1b);J{t=r;r=1b;1b=t}z.1Y(1b,g[w],r)}L(j>=0&&(e[j]&(1<<i))==0){z.1z(r,1b);t=r;r=1b;1b=t;C(--i<0){i=o.O-1;--j}}}F z.2j(r)}E 55(a){D x=(o.s<0)?o.2H():o.2F();D y=(a.s<0)?a.2H():a.2F();C(x.1d(y)<0){D t=x;x=y;y=t}D i=x.2e(),g=y.2e();C(g<0)F x;C(i<g)g=i;C(g>0){x.1i(g,x);y.1i(g,y)}L(x.1G()>0){C((i=x.2e())>0)x.1i(i,x);C((i=y.2e())>0)y.1i(i,y);C(x.1d(y)>=0){x.Y(y,x);x.1i(1,x)}J{y.Y(x,y);y.1i(1,y)}}C(g>0)y.2i(g,y);F y}E 5H(n){C(n<=0)F 0;D d=o.1m%n,r=(o.s<0)?n-1:0;C(o.t>0)C(d==0)r=o[0]%n;J P(D i=o.t-1;i>=0;--i)r=(d*r+o[i])%n;F r}E 57(m){D ac=m.1l();C((o.1l()&&ac)||m.1G()==0)F G.1v;D u=m.2F(),v=o.2F();D a=1I(1),b=1I(0),c=1I(0),d=1I(1);L(u.1G()!=0){L(u.1l()){u.1i(1,u);C(ac){C(!a.1l()||!b.1l()){a.2G(o,a);b.Y(m,b)}a.1i(1,a)}J C(!b.1l())b.Y(m,b);b.1i(1,b)}L(v.1l()){v.1i(1,v);C(ac){C(!c.1l()||!d.1l()){c.2G(o,c);d.Y(m,d)}c.1i(1,c)}J C(!d.1l())d.Y(m,d);d.1i(1,d)}C(u.1d(v)>=0){u.Y(v,u);C(ac)a.Y(c,a);b.Y(d,b)}J{v.Y(u,v);C(ac)c.Y(a,c);d.Y(b,d)}}C(v.1d(G.1u)!=0)F G.1v;C(d.1d(m)>=0)F d.3e(m);C(d.1G()<0)d.2G(m,d);J F d;C(d.1G()<0)F d.3z(m);J F d}D 1k=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,9I,9H,9G,9F,9E,60,9D,9C,9B,9A,9z,9y,9x,9w,9v,9u,9t,9s,9r,9q,9p,9o,9n,9m,9l,9k,9j,9i,9h,9g,9f,9e,9d,9c,9b,9a,99,98,96,95,94,93,92,91,90,8Z,8Y,8X,8W,8V,8U,8T,8S,8R,8Q,8P,8O,8N,8M,8L,8K,8J,8I,8H,8G,8F,8E,8D,8C,8B,8A,8z];D 5Z=(1<<26)/1k[1k.T-1];E 51(t){D i,x=o.1H();C(x.t==1&&x[0]<=1k[1k.T-1]){P(i=0;i<1k.T;++i)C(x[0]==1k[i])F 1E;F 1o}C(x.1l())F 1o;i=1;L(i<1k.T){D m=1k[i],j=i+1;L(j<1k.T&&m<5Z)m*=1k[j++];m=x.5I(m);L(i<j)C(m%1k[i++]==0)F 1o}F x.5G(t)}E 5F(t){D 2g=o.3e(G.1u);D k=2g.2e();C(k<=0)F 1o;D r=2g.5p(k);t=(t+1)>>1;C(t>1k.T)t=1k.T;D a=Q();P(D i=0;i<t;++i){a.2h(1k[i]);D y=a.2B(r,o);C(y.1d(G.1u)!=0&&y.1d(2g)!=0){D j=1;L(j++<k&&y.1d(2g)!=0){y=y.5Y(2,o);C(y.1d(G.1u)==0)F 1o}C(y.1d(2g)!=0)F 1o}}F 1E}G.H.3N=5X;G.H.5W=5V;G.H.5U=5T;G.H.3M=5S;G.H.1X=5R;G.H.3i=5Q;G.H.2G=5P;G.H.3L=5O;G.H.2f=5N;G.H.5M=5L;G.H.5K=5J;G.H.5I=5H;G.H.5G=5F;G.H.2F=5E;G.H.3K=5D;G.H.8y=5C;G.H.8x=5B;G.H.1G=5A;G.H.8w=5z;G.H.8v=5y;G.H.1O=5x;G.H.3J=5w;G.H.8u=5v;G.H.8t=5u;G.H.8s=5t;G.H.8r=5s;G.H.2w=5r;G.H.3h=5q;G.H.5p=5o;G.H.2e=5n;G.H.8q=5m;G.H.5l=5k;G.H.8p=5j;G.H.8o=5i;G.H.8n=5h;G.H.3z=5g;G.H.3e=5f;G.H.3y=5e;G.H.5d=5c;G.H.8m=5b;G.H.8l=5a;G.H.2B=58;G.H.8k=57;G.H.2E=56;G.H.8j=55;G.H.54=51;E 4l(4W,4V,4X,4Y){D 50="8i";D N=V G(50,16);D g=V G("2");D k=V G("8h",16);D 4Z=V 3I();D a=V G(32,4Z);D A=g.2B(a,N);D 3B=A.1y(16);D B=Z;D 3A=Z;D u=Z;D x=Z;D S=Z;D K=Z;D M=Z;D 38=Z;D 4F=Z;D 2D=4Y;D 4S=4X;D 1c=o;D 2W=1o;D 8g=1o;D I=4W;D p=4V;D U=Z;o.8f=E(){F I};o.8e=E(){F U};o.4B=E(){F 2D};o.8d=E(){F g};o.8c=E(){F N};o.8b=E(s){F 1c.4U(s,p)};o.4U=E(s,4T){F V G(1D(s+1D(I+":"+4T)),16)};E 1V(1Q){C(4S=="8a"){F 1Q}};o.1V=1V;o.3d=E(4N,1F,4O){C(1W.4R)U=V 4R();J C(1W.4Q){88{U=V 4Q("4P.87")}86(e){}}J{1c.1N("4L 2w 85.");F}C(U){U.84=4O;U.82("81",4N,1E);U.3H("4M-4q","80/x-7Z-7Y-7X");U.3H("4M-T",1F.T);U.3H("7W","7V");U.7U(1F)}J{1c.1N("4L 7T.")}};o.2A=E(4K){F 4K.7S.7R};E 2y(4J){F(3g(1W[4J])!="7Q")};o.3D=E(){D 4I=2D+1V("7P/");D 1F="I="+I+"&A="+3B;1c.3d(4I,1F,4H)};E 4H(){C(U.3b==4&&U.3a==39){C(U.1t.1j("r").T>0){D 1P=U.1t.1j("r")[0];C(!1P.1M("a")){3C(1P.1M("s"),1P.1M("B"),p);3x(M,4u,2D+1V("4E/"))}J{3f(1P.1M("s"),1P.1M("B"),1P.1M("a"),1P.1M("d"))}}J C(U.1t.1j("2z").T>0){1c.3D()}}};E 3f(s,2C,3G,4G){4o();E 3E(){C(!2y("2Y")||!2y("34")){1W.4D(3E,10);F}C(3G=="7O")3F=2Y;J C(3G=="7N")3F=34;3C(s,2C,3F(4G+p));4F=s;3x(M,4C,2D+1V("3f/4E/"))};1W.4D(3E,10)};E 4C(){C(U.3b==4&&U.3a==39){C(U.1t.1j("M").T>0){C(1c.2A(U.1t.1j("M")[0])==38){D 1F="p="+p;D 3c=1c.4B()+1c.1V("3f/7M/");1c.3d(3c,1F,4A)}J 1c.1N("4t 2d 4s 2w 4r")}J C(U.1t.1j("2z").T>0){1c.1N(1c.2A(U.1t.1j("2z")[0]))}}};E 4A(){C(U.3b==4&&U.3a==39){C(U.1t.1j("7L").T>0)1c.3D()}};E 3C(s,2C,4z){B=V G(2C,16);3A=2C;u=V G(1D(3B+3A),16);x=V G(1D(s+1D(I+":"+4z)),16);D 4y=k.3y(g.2B(x,N));D 4x=a.3z(u.3y(x));S=B.3e(4y).2B(4x,N);D 4w=A.1y(16)+B.1y(16)+S.1y(16);M=1D(4w);38=1D(A.1y(16)+M+S.1y(16));};E 3x(M,4v,3c){D 1F="M="+M;1c.3d(3c,1F,4v)};E 4u(){C(U.3b==4&&U.3a==39){C(U.1t.1j("M").T>0){C(1c.2A(U.1t.1j("M")[0])==38){1c.4n();2W=1E}J 1c.1N("4t 2d 4s 2w 4r")}J C(U.1t.1j("2z").T>0){1c.1N(1c.2A(U.1t.1j("2z")[0]))}}};E 33(4p){D 35=2V.7K(\'3w\');35.4q=\'7J/7I\';35.4j=4p;2V.1j(\'7H\')[0].7G(35)};E 4o(){C(2y("2Y")&&2y("34"))F;D 2x=1c.4k.7F("/");D 2Z=2x.7E(0,2x.T-1).7D("/");C(2x[2x.T-1]=="7C.1O.2X")33(2Z+"/7B.1O.2X");J{33(2Z+"/34.2X");33(2Z+"/2Y.2X")}}o.2d=E(){C(K==Z)C(2W){K=1D(S);F K}J 1c.1N("7A 7z 2w 7y 2W.");J F K};o.4n=E(){4m("7x 7w.")};o.1N=E(t){4m(t)}};4l.H.4k=2V.1j(\'3w\')[2V.1j(\'3w\').T-1].1M("4j");',62,703,'||||||||||||||||||||||||this||||||||||||||if|var|function|return|BigInteger|prototype||else||while|||DB|for|nbi|||length|xhr|new|||subTo|null|||||||||||HASH|r2|that|compareTo|Math|safe_add|rng_pptr|DM|rShiftTo|getElementsByTagName|lowprimes|isEven|DV|clamp|false|ds|sh|vv|rng_pool|responseXML|ONE|ZERO|Array|reduce|toString|sqrTo|ys|bs|255|SHA256|true|params|signum|abs|nbv|copyTo|divRemTo|dbits|getAttribute|error_message|min|response|str|Montgomery|Classic|256|utftext|paths|window|bitwiseTo|mulTo|Barrett|op|floor||||||mi|||pm|charCodeAt|rr|key|getLowestSetBit|dAddOffset|n1|fromInt|lShiftTo|revert|convert|multiplyTo|dlShiftTo|NullExp|nsh|cbs|xh|xl|string|chrsz|fromCharCode|String|not|arr|isdefined|error|innerxml|modPow|ephemeral|url|pow|clone|addTo|negate|k1|km|nbits|squareTo|drShiftTo|0xff|0x80|cs|charAt|0x7fff|bm|BI_RC|rng_state|document|authenticated|js|SHA1|path||||import_file|MD5|scriptElt|||M2|200|status|readyState|auth_url|ajaxRequest|subtract|upgrade|typeof|shiftLeft|changeBit|op_or|0xffff|fromString|qd|y0|pt|BI_FP|navigator|rng_psize|Arcfour|binarray|128|T1|script|send_hash|multiply|add|Bstr|Astr|calculations|identify|do_upgrade|hashfun|algo|setRequestHeader|SecureRandom|max|intValue|dMultiply|fromNumber|chunkSize|is1|g2|bitLength|q3|mod|exp|nNop|op_xor|op_andnot|0xf|intAt|mpl|mp||ts||F2|yt|F1|||int2char|appName|j_lm|0x3fff|rng_seed_time|hex_tab|bin|T2|0xFFFF|lsw|src|srpPath|SRP|alert|success|import_hashes|fname|type|match|does|Server|confirm_authentication|confirm_fun|Mstr|aux|kgx|pass|confirm_verifier|geturl|confirm_upgrade|setTimeout|authenticate|salt|dsalt|receive_salts|handshake_url|variable|node|Ajax|Content|full_url|callback|Microsoft|ActiveXObject|XMLHttpRequest|server|ph|calcXp|password|username|ser|base_url|rng|Nstr|bnIsProbablePrime|||isProbablePrime|bnGCD|bnPow|bnModInverse|bnModPow||bnDivideAndRemainder|bnRemainder|bnDivide|divide|bnMultiply|bnSubtract|bnAdd|bnFlipBit|bnClearBit|bnSetBit|bnTestBit|testBit|bnBitCount|bnGetLowestSetBit|bnShiftRight|shiftRight|bnShiftLeft|bnNot|bnAndNot|bnXor|bnOr|bnAnd|bnMax|bnMin|bnEquals|bnToByteArray|bnSigNum|bnShortValue|bnByteValue|bnIntValue|bnClone|bnpMillerRabin|millerRabin|bnpModInt|modInt|bnpMultiplyUpperTo|multiplyUpperTo|bnpMultiplyLowerTo|multiplyLowerTo|bnpDAddOffset|bnpDMultiply|bnpAddTo|bnpChangeBit|bnpBitwiseTo|bnpFromNumber|bnpFromRadix|fromRadix|bnpToRadix|toRadix|bnpChunkSize|modPowInt|lplim|127||barrettSqrTo|||barrettMulTo|barrettReduce||barrettRevert|barrettConvert|mu|nSqrTo|nMulTo|cbit|lbit|op_and|nextBytes|number|continue|bnModPowInt|bnMod|bnBitLength|bnCompareTo|bnAbs|bnNegate|bnToString|bnpExp|bnpIsEven|bnpInvDigit|invDigit|bnpDivRemTo|bnpSquareTo|bnpMultiplyTo|bnpSubTo|bnpRShiftTo|bnpLShiftTo|bnpDRShiftTo|bnpDLShiftTo|bnpClamp|bnpFromString|bnpFromInt|bnpCopyTo|montSqrTo|montMulTo|montReduce|montRevert|montConvert|u0|um|mph|mt2|cSqrTo|cMulTo|cReduce|cRevert|cConvert|ms|d2|d1|FV|BI_RM|am3|am1||Netscape||am2|0x3fffffff|canary|rng_get_bytes|rng_get_byte||next|init|prng_newstate|random|crypto|rng_seed_int|ARC4next|ARC4init|str2binb|core_sha256|binb2hex|Utf8Encode|0xF|hexcase|mask|Maj|Sigma0256|Ch|Sigma1256|Gamma0256|Gamma1256|msw|successful|Authentication|been|has|User|hash|srp|join|slice|split|appendChild|head|javascript|text|createElement|ok|verifier|md5|sha1|handshake|undefined|nodeValue|firstChild|failed|send|close|Connection|urlencoded|form|www|application|POST|open||onreadystatechange|supported|catch|XMLHTTP|try||django|calcX|getN|getg|getxhr|getI|hash_import|c46d46600d87fef149bd79b81119842f3c20241fda67d06ef412d8f6d9479c58|115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3|gcd|modInverse|divideAndRemainder|remainder|flipBit|clearBit|setBit|bitCount|andNot|xor|or|and|equals|toByteArray|shortValue|byteValue|509|503|499|491|487|479|467|463|461|457|449|443|439|433|431|421|419|409|401|397|389|383|379|373|367|359|353|349|347|337|331|317|313|311||307|293|283|281|277|271|269|263|257|251|241|239|233|229|227|223|211|199|197|193|191|181|179|173|167|163|157|151|149|139|137|131|113|109|107|103|101|768|144|substr|log|LN2|0xffffffff|0123456789abcdefghijklmnopqrstuvwxyz|Explorer|Internet|0xfffffff|0x3ffffff|0x4000000|0xefcafe|0xffffff|0xdeadbeefcafe|65536|appVersion|getTime|Date|0123456789abcdef|0123456789ABCDEF|224|192|2048|replace|0x5BE0CD19|0x1F83D9AB|0x9B05688C|0x510E527F||0xA54FF53A|0x3C6EF372|0xBB67AE85|0x6A09E667|0xC67178F2|0xBEF9A3F7|0xA4506CEB|0x90BEFFFA|0x8CC70208||0x84C87814|0x78A5636F|0x748F82EE|0x682E6FF3|0x5B9CCA4F|0x4ED8AA4A|0x391C0CB3|0x34B0BCB5|0x2748774C|0x1E376C08|0x19A4C116|0x106AA070|0xF40E3585|0xD6990624|0xD192E819|0xC76C51A3|0xC24B8B70|0xA81A664B|0xA2BFE8A1|0x92722C85|0x81C2C92E|0x766A0ABB|0x650A7354|0x53380D13|0x4D2C6DFC|0x2E1B2138|0x27B70A85|0x14292967|0x6CA6351|0xD5A79147|0xC6E00BF3|0xBF597FC7|0xB00327C8|0xA831C66D|0x983E5152|0x76F988DA|0x5CB0A9DC|0x4A7484AA|0x2DE92C6F|0x240CA1CC|0xFC19DC6|0xEFBE4786|0xE49B69C1|0xC19BF174|0x9BDC06A7|0x80DEB1FE|0x72BE5D74|0x550C7DC3|0x243185BE||0x12835B01|0xD807AA98|0xAB1C5ED5|0x923F82A4|0x59F111F1|0x3956C25B|0xE9B5DBA5|0xB5C0FBCF|0x71374491|0x428A2F98'.split('|'),0,{}))
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('E 1E(s){D 2v=8;D 7h=0;E 1f(x,y){D 4h=(x&4g)+(y&4g);D 7p=(x>>16)+(y>>16)+(4h>>16);F(7p<<16)|(4h&4g)}E S(X,n){F(X>>>n)|(X<<(32-n))}E R(X,n){F(X>>>n)}E 7l(x,y,z){F((x&y)^((~x)&z))}E 7j(x,y,z){F((x&y)^(x&z)^(y&z))}E 7k(x){F(S(x,2)^S(x,13)^S(x,22))}E 7m(x){F(S(x,6)^S(x,11)^S(x,25))}E 7n(x){F(S(x,7)^S(x,18)^R(x,3))}E 7o(x){F(S(x,17)^S(x,19)^R(x,10))}E 7d(m,l){D K=V 1w(bi,bh,bg,bf,bd,bc,bb,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0,aZ,aY,aX,aW,aV,aU,aT,aS,aR,aQ,aP,aO,aN,aM,aL,aK,aJ,aI,aH,aG,aF,aE,aD,aC,aB,aA,az,ay,ax,aw,av,au,at,as,ar,aq,ap,ao,an,al,ak,aj,ai,ah,ag,af,ae);D Z=V 1w(ad,ab,aa,a9,a8,a7,a6,a5);D W=V 1w(64);D a,b,c,d,e,f,g,h,i,j;D 3w,4f;m[l>>5]|=2P<<(24-l%32);m[((l+64>>9)<<4)+15]=l;P(D i=0;i<m.U;i+=16){a=Z[0];b=Z[1];c=Z[2];d=Z[3];e=Z[4];f=Z[5];g=Z[6];h=Z[7];P(D j=0;j<64;j++){C(j<16)W[j]=m[j+i];J W[j]=1f(1f(1f(7o(W[j-2]),W[j-7]),7n(W[j-15])),W[j-16]);3w=1f(1f(1f(1f(h,7m(e)),7l(e,f,g)),K[j]),W[j]);4f=1f(7k(a),7j(a,b,c));h=g;g=f;f=e;e=1f(d,3w);d=c;c=b;b=a;a=1f(3w,4f)}Z[0]=1f(a,Z[0]);Z[1]=1f(b,Z[1]);Z[2]=1f(c,Z[2]);Z[3]=1f(d,Z[3]);Z[4]=1f(e,Z[4]);Z[5]=1f(f,Z[5]);Z[6]=1f(g,Z[6]);Z[7]=1f(h,Z[7])}F Z}E 7c(1P){D 4e=1w();D 7i=(1<<2v)-1;P(D i=0;i<1P.U*2v;i+=2v){4e[i>>5]|=(1P.27(i/2v)&7i)<<(24-i%32)}F 4e}E 7f(2u){2u=2u.a4(/\\r\\n/g,"\\n");D 1T="";P(D n=0;n<2u.U;n++){D c=2u.27(n);C(c<3v){1T+=2x.2w(c)}J C((c>5U)&&(c<a3)){1T+=2x.2w((c>>6)|a2);1T+=2x.2w((c&63)|3v)}J{1T+=2x.2w((c>>12)|a1);1T+=2x.2w(((c>>6)&63)|3v);1T+=2x.2w((c&63)|3v)}}F 1T}E 7e(3u){D 4d=7h?"a0":"9Z";D 1P="";P(D i=0;i<3u.U*4;i++){1P+=4d.2R((3u[i>>2]>>((3-i%4)*8+4))&7g)+4d.2R((3u[i>>2]>>((3-i%4)*8))&7g)}F 1P}s=7f(s);F 7e(7d(7c(s),s.U*2v))}E 3t(){o.i=0;o.j=0;o.S=V 1w()}E 7b(2c){D i,j,t;P(i=0;i<1S;++i)o.S[i]=i;j=0;P(i=0;i<1S;++i){j=(j+o.S[i]+2c[i%2c.U])&1D;t=o.S[i];o.S[i]=o.S[j];o.S[j]=t}o.i=0;o.j=0}E 7a(){D t;o.i=(o.i+1)&1D;o.j=(o.j+o.S[o.i])&1D;t=o.S[o.i];o.S[o.i]=o.S[o.j];o.S[o.j]=t;F o.S[(t+o.S[o.i])&1D]}3t.H.74=7b;3t.H.72=7a;E 75(){F V 3t()}D 3s=1S;D 2V;D 1s;D 1g;E 78(x){1s[1g++]^=x&1D;1s[1g++]^=(x>>8)&1D;1s[1g++]^=(x>>16)&1D;1s[1g++]^=(x>>24)&1D;C(1g>=3s)1g-=3s}E 4c(){78(V 9Y().9X())}C(1s==1b){1s=V 1w();1g=0;D t;C(3r.49=="6V"&&3r.9W<"5"&&1U.77){D z=1U.77.76(32);P(t=0;t<z.U;++t)1s[1g++]=z.27(t)&1D}L(1g<3s){t=1e.1Z(9V*1e.76());1s[1g++]=t>>>8;1s[1g++]=t&1D}1g=0;4c();}E 70(){C(2V==1b){4c();2V=75();2V.74(1s);P(1g=0;1g<1s.U;++1g)1s[1g]=0;1g=0;}F 2V.72()}E 6Z(ba){D i;P(i=0;i<ba.U;++i)ba[i]=70()}E 3I(){}3I.H.6a=6Z;D 1L;D 6Y=9U;D 4a=((6Y&9T)==9S);E G(a,b,c){C(a!=1b)C("6b"==3g a)o.3M(a,b,c);J C(b==1b&&"2u"!=3g a)o.3m(a,1S);J o.3m(a,b)}E Q(){F V G(1b)}E 6U(i,x,w,j,c,n){L(--n>=0){D v=x*o[i++]+w[j]+c;c=1e.1Z(v/9R);w[j++]=v&9Q}F c}E 6W(i,x,w,j,c,n){D 2t=x&2S,2s=x>>15;L(--n>=0){D l=o[i]&2S;D h=o[i++]>>15;D m=2s*l+h*2t;l=2t*l+((m&2S)<<15)+w[j]+(c&6X);c=(l>>>30)+(m>>>15)+2s*h+(c>>>30);w[j++]=l&6X}F c}E 6T(i,x,w,j,c,n){D 2t=x&4b,2s=x>>14;L(--n>=0){D l=o[i]&4b;D h=o[i++]>>14;D m=2s*l+h*2t;l=2t*l+((m&4b)<<14)+w[j]+c;c=(l>>28)+(m>>14)+2s*h;w[j++]=l&9P}F c}C(4a&&(3r.49=="4K 9O 9N")){G.H.am=6W;1L=30}J C(4a&&(3r.49!="6V")){G.H.am=6U;1L=26}J{G.H.am=6T;1L=28}G.H.O=1L;G.H.1h=((1<<1L)-1);G.H.1m=(1<<1L);D 3q=52;G.H.6R=1e.2F(2,3q);G.H.45=3q-1L;G.H.42=2*1L-3q;D 6S="9M";D 2U=V 1w();D 2a,1r;2a="0".27(0);P(1r=0;1r<=9;++1r)2U[2a++]=1r;2a="a".27(0);P(1r=10;1r<36;++1r)2U[2a++]=1r;2a="A".27(0);P(1r=10;1r<36;++1r)2U[2a++]=1r;E 46(n){F 6S.2R(n)}E 3X(s,i){D c=2U[s.27(i)];F(c==1b)?-1:c}E 6z(r){P(D i=o.t-1;i>=0;--i)r[i]=o[i];r.t=o.t;r.s=o.s}E 6y(x){o.t=1;o.s=(x<0)?-1:0;C(x>0)o[0]=x;J C(x<-1)o[0]=x+1m;J o.t=0}E 1I(i){D r=Q();r.2j(i);F r}E 6x(s,b){D k;C(b==16)k=4;J C(b==8)k=3;J C(b==1S)k=8;J C(b==2)k=1;J C(b==32)k=5;J C(b==4)k=2;J{o.5O(s,b);F}o.t=0;o.s=0;D i=s.U,20=1t,1q=0;L(--i>=0){D x=(k==8)?s[i]&2O:3X(s,i);C(x<0){C(s.2R(i)=="-")20=1F;6c}20=1t;C(1q==0)o[o.t++]=x;J C(1q+k>o.O){o[o.t-1]|=(x&((1<<(o.O-1q))-1))<<1q;o[o.t++]=(x>>(o.O-1q))}J o[o.t-1]|=x<<1q;1q+=k;C(1q>=o.O)1q-=o.O}C(k==8&&(s[0]&2P)!=0){o.s=-1;C(1q>0)o[o.t-1]|=((1<<(o.O-1q))-1)<<1q}o.1n();C(20)G.1v.Y(o,o)}E 6w(){D c=o.s&o.1h;L(o.t>0&&o[o.t-1]==c)--o.t}E 6j(b){C(o.s<0)F"-"+o.2I().1z(b);D k;C(b==16)k=4;J C(b==8)k=3;J C(b==2)k=1;J C(b==32)k=5;J C(b==4)k=2;J F o.5Q(b);D 2K=(1<<k)-1,d,m=1t,r="",i=o.t;D p=o.O-(i*o.O)%k;C(i-->0){C(p<o.O&&(d=o[i]>>p)>0){m=1F;r=46(d)}L(i>=0){C(p<k){d=(o[i]&((1<<p)-1))<<(k-p);d|=o[--i]>>(p+=o.O-k)}J{d=(o[i]>>(p-=k))&2K;C(p<=0){p+=o.O;--i}}C(d>0)m=1F;C(m)r+=46(d)}}F m?r:"0"}E 6i(){D r=Q();G.1v.Y(o,r);F r}E 6h(){F(o.s<0)?o.2I():o}E 6g(a){D r=o.s-a.s;C(r!=0)F r;D i=o.t;r=i-a.t;C(r!=0)F r;L(--i>=0)C((r=o[i]-a[i])!=0)F r;F 0}E 2L(x){D r=1,t;C((t=x>>>16)!=0){x=t;r+=16}C((t=x>>8)!=0){x=t;r+=8}C((t=x>>4)!=0){x=t;r+=4}C((t=x>>2)!=0){x=t;r+=2}C((t=x>>1)!=0){x=t;r+=1}F r}E 6f(){C(o.t<=0)F 0;F o.O*(o.t-1)+2L(o[o.t-1]^(o.s&o.1h))}E 6v(n,r){D i;P(i=o.t-1;i>=0;--i)r[i+n]=o[i];P(i=n-1;i>=0;--i)r[i]=0;r.t=o.t+n;r.s=o.s}E 6u(n,r){P(D i=n;i<o.t;++i)r[i-n]=o[i];r.t=1e.3J(o.t-n,0);r.s=o.s}E 6t(n,r){D 1C=n%o.O;D 2r=o.O-1C;D 2T=(1<<2r)-1;D 1p=1e.1Z(n/o.O),c=(o.s<<1C)&o.1h,i;P(i=o.t-1;i>=0;--i){r[i+1p+1]=(o[i]>>2r)|c;c=(o[i]&2T)<<1C}P(i=1p-1;i>=0;--i)r[i]=0;r[1p]=c;r.t=o.t+1p+1;r.s=o.s;r.1n()}E 6s(n,r){r.s=o.s;D 1p=1e.1Z(n/o.O);C(1p>=o.t){r.t=0;F}D 1C=n%o.O;D 2r=o.O-1C;D 2T=(1<<1C)-1;r[0]=o[1p]>>1C;P(D i=1p+1;i<o.t;++i){r[i-1p-1]|=(o[i]&2T)<<2r;r[i-1p]=o[i]>>1C}C(1C>0)r[o.t-1p-1]|=(o.s&2T)<<2r;r.t=o.t-1p;r.1n()}E 6r(a,r){D i=0,c=0,m=1e.1N(a.t,o.t);L(i<m){c+=o[i]-a[i];r[i++]=c&o.1h;c>>=o.O}C(a.t<o.t){c-=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c-=a[i];r[i++]=c&o.1h;c>>=o.O}c-=a.s}r.s=(c<0)?-1:0;C(c<-1)r[i++]=o.1m+c;J C(c>0)r[i++]=c;r.t=i;r.1n()}E 6q(a,r){D x=o.1H(),y=a.1H();D i=x.t;r.t=i+y.t;L(--i>=0)r[i]=0;P(i=0;i<y.t;++i)r[i+x.t]=x.am(0,y[i],r,i,0,x.t);r.s=0;r.1n();C(o.s!=a.s)G.1v.Y(r,r)}E 6p(r){D x=o.1H();D i=r.t=2*x.t;L(--i>=0)r[i]=0;P(i=0;i<x.t-1;++i){D c=x.am(i,x[i],r,2*i,0,1);C((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x.1m){r[i+x.t]-=x.1m;r[i+x.t+1]=1}}C(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=0;r.1n()}E 6o(m,q,r){D 21=m.1H();C(21.t<=0)F;D 3p=o.1H();C(3p.t<21.t){C(q!=1b)q.2j(0);C(r!=1b)o.1J(r);F}C(r==1b)r=Q();D y=Q(),40=o.s,6O=m.s;D 2q=o.O-2L(21[21.t-1]);C(2q>0){21.2k(2q,y);3p.2k(2q,r)}J{21.1J(y);3p.1J(r)}D 1B=y.t;D 3o=y[1B-1];C(3o==0)F;D 44=3o*(1<<o.45)+((1B>1)?y[1B-2]>>o.42:0);D 6Q=o.6R/44,6P=(1<<o.45)/44,e=1<<o.42;D i=r.t,j=i-1B,t=(q==1b)?Q():q;y.2o(j,t);C(r.1d(t)>=0){r[r.t++]=1;r.Y(t,r)}G.1u.2o(1B,t);t.Y(y,y);L(y.t<1B)y[y.t++]=0;L(--j>=0){D 3n=(r[--i]==3o)?o.1h:1e.1Z(r[i]*6Q+(r[i-1]+e)*6P);C((r[i]+=y.am(0,3n,r,j,0,1B))<3n){y.2o(j,t);r.Y(t,r);L(r[i]<--3n)r.Y(t,r)}}C(q!=1b){r.2N(1B,q);C(40!=6O)G.1v.Y(q,q)}r.t=1B;r.1n();C(2q>0)r.1j(2q,r);C(40<0)G.1v.Y(r,r)}E 6e(a){D r=Q();o.1H().1K(a,1b,r);C(o.s<0&&r.1d(G.1v)>0)a.Y(r,r);F r}E 1R(m){o.m=m}E 6N(x){C(x.s<0||x.1d(o.m)>=0)F x.3h(o.m);J F x}E 6M(x){F x}E 6L(x){x.1K(o.m,1b,x)}E 6K(x,y,r){x.2n(y,r);o.1x(r)}E 6J(x,r){x.2M(r);o.1x(r)}1R.H.2m=6N;1R.H.2l=6M;1R.H.1x=6L;1R.H.1W=6K;1R.H.1A=6J;E 6m(){C(o.t<1)F 0;D x=o[0];C((x&1)==0)F 0;D y=x&3;y=(y*(2-(x&3W)*y))&3W;y=(y*(2-(x&2O)*y))&2O;y=(y*(2-(((x&3l)*y)&3l)))&3l;y=(y*(2-x*y%o.1m))%o.1m;F(y>0)?o.1m-y:-y}E 1Q(m){o.m=m;o.3Z=m.6n();o.3Y=o.3Z&2S;o.6H=o.3Z>>15;o.6G=(1<<(m.O-15))-1;o.6I=2*m.t}E 6E(x){D r=Q();x.1H().2o(o.m.t,r);r.1K(o.m,1b,r);C(x.s<0&&r.1d(G.1v)>0)o.m.Y(r,r);F r}E 6D(x){D r=Q();x.1J(r);o.1x(r);F r}E 6C(x){L(x.t<=o.6I)x[x.t++]=0;P(D i=0;i<o.m.t;++i){D j=x[i]&2S;D 6F=(j*o.3Y+(((j*o.6H+(x[i]>>15)*o.3Y)&o.6G)<<15))&x.1h;j=i+o.m.t;x[j]+=o.m.am(0,6F,x,i,0,o.m.t);L(x[j]>=x.1m){x[j]-=x.1m;x[++j]++}}x.1n();x.2N(o.m.t,x);C(x.1d(o.m)>=0)x.Y(o.m,x)}E 6A(x,r){x.2M(r);o.1x(r)}E 6B(x,y,r){x.2n(y,r);o.1x(r)}1Q.H.2m=6E;1Q.H.2l=6D;1Q.H.1x=6C;1Q.H.1W=6B;1Q.H.1A=6A;E 6l(){F((o.t>0)?(o[0]&1):o.s)==0}E 6k(e,z){C(e>9L||e<1)F G.1u;D r=Q(),1c=Q(),g=z.2m(o),i=2L(e)-1;g.1J(r);L(--i>=0){z.1A(r,1c);C((e&(1<<i))>0)z.1W(1c,g,r);J{D t=r;r=1c;1c=t}}F z.2l(r)}E 6d(e,m){D z;C(e<1S||m.1l())z=V 1R(m);J z=V 1Q(m);F o.3S(e,z)}G.H.1J=6z;G.H.2j=6y;G.H.3m=6x;G.H.1n=6w;G.H.2o=6v;G.H.2N=6u;G.H.2k=6t;G.H.1j=6s;G.H.Y=6r;G.H.2n=6q;G.H.2M=6p;G.H.1K=6o;G.H.6n=6m;G.H.1l=6l;G.H.3S=6k;G.H.1z=6j;G.H.2I=6i;G.H.1H=6h;G.H.1d=6g;G.H.3Q=6f;G.H.3h=6e;G.H.5S=6d;G.1v=1I(0);G.1u=1I(1);E 5y(){D r=Q();o.1J(r);F r}E 5x(){C(o.s<0){C(o.t==1)F o[0]-o.1m;J C(o.t==0)F-1}J C(o.t==1)F o[0];J C(o.t==0)F 0;F((o[1]&((1<<(32-o.O))-1))<<o.O)|o[0]}E 5w(){F(o.t==0)?o.s:(o[0]<<24)>>24}E 5v(){F(o.t==0)?o.s:(o[0]<<16)>>16}E 5R(r){F 1e.1Z(1e.9K*o.O/1e.9J(r))}E 5u(){C(o.s<0)F-1;J C(o.t<=0||(o.t==1&&o[0]<=0))F 0;J F 1}E 5P(b){C(b==1b)b=10;C(o.1G()==0||b<2||b>36)F"0";D 2Q=o.3N(b);D a=1e.2F(b,2Q);D d=1I(a),y=Q(),z=Q(),r="";o.1K(d,y,z);L(y.1G()>0){r=(a+z.3K()).1z(b).9I(1)+r;y.1K(d,y,z)}F z.3K().1z(b)+r}E 5N(s,b){o.2j(0);C(b==1b)b=10;D 2Q=o.3N(b);D d=1e.2F(b,2Q),20=1t,j=0,w=0;P(D i=0;i<s.U;++i){D x=3X(s,i);C(x<0){C(s.2R(i)=="-"&&o.1G()==0)20=1F;6c}w=b*w+x;C(++j>=2Q){o.3L(d);o.2h(w,0);j=0;w=0}}C(j>0){o.3L(1e.2F(b,j));o.2h(w,0)}C(20)G.1v.Y(o,o)}E 5M(a,b,c){C("6b"==3g b){C(a<2)o.2j(1);J{o.3M(a,c);C(!o.5f(a-1))o.1V(G.1u.3i(a-1),3k,o);C(o.1l())o.2h(1,0);L(!o.4W(b)){o.2h(2,0);C(o.3Q()>a)o.Y(G.1u.3i(a-1),o)}}}J{D x=V 1w(),t=a&7;x.U=(a>>3)+1;b.6a(x);C(t>0)x[0]&=((1<<t)-1);J x[0]=0;o.3m(x,1S)}}E 5t(){D i=o.t,r=V 1w();r[0]=o.s;D p=o.O-(i*o.O)%8,d,k=0;C(i-->0){C(p<o.O&&(d=o[i]>>p)!=(o.s&o.1h)>>p)r[k++]=d|(o.s<<(o.O-p));L(i>=0){C(p<8){d=(o[i]&((1<<p)-1))<<(8-p);d|=o[--i]>>(p+=o.O-8)}J{d=(o[i]>>(p-=8))&2O;C(p<=0){p+=o.O;--i}}C((d&2P)!=0)d|=-1S;C(k==0&&(o.s&2P)!=(d&2P))++k;C(k>0||d!=o.s)r[k++]=d}}F r}E 5s(a){F(o.1d(a)==0)}E 5r(a){F(o.1d(a)<0)?o:a}E 5q(a){F(o.1d(a)>0)?o:a}E 5L(a,1Y,r){D i,f,m=1e.1N(a.t,o.t);P(i=0;i<m;++i)r[i]=1Y(o[i],a[i]);C(a.t<o.t){f=a.s&o.1h;P(i=m;i<o.t;++i)r[i]=1Y(o[i],f);r.t=o.t}J{f=o.s&o.1h;P(i=m;i<a.t;++i)r[i]=1Y(f,a[i]);r.t=a.t}r.s=1Y(o.s,a.s);r.1n()}E 69(x,y){F x&y}E 5p(a){D r=Q();o.1V(a,69,r);F r}E 3k(x,y){F x|y}E 5o(a){D r=Q();o.1V(a,3k,r);F r}E 3U(x,y){F x^y}E 5n(a){D r=Q();o.1V(a,3U,r);F r}E 3V(x,y){F x&~y}E 5m(a){D r=Q();o.1V(a,3V,r);F r}E 5l(){D r=Q();P(D i=0;i<o.t;++i)r[i]=o.1h&~o[i];r.t=o.t;r.s=~o.s;F r}E 5k(n){D r=Q();C(n<0)o.1j(-n,r);J o.2k(n,r);F r}E 5i(n){D r=Q();C(n<0)o.2k(-n,r);J o.1j(n,r);F r}E 68(x){C(x==0)F-1;D r=0;C((x&3l)==0){x>>=16;r+=16}C((x&2O)==0){x>>=8;r+=8}C((x&3W)==0){x>>=4;r+=4}C((x&3)==0){x>>=2;r+=2}C((x&1)==0)++r;F r}E 5h(){P(D i=0;i<o.t;++i)C(o[i]!=0)F i*o.O+68(o[i]);C(o.s<0)F o.t*o.O;F-1}E 66(x){D r=0;L(x!=0){x&=x-1;++r}F r}E 5g(){D r=0,x=o.s&o.1h;P(D i=0;i<o.t;++i)r+=66(o[i]^x);F r}E 5e(n){D j=1e.1Z(n/o.O);C(j>=o.t)F(o.s!=0);F((o[j]&(1<<(n%o.O)))!=0)}E 5K(n,1Y){D r=G.1u.3i(n);o.1V(r,1Y,r);F r}E 5d(n){F o.3j(n,3k)}E 5c(n){F o.3j(n,3V)}E 5b(n){F o.3j(n,3U)}E 5J(a,r){D i=0,c=0,m=1e.1N(a.t,o.t);L(i<m){c+=o[i]+a[i];r[i++]=c&o.1h;c>>=o.O}C(a.t<o.t){c+=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c+=a[i];r[i++]=c&o.1h;c>>=o.O}c+=a.s}r.s=(c<0)?-1:0;C(c>0)r[i++]=c;J C(c<-1)r[i++]=o.1m+c;r.t=i;r.1n()}E 5a(a){D r=Q();o.2H(a,r);F r}E 58(a){D r=Q();o.Y(a,r);F r}E 57(a){D r=Q();o.2n(a,r);F r}E 55(a){D r=Q();o.1K(a,r,1b);F r}E 54(a){D r=Q();o.1K(a,1b,r);F r}E 51(a){D q=Q(),r=Q();o.1K(a,q,r);F V 1w(q,r)}E 5I(n){o[o.t]=o.am(0,n-1,o,0,0,o.t);++o.t;o.1n()}E 5H(n,w){L(o.t<=w)o[o.t++]=0;o[w]+=n;L(o[w]>=o.1m){o[w]-=o.1m;C(++w>=o.t)o[o.t++]=0;++o[w]}}E 2p(){}E 3T(x){F x}E 65(x,y,r){x.2n(y,r)}E 62(x,r){x.2M(r)}2p.H.2m=3T;2p.H.2l=3T;2p.H.1W=65;2p.H.1A=62;E 4Y(e){F o.3S(e,V 2p())}E 5F(a,n,r){D i=1e.1N(o.t+a.t,n);r.s=0;r.t=i;L(i>0)r[--i]=0;D j;P(j=r.t-o.t;i<j;++i)r[i+o.t]=o.am(0,a[i],r,i,0,o.t);P(j=1e.1N(a.t,n);i<j;++i)o.am(0,a[i],r,i,0,n-i);r.1n()}E 5D(a,n,r){--n;D i=r.t=o.t+a.t-n;r.s=0;L(--i>=0)r[i]=0;P(i=1e.3J(n-o.t,0);i<a.t;++i)r[o.t+i-n]=o.am(n-i,a[i],r,0,0,o.t+i-n);r.1n();r.2N(1,r)}E 1X(m){o.1c=Q();o.3R=Q();G.1u.2o(2*m.t,o.1c);o.60=o.1c.56(m);o.m=m}E 5Z(x){C(x.s<0||x.t>2*o.m.t)F x.3h(o.m);J C(x.1d(o.m)<0)F x;J{D r=Q();x.1J(r);o.1x(r);F r}}E 5Y(x){F x}E 5X(x){x.2N(o.m.t-1,o.1c);C(x.t>o.m.t+1){x.t=o.m.t+1;x.1n()}o.60.5E(o.1c,o.m.t+1,o.3R);o.m.5G(o.3R,o.m.t+1,o.1c);L(x.1d(o.1c)<0)x.2h(1,o.m.t+1);x.Y(o.1c,x);L(x.1d(o.m)>=0)x.Y(o.m,x)}E 5V(x,r){x.2M(r);o.1x(r)}E 5W(x,y,r){x.2n(y,r);o.1x(r)}1X.H.2m=5Z;1X.H.2l=5Y;1X.H.1x=5X;1X.H.1W=5W;1X.H.1A=5V;E 50(e,m){D i=e.3Q(),k,r=1I(1),z;C(i<=0)F r;J C(i<18)k=1;J C(i<48)k=3;J C(i<9H)k=4;J C(i<9G)k=5;J k=6;C(i<8)z=V 1R(m);J C(m.1l())z=V 1X(m);J z=V 1Q(m);D g=V 1w(),n=3,2J=k-1,2K=(1<<k)-1;g[1]=z.2m(o);C(k>1){D 3P=Q();z.1A(g[1],3P);L(n<=2K){g[n]=Q();z.1W(3P,g[n-2],g[n]);n+=2}}D j=e.t-1,w,3O=1F,1c=Q(),t;i=2L(e[j])-1;L(j>=0){C(i>=2J)w=(e[j]>>(i-2J))&2K;J{w=(e[j]&((1<<(i+1))-1))<<(2J-i);C(j>0)w|=e[j-1]>>(o.O+i-2J)}n=k;L((w&1)==0){w>>=1;--n}C((i-=n)<0){i+=o.O;--j}C(3O){g[w].1J(r);3O=1t}J{L(n>1){z.1A(r,1c);z.1A(1c,r);n-=2}C(n>0)z.1A(r,1c);J{t=r;r=1c;1c=t}z.1W(1c,g[w],r)}L(j>=0&&(e[j]&(1<<i))==0){z.1A(r,1c);t=r;r=1c;1c=t;C(--i<0){i=o.O-1;--j}}}F z.2l(r)}E 4X(a){D x=(o.s<0)?o.2I():o.2G();D y=(a.s<0)?a.2I():a.2G();C(x.1d(y)<0){D t=x;x=y;y=t}D i=x.2g(),g=y.2g();C(g<0)F x;C(i<g)g=i;C(g>0){x.1j(g,x);y.1j(g,y)}L(x.1G()>0){C((i=x.2g())>0)x.1j(i,x);C((i=y.2g())>0)y.1j(i,y);C(x.1d(y)>=0){x.Y(y,x);x.1j(1,x)}J{y.Y(x,y);y.1j(1,y)}}C(g>0)y.2k(g,y);F y}E 5B(n){C(n<=0)F 0;D d=o.1m%n,r=(o.s<0)?n-1:0;C(o.t>0)C(d==0)r=o[0]%n;J P(D i=o.t-1;i>=0;--i)r=(d*r+o[i])%n;F r}E 4Z(m){D ac=m.1l();C((o.1l()&&ac)||m.1G()==0)F G.1v;D u=m.2G(),v=o.2G();D a=1I(1),b=1I(0),c=1I(0),d=1I(1);L(u.1G()!=0){L(u.1l()){u.1j(1,u);C(ac){C(!a.1l()||!b.1l()){a.2H(o,a);b.Y(m,b)}a.1j(1,a)}J C(!b.1l())b.Y(m,b);b.1j(1,b)}L(v.1l()){v.1j(1,v);C(ac){C(!c.1l()||!d.1l()){c.2H(o,c);d.Y(m,d)}c.1j(1,c)}J C(!d.1l())d.Y(m,d);d.1j(1,d)}C(u.1d(v)>=0){u.Y(v,u);C(ac)a.Y(c,a);b.Y(d,b)}J{v.Y(u,v);C(ac)c.Y(a,c);d.Y(b,d)}}C(v.1d(G.1u)!=0)F G.1v;C(d.1d(m)>=0)F d.3f(m);C(d.1G()<0)d.2H(m,d);J F d;C(d.1G()<0)F d.3E(m);J F d}D 1k=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,9F,9E,9D,9C,9B,5U,9A,9z,9y,9x,9w,9v,9u,9t,9s,9r,9q,9p,9o,9n,9m,9l,9k,9j,9i,9h,9g,9f,9e,9d,9c,9b,9a,99,98,96,95,94,93,92,91,90,8Z,8Y,8X,8W,8V,8U,8T,8S,8R,8Q,8P,8O,8N,8M,8L,8K,8J,8I,8H,8G,8F,8E,8D,8C,8B,8A,8z,8y,8x,8w];D 5T=(1<<26)/1k[1k.U-1];E 4V(t){D i,x=o.1H();C(x.t==1&&x[0]<=1k[1k.U-1]){P(i=0;i<1k.U;++i)C(x[0]==1k[i])F 1F;F 1t}C(x.1l())F 1t;i=1;L(i<1k.U){D m=1k[i],j=i+1;L(j<1k.U&&m<5T)m*=1k[j++];m=x.5C(m);L(i<j)C(m%1k[i++]==0)F 1t}F x.5A(t)}E 5z(t){D 2i=o.3f(G.1u);D k=2i.2g();C(k<=0)F 1t;D r=2i.5j(k);t=(t+1)>>1;C(t>1k.U)t=1k.U;D a=Q();P(D i=0;i<t;++i){a.2j(1k[i]);D y=a.2f(r,o);C(y.1d(G.1u)!=0&&y.1d(2i)!=0){D j=1;L(j++<k&&y.1d(2i)!=0){y=y.5S(2,o);C(y.1d(G.1u)==0)F 1t}C(y.1d(2i)!=0)F 1t}}F 1F}G.H.3N=5R;G.H.5Q=5P;G.H.5O=5N;G.H.3M=5M;G.H.1V=5L;G.H.3j=5K;G.H.2H=5J;G.H.3L=5I;G.H.2h=5H;G.H.5G=5F;G.H.5E=5D;G.H.5C=5B;G.H.5A=5z;G.H.2G=5y;G.H.3K=5x;G.H.8v=5w;G.H.8u=5v;G.H.1G=5u;G.H.8t=5t;G.H.8s=5s;G.H.1N=5r;G.H.3J=5q;G.H.8r=5p;G.H.8q=5o;G.H.8p=5n;G.H.8o=5m;G.H.2b=5l;G.H.3i=5k;G.H.5j=5i;G.H.2g=5h;G.H.8n=5g;G.H.5f=5e;G.H.8m=5d;G.H.8l=5c;G.H.8k=5b;G.H.3E=5a;G.H.3f=58;G.H.3D=57;G.H.56=55;G.H.8j=54;G.H.8i=51;G.H.2f=50;G.H.8h=4Z;G.H.2F=4Y;G.H.8g=4X;G.H.4W=4V;E 4k(4R,4Q,4S,4T){D 4U="8f";D N=V G(4U,16);D g=V G("2");D k=V G("8e",16);D 3H=V 3I();D a=V G(32,3H);D A=g.2f(a,N);L(A.3h(N)==0){a=V G(32,3H);A=g.2f(a,N)}D 3F=A.1z(16);D S=1b;D K=1b;D M=1b;D 3d=1b;D 2e=4T;D 4P=4S;D 1a=o;D 2X=1t;D I=4R;D p=4Q;D T=1b;o.8d=E(){F I};o.8c=E(){F T};o.8b=E(){F 2e};o.8a=E(){F g};o.88=E(){F N};o.87=E(s){F V G(1E(s+1E(I+":"+p)),16)};o.2C=E(1P){C(4P=="86"){F 1P}};o.2A=E(4O){F 4O.85.84};E 2z(4N){F(3g(1U[4N])!="82")};o.2B=E(4I,2E,4J){C(1U.4M)T=V 4M();J C(1U.4L){81{T=V 4L("4K.80")}7Z(e){}}J{1a.1y("4G 2b 7Y.");F}C(T){T.7X=4J;T.7W("7V",4I,1F);T.3G("4H-4o","7U/x-7T-7S-7R");T.3G("4H-U",2E.U);T.3G("7Q","7P");T.7O(2E)}J{1a.1y("4G 7N.")}};o.4p=E(){D 4F=2e+1a.2C("7M/");D 2E="I="+I+"&A="+3F;1a.2B(4F,2E,4E)};E 4E(){C(T.3b==4&&T.3a==39){C(T.1o.1i("r").U>0){D 1O=T.1o.1i("r")[0];C(!1O.1M("a")){3B(1O.1M("s"),1O.1M("B"),p);1a.2B(2e+1a.2C("4x/"),"M="+M,4y)}J 3c(1O.1M("s"),1O.1M("B"),1O.1M("a"),1O.1M("d"))}J C(T.1o.1i("2d").U>0)1a.1y(T.1o.1i("2d")[0])}};E 3B(s,2D,4C){D B=V G(2D,16);D 4D=2D;D u=V G(1E(3F+4D),16);D x=V G(1E(s+1E(I+":"+4C)),16);D 4B=k.3D(g.2f(x,N));D 4A=a.3E(u.3D(x));S=B.3f(4B).2f(4A,N);D 4z=A.1z(16)+B.1z(16)+S.1z(16);M=1E(4z);3d=1E(A.1z(16)+M+S.1z(16));};E 4y(){C(T.3b==4&&T.3a==39){C(T.1o.1i("M").U>0){C(1a.2A(T.1o.1i("M")[0])==3d){1a.4l();2X=1F}J 1a.1y("4t 2c 4s 2b 4r")}J C(T.1o.1i("2d").U>0)1a.1y(1a.2A(T.1o.1i("2d")[0]))}};E 3c(s,2D,3C,3A){4m();E 3z(){C(!2z("2Z")||!2z("35")){1U.4w(3z,10);F}C(3C=="7L")3e=2Z;J C(3C=="7K")3e=35;3y(3e(3A+p));3B(s,2D,3e(3A+p));1a.2B(2e+1a.2C("3c/4x/"),"M="+M,4v)};1U.4w(3z,10)};E 4v(){C(T.3b==4&&T.3a==39){C(T.1o.1i("M").U>0){C(1a.2A(T.1o.1i("M")[0])==3d){D 4u=2e+1a.2C("3c/7J/");1a.2B(4u,"p="+p,4q)}J 1a.1y("4t 2c 4s 2b 4r")}J C(T.1o.1i("2d").U>0){1a.1y(1a.2A(T.1o.1i("2d")[0]))}}};E 4q(){C(T.3b==4&&T.3a==39){C(T.1o.1i("7I").U>0)1a.4p();J 1a.1y("7H 7G 2b be 7F")}};E 34(4n){D 38=2W.7E(\'3x\');38.4o=\'7D/7C\';38.4i=4n;2W.1i(\'7B\')[0].7A(38)};E 4m(){C(2z("2Z")&&2z("35"))F;D 2y=1a.4j.7z("/");D 33=2y.7y(0,2y.U-1).7x("/");C(2y[2y.U-1]=="7w.1N.2Y")34(33+"/7v.1N.2Y");J{34(33+"/35.2Y");34(33+"/2Z.2Y")}}o.2c=E(){C(K==1b)C(2X){K=1E(S);F K}J 1a.1y("7u 7t 2b 7s 2X.");J F K};o.4l=E(){3y("7r 7q.")};o.1y=E(t){3y(t)}};4k.H.4j=2W.1i(\'3x\')[2W.1i(\'3x\').U-1].1M("4i");',62,701,'||||||||||||||||||||||||this||||||||||||||if|var|function|return|BigInteger|prototype||else||while|||DB|for|nbi|||xhr|length|new|||subTo|HASH|||||||||||that|null|r2|compareTo|Math|safe_add|rng_pptr|DM|getElementsByTagName|rShiftTo|lowprimes|isEven|DV|clamp|responseXML|ds|sh|vv|rng_pool|false|ONE|ZERO|Array|reduce|error_message|toString|sqrTo|ys|bs|255|SHA256|true|signum|abs|nbv|copyTo|divRemTo|dbits|getAttribute|min|response|str|Montgomery|Classic|256|utftext|window|bitwiseTo|mulTo|Barrett|op|floor|mi|pm||||||charCodeAt|||rr|not|key|error|url|modPow|getLowestSetBit|dAddOffset|n1|fromInt|lShiftTo|revert|convert|multiplyTo|dlShiftTo|NullExp|nsh|cbs|xh|xl|string|chrsz|fromCharCode|String|arr|isdefined|innerxml|ajaxRequest|paths|ephemeral|params|pow|clone|addTo|negate|k1|km|nbits|squareTo|drShiftTo|0xff|0x80|cs|charAt|0x7fff|bm|BI_RC|rng_state|document|authenticated|js|SHA1||||path|import_file|MD5|||scriptElt|200|status|readyState|upgrade|M2|hashfun|subtract|typeof|mod|shiftLeft|changeBit|op_or|0xffff|fromString|qd|y0|pt|BI_FP|navigator|rng_psize|Arcfour|binarray|128|T1|script|alert|do_upgrade|dsalt|calculations|algo|multiply|add|Astr|setRequestHeader|rng|SecureRandom|max|intValue|dMultiply|fromNumber|chunkSize|is1|g2|bitLength|q3|exp|nNop|op_xor|op_andnot|0xf|intAt|mpl|mp|ts||F2||yt|F1|int2char|||appName|j_lm|0x3fff|rng_seed_time|hex_tab|bin|T2|0xFFFF|lsw|src|srpPath|SRP|success|import_hashes|fname|type|identify|confirm_verifier|match|does|Server|auth_url|confirm_upgrade|setTimeout|authenticate|confirm_authentication|Mstr|aux|kgx|pass|Bstr|receive_salts|handshake_url|Ajax|Content|full_url|callback|Microsoft|ActiveXObject|XMLHttpRequest|variable|node|server|password|username|ser|base_url|Nstr|bnIsProbablePrime|isProbablePrime|bnGCD|bnPow|bnModInverse|bnModPow|bnDivideAndRemainder|||bnRemainder|bnDivide|divide|bnMultiply|bnSubtract||bnAdd|bnFlipBit|bnClearBit|bnSetBit|bnTestBit|testBit|bnBitCount|bnGetLowestSetBit|bnShiftRight|shiftRight|bnShiftLeft|bnNot|bnAndNot|bnXor|bnOr|bnAnd|bnMax|bnMin|bnEquals|bnToByteArray|bnSigNum|bnShortValue|bnByteValue|bnIntValue|bnClone|bnpMillerRabin|millerRabin|bnpModInt|modInt|bnpMultiplyUpperTo|multiplyUpperTo|bnpMultiplyLowerTo|multiplyLowerTo|bnpDAddOffset|bnpDMultiply|bnpAddTo|bnpChangeBit|bnpBitwiseTo|bnpFromNumber|bnpFromRadix|fromRadix|bnpToRadix|toRadix|bnpChunkSize|modPowInt|lplim|127|barrettSqrTo|barrettMulTo|barrettReduce|barrettRevert|barrettConvert|mu||nSqrTo|||nMulTo|cbit||lbit|op_and|nextBytes|number|continue|bnModPowInt|bnMod|bnBitLength|bnCompareTo|bnAbs|bnNegate|bnToString|bnpExp|bnpIsEven|bnpInvDigit|invDigit|bnpDivRemTo|bnpSquareTo|bnpMultiplyTo|bnpSubTo|bnpRShiftTo|bnpLShiftTo|bnpDRShiftTo|bnpDLShiftTo|bnpClamp|bnpFromString|bnpFromInt|bnpCopyTo|montSqrTo|montMulTo|montReduce|montRevert|montConvert|u0|um|mph|mt2|cSqrTo|cMulTo|cReduce|cRevert|cConvert|ms|d2|d1|FV|BI_RM|am3|am1|Netscape|am2|0x3fffffff|canary|rng_get_bytes|rng_get_byte||next||init|prng_newstate|random|crypto|rng_seed_int||ARC4next|ARC4init|str2binb|core_sha256|binb2hex|Utf8Encode|0xF|hexcase|mask|Maj|Sigma0256|Ch|Sigma1256|Gamma0256|Gamma1256|msw|successful|Authentication|been|has|User|hash|srp|join|slice|split|appendChild|head|javascript|text|createElement|confirmed|could|Verifier|ok|verifier|md5|sha1|handshake|failed|send|close|Connection|urlencoded|form|www|application|POST|open|onreadystatechange|supported|catch|XMLHTTP|try|undefined||nodeValue|firstChild|django|calcX|getN||getg|geturl|getxhr|getI|c46d46600d87fef149bd79b81119842f3c20241fda67d06ef412d8f6d9479c58|115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3|gcd|modInverse|divideAndRemainder|remainder|flipBit|clearBit|setBit|bitCount|andNot|xor|or|and|equals|toByteArray|shortValue|byteValue|509|503|499|491|487|479|467|463|461|457|449|443|439|433|431|421|419|409|401|397|389|383|379|373|367|359|353|349|347|337|331|317|313|311|307|293|283||281|277|271|269|263|257|251|241|239|233|229|227|223|211|199|197|193|191|181|179|173|167|163|157|151|149|139|137|131|113|109|107|103|101|768|144|substr|log|LN2|0xffffffff|0123456789abcdefghijklmnopqrstuvwxyz|Explorer|Internet|0xfffffff|0x3ffffff|0x4000000|0xefcafe|0xffffff|0xdeadbeefcafe|65536|appVersion|getTime|Date|0123456789abcdef|0123456789ABCDEF|224|192|2048|replace|0x5BE0CD19|0x1F83D9AB|0x9B05688C|0x510E527F|0xA54FF53A|0x3C6EF372|0xBB67AE85||0x6A09E667|0xC67178F2|0xBEF9A3F7|0xA4506CEB|0x90BEFFFA|0x8CC70208|0x84C87814|0x78A5636F|0x748F82EE||0x682E6FF3|0x5B9CCA4F|0x4ED8AA4A|0x391C0CB3|0x34B0BCB5|0x2748774C|0x1E376C08|0x19A4C116|0x106AA070|0xF40E3585|0xD6990624|0xD192E819|0xC76C51A3|0xC24B8B70|0xA81A664B|0xA2BFE8A1|0x92722C85|0x81C2C92E|0x766A0ABB|0x650A7354|0x53380D13|0x4D2C6DFC|0x2E1B2138|0x27B70A85|0x14292967|0x6CA6351|0xD5A79147|0xC6E00BF3|0xBF597FC7|0xB00327C8|0xA831C66D|0x983E5152|0x76F988DA|0x5CB0A9DC|0x4A7484AA|0x2DE92C6F|0x240CA1CC|0xFC19DC6|0xEFBE4786|0xE49B69C1|0xC19BF174|0x9BDC06A7|0x80DEB1FE|0x72BE5D74|0x550C7DC3|0x243185BE|0x12835B01|0xD807AA98|0xAB1C5ED5||0x923F82A4|0x59F111F1|0x3956C25B||0xE9B5DBA5|0xB5C0FBCF|0x71374491|0x428A2F98'.split('|'),0,{}))
diff --git a/javascript/srp.js b/javascript/srp.js
index cb788b3..ba14324 100644
--- a/javascript/srp.js
+++ b/javascript/srp.js
@@ -8,55 +8,63 @@ function SRP(username, password, ser, base_url)
var rng = new SecureRandom();
var a = new BigInteger(32, rng);
var A = g.modPow(a, N);
+ while(A.mod(N) == 0)
+ {
+ a = new BigInteger(32, rng);
+ A = g.modPow(a, N);
+ }
var Astr = A.toString(16);
- var B = null;
- var Bstr = null;
- var u = null;
- var x = null;
var S = null;
var K = null;
var M = null;
var M2 = null;
- var salt = null;
var url = base_url;
var server = ser;
var that = this;
var authenticated = false;
- var hash_import = false;
var I = username;
var p = password;
var xhr = null;
+ // *** Accessor methods ***
+
+ // Returns the user's identity
this.getI = function()
{
return I;
};
+
+ // Returns the XMLHttpRequest object
this.getxhr = function()
{
return xhr;
};
+
+ // Returns the base URL
this.geturl = function()
{
return url;
};
+ // Returns the BigInteger, g
this.getg = function()
{
return g;
};
+
+ // Returns the BigInteger, N
this.getN = function()
{
return N;
};
+
+ // Calculates the X value and return it as a BigInteger
this.calcX = function(s)
{
- return that.calcXp(s, p);
- };
- this.calcXp = function(s, ph)
- {
- return new BigInteger(SHA256(s + SHA256(I + ":" + ph)), 16);
+ return new BigInteger(SHA256(s + SHA256(I + ":" + p)), 16);
};
- function paths(str)
+ // Translates the django path to PHP and ASP.NET paths
+ this.paths = function(str)
{
// For now, str will be the django path
// This function will translate for other backends.
@@ -65,7 +73,21 @@ function SRP(username, password, ser, base_url)
return str;
}
};
- this.paths = paths;
+
+ // Get the text content of an XML node
+ this.innerxml = function(node)
+ {
+ return node.firstChild.nodeValue;
+ };
+
+ // Check whether or not a variable is defined
+ function isdefined ( variable)
+ {
+ return (typeof(window[variable]) != "undefined");
+ };
+
+ // *** Actions ***
+
// Perform ajax requests at the specified url, with the specified parameters
// Calling back the specified function.
this.ajaxRequest = function(full_url, params, callback)
@@ -96,21 +118,10 @@ function SRP(username, password, ser, base_url)
}
};
- // Get the text content of an XML node
- this.innerxml = function(node)
- {
- return node.firstChild.nodeValue;
- };
-
- // Check whether or not a variable is defined
- function isdefined ( variable)
- {
- return (typeof(window[variable]) != "undefined");
- };
// Start the login process by identifying the user
this.identify = function()
{
- var handshake_url = url + paths("handshake/");
+ var handshake_url = url + that.paths("handshake/");
var params = "I="+I+"&A="+Astr;
that.ajaxRequest(handshake_url, params, receive_salts);
};
@@ -122,27 +133,70 @@ function SRP(username, password, ser, base_url)
if(xhr.responseXML.getElementsByTagName("r").length > 0)
{
var response = xhr.responseXML.getElementsByTagName("r")[0];
+ // If there is no algorithm specified, calculate M given s, B, and P
if(!response.getAttribute("a"))
{
calculations(response.getAttribute("s"), response.getAttribute("B"), p);
- send_hash(M, confirm_authentication, url+paths("authenticate/"));
+ that.ajaxRequest(url+that.paths("authenticate/"), "M="+M, confirm_authentication);
}
+ // If there is an algorithm specified, start the login process
else
- {
upgrade(response.getAttribute("s"), response.getAttribute("B"), response.getAttribute("a"), response.getAttribute("d"));
- }
}
else if(xhr.responseXML.getElementsByTagName("error").length > 0)
+ that.error_message(xhr.responseXML.getElementsByTagName("error")[0]);
+ }
+ };
+ // Calculate S, M, and M2
+ // This is the client side of the SRP specification
+ function calculations(s, ephemeral, pass)
+ {
+ //S -> C: s | B
+ var B = new BigInteger(ephemeral, 16);
+ var Bstr = ephemeral;
+ // u = H(A,B)
+ var u = new BigInteger(SHA256(Astr + Bstr), 16);
+ // x = H(s, H(I:p))
+ var x = new BigInteger(SHA256(s + SHA256(I + ":" + pass)), 16);
+ //S = (B - kg^x) ^ (a + ux)
+ var kgx = k.multiply(g.modPow(x, N));
+ var aux = a.add(u.multiply(x));
+ S = B.subtract(kgx).modPow(aux, N);
+ // M = H(H(N) xor H(g), H(I), s, A, B, K)
+ var Mstr = A.toString(16) + B.toString(16) + S.toString(16);
+ M = SHA256(Mstr);
+ M2 = SHA256(A.toString(16) + M + S.toString(16));
+ //M2 = H(A, M, K)
+ };
+
+ // Receive M2 from the server and verify it
+ function confirm_authentication()
+ {
+ if(xhr.readyState == 4 && xhr.status == 200) {
+ if(xhr.responseXML.getElementsByTagName("M").length > 0)
{
- // This probably means A % N == 0, which means we need to generate
- // a new A and reidentify.
- that.identify();
+ if(that.innerxml(xhr.responseXML.getElementsByTagName("M")[0]) == M2)
+ {
+ that.success();
+ authenticated = true;
+ }
+ else
+ that.error_message("Server key does not match");
}
- }
+ else if (xhr.responseXML.getElementsByTagName("error").length > 0)
+ that.error_message(that.innerxml(xhr.responseXML.getElementsByTagName("error")[0]));
+ }
};
+
+ // *** Upgrades ***
+
+ // Start the process to upgrade the user's account
function upgrade(s,ephemeral,algo,dsalt)
{
+ // First we need to import the hash functions
import_hashes();
+
+ // Once the hash functions are imported, do the calculations using the hashpass as the password
function do_upgrade()
{
// If sha1 and md5 are still undefined, sleep again
@@ -155,12 +209,15 @@ function SRP(username, password, ser, base_url)
hashfun = SHA1;
else if(algo == "md5")
hashfun = MD5;
+ alert(hashfun(dsalt+p));
calculations(s, ephemeral, hashfun(dsalt+p));
- salt = s;
- send_hash(M, confirm_upgrade, url+paths("upgrade/authenticate/"));
+ that.ajaxRequest(url+that.paths("upgrade/authenticate/"), "M="+M, confirm_upgrade);
};
window.setTimeout(do_upgrade,10);
};
+
+ // Receive the server's M, confirming that the server has HASH(p)
+ // Next, send P in plaintext (this is the **only** time it should ever be sent plain text)
function confirm_upgrade()
{
if(xhr.readyState == 4 && xhr.status == 200) {
@@ -168,9 +225,8 @@ function SRP(username, password, ser, base_url)
{
if(that.innerxml(xhr.responseXML.getElementsByTagName("M")[0]) == M2)
{
- var params = "p="+p;
- var auth_url = that.geturl() + that.paths("upgrade/verifier/");
- that.ajaxRequest(auth_url, params, confirm_verifier);
+ var auth_url = url + that.paths("upgrade/verifier/");
+ that.ajaxRequest(auth_url, "p="+p, confirm_verifier);
}
else
that.error_message("Server key does not match");
@@ -181,60 +237,19 @@ function SRP(username, password, ser, base_url)
}
}
};
+
+ // After sending the password, check that the response is OK, then reidentify
function confirm_verifier()
{
if(xhr.readyState == 4 && xhr.status == 200) {
if(xhr.responseXML.getElementsByTagName("ok").length > 0)
that.identify();
+ else
+ that.error_message("Verifier could not be confirmed");
}
};
- // Calculate S, M, and M2
- function calculations(s, ephemeral, pass)
- {
- //S -> C: s | B
- B = new BigInteger(ephemeral, 16);
- Bstr = ephemeral;
- // u = H(A,B)
- u = new BigInteger(SHA256(Astr + Bstr), 16);
- // x = H(s, H(I:p))
- x = new BigInteger(SHA256(s + SHA256(I + ":" + pass)), 16);
- //S = (B - kg^x) ^ (a + ux)
- var kgx = k.multiply(g.modPow(x, N));
- var aux = a.add(u.multiply(x));
- S = B.subtract(kgx).modPow(aux, N);
- // M = H(H(N) xor H(g), H(I), s, A, B, K)
- var Mstr = A.toString(16) + B.toString(16) + S.toString(16);
- M = SHA256(Mstr);
- M2 = SHA256(A.toString(16) + M + S.toString(16));
- //M2 = H(A, M, K)
- };
- // Send M to the server
- function send_hash(M, confirm_fun, auth_url)
- {
- var params = "M="+M;
- that.ajaxRequest(auth_url, params, confirm_fun);
- };
- // Receive M2 from the server and verify it
- function confirm_authentication()
- {
- if(xhr.readyState == 4 && xhr.status == 200) {
- if(xhr.responseXML.getElementsByTagName("M").length > 0)
- {
- if(that.innerxml(xhr.responseXML.getElementsByTagName("M")[0]) == M2)
- {
- that.success();
- authenticated = true;
- }
- else
- that.error_message("Server key does not match");
- }
- else if (xhr.responseXML.getElementsByTagName("error").length > 0)
- {
- that.error_message(that.innerxml(xhr.responseXML.getElementsByTagName("error")[0]));
- }
- }
- };
+ // This loads javascript libraries. Fname is the path to the library to be imported
function import_file(fname)
{
var scriptElt = document.createElement('script');
diff --git a/upgrade-notes.txt b/upgrade-notes.txt
deleted file mode 100644
index 99fe411..0000000
--- a/upgrade-notes.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-###
-### Upgrade
-###
-
-# We would like people to be able to upgrade an existing system to use SRP, without losing their user database.
-# We can detect existing users who cannot authenticate with SRP because they will appear in the django.auth
-# table without appearing in the srp table. Ultimately, we would like to do this without the user sending his plaintext password.
-
-# The server sends the client its salt for the database password, along with the hash algorithm that was used to store it.
-# The client hashes the salt and password, and gets P = H(s,p). The client proceeds with SRP treating P as if it were
-# its secret password. The server can do the same thing, and confirm the user's password.
-
-def ugprade(request):
- user = django.contrib.auth.models.User.objects.get(username=request.POST["I"])
- shadowpass = user.password.split("$")
- srpsalt = generate_salt()
- algorithm = shadowpass[0]
- shadowsalt = shadowpass[1]
- passhash = shadowpass[2]