if (typeof(Parser) == 'undefined'){
	Parser = {}
}
if (typeof(Jukebox) == 'undefined'){
	Jukebox = {}
}

Parser.Init = function(){
	jQuery('.genreitem').live('click', Parser.Library.genre.click);
	jQuery('.artistitem').live('click', Parser.Library.artist.click);
	jQuery('.albumitem').live('click', Parser.Library.album.click);
	jQuery('.songitem').live('click', Parser.Library.song.click);
	jQuery('#feedbackbutton').live('click', Parser.Library.button.click);
	jQuery('.libtab').live('click', Parser.Library.tab.click);
	Parser.Utils.checkCookie();
	Parser.Library.saved = Jukebox.Storage.get('savedlibs');
	if (Parser.Library.saved != null){
		for (var name in Parser.Library.saved){
			var html = jQuery("<div class=\"libtab\" id=\"libtab"+name+"\" lib=\""+name+"\" title=\"Click to load, right-click to remove\">"+name+"</div>");
			jQuery('#top').append(html);
		}
	} else {
		Parser.Library.saved = {};
	}
}
Parser.Flash = {
	getSWF : function(n) {
        var isIE = navigator.appName.indexOf("Microsoft") != -1;
        return (isIE) ? window[n] : document[n];
    },
    parseStart : function(){
    	//jQuery('#parseloader').css('visibility', 'visible');
    	jQuery('#libgenrepane').empty();
    	jQuery('#libartistpane').empty();
		jQuery('#libalbumpane').empty();
		jQuery('#libsongpane').empty();
    	var html = "<div id=\"libloader\"></div>";
    	jQuery('#libartistpane').append(html);
    },
    parseDone : function(tracks, genres, artists, albums){
    	jQuery('#libloader').remove();
		var div = Jukebox.Lightbox.create("Name That Library", true);
		var html = jQuery("<div><input type=\"text\" id=\"libinput\" class=\"lightboxelement\" /></div><div id=\"feedbackbutton\" class=\"lightboxelement\">Submit</div>");
		jQuery(div).append(html);
    	var obj = {'tracks' : tracks, 'genres' : genres, 'artists' : artists, 'albums' : albums};
    	Parser.Library.load(obj);
    	//Jukebox.Storage.set('danlib', obj);
	}
}
Parser.Library = {
	saved : {},
	currentObj : {},
	objToArray : function(obj){
		var array = [];
		for (var i in obj){
			array.push(i);
		}
		return array;
	},
	load : function(obj){
		Parser.Library.currentObj = obj;
		Parser.Library.song.array = obj.tracks;
    	Parser.Library.genre.fill(obj.genres);
    	Parser.Library.artist.fill(obj.artists);
    	Parser.Library.album.fill(obj.albums);
    	Parser.Library.song.fill(obj.tracks);
	},
	tab : {
		selected : null,
		click : function(e){
			var lib = jQuery(e.target).attr('lib');
			if (e.which == 3){
				jQuery(e.target).remove();
				delete Parser.Library.saved[lib];
				Jukebox.Storage.set('savedlibs', Parser.Library.saved);
				e.originalEvent.preventDefault();
				e.originalEvent.stopPropagation();
				return false;
			} else {
				try {
					jQuery(Parser.Library.tab.selected).removeClass('tabselected');
				} catch (e){}
				Parser.Library.tab.selected = e.target;
				jQuery(Parser.Library.tab.selected).addClass('tabselected');
				jQuery('#libgenrepane').empty();
	    		jQuery('#libartistpane').empty();
				jQuery('#libalbumpane').empty();
				jQuery('#libsongpane').empty();
				var html = "<div id=\"libloader\"></div>";
    			jQuery('#libartistpane').append(html);
				setTimeout(Parser.Library.tab.change, 100, lib);
			}
		},
		change : function(lib){
			var o = Jukebox.Storage.get(lib+'lib');
			if (o != null){
				Parser.Library.load(o);
			}
		}	
	},
	button : {
		click : function(e){
			var name = jQuery('#libinput').attr('value');
			Jukebox.Lightbox.closeLightbox();
			try {
				jQuery(Parser.Library.tab.selected).removeClass('tabselected');
			} catch (e){}
			var html = jQuery("<div class=\"libtab tabselected\" id=\"libtab"+name+"\" lib=\""+name+"\" title=\"Click to load, right-click to remove\">"+name+"</div>");
			jQuery('#top').append(html);
			Parser.Library.tab.selected = html;
			Jukebox.Storage.set(name+'lib', Parser.Library.currentObj);
			Parser.Library.saved[name] = Parser.Library.currentObj;
			Jukebox.Storage.set('savedlibs', Parser.Library.saved);
		}
	},
	genre : {
		selected : null,
		highlighted : null,
		fill : function(array){
			var html = "";
			var tf = true;
			var len = array.length;
			for (var i = 0; i < len; i++){
				if (tf == true){
					tf = false;
				} else {
					tf = true;
				}
				var escaped = array[i].replace(/&/ig, '&amp;');
				html += "<div class=\"libraryitem genreitem "+tf+"\" genre=\""+escaped+"\">"+array[i]+"</div>";
			}
			jQuery('#libgenrepane').html(html);
		},
		click : function(e){
			try {
				jQuery(Parser.Library.genre.highlighted).removeClass('libraryhighlight');
			} catch (e) {}
			Parser.Library.genre.highlighted = e.target;
			jQuery(e.target).addClass('libraryhighlight');
			var genre = jQuery(e.target).attr('genre');
			Parser.Library.genre.selected = genre;
			Parser.Library.artist.selected = null;
			Parser.Library.album.selected = null;
			setTimeout(Parser.Library.genre.request, 5, genre);
			//Parser.Library.genre.request(genre);
		},
		request : function(genre){
			jQuery('#libartistpane').empty();
			jQuery('#libalbumpane').empty();
			jQuery('#libsongpane').empty();
			var len = Parser.Library.song.array.length;
			Parser.Library.artist.temp = {};
			Parser.Library.album.temp = {};
			var songs = [];
			for (var i = 0; i < len; i++){
				var item = Parser.Library.song.array[i];
				if (item.genre == genre){
					Parser.Library.artist.temp[item.artist] = item.artist;
					Parser.Library.album.temp[item.album] = item.album;
					songs.push(item);
				}
			}
			var artists = Parser.Library.objToArray(Parser.Library.artist.temp);
			artists.sort(Parser.Utils.sort);
			var albums = Parser.Library.objToArray(Parser.Library.album.temp);
			albums.sort(Parser.Utils.sort);
			Parser.Library.artist.fill(artists);
			Parser.Library.album.fill(albums);
			Parser.Library.song.fill(songs);
		}
	},
	artist : {
		selected : null,
		highlighted : null,
		temp : {},
		fill : function(array){
			var html = "";
			var tf = true;
			var len = array.length;
			for (var i = 0; i < len; i++){
				if (tf == true){
					tf = false;
				} else {
					tf = true;
				}
				var escaped = array[i].replace(/&/ig, '&amp;');
				html += "<div class=\"libraryitem artistitem "+tf+"\" artist=\""+escaped+"\">"+array[i]+"</div>";
			}
			jQuery('#libartistpane').html(html);
		},
		click : function(e){
			try {
				jQuery(Parser.Library.artist.highlighted).removeClass('libraryhighlight');
			} catch (e) {}
			Parser.Library.artist.highlighted = e.target;
			jQuery(e.target).addClass('libraryhighlight');
			var artist = jQuery(e.target).attr('artist');
			Parser.Library.artist.selected = artist;
			Parser.Library.album.selected = null;
			Parser.Library.artist.request(artist);
		},
		request : function(artist){
			jQuery('#libalbumpane').empty();
			jQuery('#libsongpane').empty();
			var len = Parser.Library.song.array.length;
			Parser.Library.album.temp = {};
			var songs = [];
			for (var i = 0; i < len; i++){
				var item = Parser.Library.song.array[i];
				if (item.artist == artist){
					Parser.Library.album.temp[item.album] = item.album;
					songs.push(item);
				}
			}
			var albums = Parser.Library.objToArray(Parser.Library.album.temp);
			albums.sort(Parser.Utils.sort);
			Parser.Library.album.fill(albums);
			Parser.Library.song.fill(songs);
		}
	},
	album : {
		selected : null,
		highlighted : null,
		temp : {},
		fill : function(array){
			var html = "";
			var tf = true;
			var len = array.length;
			for (var i = 0; i < len; i++){
				if (tf == true){
					tf = false;
				} else {
					tf = true;
				}
				var escaped = array[i].replace(/&/ig, '&amp;');
				html += "<div class=\"libraryitem albumitem "+tf+"\" album=\""+escaped+"\">"+array[i]+"</div>";
			}
			jQuery('#libalbumpane').html(html);
		},
		click : function(e){
			try {
				jQuery(Parser.Library.album.highlighted).removeClass('libraryhighlight');
			} catch (e) {}
			Parser.Library.album.highlighted = e.target;
			jQuery(e.target).addClass('libraryhighlight');
			var album = jQuery(e.target).attr('album');
			Parser.Library.album.selected = album;
			Parser.Library.album.request(album);
		},
		request : function(album){
			jQuery('#libsongpane').empty();
			var len = Parser.Library.song.array.length;
			var songs = [];
			for (var i = 0; i < len; i++){
				var item = Parser.Library.song.array[i];
				if (item.album == album){
					songs.push(item);
				}
			}
			Parser.Library.song.fill(songs);
		}
	},
	song : {
		queue : 0,
		qid : null,
		array : [],
		temp : {},
		qids : {},
		fill : function(array){
			//console.log(array)
			var html = "";
			var tf = true;
			var len = array.length;
			for (var i = 0; i < len; i++){
				if (tf == true){
					tf = false;
				} else {
					tf = true;
				}
				var qid = hex_md5(array[i].artist+array[i].album+array[i].title);
				html += "<div class=\"libraryitem songitem librarysongitem "+tf+"\" queue=\""+i+"\" track=\""+array[i].title+"\" genre=\""+array[i].genre+"\" artist=\""+array[i].artist+"\" album=\""+array[i].album+"\" id=\"song"+qid+"\" qid=\""+qid+"\">"+array[i].title+"</div>";
			}
			jQuery('#libsongpane').html(html);
			Parser.Library.queue.change(Parser.Library.queue.song);
		},
		click : function(e){
			Parser.Library.song.qid = jQuery(e.target).attr('qid');
			Parser.Library.song.queue = parseInt(jQuery(e.target).attr('queue'));
			var total = SPAPI.total();
			SPAPI.queue(total+Parser.Library.song.queue);
			if (Parser.Library.song.qids[Parser.Library.song.qid] == undefined){
			
			
			
				var divs = jQuery('#libsongpane > div');
				var len = divs.length;
				for (var i = 0; i < len; i++){
					var div = divs[i];
					var queue = parseInt(jQuery(div).attr('queue'));
					var genre = jQuery(div).attr('genre');
					var artist = jQuery(div).attr('artist');
					var album = jQuery(div).attr('album');
					var track = jQuery(div).attr('track');
					var qid = jQuery(div).attr('qid');
					
					Parser.Library.song.request(artist, album, track, qid);
					
					//console.log(i, Parser.Library.song.qids[qid])
				}
				SPAPI.skip(total+Parser.Library.song.queue);
			} else {
				var c = -1;
				for (var i in Parser.Library.song.qids){
					c++;
					if (Parser.Library.song.qid == i){
						SPAPI.skip(c);
					}
				}
			}
		},
		request : function(artist, album, track, qid){
			if (Parser.Library.song.qids[qid] == undefined){
				Parser.Library.song.qids[qid] = qid;
				SPAPI.add(track, artist, album, null, "Playdar", null, false);
			} 
		},
		response : function(obj){
			
		}
	},
	queue : {
		selectedDiv : null,
		song : {},
		change : function(obj){
			Parser.Library.queue.song = obj;
			var divs = jQuery('#libsongpane > div');
			var len = divs.length;
			Parser.Library.queue.removeClass();
			for (var i = 0; i < len; i++){
				if (jQuery(divs[i]).text() == obj.songTitle){
					Parser.Library.queue.selectedDiv = jQuery(divs[i]);
				}
			}
			Parser.Library.queue.addClass();
		},
		addClass : function(){
			try {
				Parser.Library.queue.selectedDiv.addClass('librarysongitemselected');
			} catch(e){}	
		},
		removeClass : function(){
			try {
				Parser.Library.queue.selectedDiv.removeClass('librarysongitemselected');
			} catch(e){}
		}
	}
}
/*Parser.Playdar = {
	resolve : function(json){
		item = json.results[0];
		//console.log(item, item.track)
		SPAPI.add(item.track, item.artist, item.album, streampadPlayer.Playdar.url+"sid/"+item.sid, "foo", null, false);
		var total = SPAPI.total();
		if (json.qid == Parser.Library.song.qid){
			SPAPI.skip(total);
		}
	}
}*/
Parser.Script = function() {
	this.data = null;
	this.feedType = null;
	this.url = null;
	this.callback = null;
	this.json = null;
	this.createNew = function(that){
		Parser.ScriptIndex++;
		this.callback = 'a'+Parser.ScriptIndex;
		Parser.ScriptRequestors[this.callback] = {
			obj : this,
			callback : function(json){
				this.obj.json = json;
				Parser.ScriptRequestors[this.obj.callback] = null;
				jQuery(this.obj).trigger('onComplete');
			}
		}
	};
	this.get = function(url, callbackkey, feedType, data){
		this.url = encodeURIComponent(url);
		this.data = data;
		this.feedType = feedType;
		this.createNew();
		jQuery.getScript(url+"&"+callbackkey+"=Parser.ScriptRequestors."+this.callback+".callback");
	}
}
Parser.ScriptRequestors = {};
Parser.ScriptIndex = 0;
Parser.Utils = {
	setCookie: function (name, value, days) {
		//console.log(name, value, days);
        var expires;
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days*24*60*60*1000));
            expires = "; expires=" + date.toGMTString();
        } else {
            expires = "";
        }
        document.cookie = name + "=" + value + expires + "; path=/";
    },
    getCookie: function (name) {
        var namekey = name + "=";
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length;i++) {
            var c = cookies[i];
            while (c.charAt(0) == ' ') {
                c = c.substring(1, c.length);
            }
            if (c.indexOf(namekey) === 0) {
                return c.substring(namekey.length, c.length);
            }
        }
        return null;
    },
    deleteCookie: function (name) {
        Parser.Utils.setCookie(name, "", -1);
    },
    checkCookie : function(){
    	var token = Parser.Utils.getCookie('Playdar.Auth');
		if (token != null){
			streampadPlayer.Playdar.token = token;
		}
    },
    sort : function(a,b) {
		return (b < a) - (a < b);
	}
}
onStreampadPlayerReady = function(){
	SPAPI.start();
	SPAPI.addEventListener('onSongChange', Parser.Library.queue.change);
}
jQuery(document).ready(Parser.Init);
/*JSON FUNCTIONS
//////////////////////////////////////////////////////////////////////////*/
var JSON=JSON||{};(function(){function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==="string"){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}if(typeof JSON.stringify!=="function"){JSON.stringify=function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "}}else{if(typeof space==="string"){indent=space}}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("JSON.stringify")}return str("",{"":value})}}if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}}());
////////////////////////////////////////////////////////////////////////////
/*
     END JSON FUNCTIONS
//////////////////////////////////////////////////////////////////////////*/
/*MD5 FUNCTIONS
//////////////////////////////////////////////////////////////////////////*/
var hexcase=0;var b64pad="";function hex_md5(a){return rstr2hex(rstr_md5(str2rstr_utf8(a)))}function b64_md5(a){return rstr2b64(rstr_md5(str2rstr_utf8(a)))}function any_md5(a,b){return rstr2any(rstr_md5(str2rstr_utf8(a)),b)}function hex_hmac_md5(a,b){return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a),str2rstr_utf8(b)))}function b64_hmac_md5(a,b){return rstr2b64(rstr_hmac_md5(str2rstr_utf8(a),str2rstr_utf8(b)))}function any_hmac_md5(a,c,b){return rstr2any(rstr_hmac_md5(str2rstr_utf8(a),str2rstr_utf8(c)),b)}function md5_vm_test(){return hex_md5("abc").toLowerCase()=="900150983cd24fb0d6963f7d28e17f72"}function rstr_md5(a){return binl2rstr(binl_md5(rstr2binl(a),a.length*8))}function rstr_hmac_md5(c,f){var e=rstr2binl(c);if(e.length>16){e=binl_md5(e,c.length*8)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=binl_md5(a.concat(rstr2binl(f)),512+f.length*8);return binl2rstr(binl_md5(d.concat(g),512+128))}function rstr2hex(c){try{hexcase}catch(g){hexcase=0}var f=hexcase?"0123456789ABCDEF":"0123456789abcdef";var b="";var a;for(var d=0;d<c.length;d++){a=c.charCodeAt(d);b+=f.charAt((a>>>4)&15)+f.charAt(a&15)}return b}function rstr2b64(c){try{b64pad}catch(h){b64pad=""}var g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b="";var a=c.length;for(var f=0;f<a;f+=3){var k=(c.charCodeAt(f)<<16)|(f+1<a?c.charCodeAt(f+1)<<8:0)|(f+2<a?c.charCodeAt(f+2):0);for(var d=0;d<4;d++){if(f*8+d*6>c.length*8){b+=b64pad}else{b+=g.charAt((k>>>6*(3-d))&63)}}}return b}function rstr2any(m,c){var b=c.length;var l,f,a,n,e;var k=Array(Math.ceil(m.length/2));for(l=0;l<k.length;l++){k[l]=(m.charCodeAt(l*2)<<8)|m.charCodeAt(l*2+1)}var h=Math.ceil(m.length*8/(Math.log(c.length)/Math.log(2)));var g=Array(h);for(f=0;f<h;f++){e=Array();n=0;for(l=0;l<k.length;l++){n=(n<<16)+k[l];a=Math.floor(n/b);n-=a*b;if(e.length>0||a>0){e[e.length]=a}}g[f]=n;k=e}var d="";for(l=g.length-1;l>=0;l--){d+=c.charAt(g[l])}return d}function str2rstr_utf8(c){var b="";var d=-1;var a,e;while(++d<c.length){a=c.charCodeAt(d);e=d+1<c.length?c.charCodeAt(d+1):0;if(55296<=a&&a<=56319&&56320<=e&&e<=57343){a=65536+((a&1023)<<10)+(e&1023);d++}if(a<=127){b+=String.fromCharCode(a)}else{if(a<=2047){b+=String.fromCharCode(192|((a>>>6)&31),128|(a&63))}else{if(a<=65535){b+=String.fromCharCode(224|((a>>>12)&15),128|((a>>>6)&63),128|(a&63))}else{if(a<=2097151){b+=String.fromCharCode(240|((a>>>18)&7),128|((a>>>12)&63),128|((a>>>6)&63),128|(a&63))}}}}}return b}function str2rstr_utf16le(b){var a="";for(var c=0;c<b.length;c++){a+=String.fromCharCode(b.charCodeAt(c)&255,(b.charCodeAt(c)>>>8)&255)}return a}function str2rstr_utf16be(b){var a="";for(var c=0;c<b.length;c++){a+=String.fromCharCode((b.charCodeAt(c)>>>8)&255,b.charCodeAt(c)&255)}return a}function rstr2binl(b){var a=Array(b.length>>2);for(var c=0;c<a.length;c++){a[c]=0}for(var c=0;c<b.length*8;c+=8){a[c>>5]|=(b.charCodeAt(c/8)&255)<<(c%32)}return a}function binl2rstr(b){var a="";for(var c=0;c<b.length*32;c+=8){a+=String.fromCharCode((b[c>>5]>>>(c%32))&255)}return a}function binl_md5(p,k){p[k>>5]|=128<<((k)%32);p[(((k+64)>>>9)<<4)+14]=k;var o=1732584193;var n=-271733879;var m=-1732584194;var l=271733878;for(var g=0;g<p.length;g+=16){var j=o;var h=n;var f=m;var e=l;o=md5_ff(o,n,m,l,p[g+0],7,-680876936);l=md5_ff(l,o,n,m,p[g+1],12,-389564586);m=md5_ff(m,l,o,n,p[g+2],17,606105819);n=md5_ff(n,m,l,o,p[g+3],22,-1044525330);o=md5_ff(o,n,m,l,p[g+4],7,-176418897);l=md5_ff(l,o,n,m,p[g+5],12,1200080426);m=md5_ff(m,l,o,n,p[g+6],17,-1473231341);n=md5_ff(n,m,l,o,p[g+7],22,-45705983);o=md5_ff(o,n,m,l,p[g+8],7,1770035416);l=md5_ff(l,o,n,m,p[g+9],12,-1958414417);m=md5_ff(m,l,o,n,p[g+10],17,-42063);n=md5_ff(n,m,l,o,p[g+11],22,-1990404162);o=md5_ff(o,n,m,l,p[g+12],7,1804603682);l=md5_ff(l,o,n,m,p[g+13],12,-40341101);m=md5_ff(m,l,o,n,p[g+14],17,-1502002290);n=md5_ff(n,m,l,o,p[g+15],22,1236535329);o=md5_gg(o,n,m,l,p[g+1],5,-165796510);l=md5_gg(l,o,n,m,p[g+6],9,-1069501632);m=md5_gg(m,l,o,n,p[g+11],14,643717713);n=md5_gg(n,m,l,o,p[g+0],20,-373897302);o=md5_gg(o,n,m,l,p[g+5],5,-701558691);l=md5_gg(l,o,n,m,p[g+10],9,38016083);m=md5_gg(m,l,o,n,p[g+15],14,-660478335);n=md5_gg(n,m,l,o,p[g+4],20,-405537848);o=md5_gg(o,n,m,l,p[g+9],5,568446438);l=md5_gg(l,o,n,m,p[g+14],9,-1019803690);m=md5_gg(m,l,o,n,p[g+3],14,-187363961);n=md5_gg(n,m,l,o,p[g+8],20,1163531501);o=md5_gg(o,n,m,l,p[g+13],5,-1444681467);l=md5_gg(l,o,n,m,p[g+2],9,-51403784);m=md5_gg(m,l,o,n,p[g+7],14,1735328473);n=md5_gg(n,m,l,o,p[g+12],20,-1926607734);o=md5_hh(o,n,m,l,p[g+5],4,-378558);l=md5_hh(l,o,n,m,p[g+8],11,-2022574463);m=md5_hh(m,l,o,n,p[g+11],16,1839030562);n=md5_hh(n,m,l,o,p[g+14],23,-35309556);o=md5_hh(o,n,m,l,p[g+1],4,-1530992060);l=md5_hh(l,o,n,m,p[g+4],11,1272893353);m=md5_hh(m,l,o,n,p[g+7],16,-155497632);n=md5_hh(n,m,l,o,p[g+10],23,-1094730640);o=md5_hh(o,n,m,l,p[g+13],4,681279174);l=md5_hh(l,o,n,m,p[g+0],11,-358537222);m=md5_hh(m,l,o,n,p[g+3],16,-722521979);n=md5_hh(n,m,l,o,p[g+6],23,76029189);o=md5_hh(o,n,m,l,p[g+9],4,-640364487);l=md5_hh(l,o,n,m,p[g+12],11,-421815835);m=md5_hh(m,l,o,n,p[g+15],16,530742520);n=md5_hh(n,m,l,o,p[g+2],23,-995338651);o=md5_ii(o,n,m,l,p[g+0],6,-198630844);l=md5_ii(l,o,n,m,p[g+7],10,1126891415);m=md5_ii(m,l,o,n,p[g+14],15,-1416354905);n=md5_ii(n,m,l,o,p[g+5],21,-57434055);o=md5_ii(o,n,m,l,p[g+12],6,1700485571);l=md5_ii(l,o,n,m,p[g+3],10,-1894986606);m=md5_ii(m,l,o,n,p[g+10],15,-1051523);n=md5_ii(n,m,l,o,p[g+1],21,-2054922799);o=md5_ii(o,n,m,l,p[g+8],6,1873313359);l=md5_ii(l,o,n,m,p[g+15],10,-30611744);m=md5_ii(m,l,o,n,p[g+6],15,-1560198380);n=md5_ii(n,m,l,o,p[g+13],21,1309151649);o=md5_ii(o,n,m,l,p[g+4],6,-145523070);l=md5_ii(l,o,n,m,p[g+11],10,-1120210379);m=md5_ii(m,l,o,n,p[g+2],15,718787259);n=md5_ii(n,m,l,o,p[g+9],21,-343485551);o=safe_add(o,j);n=safe_add(n,h);m=safe_add(m,f);l=safe_add(l,e)}return Array(o,n,m,l)}function md5_cmn(h,e,d,c,g,f){return safe_add(bit_rol(safe_add(safe_add(e,h),safe_add(c,f)),g),d)}function md5_ff(g,f,k,j,e,i,h){return md5_cmn((f&k)|((~f)&j),g,f,e,i,h)}function md5_gg(g,f,k,j,e,i,h){return md5_cmn((f&j)|(k&(~j)),g,f,e,i,h)}function md5_hh(g,f,k,j,e,i,h){return md5_cmn(f^k^j,g,f,e,i,h)}function md5_ii(g,f,k,j,e,i,h){return md5_cmn(k^(f|(~j)),g,f,e,i,h)}function safe_add(a,d){var c=(a&65535)+(d&65535);var b=(a>>16)+(d>>16)+(c>>16);return(b<<16)|(c&65535)}function bit_rol(a,b){return(a<<b)|(a>>>(32-b))};
////////////////////////////////////////////////////////////////////////////
/*
     END MD5 FUNCTIONS
//////////////////////////////////////////////////////////////////////////*/