                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                if(!window.__td){window.__MT=100;window.__ti=0;window.__td=[];window.__td.length=__MT;window.__noTrace=false;

}





if(typeof(vp)=="undefined")
{
var vp=function pv_vp(){if(!window.__noTrace){__td[__ti]=arguments;__ti=__ti>=__MT?0:__ti+1;}};
}





vp.comparer=function comparer(){if(!window.__noTrace){__td[__ti]=arguments;__ti=__ti>=__MT?0:__ti+1;}};







vp.comparer.caseSensitive=function comparer_caseSensitive(o1,o2)
{if(!window.__noTrace){__td[__ti]=arguments;__ti=__ti>=__MT?0:__ti+1;}
if(o1>o2)
{
return 1;
}
else if(o1<o2)
{
return-1;
}
else if(o1==o2)
{
return 0;
}
};







vp.comparer.caseInsensitive=function comparer_caseInsensitive(o1,o2)
{if(!window.__noTrace){__td[__ti]=arguments;__ti=__ti>=__MT?0:__ti+1;}
return vp.comparer.caseSensitive(o1.toLowerCase(),o2.toLowerCase());
};







vp.comparer.prefixSearchComparer=function comparer_prefixSearchComparer(o1,o2)
{if(!window.__noTrace){__td[__ti]=arguments;__ti=__ti>=__MT?0:__ti+1;}
var sCompareTo=o1.toLowerCase();
var sSubject=o2.toLowerCase();
if(sSubject.startsWith&&sSubject.startsWith(sCompareTo,true))
{
return 0;
}
return vp.comparer.caseInsensitive(sCompareTo,sSubject);
};






vp.comparer.__getComparer=function comparer___getComparer(bCaseSensitiveOrCompareFunction)
{if(!window.__noTrace){__td[__ti]=arguments;__ti=__ti>=__MT?0:__ti+1;}
if(typeof(bCaseSensitiveOrCompareFunction)=="undefined"||bCaseSensitiveOrCompareFunction===null)
{
return vp.comparer.caseSensitive;
}
else if(typeof(bCaseSensitiveOrCompareFunction)=="function")
{
return bCaseSensitiveOrCompareFunction;
}
else if(!bCaseSensitiveOrCompareFunction)
{
return vp.comparer.caseInsensitive;
}
else if(bCaseSensitiveOrCompareFunction)
{
return vp.comparer.caseSensitive;
}
};






Array.prototype.clone=function()
{


var aNew=[];

for(var i=0;i<this.length;i++)
{
aNew[i]=this[i];
}

return aNew;
};












Array.prototype.indexOf=function(vValue,bCaseSensitiveOrCompareFunction)
{
var fnCompare=vp.comparer.__getComparer(bCaseSensitiveOrCompareFunction);
var iLen=this.length;

for(var i=0;i<iLen;i++)
{
if(fnCompare(this[i],vValue)===0)
{
return i;
}
}
return-1;
};











Array.prototype.contains=function(vValue,bCaseSensitiveOrCompareFunction)
{
return this.indexOf(vValue,bCaseSensitiveOrCompareFunction)!=-1;
};






Array.prototype.add=function(vValue)
{
this.push(vValue);
};






Array.prototype.append=function(aArr)
{
var iLen=aArr.length;
for(var i=0;i<iLen;i++)
{
this.push(aArr[i]);
}
};







Array.prototype.insert=function(vValue,iIndex)
{
for(var i=this.length;i>iIndex;i--)
{
this[i]=this[i-1];
}

this[iIndex]=vValue;
};






Array.prototype.remove=function(iIndex)
{
if(typeof(iIndex)!="number")
{
throw new Error("Array.remove requires an integer argument");
}

this.splice(iIndex,1);
};





Array.prototype.removeAll=function()
{
while(this.length>0)
{
this.remove(0);
}
};






Array.prototype.removeValue=function(vValue)
{
var iIndex=this.indexOf(vValue);
if(iIndex!=-1)
{
this.remove(iIndex);
}
};













Array.prototype.binarySearch=function(vValue,bCaseSensitiveOrCompareFunction)
{
var fnCompare=vp.comparer.__getComparer(bCaseSensitiveOrCompareFunction);

var iLow,iHigh,iMid,iRound;
iLow=0;
iHigh=this.length-1;
iRound=0;

while(iLow<=iHigh){
iRound++;
iMid=Math.floor((iLow+iHigh)/2);

var iCompare=fnCompare(vValue,this[iMid]);

if(iCompare<0)
{
iHigh=iMid-1;
}
else if(iCompare>0)
{
iLow=iMid+1;
}
else
{
return iMid;
}
}

return-1;
};













Array.prototype.insertSorted=function(vValue,bCaseSensitiveOrCompareFunction)
{


if(this.length===0)
{
this.push(vValue);
return;
}

var fnCompare=vp.comparer.__getComparer(bCaseSensitiveOrCompareFunction);

var iLow,iHigh,iMid,iRound;
iLow=0;
iHigh=this.length-1;
iRound=0;

while(iLow<=iHigh){
iRound++;
iMid=Math.floor((iLow+iHigh)/2);

var iCompare=fnCompare(vValue,this[iMid]);

if(iCompare<0)
{
iHigh=iMid-1;
}
else if(iCompare>0)
{
iLow=iMid+1;
}
else
{
break;
}
}

if(fnCompare(vValue,this[iMid])>0){
this.insert(vValue,iMid+1);
}else{
this.insert(vValue,iMid);
}
};








Array.prototype.findAllStartsWith=function(sPrefix)
{

var index=this.binarySearch(sPrefix,vp.comparer.prefixSearchComparer);

if(index<0)
{
return new Array();
}

var startIndex=index;
do
{
startIndex--;
}while(startIndex>=0&&this[startIndex].startsWith(sPrefix,true));

startIndex++;

var endIndex=index+1;
while(endIndex<this.length&&this[endIndex].startsWith(sPrefix,true))
{
endIndex++;
}
endIndex--;

var results=new Array();
index=startIndex;
for(index=startIndex;index<=endIndex;index++)
{
results.push(this[index]);
}

return results;
};












Array.prototype.appendSorted=function(arr,bCaseSensitiveOrCompareFunction,bRemoveDuplicates){
var fnCompare=vp.comparer.__getComparer(bCaseSensitiveOrCompareFunction);

var arr1=this;
var arr2=arr;
var i=0;
var j=0;
var aOut=[];

while(i<arr1.length||j<arr2.length)
{
if(i>=arr1.length)
{
aOut.add(arr2[j]);
j++;
continue;
}

if(j>=arr2.length)
{
aOut.add(arr2[i]);
i++;
continue;
}

var iCompare=fnCompare(arr1[i],arr2[j]);

if(iCompare<0)
{
aOut.add(arr1[i]);
i++;
}
else if(iCompare>0)
{
aOut.add(arr2[j]);
j++;
}
else
{
aOut.add(arr1[i]);

if(!bRemoveDuplicates)
{
aOut.add(arr2[j]);
}
i++;
j++;
}
}

this.removeAll();
this.append(aOut);
};







Array.prototype.equals=function(aCompare)
{
if(this.length!=aCompare.length)
{
return false;
}

for(var i=0;i<this.length;i++)
{
if(this[i]!==aCompare[i])
{
return false;
}
}

return true;
};

if(!Array.prototype.map)
{








Array.prototype.map=function(fnAction,oThis)
{
var iLen=this.length;
if(typeof fnAction!="function")
{
throw new Error("fnAction is not a Function");
}

var aOut=new Array(iLen);

for(var i=0;i<iLen;i++)
{
if(i in this)
{
aOut[i]=fnAction.call(oThis,this[i],i,this);
}
}

return aOut;
};
}
