diff --git a/dist/js/perf.min-d2f6a521bc44202a14a7142fca26eec5.js b/dist/js/perf.min-71ebdcac5b3353a20e487769a3f20469.js similarity index 99% rename from dist/js/perf.min-d2f6a521bc44202a14a7142fca26eec5.js rename to dist/js/perf.min-71ebdcac5b3353a20e487769a3f20469.js index 850c8974..21401713 100644 --- a/dist/js/perf.min-d2f6a521bc44202a14a7142fca26eec5.js +++ b/dist/js/perf.min-71ebdcac5b3353a20e487769a3f20469.js @@ -26,7 +26,7 @@ $.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransi darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}}(jQuery),function($){function Canvas(cls,container){var element=container.children("."+cls)[0];if(null==element&&(element=document.createElement("canvas"),element.className=cls,$(element).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(container),!element.getContext)){if(!window.G_vmlCanvasManager)throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");element=window.G_vmlCanvasManager.initElement(element)}this.element=element;var context=this.context=element.getContext("2d"),devicePixelRatio=window.devicePixelRatio||1,backingStoreRatio=context.webkitBackingStorePixelRatio||context.mozBackingStorePixelRatio||context.msBackingStorePixelRatio||context.oBackingStorePixelRatio||context.backingStorePixelRatio||1;this.pixelRatio=devicePixelRatio/backingStoreRatio,this.resize(container.width(),container.height()),this.textContainer=null,this.text={},this._textCache={}}function Plot(placeholder,data_,options_,plugins){function executeHooks(hook,args){args=[plot].concat(args);for(var i=0;ii;++i)axisOptions=options.xaxes[i],axisOptions&&!axisOptions.tickColor&&(axisOptions.tickColor=axisOptions.color),axisOptions=$.extend(!0,{},options.xaxis,axisOptions),options.xaxes[i]=axisOptions,axisOptions.font&&(axisOptions.font=$.extend({},fontDefaults,axisOptions.font),axisOptions.font.color||(axisOptions.font.color=axisOptions.color),axisOptions.font.lineHeight||(axisOptions.font.lineHeight=Math.round(1.15*axisOptions.font.size)));for(axisCount=options.yaxes.length||1,i=0;axisCount>i;++i)axisOptions=options.yaxes[i],axisOptions&&!axisOptions.tickColor&&(axisOptions.tickColor=axisOptions.color),axisOptions=$.extend(!0,{},options.yaxis,axisOptions),options.yaxes[i]=axisOptions,axisOptions.font&&(axisOptions.font=$.extend({},fontDefaults,axisOptions.font),axisOptions.font.color||(axisOptions.font.color=axisOptions.color),axisOptions.font.lineHeight||(axisOptions.font.lineHeight=Math.round(1.15*axisOptions.font.size)));for(options.xaxis.noTicks&&null==options.xaxis.ticks&&(options.xaxis.ticks=options.xaxis.noTicks),options.yaxis.noTicks&&null==options.yaxis.ticks&&(options.yaxis.ticks=options.yaxis.noTicks),options.x2axis&&(options.xaxes[1]=$.extend(!0,{},options.xaxis,options.x2axis),options.xaxes[1].position="top",null==options.x2axis.min&&(options.xaxes[1].min=null),null==options.x2axis.max&&(options.xaxes[1].max=null)),options.y2axis&&(options.yaxes[1]=$.extend(!0,{},options.yaxis,options.y2axis),options.yaxes[1].position="right",null==options.y2axis.min&&(options.yaxes[1].min=null),null==options.y2axis.max&&(options.yaxes[1].max=null)),options.grid.coloredAreas&&(options.grid.markings=options.grid.coloredAreas),options.grid.coloredAreasColor&&(options.grid.markingsColor=options.grid.coloredAreasColor),options.lines&&$.extend(!0,options.series.lines,options.lines),options.points&&$.extend(!0,options.series.points,options.points),options.bars&&$.extend(!0,options.series.bars,options.bars),null!=options.shadowSize&&(options.series.shadowSize=options.shadowSize),null!=options.highlightColor&&(options.series.highlightColor=options.highlightColor),i=0;imaxIndex&&(maxIndex=sc))}maxIndex>=neededColors&&(neededColors=maxIndex+1);var c,colors=[],colorPool=options.colors,colorPoolSize=colorPool.length,variation=0;for(i=0;neededColors>i;i++)c=$.color.parse(colorPool[i%colorPoolSize]||"#666"),i%colorPoolSize==0&&i&&(variation=variation>=0?.5>variation?-variation-.2:0:-variation),colors[i]=c.scale("rgb",1+variation);var s,colori=0;for(i=0;iaxis.datamax&&max!=fakeInfinity&&(axis.datamax=max)}var i,j,k,m,s,points,ps,val,f,p,data,format,topSentry=Number.POSITIVE_INFINITY,bottomSentry=Number.NEGATIVE_INFINITY,fakeInfinity=Number.MAX_VALUE;for($.each(allAxes(),function(_,axis){axis.datamin=topSentry,axis.datamax=bottomSentry,axis.used=!1}),i=0;im;++m)val=p[m],f=format[m],f&&(f.number&&null!=val&&(val=+val,isNaN(val)?val=null:val==1/0?val=fakeInfinity:val==-(1/0)&&(val=-fakeInfinity)),null==val&&(f.required&&(nullify=!0),null!=f.defaultValue&&(val=f.defaultValue))),points[k+m]=val;if(nullify)for(m=0;ps>m;++m)val=points[k+m],null!=val&&(f=format[m],f.autoscale!==!1&&(f.x&&updateAxis(s.xaxis,val,val),f.y&&updateAxis(s.yaxis,val,val))),points[k+m]=null;else if(insertSteps&&k>0&&null!=points[k-ps]&&points[k-ps]!=points[k]&&points[k-ps+1]!=points[k+1]){for(m=0;ps>m;++m)points[k+ps+m]=points[k+m];points[k+1]=points[k-ps+1],k+=ps}}}}for(i=0;im;++m)val=points[j+m],f=format[m],f&&f.autoscale!==!1&&val!=fakeInfinity&&val!=-fakeInfinity&&(f.x&&(xmin>val&&(xmin=val),val>xmax&&(xmax=val)),f.y&&(ymin>val&&(ymin=val),val>ymax&&(ymax=val)));if(s.bars.show){var delta;switch(s.bars.align){case"left":delta=0;break;case"right":delta=-s.bars.barWidth;break;default:delta=-s.bars.barWidth/2}s.bars.horizontal?(ymin+=delta,ymax+=delta+s.bars.barWidth):(xmin+=delta,xmax+=delta+s.bars.barWidth)}updateAxis(s.xaxis,xmin,xmax),updateAxis(s.yaxis,ymin,ymax)}$.each(allAxes(),function(_,axis){axis.datamin==topSentry&&(axis.datamin=null),axis.datamax==bottomSentry&&(axis.datamax=null)})}function setupCanvases(){placeholder.css("padding",0).children().filter(function(){return!$(this).hasClass("flot-overlay")&&!$(this).hasClass("flot-base")}).remove(),"static"==placeholder.css("position")&&placeholder.css("position","relative"),surface=new Canvas("flot-base",placeholder),overlay=new Canvas("flot-overlay",placeholder),ctx=surface.context,octx=overlay.context,eventHolder=$(overlay.element).unbind();var existing=placeholder.data("plot");existing&&(existing.shutdown(),overlay.clear()),placeholder.data("plot",plot)}function bindEvents(){options.grid.hoverable&&(eventHolder.mousemove(onMouseMove),eventHolder.bind("mouseleave",onMouseLeave)),options.grid.clickable&&eventHolder.click(onClick),executeHooks(hooks.bindEvents,[eventHolder])}function shutdown(){redrawTimeout&&clearTimeout(redrawTimeout),eventHolder.unbind("mousemove",onMouseMove),eventHolder.unbind("mouseleave",onMouseLeave),eventHolder.unbind("click",onClick),executeHooks(hooks.shutdown,[eventHolder])}function setTransformationHelpers(axis){function identity(x){return x}var s,m,t=axis.options.transform||identity,it=axis.options.inverseTransform;"x"==axis.direction?(s=axis.scale=plotWidth/Math.abs(t(axis.max)-t(axis.min)),m=Math.min(t(axis.max),t(axis.min))):(s=axis.scale=plotHeight/Math.abs(t(axis.max)-t(axis.min)),s=-s,m=Math.max(t(axis.max),t(axis.min))),axis.p2c=t==identity?function(p){return(p-m)*s}:function(p){return(t(p)-m)*s},axis.c2p=it?function(c){return it(m+c/s)}:function(c){return m+c/s}}function measureTickLabels(axis){for(var opts=axis.options,ticks=axis.ticks||[],labelWidth=opts.labelWidth||0,labelHeight=opts.labelHeight||0,maxWidth=labelWidth||("x"==axis.direction?Math.floor(surface.width/(ticks.length||1)):null),legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=opts.font||"flot-tick-label tickLabel",i=0;i=0;--i)allocateAxisBoxFirstPhase(allocatedAxes[i]);adjustLayoutForThingsStickingOut(),$.each(allocatedAxes,function(_,axis){allocateAxisBoxSecondPhase(axis)})}plotWidth=surface.width-plotOffset.left-plotOffset.right,plotHeight=surface.height-plotOffset.bottom-plotOffset.top,$.each(axes,function(_,axis){setTransformationHelpers(axis)}),showGrid&&drawAxisLabels(),insertLegend()}function setRange(axis){var opts=axis.options,min=+(null!=opts.min?opts.min:axis.datamin),max=+(null!=opts.max?opts.max:axis.datamax),delta=max-min;if(0==delta){var widen=0==max?1:.01;null==opts.min&&(min-=widen),(null==opts.max||null!=opts.min)&&(max+=widen)}else{var margin=opts.autoscaleMargin;null!=margin&&(null==opts.min&&(min-=delta*margin,0>min&&null!=axis.datamin&&axis.datamin>=0&&(min=0)),null==opts.max&&(max+=delta*margin,max>0&&null!=axis.datamax&&axis.datamax<=0&&(max=0)))}axis.min=min,axis.max=max}function setupTickGeneration(axis){var noTicks,opts=axis.options;noTicks="number"==typeof opts.ticks&&opts.ticks>0?opts.ticks:.3*Math.sqrt("x"==axis.direction?surface.width:surface.height);var delta=(axis.max-axis.min)/noTicks,dec=-Math.floor(Math.log(delta)/Math.LN10),maxDec=opts.tickDecimals;null!=maxDec&&dec>maxDec&&(dec=maxDec);var size,magn=Math.pow(10,-dec),norm=delta/magn;if(1.5>norm?size=1:3>norm?(size=2,norm>2.25&&(null==maxDec||maxDec>=dec+1)&&(size=2.5,++dec)):size=7.5>norm?5:10,size*=magn,null!=opts.minTickSize&&size0&&(null==opts.min&&(axis.min=Math.min(axis.min,niceTicks[0])),null==opts.max&&niceTicks.length>1&&(axis.max=Math.max(axis.max,niceTicks[niceTicks.length-1]))),axis.tickGenerator=function(axis){var v,i,ticks=[];for(i=0;i1&&/\..*0$/.test((ts[1]-ts[0]).toFixed(extraDec))||(axis.tickDecimals=extraDec)}}}}function setTicks(axis){var oticks=axis.options.ticks,ticks=[];null==oticks||"number"==typeof oticks&&oticks>0?ticks=axis.tickGenerator(axis):oticks&&(ticks=$.isFunction(oticks)?oticks(axis):oticks);var i,v;for(axis.ticks=[],i=0;i1&&(label=t[1])):v=+t,null==label&&(label=axis.tickFormatter(v,axis)),isNaN(v)||axis.ticks.push({v:v,label:label})}}function snapRangeToTicks(axis,ticks){axis.options.autoscaleMargin&&ticks.length>0&&(null==axis.options.min&&(axis.min=Math.min(axis.min,ticks[0].v)),null==axis.options.max&&ticks.length>1&&(axis.max=Math.max(axis.max,ticks[ticks.length-1].v)))}function draw(){surface.clear(),executeHooks(hooks.drawBackground,[ctx]);var grid=options.grid;grid.show&&grid.backgroundColor&&drawBackground(),grid.show&&!grid.aboveData&&drawGrid();for(var i=0;ito){var tmp=from;from=to,to=tmp}return{from:from,to:to,axis:axis}}function drawBackground(){ctx.save(),ctx.translate(plotOffset.left,plotOffset.top),ctx.fillStyle=getColorOrGradient(options.grid.backgroundColor,plotHeight,0,"rgba(255, 255, 255, 0)"),ctx.fillRect(0,0,plotWidth,plotHeight),ctx.restore()}function drawGrid(){var i,axes,bw,bc;ctx.save(),ctx.translate(plotOffset.left,plotOffset.top);var markings=options.grid.markings;if(markings)for($.isFunction(markings)&&(axes=plot.getAxes(),axes.xmin=axes.xaxis.min,axes.xmax=axes.xaxis.max,axes.ymin=axes.yaxis.min,axes.ymax=axes.yaxis.max,markings=markings(axes)),i=0;ixrange.axis.max||yrange.toyrange.axis.max)){xrange.from=Math.max(xrange.from,xrange.axis.min),xrange.to=Math.min(xrange.to,xrange.axis.max),yrange.from=Math.max(yrange.from,yrange.axis.min),yrange.to=Math.min(yrange.to,yrange.axis.max);var xequal=xrange.from===xrange.to,yequal=yrange.from===yrange.to;if(!xequal||!yequal)if(xrange.from=Math.floor(xrange.axis.p2c(xrange.from)),xrange.to=Math.floor(xrange.axis.p2c(xrange.to)),yrange.from=Math.floor(yrange.axis.p2c(yrange.from)),yrange.to=Math.floor(yrange.axis.p2c(yrange.to)),xequal||yequal){var lineWidth=m.lineWidth||options.grid.markingsLineWidth,subPixel=lineWidth%2?.5:0;ctx.beginPath(),ctx.strokeStyle=m.color||options.grid.markingsColor,ctx.lineWidth=lineWidth,xequal?(ctx.moveTo(xrange.to+subPixel,yrange.from),ctx.lineTo(xrange.to+subPixel,yrange.to)):(ctx.moveTo(xrange.from,yrange.to+subPixel),ctx.lineTo(xrange.to,yrange.to+subPixel)),ctx.stroke()}else ctx.fillStyle=m.color||options.grid.markingsColor,ctx.fillRect(xrange.from,yrange.to,xrange.to-xrange.from,yrange.from-yrange.to)}}axes=allAxes(),bw=options.grid.borderWidth;for(var j=0;jaxis.max||"full"==t&&("object"==typeof bw&&bw[axis.position]>0||bw>0)&&(v==axis.min||v==axis.max)||("x"==axis.direction?(x=axis.p2c(v),yoff="full"==t?-plotHeight:t,"top"==axis.position&&(yoff=-yoff)):(y=axis.p2c(v),xoff="full"==t?-plotWidth:t,"left"==axis.position&&(xoff=-xoff)),1==ctx.lineWidth&&("x"==axis.direction?x=Math.floor(x)+.5:y=Math.floor(y)+.5),ctx.moveTo(x,y),ctx.lineTo(x+xoff,y+yoff))}ctx.stroke()}}bw&&(bc=options.grid.borderColor,"object"==typeof bw||"object"==typeof bc?("object"!=typeof bw&&(bw={top:bw,right:bw,bottom:bw,left:bw}),"object"!=typeof bc&&(bc={top:bc,right:bc,bottom:bc,left:bc}),bw.top>0&&(ctx.strokeStyle=bc.top,ctx.lineWidth=bw.top,ctx.beginPath(),ctx.moveTo(0-bw.left,0-bw.top/2),ctx.lineTo(plotWidth,0-bw.top/2),ctx.stroke()),bw.right>0&&(ctx.strokeStyle=bc.right,ctx.lineWidth=bw.right,ctx.beginPath(),ctx.moveTo(plotWidth+bw.right/2,0-bw.top),ctx.lineTo(plotWidth+bw.right/2,plotHeight),ctx.stroke()),bw.bottom>0&&(ctx.strokeStyle=bc.bottom,ctx.lineWidth=bw.bottom,ctx.beginPath(),ctx.moveTo(plotWidth+bw.right,plotHeight+bw.bottom/2),ctx.lineTo(0,plotHeight+bw.bottom/2),ctx.stroke()),bw.left>0&&(ctx.strokeStyle=bc.left,ctx.lineWidth=bw.left,ctx.beginPath(),ctx.moveTo(0-bw.left/2,plotHeight+bw.bottom),ctx.lineTo(0-bw.left/2,0),ctx.stroke())):(ctx.lineWidth=bw,ctx.strokeStyle=options.grid.borderColor,ctx.strokeRect(-bw/2,-bw/2,plotWidth+bw,plotHeight+bw))),ctx.restore()}function drawAxisLabels(){$.each(allAxes(),function(_,axis){var tick,x,y,halign,valign,box=axis.box,legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=axis.options.font||"flot-tick-label tickLabel";if(surface.removeText(layer),axis.show&&0!=axis.ticks.length)for(var i=0;iaxis.max||("x"==axis.direction?(halign="center",x=plotOffset.left+axis.p2c(tick.v),"bottom"==axis.position?y=box.top+box.padding:(y=box.top+box.height-box.padding,valign="bottom")):(valign="middle",y=plotOffset.top+axis.p2c(tick.v),"left"==axis.position?(x=box.left+box.width-box.padding,halign="right"):x=box.left+box.padding),surface.addText(layer,x,y,tick.label,font,null,null,halign,valign))})}function drawSeries(series){series.lines.show&&drawSeriesLines(series),series.bars.show&&drawSeriesBars(series),series.points.show&&drawSeriesPoints(series)}function drawSeriesLines(series){function plotLine(datapoints,xoffset,yoffset,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize,prevx=null,prevy=null;ctx.beginPath();for(var i=ps;i=y1&&y1=y2&&y2=y2&&y1>axisy.max){if(y2>axisy.max)continue;x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1,y1=axisy.max}else if(y2>=y1&&y2>axisy.max){if(y1>axisy.max)continue;x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1,y2=axisy.max}if(x2>=x1&&x1=x2&&x2=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1,x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1,x2=axisx.max}(x1!=prevx||y1!=prevy)&&ctx.moveTo(axisx.p2c(x1)+xoffset,axisy.p2c(y1)+yoffset),prevx=x2,prevy=y2,ctx.lineTo(axisx.p2c(x2)+xoffset,axisy.p2c(y2)+yoffset)}}ctx.stroke()}function plotLineArea(datapoints,axisx,axisy){for(var points=datapoints.points,ps=datapoints.pointsize,bottom=Math.min(Math.max(0,axisy.min),axisy.max),i=0,areaOpen=!1,ypos=1,segmentStart=0,segmentEnd=0;;){if(ps>0&&i>points.length+ps)break;i+=ps;var x1=points[i-ps],y1=points[i-ps+ypos],x2=points[i],y2=points[i+ypos];if(areaOpen){if(ps>0&&null!=x1&&null==x2){segmentEnd=i,ps=-ps,ypos=2;continue}if(0>ps&&i==segmentStart+ps){ctx.fill(),areaOpen=!1,ps=-ps,ypos=1,i=segmentStart=segmentEnd+ps;continue}}if(null!=x1&&null!=x2){if(x2>=x1&&x1=x2&&x2=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1,x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1,x2=axisx.max}if(areaOpen||(ctx.beginPath(),ctx.moveTo(axisx.p2c(x1),axisy.p2c(bottom)),areaOpen=!0),y1>=axisy.max&&y2>=axisy.max)ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.max)),ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.max));else if(y1<=axisy.min&&y2<=axisy.min)ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.min)),ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.min));else{var x1old=x1,x2old=x2;y2>=y1&&y1=axisy.min?(x1=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1,y1=axisy.min):y1>=y2&&y2=axisy.min&&(x2=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1,y2=axisy.min),y1>=y2&&y1>axisy.max&&y2<=axisy.max?(x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1,y1=axisy.max):y2>=y1&&y2>axisy.max&&y1<=axisy.max&&(x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1,y2=axisy.max),x1!=x1old&&ctx.lineTo(axisx.p2c(x1old),axisy.p2c(y1)),ctx.lineTo(axisx.p2c(x1),axisy.p2c(y1)),ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2)),x2!=x2old&&(ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2)),ctx.lineTo(axisx.p2c(x2old),axisy.p2c(y2)))}}}}ctx.save(),ctx.translate(plotOffset.left,plotOffset.top),ctx.lineJoin="round";var lw=series.lines.lineWidth,sw=series.shadowSize;if(lw>0&&sw>0){ctx.lineWidth=sw,ctx.strokeStyle="rgba(0,0,0,0.1)";var angle=Math.PI/18;plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/2),Math.cos(angle)*(lw/2+sw/2),series.xaxis,series.yaxis),ctx.lineWidth=sw/2,plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/4),Math.cos(angle)*(lw/2+sw/4),series.xaxis,series.yaxis)}ctx.lineWidth=lw,ctx.strokeStyle=series.color;var fillStyle=getFillStyle(series.lines,series.color,0,plotHeight);fillStyle&&(ctx.fillStyle=fillStyle,plotLineArea(series.datapoints,series.xaxis,series.yaxis)),lw>0&&plotLine(series.datapoints,0,0,series.xaxis,series.yaxis),ctx.restore()}function drawSeriesPoints(series){function plotPoints(datapoints,radius,fillStyle,offset,shadow,axisx,axisy,symbol){for(var points=datapoints.points,ps=datapoints.pointsize,i=0;iaxisx.max||yaxisy.max||(ctx.beginPath(),x=axisx.p2c(x),y=axisy.p2c(y)+offset,"circle"==symbol?ctx.arc(x,y,radius,0,shadow?Math.PI:2*Math.PI,!1):symbol(ctx,x,y,radius,shadow),ctx.closePath(),fillStyle&&(ctx.fillStyle=fillStyle,ctx.fill()),ctx.stroke())}}ctx.save(),ctx.translate(plotOffset.left,plotOffset.top);var lw=series.points.lineWidth,sw=series.shadowSize,radius=series.points.radius,symbol=series.points.symbol;if(0==lw&&(lw=1e-4),lw>0&&sw>0){var w=sw/2;ctx.lineWidth=w,ctx.strokeStyle="rgba(0,0,0,0.1)",plotPoints(series.datapoints,radius,null,w+w/2,!0,series.xaxis,series.yaxis,symbol),ctx.strokeStyle="rgba(0,0,0,0.2)",plotPoints(series.datapoints,radius,null,w/2,!0,series.xaxis,series.yaxis,symbol)}ctx.lineWidth=lw,ctx.strokeStyle=series.color,plotPoints(series.datapoints,radius,getFillStyle(series.points,series.color),0,!1,series.xaxis,series.yaxis,symbol),ctx.restore()}function drawBar(x,y,b,barLeft,barRight,fillStyleCallback,axisx,axisy,c,horizontal,lineWidth){var left,right,bottom,top,drawLeft,drawRight,drawTop,drawBottom,tmp;horizontal?(drawBottom=drawRight=drawTop=!0,drawLeft=!1,left=b,right=x,top=y+barLeft,bottom=y+barRight,left>right&&(tmp=right,right=left,left=tmp,drawLeft=!0,drawRight=!1)):(drawLeft=drawRight=drawTop=!0,drawBottom=!1,left=x+barLeft,right=x+barRight,bottom=b,top=y,bottom>top&&(tmp=top,top=bottom,bottom=tmp,drawBottom=!0,drawTop=!1)),rightaxisx.max||topaxisy.max||(leftaxisx.max&&(right=axisx.max,drawRight=!1),bottomaxisy.max&&(top=axisy.max,drawTop=!1),left=axisx.p2c(left),bottom=axisy.p2c(bottom),right=axisx.p2c(right),top=axisy.p2c(top),fillStyleCallback&&(c.fillStyle=fillStyleCallback(bottom,top),c.fillRect(left,top,right-left,bottom-top)), lineWidth>0&&(drawLeft||drawRight||drawTop||drawBottom)&&(c.beginPath(),c.moveTo(left,bottom),drawLeft?c.lineTo(left,top):c.moveTo(left,top),drawTop?c.lineTo(right,top):c.moveTo(right,top),drawRight?c.lineTo(right,bottom):c.moveTo(right,bottom),drawBottom?c.lineTo(left,bottom):c.moveTo(left,bottom),c.stroke()))}function drawSeriesBars(series){function plotBars(datapoints,barLeft,barRight,fillStyleCallback,axisx,axisy){for(var points=datapoints.points,ps=datapoints.pointsize,i=0;i"),fragments.push(""),rowStarted=!0),fragments.push('
'+entry.label+"")}if(rowStarted&&fragments.push(""),0!=fragments.length){var table=''+fragments.join("")+"
";if(null!=options.legend.container)$(options.legend.container).html(table);else{var pos="",p=options.legend.position,m=options.legend.margin;null==m[0]&&(m=[m,m]),"n"==p.charAt(0)?pos+="top:"+(m[1]+plotOffset.top)+"px;":"s"==p.charAt(0)&&(pos+="bottom:"+(m[1]+plotOffset.bottom)+"px;"),"e"==p.charAt(1)?pos+="right:"+(m[0]+plotOffset.right)+"px;":"w"==p.charAt(1)&&(pos+="left:"+(m[0]+plotOffset.left)+"px;");var legend=$('
'+table.replace('style="','style="position:absolute;'+pos+";")+"
").appendTo(placeholder);if(0!=options.legend.backgroundOpacity){var c=options.legend.backgroundColor;null==c&&(c=options.grid.backgroundColor,c=c&&"string"==typeof c?$.color.parse(c):$.color.extract(legend,"background-color"),c.a=1,c=c.toString());var div=legend.children();$('
').prependTo(legend).css("opacity",options.legend.backgroundOpacity)}}}}}function findNearbyItem(mouseX,mouseY,seriesFilter){var i,j,ps,maxDistance=options.grid.mouseActiveRadius,smallestDistance=maxDistance*maxDistance+1,item=null;for(i=series.length-1;i>=0;--i)if(seriesFilter(series[i])){var s=series[i],axisx=s.xaxis,axisy=s.yaxis,points=s.datapoints.points,mx=axisx.c2p(mouseX),my=axisy.c2p(mouseY),maxx=maxDistance/axisx.scale,maxy=maxDistance/axisy.scale;if(ps=s.datapoints.pointsize,axisx.options.inverseTransform&&(maxx=Number.MAX_VALUE),axisy.options.inverseTransform&&(maxy=Number.MAX_VALUE),s.lines.show||s.points.show)for(j=0;jmaxx||-maxx>x-mx||y-my>maxy||-maxy>y-my)){var dx=Math.abs(axisx.p2c(x)-mouseX),dy=Math.abs(axisy.p2c(y)-mouseY),dist=dx*dx+dy*dy;smallestDistance>dist&&(smallestDistance=dist,item=[i,j/ps])}}if(s.bars.show&&!item){var barLeft,barRight;switch(s.bars.align){case"left":barLeft=0;break;case"right":barLeft=-s.bars.barWidth;break;default:barLeft=-s.bars.barWidth/2}for(barRight=barLeft+s.bars.barWidth,j=0;j=Math.min(b,x)&&my>=y+barLeft&&y+barRight>=my:mx>=x+barLeft&&x+barRight>=mx&&my>=Math.min(b,y)&&my<=Math.max(b,y))&&(item=[i,j/ps])}}}return item?(i=item[0],j=item[1],ps=series[i].datapoints.pointsize,{datapoint:series[i].datapoints.points.slice(j*ps,(j+1)*ps),dataIndex:j,series:series[i],seriesIndex:i}):null}function onMouseMove(e){options.grid.hoverable&&triggerClickHoverEvent("plothover",e,function(s){return 0!=s.hoverable})}function onMouseLeave(e){options.grid.hoverable&&triggerClickHoverEvent("plothover",e,function(){return!1})}function onClick(e){triggerClickHoverEvent("plotclick",e,function(s){return 0!=s.clickable})}function triggerClickHoverEvent(eventname,event,seriesFilter){var offset=eventHolder.offset(),canvasX=event.pageX-offset.left-plotOffset.left,canvasY=event.pageY-offset.top-plotOffset.top,pos=canvasToAxisCoords({left:canvasX,top:canvasY});pos.pageX=event.pageX,pos.pageY=event.pageY;var item=findNearbyItem(canvasX,canvasY,seriesFilter);if(item&&(item.pageX=parseInt(item.series.xaxis.p2c(item.datapoint[0])+offset.left+plotOffset.left,10),item.pageY=parseInt(item.series.yaxis.p2c(item.datapoint[1])+offset.top+plotOffset.top,10)),options.grid.autoHighlight){for(var i=0;iaxisx.max||yaxisy.max)){var pointRadius=series.points.radius+series.points.lineWidth/2;octx.lineWidth=pointRadius,octx.strokeStyle=highlightColor;var radius=1.5*pointRadius;x=axisx.p2c(x),y=axisy.p2c(y),octx.beginPath(),"circle"==series.points.symbol?octx.arc(x,y,radius,0,2*Math.PI,!1):series.points.symbol(octx,x,y,radius,!1),octx.closePath(),octx.stroke()}}function drawBarHighlight(series,point){var barLeft,highlightColor="string"==typeof series.highlightColor?series.highlightColor:$.color.parse(series.color).scale("a",.5).toString(),fillStyle=highlightColor;switch(series.bars.align){case"left":barLeft=0;break;case"right":barLeft=-series.bars.barWidth;break;default:barLeft=-series.bars.barWidth/2}octx.lineWidth=series.bars.lineWidth,octx.strokeStyle=highlightColor,drawBar(point[0],point[1],point[2]||0,barLeft,barLeft+series.bars.barWidth,function(){return fillStyle},series.xaxis,series.yaxis,octx,series.bars.horizontal,series.bars.lineWidth)}function getColorOrGradient(spec,bottom,top,defaultColor){if("string"==typeof spec)return spec;for(var gradient=ctx.createLinearGradient(0,top,0,bottom),i=0,l=spec.colors.length;l>i;++i){var c=spec.colors[i];if("string"!=typeof c){var co=$.color.parse(defaultColor);null!=c.brightness&&(co=co.scale("rgb",c.brightness)),null!=c.opacity&&(co.a*=c.opacity),c=co.toString()}gradient.addColorStop(i/(l-1),c)}return gradient}var series=[],options={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:!0,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:.85,sorted:null},xaxis:{show:null,position:"bottom",mode:null,font:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null},yaxis:{autoscaleMargin:.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:!1,radius:3,lineWidth:2,fill:!0,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:!1,fillColor:null,steps:!1},bars:{show:!1,lineWidth:2,barWidth:1,fill:!0,fillColor:null,align:"left",horizontal:!1,zero:!0},shadowSize:3,highlightColor:null},grid:{show:!0,aboveData:!1,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,margin:0,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:!1,hoverable:!1,autoHighlight:!0,mouseActiveRadius:10},interaction:{redrawOverlayInterval:1e3/60},hooks:{}},surface=null,overlay=null,eventHolder=null,ctx=null,octx=null,xaxes=[],yaxes=[],plotOffset={left:0,right:0,top:0,bottom:0},plotWidth=0,plotHeight=0,hooks={processOptions:[],processRawData:[],processDatapoints:[],processOffset:[],drawBackground:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},plot=this;plot.setData=setData,plot.setupGrid=setupGrid,plot.draw=draw,plot.getPlaceholder=function(){return placeholder},plot.getCanvas=function(){return surface.element},plot.getPlotOffset=function(){return plotOffset},plot.width=function(){return plotWidth},plot.height=function(){return plotHeight},plot.offset=function(){var o=eventHolder.offset();return o.left+=plotOffset.left,o.top+=plotOffset.top,o},plot.getData=function(){return series},plot.getAxes=function(){var res={};return $.each(xaxes.concat(yaxes),function(_,axis){axis&&(res[axis.direction+(1!=axis.n?axis.n:"")+"axis"]=axis)}),res},plot.getXAxes=function(){return xaxes},plot.getYAxes=function(){return yaxes},plot.c2p=canvasToAxisCoords,plot.p2c=axisToCanvasCoords,plot.getOptions=function(){return options},plot.highlight=highlight,plot.unhighlight=unhighlight,plot.triggerRedrawOverlay=triggerRedrawOverlay,plot.pointOffset=function(point){return{left:parseInt(xaxes[axisNumber(point,"x")-1].p2c(+point.x)+plotOffset.left,10),top:parseInt(yaxes[axisNumber(point,"y")-1].p2c(+point.y)+plotOffset.top,10)}},plot.shutdown=shutdown,plot.destroy=function(){shutdown(),placeholder.removeData("plot").empty(),series=[],options=null,surface=null,overlay=null,eventHolder=null,ctx=null,octx=null,xaxes=[],yaxes=[],hooks=null,highlights=[],plot=null},plot.resize=function(){var width=placeholder.width(),height=placeholder.height();surface.resize(width,height),overlay.resize(width,height)},plot.hooks=hooks,initPlugins(plot),parseOptions(options_),setupCanvases(),setData(data_),setupGrid(),draw(),bindEvents();var highlights=[],redrawTimeout=null}function floorInBase(n,base){return base*Math.floor(n/base)}var hasOwnProperty=Object.prototype.hasOwnProperty;$.fn.detach||($.fn.detach=function(){return this.each(function(){this.parentNode&&this.parentNode.removeChild(this)})}),Canvas.prototype.resize=function(width,height){if(0>=width||0>=height)throw new Error("Invalid dimensions for plot, width = "+width+", height = "+height);var element=this.element,context=this.context,pixelRatio=this.pixelRatio;this.width!=width&&(element.width=width*pixelRatio,element.style.width=width+"px",this.width=width),this.height!=height&&(element.height=height*pixelRatio,element.style.height=height+"px",this.height=height),context.restore(),context.save(),context.scale(pixelRatio,pixelRatio)},Canvas.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},Canvas.prototype.render=function(){var cache=this._textCache;for(var layerKey in cache)if(hasOwnProperty.call(cache,layerKey)){var layer=this.getTextLayer(layerKey),layerCache=cache[layerKey];layer.hide();for(var styleKey in layerCache)if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache)if(hasOwnProperty.call(styleCache,key)){for(var position,positions=styleCache[key].positions,i=0;position=positions[i];i++)position.active?position.rendered||(layer.append(position.element),position.rendered=!0):(positions.splice(i--,1),position.rendered&&position.element.detach());0==positions.length&&delete styleCache[key]}}layer.show()}},Canvas.prototype.getTextLayer=function(classes){var layer=this.text[classes];return null==layer&&(null==this.textContainer&&(this.textContainer=$("
").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)),layer=this.text[classes]=$("
").addClass(classes).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)),layer},Canvas.prototype.getTextInfo=function(layer,text,font,angle,width){var textStyle,layerCache,styleCache,info;if(text=""+text,textStyle="object"==typeof font?font.style+" "+font.variant+" "+font.weight+" "+font.size+"px/"+font.lineHeight+"px "+font.family:font,layerCache=this._textCache[layer],null==layerCache&&(layerCache=this._textCache[layer]={}),styleCache=layerCache[textStyle],null==styleCache&&(styleCache=layerCache[textStyle]={}),info=styleCache[text],null==info){var element=$("
").html(text).css({position:"absolute","max-width":width,top:-9999}).appendTo(this.getTextLayer(layer));"object"==typeof font?element.css({font:textStyle,color:font.color}):"string"==typeof font&&element.addClass(font),info=styleCache[text]={width:element.outerWidth(!0),height:element.outerHeight(!0),element:element,positions:[]},element.detach()}return info},Canvas.prototype.addText=function(layer,x,y,text,font,angle,width,halign,valign){var info=this.getTextInfo(layer,text,font,angle,width),positions=info.positions;"center"==halign?x-=info.width/2:"right"==halign&&(x-=info.width),"middle"==valign?y-=info.height/2:"bottom"==valign&&(y-=info.height);for(var position,i=0;position=positions[i];i++)if(position.x==x&&position.y==y)return void(position.active=!0);position={active:!0,rendered:!1,element:positions.length?info.element.clone():info.element,x:x,y:y},positions.push(position),position.element.css({top:Math.round(y),left:Math.round(x),"text-align":halign})},Canvas.prototype.removeText=function(layer,x,y,text,font,angle){if(null==text){var layerCache=this._textCache[layer];if(null!=layerCache)for(var styleKey in layerCache)if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache)if(hasOwnProperty.call(styleCache,key))for(var position,positions=styleCache[key].positions,i=0;position=positions[i];i++)position.active=!1}}else for(var position,positions=this.getTextInfo(layer,text,font,angle).positions,i=0;position=positions[i];i++)position.x==x&&position.y==y&&(position.active=!1)},$.plot=function(placeholder,data,options){var plot=new Plot($(placeholder),data,options,$.plot.plugins);return plot},$.plot.version="0.8.3",$.plot.plugins=[],$.fn.plot=function(data,options){return this.each(function(){$.plot(this,data,options)})}}(jQuery),function($){function floorInBase(n,base){return base*Math.floor(n/base)}function formatDate(d,fmt,monthNames,dayNames){if("function"==typeof d.strftime)return d.strftime(fmt);var leftPad=function(n,pad){return n=""+n,pad=""+(null==pad?"0":pad),1==n.length?pad+n:n},r=[],escape=!1,hours=d.getHours(),isAM=12>hours;null==monthNames&&(monthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),null==dayNames&&(dayNames=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]);var hours12;hours12=hours>12?hours-12:0==hours?12:hours;for(var i=0;i=minSize);++i);var size=spec[i][0],unit=spec[i][1];if("year"==unit){if(null!=opts.minTickSize&&"year"==opts.minTickSize[1])size=Math.floor(opts.minTickSize[0]);else{var magn=Math.pow(10,Math.floor(Math.log(axis.delta/timeUnitSize.year)/Math.LN10)),norm=axis.delta/timeUnitSize.year/magn;size=1.5>norm?1:3>norm?2:7.5>norm?5:10,size*=magn}1>size&&(size=1)}axis.tickSize=opts.tickSize||[size,unit];var tickSize=axis.tickSize[0];unit=axis.tickSize[1];var step=tickSize*timeUnitSize[unit];"second"==unit?d.setSeconds(floorInBase(d.getSeconds(),tickSize)):"minute"==unit?d.setMinutes(floorInBase(d.getMinutes(),tickSize)):"hour"==unit?d.setHours(floorInBase(d.getHours(),tickSize)):"month"==unit?d.setMonth(floorInBase(d.getMonth(),tickSize)):"quarter"==unit?d.setMonth(3*floorInBase(d.getMonth()/3,tickSize)):"year"==unit&&d.setFullYear(floorInBase(d.getFullYear(),tickSize)),d.setMilliseconds(0),step>=timeUnitSize.minute&&d.setSeconds(0),step>=timeUnitSize.hour&&d.setMinutes(0),step>=timeUnitSize.day&&d.setHours(0),step>=4*timeUnitSize.day&&d.setDate(1),step>=2*timeUnitSize.month&&d.setMonth(floorInBase(d.getMonth(),3)),step>=2*timeUnitSize.quarter&&d.setMonth(floorInBase(d.getMonth(),6)),step>=timeUnitSize.year&&d.setMonth(0);var prev,carry=0,v=Number.NaN;do if(prev=v,v=d.getTime(),ticks.push(v),"month"==unit||"quarter"==unit)if(1>tickSize){d.setDate(1);var start=d.getTime();d.setMonth(d.getMonth()+("quarter"==unit?3:1));var end=d.getTime();d.setTime(v+carry*timeUnitSize.hour+(end-start)*tickSize),carry=d.getHours(),d.setHours(0)}else d.setMonth(d.getMonth()+tickSize*("quarter"==unit?3:1));else"year"==unit?d.setFullYear(d.getFullYear()+tickSize):d.setTime(v+step);while(vt?e:t>o?o:t}function l(e,o){var n=t.getOptions(),i=t.getPlaceholder().offset(),s=t.getPlotOffset();e.x=c(0,o.pageX-i.left-s.left,t.width()),e.y=c(0,o.pageY-i.top-s.top,t.height()),"y"==n.selection.mode&&(e.x=e==h.first?0:t.width()),"x"==n.selection.mode&&(e.y=e==h.first?0:t.height())}function a(e){null!=e.pageX&&(l(h.second,e),g()?(h.show=!0,t.triggerRedrawOverlay()):u(!0))}function u(e){h.show&&(h.show=!1,t.triggerRedrawOverlay(),e||t.getPlaceholder().trigger("plotunselected",[]))}function d(e,o){var n,i,s,r,c=t.getAxes();for(var l in c)if(n=c[l],n.direction==o&&(r=o+n.n+"axis",e[r]||1!=n.n||(r=o+"axis"),e[r])){i=e[r].from,s=e[r].to;break}if(e[r]||(n="x"==o?t.getXAxes()[0]:t.getYAxes()[0],i=e[o+"1"],s=e[o+"2"]),null!=i&&null!=s&&i>s){var a=i;i=s,s=a}return{from:i,to:s,axis:n}}function f(e,o){var n,i=t.getOptions();"y"==i.selection.mode?(h.first.x=0,h.second.x=t.width()):(n=d(e,"x"),h.first.x=n.axis.p2c(n.from),h.second.x=n.axis.p2c(n.to)),"x"==i.selection.mode?(h.first.y=0,h.second.y=t.height()):(n=d(e,"y"),h.first.y=n.axis.p2c(n.from),h.second.y=n.axis.p2c(n.to)),h.show=!0,t.triggerRedrawOverlay(),!o&&g()&&r()}function g(){var e=t.getOptions().selection.minSize;return Math.abs(h.second.x-h.first.x)>=e&&Math.abs(h.second.y-h.first.y)>=e}var h={first:{x:-1,y:-1},second:{x:-1,y:-1},show:!1,active:!1},m={},x=null;t.clearSelection=u,t.setSelection=f,t.getSelection=s,t.hooks.bindEvents.push(function(e,t){var i=e.getOptions();null!=i.selection.mode&&(t.mousemove(o),t.mousedown(n))}),t.hooks.drawOverlay.push(function(t,o){if(h.show&&g()){var n=t.getPlotOffset(),i=t.getOptions();o.save(),o.translate(n.left,n.top);var s=e.color.parse(i.selection.color);o.strokeStyle=s.scale("a",.8).toString(),o.lineWidth=1,o.lineJoin=i.selection.shape,o.fillStyle=s.scale("a",.4).toString();var r=Math.min(h.first.x,h.second.x)+.5,c=Math.min(h.first.y,h.second.y)+.5,l=Math.abs(h.second.x-h.first.x)-1,a=Math.abs(h.second.y-h.first.y)-1;o.fillRect(r,c,l,a),o.strokeRect(r,c,l,a),o.restore()}}),t.hooks.shutdown.push(function(t,i){i.unbind("mousemove",o),i.unbind("mousedown",n),x&&e(document).unbind("mouseup",x)})}e.plot.plugins.push({init:t,options:{selection:{mode:null,color:"#e8cfac",shape:"round",minSize:5}},name:"selection",version:"1.1"})}(jQuery),function(J,r,f){function s(a,b,d){a.addEventListener?a.addEventListener(b,d,!1):a.attachEvent("on"+b,d)}function A(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);return a.shiftKey||(b=b.toLowerCase()),b}return h[a.which]?h[a.which]:B[a.which]?B[a.which]:String.fromCharCode(a.which).toLowerCase()}function t(a){a=a||{};var d,b=!1;for(d in n)a[d]?b=!0:n[d]=0;b||(u=!1)}function C(a,b,d,c,e,v){var g,k,f=[],h=d.type;if(!l[a])return[];for("keyup"==h&&w(a)&&(b=[a]),g=0;g95&&112>g||h.hasOwnProperty(g)&&(p[h[g]]=g)}e=p[d]?"keydown":"keypress"}return"keypress"==e&&f.length&&(e="keydown"),{key:c,modifiers:f,action:e}}function F(a,b,d,c,e){q[a+":"+d]=b,a=a.replace(/\s+/g," ");var f=a.split(" ");1":".","?":"/","|":"\\"},G={option:"alt",command:"meta","return":"enter",escape:"esc",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},l={},q={},n={},z=!1,I=!1,u=!1;for(f=1;20>f;++f)h[111+f]="f"+f;for(f=0;9>=f;++f)h[f+96]=f;s(r,"keypress",y),s(r,"keydown",y),s(r,"keyup",y);var m={bind:function(a,b,d){a=a instanceof Array?a:[a];for(var c=0;c=0?flotSeriesData[prevDataPointIndex][1]:v,dv=v-v0,dvp=v/v0-1;$scope.tooltipContent={revision:"(loading revision...)",revisionHref:"",branch:dataPoint.projectName,test:phSeries.name,platform:phSeries.platform,machine:phSeries.machine||"mean",value:Math.round(1e3*v)/1e3,deltaValue:dv.toFixed(1),deltaPerfcentValue:(100*dvp).toFixed(1),date:$.plot.formatDate(new Date(t),"%a %b %d, %H:%M:%S")},$http.get(thServiceDomain+"/api/project/"+phSeries.projectName+"/resultset/"+dataPoint.resultSetId).then(function(response){var revision=response.data.revisions[0].revision;$scope.tooltipContent.revision=revision,dataPoint.revision=revision;var project=_.findWhere($scope.projects,{name:phSeries.projectName});$scope.tooltipContent.revisionHref=project.url+"/rev/"+revision}),$timeout(function(){function getTipPosition(tip,x,y,yoffset){return{left:x-tip.width()/2,top:y-tip.height()-yoffset}}var x=parseInt(flotData.series.xaxis.p2c(t)+$scope.plot.offset().left),y=parseInt(flotData.series.yaxis.p2c(v)+$scope.plot.offset().top),tip=$("#graph-tooltip");tip.stop(!0);var tipPosition=getTipPosition(tip,x,y,10);tip.css({left:tipPosition.left,top:tipPosition.top});var tipPosition=getTipPosition(tip,x,y,10);"hidden"==tip.css("visibility")?(tip.css({opacity:0,visibility:"visible",left:tipPosition.left,top:tipPosition.top+10}),tip.animate({opacity:1,left:tipPosition.left,top:tipPosition.top},250)):tip.css({opacity:1,left:tipPosition.left,top:tipPosition.top})})}function hideTooltip(now){var tip=$("#graph-tooltip");$scope.ttHideTimer||"visible"!=tip.css("visibility")||($scope.ttHideTimer=setTimeout(function(){$scope.ttHideTimer=null,tip.animate({opacity:0,top:"+=10"},250,"linear",function(){$(this).css({visibility:"hidden"})})},now?0:250))}function highlightDataPoints(){if($scope.plot.unhighlight(),$scope.seriesList.forEach(function(series,i){series.highlighted&&series.highlighted.length>0&&series.visible&&($scope.resetHighlightButton=!0,$scope.revisionToHighlight=series.highlighted[1],$scope.plot.highlight(i,series.highlighted[0]))}),$scope.selectedDataPoint){var selectedSeriesIndex=_.findIndex($scope.seriesList,function(s){return s.projectName==$scope.selectedDataPoint.projectName&&s.signature==$scope.selectedDataPoint.signature}),selectedSeries=$scope.seriesList[selectedSeriesIndex],flotDataPoint=selectedSeries.flotSeries.resultSetData.indexOf($scope.selectedDataPoint.resultSetId)+$scope.selectedDataPoint.flotDataOffset;$scope.plot.highlight(selectedSeriesIndex,flotDataPoint)}}function plotOverviewGraph(){$scope.seriesList.forEach(function(series){series.flotSeries.points.show=!1,series.flotSeries.lines.show=series.visible}),$scope.overviewPlot=$.plot($("#overview-plot"),$scope.seriesList.map(function(series){return series.flotSeries}),{xaxis:{mode:"time"},selection:{mode:"xy",color:"#97c6e5"},series:{shadowSize:0},lines:{show:!0},points:{show:!1},legend:{show:!1},grid:{color:"#cdd6df",borderWidth:2,backgroundColor:"#fff",hoverable:!0,clickable:!0,autoHighlight:!1}}),$scope.seriesList.forEach(function(series){series.flotSeries.points.show=series.visible,series.flotSeries.lines.show=!1}),$("#overview-plot").bind("plotselected",function(event,ranges){deselectDataPoint(),hideTooltip(),$.each($scope.plot.getXAxes(),function(_,axis){var opts=axis.options;opts.min=ranges.xaxis.from,opts.max=ranges.xaxis.to}),$.each($scope.plot.getYAxes(),function(_,axis){var opts=axis.options;opts.min=ranges.yaxis.from,opts.max=ranges.yaxis.to}),$scope.zoom={x:[ranges.xaxis.from,ranges.xaxis.to],y:[ranges.yaxis.from,ranges.yaxis.to]},$scope.plot.setupGrid(),$scope.plot.draw(),updateURL()})}function zoomGraph(){$scope.zoom.x&&_.find($scope.seriesList,function(series){return series.visible})&&($.each($scope.plot.getXAxes(),function(_,axis){var opts=axis.options;opts.min=$scope.zoom.x[0],opts.max=$scope.zoom.x[1]}),$.each($scope.plot.getYAxes(),function(_,axis){var opts=axis.options;opts.min=$scope.zoom.y[0],opts.max=$scope.zoom.y[1]}),$scope.plot.setupGrid(),$scope.overviewPlot.setSelection({xaxis:{from:$scope.zoom.x[0],to:$scope.zoom.x[1]},yaxis:{from:$scope.zoom.y[0],to:$scope.zoom.y[1]}}),$scope.overviewPlot.draw(),$scope.plot.draw())}function plotGraph(){function updateSelectedItem(){if($scope.subtestResults=null,!$scope.selectedDataPoint)return void hideTooltip();var selectedSeriesIndex=_.findIndex($scope.seriesList,function(s){return s.projectName==$scope.selectedDataPoint.projectName&&s.signature==$scope.selectedDataPoint.signature}),selectedSeries=$scope.seriesList[selectedSeriesIndex];if(selectedSeries.subtestSignatures){var uri=thServiceDomain+"/api/project/"+selectedSeries.projectName+"/performance-data/0/get_signature_properties/?";selectedSeries.subtestSignatures.forEach(function(signature){uri+="signatures="+signature+"&"});var subtestResultsMap={};$http.get(uri).then(function(response){var i=0;selectedSeries.subtestSignatures.forEach(function(signature){subtestResultsMap[signature]={test:response.data[i].test,signature:signature,projectName:selectedSeries.projectName},i++});var uri2=thServiceDomain+"/api/project/"+selectedSeries.projectName+"/performance-data/0/get_performance_data/?interval_seconds="+$scope.myTimerange.value;selectedSeries.subtestSignatures.forEach(function(signature){uri2+="&signatures="+signature}),$http.get(uri2).then(function(response){response.data.forEach(function(data){var perfData=data.blob,i=_.findIndex(perfData,function(v){return v.result_set_id==$scope.selectedDataPoint.resultSetId}),v=perfData[i].mean,v0=i?perfData[i-1].mean:v,dv=v-v0,dvp=v/v0-1;subtestResultsMap[data.series_signature]=jQuery.extend({value:v.toFixed(2),dvalue:dv.toFixed(2),dpercent:(100*dvp).toFixed(1)},subtestResultsMap[data.series_signature])}),$scope.subtestResults=Object.keys(subtestResultsMap).map(function(k){return subtestResultsMap[k]}).sort(function(a,b){return parseFloat(a.dpercent)0){var result_set_id=response.data.results[0].id,j=series.flotSeries.resultSetData.indexOf(result_set_id),seriesToaddHighlight=_.find($scope.seriesList,function(sr){return sr.signature==series.signature});seriesToaddHighlight.highlighted=[j,rev]}}):null})).then(function(){updateURL(),plotGraph()})},$scope.addSeries=function(project,signature){$scope.addSeriesList([{project:project,signature:signature,visible:!0}]),updateURL()};var optionCollectionMap={};$http.get(thServiceDomain+"/api/optioncollectionhash").then(function(response){response.data.forEach(function(dict){optionCollectionMap[dict.option_collection_hash]=dict.options.map(function(option){return option.name}).join(" ")})}).then(function(){if($stateParams.series){$scope.seriesList=[],_.isString($stateParams.series)&&($stateParams.series=[$stateParams.series]),$scope.highlightedRevision=$stateParams.highlightedRevision?$stateParams.highlightedRevision:"",$scope.zoom=$stateParams.zoom?JSON.parse($stateParams.zoom):{};var partialSeriesList=$stateParams.series.map(function(encodedSeries){return JSON.parse(decodeURIComponent(encodedSeries))});$scope.addSeriesList(partialSeriesList)}else $scope.seriesList=[];$http.get(thServiceDomain+"/api/repository/").then(function(response){$scope.projects=response.data,$scope.addTestData=function(){var defaultProjectName,defaultPlatform;if($scope.seriesList.length>0){var lastSeries=$scope.seriesList.slice(-1)[0];defaultProjectName=lastSeries.projectName,defaultPlatform=lastSeries.platform}var modalInstance=$modal.open({templateUrl:"partials/perf/testdatachooser.html",controller:"TestChooserCtrl",resolve:{projects:function(){return $scope.projects},optionCollectionMap:function(){return optionCollectionMap},timeRange:function(){return $scope.myTimerange.value},defaultProjectName:function(){return defaultProjectName},defaultPlatform:function(){return defaultPlatform}}});modalInstance.opened.then(function(){window.setTimeout(function(){modalInstance.updateTestInput()},0)}),modalInstance.result.then(function(series){series.highlighted=[],series.visible=!0,series.color=availableColors.pop(),$scope.seriesList.push(series),$scope.highlightedRevision||($scope.highlightedRevision=""),$scope.zoom||($scope.zoom={}),updateURL(),getSeriesData(series).then(function(){plotGraph(),$scope.highlightRevision()})})}})})}]),perf.controller("TestChooserCtrl",function($scope,$modalInstance,$http,projects,optionCollectionMap,timeRange,thServiceDomain,getSeriesSummary,defaultProjectName,defaultPlatform){$scope.timeRange=timeRange,$scope.projects=projects,$scope.selectedProject=defaultProjectName?_.findWhere(projects,{name:defaultProjectName}):projects[0],$scope.loadingTestData=!1;var testInputCreated=!1;$scope.addTestData=function(){var series=_.clone($scope.selectedSeries);series.projectName=$scope.selectedProject.name,$modalInstance.close(series)},$scope.cancel=function(){$modalInstance.dismiss("cancel")},$scope.updateTestInput=function(){$scope.addTestDataDisabled=!0,$scope.loadingTestData=!0,$scope.platformList=[],$http.get(thServiceDomain+"/api/project/"+$scope.selectedProject.name+"/performance-data/0/get_performance_series_summary/?interval="+$scope.timeRange).then(function(response){var data=response.data,seriesList=[];Object.keys(data).forEach(function(signature){var seriesSummary=getSeriesSummary(signature,data[signature],optionCollectionMap),platform=seriesSummary.platform;-1===$scope.platformList.indexOf(platform)&&$scope.platformList.push(platform),seriesList.push(seriesSummary)}),$scope.platformList.sort(),$scope.selectedPlatform=defaultPlatform||$scope.platformList[0],$scope.updateTestSelector=function(){var filteredSeriesList=seriesList.filter(function(series){return series.platform===$scope.selectedPlatform}).sort(function(a,b){return a.name>b.name}),signatures=new Bloodhound({datumTokenizer:Bloodhound.tokenizers.obj.whitespace("name"),queryTokenizer:Bloodhound.tokenizers.whitespace,limit:100,local:filteredSeriesList});signatures.initialize(),testInputCreated&&$(".typeahead").typeahead("destroy"),$(".typeahead").typeahead(null,{name:"signatures",displayKey:"name",source:signatures.ttAdapter(),limit:100}).on("typeahead:selected",function(obj,datum){$scope.selectedSeries=datum,$scope.addTestDataDisabled=!1}),testInputCreated=!0},$scope.updateTestSelector(),$scope.loadingTestData=!1})},$modalInstance.updateTestInput=$scope.updateTestInput}),perf.config(function($stateProvider,$urlRouterProvider){$urlRouterProvider.deferIntercept(),$stateProvider.state("graphs",{templateUrl:"partials/perf/perfctrl.html",url:"/graphs?timerange&series&highlightedRevision&zoom",controller:"PerfCtrl"}),$urlRouterProvider.otherwise("/graphs")}).run(function($rootScope,$urlRouter,$location,$state){$rootScope.$on("$locationChangeSuccess",function(e){e.preventDefault(),"graphs"!==$state.current.name&&$urlRouter.sync()}),$urlRouter.listen()});angular.module('perf').run(['$templateCache', function($templateCache) { +}),phSeries=$scope.seriesList[phSeriesIndex],flotData={series:_.find($scope.plot.getData(),function(fs){return fs.thSeries.projectName==dataPoint.projectName&&fs.thSeries.signature==dataPoint.signature}),pointIndex:phSeries.flotSeries.resultSetData.indexOf(dataPoint.resultSetId)+dataPoint.flotDataOffset},prevDataPointIndex=flotData.pointIndex-dataPoint.flotDataOffset-1,flotSeriesData=flotData.series.data,t=flotSeriesData[flotData.pointIndex][0],v=flotSeriesData[flotData.pointIndex][1],v0=prevDataPointIndex>=0?flotSeriesData[prevDataPointIndex][1]:v,dv=v-v0,dvp=v/v0-1;$scope.tooltipContent={revision:"(loading revision...)",revisionHref:"",branch:dataPoint.projectName,test:phSeries.name,platform:phSeries.platform,machine:phSeries.machine||"mean",value:Math.round(1e3*v)/1e3,deltaValue:dv.toFixed(1),deltaPerfcentValue:(100*dvp).toFixed(1),date:$.plot.formatDate(new Date(t),"%a %b %d, %H:%M:%S")},$http.get(thServiceDomain+"/api/project/"+phSeries.projectName+"/resultset/"+dataPoint.resultSetId).then(function(response){var revision=response.data.revisions[0].revision;$scope.tooltipContent.revision=revision,dataPoint.revision=revision;var project=_.findWhere($scope.projects,{name:phSeries.projectName});$scope.tooltipContent.revisionHref=project.url+"/rev/"+revision}),$timeout(function(){function getTipPosition(tip,x,y,yoffset){return{left:x-tip.width()/2,top:y-tip.height()-yoffset}}var x=parseInt(flotData.series.xaxis.p2c(t)+$scope.plot.offset().left),y=parseInt(flotData.series.yaxis.p2c(v)+$scope.plot.offset().top),tip=$("#graph-tooltip");tip.stop(!0);var tipPosition=getTipPosition(tip,x,y,10);tip.css({left:tipPosition.left,top:tipPosition.top});var tipPosition=getTipPosition(tip,x,y,10);"hidden"==tip.css("visibility")?(tip.css({opacity:0,visibility:"visible",left:tipPosition.left,top:tipPosition.top+10}),tip.animate({opacity:1,left:tipPosition.left,top:tipPosition.top},250)):tip.css({opacity:1,left:tipPosition.left,top:tipPosition.top})})}function hideTooltip(now){var tip=$("#graph-tooltip");$scope.ttHideTimer||"visible"!=tip.css("visibility")||($scope.ttHideTimer=setTimeout(function(){$scope.ttHideTimer=null,tip.animate({opacity:0,top:"+=10"},250,"linear",function(){$(this).css({visibility:"hidden"})})},now?0:250))}function highlightDataPoints(){if($scope.plot.unhighlight(),$scope.seriesList.forEach(function(series,i){series.highlighted&&series.highlighted.length>0&&series.visible&&($scope.resetHighlightButton=!0,$scope.revisionToHighlight=series.highlighted[1],$scope.plot.highlight(i,series.highlighted[0]))}),$scope.selectedDataPoint){var selectedSeriesIndex=_.findIndex($scope.seriesList,function(s){return s.projectName==$scope.selectedDataPoint.projectName&&s.signature==$scope.selectedDataPoint.signature}),selectedSeries=$scope.seriesList[selectedSeriesIndex],flotDataPoint=selectedSeries.flotSeries.resultSetData.indexOf($scope.selectedDataPoint.resultSetId)+$scope.selectedDataPoint.flotDataOffset;$scope.plot.highlight(selectedSeriesIndex,flotDataPoint)}}function plotOverviewGraph(){$scope.seriesList.forEach(function(series){series.flotSeries.points.show=!1,series.flotSeries.lines.show=series.visible}),$scope.overviewPlot=$.plot($("#overview-plot"),$scope.seriesList.map(function(series){return series.flotSeries}),{xaxis:{mode:"time"},selection:{mode:"xy",color:"#97c6e5"},series:{shadowSize:0},lines:{show:!0},points:{show:!1},legend:{show:!1},grid:{color:"#cdd6df",borderWidth:2,backgroundColor:"#fff",hoverable:!0,clickable:!0,autoHighlight:!1}}),$scope.seriesList.forEach(function(series){series.flotSeries.points.show=series.visible,series.flotSeries.lines.show=!1}),$("#overview-plot").bind("plotselected",function(event,ranges){deselectDataPoint(),hideTooltip(),$.each($scope.plot.getXAxes(),function(_,axis){var opts=axis.options;opts.min=ranges.xaxis.from,opts.max=ranges.xaxis.to}),$.each($scope.plot.getYAxes(),function(_,axis){var opts=axis.options;opts.min=ranges.yaxis.from,opts.max=ranges.yaxis.to}),$scope.zoom={x:[ranges.xaxis.from,ranges.xaxis.to],y:[ranges.yaxis.from,ranges.yaxis.to]},$scope.plot.setupGrid(),$scope.plot.draw(),updateURL()})}function zoomGraph(){$scope.zoom.x&&_.find($scope.seriesList,function(series){return series.visible})&&($.each($scope.plot.getXAxes(),function(_,axis){var opts=axis.options;opts.min=$scope.zoom.x[0],opts.max=$scope.zoom.x[1]}),$.each($scope.plot.getYAxes(),function(_,axis){var opts=axis.options;opts.min=$scope.zoom.y[0],opts.max=$scope.zoom.y[1]}),$scope.plot.setupGrid(),$scope.overviewPlot.setSelection({xaxis:{from:$scope.zoom.x[0],to:$scope.zoom.x[1]},yaxis:{from:$scope.zoom.y[0],to:$scope.zoom.y[1]}}),$scope.overviewPlot.draw(),$scope.plot.draw())}function plotGraph(){function updateSelectedItem(){if($scope.subtestResults=null,!$scope.selectedDataPoint)return void hideTooltip();var selectedSeriesIndex=_.findIndex($scope.seriesList,function(s){return s.projectName==$scope.selectedDataPoint.projectName&&s.signature==$scope.selectedDataPoint.signature}),selectedSeries=$scope.seriesList[selectedSeriesIndex];if(selectedSeries.subtestSignatures){var uri=thServiceDomain+"/api/project/"+selectedSeries.projectName+"/performance-data/0/get_signature_properties/?";selectedSeries.subtestSignatures.forEach(function(signature){uri+="signatures="+signature+"&"});var subtestResultsMap={};$http.get(uri).then(function(response){var i=0;selectedSeries.subtestSignatures.forEach(function(signature){subtestResultsMap[signature]={test:response.data[i].test,signature:signature,projectName:selectedSeries.projectName},i++});var uri2=thServiceDomain+"/api/project/"+selectedSeries.projectName+"/performance-data/0/get_performance_data/?interval_seconds="+$scope.myTimerange.value;selectedSeries.subtestSignatures.forEach(function(signature){uri2+="&signatures="+signature}),$http.get(uri2).then(function(response){response.data.forEach(function(data){var perfData=data.blob,i=_.findIndex(perfData,function(v){return v.result_set_id==$scope.selectedDataPoint.resultSetId}),v=perfData[i].mean,v0=i?perfData[i-1].mean:v,dv=v-v0,dvp=v/v0-1;subtestResultsMap[data.series_signature]=jQuery.extend({value:v.toFixed(2),dvalue:dv.toFixed(2),dpercent:(100*dvp).toFixed(1)},subtestResultsMap[data.series_signature])}),$scope.subtestResults=Object.keys(subtestResultsMap).map(function(k){return subtestResultsMap[k]}).sort(function(a,b){return parseFloat(a.dpercent)0){var result_set_id=response.data.results[0].id,j=series.flotSeries.resultSetData.indexOf(result_set_id),seriesToaddHighlight=_.find($scope.seriesList,function(sr){return sr.signature==series.signature});seriesToaddHighlight.highlighted=[j,rev]}}):null})).then(function(){updateURL(),plotGraph()})},$scope.addSeries=function(project,signature){$scope.addSeriesList([{project:project,signature:signature,visible:!0}]),updateURL()};var optionCollectionMap={};$http.get(thServiceDomain+"/api/optioncollectionhash").then(function(response){response.data.forEach(function(dict){optionCollectionMap[dict.option_collection_hash]=dict.options.map(function(option){return option.name}).join(" ")})}).then(function(){if($stateParams.series){$scope.seriesList=[],_.isString($stateParams.series)&&($stateParams.series=[$stateParams.series]),$scope.highlightedRevision=$stateParams.highlightedRevision?$stateParams.highlightedRevision:"",$scope.zoom=$stateParams.zoom?JSON.parse($stateParams.zoom):{};var partialSeriesList=$stateParams.series.map(function(encodedSeries){return JSON.parse(decodeURIComponent(encodedSeries))});$scope.addSeriesList(partialSeriesList)}else $scope.seriesList=[];$http.get(thServiceDomain+"/api/repository/").then(function(response){$scope.projects=response.data,$scope.addTestData=function(){var defaultProjectName,defaultPlatform;if($scope.seriesList.length>0){var lastSeries=$scope.seriesList.slice(-1)[0];defaultProjectName=lastSeries.projectName,defaultPlatform=lastSeries.platform}var modalInstance=$modal.open({templateUrl:"partials/perf/testdatachooser.html",controller:"TestChooserCtrl",resolve:{projects:function(){return $scope.projects},optionCollectionMap:function(){return optionCollectionMap},timeRange:function(){return $scope.myTimerange.value},defaultProjectName:function(){return defaultProjectName},defaultPlatform:function(){return defaultPlatform}}});modalInstance.opened.then(function(){window.setTimeout(function(){modalInstance.updateTestInput()},0)}),modalInstance.result.then(function(series){series.highlighted=[],series.visible=!0,series.color=availableColors.pop(),$scope.seriesList.push(series),$scope.highlightedRevision||($scope.highlightedRevision=""),$scope.zoom||($scope.zoom={}),updateURL(),getSeriesData(series).then(function(){plotGraph(),$scope.highlightRevision()})})}})})}]),perf.controller("TestChooserCtrl",function($scope,$modalInstance,$http,projects,optionCollectionMap,timeRange,thServiceDomain,getSeriesSummary,defaultProjectName,defaultPlatform){$scope.timeRange=timeRange,$scope.projects=projects,$scope.selectedProject=defaultProjectName?_.findWhere(projects,{name:defaultProjectName}):projects[0],$scope.loadingTestData=!1;var testInputCreated=!1;$scope.addTestData=function(){var series=_.clone($scope.selectedSeries);series.projectName=$scope.selectedProject.name,$modalInstance.close(series)},$scope.cancel=function(){$modalInstance.dismiss("cancel")},$scope.updateTestInput=function(){$scope.addTestDataDisabled=!0,$scope.loadingTestData=!0,$scope.platformList=[],$http.get(thServiceDomain+"/api/project/"+$scope.selectedProject.name+"/performance-data/0/get_performance_series_summary/?interval="+$scope.timeRange).then(function(response){var data=response.data,seriesList=[];Object.keys(data).forEach(function(signature){var seriesSummary=getSeriesSummary(signature,data[signature],optionCollectionMap),platform=seriesSummary.platform;-1===$scope.platformList.indexOf(platform)&&$scope.platformList.push(platform),seriesList.push(seriesSummary)}),$scope.platformList.sort(),$scope.selectedPlatform=defaultPlatform||$scope.platformList[0],$scope.updateTestSelector=function(){var filteredSeriesList=seriesList.filter(function(series){return series.platform===$scope.selectedPlatform}).sort(function(a,b){return a.name>b.name}),signatures=new Bloodhound({datumTokenizer:Bloodhound.tokenizers.obj.whitespace("name"),queryTokenizer:Bloodhound.tokenizers.whitespace,limit:100,local:filteredSeriesList});signatures.initialize(),testInputCreated&&$(".typeahead").typeahead("destroy"),$(".typeahead").typeahead(null,{name:"signatures",displayKey:"name",source:signatures.ttAdapter(),limit:100}).on("typeahead:selected",function(obj,datum){$scope.selectedSeries=datum,$scope.addTestDataDisabled=!1}),testInputCreated=!0},$scope.updateTestSelector(),$scope.loadingTestData=!1})},$modalInstance.updateTestInput=$scope.updateTestInput}),perf.config(function($stateProvider,$urlRouterProvider){$urlRouterProvider.deferIntercept(),$stateProvider.state("graphs",{templateUrl:"partials/perf/perfctrl.html",url:"/graphs?timerange&series&highlightedRevision&zoom",controller:"PerfCtrl"}),$urlRouterProvider.otherwise("/graphs")}).run(function($rootScope,$urlRouter,$location,$state){$rootScope.$on("$locationChangeSuccess",function(e){e.preventDefault(),"graphs"!==$state.current.name&&$urlRouter.sync()}),$urlRouter.listen()});angular.module('perf').run(['$templateCache', function($templateCache) { 'use strict'; $templateCache.put('partials/perf/perfctrl.html', diff --git a/dist/perf.html b/dist/perf.html index 0d2138c7..9ba7b7d9 100644 --- a/dist/perf.html +++ b/dist/perf.html @@ -14,7 +14,7 @@ - +