/* $Revision: 1.3 $ */

function binary2ascii(s){return bytes2ascii(blocks2bytes(s))}function binary2str(s){return bytes2str(blocks2bytes(s))}function ascii2binary(s){return bytes2blocks(ascii2bytes(s))}function str2binary(s){return bytes2blocks(str2bytes(s))}
function str2bytes(s){var is=0,ls=s.length,b=[];while(1){if(is>=ls)break;if(c2b[s.charAt(is)]==null){b[is]=0xF7;alert('is='+is+'\nchar='+s.charAt(is)+'\nls='+ls)}else{b[is]=c2b[s.charAt(is)]}is++}return b}
function bytes2str(b){var ib=0,lb=b.length,s='';while(1){if(ib>=lb)break;s+=b2c[0xFF&b[ib]];ib++}return s}
function ascii2bytes(a){var ia=-1,la=a.length,ib=0,b=[],carry;while(1){while(1){ia++;if(ia>=la)return b;if(a2b[a.charAt(ia)]!=null)break}b[ib]=a2b[a.charAt(ia)]<<2;while(1){ia++;if(ia>=la)return b;if(a2b[a.charAt(ia)]!=null)break}carry=a2b[a.charAt(ia)];b[ib]|=carry>>>4;ib++;carry=0xF&carry;if(carry==0&&ia==(la-1))return b;b[ib]=carry<<4;while(1){ia++;if(ia>=la)return b;if(a2b[a.charAt(ia)]!=null)break}carry=a2b[a.charAt(ia)];b[ib]|=carry>>>2;ib++;carry=3&carry;if(carry==0&&ia==(la-1))return b;b[ib]=carry<<6;while(1){ia++;if(ia>=la)return b;if(a2b[a.charAt(ia)]!=null)break}b[ib]|=a2b[a.charAt(ia)];ib++}return b}
function bytes2ascii(b){var ib=0,lb=b.length,s='',b1,b2,b3,carry;while(1){if(ib>=lb)break;b1=0xFF&b[ib];s+=b2a[63&(b1>>>2)];carry=3&b1;ib++;if(ib>=lb){s+=b2a[carry<<4];break}b2=0xFF&b[ib];s+=b2a[(0xF0&(carry<<4))|(b2>>>4)];carry=0xF&b2;ib++;if(ib>=lb){s+=b2a[carry<<2];break}b3=0xFF&b[ib];s+=b2a[(60&(carry<<2))|(b3>>>6)]+b2a[63&b3];ib++;if(ib%36==0)s+="\n";}return s}
function bytes2blocks(bytes){var blocks=[],ibl=0,iby=0,nby=bytes.length;while(1){blocks[ibl]=(0xFF&bytes[iby])<<24;iby++;if(iby>=nby)break;blocks[ibl]|=(0xFF&bytes[iby])<<16;iby++;if(iby>=nby)break;blocks[ibl]|=(0xFF&bytes[iby])<<8;iby++;if(iby>=nby)break;blocks[ibl]|=0xFF&bytes[iby];iby++;if(iby>=nby)break;ibl++}return blocks}
function blocks2bytes(blocks){var bytes=[],iby=0,ibl=0,nbl=blocks.length;while(1){if(ibl>=nbl)break;bytes[iby]=0xFF&(blocks[ibl]>>>24);iby++;bytes[iby]=0xFF&(blocks[ibl]>>>16);iby++;bytes[iby]=0xFF&(blocks[ibl]>>>8);iby++;bytes[iby]=0xFF&blocks[ibl];iby++;ibl++}return bytes}
function digest_pad(bytearray){var newarray=[],ina=0,iba=0,nba=bytearray.length,npads=15-(nba%16);newarray[ina]=npads;ina++;while(iba<nba){newarray[ina]=bytearray[iba];ina++;iba++}var ip=npads;while(ip>0){newarray[ina]=0;ina++;ip--}return newarray}
function pad(bytearray){var newarray=[],ina=0,iba=0,nba=bytearray.length,npads=7-(nba%8);newarray[ina]=(0xF8&rand_byte())|(7&npads);ina++;while(iba<nba){newarray[ina]=bytearray[iba];ina++;iba++}var ip=npads;while(ip>0){newarray[ina]=rand_byte();ina++;ip--}return newarray}
function rand_byte(){return Math.floor(256*Math.random())}
function unpad(bytearray){var iba=0,newarray=[],ina=0,npads=0x7 & bytearray[iba];iba++;var nba=bytearray.length-npads;while(iba<nba){newarray[ina]=bytearray[iba];ina++;iba++}return newarray}
function asciidigest(str){return binary2ascii(binarydigest(str))}
function binarydigest(str,keystr){var key=[0x61626364,0x62636465,0x63646566,0x64656667],c0=[0x61626364,0x62636465],c1=c0,v0=[],v1=[],swap,blocks=bytes2blocks(digest_pad(str2bytes(str))),ibl=0,nbl=blocks.length;while(1){if(ibl>=nbl)break;v0[0]=blocks[ibl];ibl++;v0[1]=blocks[ibl];ibl++;v1[0]=blocks[ibl];ibl++;v1[1]=blocks[ibl];ibl++;c0=tea_code(xor_blocks(v0,c0),key);c1=tea_code(xor_blocks(v1,c1),key);swap=c0[0];c0[0]=c0[1];c0[1]=c1[0];c1[0]=c1[1];c1[1]=swap}return [c0[0],c0[1],c1[0],c1[1]]}
function encrypt(str,keystr){if(!keystr){alert("encrypt: no key");return false}if(!str)return"";var key=binarydigest(keystr),blocks=bytes2blocks(pad(str2bytes(str))),ibl=0,nbl=blocks.length,c=[0x61626364,0x62636465],v=[],cblocks=[],icb=0;while(1){if(ibl>=nbl)break;v[0]=blocks[ibl];ibl++;v[1]=blocks[ibl];ibl++;c=tea_code(xor_blocks(v,c),key);cblocks[icb]=c[0];icb++;cblocks[icb]=c[1];icb++}return binary2ascii(cblocks)}
function decrypt(ascii,keystr){if(!keystr){alert("decrypt: no key");return false}if(!ascii)return"";var key=binarydigest(keystr),cblocks=ascii2binary(ascii),icbl=0,ncbl=cblocks.length,lastc=[0x61626364,0x62636465],v=[],c=[],blocks=[],ibl=0;while(1){if(icbl>=ncbl)break;c[0]=cblocks[icbl];icbl++;c[1]=cblocks[icbl];icbl++;v=xor_blocks(lastc,tea_decode(c,key));blocks[ibl]=v[0];ibl++;blocks[ibl]=v[1];ibl++;lastc[0]=c[0];lastc[1]=c[1]}return bytes2str(unpad(blocks2bytes(blocks)))}
function xor_blocks(blk1,blk2){return [blk1[0]^blk2[0],blk1[1]^blk2[1]]}
function tea_code(v,k){var v0=v[0],v1=v[1],sum=0,n=32;while(n-->0){v0+=(((v1<<4)^(v1>>>5))+v1)^(sum+k[sum&3]);v0=v0|0;sum-=1640531527;sum=sum|0;v1+=(((v0<<4)^(v0>>>5))+v0)^(sum+k[(sum>>>11)&3]);v1=v1|0}return[v0,v1]}
function tea_decode(v,k){var v0=v[0],v1=v[1],sum=-957401312,n=32;while(n-->0){v1-=(((v0<<4)^(v0>>>5))+v0)^(sum+k[(sum>>>11)&3]);v1=v1|0;sum+=1640531527;sum=sum|0;v0-=(((v1<<4)^(v1>>>5))+v1)^(sum+k[sum&3]);v0=v0|0}return[v0,v1]}
var c2b={"\x00":0,"\x01":1,"\x02":2,"\x03":3,"\x04":4,"\x05":5,"\x06":6,"\x07":7,"\x08":8,"\x09":9,"\x0A":10,"\x0B":11,"\x0C":12,"\x0D":13,"\x0E":14,"\x0F":15,"\x10":16,"\x11":17,"\x12":18,"\x13":19,"\x14":20,"\x15":21,"\x16":22,"\x17":23,"\x18":24,"\x19":25,"\x1A":26,"\x1B":27,"\x1C":28,"\x1D":29,"\x1E":30,"\x1F":31,"\x20":32,"\x21":33,"\x22":34,"\x23":35,"\x24":36,"\x25":37,"\x26":38,"\x27":39,"\x28":40,"\x29":41,"\x2A":42,"\x2B":43,"\x2C":44,"\x2D":45,"\x2E":46,"\x2F":47,"\x30":48,"\x31":49,"\x32":50,"\x33":51,"\x34":52,"\x35":53,"\x36":54,"\x37":55,"\x38":56,"\x39":57,"\x3A":58,"\x3B":59,"\x3C":60,"\x3D":61,"\x3E":62,"\x3F":63,"\x40":64,"\x41":65,"\x42":66,"\x43":67,"\x44":68,"\x45":69,"\x46":70,"\x47":71,"\x48":72,"\x49":73,"\x4A":74,"\x4B":75,"\x4C":76,"\x4D":77,"\x4E":78,"\x4F":79,"\x50":80,"\x51":81,"\x52":82,"\x53":83,"\x54":84,"\x55":85,"\x56":86,"\x57":87,"\x58":88,"\x59":89,"\x5A":90,"\x5B":91,"\x5C":92,"\x5D":93,"\x5E":94,"\x5F":95,"\x60":96,"\x61":97,"\x62":98,"\x63":99,"\x64":100,"\x65":101,"\x66":102,"\x67":103,"\x68":104,"\x69":105,"\x6A":106,"\x6B":107,"\x6C":108,"\x6D":109,"\x6E":110,"\x6F":111,"\x70":112,"\x71":113,"\x72":114,"\x73":115,"\x74":116,"\x75":117,"\x76":118,"\x77":119,"\x78":120,"\x79":121,"\x7A":122,"\x7B":123,"\x7C":124,"\x7D":125,"\x7E":126,"\x7F":127,"\x80":128,"\x81":129,"\x82":130,"\x83":131,"\x84":132,"\x85":133,"\x86":134,"\x87":135,"\x88":136,"\x89":137,"\x8A":138,"\x8B":139,"\x8C":140,"\x8D":141,"\x8E":142,"\x8F":143,"\x90":144,"\x91":145,"\x92":146,"\x93":147,"\x94":148,"\x95":149,"\x96":150,"\x97":151,"\x98":152,"\x99":153,"\x9A":154,"\x9B":155,"\x9C":156,"\x9D":157,"\x9E":158,"\x9F":159,"\xA0":160,"\xA1":161,"\xA2":162,"\xA3":163,"\xA4":164,"\xA5":165,"\xA6":166,"\xA7":167,"\xA8":168,"\xA9":169,"\xAA":170,"\xAB":171,"\xAC":172,"\xAD":173,"\xAE":174,"\xAF":175,"\xB0":176,"\xB1":177,"\xB2":178,"\xB3":179,"\xB4":180,"\xB5":181,"\xB6":182,"\xB7":183,"\xB8":184,"\xB9":185,"\xBA":186,"\xBB":187,"\xBC":188,"\xBD":189,"\xBE":190,"\xBF":191,"\xC0":192,"\xC1":193,"\xC2":194,"\xC3":195,"\xC4":196,"\xC5":197,"\xC6":198,"\xC7":199,"\xC8":200,"\xC9":201,"\xCA":202,"\xCB":203,"\xCC":204,"\xCD":205,"\xCE":206,"\xCF":207,"\xD0":208,"\xD1":209,"\xD2":210,"\xD3":211,"\xD4":212,"\xD5":213,"\xD6":214,"\xD7":215,"\xD8":216,"\xD9":217,"\xDA":218,"\xDB":219,"\xDC":220,"\xDD":221,"\xDE":222,"\xDF":223,"\xE0":224,"\xE1":225,"\xE2":226,"\xE3":227,"\xE4":228,"\xE5":229,"\xE6":230,"\xE7":231,"\xE8":232,"\xE9":233,"\xEA":234,"\xEB":235,"\xEC":236,"\xED":237,"\xEE":238,"\xEF":239,"\xF0":240,"\xF1":241,"\xF2":242,"\xF3":243,"\xF4":244,"\xF5":245,"\xF6":246,"\xF7":247,"\xF8":248,"\xF9":249,"\xFA":250,"\xFB":251,"\xFC":252,"\xFD":253,"\xFE":254,"\xFF":255}
var b2c={}
for(var b in c2b)b2c[c2b[b]]=b
var a2b={"A":0,"B":1,"C":2,"D":3,"E":4,"F":5,"G":6,"H":7,"I":8,"J":9,"K":10,"L":11,"M":12,"N":13,"O":14,"P":15,"Q":16,"R":17,"S":18,"T":19,"U":20,"V":21,"W":22,"X":23,"Y":24,"Z":25,"a":26,"b":27,"c":28,"d":29,"e":30,"f":31,"g":32,"h":33,"i":34,"j":35,"k":36,"l":37,"m":38,"n":39,"o":40,"p":41,"q":42,"r":43,"s":44,"t":45,"u":46,"v":47,"w":48,"x":49,"y":50,"z":51,"0":52,"1":53,"2":54,"3":55,"4":56,"5":57,"6":58,"7":59,"8":60,"9":61,"-":62,"_":63}
var b2a={}
for(var b in a2b)b2a[a2b[b]]=''+b
