var biRadixBase=2;var biRadixBits=16;var bitsPerDigit=biRadixBits;var biRadix=1<<16;var biHalfRadix=biRadix>>>1;var biRadixSquared=biRadix*biRadix;var maxDigitVal=biRadix-1;var maxInteger=9999999999999998;var maxDigits;var ZERO_ARRAY;var bigZero,bigOne;function setMaxDigits(D){maxDigits=D;ZERO_ARRAY=new Array(maxDigits);for(var C=0;C0){D.digits[F++]=E&maxDigitVal;E=Math.floor(E/biRadix)}return D}function reverseStr(E){var D="";for(var F=E.length-1;F>-1;--F){D+=E.charAt(F)}return D}var hexatrigesimalToChar=new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");function biToString(I,G){var J=new BigInt();J.digits[0]=G;var H=biDivideModulo(I,J);var F=hexatrigesimalToChar[H[1].digits[0]];while(biCompare(H[0],bigZero)==1){H=biDivideModulo(H[0],J);digit=H[1].digits[0];F+=hexatrigesimalToChar[H[1].digits[0]]}return(I.isNeg?"-":"")+reverseStr(F)}function biToDecimal(G){var H=new BigInt();H.digits[0]=10;var F=biDivideModulo(G,H);var E=String(F[1].digits[0]);while(biCompare(F[0],bigZero)==1){F=biDivideModulo(F[0],H);E+=String(F[1].digits[0])}return(G.isNeg?"-":"")+reverseStr(E)}var hexToChar=new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");function digitToHex(E){var F=15;var D="";for(i=0;i<4;++i){D+=hexToChar[E&F];E>>>=4}return reverseStr(D)}function biToHex(H){var E="";var F=biHighIndex(H);for(var G=biHighIndex(H);G>-1;--G){E+=digitToHex(H.digits[G])}return E}function charToHex(J){var O=48;var P=O+9;var N=97;var K=N+25;var L=65;var M=65+25;var I;if(J>=O&&J<=P){I=J-O}else{if(J>=L&&J<=M){I=10+J-L}else{if(J>=N&&J<=K){I=10+J-N}else{I=0}}}return I}function hexToDigit(F){var H=0;var E=Math.min(F.length,4);for(var G=0;G0;H-=4,++I){J.digits[I]=hexToDigit(G.substr(Math.max(H-4,0),Math.min(H,4)))}return J}function biFromString(P,Q){var N=P.charAt(0)=="-";var K=N?1:0;var O=new BigInt();var M=new BigInt();M.digits[0]=1;for(var L=P.length-1;L>=K;L--){var T=P.charCodeAt(L);var S=charToHex(T);var R=biMultiplyDigit(M,S);O=biAdd(O,R);M=biMultiplyDigit(M,Q)}O.isNeg=N;return O}function biDump(B){return(B.isNeg?"-":"")+B.digits.join(" ")}function biAdd(L,H){var G;if(L.isNeg!=H.isNeg){H.isNeg=!H.isNeg;G=biSubtract(L,H);H.isNeg=!H.isNeg}else{G=new BigInt();var I=0;var J;for(var K=0;K=biRadix)}G.isNeg=L.isNeg}return G}function biSubtract(L,H){var G;if(L.isNeg!=H.isNeg){H.isNeg=!H.isNeg;G=biAdd(L,H);H.isNeg=!H.isNeg}else{G=new BigInt();var I,J;J=0;for(var K=0;K0&&D.digits[C]==0){--C}return C}function biNumBits(I){var G=biHighIndex(I);var H=I.digits[G];var J=(G+1)*bitsPerDigit;var F;for(F=J;F>J-bitsPerDigit;--F){if((H&32768)!=0){break}H<<=1}return F}function biMultiply(R,S){var O=new BigInt();var T;var M=biHighIndex(R);var P=biHighIndex(S);var Q,N,L;for(var K=0;K<=P;++K){T=0;L=K;for(j=0;j<=M;++j,++L){N=O.digits[L]+R.digits[j]*S.digits[K]+T;O.digits[L]=N&maxDigitVal;T=N>>>biRadixBits}O.digits[K+M+1]=T}O.isNeg=R.isNeg!=S.isNeg;return O}function biMultiplyDigit(G,H){var I,J,K;result=new BigInt();I=biHighIndex(G);J=0;for(var L=0;L<=I;++L){K=result.digits[L]+G.digits[L]*H+J;result.digits[L]=K&maxDigitVal;J=K>>>biRadixBits}result.digits[1+I]=J;return result}function arrayCopy(M,J,O,K,L){var I=Math.min(J+L,M.length);for(var N=J,P=K;N0;--M,--L){I.digits[M]=((I.digits[M]<>>(O))}I.digits[0]=((I.digits[M]<>>L)|((I.digits[M]&lowBitMasks[L])<>>=L;I.isNeg=P.isNeg;return I}function biMultiplyByRadixPower(F,E){var D=new BigInt();arrayCopy(F.digits,0,D.digits,E,D.digits.length-E);return D}function biDivideByRadixPower(F,E){var D=new BigInt();arrayCopy(F.digits,E,D.digits,0,D.digits.length-E);return D}function biModuloByRadixPower(F,E){var D=new BigInt();arrayCopy(F.digits,0,D.digits,0,E);return D}function biCompare(D,E){if(D.isNeg!=E.isNeg){return 1-2*Number(D.isNeg)}for(var F=D.digits.length-1;F>=0;--F){if(D.digits[F]!=E.digits[F]){if(D.isNeg){return 1-2*Number(D.digits[F]>E.digits[F])}else{return 1-2*Number(D.digits[F]e;--V){var d=(V>=c.digits.length)?0:c.digits[V];var U=(V-1>=c.digits.length)?0:c.digits[V-1];var W=(V-2>=c.digits.length)?0:c.digits[V-2];var X=(e>=h.digits.length)?0:h.digits[e];var m=(e-1>=h.digits.length)?0:h.digits[e-1];if(d==X){b.digits[V-e-1]=maxDigitVal}else{b.digits[V-e-1]=Math.floor((d*biRadix+U)/X)}var Z=b.digits[V-e-1]*((X*biRadix)+m);var a=(d*biRadixSquared)+((U*biRadix)+W);while(Z>a){--b.digits[V-e-1];Z=b.digits[V-e-1]*((X*biRadix)|m);a=(d*biRadix*biRadix)+((U*biRadix)+W)}T=biMultiplyByRadixPower(h,V-e-1);c=biSubtract(c,biMultiplyDigit(T,b.digits[V-e-1]));if(c.isNeg){c=biAdd(c,T);--b.digits[V-e-1]}}c=biShiftRight(c,f);b.isNeg=g.isNeg!=l;if(g.isNeg){if(l){b=biAdd(b,bigOne)}else{b=biSubtract(b,bigOne)}h=biShiftRight(h,f);c=biSubtract(h,c)}if(c.digits[0]==0&&biHighIndex(c)==0){c.isNeg=false}return new Array(b,c)}function biDivide(C,D){return biDivideModulo(C,D)[0]}function biModulo(C,D){return biDivideModulo(C,D)[1]}function biMultiplyMod(F,E,D){return biModulo(biMultiply(F,E),D)}function biPow(H,F){var E=bigOne;var G=H;while(true){if((F&1)!=0){E=biMultiply(E,G)}F>>=1;if(F==0){break}G=biMultiply(G,G)}return E}function biPowMod(K,H,L){var G=bigOne;var J=K;var I=H;while(true){if((I.digits[0]&1)!=0){G=biMultiplyMod(G,J,L)}I=biShiftRight(I,1);if(I.digits[0]==0&&biHighIndex(I)==0){break}J=biMultiplyMod(J,J,L)}return G} function BarrettMu(A){this.modulus=biCopy(A);this.k=biHighIndex(this.modulus)+1;var B=new BigInt();B.digits[2*this.k]=1;this.mu=biDivide(B,this.modulus);this.bkplus1=new BigInt();this.bkplus1.digits[this.k+1]=1;this.modulo=BarrettMu_modulo;this.multiplyMod=BarrettMu_multiplyMod;this.powMod=BarrettMu_powMod}function BarrettMu_modulo(H){var G=biDivideByRadixPower(H,this.k-1);var E=biMultiply(G,this.mu);var D=biDivideByRadixPower(E,this.k+1);var C=biModuloByRadixPower(H,this.k+1);var I=biMultiply(D,this.modulus);var B=biModuloByRadixPower(I,this.k+1);var A=biSubtract(C,B);if(A.isNeg){A=biAdd(A,this.bkplus1)}var F=biCompare(A,this.modulus)>=0;while(F){A=biSubtract(A,this.modulus);F=biCompare(A,this.modulus)>=0}return A}function BarrettMu_multiplyMod(A,C){var B=biMultiply(A,C);return this.modulo(B)}function BarrettMu_powMod(B,E){var A=new BigInt();A.digits[0]=1;var C=B;var D=E;while(true){if((D.digits[0]&1)!=0){A=this.multiplyMod(A,C)}D=biShiftRight(D,1);if(D.digits[0]==0&&biHighIndex(D)==0){break}C=this.multiplyMod(C,C)}return A} function RSAKeyPair(B,C,A){this.e=biFromHex(B);this.d=biFromHex(C);this.m=biFromHex(A);this.digitSize=2*biHighIndex(this.m)+2;this.chunkSize=this.digitSize-11;this.radix=16;this.barrett=new BarrettMu(this.m)}function twoDigit(A){return(A<10?"0":"")+String(A)}function encryptedString(L,O){if(L.chunkSize>L.digitSize-11){return"Error"}var K=new Array();var A=O.length;var E=0;while(EF?F%L.chunkSize:L.chunkSize;var G=new Array();for(J=0;J>8)}}if(A.charCodeAt(A.length-1)==0){A=A.substring(0,A.length-1)}return A}