By lazyttrick
Has 12 other scripts.
// ==UserScript==
// @name Userscripts Updater
// @namespace meh
// @description Easy way to check for scripts updates. Automatic checking, compare changes(diff).
// @include http://*
// ==/UserScript==
//place menu at tools->greasemonkey
GM_registerMenuCommand('Userscripts Updater: search updates', updateScripts);
GM_registerMenuCommand('Userscripts Updater: show options', options);
if(location.href.search(/userscripts.org/)<0 && !GM_getValue("optionAutoSearch"))
return;
var div, spanOutdateds, spanUpdateds, li, a, divsource, divoptions, css;
var outdateds=0, spanCount, totalScripts, contScripts=0, notfound=0;
var imgCompare, imgUpdate, imgHide, imgRemove, imgZombie;
//CSS
getTag('head')[0].appendChild(getCSS());
//images
images();
//place menu at Userscripts.org
if(location.href.search(/userscripts.org/) > -1)
{
//add update link.
a = createElement('a', {href:"javascript:void(0)"}, 'click updateScripts false', 'Update scripts');
li = createElement('li');
li.appendChild(a);
if(!getId('mainmenu'))
return;
getId('mainmenu').appendChild(li);
//add options link
a = createElement('a', {href:"javascript:void(0)", style:"text-decoration:none; font-size:x-small"}, 'click options false', ' (options)');
li.appendChild(a);
}
//add event to install button
if(location.href.search(/userscripts.org\/scripts\/show\//) > -1)
{
var p = getId('install_script');
var a = getTag('a', p)[0];
a.addEventListener('click', register, false);
}
//Auto search time?
if(GM_getValue("optionAutoSearch"))
{
var lastSearch;
lastSearch = parseInt(GM_getValue("optionAutoSearchLast"));
if(!lastSearch){
//first search
GM_setValue("optionAutoSearchLast", ""+new Date().getTime());
updateScripts();
}else{
//check time elapsed from last search
var now = parseInt(new Date().getTime());
var searchFreq = parseInt(GM_getValue("optionAutoSearchFreq"));
//search update
if(now - lastSearch > searchFreq){
GM_setValue("optionAutoSearchLast", ""+now);
updateScripts();
}
}
}
function updateScripts(evt)
{
var id=null, time=null, info;
//if Updater is not registered, do it
if( getValueIndex(26062,"info") < 0 ){
register(null);//event==null will be interpreted as self register...
}
//in case there's no script registered...
if(!GM_getValue('info')){
if(evt)
alert("No scripts added to updater yet. To add a script click install button at the script's page.");
return;
}
//div result
div = createElement('div', {style:"background-color:#FFFFAA; position:absolute; top:3px; right:3px; min-width:250px; min-height:50px; max-width:50%; padding:5px; font-size:small; text-align:left; z-index:10000"});
spanCount = createElement('span',{style:"color:#749EC9; font-weight:bold"},null,'Searching updates...');
div.appendChild(spanCount);
div.appendChild(createElement('br'));
spanOutdateds = createElement('span');
div.appendChild(spanOutdateds);
spanUpdateds = createElement('span', {style:"font-size:small; color:#aaaaaa"});
div.appendChild(spanUpdateds);
getTag('body')[0].appendChild(div);
//close link
div.appendChild(createElement('a', {href:"javascript:void(0)", style:"position:absolute; right: 3px; top: 3px; font-size:x-small", class:"USO_outdatedLink"}, "click close false", "close"));
//get scripts info
info = GM_getValue('info');
if(!info)
return;
info = info.split(';');
totalScripts = info.length;
//check each script
for(var i=0; i<info.length; i++)
{
id = info[i].split('=')[0];
time = info[i].split('=')[1];
request(id, id, time);
}
//set last update info
GM_setValue("optionAutoSearchLast", ""+new Date().getTime());
}
function options()
{
var spanAutoCheck = createElement('span', {id:"spanAutoCheck", style:"font-size:small;"});
var spanDiff = createElement('span', {id:"spanDiff", style:"font-size:small;"});
//div options
divoptions = createElement('div', {style:"text-align:left; background-color:#FFFF77; position:absolute; top:3px; right:3px; min-width:250px; min-height:50px; padding:5px; font-size:small; color:#222222; z-index:10002"});
getTag('body')[0].appendChild(divoptions);
divoptions.appendChild(spanAutoCheck);
divoptions.appendChild(spanDiff);
//checkbox auto search updates
spanAutoCheck.appendChild(createElement('input', {id:"cboptionautosearch", type:"checkbox"}, 'click optionAutosearchEvtCheckbox false'));
spanAutoCheck.appendChild(createElement('span', '', '', 'Automatically search updates'));
//select auto-check frequency
spanAutoCheck.appendChild(createElement('br'));
spanAutoCheck.appendChild(createElement('span',{style:"margin-left:20px;"},'',' Every: '));
spanAutoCheck.appendChild(createElement('select', {id:"comboOptionAutoCheck", style:"font-size:x-small;"}));
var sel = getId('comboOptionAutoCheck');
for(var i=10; i<61; i+=10){//value attribute in miliseconds
sel.appendChild(createElement('option', {value:(i*60000)}, '', i+' minutes'));
}
for(var i=2; i<25; i++){
sel.appendChild(createElement('option', {value:(i*3600000)}, '', i+' hours'));
}
for(var i=2; i<8; i++){
sel.appendChild(createElement('option', {value:(i*86400000)}, '', i+' days'));
}
//Option icons
spanDiff.appendChild(createElement('br'));
spanDiff.appendChild(createElement('br'));
spanDiff.appendChild( createElement('input', {type:"checkbox", id:"checkboxIcons"}));
spanDiff.appendChild(createElement('span','','',"Use icons"));
getId("checkboxIcons").checked = GM_getValue("icons");
//compare(diff) options
var titles = GM_getValue("titles"), id, title;
if(titles){
spanDiff.appendChild(createElement('span', '', '', "<br><br>Enable compare changes for:<br>"));
titles = titles.split(';');
titles.sort(function(a,b){ return ((a.split('=')[1] < b.split('=')[1]) ? -1 : 1) });
for(var i=0; i<titles.length; i++){
id = titles[i].split('=')[0];
title = unescape(titles[i].split('=')[1]);
spanDiff.appendChild( createElement('span', null, null, " "));
spanDiff.appendChild( createElement('input', {type:"checkbox", title:"enable/disable compare changes", id:"checkboxDiff"+id}));
spanDiff.appendChild( createElement('a', {class:"USO_outdatedLink", target:"_blank", href:"http://userscripts.org/scripts/show/"+id, style:"font-size:x-small;"}, null, title+"<br>"));
getId("checkboxDiff"+id).checked = ((getValueForId(id,"optionDiff")=="1") ? true : false);
}
}
//set visual state of options
if(!GM_getValue("optionAutoSearch"))
{
spanAutoCheck.style.color = "#aaaaaa";
getId("comboOptionAutoCheck").setAttribute('disabled','disabled');
}
else
{
getId("cboptionautosearch").checked = GM_getValue("optionAutoSearch");
getId("comboOptionAutoCheck").value = GM_getValue("optionAutoSearchFreq");
//time until next auto search
if(GM_getValue("optionAutoSearchLast"))
{
var now, searchFreq, nextSearch, amount, days, hours, mins, secs;
now = new Date();
searchFreq = parseInt(GM_getValue("optionAutoSearchFreq"));
nextSearch = new Date();
nextSearch.setTime(parseInt(GM_getValue("optionAutoSearchLast")) + searchFreq);
//From http://www.ricocheting.com/js/countdown.html
amount = Math.floor((nextSearch - now)/1000);//kill the "milliseconds" so just secs
days = Math.floor(amount/86400);//days
amount = amount%86400;
hours = Math.floor(amount/3600);//hours
amount = amount%3600;
mins = Math.floor(amount/60);//minutes
amount = amount%60;
secs = Math.floor(amount);//seconds
spanAutoCheck.appendChild(createElement('br'));
spanAutoCheck.appendChild( createElement('span',{style:"margin-left:20px; font-size:x-small; color:#aaaaaa;"}, '', "(Next search in "+((days>0)?(days+" days, "):"") + ((hours>0)?(hours+" hours, "):"") + ((mins>0)?(mins+" mins, "):"") +secs+" secs)"));
}
}
//Ok 'button'
divoptions.appendChild(createElement('br'));
divoptions.appendChild(createElement('span',{id:"spanOptionsOk"}));
getId("spanOptionsOk").appendChild(createElement('a', {href:"javascript:void(0)", class:"USO_outdatedLink"}, 'click saveOptions false', 'save'));
//close link
getId('spanOptionsOk').appendChild(createElement('span','','',' '));
getId('spanOptionsOk').appendChild(createElement('a', {href:"javascript:void(0)", class:"USO_outdatedLink"}, "click closeoptions false", "cancel"));
}
function optionAutosearchEvtCheckbox(evt)
{
//auto-search
if(getId("cboptionautosearch").checked){
getId("spanAutoCheck").style.color = "#222222";
getId("comboOptionAutoCheck").removeAttribute('disabled');
}else{
getId("spanAutoCheck").style.color = "#aaaaaa";
getId("comboOptionAutoCheck").setAttribute('disabled','disabled');
}
}
function saveOptions(evt)
{
//auto-search
if(getId("cboptionautosearch").checked){
GM_setValue("optionAutoSearch",true);
GM_setValue("optionAutoSearchFreq", getId("comboOptionAutoCheck").value);
//set last update info
if(!GM_getValue("optionAutoSearchLast"))
GM_setValue("optionAutoSearchLast", ""+new Date().getTime());
}else{
GM_setValue("optionAutoSearch",false);
}
//icons
GM_setValue("icons",getId("checkboxIcons").checked);
//compare
var checkboxes = getTag('input', divoptions);
for(var i=0; i<checkboxes.length; i++)
{
if(checkboxes[i].getAttribute("id").search("checkboxDiff") > -1)
{
var id = checkboxes[i].getAttribute('id').replace(/\D/g,'');
if(checkboxes[i].checked)
{
setValueForId(id, 1, "optionDiff");
//store source if empty
if(!GM_getValue("source"+id)){
var scope = new Scope({id:id, func:storeSource});
GM_xmlhttpRequest({
method: 'GET',
url: "http://userscripts.org/scripts/review/"+id+"?format=txt",
onload: scope.callback
});
}
}else{
setValueForId(id, 0, "optionDiff");
//empty source if stored
if( GM_getValue("source"+id) ){
GM_setValue("source"+id, "");
}
}
}
}
closeoptions();
}
function storeSource(request)
{
GM_setValue("source"+this.id, request.responseText);
}
//http://userscripts.org/forums/1/topics/193
function Scope(o) {
var scope = this;
for (a in o)
this[a] = o[a];
this.callback = function(r) {scope.func.call(scope, r);};
}
function closeoptions(evt)
{
divoptions.parentNode.removeChild(divoptions);
}
function close()
{
div.parentNode.removeChild(div);
outdateds=0;
contScripts=0;
notfound=0;
}
function closesource()
{
divsource.parentNode.removeChild(divsource);
}
function request(url, id, time)
{
GM_xmlhttpRequest({
method: 'GET',
url: 'http://userscripts.org/scripts/show/'+id,
onload: function(responseDetails) {
checkDate(responseDetails, id, time);
}
});
}
function debug(str, node)
{
if(!node)
node = getTag('body')[0];
node.appendChild(createElement('br'));
node.appendChild(createElement('span',null,null,str));
}
function checkDate(resp, id, time)
{
var txt, error404, aux, img, a;
//extract last update info from: <h6>Last updated</h6> <p>Apr 26, 2008.</p> <h6>Tags</h6>
try
{
txt = resp.responseText.match(/Last\supdated[\s\S]+First\suploaded/)[0].replace(/Last\supdated/,'').replace(/First\suploaded/,'');
}
catch(e)
{
var aux = resp.responseText.match(/First\s+uploaded[\s\S]+Tags/);
if(!aux)
{
//script doesn't exist anymore?
var s = createElement('span',{id:'USO_TITLE_'+title});
spanUpdateds.appendChild(s);
s.appendChild( createElement('a', {target:"_blank", href:"http://userscripts.org/scripts/show/"+id, class:"USO_updatedLink", style:"text-decoration:none;"}, null, ' Script '+id+' not found '));
//no icons
if(!GM_getValue('icons'))
{
//remove
s.appendChild( createElement('span',null,null," – "));
s.appendChild( createElement('a', {href:"javascript:void(0)", class:"USO_updatedLink", title:"remove from updater", id:id, style:"color:#aaaaaa"}, 'click unregister false', 'remove'));
}
else//icons
{
//s.appendChild( createElement('span',null,null," "));
img = imgZombie.cloneNode(false);
a = createElement('a', {title:"braiiins"});
a.appendChild(img);
s.appendChild(a);
//remove
img = imgRemove.cloneNode(false);
img.setAttribute('id',id);
a = createElement('a', {href:"javascript:void(0)", id:id, title:"remove zombie from updater"}, 'click unregister false');
a.appendChild(img);
s.appendChild(a);
}
s.appendChild( createElement('br'));
contScripts++;
notfound++;
if(contScripts==totalScripts)
{
//summary message
if(outdateds==0)
spanCount.innerHTML = 'No updates were found.';
else
spanCount.innerHTML = outdateds+' update'+(outdateds>1?'s':'')+' found.'
if(notfound > 0)
spanCount.innerHTML += '<br>' + notfound + ' script' + (notfound>1?'s':'') + ' not found.';
}
return;
}
else
txt = aux[0].replace(/First\s+uploaded/,'').replace(/Tags/,'');//<h6>First uploaded</h6> <p>Apr 26, 2008.</p> <h6>Tags</h6>
}
txt = txt.replace(/(\<[^\>]+\>)/g,'');//remove tags
txt = txt.replace(/^\s+/,'').replace(/\s+$/,'');//remove spaces around
txt = txt.replace(/\./,'');
var lastUpdate = new Date();
// last update info format
if( txt.search(/\,/) >-1 )//"May 1, 2007"
lastUpdate.setTime( Date.parse(txt) );
else{
//alert(txt);
if( txt.search(/minute/) >-1 )//"12 minutes ago."
lastUpdate.setMinutes( lastUpdate.getMinutes() - parseInt(txt.match(/\d+/)[0]));
else if( txt.search(/hour/) >-1 )//"12 hours ago."
lastUpdate.setHours( lastUpdate.getHours() - parseInt(txt.match(/\d+/)[0]));
}
//mount list
//title
title = resp.responseText.match(/\<title\>[\s\S]+\<\/title\>/)[0];
title = title.replace(/(\<[^\>]+\>)/g,'');//remove tags
title = unescape(escape(title.replace(/Userscripts\.org$/,'')).replace(/%26ndash%3B/,'')).replace(/\s+$/,'');
aux = getValueForId(id,"titles");
if(!aux || title!=aux){//store title if not stored or changed
setValueForId(id, escape(title), "titles");
}
//append outdated scripts
if(lastUpdate.getTime() > time)
{
var s = createElement('span',{id:'USO_TITLE_'+title});
spanOutdateds.appendChild(s);
//title
s.appendChild( createElement('a', {target:"_blank", href:"http://userscripts.org/scripts/show/"+id, class:"USO_outdatedLink", title:"home"}, null, title));
//no icons
if(!GM_getValue('icons'))
{
s.appendChild( createElement('span',null,null," – "));
//compare
if(getValueForId(id,"optionDiff")=="1" && GM_getValue("source"+id)){
s.appendChild( createElement('a', {href:"javascript:void(0)", title:"compare changes", id:id, class:"USO_outdatedLink"}, 'click compare false', 'compare'));
s.appendChild( createElement('span', null, null, " | "));
}
//update
s.appendChild( createElement('a', {href:"http://userscripts.org/scripts/source/"+id+".user.js", class:"USO_outdatedLink"}, 'click register false', 'update'));
s.appendChild( createElement('span', null, null, " | "));
//hide
s.appendChild( createElement('a', {href:"javascript:void(0)", title:"hide until next modification", id:id, class:"USO_outdatedLink"}, 'click hide false', 'hide'));
s.appendChild( createElement('span', null, null, " | "));
//remove
s.appendChild( createElement('a', {href:"javascript:void(0)", title:"remove from updater", id:id, class:"USO_outdatedLink"}, 'click unregister false', 'remove'));
}
else //icons
{
s.appendChild( createElement('span', null, null, " "));
//compare
if(getValueForId(id,"optionDiff")=="1" && GM_getValue("source"+id)){
img = imgCompare.cloneNode(false);
img.setAttribute('id',id);
a = createElement('a', { href:"javascript:void(0)", id:id, title:"compare"}, 'click compare false');
a.appendChild(img);
s.appendChild(a);
s.appendChild( createElement('span', null, null, " "));
}
//update
img = imgUpdate.cloneNode(false);
img.setAttribute('id',id);
a = createElement('a', {href:"http://userscripts.org/scripts/source/"+id+".user.js", id:id, title:"update"}, 'click register false');
a.appendChild(img);
s.appendChild(a);
s.appendChild( createElement('span', null, null, " "));
//hide
img = imgHide.cloneNode(false);
img.setAttribute('id',id);
a = createElement('a', {href:"javascript:void(0)", id:id, title:"hide"}, 'click hide false');
a.appendChild(img);
s.appendChild(a);
s.appendChild( createElement('span', null, null, " "));
//remove
img = imgRemove.cloneNode(false);
img.setAttribute('id',id);
a = createElement('a', {href:"javascript:void(0)", id:id, title:"remove"}, 'click unregister false');
a.appendChild(img);
s.appendChild(a);
}
s.appendChild( createElement('br'));
//count outdated scripts
outdateds++;
}
else
{
if(location.href.search(/userscripts.org/) > -1)// && !GM_getValue("optionAutoSearch"))
{
//append updated scripts
var s = createElement('span',{id:'USO_TITLE_'+title})
spanUpdateds.appendChild(s);
s.appendChild( createElement('a', {target:"_blank", href:"http://userscripts.org/scripts/show/"+id, class:"USO_updatedLink", title:"home", style:"text-decoration:none;"}, null, title));
//no icons
if(!GM_getValue('icons'))
{
//remove
s.appendChild( createElement('span',null,null," – "));
s.appendChild( createElement('a', {href:"javascript:void(0)", class:"USO_updatedLink", title:"remove from updater", id:id, style:"color:#aaaaaa"}, 'click unregister false', 'remove'));
}
else//icons
{
s.appendChild( createElement('span',null,null," "));
//remove
img = imgRemove.cloneNode(false);
img.setAttribute('id',id);
a = createElement('a', {id:id, title:"remove from updater"}, 'click unregister false');
a.appendChild(img);
s.appendChild(a);
}
s.appendChild( createElement('br'));
}
}
contScripts++;
if(contScripts==totalScripts){//finished search
//sorting
var updateds = totalScripts - outdateds;
if(updateds > 0)
sortScripts(spanUpdateds);
if(outdateds > 0)
sortScripts(spanOutdateds);
//summary message
if(outdateds==0)
spanCount.innerHTML = 'No updates were found.';
else
spanCount.innerHTML = outdateds+' update'+(outdateds>1?'s':'')+' found.';
if(notfound > 0)
spanCount.innerHTML += '<br>' + notfound + ' script' + (notfound>1?'s':'') + ' not found.';
}
}
function sortScripts(container)
{
var spans = new Array(), titles = new Array();
var allSpans = getTag('span',container);
for(var i=0; i<allSpans.length; i++){
if(allSpans[i].getAttribute('id') && allSpans[i].getAttribute('id').search(/USO_TITLE_/) > -1){
spans[spans.length] = allSpans[i];
titles[titles.length] = allSpans[i].getAttribute('id');
}
}
titles.sort();
for(var i=0; i<titles.length; i++){
for(var j=0; j<spans.length; j++){
if(spans[j].getAttribute('id')==titles[i])
container.appendChild(spans[j]);
}
}
}
function hide(evt)
{
if(!confirm("Hide until next modification?"))
return;
var id = evt.target.getAttribute('id');
//store timestamp == resgister
setValueForId(id, new Date().getTime(), "info");
}
//removes script from updater
function unregister(evt)
{
if(!confirm("Remove script from updater?"))
return;
var id = evt.target.getAttribute('id');
removeById(id,"info");//remove last update info
removeById(id,"optionDiff");//remove option diff
removeById(id,"titles");//remove title
if(GM_getValue("source"+id))
GM_setValue("source"+id,"")//remove stored source for diff
evt.target.parentNode.removeChild(evt.target);
//getId("checkboxDiff"+id).setAttribute('disabled','disabled');
}
function compare(evt)
{
var id = evt.target.getAttribute('id');
if(!GM_getValue('source'+id)){
alert('No source found for comparison');
return;
}
//source container
divsource = createElement('div',{style:"text-align:left; font-size:small; padding:3px; position:absolute; top:3px; right: 3px; background:#EEEEEE none repeat scroll 0%; z-index:100001;"});
divsource.appendChild(createElement('span','','','Script changes: '));
divsource.appendChild(createElement('ins',{style:"background:#8FFF8C"},'','Inserted'));
divsource.appendChild(createElement('span','','',' '));
divsource.appendChild(createElement('del',{style:"background:#FFE6E6"},'','Deleted'));
divsource.appendChild(createElement('span',{id:"spanCompareUpdateCloseLinks", style:"font-size:x-small; position:absolute; top: 3px; right:3px;"}));
divsource.appendChild(createElement('br'));
divsource.appendChild(createElement('pre',{id:"diffResultPreTag", style:"background:#ffffff; font-family:'Monaco','Bitstream Vera Sans Mono','Courier New',serif; font-size:x-small; border-color:#CCCCCC; border-style:solid; border-width:1px; overflow:auto; padding:5px 10px; min-width:640px; min-height:480px; max-width:800px; max-height:480px; white-space:pre; margin:3px; text-align:left;"}));
getTag('body')[0].appendChild(divsource);
getId('diffResultPreTag').appendChild(createElement('span','','','Loading...'));
getId("spanCompareUpdateCloseLinks").appendChild(createElement('a', {target:"_blank", href:"http://userscripts.org/scripts/versions/"+id, class:"USO_outdatedLink"}, null, "versions"));
getId("spanCompareUpdateCloseLinks").appendChild(createElement('span','','',' | '));
getId("spanCompareUpdateCloseLinks").appendChild(createElement('a', {href:"http://userscripts.org/scripts/source/"+id+".user.js", class:"USO_outdatedLink"}, "click register false", "install update"));
getId("spanCompareUpdateCloseLinks").appendChild(createElement('span','','',' | '));
getId("spanCompareUpdateCloseLinks").appendChild(createElement('a', {href:"javascript:void(0)", class:"USO_outdatedLink"}, "click closesource false", "close"));
GM_xmlhttpRequest({
method: 'GET',
url: "http://userscripts.org/scripts/review/"+id+"?format=txt",
onload: function(responseDetails)
{
var span = getTag('span',getId('diffResultPreTag'))[0];
span.parentNode.removeChild(span);
// Neil Fraser's diff implementation
var dmp = new diff_match_patch();
var text1 = GM_getValue('source'+id);
var text2 = responseDetails.responseText;
dmp.Diff_Timeout = 1;//TODO option
dmp.Diff_EditCost = 4;//TODO option
var ms_start = (new Date()).getTime();
var d = dmp.diff_main(text1, text2);
var ms_end = (new Date()).getTime();
dmp.diff_cleanupSemantic(d);
//dmp.diff_cleanupEfficiency(d);
var ds = dmp.diff_prettyHtml(d);
getId('diffResultPreTag').innerHTML = ds;// + "<BR>Time: " + (ms_end - ms_start) / 1000 + "s";
}
});
}
// register script for updates: called in Install Button and update link
function register(evt)
{
var id, href;
//get script id
if(evt==null)//evt null indicates to register the Updater itself
id = 26062;
else{
href = evt.target.getAttribute('href');
if(!href)
href = evt.target.parentNode.getAttribute('href');//evt.target is an icon img, get href from parent 'a' elem
id = href.match(/\d+/)[0];
}
//store timestamp == resgister
setValueForId(id, new Date().getTime(), "info");
//set optionDiff default if not present
if(!getValueForId(id, "optionDiff"))
setValueForId(id, "0", "optionDiff");
//set title if not present
if(!getValueForId(id, "titles")){
GM_xmlhttpRequest({
method: 'GET',
url: "http://userscripts.org/scripts/show/"+id,
onload: function(resp) {
var title = resp.responseText.match(/\<title\>[\s\S]+\<\/title\>/)[0];
title = title.replace(/(\<[^\>]+\>)/g,'');//remove tags
title = unescape(escape(title.replace(/Userscripts\.org$/,'')).replace(/%26ndash%3B/,'')).replace(/\s+$/,'');
setValueForId(id, escape(title), "titles");
}
});
}
//store script source if option is set
if(getValueForId(id, "optionDiff") == "1") {
GM_xmlhttpRequest({
method: 'GET',
url: "http://userscripts.org/scripts/review/"+id+"?format=txt",
onload: function(resp) {
storeSource(resp, id);
}
});
}
}
function getCSS()
{
css = createElement('style',{type:"text/css"},null,""+
'a.USO_outdatedLink:link {color: #0088FF !important; text-decoration: underline !important;}' +
'a.USO_outdatedLink:visited {color: #0088FF !important; text-decoration: underline !important;}'+
'a.USO_outdatedLink:hover {color: #0088FF !important; text-decoration: underline !important;}' +
'a.USO_outdatedLink:active {color: #0088FF !important; text-decoration: underline !important;}' +
'a.USO_updatedLink:link {color: #AAAAAA !important; text-decoration: underline !important;}' +
'a.USO_updatedLink:visited {color: #AAAAAA !important; text-decoration: underline !important;}'+
'a.USO_updatedLink:hover {color: #AAAAAA !important; text-decoration: underline !important;}' +
'a.USO_updatedLink:active {color: #AAAAAA !important; text-decoration: underline !important;}' +
'span.USO_compareSpan {color: #000000 !important}' +
'ins.USO_compareIns {color: #000000 !important; background:#8FFF8C !important;}' +
'del.USO_compareDel {color: #000000 !important; background:#FFE6E6 !important;}'
);
return css;
}
//values stored in format "id=value;..."
function getValueIndex(id, gmkey)
{
var info = GM_getValue(gmkey);
if(!info)
return -1;
info = info.split(';');
for(var i=0; i<info.length; i++)
{
if(info[i].split('=')[0]==id){
return i;
}
}
return -1;
}
function getValueForId(id, gmkey)
{
var info = GM_getValue(gmkey);
if(!info)
return null;
info = info.split(';');
for(var i=0; i<info.length; i++)
{
if(info[i].split('=')[0]==id){
return info[i].split('=')[1];
}
}
return null;
}
function setValueForId(id, value, gmkey)
{
var info = GM_getValue(gmkey);
var i;
if(!info){
GM_setValue(gmkey, id+"="+value);
return;
}
info = info.split(';');
for(i=0; i<info.length; i++)
{
if(info[i].split('=')[0]==id){
info.splice(i,1,id+"="+value);
GM_setValue(gmkey, info.join(';'));
return;
}
}
info.splice(i,0,id+"="+value);
GM_setValue(gmkey, info.join(';'));
}
function setValueAtIndex(index, value, gmkey)
{
var info = GM_getValue(gmkey);
if(!info)
return -1;
info = info.split(';');
info.splice(index,1,value);
GM_setValue(gmkey, info.join(';'));
}
function removeById(id, gmkey)
{
var info = GM_getValue(gmkey).split(';');
for(var i=0; i<info.length; i++)
{
if(info[i].split('=')[0]==id){
info.splice(i,1);
GM_setValue(gmkey,info.join(';'));
return;
}
}
}
function createElement(type, attrArray, evtListener, html)
{
var node;
try{
node = document.getElementsByTagName('body')[0].createElement(type);
}catch(e){
node = document.createElement(type);
}
for (var attr in attrArray) if (attrArray.hasOwnProperty(attr)){
node.setAttribute(attr, attrArray[attr]);
}
if(evtListener){
var a = evtListener.split(' ');
node.addEventListener(a[0], eval(a[1]), eval(a[2]));
}
if(html)
node.innerHTML = html;
return node;
}
function getId(id, parent){
if(!parent)
return document.getElementById(id);
return parent.getElementById(id);
}
function getTag(name, parent){
if(!parent)
return document.getElementsByTagName(name);
return parent.getElementsByTagName(name);
}
function images()
{
//icons thanks to http://www.pinvoke.com
imgCompare = document.createElement('img');
imgCompare.style.margin = '0';
imgCompare.setAttribute('border', 0);
imgCompare.style.cursor = 'pointer';
imgCompare.src = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%02dIDATx%DA%8C%93_HSq%14%C7%7F%F7o%DB%EE%EE%EEnr%CB2%EF%D46I%D3U*%AE%07%99k%06%11%D5%0C%A1%C0%87%81%90P%BD%AA%3D%F8%5C%3D%06B%D4%5B%09%BDDa%0F%83%40%82%20%82%12%86%20%0C%CC%D1%2C%04%C9%09%B7%D8fk%7F%EE%EE%EE%BD%9D_(m%EB%0A%1D%F8%F0%FBs%CF%F7%DC%F3%3B%BF%F3%23%22%91%08%B22%8A%A20%22A%10%A7%60y%14%E0%80%02%906M3%A1%EBz%16%404%DA%DF%DA%1DN%E1%DC%E0H%A4%EBL%DF%80%B7E%12%9AUU%CD%C4%E3%F1%CFo_%BF%EA%C8%EFd%DE%81%CF%06%E5%F3%F9%10D%AC%03L%E4%5C%EEKc7f%82%C7%3BO%F4%C8%87%5C%12E%124%CB0%BC%A7%AD%CD%D3%DC%D1%CB'%13%CB%A4Z.n%908%8DF%AA%D5j%DF%608%D2%CD%8BM%1E%91%3B%C0%90%04%22%F6%D2%C2s%F9%D8%11%EF%D0%85%AB%BD%D8%8F%AET*V%E9%B7v%F6%F4%CBx%92%CE%16%D5t%16%A9%8D%0E%DD%FE%81%F6%85%F9%87%AD%B4%A6iV%01%04%9B%DD~P7%FE%1C%07u%B5%B8%5C%0D%DF%CD%ADL%89%01%AD%B0_%06ECS%F3%88b%05%10%F3V%0E%84%5E%C9%83%B6HBe%91%05%DF%92%2BK%DB%14IRZ%D50%1A%C5%86a%12%AB%2BK%5B%D8%8F%14E%11%09%82%80x%9EGN%A7%13q%1C%87X%96%5D%8F%BD%98%DFd%F5_ZE7%EB%FB%03nc'%F3%5Dy%F2x.Y(%14%96%C9%C6%E8p%8D%1E%86aFo%DF%BCu%7Fr%FCJ%FCM%ECe%CA%D4JE%3BK%D9%90%AE%96%16c%0B%C9k%A3%17%3F%AE%7DZ%5D%2C%97%CB%3F%88p8%0C)%19%7Bt%3B%1C%DC%D8%D4%D4%9D%BB%D1%E8%F8%BDl6%FB%1Cb%9E%04%BC%00.%E4O%E0%0B%F0%DE%E1p(n%B7%FBo'%C2%9F%CFJ%D2%E1%C8%F4%F4%ECl4z%FD%01%88%9F%C1%F6%3A%B0fUD%E8%01%A4(%0AB%A1P%08%05%83%C1%CB%13%13%93s%89%C4W%D3%EF%3F%FD%88%A6%E9~%FC%16%E0%1D%20%92%24%FF%A1%CEdYF%81%40%60%26%95R%CC%E1%E1%91%A7%20%3E%8F%85%FFk%D8%D3%26I%D2%10%1C!%94%CB%E5%B6!%B5%0F%B0%A7%E3%2Cw%D1jF%ADf%8D%7Dt%1C%00%D7%A1%09%DF%10.E%0D%C6.z%C3X%C7o%01%06%00%B1%B2%24%CE%AE%EE%7C%99%00%00%00%00IEND%AEB%60%82";
imgUpdate = document.createElement('img');
imgUpdate.style.margin = '0';
imgUpdate.setAttribute('border', 0);
imgUpdate.style.cursor = 'pointer';
imgUpdate.src = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%02%D7IDATx%DA%A4S%5BHTa%10%9Esvu7%09E%F3%0E%9A%C4%B6%EB%8AmG%8DEK%A9%87%02%CB%10%0C%BA%B1v%A1%08)*%05%25%C2%17%13%BA%E0C!*%C6v1%BB%F8%E0%8BR%A0%3E(Y%14%BB%0B%AD%B8%AD%D9%8D%8D2%B5%B4%BD%B4%EA%89%F6r%CE%9Ef%D4%A3%BD%F4%D4%0Fsf%CE%7C%DF%CC%FF%FF3%F33%92%24%C1%FF%2C%25%7D%CA%CA%CA%80eY%88%8A%8A%02%86a%80%92*%14%8A%22%84%0C%CB%3C%A7(%8AV%19%0B%87%C3%10%89DV%13%C8%0B%C1%AD%A86%A3~%82%01%5Cwww%BB%20%08%602%99%CE%A0%EF%2Bb%E5%A8_%A3%B6%C81%EC_%C1%DBt%3A%DD%01%B3%D9%DC%1E%1F%1F%7F%0Cwa%3D%1E7%F8%FD%3FiG%96%7C%84%11%87%B8r%1CCG*--%25%FB%1C%12Z%DC%EE%1F%90%96%96%0E%0E%87%C3%C5q%9C%86%00%B2%F5%FAl%8D%CF%E7%83%A4%A4d%A8%AA%AA%3A%8F%EE%D6%95%13%CC%CF%CFC%20%10%E8%AD%AB%AB%BD%A4R%A9%C0%EB%F5%40N%8E%5E%13%89%88%40B6%CF%F3%40%18q%88K1~%BF%7F)%01%9EbG(%14%3A8%3D%FD%8D%1F%1D%1D%FD%84%05%04%9B%CD%F6%1E%8B%DBNB6%F9%08%23%0Eq)F%BE%3B%E4%E7%E7_%B0%DB_I%C3%C3O%25%AB%D5%229%9DN%C9%600%5C%A3%20%12%B2%C9G%18q%88K1(K%5D%08%06%83%8A%40%20%08%82%20%82(F%B0%95Jl%AB%22%2C%B7%8Al%F2%11F%1C%E2R%CCJ%11%B5Z%EDN%D4%85%E4%A8%AE%AE9Y%5C%BC%3Dkrr%D6%D1%D8X%DFC%BE%86%86%AB%FB22R%B8%5B%E3%10%1A%F3H%1E~%A4%C7%F2%CB%D6eFhH%3E%C1%10%EE%E6JNN9%5BPP%98%E5%F3%F9A%A7%CB%E6%FA%FA%9Es%84%CF%CDyaj%EA3%B8C%A9%D1G%F6k%D2%3B%18u%B6%CAx4%F57%16v1%01V%95%D4%89%B6%B6%BB%B5%D4%C6%84%84%04%18%1C%1C%980%1A%8B%D6w%8E%0B%F0%C1%1B%0E%ADQ%C5F%7Fq9A%15%C7%C2%E1%8A%8D%B9%1D%5Dc5%12%5Eq%F1%0A%14%80kw%5E%DE%16SSS%AB%A9%B2%B2%A2ev%F6%3B%DF%DF%FF%A2%FE%CAT%2C%94%183%E1%E3%02%00%2F%ACNmf%0C%40o%E7%CB%91%C5%044%E3J%A5%92%DE%C2%1E%7C%13%258%BE%B7%F1%FF%94%DD%EE%BAx%E3%D9%24%3C%B6%BD%9Ba%D5q%9E%05%DFLb%EE%DE%5D%A9%E9%9B6%80%F5N%FF%08%C3%B2%CDr%02%BA%CA%3A%94D%145%ED%80%C9r1Y%0E%D9X%9F%B78%CEo%D6%1E%BA%F70%EB%F4q%FD%84%F9%91%93a%15%D7cb%E3%1E%C8%09h%A0b%96E%F9%AF%A7%1B%5D~%F3%B2%C40%05%20%04%9B%C3%7D%D5%F7)%F7%1F%01%06%00f%9A%86%C6%C4d%90%E8%00%00%00%00IEND%AEB%60%82";
imgHide = document.createElement('img');
imgHide.style.margin = '0';
imgHide.setAttribute('border', 0);
imgHide.style.cursor = 'pointer';
imgHide.src = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%029IDATx%DA%A4S1%8B%1AQ%10~%BB%1A%E1%82%A5%A7%22%5B%1C%C6%C0%1D%B866%D9%C6%D2X%D8%DA%08%C2vv%166%82%BD%82%FE%03AP%10%FC%05%22%A4%B5%D94%16Q%E1%12%C3%C9%993%1Bc8%041FW%5D3%DF%E6%AD%98*E%1E%8Cov%E6%FB%BE7o%E6)%9CN'%F6%3F%CB%89%9Ff%B3%C9DQdN%A7%93%09%82%60%25%1C%0E%87B%9B%CCq%C3%E3%F1%A8%C1%C1%81%87%C3%81%99%A6%C9TU%FD%23p%B1%14%02%C8d%1D%EC%E9tz%86%60%BB%DDFlJ%E2I%88%91i6A%B4%1D%02(%1E%8F%E7%96H_%5C.W%02%A7%D0%FA%05%83%8F%18r%C0%00%FB%D7%158X%8E%C7%E3%8F%B4%7FO%A5R%E6%7C%3Ew%91o%22Aq%DD%EF%F7%1B%C8%91o%D6%EBu%D9%AE%C2%AA%60%B5Z%B1%EDv%DBi4%1A%12%7D%5E%93%81%F0D%FB%0E%C6%7D%1D9%60%80%05%E7%5C%01J2%0CC%26c%B3%D9%CC)I%12%D34M%A2%BBC%8CQ%E9%3F%14E%99%22%B7%5C.%C1I%12%C7%EA%85%25%B0%DB%ED%E4b%B1%F8%91%DF%19%CB%D5%EDv%AF7%9BM%13%1F%E4%AB%24%F0%8D%84%9F%F3%F9%FC3%85%AE%CA%E5%B2%7C)%80%EDh%DF%19%BE%CF%E7%3B%91%9D%7B%CC%F3%82%9D%E7%1Cf%0B%0C%0B%85%825%F3l6%FB9%18%0C%3E%26%12%09%BD%DF%EF%AB%88E%A3%D1%AFh%D5d2%B9%A9%D5j%AF%11%A3%91%0E%2F%054z%18S%B7%DB%FD%96%C8k%0A%19%A1P%E8%13%D9%13%3Fq%83S%91%A3%C7%B6_%AF%D7%EF%E8%E1%E9%E7)PW%1950Y*%95%3E%D0'H%FE%F1x%7C%C3%F3%22%F7%FD%C8%01%03%2C8g%81%FD~%0F%1BV%AB%D5%3B%00s%B9%5C%A4R%A9%DC%F2%9E%98%F0%11C%0E%18%60%C1%B1%AE%82%B7%8D%F7O%B3f%91HD%F1z%BD%F2h4%EA%84%C3%E1d%AB%D5z%0FP%26%93yc%C7%16%8B%C5p0%18h%F4%D0%AC%FF%85-%80J%5Er%B3%FA%12%8B%C5%EE%02%81%C0%2B%F8%BA%AE%3F%F4z%BD%7B%7B%02d%3F%D1%17%E2%9A%B6%00%C6%F3%82%9B%F8%8F%7F0F%8A%FA%0D%E2%9E~%0B0%00%FF%A5%3E%DC%E4%2F%96%B1%00%00%00%00IEND%AEB%60%82";
imgRemove = document.createElement('img');
imgRemove.style.margin = '0';
imgRemove.setAttribute('border', 0);
imgRemove.style.cursor = 'pointer';
imgRemove.src = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%02%A6IDATx%DA%A4S_HSa%14%3F%F7%EEN%A5%C0%D4%D4e%60Z%88S%89y%D5%10-%A3%1Ez%B0%06A%3D%D4%C3%06A%11BT%06J%84%10f%0F%89o%A9!H%F4%90o%BE%94%04%FA%10%92X%A2%83%16%9B%23%A2%C8%C8%FF%B66%D7%1CK%F7%EF%DB%ED%FC%DC%AEE%2F%3D%F4%C1%D99%F7%FC~%E7%F7%7D%FB%CEw%24M%D3%E8%7F%96%82%1F%AB%D5J%B2%2C%93%D1h%24I%92%08%A2%06%83%A1%91!K%9A%E7%11B%CC%E8X%3C%1E%A7d2%F9%5B%40_%0C%1EeW%CD%FE%05%17%A8%C3%C3%C3%03%89D%82l6%DB5%CE-2v%96%FD%2C%FBi%BDF%FE%A3%F8%98%D9l%BE0888%90%9B%9B%7B%89w%91%FD~%1F%05%83%3F%B0%A3%8C%1C0p%C0%D5%EB%24%1C%A9%B9%B9%19%F1%0D%26%F4%F9%7C%DF%A9%A8h%3F%B9%DD%EE9UU%CB%00%20%AE%AC%AC(%0B%04%02TPPH---79%DD%BFs%82P(D%91H%E4y%7B%7B%DB%BD%CC%CCLZ_%F7SUUeY2)%08%868%1C%0E%130p%C0EM0%18L%09%F0)N%C6b%B1%8B%2B%2B%ABa%97%CB%F5%85%2F%90%1C%0E%C7G%BE%DC%01%18b%E4%80%81%03.j%F4%FFN%B5%B5%B5%B7%9D%CE%B7%DA%C4%C4%2BmffZ%F3x%3C%9A%C5b%E9F%11%0C1r%C0%C0%01%175l%A9.D%A3QC%24%12%A5DB%90%10In%A5%C2m5%C4%F5V!F%0E%188%E0%A2f%E7%12%CB%CB%CBO%B1o%40%A2%B5%F5%D6%95%A6%A6%13%A5KK%5EwWW%C73%E4%3A%3B%1F%9C%2F.6%A9SS%93%F3%BD%BD%0F%9Fl%17J%92%83%DD%B8~%82q%DEm%AE%B0%D0t%BD%AE%AE%A14%10%08%92%D9%5C%A1%8E%8EN%AA%C076%D6iy%F9%2B%01%CB%CE%DE%93%B3%7Be%F9%915%14%9A%2F%D9%DAJ%9D%C0d2%81w%7Fd%E4%E5%5D%B41%2F%2F%8Ffg%5D%0B%F5%F5%8D%25%00%16%3A%DAb%F2%D2bFB%082*%0Ay%3F%7FZ%CB%11b%95%87%E0%DD%B6%00%0Ax%9D%AE%A99b%EB%E9%E9%B7%D9%ED%E7%FA%BC%DE%B5%F0%D8%D8%9B%0E%00%AF%9B%AA%BF%B5%DA%ED%FB%FE%9E%83%A7CC)%01%BCq%85%95y%16%CE%F0L%1C%E7%E7%FB%98%BF%AF%3A%9Dsw%F0%94%BBk%0E%BA%0F%09%A1l%12%E5g%10%85%B34m%23%3D%07%3B%02%B8%8B%BDl%F9lY%00Y%EC0%8BU!%E6%FB%F9%C0%CF%F9%7Dz%E3%18%9B%EF%00%91%FF2QB%17%C0%83%DA%956%E5%1F%13%2C%D8~%B2mB%FB%97%00%03%00%D6%C4wv%97%A7%0D%16%00%00%00%00IEND%AEB%60%82";
imgZombie = document.createElement('img');
imgZombie.style.margin = '0';
imgZombie.setAttribute('border', 0);
imgZombie.src = "data:image/gif,GIF89a%12%00%12%00%B3%00%00%00%00%00%7B%AD%00%84%BD%00%84%C6%FF%94%C6%08%9C%CE!%A5%CE1%C6%00%00%FF%C6%C6%B5%DEJ%BD%DEc%BD%E7k%C6%E7s%EA%F7%A9%FF%FF%FF%80%C0%FF!%F9%04%01%00%00%0F%00%2C%00%00%00%00%12%00%12%00%00%04%7C%F0%C9%09%A6%AC%96%EA%BBm%05%60%F8e%17%90%9C%86A%10%A0%F7%00%CA%22%2BI(%08%E3%AB0%3C%0F8%0E%04%40%10%C0%BC%16%00F%F2%07%0C%02%8A%97%C4B%D9P%02%7FB%E8K%BAT%22%80%88%AC(%B1%EBy%C3C-%C0%40%96-h6%9C%87%7D%0A%A9%088%E3%AB%90%024%FE%00x-%19%00%05%05%22CDz%17%2B%00%07%8Fi%8B%147!%01Z%24%17%96%96%83%98%14!%9D%11%00%00%3B";
}
/*
TODO
- avoid showing compare link when source stored is updated
- fixed alert when auto checking and div is out of view(gmail uses it in conversations)
- diff navigation: navigate trhough highlighted modifications on source code...
*/
/**
* Diff Match and Patch
*
* Copyright 2006 Google Inc.
* http://code.google.com/p/google-diff-match-patch/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview Computes the difference between two texts to create a patch.
* Applies the patch onto another text, allowing for errors.
* @author fraser@google.com (Neil Fraser)
*/
/**
* Class containing the diff, match and patch methods.
* @constructor
*/
function diff_match_patch(){this.Diff_Timeout=1.0;this.Diff_EditCost=4;this.Diff_DualThreshold=32;this.Match_Balance=0.5;this.Match_Threshold=0.5;this.Match_MinLength=100;this.Match_MaxLength=1000;this.Patch_Margin=4;function getMaxBits(){var a=0;var b=1;var c=2;while(b!=c){a++;b=c;c=c<<1}return a}this.Match_MaxBits=getMaxBits()}var DIFF_DELETE=-1;var DIFF_INSERT=1;var DIFF_EQUAL=0;diff_match_patch.prototype.diff_main=function(a,b,c){if(a==b){return[[DIFF_EQUAL,a]]}if(typeof c=='undefined'){c=true}var d=c;var e=this.diff_commonPrefix(a,b);var f=a.substring(0,e);a=a.substring(e);b=b.substring(e);e=this.diff_commonSuffix(a,b);var g=a.substring(a.length-e);a=a.substring(0,a.length-e);b=b.substring(0,b.length-e);var h=this.diff_compute(a,b,d);if(f){h.unshift([DIFF_EQUAL,f])}if(g){h.push([DIFF_EQUAL,g])}this.diff_cleanupMerge(h);return h};diff_match_patch.prototype.diff_compute=function(b,c,d){var e;if(!b){return[[DIFF_INSERT,c]]}if(!c){return[[DIFF_DELETE,b]]}var f=b.length>c.length?b:c;var g=b.length>c.length?c:b;var i=f.indexOf(g);if(i!=-1){e=[[DIFF_INSERT,f.substring(0,i)],[DIFF_EQUAL,g],[DIFF_INSERT,f.substring(i+g.length)]];if(b.length>c.length){e[0][0]=e[2][0]=DIFF_DELETE}return e}f=g=null;var h=this.diff_halfMatch(b,c);if(h){var k=h[0];var l=h[1];var m=h[2];var n=h[3];var o=h[4];var p=this.diff_main(k,m,d);var q=this.diff_main(l,n,d);return p.concat([[DIFF_EQUAL,o]],q)}if(d&&(b.length<100||c.length<100)){d=false}var r;if(d){var a=this.diff_linesToChars(b,c);b=a[0];c=a[1];r=a[2]}e=this.diff_map(b,c);if(!e){e=[[DIFF_DELETE,b],[DIFF_INSERT,c]]}if(d){this.diff_charsToLines(e,r);this.diff_cleanupSemantic(e);e.push([DIFF_EQUAL,'']);var s=0;var t=0;var u=0;var v='';var w='';while(s<e.length){switch(e[s][0]){case DIFF_INSERT:u++;w+=e[s][1];break;case DIFF_DELETE:t++;v+=e[s][1];break;case DIFF_EQUAL:if(t>=1&&u>=1){var a=this.diff_main(v,w,false);e.splice(s-t-u,t+u);s=s-t-u;for(var j=a.length-1;j>=0;j--){e.splice(s,0,a[j])}s=s+a.length}u=0;t=0;v='';w='';break}s++}e.pop()}return e};diff_match_patch.prototype.diff_linesToChars=function(g,h){var i=[];var j={};i[0]='';function diff_linesToCharsMunge(a){var b='';var c=0;var d=-1;var e=i.length;while(d<a.length-1){d=a.indexOf('\n',c);if(d==-1){d=a.length-1}var f=a.substring(c,d+1);c=d+1;if(j.hasOwnProperty?j.hasOwnProperty(f):(j[f]!==undefined)){b+=String.fromCharCode(j[f])}else{b+=String.fromCharCode(e);j[f]=e;i[e++]=f}}return b}var k=diff_linesToCharsMunge(g);var l=diff_linesToCharsMunge(h);return[k,l,i]};diff_match_patch.prototype.diff_charsToLines=function(a,b){for(var x=0;x<a.length;x++){var c=a[x][1];var d=[];for(var y=0;y<c.length;y++){d[y]=b[c.charCodeAt(y)]}a[x][1]=d.join('')}};diff_match_patch.prototype.diff_map=function(b,c){var e=(new Date()).getTime()+this.Diff_Timeout*1000;var f=b.length+c.length-1;var g=this.Diff_DualThreshold*2<f;var h=[];var i=[];var j={};var l={};j[1]=0;l[1]=0;var x,y;var m;var n={};var o=false;var hasOwnProperty=!!(n.hasOwnProperty);var p=(b.length+c.length)%2;for(var d=0;d<f;d++){if(this.Diff_Timeout>0&&(new Date()).getTime()>e){return null}h[d]={};for(var k=-d;k<=d;k+=2){if(k==-d||k!=d&&j[k-1]<j[k+1]){x=j[k+1]}else{x=j[k-1]+1}y=x-k;if(g){m=x+','+y;if(p&&(hasOwnProperty?n.hasOwnProperty(m):(n[m]!==undefined))){o=true}if(!p){n[m]=d}}while(!o&&x<b.length&&y<c.length&&b.charAt(x)==c.charAt(y)){x++;y++;if(g){m=x+','+y;if(p&&(hasOwnProperty?n.hasOwnProperty(m):(n[m]!==undefined))){o=true}if(!p){n[m]=d}}}j[k]=x;h[d][x+','+y]=true;if(x==b.length&&y==c.length){return this.diff_path1(h,b,c)}else if(o){i=i.slice(0,n[m]+1);var a=this.diff_path1(h,b.substring(0,x),c.substring(0,y));return a.concat(this.diff_path2(i,b.substring(x),c.substring(y)))}}if(g){i[d]={};for(var k=-d;k<=d;k+=2){if(k==-d||k!=d&&l[k-1]<l[k+1]){x=l[k+1]}else{x=l[k-1]+1}y=x-k;m=(b.length-x)+','+(c.length-y);if(!p&&(hasOwnProperty?n.hasOwnProperty(m):(n[m]!==undefined))){o=true}if(p){n[m]=d}while(!o&&x<b.length&&y<c.length&&b.charAt(b.length-x-1)==c.charAt(c.length-y-1)){x++;y++;m=(b.length-x)+','+(c.length-y);if(!p&&(hasOwnProperty?n.hasOwnProperty(m):(n[m]!==undefined))){o=true}if(p){n[m]=d}}l[k]=x;i[d][x+','+y]=true;if(o){h=h.slice(0,n[m]+1);var a=this.diff_path1(h,b.substring(0,b.length-x),c.substring(0,c.length-y));return a.concat(this.diff_path2(i,b.substring(b.length-x),c.substring(c.length-y)))}}}}return null};diff_match_patch.prototype.diff_path1=function(a,b,c){var e=[];var x=b.length;var y=c.length;var f=null;for(var d=a.length-2;d>=0;d--){while(1){if(a[d].hasOwnProperty?a[d].hasOwnProperty((x-1)+','+y):(a[d][(x-1)+','+y]!==undefined)){x--;if(f===DIFF_DELETE){e[0][1]=b.charAt(x)+e[0][1]}else{e.unshift([DIFF_DELETE,b.charAt(x)])}f=DIFF_DELETE;break}else if(a[d].hasOwnProperty?a[d].hasOwnProperty(x+','+(y-1)):(a[d][x+','+(y-1)]!==undefined)){y--;if(f===DIFF_INSERT){e[0][1]=c.charAt(y)+e[0][1]}else{e.unshift([DIFF_INSERT,c.charAt(y)])}f=DIFF_INSERT;break}else{x--;y--;if(f===DIFF_EQUAL){e[0][1]=b.charAt(x)+e[0][1]}else{e.unshift([DIFF_EQUAL,b.charAt(x)])}f=DIFF_EQUAL}}}return e};diff_match_patch.prototype.diff_path2=function(a,b,c){var e=[];var f=0;var x=b.length;var y=c.length;var g=null;for(var d=a.length-2;d>=0;d--){while(1){if(a[d].hasOwnProperty?a[d].hasOwnProperty((x-1)+','+y):(a[d][(x-1)+','+y]!==undefined)){x--;if(g===DIFF_DELETE){e[f-1][1]+=b.charAt(b.length-x-1)}else{e[f++]=[DIFF_DELETE,b.charAt(b.length-x-1)]}g=DIFF_DELETE;break}else if(a[d].hasOwnProperty?a[d].hasOwnProperty(x+','+(y-1)):(a[d][x+','+(y-1)]!==undefined)){y--;if(g===DIFF_INSERT){e[f-1][1]+=c.charAt(c.length-y-1)}else{e[f++]=[DIFF_INSERT,c.charAt(c.length-y-1)]}g=DIFF_INSERT;break}else{x--;y--;if(g===DIFF_EQUAL){e[f-1][1]+=b.charAt(b.length-x-1)}else{e[f++]=[DIFF_EQUAL,b.charAt(b.length-x-1)]}g=DIFF_EQUAL}}}return e};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charCodeAt(0)!==b.charCodeAt(0)){return 0}var c=0;var d=Math.min(a.length,b.length);var e=d;var f=0;while(c<e){if(a.substring(f,e)==b.substring(f,e)){c=e;f=c}else{d=e}e=Math.floor((d-c)/2+c)}return e};diff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charCodeAt(a.length-1)!==b.charCodeAt(b.length-1)){return 0}var c=0;var d=Math.min(a.length,b.length);var e=d;var f=0;while(c<e){if(a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)){c=e;f=c}else{d=e}e=Math.floor((d-c)/2+c)}return e};diff_match_patch.prototype.diff_halfMatch=function(h,k){var l=h.length>k.length?h:k;var m=h.length>k.length?k:h;if(l.length<10||m.length<1){return null}var n=this;function diff_halfMatchI(a,b,i){var c=a.substring(i,i+Math.floor(a.length/4));var j=-1;var d='';var e,best_longtext_b,best_shorttext_a,best_shorttext_b;while((j=b.indexOf(c,j+1))!=-1){var f=n.diff_commonPrefix(a.substring(i),b.substring(j));var g=n.diff_commonSuffix(a.substring(0,i),b.substring(0,j));if(d.length<g+f){d=b.substring(j-g,j)+b.substring(j,j+f);e=a.substring(0,i-g);best_longtext_b=a.substring(i+f);best_shorttext_a=b.substring(0,j-g);best_shorttext_b=b.substring(j+f)}}if(d.length>=a.length/2){return[e,best_longtext_b,best_shorttext_a,best_shorttext_b,d]}else{return null}}var o=diff_halfMatchI(l,m,Math.ceil(l.length/4));var p=diff_halfMatchI(l,m,Math.ceil(l.length/2));var q;if(!o&&!p){return null}else if(!p){q=o}else if(!o){q=p}else{q=o[4].length>p[4].length?o:p}var r,text1_b,text2_a,text2_b;if(h.length>k.length){r=q[0];text1_b=q[1];text2_a=q[2];text2_b=q[3]}else{text2_a=q[0];text2_b=q[1];r=q[2];text1_b=q[3]}var s=q[4];return[r,text1_b,text2_a,text2_b,s]};diff_match_patch.prototype.diff_cleanupSemantic=function(a){var b=false;var c=[];var d=0;var e=null;var f=0;var g=0;var h=0;while(f<a.length){if(a[f][0]==DIFF_EQUAL){c[d++]=f;g=h;h=0;e=a[f][1]}else{h+=a[f][1].length;if(e!==null&&(e.length<=g)&&(e.length<=h)){a.splice(c[d-1],0,[DIFF_DELETE,e]);a[c[d-1]+1][0]=DIFF_INSERT;d--;d--;f=d>0?c[d-1]:-1;g=0;h=0;e=null;b=true}}f++}if(b){this.diff_cleanupMerge(a)}this.diff_cleanupSemanticLossless(a)};diff_match_patch.prototype.diff_cleanupSemanticLossless=function(d){var e=/[^a-zA-Z0-9]/;var f=/\s/;var g=/[\r\n]/;var h=/\n\r?\n$/;var i=/^\r?\n\r?\n/;function diff_cleanupSemanticScore(a,b){if(!a||!b){return 5}var c=0;if(a.charAt(a.length-1).match(e)||b.charAt(0).match(e)){c++;if(a.charAt(a.length-1).match(f)||b.charAt(0).match(f)){c++;if(a.charAt(a.length-1).match(g)||b.charAt(0).match(g)){c++;if(a.match(h)||b.match(i)){c++}}}}return c}var j=1;while(j<d.length-1){if(d[j-1][0]==DIFF_EQUAL&&d[j+1][0]==DIFF_EQUAL){var k=d[j-1][1];var l=d[j][1];var m=d[j+1][1];var n=this.diff_commonSuffix(k,l);if(n){var o=l.substring(l.length-n);k=k.substring(0,k.length-n);l=o+l.substring(0,l.length-n);m=o+m}var p=k;var q=l;var r=m;var s=diff_cleanupSemanticScore(k,l)+diff_cleanupSemanticScore(l,m);while(l.charAt(0)===m.charAt(0)){k+=l.charAt(0);l=l.substring(1)+m.charAt(0);m=m.substring(1);var t=diff_cleanupSemanticScore(k,l)+diff_cleanupSemanticScore(l,m);if(t>=s){s=t;p=k;q=l;r=m}}if(d[j-1][1]!=p){if(p){d[j-1][1]=p}else{d.splice(j-1,1);j--}d[j][1]=q;if(r){d[j+1][1]=r}else{d.splice(j+1,1);j--}}}j++}};diff_match_patch.prototype.diff_cleanupEfficiency=function(a){var b=false;var c=[];var d=0;var e='';var f=0;var g=false;var h=false;var i=false;var j=false;while(f<a.length){if(a[f][0]==DIFF_EQUAL){if(a[f][1].length<this.Diff_EditCost&&(i||j)){c[d++]=f;g=i;h=j;e=a[f][1]}else{d=0;e=''}i=j=false}else{if(a[f][0]==DIFF_DELETE){j=true}else{i=true}if(e&&((g&&h&&i&&j)||((e.length<this.Diff_EditCost/2)&&(g+h+i+j)==3))){a.splice(c[d-1],0,[DIFF_DELETE,e]);a[c[d-1]+1][0]=DIFF_INSERT;d--;e='';if(g&&h){i=j=true;d=0}else{d--;f=d>0?c[d-1]:-1;i=j=false}b=true}}f++}if(b){this.diff_cleanupMerge(a)}};diff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,'']);var b=0;var c=0;var d=0;var e='';var f='';var g;while(b<a.length){switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:if(c!==0||d!==0){if(c!==0&&d!==0){g=this.diff_commonPrefix(f,e);if(g!==0){if((b-c-d)>0&&a[b-c-d-1][0]==DIFF_EQUAL){a[b-c-d-1][1]+=f.substring(0,g)}else{a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]);b++}f=f.substring(g);e=e.substring(g)}g=this.diff_commonSuffix(f,e);if(g!==0){a[b][1]=f.substring(f.length-g)+a[b][1];f=f.substring(0,f.length-g);e=e.substring(0,e.length-g)}}if(c===0){a.splice(b-c-d,c+d,[DIFF_INSERT,f])}else if(d===0){a.splice(b-c-d,c+d,[DIFF_DELETE,e])}else{a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f])}b=b-c-d+(c?1:0)+(d?1:0)+1}else if(b!==0&&a[b-1][0]==DIFF_EQUAL){a[b-1][1]+=a[b][1];a.splice(b,1)}else{b++}d=0;c=0;e='';f='';break}}if(a[a.length-1][1]===''){a.pop()}var h=false;b=1;while(b<a.length-1){if(a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL){if(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]){a[b][1]=a[b-1][1]+a[b][1].substring(0,a[b][1].length-a[b-1][1].length);a[b+1][1]=a[b-1][1]+a[b+1][1];a.splice(b-1,1);h=true}else if(a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]){a[b-1][1]+=a[b+1][1];a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1];a.splice(b+1,1);h=true}}b++}if(h){this.diff_cleanupMerge(a)}};diff_match_patch.prototype.diff_xIndex=function(a,b){var c=0;var d=0;var e=0;var f=0;var x;for(x=0;x<a.length;x++){if(a[x][0]!==DIFF_INSERT){c+=a[x][1].length}if(a[x][0]!==DIFF_DELETE){d+=a[x][1].length}if(c>b){break}e=c;f=d}if(a.length!=x&&a[x][0]===DIFF_DELETE){return f}return f+(b-e)};diff_match_patch.prototype.diff_prettyHtml=function(a){var b=[];var i=0;for(var x=0;x<a.length;x++){var c=a[x][0];var d=a[x][1];var e=d.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/\n/g,'');if(!e)continue;switch(c){case DIFF_INSERT:b[x]='<INS class="USO_compareIns" TITLE="i='+i+'">'+e+'</INS>';break;case DIFF_DELETE:b[x]='<DEL class="USO_compareDel" TITLE="i='+i+'">'+e+'</DEL>';break;case DIFF_EQUAL:b[x]='<SPAN class="USO_compareSpan" TITLE="i='+i+'">'+e+'</SPAN>';break}if(c!==DIFF_DELETE){i+=d.length}}return b.join('')};diff_match_patch.prototype.diff_text1=function(a){var b=[];for(var x=0;x<a.length;x++){if(a[x][0]!==DIFF_INSERT){b[x]=a[x][1]}}return b.join('')};diff_match_patch.prototype.diff_text2=function(a){var b=[];for(var x=0;x<a.length;x++){if(a[x][0]!==DIFF_DELETE){b[x]=a[x][1]}}return b.join('')};diff_match_patch.prototype.diff_toDelta=function(a){var b=[];for(var x=0;x<a.length;x++){switch(a[x][0]){case DIFF_INSERT:b[x]='+'+encodeURI(a[x][1]);break;case DIFF_DELETE:b[x]='-'+a[x][1].length;break;case DIFF_EQUAL:b[x]='='+a[x][1].length;break}}return b.join('\t').replace(/\0/g,'%00').replace(/%20/g,' ')};diff_match_patch.prototype.diff_fromDelta=function(a,b){var c=[];var d=0;var e=0;b=b.replace(/%00/g,'\0');var f=b.split(/\t/g);for(var x=0;x<f.length;x++){var g=f[x].substring(1);switch(f[x].charAt(0)){case'+':try{c[d++]=[DIFF_INSERT,decodeURI(g)]}catch(ex){throw new Error('Illegal escape in diff_fromDelta: '+g);}break;case'-':case'=':var n=parseInt(g,10);if(isNaN(n)||n<0){throw new Error('Invalid number in diff_fromDelta: '+g);}var h=a.substring(e,e+=n);if(f[x].charAt(0)=='='){c[d++]=[DIFF_EQUAL,h]}else{c[d++]=[DIFF_DELETE,h]}break;default:if(f[x]){throw new Error('Invalid diff operation in diff_fromDelta: '+f[x]);}}}if(e!=a.length){throw new Error('Delta length ('+e+') does not equal source text length ('+a.length+').');}return c};diff_match_patch.prototype.match_main=function(a,b,c){c=Math.max(0,Math.min(c,a.length-b.length));if(a==b){return 0}else if(a.length===0){return null}else if(a.substring(c,c+b.length)==b){return c}else{return this.match_bitap(a,b,c)}};diff_match_patch.prototype.match_bitap=function(a,b,c){if(b.length>this.Match_MaxBits){throw new Error('Pattern too long for this browser.');}var s=this.match_alphabet(b);var f=a.length;f=Math.max(f,this.Match_MinLength);f=Math.min(f,this.Match_MaxLength);var g=this;function match_bitapScore(e,x){var d=Math.abs(c-x);return(e/b.length/g.Match_Balance)+(d/f/(1.0-g.Match_Balance))}var h=this.Match_Threshold;var i=a.indexOf(b,c);if(i!=-1){h=Math.min(match_bitapScore(0,i),h)}i=a.lastIndexOf(b,c+b.length);if(i!=-1){h=Math.min(match_bitapScore(0,i),h)}var k=1<<(b.length-1);i=null;var l,bin_mid;var m=Math.max(c+c,a.length);var n;for(var d=0;d<b.length;d++){var o=Array(a.length);l=c;bin_mid=m;while(l<bin_mid){if(match_bitapScore(d,bin_mid)<h){l=bin_mid}else{m=bin_mid}bin_mid=Math.floor((m-l)/2+l)}m=bin_mid;var p=Math.max(0,c-(bin_mid-c)-1);var q=Math.min(a.length-1,b.length+bin_mid);if(a.charAt(q)==b.charAt(b.length-1)){o[q]=(1<<(d+1))-1}else{o[q]=(1<<d)-1}for(var j=q-1;j>=p;j--){if(d===0){o[j]=((o[j+1]<<1)|1)&s[a.charAt(j)]}else{o[j]=((o[j+1]<<1)|1)&s[a.charAt(j)]|((n[j+1]<<1)|1)|((n[j]<<1)|1)|n[j+1]}if(o[j]&k){var r=match_bitapScore(d,j);if(r<=h){h=r;i=j;if(j>c){p=Math.max(0,c-(j-c))}else{break}}}}if(match_bitapScore(d+1,c)>h){break}n=o}return i};diff_match_patch.prototype.match_alphabet=function(a){var s={};for(var i=0;i<a.length;i++){s[a.charAt(i)]=0}for(var i=0;i<a.length;i++){s[a.charAt(i)]|=1<<(a.length-i-1)}return s};diff_match_patch.prototype.patch_addContext=function(a,b){var c=b.substring(a.start2,a.start2+a.length1);var d=0;while(b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin){d+=this.Patch_Margin;c=b.substring(a.start2-d,a.start2+a.length1+d)}d+=this.Patch_Margin;var e=b.substring(a.start2-d,a.start2);if(e!==''){a.diffs.unshift([DIFF_EQUAL,e])}var f=b.substring(a.start2+a.length1,a.start2+a.length1+d);if(f!==''){a.diffs.push([DIFF_EQUAL,f])}a.start1-=e.length;a.start2-=e.length;a.length1+=e.length+f.length;a.length2+=e.length+f.length};diff_match_patch.prototype.patch_make=function(a,b,c){var d,text2,diffs;if(typeof b=='undefined'){diffs=a;d=this.diff_text1(diffs);text2=''}else{d=a;text2=b;if(typeof c!='undefined'){diffs=c}else{diffs=this.diff_main(d,text2,true);if(diffs.length>2){this.diff_cleanupSemantic(diffs);this.diff_cleanupEfficiency(diffs)}}}if(diffs.length===0){return[]}var e=[];var f=new patch_obj();var g=0;var h=0;var i=0;var j=d;var k=d;for(var x=0;x<diffs.length;x++){var l=diffs[x][0];var m=diffs[x][1];if(!g&&l!==DIFF_EQUAL){f.start1=h;f.start2=i}switch(l){case DIFF_INSERT:f.diffs[g++]=diffs[x];f.length2+=m.length;k=k.substring(0,i)+m+k.substring(i);break;case DIFF_DELETE:f.length1+=m.length;f.diffs[g++]=diffs[x];k=k.substring(0,i)+k.substring(i+m.length);break;case DIFF_EQUAL:if(m.length<=2*this.Patch_Margin&&g&&diffs.length!=x+1){f.diffs[g++]=diffs[x];f.length1+=m.length;f.length2+=m.length}else if(m.length>=2*this.Patch_Margin){if(g){this.patch_addContext(f,j);e.push(f);f=new patch_obj();g=0;j=k}}break}if(l!==DIFF_INSERT){h+=m.length}if(l!==DIFF_DELETE){i+=m.length}}if(g){this.patch_addContext(f,j);e.push(f)}return e};diff_match_patch.prototype.patch_apply=function(a,b){if(a.length==0){return[b,[]]}var c=[];for(var x=0;x<a.length;x++){var d=a[x];var e=new patch_obj();e.diffs=d.diffs.slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;c[x]=e}a=c;var f=this.patch_addPadding(a);b=f+b+f;this.patch_splitMax(a);var g=0;var h=[];for(var x=0;x<a.length;x++){var i=a[x].start2+g;var j=this.diff_text1(a[x].diffs);var k=this.match_main(b,j,i);if(k===null){h[x]=false}else{h[x]=true;g=k-i;var l=b.substring(k,k+j.length);if(j==l){b=b.substring(0,k)+this.diff_text2(a[x].diffs)+b.substring(k+j.length)}else{var m=this.diff_main(j,l,false);this.diff_cleanupSemanticLossless(m);var n=0;var o;for(var y=0;y<a[x].diffs.length;y++){var p=a[x].diffs[y];if(p[0]!==DIFF_EQUAL){o=this.diff_xIndex(m,n)}if(p[0]===DIFF_INSERT){b=b.substring(0,k+o)+p[1]+b.substring(k+o)}else if(p[0]===DIFF_DELETE){b=b.substring(0,k+o)+b.substring(k+this.diff_xIndex(m,n+p[1].length))}if(p[0]!==DIFF_DELETE){n+=p[1].length}}}}}b=b.substring(f.length,b.length-f.length);return[b,h]};diff_match_patch.prototype.patch_addPadding=function(a){var b='';for(var x=0;x<this.Patch_Margin;x++){b+=String.fromCharCode(x)}for(var x=0;x<a.length;x++){a[x].start1+=b.length;a[x].start2+=b.length}var c=a[0];var d=c.diffs;if(d.length==0||d[0][0]!=DIFF_EQUAL){d.unshift([DIFF_EQUAL,b]);c.start1-=b.length;c.start2-=b.length;c.length1+=b.length;c.length2+=b.length}else if(b.length>d[0][1].length){var e=b.length-d[0][1].length;d[0][1]=b.substring(d[0][1].length)+d[0][1];c.start1-=e;c.start2-=e;c.length1+=e;c.length2+=e}c=a[a.length-1];d=c.diffs;if(d.length==0||d[d.length-1][0]!=DIFF_EQUAL){d.push([DIFF_EQUAL,b]);c.length1+=b.length;c.length2+=b.length}else if(b.length>d[d.length-1][1].length){var e=b.length-d[d.length-1][1].length;d[d.length-1][1]+=b.substring(0,e);c.length1+=e;c.length2+=e}return b};diff_match_patch.prototype.patch_splitMax=function(a){for(var x=0;x<a.length;x++){if(a[x].length1>this.Match_MaxBits){var b=a[x];a.splice(x,1);var c=this.Match_MaxBits;var d=b.start1;var e=b.start2;var f='';while(b.diffs.length!==0){var g=new patch_obj();var h=true;g.start1=d-f.length;g.start2=e-f.length;if(f!==''){g.length1=g.length2=f.length;g.diffs.push([DIFF_EQUAL,f])}while(b.diffs.length!==0&&g.length1<c-this.Patch_Margin){var i=b.diffs[0][0];var j=b.diffs[0][1];if(i===DIFF_INSERT){g.length2+=j.length;e+=j.length;g.diffs.push(b.diffs.shift());h=false}else{j=j.substring(0,c-g.length1-this.Patch_Margin);g.length1+=j.length;d+=j.length;if(i===DIFF_EQUAL){g.length2+=j.length;e+=j.length}else{h=false}g.diffs.push([i,j]);if(j==b.diffs[0][1]){b.diffs.shift()}else{b.diffs[0][1]=b.diffs[0][1].substring(j.length)}}}f=this.diff_text2(g.diffs);f=f.substring(f.length-this.Patch_Margin);var k=this.diff_text1(b.diffs).substring(0,this.Patch_Margin);if(k!==''){g.length1+=k.length;g.length2+=k.length;if(g.diffs.length!==0&&g.diffs[g.diffs.length-1][0]===DIFF_EQUAL){g.diffs[g.diffs.length-1][1]+=k}else{g.diffs.push([DIFF_EQUAL,k])}}if(!h){a.splice(x++,0,g)}}}}};diff_match_patch.prototype.patch_toText=function(a){var b=[];for(var x=0;x<a.length;x++){b[x]=a[x]}return b.join('')};diff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a){return b}a=a.replace(/%00/g,'\0');var c=a.split('\n');var d=0;while(d<c.length){var m=c[d].match(/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/);if(!m){throw new Error('Invalid patch string: '+c[d]);}var e=new patch_obj();b.push(e);e.start1=parseInt(m[1],10);if(m[2]===''){e.start1--;e.length1=1}else if(m[2]=='0'){e.length1=0}else{e.start1--;e.length1=parseInt(m[2],10)}e.start2=parseInt(m[3],10);if(m[4]===''){e.start2--;e.length2=1}else if(m[4]=='0'){e.length2=0}else{e.start2--;e.length2=parseInt(m[4],10)}d++;while(d<c.length){var f=c[d].charAt(0);try{var g=decodeURI(c[d].substring(1))}catch(ex){throw new Error('Illegal escape in patch_fromText: '+g);}if(f=='-'){e.diffs.push([DIFF_DELETE,g])}else if(f=='+'){e.diffs.push([DIFF_INSERT,g])}else if(f==' '){e.diffs.push([DIFF_EQUAL,g])}else if(f=='@'){break}else if(f===''){}else{throw new Error('Invalid patch mode "'+f+'" in: '+g);}d++}}return b};function patch_obj(){this.diffs=[];this.start1=null;this.start2=null;this.length1=0;this.length2=0}patch_obj.prototype.toString=function(){var a,coords2;if(this.length1===0){a=this.start1+',0'}else if(this.length1==1){a=this.start1+1}else{a=(this.start1+1)+','+this.length1}if(this.length2===0){coords2=this.start2+',0'}else if(this.length2==1){coords2=this.start2+1}else{coords2=(this.start2+1)+','+this.length2}var b=['@@ -'+a+' +'+coords2+' @@\n'];var c;for(var x=0;x<this.diffs.length;x++){switch(this.diffs[x][0]){case DIFF_INSERT:c='+';break;case DIFF_DELETE:c='-';break;case DIFF_EQUAL:c=' ';break}b[x+1]=c+encodeURI(this.diffs[x][1])+'\n'}return b.join('').replace(/\0/g,'%00').replace(/%20/g,' ')};