function onLoad(){reload()}function reload(){if(linuxPerfData){var f=new tracing.TimelineModel;f.importEvents("[]",!0,[linuxPerfData]);var c=document.querySelector(".view");cr.ui.decorate(c,tracing.TimelineView);c.model=f;c.tabIndex=1;c.timeline.focusElement=c}}document.addEventListener("DOMContentLoaded",onLoad);var global=this;
this.cr=function(){function f(b,d,g,a){var e=new cr.Event(d+"Change");e.propertyName=d;e.newValue=g;e.oldValue=a;b.dispatchEvent(e)}function c(b){return b.replace(/([A-Z])/g,"-$1").toLowerCase()}function a(d,a){switch(a){case b.JS:var g=d+"_";return function(){return this[g]};case b.ATTR:var e=c(d);return function(){return this.getAttribute(e)};case b.BOOL_ATTR:return e=c(d),function(){return this.hasAttribute(e)}}}function e(d,a,g){switch(a){case b.JS:var e=d+"_";return function(b){var a=this[e];
b!==a&&(this[e]=b,g&&g.call(this,b,a),f(this,d,b,a))};case b.ATTR:var i=c(d);return function(b){var a=this[i];b!==a&&(void 0==b?this.removeAttribute(i):this.setAttribute(i,b),g&&g.call(this,b,a),f(this,d,b,a))};case b.BOOL_ATTR:return i=c(d),function(b){var a=this[i];b!==a&&(b?this.setAttribute(i,d):this.removeAttribute(i),g&&g.call(this,b,a),f(this,d,b,a))}}}function i(b,d,g){var a=cr.doc.createEvent("Event");a.initEvent(b,!!d,!!g);a.__proto__=global.Event.prototype;return a}var b={JS:"js",ATTR:"attr",
BOOL_ATTR:"boolAttr"},d=1;return{addSingletonGetter:function(b){b.getInstance=function(){return b.instance_||(b.instance_=new b)}},createUid:function(){return d++},define:function(b,d){var a;a=b.split(".");for(var e=global,c;a.length&&(c=a.shift());)e=c in e?e[c]:e[c]={};a=e;var e=d(),h;for(h in e)(c=Object.getOwnPropertyDescriptor(e,h))&&Object.defineProperty(a,h,c)},defineProperty:function(d,c,g,i){"function"==typeof d&&(d=d.prototype);g=g||b.JS;d.__lookupGetter__(c)||d.__defineGetter__(c,a(c,g));
d.__lookupSetter__(c)||d.__defineSetter__(c,e(c,g,i))},dispatchPropertyChange:f,dispatchSimpleEvent:function(b,d,a,e){d=new cr.Event(d,a,e);return b.dispatchEvent(d)},Event:i,getUid:function(b){return b.hasOwnProperty("uid")?b.uid:b.uid=d++},initialize:function(){if(global.document)i.prototype={__proto__:global.Event.prototype},cr.isMac=/Mac/.test(navigator.platform),cr.isWindows=/Win/.test(navigator.platform),cr.isChromeOS=/CrOS/.test(navigator.userAgent),cr.isLinux=/Linux/.test(navigator.userAgent),
cr.isGTK=/GTK/.test(chrome.toolkit),cr.isViews=/views/.test(chrome.toolkit),cr.isTouchOptimized=!!chrome.touchOptimized,cr.isTouchOptimized&&doc.documentElement.setAttribute("touch-optimized","");else{var b=cr;Object.defineProperty(global,"cr",{get:function(){Object.defineProperty(global,"cr",{value:b});b.initialize();return b},configurable:!0})}},PropertyKind:b,get doc(){return document}}}();cr.initialize();cr.define("cr",function(){function f(){}f.prototype={addEventListener:function(c,a){this.listeners_||(this.listeners_=Object.create(null));if(c in this.listeners_){var e=this.listeners_[c];0>e.indexOf(a)&&e.push(a)}else this.listeners_[c]=[a]},removeEventListener:function(c,a){if(this.listeners_&&c in this.listeners_){var e=this.listeners_[c],i=e.indexOf(a);0<=i&&(1==e.length?delete this.listeners_[c]:e.splice(i,1))}},dispatchEvent:function(c){if(!this.listeners_)return!0;var a=this;c.__defineGetter__("target",
function(){return a});c.preventDefault=function(){this.returnValue=!1};var e=c.type,i=0;if(e in this.listeners_)for(var e=this.listeners_[e].concat(),b=0,d;d=e[b];b++)i=d.handleEvent?i|!1===d.handleEvent.call(d,c):i|!1===d.call(this,c);return!i&&c.returnValue}};return{EventTarget:f}});cr.define("cr.ui",function(){function f(c,a){return(a&&a.ownerDocument?a.ownerDocument:cr.doc).createElement(c)}return{decorate:function(c,a){var e;e="string"==typeof c?cr.doc.querySelectorAll(c):[c];for(var i=0,b;b=e[i];i++)b instanceof a||a.decorate(b)},define:function(c){function a(b){var d=e(i,b);a.decorate(d);for(var c in b)d[c]=b[c];return d}var e,i;"function"==typeof c?(e=c,i=""):(e=f,i=c);a.decorate=function(b){b.__proto__=a.prototype;b.decorate()};return a},limitInputWidth:function(c,a,e){function i(){if(c.scrollWidth>
k)c.style.width=k+"px";else{c.style.width=0;var b=c.scrollWidth;c.style.width=b<e?e+"px":b+"px"}}c.style.width="10px";var b=c.ownerDocument.defaultView,d=b.getComputedStyle(c),b=b.getComputedStyle(a),j="rtl"==d.direction,f=c.getBoundingClientRect(),g=a.getBoundingClientRect(),f=j?g.right-f.right:f.left-g.left,d=parseInt(d.borderLeftWidth,10)+parseInt(d.paddingLeft,10)+parseInt(d.paddingRight,10)+parseInt(d.borderRightWidth,10),b=j?parseInt(b.paddingLeft,10):parseInt(b.paddingRight,10),k=a.clientWidth-
f-d-b;c.addEventListener("input",i);i()}}});cr.define("cr.ui",function(){function f(a){this.classList_=a.documentElement.classList;var e=this;a.addEventListener("keydown",function(a){9==a.keyCode&&(e.visible=!0)},!0);a.addEventListener("mousedown",function(){e.visible=!1},!0)}f.prototype={set visible(a){a?this.classList_.add("focus-outline-visible"):this.classList_.remove("focus-outline-visible")},get visible(){this.classList_.contains("focus-outline-visible")}};var c=[];f.forDocument=function(a){for(var e=0;e<c.length;e++)if(a==c[e][0])return c[e][1];
e=new f(a);c.push([a,e]);return e};return{FocusOutlineManager:f}});cr.define("cr.ui",function(){function f(){for(var d={TABBOX:c,TABS:a,TAB:e,TABPANELS:i,TABPANEL:b},j,f=0;j=this.children[f];f++){var g=d[j.tagName];g&&cr.ui.decorate(j,g)}}var c=cr.ui.define("tabbox");c.prototype={__proto__:HTMLElement.prototype,decorate:function(){f.call(this);this.addEventListener("selectedChange",this.handleSelectedChange_,!0);this.selectedIndex=0},handleSelectedChange_:function(b){var a=b.target;b.newValue&&(a.parentElement&&a.parentElement.parentElement)==this&&(this.selectedIndex=
Array.prototype.indexOf.call(a.parentElement.children,a))},selectedIndex_:-1};cr.defineProperty(c,"selectedIndex",cr.PropertyKind.JS_PROP,function(b){for(var a,e,g=0;a=this.children[g];g++)for(var c=0;e=a.children[c];c++)e.selected=c==b});var a=cr.ui.define("tabs");a.prototype={__proto__:HTMLElement.prototype,decorate:function(){f.call(this);this.tabIndex=0;this.addEventListener("keydown",this.handleKeyDown_.bind(this));this.focusOutlineManager_=cr.ui.FocusOutlineManager.forDocument(this.ownerDocument)},
handleKeyDown_:function(b){var a=0;switch(b.keyIdentifier){case "Left":case "Up":a=-1;break;case "Right":case "Down":a=1}a&&("rtl"==this.ownerDocument.defaultView.getComputedStyle(this).direction&&(a*=-1),b=this.children.length,this.parentElement.selectedIndex=(this.parentElement.selectedIndex+a+b)%b,this.focusOutlineManager_.visible=!0)}};var e=cr.ui.define("tab");e.prototype={__proto__:HTMLElement.prototype,decorate:function(){var b=this;this.addEventListener(cr.isMac?"click":"mousedown",function(){b.selected=
!0})}};cr.defineProperty(e,"selected",cr.PropertyKind.BOOL_ATTR);var i=cr.ui.define("tabpanels");i.prototype={__proto__:HTMLElement.prototype,decorate:f};var b=cr.ui.define("tabpanel");b.prototype={__proto__:HTMLElement.prototype,decorate:function(){}};cr.defineProperty(b,"selected",cr.PropertyKind.BOOL_ATTR);return{TabBox:c,Tabs:a,Tab:e,TabPanels:i,TabPanel:b}});global=this;function $(f){return document.getElementById(f)}function chromeSend(f,c,a,e){var i=global[a];global[a]=function(){global[a]=i;var b=Array.prototype.slice.call(arguments);return e.apply(global,b)};chrome.send(f,c)}function url(f){f=f.replace(/(\(|\)|\,|\s|\'|\"|\\)/g,"\\$1");/\\\\$/.test(f)&&(f+=" ");return'url("'+f+'")'}function parseQueryParams(f){for(var c={},f=unescape(f.search.substring(1)).split("&"),a=0;a<f.length;a++){var e=f[a].split("=");c[e[0]]=e[1]}return c}
function findAncestorByClass(f,c){return findAncestor(f,function(a){return a.classList?a.classList.contains(c):null})}function findAncestor(f,c){for(var a=!1;null!=f&&!(a=c(f));)f=f.parentNode;return a?f:null}function swapDomNodes(f,c){var a=f.nextSibling;if(a==c)swapDomNodes(c,f);else{var e=f.parentNode;c.parentNode.replaceChild(f,c);e.insertBefore(c,a)}}
function disableTextSelectAndDrag(){document.onselectstart=function(f){f.preventDefault()};document.ondragstart=function(f){f.preventDefault()}}function isRTL(){return"rtl"==document.documentElement.dir}function assert(f,c){if(!f){var a="Assertion failed";c&&(a=a+": "+c);throw Error(a);}}function getRequiredElement(f){var c=$(f);assert(c,"Missing required element: "+f);return c}
document.addEventListener("click",function(f){if(f.returnValue){var c=f.target;if(c.nodeType==Node.ELEMENT_NODE&&c.webkitMatchesSelector("A, A *")){for(;"A"!=c.tagName;)c=c.parentElement;if(("file:"==c.protocol||"about:"==c.protocol)&&(0==f.button||1==f.button))chrome.send("navigateToUrl",[c.href,c.target,f.button,f.altKey,f.ctrlKey,f.metaKey,f.shiftKey]),f.preventDefault()}}});function appendParam(f,c,a){c=encodeURIComponent(c)+"="+encodeURIComponent(a);return-1==f.indexOf("?")?f+"?"+c:f+"&"+c};cr.define("tracing",function(){var f=cr.ui.define("div");f.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.classList.add("overlay-root");this.visible=!1;this.contentHost=this.ownerDocument.createElement("div");this.contentHost.classList.add("content-host");this.tabCatcher=this.ownerDocument.createElement("span");this.tabCatcher.tabIndex=0;this.appendChild(this.contentHost);this.onKeydownBoundToThis_=this.onKeydown_.bind(this);this.onFocusInBoundToThis_=this.onFocusIn_.bind(this);
this.addEventListener("mousedown",this.onMousedown_.bind(this))},showOverlay:function(a){a.oldParent_=a.parentNode;this.contentHost.appendChild(a);this.contentHost.appendChild(this.tabCatcher);this.ownerDocument.body.classList.add("disabled-by-overlay");this.visible=!0;a.tabIndex=0;var e=a.querySelector("button, input, list, select, a");e||(e=a);e.focus();this.ownerDocument.addEventListener("focusin",this.onFocusInBoundToThis_,!0);a.addEventListener("keydown",this.onKeydownBoundToThis_)},onMousedown_:function(a){a.target==
this&&a.preventDefault()},onFocusIn_:function(a){a.target==this.tabCatcher&&window.setTimeout(this.focusOverlay_.bind(this),0)},focusOverlay_:function(){this.contentHost.firstChild.focus()},onKeydown_:function(a){9==a.keyCode&&(a.shiftKey&&a.target==this.contentHost.firstChild)&&a.preventDefault()},hideOverlay:function(a){this.visible=!1;this.ownerDocument.body.classList.remove("disabled-by-overlay");this.lastFocusOut_=void 0;a.parentNode.removeChild(this.tabCatcher);a.oldParent_?(a.oldParent_.appendChild(a),
delete a.oldParent_):this.contentHost.removeChild(a);a.removeEventListener("keydown",this.onKeydownBoundToThis_);this.ownerDocument.removeEventListener("focusin",this.onFocusInBoundToThis_)}};cr.defineProperty(f,"visible",cr.PropertyKind.BOOL_ATTR);var c=cr.ui.define("div");c.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){if(!this.ownerDocument.querySelector(".overlay-root")){var a=this.ownerDocument.createElement("div");cr.ui.decorate(a,f);this.ownerDocument.body.appendChild(a)}this.classList.add("overlay");
this.visible=!1},onVisibleChanged_:function(){var a=this.ownerDocument.querySelector(".overlay-root");this.visible?a.showOverlay(this):a.hideOverlay(this)}};cr.defineProperty(c,"visible",cr.PropertyKind.BOOL_ATTR,c.prototype.onVisibleChanged_);return{Overlay:c}});cr.define("tracing",function(){function f(){this.overlay_=document.createElement("div");this.overlay_.className="tracing-overlay";cr.ui.decorate(this.overlay_,tracing.Overlay);this.statusDiv_=document.createElement("div");this.overlay_.appendChild(this.statusDiv_);this.bufferPercentDiv_=document.createElement("div");this.overlay_.appendChild(this.bufferPercentDiv_);this.stopButton_=document.createElement("button");this.stopButton_.onclick=this.endTracing.bind(this);this.stopButton_.textContent="Stop tracing";
this.overlay_.appendChild(this.stopButton_);this.traceEvents_=[];this.systemTraceEvents_=[];this.onKeydownBoundToThis_=this.onKeydown_.bind(this);this.onKeypressBoundToThis_=this.onKeypress_.bind(this);chrome.send("tracingControllerInitialized")}f.prototype={__proto__:cr.EventTarget.prototype,gpuInfo_:void 0,clientInfo_:void 0,tracingEnabled_:!1,tracingEnding_:!1,systemTraceDataFilename_:void 0,onRequestBufferPercentFullComplete:function(c){this.overlay_.visible&&(window.setTimeout(this.beginRequestBufferPercentFull_.bind(this),
250),this.bufferPercentDiv_.textContent="Buffer usage: "+Math.round(100*c)+"%")},beginRequestBufferPercentFull_:function(){chrome.send("beginRequestBufferPercentFull")},beginTracing:function(c){if(this.tracingEnabled_)throw Error("Tracing already begun.");this.stopButton_.hidden=!1;this.statusDiv_.textContent="Tracing active.";this.tracingEnabled_=this.overlay_.visible=!0;console.log("Beginning to trace...");this.statusDiv_.textContent="Tracing active.";this.traceEvents_=[];this.systemTraceEvents_=
[];chrome.send("beginTracing",[c||!1]);this.beginRequestBufferPercentFull_();c=new cr.Event("traceBegun");c.events=this.traceEvents_;this.dispatchEvent(c);c=new cr.Event("traceEventsChanged");c.numEvents=this.traceEvents_.length;this.dispatchEvent(c);window.addEventListener("keypress",this.onKeypressBoundToThis_);window.addEventListener("keydown",this.onKeydownBoundToThis_)},onKeydown_:function(c){27==c.keyCode&&this.endTracing()},onKeypress_:function(c){"Enter"==c.keyIdentifier&&this.endTracing()},
onClientInfoUpdate:function(c){this.clientInfo_=c},onGpuInfoUpdate:function(c){this.gpuInfo_=c},get isTracingEnabled(){return this.tracingEnabled_},get traceEvents(){return this.traceEvents_},onTraceDataCollected:function(c){this.statusDiv_.textContent="Processing trace...";this.traceEvents_.push.apply(this.traceEvents_,c)},endTracing:function(){if(!this.tracingEnabled_)throw Error("Tracing not begun.");this.tracingEnding_||(this.tracingEnding_=!0,this.statusDiv_.textContent="Ending trace...",console.log("Finishing trace"),
this.statusDiv_.textContent="Downloading trace data...",this.stopButton_.hidden=!0,window.setTimeout(function(){chrome.send("endTracingAsync")},100))},onEndTracingComplete:function(){window.removeEventListener("keydown",this.onKeydownBoundToThis_);window.removeEventListener("keypress",this.onKeypressBoundToThis_);this.tracingEnding_=this.tracingEnabled_=this.overlay_.visible=!1;console.log("onEndTracingComplete p1 with "+this.traceEvents_.length+" events.");var c=new cr.Event("traceEnded");c.events=
this.traceEvents_;this.dispatchEvent(c)},onSystemTraceDataCollected:function(c){console.log("onSystemTraceDataCollected with "+c.length+" chars of data.");this.systemTraceEvents_=c},get systemTraceEvents(){return this.systemTraceEvents_},beginLoadTraceFile:function(){chrome.send("loadTraceFile")},onLoadTraceFileComplete:function(c){c.traceEvents?this.traceEvents_=c.traceEvents:c.length?this.traceEvents_=c:console.log("Expected an array when loading the trace file");c.systemTraceEvents?this.systemTraceEvents_=
c.systemTraceEvents:c.length?this.systemTraceEvents_=c:console.log("Expected an array when loading the trace file");c=new cr.Event("loadTraceFileComplete");c.events=this.traceEvents_;this.dispatchEvent(c)},onLoadTraceFileCanceled:function(){cr.dispatchSimpleEvent(this,"loadTraceFileCanceled")},beginSaveTraceFile:function(){chrome.send("saveTraceFile",[JSON.stringify({traceEvents:this.traceEvents_,systemTraceEvents:this.systemTraceEvents_,clientInfo:this.clientInfo_,gpuInfo:this.gpuInfo_})])},onSaveTraceFileComplete:function(){cr.dispatchSimpleEvent(this,
"saveTraceFileComplete")},onSaveTraceFileCanceled:function(){cr.dispatchSimpleEvent(this,"saveTraceFileCanceled")},selfTest:function(){this.beginTracing();window.setTimeout(this.endTracing.bind(This),500)}};return{TracingController:f}});cr.define("tracing",function(){function f(b,a,d,g,e){this.title=b;this.start=d;this.colorId=a;this.args=g;this.didNotFinish=!1;void 0!==e&&(this.duration=e)}function c(b,a,d,g,e){f.call(this,b,a,d,g,e);this.subSlices=[]}function a(b,a,d,g){f.call(this,b,a,d,g)}function e(b,a){if(!b)throw"Parent must be provided.";this.parent=b;this.tid=a;this.subRows=[[]];this.asyncSlices=new j(this.ptid)}function i(b,a,d){this.parent=b;this.id=a;this.name=d;this.seriesNames=[];this.seriesColors=[];this.timestamps=
[];this.samples=[]}function b(b){this.pid=b;this.threads={};this.counters={}}function d(b){this.cpuNumber=b;this.slices=[];this.counters={}}function j(b){this.name=b;this.slices=[]}function o(b){for(var a=0,d=0;d<b.length;++d)a=(a+37*a+11*b.charCodeAt(d))%4294967295;return a}function g(b,a){this.cpus={};this.processes={};this.importErrors=[];this.asyncSliceGroups={};b&&this.importEvents(b,a)}function k(){}function m(b){this.text_=b}f.prototype={selected:!1,duration:void 0,get end(){return this.start+
this.duration}};c.prototype={__proto__:f.prototype};a.prototype={__proto__:f.prototype,id:void 0,startThread:void 0,endThread:void 0,subSlices:void 0};var h={};e.getPTIDFromPidAndTid=function(b,a){h[b]||(h[b]={});h[b][a]||(h[b][a]=b+":"+a);return h[b][a]};e.prototype={name:void 0,get ptid(){return e.getPTIDFromPidAndTid(this.tid,this.parent.pid)},getSubrow:function(b){for(;b>=this.subRows.length;)this.subRows.push([]);return this.subRows[b]},shiftSubRow_:function(b,a){for(var d=0;d<b.length;d++){var g=
b[d];g.start+=a}},shiftTimestampsForward:function(b){this.cpuSlices&&this.shiftSubRow_(this.cpuSlices,b);for(var a=0;a<this.subRows.length;a++)this.shiftSubRow_(this.subRows[a],b);this.asyncSlices.shiftTimestampsForward(b)},updateBounds:function(){var b=[],a;0!=this.subRows[0].length&&(a=this.subRows[0],b.push(a[0].start),b.push(a[a.length-1].end));this.asyncSlices.slices.length&&(this.asyncSlices.updateBounds(),b.push(this.asyncSlices.minTimestamp),b.push(this.asyncSlices.maxTimestamp));b.length?
(this.minTimestamp=Math.min.apply(Math,b),this.maxTimestamp=Math.max.apply(Math,b)):this.maxTimestamp=this.minTimestamp=void 0},get userFriendlyName(){return this.parent.pid+": "+(this.name||this.tid)},get userFriendlyDetails(){return"pid: "+this.parent.pid+", tid: "+this.tid+(this.name?", name: "+this.name:"")}};e.compare=function(a,d){if(a.parent.pid!=d.parent.pid)return b.compare(a.parent,d.parent.pid);if(a.name&&d.name){var g=a.name.localeCompare(d.name);return 0==g?a.tid-d.tid:g}return a.name?
-1:d.name?1:a.tid-d.tid};i.prototype={__proto__:Object.prototype,get numSeries(){return this.seriesNames.length},get numSamples(){return this.timestamps.length},shiftTimestampsForward:function(b){for(var a=0;a<this.timestamps.length;a++)this.timestamps[a]+=b},updateBounds:function(){if(this.seriesNames.length!=this.seriesColors.length)throw"seriesNames.length must match seriesColors.length";if(this.numSeries*this.numSamples!=this.samples.length)throw"samples.length must be a multiple of numSamples.";
this.totals=[];if(0==this.samples.length)this.maxTimestamp=this.minTimestamp=void 0,this.maxTotal=0;else{this.minTimestamp=this.timestamps[0];this.maxTimestamp=this.timestamps[this.timestamps.length-1];for(var b=this.numSeries,a=-Infinity,d=0;d<this.timestamps.length;d++){for(var g=0,e=0;e<b;e++)g+=this.samples[d*b+e],this.totals.push(g);g>a&&(a=g)}this.maxTotal=a}}};i.compare=function(a,d){if(a.parent.pid!=d.parent.pid)return b.compare(a.parent,d.parent.pid);var g=a.name.localeCompare(d.name);return 0==
g?a.tid-d.tid:g};b.prototype={get numThreads(){var b=0,a;for(a in this.threads)b++;return b},shiftTimestampsForward:function(b){for(var a in this.threads)this.threads[a].shiftTimestampsForward(b);for(var d in this.counters)this.counters[d].shiftTimestampsForward(b)},getOrCreateThread:function(b){this.threads[b]||(this.threads[b]=new e(this,b));return this.threads[b]},getOrCreateCounter:function(b,a){var d=b+"."+a;this.counters[d]||(this.counters[d]=new i(this,d,a));return this.counters[d]}};b.compare=
function(b,a){return b.pid-a.pid};d.prototype={getOrCreateCounter:function(b,a){var d;d=b.length?b+"."+a:a;this.counters[d]||(this.counters[d]=new i(this,d,a));return this.counters[d]},shiftTimestampsForward:function(b){for(var a=0;a<this.slices.length;a++)this.slices[a].start+=b;for(var d in this.counters)this.counters[d].shiftTimestampsForward(b)},updateBounds:function(){this.slices.length?(this.minTimestamp=this.slices[0].start,this.maxTimestamp=this.slices[this.slices.length-1].end):this.maxTimestamp=
this.minTimestamp=void 0}};d.compare=function(b,a){return b.cpuNumber-a.cpuNumber};j.prototype={__proto__:Object.prototype,push:function(b){this.slices.push(b)},get length(){return this.slices.length},subRows_:void 0,sortSlices_:function(){this.slices.sort(function(b,a){return b.start-a.start})},shiftTimestampsForward:function(b){for(var a=0;a<this.slices.length;a++){var d=this.slices[a];d.start+=b;for(var g=0;g<d.subSlices.length;g++)d.subSlices[g].start+=b}},updateBounds:function(){this.sortSlices_();
this.slices.length?(this.minTimestamp=this.slices[0].start,this.maxTimestamp=this.slices[this.slices.length-1].end):this.maxTimestamp=this.minTimestamp=void 0;this.subRows_=void 0},get subRows(){this.subRows_||this.rebuildSubRows_();return this.subRows_},rebuildSubRows_:function(){this.sortSlices_();for(var b=[],a=0;a<this.slices.length;a++){for(var d=this.slices[a],g=!1,e=0;e<b.length;e++){var c=b[e];if(d.start>=c[c.length-1].end){g=!0;if(void 0===d.subSlices||1>d.subSlices.length)throw"TimelineAsyncEvent missing subSlices: "+
d.name;for(e=0;e<d.subSlices.length;e++)c.push(d.subSlices[e]);break}}if(!g&&(c=[],void 0!==d.subSlices)){for(e=0;e<d.subSlices.length;e++)c.push(d.subSlices[e]);b.push(c)}}this.subRows_=b},computeSubGroups:function(){for(var b={},a=0;a<this.slices.length;++a){var d=this.slices[a],g=d.startThread.ptid;b[g]||(b[g]=new j(this.name));b[g].slices.push(d)}var a=[],e;for(e in b)d=b[e],d.updateBounds(),a.push(d);return a}};i.compare=function(a,d){if(a.parent.pid!=d.parent.pid)return b.compare(a.parent,d.parent.pid);
var g=a.name.localeCompare(d.name);return 0==g?a.tid-d.tid:g};var l=[{r:138,g:113,b:152},{r:175,g:112,b:133},{r:127,g:135,b:225},{r:93,g:81,b:137},{r:116,g:143,b:119},{r:178,g:214,b:122},{r:87,g:109,b:147},{r:119,g:155,b:95},{r:114,g:180,b:160},{r:132,g:85,b:103},{r:157,g:210,b:150},{r:148,g:94,b:86},{r:164,g:108,b:138},{r:139,g:191,b:150},{r:110,g:99,b:145},{r:80,g:129,b:109},{r:125,g:140,b:149},{r:93,g:124,b:132},{r:140,g:85,b:140},{r:104,g:163,b:162},{r:132,g:141,b:178},{r:131,g:105,b:147},{r:135,
g:183,b:98},{r:152,g:134,b:177},{r:141,g:188,b:141},{r:133,g:160,b:210},{r:126,g:186,b:148},{r:112,g:198,b:205},{r:180,g:122,b:195},{r:203,g:144,b:152},{r:182,g:125,b:143},{r:126,g:200,b:148},{r:133,g:160,b:210},{r:240,g:240,b:240}],q=l.length-4,r=l.length,v=l.concat(l.map(function(b){var a;a=240<=b.r&&240<=b.g&&240<=b.b?-0.2:0.45;return{r:Math.min(255,b.r+Math.floor(b.r*a)),g:Math.min(255,b.g+Math.floor(b.g*a)),b:Math.min(255,b.b+Math.floor(b.b*a))}})).map(function(b){return"rgb("+b.r+","+b.g+","+
b.b+")"}),u={},y=[];g.registerImporter=function(b){y.push(b)};k.canImport=function(b){return b instanceof Array&&0==b.length?!0:"string"===typeof b||b instanceof String?0==b.length:!1};k.prototype={__proto__:Object.prototype,importEvents:function(){},finalizeImport:function(){}};g.registerImporter(k);g.prototype={__proto__:cr.EventTarget.prototype,get numProcesses(){var b=0,a;for(a in this.processes)b++;return b},getOrCreateCpu:function(b){this.cpus[b]||(this.cpus[b]=new d(b));return this.cpus[b]},
getOrCreateProcess:function(a){this.processes[a]||(this.processes[a]=new b(a));return this.processes[a]},pruneEmptyThreads:function(){for(var b in this.processes){var a=this.processes[b],d={},g;for(g in a.threads){for(var e=a.threads[g],c=!1,q=0;q<e.subRows.length;q++)c|=0<e.subRows[q].length;if(c||0<e.asyncSlices.length)d[g]=e}a.threads=d}},updateBounds:function(){for(var b=Infinity,a=-b,d=!1,g=this.getAllThreads(),e=0;e<g.length;e++){var c=g[e];c.updateBounds();void 0!=c.minTimestamp&&void 0!=c.maxTimestamp&&
(b=Math.min(b,c.minTimestamp),a=Math.max(a,c.maxTimestamp),d=!0)}g=this.getAllCounters();for(e=0;e<g.length;e++)c=g[e],c.updateBounds(),void 0!=c.minTimestamp&&void 0!=c.maxTimestamp&&(d=!0,b=Math.min(b,c.minTimestamp),a=Math.max(a,c.maxTimestamp));for(var q in this.cpus)e=this.cpus[q],e.updateBounds(),void 0!=e.minTimestamp&&void 0!=e.maxTimestamp&&(d=!0,b=Math.min(b,e.minTimestamp),a=Math.max(a,e.maxTimestamp));d?(this.minTimestamp=b,this.maxTimestamp=a):this.minTimestamp=this.maxTimestamp=void 0},
shiftWorldToZero:function(){if(void 0!==this.minTimestamp){var b=this.minTimestamp,a;for(a in this.processes)this.processes[a].shiftTimestampsForward(-b);for(var d in this.cpus)this.cpus[d].shiftTimestampsForward(-b);this.updateBounds()}},getAllThreads:function(){var b=[],a;for(a in this.processes){var d=this.processes[a],g;for(g in d.threads)b.push(d.threads[g])}return b},getAllCpus:function(){var b=[],a;for(a in this.cpus)b.push(this.cpus[a]);return b},getAllProcesses:function(){var b=[],a;for(a in this.processes)b.push(this.processes[a]);
return b},getAllCounters:function(){var b=[],a;for(a in this.processes){var d=this.processes[a],g;for(g in d.counters)b.push(d.counters[g])}for(var e in this.cpus){a=this.cpus[e];for(var c in a.counters)b.push(a.counters[c])}return b},importOneTrace_:function(b,a){for(var d,g=0;g<y.length;++g)if(y[g].canImport(b)){d=y[g];break}if(!d)throw"Could not find an importer for the provided eventData.";d=new d(this,b,a);d.importEvents();return d},importEvents:function(b,a,d){void 0===a&&(a=!0);var g=[],b=
this.importOneTrace_(b,!1);g.push(b);if(d)for(var e=0;e<d.length;++e)b=this.importOneTrace_(d[e],!0),g.push(b);for(e=0;e<g.length;++e)g[e].finalizeImport();for(e=0;e<g.length;++e)this.pruneEmptyThreads();this.updateBounds();a&&this.shiftWorldToZero();a&&(void 0!==this.minTimestamp&&void 0!==this.maxTimestamp)&&(a=0.15*(this.maxTimestamp-this.minTimestamp),this.minTimestamp-=a,this.maxTimestamp+=a)}};m.prototype={__proto__:Object.prototype,matchSlice:function(b){return 0==this.text_.length?!1:-1!=
b.title.indexOf(this.text_)}};return{getPallette:function(){return v},getPalletteHighlightIdBoost:function(){return r},getColorIdByName:function(b){if("iowait"==b)return q;if("running"==b)return q+1;if("runnable"==b)return q+2;if("sleeping"==b)return q+3;throw"Unrecognized color "+b;},getStringHash:o,getStringColorId:function(b){if(void 0===u[b]){var a=o(b);u[b]=a%q}return u[b]},TimelineSlice:f,TimelineThreadSlice:c,TimelineAsyncSlice:a,TimelineThread:e,TimelineCounter:i,TimelineProcess:b,TimelineCpu:d,
TimelineAsyncSliceGroup:j,TimelineModel:g,TimelineFilter:m}});cr.define("tracing",function(){function f(b){this.cpu=b}function c(){this.openSlices=[]}function a(b,a,d){this.isAdditionalImport_=d;this.model_=b;this.events_=a;this.clockSyncRecords_=[];this.cpuStates_={};this.kernelThreadStates_={};this.buildMapFromLinuxPidsToTimelineThreads();this.lineNumber=-1;this.threadStateByKPID_={}}f.prototype={__proto__:Object.prototype,switchRunningLinuxPid:function(b,a,d,e,c,q){if(void 0!==this.lastActivePid&&0!=this.lastActivePid){var j=d-this.lastActiveTs;name=(b=b.threadsByLinuxPid[this.lastActivePid])?
b.userFriendlyName:this.lastActiveComm;this.cpu.slices.push(new tracing.TimelineSlice(name,tracing.getStringColorId(name),this.lastActiveTs,{comm:this.lastActiveComm,tid:this.lastActivePid,prio:this.lastActivePrio,stateWhenDescheduled:a},j))}this.lastActiveTs=d;this.lastActivePid=e;this.lastActiveComm=c;this.lastActivePrio=q}};TestExports={};var e=/^\s*(.+?)\s+\[(\d+)\]\s*([d.][N.][sh.][\d.])?\s*(\d+\.\d+):\s+(\S+):\s(.*)$/;TestExports.lineRE=e;var i=RegExp("prev_comm=(.+) prev_pid=(\\d+) prev_prio=(\\d+) prev_state=(\\S+) ==> next_comm=(.+) next_pid=(\\d+) next_prio=(\\d+)");
TestExports.schedSwitchRE=i;var b=/comm=(.+) pid=(\d+) prio=(\d+) success=(\d+) target_cpu=(\d+)/;TestExports.schedWakeupRE=b;var d=/trace_event_clock_sync: parent_ts=(\d+\.?\d*)/;TestExports.traceEventClockSyncRE=d;var j=/work struct (.+): function (\S+)/,o=/work struct (.+)/;a.canImport=function(b){if(!("string"===typeof b||b instanceof String))return!1;if(/^# tracer:/.exec(b))return!0;var a=/^(.+)\n/.exec(b);a&&(b=a[1]);return e.exec(b)?!0:!1};a.prototype={__proto__:Object.prototype,buildMapFromLinuxPidsToTimelineThreads:function(){this.threadsByLinuxPid=
{};this.model_.getAllThreads().forEach(function(b){this.threadsByLinuxPid[b.tid]=b}.bind(this))},getOrCreateCpuState:function(b){if(!this.cpuStates_[b]){var a=this.model_.getOrCreateCpu(b);this.cpuStates_[b]=new f(a)}return this.cpuStates_[b]},parsePid:function(b){b=/.+-(\d+)/.exec(b)[1];return b=parseInt(b)},parseThreadName:function(b){return/(.+)-\d+/.exec(b)[1]},getOrCreateKernelThread:function(b,a,d){this.kernelThreadStates_[b]||(void 0==a&&(a=this.parsePid(b)),void 0==d&&(d=a),d=this.model_.getOrCreateProcess(a).getOrCreateThread(d),
d.name=b,this.kernelThreadStates_[b]={pid:a,thread:d,openSlice:void 0,openSliceTS:void 0},this.threadsByLinuxPid[a]=d);return this.kernelThreadStates_[b]},importEvents:function(){this.importCpuData();this.alignClocks()&&this.buildPerThreadCpuSlicesFromCpuState()},finalizeImport:function(){},buildPerThreadCpuSlicesFromCpuState:function(){for(var b in this.cpuStates_)for(var a=this.cpuStates_[b].cpu,d=0;d<a.slices.length;d++){var e=a.slices[d],c=this.threadsByLinuxPid[e.args.tid];c&&(c.tempCpuSlices||
(c.tempCpuSlices=[]),e.index=d,c.tempCpuSlices.push(e))}var q=tracing.getColorIdByName("running"),j=tracing.getColorIdByName("runnable"),i=tracing.getColorIdByName("sleeping"),f=tracing.getColorIdByName("iowait");this.model_.getAllThreads().forEach(function(b){if(b.tempCpuSlices){var a=b.tempCpuSlices;delete b.tempCpuSlices;a.sort(function(b,a){var d=b.start-a.start;return 0==d?b.index-a.index:d});var d=[];if(a.length){var e=a[0];d.push(new tracing.TimelineSlice("Running",q,e.start,{},e.duration))}for(e=
1;e<a.length;e++){var g=a[e-1],c=a[e],h=c.start-g.end;if("S"==g.args.stateWhenDescheduled)d.push(new tracing.TimelineSlice("Sleeping",i,g.end,{},h));else if("R"==g.args.stateWhenDescheduled||"R+"==g.args.stateWhenDescheduled)d.push(new tracing.TimelineSlice("Runnable",j,g.end,{},h));else if("D"==g.args.stateWhenDescheduled)d.push(new tracing.TimelineSlice("I/O Wait",f,g.end,{},h));else if("T"==g.args.stateWhenDescheduled)d.push(new tracing.TimelineSlice("__TASK_STOPPED",f,g.end,{},h));else if("t"==
g.args.stateWhenDescheduled)d.push(new tracing.TimelineSlice("debug",f,g.end,{},h));else if("Z"==g.args.stateWhenDescheduled)d.push(new tracing.TimelineSlice("Zombie",f,g.end,{},h));else if("X"==g.args.stateWhenDescheduled)d.push(new tracing.TimelineSlice("Exit Dead",f,g.end,{},h));else if("x"==g.args.stateWhenDescheduled)d.push(new tracing.TimelineSlice("Task Dead",f,g.end,{},h));else if("W"==g.args.stateWhenDescheduled)d.push(new tracing.TimelineSlice("WakeKill",f,g.end,{},h));else throw"Unrecognized state: "+
g.args.stateWhenDescheduled;d.push(new tracing.TimelineSlice("Running",q,c.start,{},c.duration))}b.cpuSlices=d}})},alignClocks:function(){if(0==this.clockSyncRecords_.length){if(!this.isAdditionalImport_)return;this.abortImport();return!1}var b=this.clockSyncRecords_[0];if(0==b.parentTS||b.parentTS==b.perfTS)return!0;var b=b.parentTS-b.perfTS,a;for(a in this.cpuStates_){for(var d=this.cpuStates_[a].cpu,e=0;e<d.slices.length;e++){var c=d.slices[e];c.start+=b;c.duration=c.duration}for(var q in d.counters){e=
d.counters[q];for(c=0;c<e.timestamps.length;c++)e.timestamps[c]+=b}}for(var j in this.kernelThreadStates_){a=this.kernelThreadStates_[j].thread;for(e=0;e<a.subRows[0].length;e++)a.subRows[0][e].start+=b}return!0},abortImport:function(){if(this.pushedEventsToThreads)throw"Cannot abort, have alrady pushedCpuDataToThreads.";for(var b in this.cpuStates_)delete this.model_.cpus[b];for(var a in this.kernelThreadStates_){b=this.kernelThreadStates_[a].thread;var d=b.parent;delete d.threads[b.tid];delete this.model_.processes[d.pid]}this.model_.importErrors.push("Cannot import kernel trace without a clock sync.")},
markPidRunnable:function(){},importError:function(b){this.model_.importErrors.push("Line "+(this.lineNumber+1)+": "+b)},malformedEvent:function(b){this.importError("Malformed "+b+" event")},processBegin:function(b,a,d,e,c,q){var j=tracing.getStringColorId(d),d=new tracing.TimelineThreadSlice(d,j,e,null);d.pid=c;d.tid=q;d.threadName=a;b.openSlices.push(d)},processEnd:function(b,a){if(0!=b.openSlices.length){var d=b.openSlices.pop();d.duration=a-d.start;var e=this.model_.getOrCreateProcess(d.pid).getOrCreateThread(d.tid);
e.name||(e.name=d.threadName);this.threadsByLinuxPid[d.tid]=e;e.getSubrow(b.openSlices.length).push(d);b.openSlices.length&&b.openSlices[b.openSlices.length-1].subSlices.push(d)}},autoCloseOpenSlices:function(){this.model_.updateBounds();var b=[],a;for(a in this.threadStateByKPID_)for(var d=this.threadStateByKPID_[a],e=0;e<d.openSlices.length;e++){var c=d.openSlices[e];b.push(c.start);for(var q=0;q<c.subSlices.length;q++){var j=c.subSlices[q];b.push(j.start);j.duration&&b.push(j.end)}}b=this.model_.maxTimestamp?
Math.max(this.model_.maxTimestamp,Math.max.apply(Math,b)):Math.max.apply(Math,b);for(a in this.threadStateByKPID_)for(d=this.threadStateByKPID_[a];0<d.openSlices.length;)c=d.openSlices.pop(),c.duration=b-c.start,c.didNotFinish=!0,this.model_.getOrCreateProcess(c.pid).getOrCreateThread(c.tid).getSubrow(d.openSlices.length).push(c),d.openSlices.length&&d.openSlices[d.openSlices.length-1].subSlices.push(c)},processCounter:function(b,a,d,e){b=this.model_.getOrCreateProcess(e).getOrCreateCounter("",b);
0==b.numSeries&&(b.seriesNames.push("state"),b.seriesColors.push(tracing.getStringColorId(b.name+".state")));b.timestamps.push(a);b.samples.push(d)},importCpuData:function(){this.lines_=this.events_.split("\n");for(this.lineNumber=0;this.lineNumber<this.lines_.length;++this.lineNumber){var a=this.lines_[this.lineNumber];if(!(/^#/.exec(a)||0==a.length)){var f=e.exec(a);if(f){var m=f[1],a=f[4],h=f[5],l=f[6],q=this.getOrCreateCpuState(parseInt(f[2])),f=1E3*parseFloat(a);switch(h){case "sched_switch":a=
i.exec(l);if(!a){this.malformedEvent(h);continue}h=a[4];l=a[5];m=parseInt(a[6]);a=parseInt(a[7]);q.switchRunningLinuxPid(this,h,f,m,l,a);break;case "sched_wakeup":a=b.exec(l);if(!a){this.malformedEvent(h);continue}l=a[1];h=parseInt(a[2]);a=parseInt(a[3]);this.markPidRunnable(f,h,l,a);break;case "power_start":a=/type=(\d+) state=(\d) cpu_id=(\d)+/.exec(l);if(!a){this.malformedEvent(h);continue}h=parseInt(a[3]);h=this.getOrCreateCpuState(h);if("1"==a[1])h=h.cpu.getOrCreateCounter("","C-State");else{this.importError("Don't understand power_start events of type "+
a[1]);continue}0==h.numSeries&&(h.seriesNames.push("state"),h.seriesColors.push(tracing.getStringColorId(h.name+".state")));a=parseInt(a[2]);h.timestamps.push(f);h.samples.push(a);break;case "power_frequency":a=/type=(\d+) state=(\d+) cpu_id=(\d)+/.exec(l);if(!a){this.malformedEvent(h);continue}h=parseInt(a[3]);h=this.getOrCreateCpuState(h);h=h.cpu.getOrCreateCounter("","Power Frequency");0==h.numSeries&&(h.seriesNames.push("state"),h.seriesColors.push(tracing.getStringColorId(h.name+".state")));
a=parseInt(a[2]);h.timestamps.push(f);h.samples.push(a);break;case "cpu_frequency":a=/state=(\d+) cpu_id=(\d)+/.exec(l);if(!a){this.malformedEvent(h);continue}h=parseInt(a[2]);h=this.getOrCreateCpuState(h);h=h.cpu.getOrCreateCounter("","Clock Frequency");0==h.numSeries&&(h.seriesNames.push("state"),h.seriesColors.push(tracing.getStringColorId(h.name+".state")));a=parseInt(a[1]);h.timestamps.push(f);h.samples.push(a);break;case "cpu_idle":a=/state=(\d+) cpu_id=(\d)+/.exec(l);if(!a){this.malformedEvent(h);
continue}h=parseInt(a[2]);h=this.getOrCreateCpuState(h);h=h.cpu.getOrCreateCounter("","C-State");0==h.numSeries&&(h.seriesNames.push("state"),h.seriesColors.push(tracing.getStringColorId(h.name)));a=parseInt(a[1]);4294967295!=a?h.samples.push(a):h.samples.push(0);h.timestamps.push(f);break;case "workqueue_execute_start":a=j.exec(l);if(!a){this.malformedEvent(h);continue}h=this.getOrCreateKernelThread(m);h.openSliceTS=f;h.openSlice=a[2];break;case "workqueue_execute_end":a=o.exec(l);if(!a){this.malformedEvent(h);
continue}h=this.getOrCreateKernelThread(m);h.openSlice&&(f=new tracing.TimelineSlice(h.openSlice,tracing.getStringColorId(h.openSlice),h.openSliceTS,{},f-h.openSliceTS),h.thread.subRows[0].push(f));h.openSlice=void 0;break;case "workqueue_queue_work":break;case "workqueue_activate_work":break;case "i915_gem_object_pwrite":a=/obj=(.+), offset=(\d+), len=(\d+)/.exec(l);if(!a){this.malformedEvent(h);continue}l=a[1];q=parseInt(a[2]);a=parseInt(a[3]);h=this.getOrCreateKernelThread("i915_gem",0,1);h.openSlice=
"pwrite:"+l;f=new tracing.TimelineSlice(h.openSlice,tracing.getStringColorId(h.openSlice),f,{obj:l,offset:q,len:a},0);h.thread.subRows[0].push(f);break;case "i915_flip_request":a=/plane=(\d+), obj=(.+)/.exec(l);if(!a){this.malformedEvent(h);continue}q=parseInt(a[1]);l=a[2];h=this.getOrCreateKernelThread("i915_flip",0,2);h.openSliceTS=f;h.openSlice="flip:"+l+"/"+q;break;case "i915_flip_complete":a=/plane=(\d+), obj=(.+)/.exec(l);if(!a){this.malformedEvent(h);continue}q=parseInt(a[1]);l=a[2];h=this.getOrCreateKernelThread("i915_flip",
0,2);h.openSlice&&(f=new tracing.TimelineSlice(h.openSlice,tracing.getStringColorId(h.openSlice),h.openSliceTS,{obj:l,plane:q},f-h.openSliceTS),h.thread.subRows[0].push(f));h.openSlice=void 0;break;case "0":case "tracing_mark_write":if(a=d.exec(l))this.clockSyncRecords_.push({perfTS:f,parentTS:1E3*a[1]});else{q=this.parsePid(m);m=this.parseThreadName(m);a=q;a in this.threadStateByKPID_||(this.threadStateByKPID_[a]=new c);var r=this.threadStateByKPID_[a],a=l.split("|");switch(a[0]){case "B":h=parseInt(a[1]);
l=a[2];this.processBegin(r,m,l,f,h,q);break;case "E":this.processEnd(r,f);break;case "C":h=parseInt(a[1]);l=a[2];a=parseInt(a[3]);this.processCounter(l,f,a,h);break;default:this.malformedEvent(h)}}break;default:console.log("unknown event "+h)}}else this.importError("Unrecognized line: "+a)}}}};tracing.TimelineModel.registerImporter(a);return{LinuxPerfImporter:a,_LinuxPerfImporterTestExports:TestExports}});cr.define("tracing",function(){function f(){this.openSlices=[]}function c(a,e){this.model_=a;"string"===typeof e||e instanceof String?("["==e[0]&&(n=e.length,"]"!=e[n-1]&&"\n"!=e[n-1]?e+="]":"]"!=e[n-2]&&"\n"==e[n-1]?e+="]":"]"!=e[n-3]&&("\r"==e[n-2]&&"\n"==e[n-1])&&(e+="]")),this.events_=JSON.parse(e)):this.events_=e;this.events_.traceEvents&&(this.events_=this.events_.traceEvents);this.threadStateByPTID_={};this.allAsyncEvents_=[]}c.canImport=function(a){return"string"===typeof a||a instanceof String?
"{"==a[0]||"["==a[0]:a instanceof Array&&a.length&&a[0].ph?!0:a.traceEvents?a.traceEvents instanceof Array&&a.traceEvents[0].ph:!1};c.prototype={__proto__:Object.prototype,processBeginEvent:function(a,e,c){var b=tracing.getStringColorId(c.name),a={index:a,slice:new tracing.TimelineThreadSlice(c.name,b,c.ts/1E3,c.args)};c.uts&&(a.slice.startInUserTime=c.uts/1E3);"0"===c.args["ui-nest"]?this.model_.importErrors.push("ui-nest no longer supported."):e.openSlices.push(a)},processEndEvent:function(a,e){if("0"===
e.args["ui-nest"])this.model_.importErrors.push("ui-nest no longer supported.");else if(0!=a.openSlices.length){var c=a.openSlices.pop().slice;c.duration=e.ts/1E3-c.start;e.uts&&(c.durationInUserTime=e.uts/1E3-c.startInUserTime);for(var b in e.args)c.args[b]=e.args[b];this.model_.getOrCreateProcess(e.pid).getOrCreateThread(e.tid).getSubrow(a.openSlices.length).push(c);a.openSlices.length&&a.openSlices[a.openSlices.length-1].slice.subSlices.push(c)}},processAsyncEvent:function(a,e,c){a=this.model_.getOrCreateProcess(c.pid).getOrCreateThread(c.tid);
this.allAsyncEvents_.push({event:c,thread:a})},autoCloseOpenSlices:function(){this.model_.updateBounds();var a=[],e;for(e in this.threadStateByPTID_)for(var c=this.threadStateByPTID_[e],b=0;b<c.openSlices.length;b++){var d=c.openSlices[b];a.push(d.slice.start);for(var j=0;j<d.slice.subSlices.length;j++){var f=d.slice.subSlices[j];a.push(f.start);f.duration&&a.push(f.end)}}a=this.model_.maxTimestamp?Math.max(this.model_.maxTimestamp,Math.max.apply(Math,a)):Math.max.apply(Math,a);for(e in this.threadStateByPTID_)for(c=
this.threadStateByPTID_[e];0<c.openSlices.length;)d=c.openSlices.pop(),d.slice.duration=a-d.slice.start,d.slice.didNotFinish=!0,b=this.events_[d.index],this.model_.getOrCreateProcess(b.pid).getOrCreateThread(b.tid).getSubrow(c.openSlices.length).push(d.slice),c.openSlices.length&&c.openSlices[c.openSlices.length-1].slice.subSlices.push(d.slice)},processCounterEvent:function(a){var e;e=void 0!==a.id?a.name+"["+a.id+"]":a.name;e=this.model_.getOrCreateProcess(a.pid).getOrCreateCounter(a.cat,e);if(0==
e.numSeries){for(var c in a.args)e.seriesNames.push(c),e.seriesColors.push(tracing.getStringColorId(e.name+"."+c));if(0==e.numSeries){this.model_.importErrors.push("Expected counter "+a.name+" to have at least one argument to use as a value.");delete e.parent.counters[e.name];return}}e.timestamps.push(a.ts/1E3);for(var b=0;b<e.numSeries;b++)c=e.seriesNames[b],void 0===a.args[c]?e.samples.push(0):e.samples.push(a.args[c])},importEvents:function(){for(var a=this.events_,e=0;e<a.length;e++){var c=a[e],
b=tracing.TimelineThread.getPTIDFromPidAndTid(c.pid,c.tid);b in this.threadStateByPTID_||(this.threadStateByPTID_[b]=new f);var d=this.threadStateByPTID_[b];"B"==c.ph?this.processBeginEvent(e,d,c):"E"==c.ph?this.processEndEvent(d,c):"S"==c.ph?this.processAsyncEvent(e,d,c):"F"==c.ph?this.processAsyncEvent(e,d,c):"T"==c.ph?this.processAsyncEvent(e,d,c):"I"==c.ph?(this.processBeginEvent(e,d,c),this.processEndEvent(d,c)):"C"==c.ph?this.processCounterEvent(c):"M"==c.ph?"thread_name"==c.name?this.model_.getOrCreateProcess(c.pid).getOrCreateThread(c.tid).name=
c.args.name:this.model_.importErrors.push("Unrecognized metadata name: "+c.name):this.model_.importErrors.push("Unrecognized event phase: "+c.ph+"("+c.name+")")}a=!1;for(b in this.threadStateByPTID_)d=this.threadStateByPTID_[b],a|=0<d.openSlices.length;a&&this.autoCloseOpenSlices()},finalizeImport:function(){if(0!=this.allAsyncEvents_.length){this.allAsyncEvents_.sort(function(b,a){return b.event.ts-a.event.ts});for(var a={},c=this.allAsyncEvents_,f=0;f<c.length;f++){var b=c[f],d=b.event,j=d.name;
if(void 0===j)this.model_.importErrors.push("Async events (ph: S, T or F) require an name parameter.");else{var o=d.id;if(void 0===o)this.model_.importErrors.push("Async events (ph: S, T or F) require an id parameter.");else if("S"==d.ph)void 0===a[j]&&(a[j]={}),a[j][o]?this.model_.importErrors.push("At "+d.ts+", an slice of the same id "+o+" was alrady open."):(a[j][o]=[],a[j][o].push(b));else if(void 0===a[j])this.model_.importErrors.push("At "+d.ts+", no slice named "+j+" was open.");else if(void 0===
a[j][o])this.model_.importErrors.push("At "+d.ts+", no slice named "+j+" with id="+o+" was open.");else{var g=a[j][o];g.push(b);if("F"==d.ph){var k=new tracing.TimelineAsyncSlice(j,tracing.getStringColorId(j),g[0].event.ts/1E3);k.duration=d.ts/1E3-g[0].event.ts/1E3;k.startThread=g[0].thread;k.endThread=b.thread;k.id=o;k.args=g[0].event.args;k.subSlices=[];for(b=1;b<g.length;++b){var m=j;"T"==g[b-1].event.ph&&(m=j+":"+g[b-1].event.args.step);m=new tracing.TimelineAsyncSlice(m,tracing.getStringColorId(j+
b),g[b-1].event.ts/1E3);m.duration=g[b].event.ts/1E3-g[b-1].event.ts/1E3;m.startThread=g[b-1].thread;m.endThread=g[b].thread;m.id=o;m.args=g[b-1].event.args;k.subSlices.push(m)}var g=k.subSlices[k.subSlices.length-1],h;for(h in d.args)g.args[h]=d.args[h];k.startThread.asyncSlices.push(k);delete a[j][o]}}}}}}};tracing.TimelineModel.registerImporter(c);return{TraceEventImporter:c}});cr.define("tracing",function(){function f(a,c,f){if(0==a.length)return 1;for(var b=0,d=a.length-1,j,o,g=-1;b<=d;)j=Math.floor((b+d)/2),o=c(a[j])-f,0>o?b=j+1:(0<o||(g=j),d=j-1);return-1!=g?g:b}function c(a,c,i,b,d,j){if(!(b>d)){var o=f(a,c,b);if(-1!=o&&(0<o&&c(a[o-1])+i(a[o-1])>=b&&j(a[o-1]),o!=a.length))for(i=a.length;o<i&&!(c(a[o])>=d);o++)j(a[o])}}return{findLowIndexInSortedArray:f,findLowIndexInSortedIntervals:function(a,c,i,b){var d=f(a,c,b);return 0==d?b>=c(a[0])&&b<c(a[0]+i(a[0]))?0:-1:d<=a.length&&
b>=c(a[d-1])&&b<c(a[d-1])+i(a[d-1])?d-1:a.length},iterateOverIntersectingIntervals:c,getIntersectingIntervals:function(a,e,f,b,d){var j=[];c(a,e,f,b,d,function(b){j.push(b)});return j}}});cr.define("tracing",function(){function f(){var c=document.createElement("iframe");c.style.cssText="width:100%;height:0;border:0;visibility:hidden";document.body.appendChild(c);this._doc=c.contentDocument;this._window=c.contentWindow;this._doc.body.style.cssText="padding:0;margin:0;overflow:hidden";for(var c=document.querySelectorAll("link[rel=stylesheet]"),a=0;a<c.length;a++){var e=c[a],f=this._doc.createElement("link");f.rel="stylesheet";f.href=e.href;this._doc.head.appendChild(f)}}f.prototype=
{__proto__:Object.prototype,measure:function(c){this._doc.body.appendChild(c);var a=this._window.getComputedStyle(c),e=parseInt(a.width,10),a=parseInt(a.height,10);this._doc.body.removeChild(c);return{width:e,height:a}}};return{MeasuringStick:f}});cr.define("tracing",function(){function f(b){this.parentEl_=b;this.scaleX_=1;this.gridTimebase_=this.panX_=0;this.gridStep_=1E3/60;this.hasCalledSetupFunction_=this.gridEnabled_=!1;this.onResizeBoundToThis_=this.onResize_.bind(this);this.checkForAttachInterval_=setInterval(this.checkForAttach_.bind(this),250)}function c(b,a){this.track=b;this.slice=a}function a(b,a,c){this.track=b;this.counter=a;this.sampleIndex=c}function e(){this.range_dirty_=!0;this.range_={};this.length_=0}f.prototype={__proto__:cr.EventTarget.prototype,
setWhenPossible:function(b){this.pendingSetFunction_=b},get isAttachedToDocument_(){for(var b=this.parentEl_;b.parentNode;)b=b.parentNode;return b==this.parentEl_.ownerDocument},onResize_:function(){this.dispatchChangeEvent()},checkForAttach_:function(){if(this.isAttachedToDocument_&&0!=this.clientWidth){this.iframe_||(this.iframe_=document.createElement("iframe"),this.iframe_.style.cssText="position:absolute;width:100%;height:0;border:0;visibility:hidden;",this.parentEl_.appendChild(this.iframe_),
this.iframe_.contentWindow.addEventListener("resize",this.onResizeBoundToThis_));var b=this.clientWidth+"x"+this.clientHeight;this.pendingSetFunction_&&(this.lastSize_=b,this.pendingSetFunction_(),this.pendingSetFunction_=void 0);window.clearInterval(this.checkForAttachInterval_);this.checkForAttachInterval_=void 0}},dispatchChangeEvent:function(){cr.dispatchSimpleEvent(this,"change")},detach:function(){this.checkForAttachInterval_&&(window.clearInterval(this.checkForAttachInterval_),this.checkForAttachInterval_=
void 0);this.iframe_.removeEventListener("resize",this.onResizeBoundToThis_);this.parentEl_.removeChild(this.iframe_)},get scaleX(){return this.scaleX_},set scaleX(b){this.scaleX_!=b&&(this.scaleX_=b,this.dispatchChangeEvent())},get panX(){return this.panX_},set panX(b){this.panX_!=b&&(this.panX_=b,this.dispatchChangeEvent())},setPanAndScale:function(b,a){if(this.scaleX_!=a||this.panX_!=b)this.scaleX_=a,this.panX_=b,this.dispatchChangeEvent()},xWorldToView:function(b){return(b+this.panX_)*this.scaleX_},
xWorldVectorToView:function(b){return b*this.scaleX_},xViewToWorld:function(b){return b/this.scaleX_-this.panX_},xViewVectorToWorld:function(b){return b/this.scaleX_},xPanWorldPosToViewPos:function(b,a,c){if("string"==typeof a)if("left"==a)a=0;else if("center"==a)a=c/2;else if("right"==a)a=c-1;else throw Error("unrecognized string for viewPos. left|center|right");this.panX=a/this.scaleX_-b},xPanWorldRangeIntoView:function(b,a,c){0>this.xWorldToView(b)?this.xPanWorldPosToViewPos(b,"left",c):this.xWorldToView(a)>
c&&this.xPanWorldPosToViewPos(a,"right",c)},xSetWorldRange:function(b,a,c){this.setPanAndScale(-b,c/(a-b))},get gridEnabled(){return this.gridEnabled_},set gridEnabled(b){this.gridEnabled_!=b&&(this.gridEnabled_=b&&!0,this.dispatchChangeEvent())},get gridTimebase(){return this.gridTimebase_},set gridTimebase(b){this.gridTimebase_!=b&&(this.gridTimebase_=b,cr.dispatchSimpleEvent(this,"change"))},get gridStep(){return this.gridStep_},applyTransformToCanavs:function(b){b.transform(this.scaleX_,0,0,1,
this.panX_*this.scaleX_,0)}};c.prototype={get selected(){return this.slice.selected},set selected(b){this.slice.selected=b}};a.prototype={get selected(){return!0==this.track.selectedSamples[this.sampleIndex]},set selected(b){this.track.selectedSamples[this.sampleIndex]=b?!0:!1;this.track.invalidate()}};e.prototype={__proto__:Object.prototype,get range(){if(this.range_dirty_){for(var b=Infinity,a=-b,c=0;c<this.length_;c++){var e=this[c];e.slice&&(b=Math.min(b,e.slice.start),a=Math.max(a,e.slice.end))}this.range_=
{min:b,max:a};this.range_dirty_=!1}return this.range_},get duration(){return this.range.max-this.range.min},get length(){return this.length_},clear:function(){for(var b=0;b<this.length_;++b)delete this[b];this.length_=0;this.range_dirty_=!0},push_:function(b){this[this.length_++]=b;this.range_dirty_=!0;return b},addSlice:function(b,a){return this.push_(new c(b,a))},addCounterSample:function(b,d,c){return this.push_(new a(b,d,c))},subSelection:function(b,a){var a=a||1,c=new e;c.range_dirty_=!0;if(0>
b||b+a>this.length_)throw"Index out of bounds";for(var f=b;f<b+a;f++)c.push_(this[f]);return c},getCounterSampleHits:function(){for(var b=new e,d=0;d<this.length_;d++)this[d]instanceof a&&b.push_(this[d]);return b},getSliceHits:function(){for(var b=new e,a=0;a<this.length_;a++)this[a]instanceof c&&b.push_(this[a]);return b},map:function(a){for(var d=0;d<this.length_;d++)a(this[d])},getShiftedSelection:function(a){for(var d=new e,c=0;c<this.length_;c++){var f=this[c];f.track.addItemNearToProvidedHitToSelection(f,
a,d)}return 0==d.length?void 0:d}};var i=cr.ui.define("div");i.prototype={__proto__:HTMLDivElement.prototype,model_:null,decorate:function(){this.classList.add("timeline");this.viewport_=new f(this);this.viewportTrack=new tracing.TimelineViewportTrack;this.tracks_=this.ownerDocument.createElement("div");this.appendChild(this.tracks_);this.dragBox_=this.ownerDocument.createElement("div");this.dragBox_.className="timeline-drag-box";this.appendChild(this.dragBox_);this.hideDragBox_();this.bindEventListener_(document,
"keypress",this.onKeypress_,this);this.bindEventListener_(document,"keydown",this.onKeydown_,this);this.bindEventListener_(document,"mousedown",this.onMouseDown_,this);this.bindEventListener_(document,"mousemove",this.onMouseMove_,this);this.bindEventListener_(document,"mouseup",this.onMouseUp_,this);this.bindEventListener_(document,"dblclick",this.onDblClick_,this);this.lastMouseViewPos_={x:0,y:0};this.selection_=new e},bindEventListener_:function(a,d,c,e){this.boundListeners_||(this.boundListeners_=
[]);c=c.bind(e);this.boundListeners_.push({object:a,event:d,boundFunc:c});a.addEventListener(d,c)},detach:function(){for(var a=0;a<this.tracks_.children.length;a++)this.tracks_.children[a].detach();for(a=0;a<this.boundListeners_.length;a++){var d=this.boundListeners_[a];d.object.removeEventListener(d.event,d.boundFunc)}this.boundListeners_=void 0;this.viewport_.detach()},get viewport(){return this.viewport_},get model(){return this.model_},set model(a){if(!a)throw Error("Model cannot be null");if(this.model)throw Error("Cannot set model twice.");
this.model_=a;var d=[];a.getAllThreads().forEach(function(a){d.push(a.userFriendlyName)});a.getAllCounters().forEach(function(a){d.push(a.name)});a.getAllCpus().forEach(function(a){d.push("CPU "+a.cpuNumber)});var c=0,e=new tracing.MeasuringStick,f=document.createElement("div");f.style.position="fixed";f.className="timeline-canvas-based-track-title";d.forEach(function(a){f.textContent=a+":__";a=e.measure(f).width;300<a&&(a=300);a>c&&(c=a)});for(var c=c+"px",i=0;i<this.tracks_.children.length;i++)this.tracks_.children[i].detach();
this.tracks_.textContent="";this.viewportTrack.headingWidth=c;this.viewportTrack.viewport=this.viewport_;i=a.getAllCpus();i.sort(tracing.TimelineCpu.compare);i.forEach(function(a){var b=new tracing.TimelineCpuTrack;b.heading="CPU "+a.cpuNumber+":";b.headingWidth=c;b.viewport=this.viewport_;b.cpu=a;this.tracks_.appendChild(b);for(var d in a.counters){var e=a.counters[d],b=new tracing.TimelineCounterTrack;b.heading="CPU "+a.cpuNumber+" "+e.name+":";b.headingWidth=c;b.viewport=this.viewport_;b.counter=
e;this.tracks_.appendChild(b)}}.bind(this));a=a.getAllProcesses();a.sort(tracing.TimelineProcess.compare);a.forEach(function(a){var b=[],d;for(d in a.counters)b.push(a.counters[d]);b.sort(tracing.TimelineCounter.compare);b.forEach(function(a){var b=new tracing.TimelineCounterTrack;b.heading=a.name+":";b.headingWidth=c;b.viewport=this.viewport_;b.counter=a;this.tracks_.appendChild(b)}.bind(this));b=[];for(d in a.threads)b.push(a.threads[d]);b.sort(tracing.TimelineThread.compare);b.forEach(function(a){var b=
new tracing.TimelineThreadTrack;b.heading=a.userFriendlyName+":";b.tooltip=a.userFriendlyDetails;b.headingWidth=c;b.viewport=this.viewport_;b.thread=a;this.tracks_.appendChild(b)}.bind(this))}.bind(this));this.viewport_.setWhenPossible(function(){this.viewport_.xSetWorldRange(this.model_.minTimestamp,this.model_.maxTimestamp,this.firstCanvas.width)}.bind(this))},addAllObjectsMatchingFilterToSelection:function(a,d){for(var c=0;c<this.tracks_.children.length;++c)this.tracks_.children[c].addAllObjectsMatchingFilterToSelection(a,
d)},get focusElement(){return this.focusElement_?this.focusElement_:this.parentElement},set focusElement(a){this.focusElement_=a},get listenToKeys_(){return!this.viewport_.isAttachedToDocument_?!1:!this.focusElement_?!0:0<=this.focusElement.tabIndex?document.activeElement==this.focusElement:!0},onKeypress_:function(a){var d=this.viewport_;if(this.firstCanvas&&this.listenToKeys_){var c=this.firstCanvas.clientWidth;switch(a.keyCode){case 101:a=d.xViewToWorld(this.lastMouseViewPos_.x);d.xPanWorldPosToViewPos(a,
"center",c);break;case 119:this.zoomBy_(1.5);break;case 115:this.zoomBy_(1/1.5);break;case 103:this.onGridToggle_(!0);break;case 71:this.onGridToggle_(!1);break;case 87:this.zoomBy_(10);break;case 83:this.zoomBy_(0.1);break;case 97:d.panX+=d.xViewVectorToWorld(0.1*c);break;case 100:d.panX-=d.xViewVectorToWorld(0.1*c);break;case 65:d.panX+=d.xViewVectorToWorld(0.5*c);break;case 68:d.panX-=d.xViewVectorToWorld(0.5*c)}}},onKeydown_:function(a){if(this.listenToKeys_){var d;switch(a.keyCode){case 37:if(d=
this.selection.getShiftedSelection(-1))this.setSelectionAndMakeVisible(d),a.preventDefault();break;case 39:if(d=this.selection.getShiftedSelection(1))this.setSelectionAndMakeVisible(d),a.preventDefault();break;case 9:-1==this.focusElement.tabIndex&&(a.shiftKey?this.selectPrevious_(a):this.selectNext_(a),a.preventDefault())}}},zoomBy_:function(a){if(this.firstCanvas){var d=this.viewport_,c=this.firstCanvas.clientWidth,e=this.lastMouseViewPos_.x,f=d.xViewToWorld(e);d.scaleX*=a;d.xPanWorldPosToViewPos(f,
e,c)}},get keyHelp(){var a="Keyboard shortcuts:\n w/s     : Zoom in/out    (with shift: go faster)\n a/d     : Pan left/right\n e       : Center on mouse\n g/G     : Shows grid at the start/end of the selected task\n",a=this.focusElement.tabIndex?a+" <-      : Select previous event on current timeline\n ->      : Select next event on current timeline\n":a+" <-,^TAB : Select previous event on current timeline\n ->, TAB : Select next event on current timeline\n";return a+"\nDbl-click to zoom in; Shift dbl-click to zoom out\n"},
get selection(){return this.selection_},set selection(a){if(!(a instanceof e))throw"Expected TimelineSelection";var d;for(d=0;d<this.selection_.length;d++)this.selection_[d].selected=!1;this.selection_=a;cr.dispatchSimpleEvent(this,"selectionChange");for(d=0;d<this.selection_.length;d++)this.selection_[d].selected=!0;this.viewport_.dispatchChangeEvent()},setSelectionAndMakeVisible:function(a,d){if(!(a instanceof e))throw"Expected TimelineSelection";this.selection=a;var c=this.selection.range,f=this.viewport_.xWorldVectorToView(c.max-
c.min);d&&50>f?(f=c.min+0.5*(c.max-c.min),c=5*(c.max-c.min),this.viewport_.xSetWorldRange(f-0.5*c,f+0.5*c,this.firstCanvas.width)):this.viewport_.xPanWorldRangeIntoView(c.min,c.max,this.firstCanvas.width)},get firstCanvas(){return this.tracks_.firstChild?this.tracks_.firstChild.firstCanvas:void 0},hideDragBox_:function(){this.dragBox_.style.left="-1000px";this.dragBox_.style.top="-1000px";this.dragBox_.style.width=0;this.dragBox_.style.height=0},setDragBoxPosition_:function(a,c){var e=Math.min(a.clientX,
c.clientX),f=Math.max(a.clientX,c.clientX),g=Math.min(a.clientY,c.clientY),i=Math.max(a.clientY,c.clientY);this.dragBox_.style.left=e+"px";this.dragBox_.style.top=g+"px";this.dragBox_.style.width=f-e+"px";this.dragBox_.style.height=i-g+"px";g=this.firstCanvas;e=this.viewport_.xViewToWorld(e-g.offsetLeft);f=this.viewport_.xViewToWorld(f-g.offsetLeft);this.dragBox_.textContent=Math.round(100*(f-e))/100+"ms";g=new cr.Event("selectionChanging");g.loWX=e;g.hiWX=f;this.dispatchEvent(g)},onGridToggle_:function(a){var a=
a?this.selection_.range.min:this.selection_.range.max,c=Math.ceil((a-this.model_.minTimestamp)/this.viewport_.gridStep_);this.viewport_.gridTimebase=a-(c+1)*this.viewport_.gridStep_;this.viewport_.gridEnabled=!0},onMouseDown_:function(a){var c=this.firstCanvas,e=this.tracks_.getClientRects()[0];e&&(a.clientX>=e.left&&a.clientX<e.right&&a.clientY>=e.top&&a.clientY<e.bottom&&a.x>=c.offsetLeft)&&(this.viewport_.xViewToWorld(a.clientX-c.offsetLeft),this.dragBeginEvent_=a,a.preventDefault(),0<=this.focusElement.tabIndex&&
this.focusElement.focus())},onMouseMove_:function(a){if(this.firstCanvas){var c=this.firstCanvas;this.lastMouseViewPos_={x:a.clientX-c.offsetLeft,y:a.clientY-c.offsetTop};this.dragBeginEvent_&&this.setDragBoxPosition_(this.dragBeginEvent_,a)}},onMouseUp_:function(a){var c;if(this.dragBeginEvent_){this.hideDragBox_();var f=this.dragBeginEvent_;this.dragBeginEvent_=null;var i=Math.min(f.clientX,a.clientX);c=Math.max(f.clientX,a.clientX);var g=Math.min(f.clientY,a.clientY),a=Math.max(f.clientY,a.clientY),
f=this.firstCanvas,i=this.viewport_.xViewToWorld(i-f.offsetLeft),f=this.viewport_.xViewToWorld(c-f.offsetLeft),k=new e;for(c=0;c<this.tracks_.children.length;c++){var m=this.tracks_.children[c],h=m.getBoundingClientRect(),l=Math.max(g,h.top),h=Math.min(a,h.bottom);l<=h&&m.addIntersectingItemsInRangeToSelection(i,f,g,a,k)}this.selection=k}},onDblClick_:function(a){if(!(a.x<this.firstCanvas.offsetLeft)){var c=4;a.shiftKey&&(c=1/c);this.zoomBy_(c);a.preventDefault()}}};cr.defineProperty(i,"model",cr.PropertyKind.JS);
return{Timeline:i,TimelineSelectionSliceHit:c,TimelineSelectionCounterSampleHit:a,TimelineSelection:e,TimelineViewport:f}});cr.define("tracing",function(){function f(a){return Math.round(1E3*a)/1E3}function c(a,b){b=b||0;"string"!=typeof a&&(a=""+a);if(a.length>=b)return"";for(var c="",e=0;e<b-a.length;e++)c+=" ";return c}function a(a,b){return a+c(a,b)}function e(a,b){return c(a,b)+a}function i(b){var c="",i=b.getSliceHits(),g=b.getCounterSampleHits();if(1==i.length){var b=14,k=i[0].slice,c="Selected item:\n"+(a("Title",b)+": "+k.title+"\n"),c=c+(a("Start",b)+": "+f(k.start)+" ms\n"),c=c+(a("Duration",b)+": "+f(k.duration)+
" ms\n");k.durationInUserTime&&(c+=a("Duration (U)",b)+": "+f(k.durationInUserTime)+" ms\n");var m=0,h;for(h in k.args)m+=1;if(0<m)for(h in c+=a("Args",b)+":\n",k.args)m=k.args[h],c+=a(" "+h,b)+": "+m+"\n"}else if(1<i.length){var b=55,c="Slices:\n",l=i.range.min,q=i.range.max;i.map(function(a){return a.slice.title});var r={};for(h=0;h<i.length;h++)k=i[h].slice,r[k.title]||(r[k.title]={slices:[]}),r[k.title].slices.push(k);k=0;for(m in r){var v=r[m],u=0;for(h=0;h<v.slices.length;h++)u+=v.slices[h].duration;
k+=u;c+=" "+a(m,b)+": "+e(f(u)+"ms",12)+"   "+e(""+v.slices.length,5)+" occurrences\n"}c+=a("*Totals",b)+" : "+e(f(k)+"ms",12)+"   "+e(""+i.length,5)+" occurrences\n";c=c+"\n"+(a("Selection start",b)+" : "+e(f(l)+"ms",12)+"\n");c+=a("Selection extent",b)+" : "+e(f(q-l)+"ms",12)+"\n"}if(1==g.length){c="Selected counter:\n";b=55;g=g[0];i=g.counter;g=g.sampleIndex;m=[];for(h=0;h<i.numSeries;++h)m.push(i.samples[i.numSeries*g+h]);c+=a("Title",b)+": "+i.name+"\n";c+=a("Timestamp",b)+": "+f(i.timestamps[g])+
" ms\n";c=1<i.numSeries?c+(a("Values",b)+": "+m.join("\n")+"\n"):c+(a("Value",b)+": "+m.join("\n")+"\n")}else 1<g.length&&0==i.length&&(c+="Analysis of multiple counters not yet implemented. Pick a single counter.");return c}var b=cr.ui.define("div");b.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.className="timeline-analysis"},set selection(a){this.textContent=i(a)}};return{TimelineAnalysisView:b}});cr.define("tracing",function(){function f(a,b){var c=document.createElement("div");c.classList.add("timeline-track-button");c.classList.add("timeline-track-close-button");c.textContent=String.fromCharCode(215);c.addEventListener("click",function(){a.style.display="None"});a.appendChild(c);if(b){var d=document.createElement("div");d.classList.add("timeline-track-button");d.classList.add("timeline-track-collapse-button");d.textContent="\u2212";var e=!1;d.addEventListener("click",function(){e=!e;a.collapsedDidChange(e);
d.textContent=e?"+":"\u2212"});a.appendChild(d)}}function c(a,b){this.string=a;this.width=b}function a(){}var e=tracing.getPallette(),i=tracing.getPalletteHighlightIdBoost(),b={},d={},j=cr.ui.define("div");j.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.tracks_=[]},detach:function(){for(var a=0;a<this.tracks_.length;a++)this.tracks_[a].detach()},get viewport(){return this.viewport_},set viewport(a){this.viewport_=a;for(var b=0;b<this.tracks_.length;b++)this.tracks_[b].viewport=
a;this.updateChildTracks_()},get firstCanvas(){if(this.tracks_.length)return this.tracks_[0].firstCanvas},addIntersectingItemsToSelection:function(a,b,c){for(var d=0;d<this.tracks_.length;d++){var e=this.tracks_[d].getBoundingClientRect();b>=e.top&&b<e.bottom&&this.tracks_[d].addIntersectingItemsToSelection(a,b,c)}return!1},addIntersectingItemsInRangeToSelection:function(a,b,c,d,e){for(var f=0;f<this.tracks_.length;f++){var g=this.tracks_[f].getBoundingClientRect(),h=Math.max(c,g.top),g=Math.min(d,
g.bottom);h<=g&&this.tracks_[f].addIntersectingItemsInRangeToSelection(a,b,c,d,e)}},addAllObjectsMatchingFilterToSelection:function(a,b){for(var c=0;c<this.tracks_.length;c++)this.tracks_[c].addAllObjectsMatchingFilterToSelection(a,b)}};var o=cr.ui.define(j);o.prototype={__proto__:j.prototype,decorate:function(){this.classList.add("timeline-thread-track")},get thread(){return this.thread_},set thread(a){this.thread_=a;this.updateChildTracks_()},get tooltip(){return this.tooltip_},set tooltip(a){this.tooltip_=
a;this.updateChildTracks_()},get heading(){return this.heading_},set heading(a){this.heading_=a;this.updateChildTracks_()},get headingWidth(){return this.headingWidth_},set headingWidth(a){this.headingWidth_=a;this.updateChildTracks_()},addTrack_:function(a){var b=new k;b.heading="";b.slices=a;b.headingWidth=this.headingWidth_;b.viewport=this.viewport_;this.tracks_.push(b);this.appendChild(b);return b},updateChildTracks_:function(){this.detach();this.textContent="";this.tracks_=[];if(this.thread_){if(this.thread_.cpuSlices){var a=
this.addTrack_(this.thread_.cpuSlices);a.height="4px";a.decorateHit=function(a){a.thread=this.thread_}}if(this.thread_.asyncSlices.length)for(var b=this.thread_.asyncSlices.subRows,c=0;c<b.length;c++)a=this.addTrack_(b[c]),a.decorateHit=function(){},a.asyncStyle=!0;for(c=0;c<this.thread_.subRows.length;c++)a=this.addTrack_(this.thread_.subRows[c]),a.decorateHit=function(a){a.thread=this.thread_};0<this.tracks_.length&&(this.thread_.cpuSlices?(this.tracks_[1].heading=this.heading_,this.tracks_[1].tooltip=
this.tooltip_):(this.tracks_[0].heading=this.heading_,this.tracks_[0].tooltip=this.tooltip_))}f(this,4<=this.tracks_.length)},collapsedDidChange:function(a){if(a)for(var a=parseInt(this.tracks_[0].height),b=0;b<this.tracks_.length;++b)2<a?this.tracks_[b].height=Math.floor(a)+"px":this.tracks_[b].style.display="None",a*=0.5;else for(b=0;b<this.tracks_.length;++b)this.tracks_[b].height=this.tracks_[0].height,this.tracks_[b].style.display=""}};var g=cr.ui.define(j);g.prototype={__proto__:j.prototype,
decorate:function(){this.classList.add("timeline-thread-track")},get cpu(){return this.cpu_},set cpu(a){this.cpu_=a;this.updateChildTracks_()},get tooltip(){return this.tooltip_},set tooltip(a){this.tooltip_=a;this.updateChildTracks_()},get heading(){return this.heading_},set heading(a){this.heading_=a;this.updateChildTracks_()},get headingWidth(){return this.headingWidth_},set headingWidth(a){this.headingWidth_=a;this.updateChildTracks_()},updateChildTracks_:function(){this.detach();this.textContent=
"";this.tracks_=[];if(this.cpu_){var a=new k;a.slices=this.cpu_.slices;a.headingWidth=this.headingWidth_;a.viewport=this.viewport_;this.tracks_.push(a);this.appendChild(a);this.tracks_[0].heading=this.heading_;this.tracks_[0].tooltip=this.tooltip_}f(this,!1)}};j=cr.ui.define("div");j.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.className="timeline-canvas-based-track";this.slices_=null;this.headingDiv_=document.createElement("div");this.headingDiv_.className="timeline-canvas-based-track-title";
this.headingDiv_.onselectstart=function(){return!1};this.appendChild(this.headingDiv_);this.canvasContainer_=document.createElement("div");this.canvasContainer_.className="timeline-canvas-based-track-canvas-container";this.appendChild(this.canvasContainer_);this.canvas_=document.createElement("canvas");this.canvas_.className="timeline-canvas-based-track-canvas";this.canvasContainer_.appendChild(this.canvas_);this.ctx_=this.canvas_.getContext("2d")},detach:function(){this.viewport_&&this.viewport_.removeEventListener("change",
this.viewportChangeBoundToThis_)},set headingWidth(a){this.headingDiv_.style.width=a},get heading(){return this.headingDiv_.textContent},set heading(a){this.headingDiv_.textContent=a},set tooltip(a){this.headingDiv_.title=a},get viewport(){return this.viewport_},set viewport(a){(this.viewport_=a)&&this.viewport_.removeEventListener("change",this.viewportChangeBoundToThis_);if(this.viewport_=a)this.viewportChangeBoundToThis_=this.viewportChange_.bind(this),this.viewport_.addEventListener("change",
this.viewportChangeBoundToThis_);this.invalidate()},viewportChange_:function(){this.invalidate()},invalidate:function(){this.rafPending_||(webkitRequestAnimationFrame(function(){this.rafPending_=!1;if(this.viewport_){var a=window.getComputedStyle(this.canvasContainer_),b=parseInt(a.width),a=parseInt(a.height);this.canvas_.width!=b&&(this.canvas_.width=b);this.canvas_.height!=a&&(this.canvas_.height=a);this.redraw()}}.bind(this),this),this.rafPending_=!0)},get firstCanvas(){return this.canvas_}};a.prototype=
{get:function(a,b,e,f,g){var h=d[e];h||(h={},d[e]=h);f=h[b];f||(h[b]={},f=h[b]);h=f[g];if(void 0===h){for(h=!1;a.labelWidthWorld(e,b)>g;)e=e.substring(0,0.75*e.length),h=!0;h&&3<e.length&&(e=e.substring(0,e.length-3)+"...");h=new c(e,a.labelWidth(e));f[g]=h}return h}};var k=cr.ui.define(j);k.prototype={__proto__:j.prototype,SHOULD_ELIDE_TEXT:!0,decorate:function(){this.classList.add("timeline-slice-track");this.elidedTitleCache=new a;this.asyncStyle_=!1},decorateHit:function(){},get asyncStyle(){return this.asyncStyle_},
set asyncStyle(a){this.asyncStyle_=!!a;this.invalidate()},get slices(){return this.slices_},set slices(a){this.slices_=a;this.invalidate()},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a;this.invalidate()},labelWidth:function(a){var c=b[a];c||(c=this.ctx_.measureText(a).width,b[a]=c);return c+2},labelWidthWorld:function(a,b){return this.labelWidth(a)*b},redraw:function(){var a=this.ctx_,b=this.canvas_.width,c=this.canvas_.height;a.clearRect(0,0,b,c);var d=
this.viewport_,f=d.xViewVectorToWorld(1),g=d.xViewToWorld(0),b=d.xViewToWorld(b);if(d.gridEnabled){var h=d.gridTimebase;for(a.beginPath();h<b;){if(h>=g){var j=d.xWorldToView(h);a.moveTo(j,0);a.lineTo(j,c)}h+=d.gridStep}a.strokeStyle="rgba(255,0,0,0.25)";a.stroke()}a.save();d.applyTransformToCanavs(a);this.asyncStyle_&&(a.globalAlpha=0.25);var k=new tracing.FastRectRenderer(a,g,2*f,2*f,b,e);k.setYandH(0,c);g=this.slices_;for(b=0;b<g.length;++b){var j=g[b],h=j.start,l=Math.max(j.duration,0.001),m=j.selected?
j.colorId+i:j.colorId;l<f&&(l=f);0<j.duration?k.fillRect(h,l,m):0.001<f?k.fillRect(h,f,m):(a.fillStyle=e[m],a.beginPath(),a.moveTo(h-4*f,c),a.lineTo(h,0),a.lineTo(h+4*f,c),a.closePath(),a.fill())}k.flush();a.restore();if(8<c){a.textAlign="center";a.textBaseline="top";a.font="10px sans-serif";a.strokeStyle="rgb(0,0,0)";a.fillStyle="rgb(0,0,0)";c=20*f;h=this.SHOULD_ELIDE_TEXT;for(b=0;b<g.length;++b)if(j=g[b],j.duration>c&&(k=j.title,j.didNotFinish&&(k+=" (Did Not Finish)"),l=this.labelWidth(k),h&&this.labelWidthWorld(k,
f)>j.duration&&(l=this.elidedTitleCache.get(this,f,k,l,j.duration),k=l.string,l=l.width),l*f<j.duration))j=d.xWorldToView(j.start+0.5*j.duration),a.fillText(k,j,2.5,l)}},addIntersectingItemsToSelection:function(a,b,c){var d=this.getBoundingClientRect();if(b<d.top||b>=d.bottom)return!1;a=tracing.findLowIndexInSortedIntervals(this.slices_,function(a){return a.start},function(a){return a.duration},a);return 0<=a&&a<this.slices_.length?(this.decorateHit(c.addSlice(this,this.slices_[a])),!0):!1},addIntersectingItemsInRangeToSelection:function(a,
b,c,d,e){function f(a){a=e.addSlice(h,a);h.decorateHit(a)}var g=this.getBoundingClientRect(),c=Math.max(c,g.top),d=Math.min(d,g.bottom);if(!(c>d)){var h=this;tracing.iterateOverIntersectingIntervals(this.slices_,function(a){return a.start},function(a){return a.duration},a,b,f)}},indexOfSlice_:function(a){for(var b=tracing.findLowIndexInSortedArray(this.slices_,function(a){return a.start},a.start);b<this.slices_.length&&a.start==this.slices_[b].start&&a.colorId!=this.slices_[b].colorId;)b++;return b<
this.slices_.length?b:void 0},addItemNearToProvidedHitToSelection:function(a,b,c){if(!a.slice)return!1;a=this.indexOfSlice_(a.slice);if(void 0===a)return!1;b=a+b;if(0>b||b>=this.slices_.length)return!1;a=c.addSlice(this,this.slices_[b]);this.decorateHit(a);return!0},addAllObjectsMatchingFilterToSelection:function(a,b){for(var c=0;c<this.slices_.length;++c)a.matchSlice(this.slices_[c])&&this.decorateHit(b.addSlice(this,this.slices_[c]))}};var m=cr.ui.define(j),h=Math.log(10);m.prototype={__proto__:j.prototype,
decorate:function(){this.classList.add("timeline-viewport-track");this.strings_secs_=[];this.strings_msecs_=[]},redraw:function(){var a=this.ctx_,b=this.canvas_.width,c=this.canvas_.height;a.clearRect(0,0,b,c);var d=this.viewport_;d.xViewVectorToWorld(1);for(var e=d.xViewToWorld(0),f=d.xViewToWorld(b),g=d.xViewVectorToWorld(150),i=Math.pow(10,Math.ceil(Math.log(g)/h)),j=[10,5,2,1],g=0;g<j.length;++g)if(!(150>d.xWorldVectorToView(i/j[g]))){majorMarkDistanceWorld=i/j[g-1];break}i=void 0;100>majorMarkDistanceWorld?
(unit="ms",unitDivisor=1,i=this.strings_msecs_):(unit="s",unitDivisor=1E3,i=this.strings_secs_);j=d.xWorldVectorToView(majorMarkDistanceWorld/5);g=Math.floor(e/majorMarkDistanceWorld)*majorMarkDistanceWorld;e=Math.floor(0.25*c);a.fillStyle="rgb(0, 0, 0)";a.strokeStyle="rgb(0, 0, 0)";a.textAlign="left";a.textBaseline="top";a.font="9px sans-serif";for(var k=g;k<f;k+=majorMarkDistanceWorld){var l=Math.floor(d.xWorldToView(k)),g=Math.floor(1E5*(k/unitDivisor))/1E5;i[g]||(i[g]=g+" "+unit);a.fillText(i[g],
l+2,0);a.beginPath();a.moveTo(l,0);a.lineTo(l,b);for(g=1;5>g;++g){var m=Math.floor(l+j*g);a.moveTo(m,c-e);a.lineTo(m,c)}a.stroke()}},addIntersectingItemsToSelection:function(){},addIntersectingItemsInRangeToSelection:function(){},addAllObjectsMatchingFilterToSelection:function(){}};var l=cr.ui.define(j);l.prototype={__proto__:j.prototype,decorate:function(){this.classList.add("timeline-counter-track");f(this,!1);this.selectedSamples_={}},decorateHit:function(){},get counter(){return this.counter_},
set counter(a){this.counter_=a;this.invalidate()},get selectedSamples(){return this.selectedSamples_},redraw:function(){var a=this.counter_,b=this.ctx_,c=this.canvas_.width,d=this.canvas_.height;b.clearRect(0,0,c,d);var f=this.viewport_,g=f.xViewVectorToWorld(1),h=f.xViewToWorld(0),c=f.xViewToWorld(c),i=f.xViewVectorToWorld(1);b.save();f.applyTransformToCanavs(b);for(var f=a.numSeries,j=a.numSamples,k=tracing.findLowIndexInSortedArray(a.timestamps,function(){},h),l=d/a.maxTotal,m=a.numSeries-1;0<=
m;m--){b.fillStyle=e[a.seriesColors[m]];b.beginPath();for(var o=k-1,w=0<=o?a.timestamps[o]-i:-1,x=d,A=!1;;){var s=o+1;if(s>=j){b.lineTo(w,x);b.lineTo(w+8*g,x);b.lineTo(w+8*g,d);break}var t=a.timestamps[s],o=a.totals[s*f+m],z=d-l*o;if(t>c){b.lineTo(t,x);b.lineTo(t,d);break}t-w<i?o=s:(A||(b.moveTo(h,d),A=!0),b.lineTo(t,x),b.lineTo(t,z),o=s,w=t,x=z)}b.closePath();b.fill()}b.fillStyle="rgba(255, 0, 0, 1)";for(s in this.selectedSamples_)if(this.selectedSamples_[s]){t=a.timestamps[s];for(m=a.numSeries-
1;0<=m;m--)o=a.totals[s*f+m],z=d-l*o,b.fillRect(t-g,z-1,3*g,3)}b.restore()},addIntersectingItemsToSelection:function(a,b,c){var d=this.getBoundingClientRect();if(b<d.top||b>=d.bottom)return!1;b=this.counter_;if(a<this.counter_.timestamps[0])return!1;d=tracing.findLowIndexInSortedArray(b.timestamps,function(a){return a},a);if(0>d||d>=b.timestamps.length)return!1;0<d&&a>this.counter_.timestamps[d-1]&&d--;this.getBoundingClientRect();this.decorateHit(c.addCounterSample(this,this.counter,d));return!0},
addIntersectingItemsInRangeToSelection:function(a,b,c,d,e){var f=this.getBoundingClientRect(),c=Math.max(c,f.top),d=Math.min(d,f.bottom);if(!(c>d)){d=this.counter_;c=tracing.findLowIndexInSortedArray(d.timestamps,function(a){return a},a);f=tracing.findLowIndexInSortedArray(d.timestamps,function(a){return a},b);0<c&&a>d.timestamps[c-1]&&c--;0<f&&b>d.timestamps[f-1]&&f--;for(a=c;a<=f;a++)a>=d.timestamps.length||this.decorateHit(e.addCounterSample(this,this.counter,a))}},addAllObjectsMatchingFilterToSelection:function(){}};
return{TimelineCounterTrack:l,TimelineSliceTrack:k,TimelineThreadTrack:o,TimelineViewportTrack:m,TimelineCpuTrack:g}});cr.define("tracing",function(){function f(c,a,e,f,b,d){this.ctx_=c;this.vpLeft_=a;this.minRectSize_=e;this.maxMergeDist_=f;this.vpRight_=b;this.pallette_=d}f.prototype={y_:0,h_:0,merging_:!1,mergeStartX_:0,mergeCurRight_:0,setYandH:function(c,a){this.flush();this.y_=c;this.h_=a},fillRect:function(c,a,e){var f=c+a;f<this.vpLeft_||c>this.vpRight_||(a<this.minRectSize_?(f-this.mergeStartX_>this.maxMergeDist_&&this.flush(),this.merging_?(this.mergeCurRight_=f,this.mergedColorId=Math.max(this.mergedColorId,
e)):(this.merging_=!0,this.mergeStartX_=c,this.mergeCurRight_=f,this.mergedColorId=e)):(this.merging_&&this.flush(),this.ctx_.fillStyle=this.pallette_[e],this.ctx_.fillRect(c,this.y_,a,this.h_)))},flush:function(){this.merging_&&(this.ctx_.fillStyle=this.pallette_[this.mergedColorId],this.ctx_.fillRect(this.mergeStartX_,this.y_,this.mergeCurRight_-this.mergeStartX_,this.h_),this.merging_=!1)}};return{FastRectRenderer:f}});cr.define("tracing",function(){var f=cr.ui.define(cr.ui.TabPanel);f.prototype={__proto__:cr.ui.TabPanel.prototype,traceEvents_:[],systemTraceEvents_:[],decorate:function(){cr.ui.TabPanel.prototype.decorate.apply(this);this.classList.add("profiling-view");this.recordBn_=document.createElement("button");this.recordBn_.className="record";this.recordBn_.textContent="Record";this.recordBn_.addEventListener("click",this.onRecord_.bind(this));this.saveBn_=document.createElement("button");this.saveBn_.textContent=
"Save";this.saveBn_.addEventListener("click",this.onSave_.bind(this));this.loadBn_=document.createElement("button");this.loadBn_.textContent="Load";this.loadBn_.addEventListener("click",this.onLoad_.bind(this));if(cr.isChromeOS){this.systemTracingBn_=document.createElement("input");this.systemTracingBn_.type="checkbox";this.systemTracingBn_.checked=!0;var c=document.createElement("div");c.className="label";c.textContent="System events";c.appendChild(this.systemTracingBn_)}this.timelineView_=new tracing.TimelineView;
this.timelineView_.leftControls.appendChild(this.recordBn_);this.timelineView_.leftControls.appendChild(this.saveBn_);this.timelineView_.leftControls.appendChild(this.loadBn_);cr.isChromeOS&&this.timelineView_.leftControls.appendChild(this.systemTracingBn_);this.appendChild(this.timelineView_);document.addEventListener("keypress",this.onKeypress_.bind(this));this.refresh_()},didSetTracingController_:function(c,a){if(a)throw"Can only set tracing controller once.";this.tracingController_.addEventListener("traceEnded",
this.onRecordDone_.bind(this));this.tracingController_.addEventListener("loadTraceFileComplete",this.onLoadTraceFileComplete_.bind(this));this.tracingController_.addEventListener("saveTraceFileComplete",this.onSaveTraceFileComplete_.bind(this));this.tracingController_.addEventListener("loadTraceFileCanceled",this.onLoadTraceFileCanceled_.bind(this));this.tracingController_.addEventListener("saveTraceFileCanceled",this.onSaveTraceFileCanceled_.bind(this));this.refresh_()},refresh_:function(){if(this.tracingController_){var c=
this.tracingController_.traceEvents,a=c&&c.length;this.saveBn_.disabled=!a;a&&(a=new tracing.TimelineModel,a.importEvents(c,!0,[this.tracingController_.systemTraceEvents]),this.timelineView_.model=a)}},onKeypress_:function(c){if(114==c.keyCode&&!this.tracingController_.isTracingEnabled)this.onRecord_()},get timelineView(){return this.timelineView_},onRecord_:function(){this.tracingController_.beginTracing(this.systemTracingBn_?this.systemTracingBn_.checked:!1)},onRecordDone_:function(){this.refresh_()},
onSave_:function(){this.overlayEl_=new tracing.Overlay;this.overlayEl_.className="profiling-overlay";var c=document.createElement("div");c.className="label";c.textContent="Saving...";this.overlayEl_.appendChild(c);this.overlayEl_.visible=!0;this.tracingController_.beginSaveTraceFile()},onSaveTraceFileComplete_:function(){this.overlayEl_.visible=!1;this.overlayEl_=void 0},onSaveTraceFileCanceled_:function(){this.overlayEl_.visible=!1;this.overlayEl_=void 0},onLoad_:function(){this.overlayEl_=new tracing.Overlay;
this.overlayEl_.className="profiling-overlay";var c=document.createElement("div");c.className="label";c.textContent="Loading...";this.overlayEl_.appendChild(c);this.overlayEl_.visible=!0;this.tracingController_.beginLoadTraceFile()},onLoadTraceFileComplete_:function(){this.overlayEl_.visible=!1;this.overlayEl_=void 0;this.refresh_()},onLoadTraceFileCanceled_:function(){this.overlayEl_.visible=!1;this.overlayEl_=void 0}};cr.defineProperty(f,"tracingController",cr.PropertyKind.JS,f.prototype.didSetTracingController_);
return{ProfilingView:f}});cr.define("tracing",function(){function f(){this.model_=this.timeline_=void 0;this.filterText_="";this.filterHits_=new tracing.TimelineSelection;this.filterHitsDirty_=!0;this.currentHitIndex_=0}var c=cr.ui.define("div");c.prototype={__proto__:tracing.Overlay.prototype,decorate:function(){tracing.Overlay.prototype.decorate.call(this);this.className="timeline-find-control";this.hitCountEl_=document.createElement("div");this.hitCountEl_.className="hit-count-label";this.hitCountEl_.textContent="1 of 7";
var a=document.createElement("div");a.className="timeline-button find-previous";a.textContent="\u2190";a.addEventListener("click",function(){this.controller.findPrevious();this.updateHitCountEl_()}.bind(this));var c=document.createElement("div");c.className="timeline-button find-next";c.textContent="\u2192";c.addEventListener("click",function(){this.controller.findNext();this.updateHitCountEl_()}.bind(this));this.filterEl_=document.createElement("input");this.filterEl_.type="input";this.filterEl_.addEventListener("input",
function(){this.controller.filterText=this.filterEl_.value;this.updateHitCountEl_()}.bind(this));this.filterEl_.addEventListener("keydown",function(a){13==a.keyCode?c.click():27==a.keyCode&&(this.filterEl_.blur(),this.updateHitCountEl_())}.bind(this));this.filterEl_.addEventListener("blur",function(){this.updateHitCountEl_()}.bind(this));this.filterEl_.addEventListener("focus",function(){this.updateHitCountEl_()}.bind(this));this.appendChild(this.filterEl_);this.appendChild(a);this.appendChild(c);
this.appendChild(this.hitCountEl_);this.updateHitCountEl_()},get controller(){return this.controller_},set controller(a){this.controller_=a;this.updateHitCountEl_()},focus:function(){this.filterEl_.selectionStart=0;this.filterEl_.selectionEnd=this.filterEl_.value.length;this.filterEl_.focus()},updateHitCountEl_:function(){if(!this.controller||document.activeElement!=this.filterEl_)this.hitCountEl_.textContent="";else{var a=this.controller.currentHitIndex,c=this.controller.filterHits.length;this.hitCountEl_.textContent=
0==c?"0 of 0":a+1+" of "+c}}};f.prototype={__proto__:Object.prototype,get timeline(){return this.timeline_},set timeline(a){this.timeline_=a;this.filterHitsDirty_=!0},get filterText(){return this.filterText_},set filterText(a){a!=this.filterText_&&(this.filterText_=a,this.filterHitsDirty_=!0,this.findNext())},get filterHits(){if(this.filterHitsDirty_)if(this.filterHitsDirty_=!1,this.timeline_){var a=new tracing.TimelineFilter(this.filterText);this.filterHits_.clear();this.timeline.addAllObjectsMatchingFilterToSelection(a,
this.filterHits_);this.currentHitIndex_=this.filterHits_.length-1}else this.filterHits_.clear(),this.currentHitIndex_=0;return this.filterHits_},get currentHitIndex(){return this.currentHitIndex_},find_:function(a){if(this.timeline){var c=this.filterHits.length;this.currentHitIndex_+=a;0>this.currentHitIndex_&&(this.currentHitIndex_=c-1);this.currentHitIndex_>=c&&(this.currentHitIndex_=0);0>this.currentHitIndex_||this.currentHitIndex_>=c?this.timeline.selection=new tracing.TimelineSelection:(a=0==
this.currentHitIndex_,this.timeline.setSelectionAndMakeVisible(this.filterHits.subSelection(this.currentHitIndex_),a))}},findNext:function(){this.find_(1)},findPrevious:function(){this.find_(-1)}};var a=cr.ui.define("div");a.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.classList.add("timeline-view");this.titleEl_=document.createElement("div");this.titleEl_.textContent="Tracing: ";this.controlDiv_=document.createElement("div");this.controlDiv_.className="control";this.leftControlsEl_=
document.createElement("div");this.leftControlsEl_.className="controls";this.rightControlsEl_=document.createElement("div");this.rightControlsEl_.className="controls";var a=document.createElement("div");a.className="spacer";this.timelineContainer_=document.createElement("div");this.timelineContainer_.className="timeline-container";var i=document.createElement("div");i.className="analysis-container";this.analysisEl_=new tracing.TimelineAnalysisView;this.findCtl_=new c;this.findCtl_.controller=new f;
this.rightControls.appendChild(this.findCtl_);this.controlDiv_.appendChild(this.titleEl_);this.controlDiv_.appendChild(this.leftControlsEl_);this.controlDiv_.appendChild(a);this.controlDiv_.appendChild(this.rightControlsEl_);this.appendChild(this.controlDiv_);this.appendChild(this.timelineContainer_);i.appendChild(this.analysisEl_);this.appendChild(i);this.rightControls.appendChild(this.createHelpButton_());this.onSelectionChangedBoundToThis_=this.onSelectionChanged_.bind(this);document.addEventListener("keypress",
this.onKeypress_.bind(this),!0)},createHelpButton_:function(){function a(b){if(c.visible&&(27==b.keyCode||63==b.keyCode))b.preventDefault(),document.removeEventListener("keydown",a),c.visible=!1}var c=new tracing.Overlay;c.classList.add("timeline-view-help-overlay");var b=document.createElement("div");b.className="timeline-button timeline-view-help-button";b.textContent="?";var d=document.createElement("div");d.style.whiteSpace="pre";d.style.fontFamily="monospace";b.addEventListener("click",function(){c.visible=
!0;d.textContent=this.timeline_.keyHelp;document.addEventListener("keydown",a,!0)}.bind(this));c.appendChild(d);return b},get leftControls(){return this.leftControlsEl_},get rightControls(){return this.rightControlsEl_},get title(){return this.titleEl_.textContent.substring(this.titleEl_.textContent.length-2)},set title(a){this.titleEl_.textContent=a+":"},set traceData(a){this.model=new tracing.TimelineModel(a)},get model(){return this.timelineModel_},set model(a){this.timelineModel_=a;this.timelineContainer_.textContent=
"";void 0!==this.timelineModel_.minTimestamp?(this.timeline_&&(this.timeline_.viewportTrack.detach(),this.timeline_.detach()),this.timeline_=new tracing.Timeline,this.timeline_.model=this.timelineModel_,this.timeline_.focusElement=this.focusElement_?this.focusElement_:this.parentElement,this.insertBefore(this.timeline_.viewportTrack,this.timelineContainer_),this.timelineContainer_.appendChild(this.timeline_),this.timeline_.addEventListener("selectionChange",this.onSelectionChangedBoundToThis_),this.findCtl_.controller.timeline=
this.timeline_,this.onSelectionChanged_()):(this.timeline_=void 0,this.findCtl_.controller.timeline=void 0)},get timeline(){return this.timeline_},set focusElement(a){this.focusElement_=a;this.timeline_&&(this.timeline_.focusElement=a)},get focusElement(){return this.focusElement_?this.focusElement_:this.parentElement},get isAttachedToDocument_(){for(var a=this;a.parentNode;)a=a.parentNode;return a==this.ownerDocument},get listenToKeys_(){if(this.isAttachedToDocument_)return!this.focusElement_?!0:
0<=this.focusElement.tabIndex?document.activeElement==this.focusElement:!0},onKeypress_:function(a){this.listenToKeys_&&(47==event.keyCode?(this.findCtl_.focus(),event.preventDefault()):63==a.keyCode&&(this.querySelector(".timeline-view-help-button").click(),a.preventDefault()))},beginFind:function(){if(!this.findInProgress_){this.findInProgress_=!0;var a=c();a.controller=new f;a.controller.timeline=this.timeline;a.visible=!0;a.addEventListener("close",function(){this.findInProgress_=!1}.bind(this));
a.addEventListener("findNext",function(){});a.addEventListener("findPrevious",function(){})}},onSelectionChanged_:function(){var a=this.timelineContainer_.scrollTop;this.analysisEl_.selection=this.timeline_.selection;this.timelineContainer_.scrollTop=a}};return{TimelineFindControl:c,TimelineFindController:f,TimelineView:a}});
