systrace: update to trace-viewer rev 775
Change-Id: I6e2a15a66f24dd5603a943ad8b177a97dfefd2a7
diff --git a/UPSTREAM_REVISION b/UPSTREAM_REVISION
index 278c952..1e25699 100644
--- a/UPSTREAM_REVISION
+++ b/UPSTREAM_REVISION
@@ -1 +1 @@
-740
+775
diff --git a/script.js b/script.js
index e44fb67..85fd0cc 100644
--- a/script.js
+++ b/script.js
@@ -1,75 +1,80 @@
-window.FLATTENED={};window.FLATTENED_RAW_SCRIPTS={};window.FLATTENED.base=!0;window.FLATTENED["tracing.color_scheme"]=!0;window.FLATTENED["tracing.importer.linux_perf.parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.android_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.bus_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.clock_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.cpufreq_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.disk_parser"]=!0;
-window.FLATTENED["tracing.importer.linux_perf.drm_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.exynos_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.gesture_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.i915_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.kfunc_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.mali_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.power_parser"]=!0;
-window.FLATTENED["tracing.importer.linux_perf.sched_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.sync_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.workqueue_parser"]=!0;window.FLATTENED["base.event_target"]=!0;window.FLATTENED["base.events"]=!0;window.FLATTENED["base.range"]=!0;window.FLATTENED["tracing.filter"]=!0;window.FLATTENED["base.guid"]=!0;window.FLATTENED["tracing.trace_model.counter"]=!0;window.FLATTENED["tracing.trace_model.slice"]=!0;
-window.FLATTENED["tracing.trace_model.cpu"]=!0;window.FLATTENED["base.sorted_array_utils"]=!0;window.FLATTENED["base.iteration_helpers"]=!0;window.FLATTENED["base.utils"]=!0;window.FLATTENED["tracing.trace_model.object_snapshot"]=!0;window.FLATTENED["tracing.trace_model.object_instance"]=!0;window.FLATTENED["tracing.trace_model.time_to_object_instance_map"]=!0;window.FLATTENED["tracing.trace_model.object_collection"]=!0;window.FLATTENED["tracing.trace_model.async_slice_group"]=!0;
-window.FLATTENED["tracing.trace_model.sample"]=!0;window.FLATTENED["tracing.trace_model.slice_group"]=!0;window.FLATTENED["tracing.trace_model.thread"]=!0;window.FLATTENED["base.settings"]=!0;window.FLATTENED["tracing.trace_model_settings"]=!0;window.FLATTENED["tracing.trace_model.process_base"]=!0;window.FLATTENED["tracing.trace_model.kernel"]=!0;window.FLATTENED["tracing.trace_model.process"]=!0;window.FLATTENED["tracing.trace_model"]=!0;
-window.FLATTENED["tracing.importer.linux_perf_importer"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/common.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/mat2d.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/mat4.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/vec2.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/vec3.js"]=!0;
-window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/vec4.js"]=!0;window.FLATTENED["base.gl_matrix"]=!0;window.FLATTENED["base.quad"]=!0;window.FLATTENED["tracing.importer.trace_event_importer"]=!0;window.FLATTENED["tracing.importer.v8.splaytree"]=!0;window.FLATTENED["tracing.importer.v8.codemap"]=!0;window.FLATTENED["tracing.importer.v8.log_reader"]=!0;window.FLATTENED["tracing.importer.v8_log_importer"]=!0;window.FLATTENED["tracing.importer"]=!0;
-window.FLATTENED["tracing.analysis.util"]=!0;window.FLATTENED["tracing.selection"]=!0;window.FLATTENED.ui=!0;window.FLATTENED["tracing.analysis.analysis_link"]=!0;window.FLATTENED["tracing.analysis.generic_object_view"]=!0;window.FLATTENED["tracing.analysis.analysis_results"]=!0;window.FLATTENED["tracing.analysis.analyze_counters"]=!0;window.FLATTENED["tracing.analysis.analyze_slices"]=!0;window.FLATTENED["tracing.analysis.analyze_selection"]=!0;
-window.FLATTENED["tracing.analysis.object_instance_view"]=!0;window.FLATTENED["tracing.analysis.object_snapshot_view"]=!0;window.FLATTENED["tracing.analysis.default_object_view"]=!0;window.FLATTENED["tracing.analysis.slice_view"]=!0;window.FLATTENED["tracing.analysis.analysis_view"]=!0;window.FLATTENED["base.properties"]=!0;window.FLATTENED["ui.overlay"]=!0;window.FLATTENED["tracing.category_filter_dialog"]=!0;window.FLATTENED["tracing.timeline_viewport"]=!0;
-window.FLATTENED["ui.container_that_decorates_its_children"]=!0;window.FLATTENED["tracing.tracks.track"]=!0;window.FLATTENED["tracing.tracks.drawing_container"]=!0;window.FLATTENED["base.raf"]=!0;window.FLATTENED["tracing.fast_rect_renderer"]=!0;window.FLATTENED["tracing.tracks.drawable_track"]=!0;window.FLATTENED["tracing.tracks.ruler_track"]=!0;window.FLATTENED["base.measuring_stick"]=!0;window.FLATTENED["tracing.tracks.container_track"]=!0;window.FLATTENED["tracing.tracks.slice_track"]=!0;
-window.FLATTENED["tracing.tracks.cpu_track"]=!0;window.FLATTENED["tracing.tracks.object_instance_track"]=!0;window.FLATTENED["tcmalloc.heap_instance_track"]=!0;window.FLATTENED["tracing.tracks.counter_track"]=!0;window.FLATTENED["tracing.tracks.spacing_track"]=!0;window.FLATTENED["tracing.tracks.slice_group_track"]=!0;window.FLATTENED["tracing.tracks.async_slice_group_track"]=!0;window.FLATTENED["tracing.tracks.thread_track"]=!0;window.FLATTENED["ui.dom_helpers"]=!0;
-window.FLATTENED["tracing.tracks.process_track_base"]=!0;window.FLATTENED["tracing.tracks.kernel_track"]=!0;window.FLATTENED["tracing.tracks.process_track"]=!0;window.FLATTENED["tracing.tracks.trace_model_track"]=!0;window.FLATTENED["tracing.timeline_track_view"]=!0;window.FLATTENED["tracing.find_control"]=!0;window.FLATTENED["ui.drag_handle"]=!0;window.FLATTENED["tracing.timeline_view"]=!0;window.FLATTENED["tracing.standalone_timeline_view"]=!0;
-var templateData_=window.atob("PCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9InJlY29yZC1zZWxlY3Rpb24tZGlhbG9nLXRlbXBsYXRlIj4KICA8ZGl2IGNsYXNzPSJyZWNvcmQtc2VsZWN0aW9uLWRpYWxvZyI+CiAgICA8Zm9ybT4KICAgICAgPHRhYmxlPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iZGVmYXVsdC1lbmFibGVkLWNhdGVnb3JpZXMiPgogICAgICAgICAgICA8ZGl2PlJlY29yZCZuYnNwO0NhdGVnb3JpZXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAtc2VsZWN0b3JzIj4KICAgICAgICAgICAgICBTZWxlY3QKICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhbGwtYnRuIj5BbGw8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJub25lLWJ0biI+Tm9uZTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcmllcyI+PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJkZWZhdWx0LWRpc2FibGVkLWNhdGVnb3JpZXMiPgogICAgICAgICAgICA8ZGl2PkRpc2FibGVkJm5ic3A7YnkmbmJzcDtEZWZhdWx0Jm5ic3A7Q2F0ZWdvcmllczwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncm91cC1zZWxlY3RvcnMiPgogICAgICAgICAgICAgIFNlbGVjdAogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFsbC1idG4iPkFsbDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im5vbmUtYnRuIj5Ob25lPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXRlZ29yaWVzIj48L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvZm9ybT4KCiAgICA8ZGl2IGNsYXNzPSJvcHRpb25zIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0icmVjb3JkLWNhdGVnb3JpZXMiPlJlY29yZDwvYnV0dG9uPgogICAgICA8bGFiZWwgY2xhc3M9ImNvbnRpbnVvdXMtdHJhY2luZy1sYWJlbCI+CiAgICAgICAgQ29udGludW91cyB0cmFjaW5nCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iY29udGludW91c1RyYWNpbmciIGNoZWNrZWQ9ImNoZWNrZWQiCiAgICAgICAgICAgICAgIGNsYXNzPSJjb250aW51b3VzLXRyYWNpbmctYnV0dG9uIiAvPgogICAgICA8L2xhYmVsPgogICAgICA8bGFiZWwgY2xhc3M9InN5c3RlbS10cmFjaW5nLWxhYmVsIj4KICAgICAgICBTeXN0ZW0gZXZlbnRzCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0ic3lzdGVtVHJhY2luZyIKICAgICAgICAgICAgICAgY2xhc3M9InN5c3RlbS10cmFjaW5nLWJ1dHRvbiIgLz4KICAgICAgPC9sYWJlbD4KICAgICAgPGxhYmVsIGNsYXNzPSJzYW1wbGluZy1sYWJlbCI+CiAgICAgICAgRW5hYmxlIHNhbXBsaW5nCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iZW5hYmxlU2FtcGxpbmciIGNsYXNzPSJzYW1wbGluZy1idXR0b24iIC8+CiAgICAgIDwvbGFiZWw+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KPCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9InRpbWVsaW5lLXZpZXctdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImNvbnRyb2wiPgogICAgPGRpdiBpZD0ibGVmdC1jb250cm9scyIgY2xhc3M9ImNvbnRyb2xzIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InRpdGxlIj5eX148L2Rpdj4KICAgIDxkaXYgaWQ9InJpZ2h0LWNvbnRyb2xzIiBjbGFzcz0iY29udHJvbHMgY2F0ZWdvcnktZmlsdGVyIj48L2Rpdj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPjwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJ0cmFjay1zZWxlY3Rvci1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9InRyYWNrLXNlbGVjdG9yLWFuY2hvciI+CiAgICA8YnV0dG9uIGNsYXNzPSJidXR0b24gdHJhY2stc2VsZWN0b3ItYnV0dG9uIHRyYWNrLXNlbGVjdG9yLWNsb3NlZCI+CiAgICAgIFRyYWNrIFNlbGVjdG9yCiAgICA8L2J1dHRvbj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KCjx0ZW1wbGF0ZSBpZD0iaW1wb3J0LWVycm9ycy1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImJ1dHRvbiB2aWV3LWltcG9ydC1lcnJvcnMtYnV0dG9uIHZpZXctaW5mby1idXR0b24iPgogICAgSW1wb3J0IGVycm9ycyEKICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi1jb250YWluZXIgaW1wb3J0LWVycm9ycy1kaWFsb2ciPgogICAgRXJyb3JzIG9jY3VycmVkIGR1cmluZyBpbXBvcnQ6CiAgICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi10ZXh0IGltcG9ydC1lcnJvcnMtZGlhbG9nLXRleHQiPjwvZGl2PgogIDwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJjYXRlZ29yeS1maWx0ZXItYnRuLXRlbXBsYXRlIj4KICA8ZGl2IGNsYXNzPSJidXR0b24gdmlldy1pbmZvLWJ1dHRvbiI+Q2F0ZWdvcmllczwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJoZWxwLWJ0bi10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iYnV0dG9uIHZpZXctaGVscC1idXR0b24iPj88L2Rpdj4KICA8ZGl2IGNsYXNzPSJ2aWV3LWhlbHAtdGV4dCIKICAgICAgc3R5bGU9IndoaXRlLXNwYWNlOiBwcmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2UiPjwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJtZXRhZGF0YS1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImJ1dHRvbiB2aWV3LW1ldGFkYXRhLWJ1dHRvbiB2aWV3LWluZm8tYnV0dG9uIj4KICAgIE1ldGFkYXRhCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iaW5mby1idXR0b24tY29udGFpbmVyIG1ldGFkYXRhLWRpYWxvZyI+CiAgICBNZXRhZGF0YSBJbmZvOgogICAgPGRpdiBjbGFzcz0iaW5mby1idXR0b24tdGV4dCBtZXRhZGF0YS1kaWFsb2ctdGV4dCI+PC9kaXY+CiAgPC9kaXY+CjwvdGVtcGxhdGU+CjwhLS0KQ29weXJpZ2h0IChjKSAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCmZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0tPgoKPHRlbXBsYXRlIGlkPSJ2aWV3LWNhdGVnb3J5LWZpbHRlci1kaWFsb2ctdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImNhdGVnb3J5LWZpbHRlci1kaWFsb2ciPgogICAgU2VsZWN0IGFjdGl2ZSBjYXRlZ29yaWVzOgogICAgPGZvcm0gY2xhc3M9ImNhdGVnb3J5LWZpbHRlci1kaWFsb2ctZm9ybSI+CiAgICAgIDxkaXYgY2xhc3M9ImNhdGVnb3JpZXMiPgogICAgICA8L2Rpdj4KICAgIDwvZm9ybT4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4K"),templateElem_=
+window.FLATTENED={};window.FLATTENED_RAW_SCRIPTS={};window.FLATTENED.base=!0;window.FLATTENED["tracing.color_scheme"]=!0;window.FLATTENED["tracing.importer.linux_perf.parser"]=!0;window.FLATTENED["base.guid"]=!0;window.FLATTENED["tracing.trace_model.counter_series"]=!0;window.FLATTENED["tracing.importer.linux_perf.android_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.bus_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.clock_parser"]=!0;
+window.FLATTENED["tracing.importer.linux_perf.cpufreq_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.disk_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.drm_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.exynos_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.gesture_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.i915_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.kfunc_parser"]=!0;
+window.FLATTENED["tracing.importer.linux_perf.mali_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.power_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.sched_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.sync_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.workqueue_parser"]=!0;window.FLATTENED["base.event_target"]=!0;window.FLATTENED["base.events"]=!0;window.FLATTENED["base.range"]=!0;window.FLATTENED["tracing.filter"]=!0;
+window.FLATTENED["tracing.trace_model.counter"]=!0;window.FLATTENED["tracing.trace_model.trace_model_event"]=!0;window.FLATTENED["tracing.trace_model.slice"]=!0;window.FLATTENED["tracing.trace_model.cpu"]=!0;window.FLATTENED["base.sorted_array_utils"]=!0;window.FLATTENED["base.iteration_helpers"]=!0;window.FLATTENED["base.utils"]=!0;window.FLATTENED["tracing.trace_model.object_snapshot"]=!0;window.FLATTENED["tracing.trace_model.object_instance"]=!0;
+window.FLATTENED["tracing.trace_model.time_to_object_instance_map"]=!0;window.FLATTENED["tracing.trace_model.object_collection"]=!0;window.FLATTENED["tracing.trace_model.async_slice"]=!0;window.FLATTENED["tracing.trace_model.async_slice_group"]=!0;window.FLATTENED["tracing.trace_model.sample"]=!0;window.FLATTENED["tracing.trace_model.slice_group"]=!0;window.FLATTENED["tracing.trace_model.thread"]=!0;window.FLATTENED["base.settings"]=!0;window.FLATTENED["tracing.trace_model_settings"]=!0;
+window.FLATTENED["tracing.trace_model.process_base"]=!0;window.FLATTENED["tracing.trace_model.kernel"]=!0;window.FLATTENED["tracing.trace_model.process"]=!0;window.FLATTENED["tracing.trace_model"]=!0;window.FLATTENED["tracing.importer.linux_perf_importer"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/common.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/mat2d.js"]=!0;
+window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/mat4.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/vec2.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/vec3.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/vec4.js"]=!0;window.FLATTENED["base.gl_matrix"]=!0;window.FLATTENED["base.quad"]=!0;window.FLATTENED["tracing.trace_model.instant_event"]=!0;
+window.FLATTENED["tracing.importer.trace_event_importer"]=!0;window.FLATTENED["tracing.importer.v8.splaytree"]=!0;window.FLATTENED["tracing.importer.v8.codemap"]=!0;window.FLATTENED["tracing.importer.v8.log_reader"]=!0;window.FLATTENED["tracing.importer.v8_log_importer"]=!0;window.FLATTENED["tracing.importer"]=!0;window.FLATTENED["tracing.analysis.util"]=!0;window.FLATTENED["tracing.selection"]=!0;window.FLATTENED.ui=!0;window.FLATTENED["tracing.analysis.analysis_link"]=!0;
+window.FLATTENED["tracing.analysis.generic_object_view"]=!0;window.FLATTENED["tracing.analysis.analysis_results"]=!0;window.FLATTENED["tracing.analysis.analyze_counters"]=!0;window.FLATTENED["tracing.analysis.analyze_slices"]=!0;window.FLATTENED["tracing.analysis.analyze_selection"]=!0;window.FLATTENED["tracing.analysis.object_instance_view"]=!0;window.FLATTENED["tracing.analysis.object_snapshot_view"]=!0;window.FLATTENED["tracing.analysis.default_object_view"]=!0;
+window.FLATTENED["tracing.analysis.slice_view"]=!0;window.FLATTENED["tracing.analysis.analysis_view"]=!0;window.FLATTENED["base.properties"]=!0;window.FLATTENED["ui.overlay"]=!0;window.FLATTENED["tracing.category_filter_dialog"]=!0;window.FLATTENED["tracing.mouse_mode_constants"]=!0;window.FLATTENED["tracing.timeline_viewport"]=!0;window.FLATTENED["base.raf"]=!0;window.FLATTENED["ui.container_that_decorates_its_children"]=!0;window.FLATTENED["tracing.tracks.track"]=!0;
+window.FLATTENED["tracing.tracks.drawing_container"]=!0;window.FLATTENED["tracing.constants"]=!0;window.FLATTENED["tracing.tracks.heading_track"]=!0;window.FLATTENED["tracing.tracks.ruler_track"]=!0;window.FLATTENED["base.measuring_stick"]=!0;window.FLATTENED["tracing.tracks.container_track"]=!0;window.FLATTENED["tracing.fast_rect_renderer"]=!0;window.FLATTENED["tracing.tracks.slice_track"]=!0;window.FLATTENED["tracing.tracks.cpu_track"]=!0;
+window.FLATTENED["tracing.tracks.object_instance_track"]=!0;window.FLATTENED["tcmalloc.heap_instance_track"]=!0;window.FLATTENED["tracing.tracks.counter_track"]=!0;window.FLATTENED["tracing.tracks.spacing_track"]=!0;window.FLATTENED["tracing.tracks.slice_group_track"]=!0;window.FLATTENED["tracing.tracks.async_slice_group_track"]=!0;window.FLATTENED["tracing.tracks.thread_track"]=!0;window.FLATTENED["ui.dom_helpers"]=!0;window.FLATTENED["tracing.tracks.process_track_base"]=!0;
+window.FLATTENED["tracing.tracks.kernel_track"]=!0;window.FLATTENED["tracing.tracks.process_track"]=!0;window.FLATTENED["tracing.tracks.trace_model_track"]=!0;window.FLATTENED["ui.mouse_mode_selector"]=!0;window.FLATTENED["tracing.timeline_track_view"]=!0;window.FLATTENED["tracing.find_control"]=!0;window.FLATTENED["ui.drag_handle"]=!0;window.FLATTENED["tracing.timeline_view"]=!0;window.FLATTENED["tracing.standalone_timeline_view"]=!0;
+var templateData_=window.atob("PCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9Im1vdXNlLW1vZGUtc2VsZWN0b3ItdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImRyYWctaGFuZGxlIj48L2Rpdj4KICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgIDxkaXYgY2xhc3M9InBhbi1zY2FuLW1vZGUtYnV0dG9uIHRvb2wtYnV0dG9uIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InNlbGVjdGlvbi1tb2RlLWJ1dHRvbiB0b29sLWJ1dHRvbiI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ6b29tLW1vZGUtYnV0dG9uIHRvb2wtYnV0dG9uIj48L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KPCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9InJlY29yZC1zZWxlY3Rpb24tZGlhbG9nLXRlbXBsYXRlIj4KICA8ZGl2IGNsYXNzPSJyZWNvcmQtc2VsZWN0aW9uLWRpYWxvZyI+CiAgICA8Zm9ybT4KICAgICAgPHRhYmxlPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iZGVmYXVsdC1lbmFibGVkLWNhdGVnb3JpZXMiPgogICAgICAgICAgICA8ZGl2PlJlY29yZCZuYnNwO0NhdGVnb3JpZXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAtc2VsZWN0b3JzIj4KICAgICAgICAgICAgICBTZWxlY3QKICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhbGwtYnRuIj5BbGw8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJub25lLWJ0biI+Tm9uZTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcmllcyI+PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJkZWZhdWx0LWRpc2FibGVkLWNhdGVnb3JpZXMiPgogICAgICAgICAgICA8ZGl2PkRpc2FibGVkJm5ic3A7YnkmbmJzcDtEZWZhdWx0Jm5ic3A7Q2F0ZWdvcmllczwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncm91cC1zZWxlY3RvcnMiPgogICAgICAgICAgICAgIFNlbGVjdAogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFsbC1idG4iPkFsbDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im5vbmUtYnRuIj5Ob25lPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXRlZ29yaWVzIj48L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvZm9ybT4KCiAgICA8ZGl2IGNsYXNzPSJvcHRpb25zIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0icmVjb3JkLWNhdGVnb3JpZXMiPlJlY29yZDwvYnV0dG9uPgogICAgICA8bGFiZWwgY2xhc3M9ImNvbnRpbnVvdXMtdHJhY2luZy1sYWJlbCI+CiAgICAgICAgQ29udGludW91cyB0cmFjaW5nCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iY29udGludW91c1RyYWNpbmciIGNoZWNrZWQ9ImNoZWNrZWQiCiAgICAgICAgICAgICAgIGNsYXNzPSJjb250aW51b3VzLXRyYWNpbmctYnV0dG9uIiAvPgogICAgICA8L2xhYmVsPgogICAgICA8bGFiZWwgY2xhc3M9InN5c3RlbS10cmFjaW5nLWxhYmVsIj4KICAgICAgICBTeXN0ZW0gZXZlbnRzCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0ic3lzdGVtVHJhY2luZyIKICAgICAgICAgICAgICAgY2xhc3M9InN5c3RlbS10cmFjaW5nLWJ1dHRvbiIgLz4KICAgICAgPC9sYWJlbD4KICAgICAgPGxhYmVsIGNsYXNzPSJzYW1wbGluZy1sYWJlbCI+CiAgICAgICAgRW5hYmxlIHNhbXBsaW5nCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iZW5hYmxlU2FtcGxpbmciIGNsYXNzPSJzYW1wbGluZy1idXR0b24iIC8+CiAgICAgIDwvbGFiZWw+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KPCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9InRpbWVsaW5lLXZpZXctdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImNvbnRyb2wiPgogICAgPGRpdiBpZD0ibGVmdC1jb250cm9scyIgY2xhc3M9ImNvbnRyb2xzIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InRpdGxlIj5eX148L2Rpdj4KICAgIDxkaXYgaWQ9InJpZ2h0LWNvbnRyb2xzIiBjbGFzcz0iY29udHJvbHMgY2F0ZWdvcnktZmlsdGVyIj48L2Rpdj4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPjwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJ0cmFjay1zZWxlY3Rvci1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9InRyYWNrLXNlbGVjdG9yLWFuY2hvciI+CiAgICA8YnV0dG9uIGNsYXNzPSJidXR0b24gdHJhY2stc2VsZWN0b3ItYnV0dG9uIHRyYWNrLXNlbGVjdG9yLWNsb3NlZCI+CiAgICAgIFRyYWNrIFNlbGVjdG9yCiAgICA8L2J1dHRvbj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KCjx0ZW1wbGF0ZSBpZD0iaW1wb3J0LWVycm9ycy1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImJ1dHRvbiB2aWV3LWltcG9ydC1lcnJvcnMtYnV0dG9uIHZpZXctaW5mby1idXR0b24iPgogICAgSW1wb3J0IGVycm9ycyEKICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi1jb250YWluZXIgaW1wb3J0LWVycm9ycy1kaWFsb2ciPgogICAgRXJyb3JzIG9jY3VycmVkIGR1cmluZyBpbXBvcnQ6CiAgICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi10ZXh0IGltcG9ydC1lcnJvcnMtZGlhbG9nLXRleHQiPjwvZGl2PgogIDwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJjYXRlZ29yeS1maWx0ZXItYnRuLXRlbXBsYXRlIj4KICA8ZGl2IGNsYXNzPSJidXR0b24gdmlldy1pbmZvLWJ1dHRvbiI+Q2F0ZWdvcmllczwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJoZWxwLWJ0bi10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iYnV0dG9uIHZpZXctaGVscC1idXR0b24iPj88L2Rpdj4KICA8ZGl2IGNsYXNzPSJ2aWV3LWhlbHAtdGV4dCIKICAgICAgc3R5bGU9IndoaXRlLXNwYWNlOiBwcmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2UiPjwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJtZXRhZGF0YS1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImJ1dHRvbiB2aWV3LW1ldGFkYXRhLWJ1dHRvbiB2aWV3LWluZm8tYnV0dG9uIj4KICAgIE1ldGFkYXRhCiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0iaW5mby1idXR0b24tY29udGFpbmVyIG1ldGFkYXRhLWRpYWxvZyI+CiAgICBNZXRhZGF0YSBJbmZvOgogICAgPGRpdiBjbGFzcz0iaW5mby1idXR0b24tdGV4dCBtZXRhZGF0YS1kaWFsb2ctdGV4dCI+PC9kaXY+CiAgPC9kaXY+CjwvdGVtcGxhdGU+CjwhLS0KQ29weXJpZ2h0IChjKSAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCmZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0tPgoKPHRlbXBsYXRlIGlkPSJ2aWV3LWNhdGVnb3J5LWZpbHRlci1kaWFsb2ctdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImNhdGVnb3J5LWZpbHRlci1kaWFsb2ciPgogICAgU2VsZWN0IGFjdGl2ZSBjYXRlZ29yaWVzOgogICAgPGZvcm0gY2xhc3M9ImNhdGVnb3J5LWZpbHRlci1kaWFsb2ctZm9ybSI+CiAgICAgIDxkaXYgY2xhc3M9ImNhdGVnb3JpZXMiPgogICAgICA8L2Rpdj4KICAgIDwvZm9ybT4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4K"),templateElem_=
document.createElement("div");for(templateElem_.innerHTML=templateData_;templateElem_.hasChildNodes();)document.head.appendChild(templateElem_.removeChild(templateElem_.firstChild));"use strict";var global=this;
-this.base=function(){function d(a){"/"==a[a.length-1]&&(a=a.substring(0,a.length-1));l=a}function b(a,c){n[a]||(n[a]=[]);for(var e=n[a],b=!1,g=0;g<e.length;g++)e[g]==c&&(b=!0);b||e.push(c)}function a(a,c){q[a]||(q[a]=[]);for(var e=q[a],b=!1,g=0;g<q.length;g++)e[g]==c&&(b=!0);b||e.push(c)}function c(a,c){p[a]||(p[a]=[]);for(var e=p[a],b=!1,g=0;g<e.length;g++)e[g]==c&&(b=!0);b||e.push(c)}function e(){if(!window.FLATTENED&&!m){m=!0;var e=new XMLHttpRequest;e.open("GET","/deps.js",!1);e.send(null);if(200!=
-e.status){var e=JSON.parse(e.responseText),g="You have a module problem: "+e.message,f=document.createElement("div");f.style.position="fixed";f.style.border="3px solid red";f.style.color="black";f.style.padding="8px";f.innerHTML='<h2>Module parsing problem</h2><div id="message"></div><pre id="details"></pre>';f.querySelector("#message").textContent=e.message;var h=f.querySelector("#details");h.textContent=e.details;h.style.maxWidth="800px";h.style.overflow="auto";document.body?document.body.appendChild(f):
-setTimeout(function(){document.body.appendChild(f)},150);throw Error(g);}base.addModuleDependency=b;base.addModuleRawScriptDependency=a;base.addModuleStylesheet=c;try{eval(e.responseText)}catch(d){throw Error("When loading deps, got "+d.stack?d.stack:d.message);}delete base.addModuleStylesheet;delete base.addModuleRawScriptDependency;delete base.addModuleDependency}}function g(){if(!s&&!window.FLATTENED){s=!0;var a=new XMLHttpRequest;a.open("GET","/templates",!1);a.send(null);var c=document.createElement("div");
-for(c.innerHTML=a.responseText;c.hasChildNodes();)document.head.appendChild(c.removeChild(c.firstChild))}}function f(a,c){var b=c||0,d=a;a instanceof Array||(d=[a]);e();g();d.forEach(function(a){if(window.FLATTENED){if(!window.FLATTENED[a])throw Error("Somehow, module "+a+" didn't get stored in the flattened js file! You may need to rerun build/generate_about_tracing_contents.py");}else if("APPENDED"!=v[a]&&"RESOLVING"!=v[a]){v[a]="RESOLVING";f(n[a]||[],b+1);for(var c=p[a]||[],e=0;e<c.length;e++)k(c[e]);
-c=q[a]||[];for(e=0;e<c.length;e++){var g=c[e];w[g]||(h(g),w[g]="APPENDED")}h(a.replace(/\./g,"/")+".js");v[name]="APPENDED"}})}function h(a){var c=document.createElement("script");c.src=l+"/"+a;c.type="text/javascript";c.defer=!0;c.async=!1;base.doc.head.appendChild(c)}function k(a){if(!window.FLATTENED&&!t[a]){t[a]=!0;a=a.replace(/\./g,"/")+".css";a=l+"/"+a;var c=document.createElement("link");c.setAttribute("rel","stylesheet");c.setAttribute("href",a);base.doc.head.appendChild(c)}}var l=".",m=!1,
-n={},p={},q={},s=!1,v={},w={},t={},r={};return{set moduleBasePath(a){d(a)},get moduleBasePath(){return l},initialize:function(){if(global.document)base.doc=document,base.isMac=/Mac/.test(navigator.platform),base.isWindows=/Win/.test(navigator.platform),base.isChromeOS=/CrOS/.test(navigator.userAgent),base.isLinux=/Linux/.test(navigator.userAgent),base.isGTK=/GTK/.test(chrome.toolkit),base.isViews=/views/.test(chrome.toolkit),d("/src");else{var a=base;Object.defineProperty(global,"base",{get:function(){Object.defineProperty(global,
-"base",{value:a});a.initialize();return a},configurable:!0})}},require:f,requireStylesheet:k,requireRawScript:function(a){if(window.FLATTENED_RAW_SCRIPTS){if(!window.FLATTENED_RAW_SCRIPTS[a])throw Error("Somehow, "+a+" didn't get stored in the flattened js file! You may need to rerun build/generate_about_tracing_contents.py");}else if(!w[a])throw Error(a+" should already have been loaded. Did you forget to run build/generate_about_tracing_contents.py?");},requireTemplate:function(a){if(!window.FLATTENED&&
-!r[a]){r[a]=!0;a=a.replace(/\./g,"/")+".html";a=l+"/"+a;var c=document.createElement("link");c.setAttribute("rel","import");c.setAttribute("href",a)}},exportTo:function(a,c){var e;e=a.split(".");for(var b=global,g;e.length&&(g=e.shift());)b=g in b?b[g]:b[g]={};e=b;try{var f=c()}catch(h){console.log("While running exports for ",a,":");console.log(h.stack||h);return}for(var d in f)(b=Object.getOwnPropertyDescriptor(f,d))&&Object.defineProperty(e,d,b)}}}();base.initialize();"use strict";
+this.base=function(){function d(a){"/"==a[a.length-1]&&(a=a.substring(0,a.length-1));l=a}function b(a,c){n[a]||(n[a]=[]);for(var e=n[a],b=!1,f=0;f<e.length;f++)e[f]==c&&(b=!0);b||e.push(c)}function a(a,c){q[a]||(q[a]=[]);for(var e=q[a],b=!1,f=0;f<q.length;f++)e[f]==c&&(b=!0);b||e.push(c)}function c(a,c){p[a]||(p[a]=[]);for(var e=p[a],b=!1,f=0;f<e.length;f++)e[f]==c&&(b=!0);b||e.push(c)}function e(){if(!window.FLATTENED&&!m){m=!0;var e=new XMLHttpRequest;e.open("GET","/deps.js",!1);e.send(null);if(200!=
+e.status){var e=JSON.parse(e.responseText),f="You have a module problem: "+e.message,g=document.createElement("div");g.style.position="fixed";g.style.border="3px solid red";g.style.color="black";g.style.padding="8px";g.innerHTML='<h2>Module parsing problem</h2><div id="message"></div><pre id="details"></pre>';g.querySelector("#message").textContent=e.message;var h=g.querySelector("#details");h.textContent=e.details;h.style.maxWidth="800px";h.style.overflow="auto";document.body?document.body.appendChild(g):
+setTimeout(function(){document.body.appendChild(g)},150);throw Error(f);}base.addModuleDependency=b;base.addModuleRawScriptDependency=a;base.addModuleStylesheet=c;try{eval(e.responseText)}catch(d){throw Error("When loading deps, got "+d.stack?d.stack:d.message);}delete base.addModuleStylesheet;delete base.addModuleRawScriptDependency;delete base.addModuleDependency}}function f(){if(!t&&!window.FLATTENED){t=!0;var a=new XMLHttpRequest;a.open("GET","/templates",!1);a.send(null);var c=document.createElement("div");
+for(c.innerHTML=a.responseText;c.hasChildNodes();)document.head.appendChild(c.removeChild(c.firstChild))}}function g(a,c){var b=c||0,d=a;a instanceof Array||(d=[a]);e();f();d.forEach(function(a){if(window.FLATTENED){if(!window.FLATTENED[a])throw Error("Somehow, module "+a+" didn't get stored in the flattened js file! You may need to rerun build/generate_about_tracing_contents.py");}else if("APPENDED"!=v[a]&&"RESOLVING"!=v[a]){v[a]="RESOLVING";g(n[a]||[],b+1);for(var c=p[a]||[],e=0;e<c.length;e++)k(c[e]);
+c=q[a]||[];for(e=0;e<c.length;e++){var f=c[e];w[f]||(h(f),w[f]="APPENDED")}h(a.replace(/\./g,"/")+".js");v[name]="APPENDED"}})}function h(a){var c=document.createElement("script");c.src=l+"/"+a;c.type="text/javascript";c.defer=!0;c.async=!1;base.doc.head.appendChild(c)}function k(a){if(!window.FLATTENED&&!s[a]){s[a]=!0;a=a.replace(/\./g,"/")+".css";a=l+"/"+a;var c=document.createElement("link");c.setAttribute("rel","stylesheet");c.setAttribute("href",a);base.doc.head.appendChild(c)}}var l=".",m=!1,
+n={},p={},q={},t=!1,v={},w={},s={},r={};return{set moduleBasePath(a){d(a)},get moduleBasePath(){return l},initialize:function(){if(global.document)base.doc=document,base.isMac=/Mac/.test(navigator.platform),base.isWindows=/Win/.test(navigator.platform),base.isChromeOS=/CrOS/.test(navigator.userAgent),base.isLinux=/Linux/.test(navigator.userAgent),base.isGTK=/GTK/.test(chrome.toolkit),base.isViews=/views/.test(chrome.toolkit),d("/src");else{var a=base;Object.defineProperty(global,"base",{get:function(){Object.defineProperty(global,
+"base",{value:a});a.initialize();return a},configurable:!0})}},require:g,requireStylesheet:k,requireRawScript:function(a){if(window.FLATTENED_RAW_SCRIPTS){if(!window.FLATTENED_RAW_SCRIPTS[a])throw Error("Somehow, "+a+" didn't get stored in the flattened js file! You may need to rerun build/generate_about_tracing_contents.py");}else if(!w[a])throw Error(a+" should already have been loaded. Did you forget to run build/generate_about_tracing_contents.py?");},requireTemplate:function(a){if(!window.FLATTENED&&
+!r[a]){r[a]=!0;a=a.replace(/\./g,"/")+".html";a=l+"/"+a;var c=document.createElement("link");c.setAttribute("rel","import");c.setAttribute("href",a)}},exportTo:function(a,c){var e;e=a.split(".");for(var b=global,f;e.length&&(f=e.shift());)b=f in b?b[f]:b[f]={};e=b;try{var g=c()}catch(h){console.log("While running exports for ",a,":");console.log(h.stack||h);return}for(var d in g)(b=Object.getOwnPropertyDescriptor(g,d))&&Object.defineProperty(e,d,b)}}}();base.initialize();"use strict";
base.exportTo("tracing",function(){function d(a){for(var c=0,e=0;e<a.length;++e)c=(c+37*c+11*a.charCodeAt(e))%4294967295;return c}var b=[{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},{r:199,g:155,b:125}],a=b.length-5,c=b.length,e=b.concat(b.map(function(a){var c;c=240<=a.r&&240<=a.g&&240<=a.b?-0.2:0.45;return{r:Math.min(255,a.r+Math.floor(a.r*c)),g:Math.min(255,a.g+Math.floor(a.g*c)),
-b:Math.min(255,a.b+Math.floor(a.b*c))}})).map(function(a){return"rgb("+a.r+","+a.g+","+a.b+")"}),g={};return{getColorPalette:function(){return e},getColorPaletteHighlightIdBoost:function(){return c},getColorIdByName:function(c){if("iowait"==c)return a;if("running"==c)return a+1;if("runnable"==c)return a+2;if("sleeping"==c)return a+3;if("UNKNOWN"==c)return a+4;throw Error("Unrecognized color ")+c;},getStringHash:d,getStringColorId:function(c){if(void 0===g[c]){var e=d(c);g[c]=e%a}return g[c]}}});"use strict";
-base.exportTo("tracing.importer.linux_perf",function(){function d(a){this.importer=a;this.model=a.model}var b=[];d.registerSubtype=function(a){b.push(a)};d.getSubtypeConstructors=function(){return b};d.prototype={__proto__:Object.prototype};return{Parser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
-base.exportTo("tracing.importer.linux_perf",function(){function d(c){a.call(this,c);c.registerEventHandler("tracing_mark_write:android",d.prototype.traceMarkWriteAndroidEvent.bind(this));c.registerEventHandler("0:android",d.prototype.traceMarkWriteAndroidEvent.bind(this));this.model_=c.model_;this.ppids_={}}function b(a){var e={};if(a){a=a.split(";");for(var b=0;b<a.length;++b){var f=a[b].split("=");f[0]&&(e[f.shift()]=f.join("="))}}return e}var a=tracing.importer.linux_perf.Parser;d.prototype={__proto__:a.prototype,
-openAsyncSlice:function(a,e,b,f,h){e=new tracing.trace_model.AsyncSlice(e,b,tracing.getStringColorId(b),h);e.id=f;e.startThread=a;this.openAsyncSlices||(this.openAsyncSlices={});this.openAsyncSlices[b+":"+f]=e},closeAsyncSlice:function(a,e,b,f){this.openAsyncSlices&&(e=e+":"+b,b=this.openAsyncSlices[e])&&(b.endThread=a,b.duration=f-b.start,b.startThread.asyncSliceGroup.push(b),b.subSlices=[new tracing.trace_model.Slice(b.category,b.title,b.colorId,b.start,b.args,b.duration)],delete this.openAsyncSlices[e])},
-traceMarkWriteAndroidEvent:function(a,e,g,f,h){a=h.details.split("|");switch(a[0]){case "B":e=parseInt(a[1]);var d=a[4],l=a[2],m=this.model_.getOrCreateProcess(e).getOrCreateThread(g);m.name=h.threadName;if(!m.sliceGroup.isTimestampValidForBeginOrEnd(f))return this.model_.importErrors.push("Timestamps are moving backward."),!1;this.ppids_[g]=e;m.sliceGroup.beginSlice(d,l,f,b(a[3]));break;case "E":e=this.ppids_[g];if(void 0===e)break;m=this.model_.getOrCreateProcess(e).getOrCreateThread(g);if(!m.sliceGroup.openSliceCount)break;
-f=m.sliceGroup.endSlice(f);g=b(a[3]);for(d in g)void 0!==f.args[d]&&this.model_.importErrors.push("Both the B and E events of "+f.title+"provided values for argument "+d+". The value of the E event will be used."),f.args[d]=g[d];break;case "C":e=parseInt(a[1]);l=a[2];g=parseInt(a[3]);d=a[4];h=this.model_.getOrCreateProcess(e).getOrCreateCounter(d,l);0==h.numSeries&&(h.seriesNames.push("value"),h.seriesColors.push(tracing.getStringColorId(h.name+".value")));h.timestamps.push(f);h.samples.push(g);break;
-case "S":e=parseInt(a[1]);l=a[2];a=parseInt(a[3]);m=this.model_.getOrCreateProcess(e).getOrCreateThread(g);m.name=h.threadName;this.ppids_[g]=e;this.openAsyncSlice(m,null,l,a,f);break;case "F":e=this.ppids_[g];if(void 0===e)break;m=this.model_.getOrCreateProcess(e).getOrCreateThread(g);l=a[2];a=parseInt(a[3]);this.closeAsyncSlice(m,l,a,f);break;default:return!1}return!0}};a.registerSubtype(d);return{AndroidParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
-base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("memory_bus_usage",d.prototype.traceMarkWriteBusEvent.bind(this));this.model_=a.model_;this.ppids_={}}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,traceMarkWriteBusEvent:function(a,c,e,b,f,h){f=/bus=(\S+) rw_bytes=(\d+) r_bytes=(\d+) w_bytes=(\d+) cycles=(\d+) ns=(\d+)/.exec(f.details);a=f[1];parseInt(f[2]);e=parseInt(f[3]);c=parseInt(f[4]);parseInt(f[5]);f=parseInt(f[6]);
-e=1E9*e/f/1048576;c=1E9*c/f/1048576;f=this.model_.getOrCreateProcess(0).getOrCreateCounter(null,"bus "+a+" read");0==f.numSeries&&(f.seriesNames.push("value"),f.seriesColors.push(tracing.getStringColorId(f.name+".value")));f.timestamps.push(b);f.samples.push(e);f=this.model_.getOrCreateProcess(0).getOrCreateCounter(null,"bus "+a+" write");0==f.numSeries&&(f.seriesNames.push("value"),f.seriesColors.push(tracing.getStringColorId(f.name+".value")));f.timestamps.push(b);f.samples.push(c);return!0}};b.registerSubtype(d);
-return{BusParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
-base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("clock_set_rate",d.prototype.traceMarkWriteClockEvent.bind(this));this.model_=a.model_;this.ppids_={}}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,traceMarkWriteClockEvent:function(a,c,e,b,f,h){c=/(\S+) state=(\d+) cpu_id=(\d+)/.exec(f.details);a=c[1];c=parseInt(c[2]);a=this.model_.getOrCreateProcess(0).getOrCreateCounter(null,a);0==a.numSeries&&(a.seriesNames.push("value"),
-a.seriesColors.push(tracing.getStringColorId(a.name+".value")));a.timestamps.push(b);a.samples.push(c);return!0}};b.registerSubtype(d);return{ClockParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+b:Math.min(255,a.b+Math.floor(a.b*c))}})).map(function(a){return"rgb("+a.r+","+a.g+","+a.b+")"}),f={};return{getColorPalette:function(){return e},getColorPaletteHighlightIdBoost:function(){return c},getColorIdByName:function(c){if("iowait"==c)return a;if("running"==c)return a+1;if("runnable"==c)return a+2;if("sleeping"==c)return a+3;if("UNKNOWN"==c)return a+4;throw Error("Unrecognized color ")+c;},getStringHash:d,getStringColorId:function(c){if(void 0===f[c]){var e=d(c);f[c]=e%a}return f[c]}}});"use strict";
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){this.importer=a;this.model=a.model}var b=[];d.registerSubtype=function(a){b.push(a)};d.getSubtypeConstructors=function(){return b};d.prototype={__proto__:Object.prototype};return{Parser:d}});"use strict";base.exportTo("base",function(){var d=1;return{GUID:{allocate:function(){return d++}}}});"use strict";base.require("base.guid");
+base.exportTo("tracing.trace_model",function(){function d(a,c){this.guid_=base.GUID.allocate();this.timestamp_=a;this.value_=c}function b(a,c){this.guid_=base.GUID.allocate();this.name_=a;this.color_=c;this.timestamps_=[];this.samples_=[]}d.prototype={__proto__:Object.prototype,get value(){return this.value_},set timestamp(a){this.timestamp_=a},toJSON:function(){for(var a={},c=Object.keys(this),e=0;e<c.length;e++){var b=c[e];"function"!=typeof this[b]&&(a[b]="parent"==b?this[b].guid:this[b])}return a}};
+b.prototype={__proto__:Object.prototype,toJSON:function(){for(var a={},c=Object.keys(this),e=0;e<c.length;e++){var b=c[e];"function"!=typeof this[b]&&(a[b]="parent"==b?this[b].guid:this[b])}return a},get length(){return this.timestamps_.length},get name(){return this.name_},get color(){return this.color_},get samples(){return this.samples_},get timestamps(){return this.timestamps_},getSample:function(a){return this.samples_[a]},getTimestamp:function(a){return this.timestamps_[a]},addSample:function(a,
+c){this.timestamps_.push(a);this.samples_.push(new d(a,c))},getStatistics:function(a){for(var c=0,e=Number.MAX_VALUE,b=-Number.MAX_VALUE,g=0;g<a.length;++g)var h=this.getSample(a[g]).value,c=c+h,e=Math.min(h,e),b=Math.max(h,b);return{min:e,max:b,avg:c/a.length,start:this.getSample(a[0]).value,end:this.getSample(a.length-1).value}},shiftTimestampsForward:function(a){for(var c=0;c<this.timestamps_.length;++c)this.timestamps_[c]+=a,this.samples_[c].timestamp=this.timestamps_[c]}};return{CounterSeries:b}});
+"use strict";base.require("tracing.importer.linux_perf.parser");base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.importer.linux_perf",function(){function d(c){a.call(this,c);c.registerEventHandler("tracing_mark_write:android",d.prototype.traceMarkWriteAndroidEvent.bind(this));c.registerEventHandler("0:android",d.prototype.traceMarkWriteAndroidEvent.bind(this));this.model_=c.model_;this.ppids_={}}function b(a){var e={};if(a){a=a.split(";");for(var b=0;b<a.length;++b){var g=a[b].split("=");g[0]&&(e[g.shift()]=g.join("="))}}return e}var a=tracing.importer.linux_perf.Parser;d.prototype={__proto__:a.prototype,
+openAsyncSlice:function(a,e,b,g,h){e=new tracing.trace_model.AsyncSlice(e,b,tracing.getStringColorId(b),h);e.id=g;e.startThread=a;this.openAsyncSlices||(this.openAsyncSlices={});this.openAsyncSlices[b+":"+g]=e},closeAsyncSlice:function(a,e,b,g){this.openAsyncSlices&&(e=e+":"+b,b=this.openAsyncSlices[e])&&(b.endThread=a,b.duration=g-b.start,b.startThread.asyncSliceGroup.push(b),b.subSlices=[new tracing.trace_model.Slice(b.category,b.title,b.colorId,b.start,b.args,b.duration)],delete this.openAsyncSlices[e])},
+traceMarkWriteAndroidEvent:function(a,e,f,g,h){a=h.details.split("|");switch(a[0]){case "B":e=parseInt(a[1]);var d=a[4],l=a[2],m=this.model_.getOrCreateProcess(e).getOrCreateThread(f);m.name=h.threadName;if(!m.sliceGroup.isTimestampValidForBeginOrEnd(g))return this.model_.importErrors.push("Timestamps are moving backward."),!1;this.ppids_[f]=e;m.sliceGroup.beginSlice(d,l,g,b(a[3]));break;case "E":e=this.ppids_[f];if(void 0===e)break;m=this.model_.getOrCreateProcess(e).getOrCreateThread(f);if(!m.sliceGroup.openSliceCount)break;
+f=m.sliceGroup.endSlice(g);h=b(a[3]);for(d in h)void 0!==f.args[d]&&this.model_.importErrors.push("Both the B and E events of "+f.title+"provided values for argument "+d+". The value of the E event will be used."),f.args[d]=h[d];break;case "C":e=parseInt(a[1]);var l=a[2],n=parseInt(a[3]),d=a[4];f=this.model_.getOrCreateProcess(e).getOrCreateCounter(d,l);0===f.numSeries&&f.addSeries(new tracing.trace_model.CounterSeries(n,tracing.getStringColorId(f.name+".value")));f.series.forEach(function(a){a.addSample(g,
+n)});break;case "S":e=parseInt(a[1]);l=a[2];a=parseInt(a[3]);m=this.model_.getOrCreateProcess(e).getOrCreateThread(f);m.name=h.threadName;this.ppids_[f]=e;this.openAsyncSlice(m,null,l,a,g);break;case "F":e=this.ppids_[f];if(void 0===e)break;m=this.model_.getOrCreateProcess(e).getOrCreateThread(f);l=a[2];a=parseInt(a[3]);this.closeAsyncSlice(m,l,a,g);break;default:return!1}return!0}};a.registerSubtype(d);return{AndroidParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("memory_bus_usage",d.prototype.traceMarkWriteBusEvent.bind(this));this.model_=a.model_;this.ppids_={}}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,traceMarkWriteBusEvent:function(a,c,e,b,g,h){e=/bus=(\S+) rw_bytes=(\d+) r_bytes=(\d+) w_bytes=(\d+) cycles=(\d+) ns=(\d+)/.exec(g.details);a=e[1];parseInt(e[2]);c=parseInt(e[3]);parseInt(e[4]);parseInt(e[5]);e=parseInt(e[6]);
+var d=1E9*c/e,d=d/1048576;c=this.model_.getOrCreateProcess(0).getOrCreateCounter(null,"bus "+a+" read");0===c.numSeries&&c.addSeries(new tracing.trace_model.CounterSeries("value",tracing.getStringColorId(c.name+".value")));c.series.forEach(function(a){a.addSample(b,d)});c=this.model_.getOrCreateProcess(0).getOrCreateCounter(null,"bus "+a+" write");0===c.numSeries&&c.addSeries(new tracing.trace_model.CounterSeries("value",tracing.getStringColorId(c.name+".value")));c.series.forEach(function(a){a.addSample(b,
+d)});return!0}};b.registerSubtype(d);return{BusParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("clock_set_rate",d.prototype.traceMarkWriteClockEvent.bind(this));this.model_=a.model_;this.ppids_={}}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,traceMarkWriteClockEvent:function(a,c,e,b,g,h){a=/(\S+) state=(\d+) cpu_id=(\d+)/.exec(g.details);c=a[1];var d=parseInt(a[2]);a=this.model_.getOrCreateProcess(0).getOrCreateCounter(null,c);0===a.numSeries&&a.addSeries(new tracing.trace_model.CounterSeries("value",
+tracing.getStringColorId(a.name+".value")));a.series.forEach(function(a){a.addSample(b,d)});return!0}};b.registerSubtype(d);return{ClockParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
base.exportTo("tracing.importer.linux_perf",function(){function d(c){a.call(this,c);c.registerEventHandler("cpufreq_interactive_up",d.prototype.cpufreqUpDownEvent.bind(this));c.registerEventHandler("cpufreq_interactive_down",d.prototype.cpufreqUpDownEvent.bind(this));c.registerEventHandler("cpufreq_interactive_already",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_notyet",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_setspeed",
-d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_target",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_boost",d.prototype.cpufreqBoostUnboostEvent.bind(this));c.registerEventHandler("cpufreq_interactive_unboost",d.prototype.cpufreqBoostUnboostEvent.bind(this))}function b(a){var e={};a=a.split(/\s+/);for(var b=a.length,f=0;f<b;f++){var h=a[f].split("=");e[h[0]]=parseInt(h[1])}return e}var a=tracing.importer.linux_perf.Parser;
-d.prototype={__proto__:a.prototype,cpufreqSlice:function(a,e,b,f){b=this.importer.getOrCreatePseudoThread("cpufreq");b.openSlice=e;a=new tracing.trace_model.Slice("",b.openSlice,tracing.getStringColorId(b.openSlice),a,f,0);b.thread.sliceGroup.pushSlice(a)},cpufreqBoostSlice:function(a,e,b){var f=this.importer.getOrCreatePseudoThread("cpufreq_boost");f.openSlice=e;a=new tracing.trace_model.Slice("",f.openSlice,tracing.getStringColorId(f.openSlice),a,b,0);f.thread.sliceGroup.pushSlice(a)},cpufreqUpDownEvent:function(a,
-e,g,f,h){e=b(h.details);this.cpufreqSlice(f,a,e.cpu,e);return!0},cpufreqTargetEvent:function(a,e,g,f,h){e=b(h.details);this.cpufreqSlice(f,a,e.cpu,e);return!0},cpufreqBoostUnboostEvent:function(a,e,b,f,h){this.cpufreqBoostSlice(f,a,{type:h.details});return!0}};a.registerSubtype(d);return{CpufreqParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_target",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_boost",d.prototype.cpufreqBoostUnboostEvent.bind(this));c.registerEventHandler("cpufreq_interactive_unboost",d.prototype.cpufreqBoostUnboostEvent.bind(this))}function b(a){var e={};a=a.split(/\s+/);for(var b=a.length,g=0;g<b;g++){var h=a[g].split("=");e[h[0]]=parseInt(h[1])}return e}var a=tracing.importer.linux_perf.Parser;
+d.prototype={__proto__:a.prototype,cpufreqSlice:function(a,e,b,g){b=this.importer.getOrCreatePseudoThread("cpufreq");b.openSlice=e;a=new tracing.trace_model.Slice("",b.openSlice,tracing.getStringColorId(b.openSlice),a,g,0);b.thread.sliceGroup.pushSlice(a)},cpufreqBoostSlice:function(a,e,b){var g=this.importer.getOrCreatePseudoThread("cpufreq_boost");g.openSlice=e;a=new tracing.trace_model.Slice("",g.openSlice,tracing.getStringColorId(g.openSlice),a,b,0);g.thread.sliceGroup.pushSlice(a)},cpufreqUpDownEvent:function(a,
+e,f,g,h){e=b(h.details);this.cpufreqSlice(g,a,e.cpu,e);return!0},cpufreqTargetEvent:function(a,e,f,g,h){e=b(h.details);this.cpufreqSlice(g,a,e.cpu,e);return!0},cpufreqBoostUnboostEvent:function(a,e,b,g,h){this.cpufreqBoostSlice(g,a,{type:h.details});return!0}};a.registerSubtype(d);return{CpufreqParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("ext4_sync_file_enter",d.prototype.ext4SyncFileEnterEvent.bind(this));a.registerEventHandler("ext4_sync_file_exit",d.prototype.ext4SyncFileExitEvent.bind(this));a.registerEventHandler("block_rq_issue",d.prototype.blockRqIssueEvent.bind(this));a.registerEventHandler("block_rq_complete",d.prototype.blockRqCompleteEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,
-openAsyncSlice:function(a,c,e,b,f,h){e=this.importer.getOrCreateKernelThread(c+":"+e,b);a=new tracing.trace_model.AsyncSlice(c,h,tracing.getStringColorId(h),a);a.startThread=e.thread;e.openAsyncSlices||(e.openAsyncSlices={});e.openAsyncSlices[f]=a},closeAsyncSlice:function(a,c,e,b,f,h){e=this.importer.getOrCreateKernelThread(c+":"+e,b);e.openAsyncSlices&&(b=e.openAsyncSlices[f])&&(b.duration=a-b.start,b.args=h,b.endThread=e.thread,b.subSlices=[new tracing.trace_model.Slice(c,b.title,b.colorId,b.start,
-b.args,b.duration)],e.thread.asyncSliceGroup.push(b),delete e.openAsyncSlices[f])},ext4SyncFileEnterEvent:function(a,c,e,b,f){a=/dev (\d+,\d+) ino (\d+) parent (\d+) datasync (\d+)/.exec(f.details);if(!a)return!1;c=a[1];e=parseInt(a[2]);this.openAsyncSlice(b,"ext4",f.threadName,f.pid,c+"-"+e,1==a[4]?"fdatasync":"fsync");return!0},ext4SyncFileExitEvent:function(a,c,e,b,f){e=/dev (\d+,\d+) ino (\d+) ret (\d+)/.exec(f.details);if(!e)return!1;a=e[1];c=parseInt(e[2]);e=parseInt(e[3]);this.closeAsyncSlice(b,
-"ext4",f.threadName,f.pid,a+"-"+c,{device:a,inode:c,error:e});return!0},blockRqIssueEvent:function(a,c,e,b,f){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \d+ \(.*\) (\d+) \+ (\d+) \[.*\]/.exec(f.details);if(!h)return!1;switch(h[3]){case "D":a="discard";break;case "W":a="write";break;case "R":a="read";break;case "N":a="none";break;default:a="unknown"}h[2]&&(a+=" flush");"F"==h[4]&&(a+=" fua");"A"==h[5]&&(a+=" ahead");"S"==h[6]&&(a+=" sync");"M"==h[7]&&(a+=" meta");c=h[1];e=parseInt(h[8]);h=parseInt(h[9]);
-this.openAsyncSlice(b,"block",f.threadName,f.pid,c+"-"+e+"-"+h,a);return!0},blockRqCompleteEvent:function(a,c,e,b,f){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \(.*\) (\d+) \+ (\d+) \[(.*)\]/.exec(f.details);if(!h)return!1;a=h[1];c=parseInt(h[8]);e=parseInt(h[9]);h=parseInt(h[10]);this.closeAsyncSlice(b,"block",f.threadName,f.pid,a+"-"+c+"-"+e,{device:a,sector:c,numSectors:e,error:h});return!0}};b.registerSubtype(d);return{DiskParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
-base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("drm_vblank_event",d.prototype.vblankEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,drmVblankSlice:function(a,c,e){var b=this.importer.getOrCreatePseudoThread("drm_vblank");b.openSlice=c;a=new tracing.trace_model.Slice("",b.openSlice,tracing.getStringColorId(b.openSlice),a,e,0);b.thread.sliceGroup.pushSlice(a)},vblankEvent:function(a,c,e,b,f){c=
-/crtc=(\d+), seq=(\d+)/.exec(f.details);if(!c)return!1;a=parseInt(c[1]);c=parseInt(c[2]);this.drmVblankSlice(b,"vblank:"+a,{crtc:a,seq:c});return!0}};b.registerSubtype(d);return{DrmParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+openAsyncSlice:function(a,c,e,b,g,h){e=this.importer.getOrCreateKernelThread(c+":"+e,b);a=new tracing.trace_model.AsyncSlice(c,h,tracing.getStringColorId(h),a);a.startThread=e.thread;e.openAsyncSlices||(e.openAsyncSlices={});e.openAsyncSlices[g]=a},closeAsyncSlice:function(a,c,e,b,g,h){e=this.importer.getOrCreateKernelThread(c+":"+e,b);e.openAsyncSlices&&(b=e.openAsyncSlices[g])&&(b.duration=a-b.start,b.args=h,b.endThread=e.thread,b.subSlices=[new tracing.trace_model.Slice(c,b.title,b.colorId,b.start,
+b.args,b.duration)],e.thread.asyncSliceGroup.push(b),delete e.openAsyncSlices[g])},ext4SyncFileEnterEvent:function(a,c,e,b,g){a=/dev (\d+,\d+) ino (\d+) parent (\d+) datasync (\d+)/.exec(g.details);if(!a)return!1;c=a[1];e=parseInt(a[2]);this.openAsyncSlice(b,"ext4",g.threadName,g.pid,c+"-"+e,1==a[4]?"fdatasync":"fsync");return!0},ext4SyncFileExitEvent:function(a,c,e,b,g){e=/dev (\d+,\d+) ino (\d+) ret (\d+)/.exec(g.details);if(!e)return!1;a=e[1];c=parseInt(e[2]);e=parseInt(e[3]);this.closeAsyncSlice(b,
+"ext4",g.threadName,g.pid,a+"-"+c,{device:a,inode:c,error:e});return!0},blockRqIssueEvent:function(a,c,e,b,g){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \d+ \(.*\) (\d+) \+ (\d+) \[.*\]/.exec(g.details);if(!h)return!1;switch(h[3]){case "D":a="discard";break;case "W":a="write";break;case "R":a="read";break;case "N":a="none";break;default:a="unknown"}h[2]&&(a+=" flush");"F"==h[4]&&(a+=" fua");"A"==h[5]&&(a+=" ahead");"S"==h[6]&&(a+=" sync");"M"==h[7]&&(a+=" meta");c=h[1];e=parseInt(h[8]);h=parseInt(h[9]);
+this.openAsyncSlice(b,"block",g.threadName,g.pid,c+"-"+e+"-"+h,a);return!0},blockRqCompleteEvent:function(a,c,e,b,g){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \(.*\) (\d+) \+ (\d+) \[(.*)\]/.exec(g.details);if(!h)return!1;a=h[1];c=parseInt(h[8]);e=parseInt(h[9]);h=parseInt(h[10]);this.closeAsyncSlice(b,"block",g.threadName,g.pid,a+"-"+c+"-"+e,{device:a,sector:c,numSectors:e,error:h});return!0}};b.registerSubtype(d);return{DiskParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("drm_vblank_event",d.prototype.vblankEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,drmVblankSlice:function(a,c,e){var b=this.importer.getOrCreatePseudoThread("drm_vblank");b.openSlice=c;a=new tracing.trace_model.Slice("",b.openSlice,tracing.getStringColorId(b.openSlice),a,e,0);b.thread.sliceGroup.pushSlice(a)},vblankEvent:function(a,c,e,b,g){c=
+/crtc=(\d+), seq=(\d+)/.exec(g.details);if(!c)return!1;a=parseInt(c[1]);c=parseInt(c[2]);this.drmVblankSlice(b,"vblank:"+a,{crtc:a,seq:c});return!0}};b.registerSubtype(d);return{DrmParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("exynos_flip_request",d.prototype.flipEvent.bind(this));a.registerEventHandler("exynos_flip_complete",d.prototype.flipEvent.bind(this));a.registerEventHandler("exynos_busfreq_target_int",d.prototype.busfreqTargetIntEvent.bind(this));a.registerEventHandler("exynos_busfreq_target_mif",d.prototype.busfreqTargetMifEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,
-exynosFlipOpenSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("exynos_flip");e.openSliceTS=a;e.openSlice="flip:"+c},exynosFlipCloseSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("exynos_flip");if(e.openSlice){var b=new tracing.trace_model.Slice("",e.openSlice,tracing.getStringColorId(e.openSlice),e.openSliceTS,c,a-e.openSliceTS);e.thread.sliceGroup.pushSlice(b)}e.openSlice=void 0},flipEvent:function(a,c,e,b,f){c=/pipe=(\d+)/.exec(f.details);if(!c)return!1;c=parseInt(c[1]);
-"exynos_flip_request"==a?this.exynosFlipOpenSlice(b,c):this.exynosFlipCloseSlice(b,{pipe:c});return!0},exynosBusfreqSample:function(a,c,e){a=this.importer.getOrCreateCpuState(0).cpu.getOrCreateCounter("",a);0==a.numSeries&&(a.seriesNames.push("frequency"),a.seriesColors.push(tracing.getStringColorId(a.name+".frequency")));a.timestamps.push(c);a.samples.push(e)},busfreqTargetIntEvent:function(a,c,e,b,f){a=/frequency=(\d+)/.exec(f.details);if(!a)return!1;this.exynosBusfreqSample("INT Frequency",b,parseInt(a[1]));
-return!0},busfreqTargetMifEvent:function(a,c,e,b,f){a=/frequency=(\d+)/.exec(f.details);if(!a)return!1;this.exynosBusfreqSample("MIF Frequency",b,parseInt(a[1]));return!0}};b.registerSubtype(d);return{ExynosParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+exynosFlipOpenSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("exynos_flip");e.openSliceTS=a;e.openSlice="flip:"+c},exynosFlipCloseSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("exynos_flip");if(e.openSlice){var b=new tracing.trace_model.Slice("",e.openSlice,tracing.getStringColorId(e.openSlice),e.openSliceTS,c,a-e.openSliceTS);e.thread.sliceGroup.pushSlice(b)}e.openSlice=void 0},flipEvent:function(a,c,e,b,g){c=/pipe=(\d+)/.exec(g.details);if(!c)return!1;c=parseInt(c[1]);
+"exynos_flip_request"==a?this.exynosFlipOpenSlice(b,c):this.exynosFlipCloseSlice(b,{pipe:c});return!0},exynosBusfreqSample:function(a,c,e){a=this.importer.getOrCreateCpuState(0).cpu.getOrCreateCounter("",a);0===a.numSeries&&a.addSeries(new tracing.trace_model.CounterSeries("frequency",tracing.getStringColorId(a.name+".frequency")));a.series.forEach(function(a){a.addSample(c,e)})},busfreqTargetIntEvent:function(a,c,e,b,g){a=/frequency=(\d+)/.exec(g.details);if(!a)return!1;this.exynosBusfreqSample("INT Frequency",
+b,parseInt(a[1]));return!0},busfreqTargetMifEvent:function(a,c,e,b,g){a=/frequency=(\d+)/.exec(g.details);if(!a)return!1;this.exynosBusfreqSample("MIF Frequency",b,parseInt(a[1]));return!0}};b.registerSubtype(d);return{ExynosParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("tracing_mark_write:log",d.prototype.logEvent.bind(this));a.registerEventHandler("tracing_mark_write:SyncInterpret",d.prototype.syncEvent.bind(this));a.registerEventHandler("tracing_mark_write:HandleTimer",d.prototype.timerEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,gestureOpenSlice:function(a,c,e){this.importer.getOrCreatePseudoThread("gesture").thread.sliceGroup.beginSlice("touchpad_gesture",
-a,c,e)},gestureCloseSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("gesture").thread;if(e.sliceGroup.openSliceCount){var b=e.sliceGroup.mostRecentlyOpenedPartialSlice;b.title!=a?this.importer.importError("Titles do not match. Title is "+b.title+" in openSlice, and is "+a+" in endSlice"):e.sliceGroup.endSlice(c)}},logEvent:function(a,c,e,b,f){a=/^\s*(\w+):\s*(\w+)$/.exec(f.details);switch(a[1]){case "start":this.gestureOpenSlice("GestureLog",b,{name:a[2]});break;case "end":this.gestureCloseSlice("GestureLog",
-b)}return!0},syncEvent:function(a,c,e,b,f){a=/^\s*(\w+):\s*(\w+)$/.exec(f.details);switch(a[1]){case "start":this.gestureOpenSlice("SyncInterpret",b,{interpreter:a[2]});break;case "end":this.gestureCloseSlice("SyncInterpret",b)}return!0},timerEvent:function(a,c,e,b,f){a=/^\s*(\w+):\s*(\w+)$/.exec(f.details);switch(a[1]){case "start":this.gestureOpenSlice("HandleTimer",b,{interpreter:a[2]});break;case "end":this.gestureCloseSlice("HandleTimer",b)}return!0}};b.registerSubtype(d);return{GestureParser:d}});
+a,c,e)},gestureCloseSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("gesture").thread;if(e.sliceGroup.openSliceCount){var b=e.sliceGroup.mostRecentlyOpenedPartialSlice;b.title!=a?this.importer.importError("Titles do not match. Title is "+b.title+" in openSlice, and is "+a+" in endSlice"):e.sliceGroup.endSlice(c)}},logEvent:function(a,c,e,b,g){a=/^\s*(\w+):\s*(\w+)$/.exec(g.details);switch(a[1]){case "start":this.gestureOpenSlice("GestureLog",b,{name:a[2]});break;case "end":this.gestureCloseSlice("GestureLog",
+b)}return!0},syncEvent:function(a,c,e,b,g){a=/^\s*(\w+):\s*(\w+)$/.exec(g.details);switch(a[1]){case "start":this.gestureOpenSlice("SyncInterpret",b,{interpreter:a[2]});break;case "end":this.gestureCloseSlice("SyncInterpret",b)}return!0},timerEvent:function(a,c,e,b,g){a=/^\s*(\w+):\s*(\w+)$/.exec(g.details);switch(a[1]){case "start":this.gestureOpenSlice("HandleTimer",b,{interpreter:a[2]});break;case "end":this.gestureCloseSlice("HandleTimer",b)}return!0}};b.registerSubtype(d);return{GestureParser:d}});
"use strict";base.require("tracing.importer.linux_perf.parser");
base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("i915_gem_object_create",d.prototype.gemObjectCreateEvent.bind(this));a.registerEventHandler("i915_gem_object_bind",d.prototype.gemObjectBindEvent.bind(this));a.registerEventHandler("i915_gem_object_unbind",d.prototype.gemObjectBindEvent.bind(this));a.registerEventHandler("i915_gem_object_change_domain",d.prototype.gemObjectChangeDomainEvent.bind(this));a.registerEventHandler("i915_gem_object_pread",
d.prototype.gemObjectPreadWriteEvent.bind(this));a.registerEventHandler("i915_gem_object_pwrite",d.prototype.gemObjectPreadWriteEvent.bind(this));a.registerEventHandler("i915_gem_object_fault",d.prototype.gemObjectFaultEvent.bind(this));a.registerEventHandler("i915_gem_object_clflush",d.prototype.gemObjectDestroyEvent.bind(this));a.registerEventHandler("i915_gem_object_destroy",d.prototype.gemObjectDestroyEvent.bind(this));a.registerEventHandler("i915_gem_ring_dispatch",d.prototype.gemRingDispatchEvent.bind(this));
a.registerEventHandler("i915_gem_ring_flush",d.prototype.gemRingFlushEvent.bind(this));a.registerEventHandler("i915_gem_request",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_request_add",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_request_complete",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_request_retire",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_request_wait_begin",d.prototype.gemRequestEvent.bind(this));
a.registerEventHandler("i915_gem_request_wait_end",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_ring_wait_begin",d.prototype.gemRingWaitEvent.bind(this));a.registerEventHandler("i915_gem_ring_wait_end",d.prototype.gemRingWaitEvent.bind(this));a.registerEventHandler("i915_reg_rw",d.prototype.regRWEvent.bind(this));a.registerEventHandler("i915_flip_request",d.prototype.flipEvent.bind(this));a.registerEventHandler("i915_flip_complete",d.prototype.flipEvent.bind(this))}var b=
tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,i915FlipOpenSlice:function(a,c,e){var b=this.importer.getOrCreatePseudoThread("i915_flip");b.openSliceTS=a;b.openSlice="flip:"+c+"/"+e},i915FlipCloseSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("i915_flip");if(e.openSlice){var b=new tracing.trace_model.Slice("",e.openSlice,tracing.getStringColorId(e.openSlice),e.openSliceTS,c,a-e.openSliceTS);e.thread.sliceGroup.pushSlice(b)}e.openSlice=void 0},i915GemObjectSlice:function(a,
-c,e,b){var f=this.importer.getOrCreatePseudoThread("i915_gem");f.openSlice=c+":"+e;a=new tracing.trace_model.Slice("",f.openSlice,tracing.getStringColorId(f.openSlice),a,b,0);f.thread.sliceGroup.pushSlice(a)},i915GemRingSlice:function(a,c,e,b,f){var h=this.importer.getOrCreatePseudoThread("i915_gem_ring");h.openSlice=c+":"+e+"."+b;a=new tracing.trace_model.Slice("",h.openSlice,tracing.getStringColorId(h.openSlice),a,f,0);h.thread.sliceGroup.pushSlice(a)},i915RegSlice:function(a,c,e,b){var f=this.importer.getOrCreatePseudoThread("i915_reg");
-f.openSlice=c+":"+e;a=new tracing.trace_model.Slice("",f.openSlice,tracing.getStringColorId(f.openSlice),a,b,0);f.thread.sliceGroup.pushSlice(a)},gemObjectCreateEvent:function(a,c,e,b,f){e=/obj=(\w+), size=(\d+)/.exec(f.details);if(!e)return!1;c=e[1];e=parseInt(e[2]);this.i915GemObjectSlice(b,a,c,{obj:c,size:e});return!0},gemObjectBindEvent:function(a,c,e,b,f){f=/obj=(\w+), offset=(\w+), size=(\d+)/.exec(f.details);if(!f)return!1;c=f[1];e=f[2];f=parseInt(f[3]);this.i915ObjectGemSlice(b,a+":"+c,{obj:c,
-offset:e,size:f});return!0},gemObjectChangeDomainEvent:function(a,c,e,b,f){c=/obj=(\w+), read=(\w+=>\w+), write=(\w+=>\w+)/.exec(f.details);if(!c)return!1;e=c[1];this.i915GemObjectSlice(b,a,e,{obj:e,read:c[2],write:c[3]});return!0},gemObjectPreadWriteEvent:function(a,c,e,b,f){f=/obj=(\w+), offset=(\d+), len=(\d+)/.exec(f.details);if(!f)return!1;c=f[1];e=parseInt(f[2]);f=parseInt(f[3]);this.i915GemObjectSlice(b,a,c,{obj:c,offset:e,len:f});return!0},gemObjectFaultEvent:function(a,c,e,b,f){f=/obj=(\w+), (\w+) index=(\d+)/.exec(f.details);
-if(!f)return!1;c=f[1];e=f[2];f=parseInt(f[3]);this.i915GemObjectSlice(b,a,c,{obj:c,type:e,index:f});return!0},gemObjectDestroyEvent:function(a,c,e,b,f){c=/obj=(\w+)/.exec(f.details);if(!c)return!1;c=c[1];this.i915GemObjectSlice(b,a,c,{obj:c});return!0},gemRingDispatchEvent:function(a,c,e,b,f){f=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(f.details);if(!f)return!1;c=parseInt(f[1]);e=parseInt(f[2]);f=parseInt(f[3]);this.i915GemRingSlice(b,a,c,e,{dev:c,ring:e,seqno:f});return!0},gemRingFlushEvent:function(a,
-c,e,b,f){c=/dev=(\d+), ring=(\w+), invalidate=(\w+), flush=(\w+)/.exec(f.details);if(!c)return!1;e=parseInt(c[1]);f=parseInt(c[2]);this.i915GemRingSlice(b,a,e,f,{dev:e,ring:f,invalidate:c[3],flush:c[4]});return!0},gemRequestEvent:function(a,c,e,b,f){f=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(f.details);if(!f)return!1;c=parseInt(f[1]);e=parseInt(f[2]);f=parseInt(f[3]);this.i915GemRingSlice(b,a,c,e,{dev:c,ring:e,seqno:f});return!0},gemRingWaitEvent:function(a,c,e,b,f){e=/dev=(\d+), ring=(\d+)/.exec(f.details);
-if(!e)return!1;c=parseInt(e[1]);e=parseInt(e[2]);this.i915GemRingSlice(b,a,c,e,{dev:c,ring:e});return!0},regRWEvent:function(a,c,e,b,f){a=/(\w+) reg=(\w+), len=(\d+), val=(\(\w+, \w+\))/.exec(f.details);if(!a)return!1;c=a[1];e=a[2];this.i915RegSlice(b,c,e,{rw:c,reg:e,len:a[3],data:a[3]});return!0},flipEvent:function(a,c,e,b,f){e=/plane=(\d+), obj=(\w+)/.exec(f.details);if(!e)return!1;c=parseInt(e[1]);e=e[2];"i915_flip_request"==a?this.i915FlipOpenSlice(b,e,c):this.i915FlipCloseSlice(b,{obj:e,plane:c});
+c,e,b){var g=this.importer.getOrCreatePseudoThread("i915_gem");g.openSlice=c+":"+e;a=new tracing.trace_model.Slice("",g.openSlice,tracing.getStringColorId(g.openSlice),a,b,0);g.thread.sliceGroup.pushSlice(a)},i915GemRingSlice:function(a,c,e,b,g){var h=this.importer.getOrCreatePseudoThread("i915_gem_ring");h.openSlice=c+":"+e+"."+b;a=new tracing.trace_model.Slice("",h.openSlice,tracing.getStringColorId(h.openSlice),a,g,0);h.thread.sliceGroup.pushSlice(a)},i915RegSlice:function(a,c,e,b){var g=this.importer.getOrCreatePseudoThread("i915_reg");
+g.openSlice=c+":"+e;a=new tracing.trace_model.Slice("",g.openSlice,tracing.getStringColorId(g.openSlice),a,b,0);g.thread.sliceGroup.pushSlice(a)},gemObjectCreateEvent:function(a,c,e,b,g){e=/obj=(\w+), size=(\d+)/.exec(g.details);if(!e)return!1;c=e[1];e=parseInt(e[2]);this.i915GemObjectSlice(b,a,c,{obj:c,size:e});return!0},gemObjectBindEvent:function(a,c,e,b,g){g=/obj=(\w+), offset=(\w+), size=(\d+)/.exec(g.details);if(!g)return!1;c=g[1];e=g[2];g=parseInt(g[3]);this.i915ObjectGemSlice(b,a+":"+c,{obj:c,
+offset:e,size:g});return!0},gemObjectChangeDomainEvent:function(a,c,e,b,g){c=/obj=(\w+), read=(\w+=>\w+), write=(\w+=>\w+)/.exec(g.details);if(!c)return!1;e=c[1];this.i915GemObjectSlice(b,a,e,{obj:e,read:c[2],write:c[3]});return!0},gemObjectPreadWriteEvent:function(a,c,e,b,g){g=/obj=(\w+), offset=(\d+), len=(\d+)/.exec(g.details);if(!g)return!1;c=g[1];e=parseInt(g[2]);g=parseInt(g[3]);this.i915GemObjectSlice(b,a,c,{obj:c,offset:e,len:g});return!0},gemObjectFaultEvent:function(a,c,e,b,g){g=/obj=(\w+), (\w+) index=(\d+)/.exec(g.details);
+if(!g)return!1;c=g[1];e=g[2];g=parseInt(g[3]);this.i915GemObjectSlice(b,a,c,{obj:c,type:e,index:g});return!0},gemObjectDestroyEvent:function(a,c,e,b,g){c=/obj=(\w+)/.exec(g.details);if(!c)return!1;c=c[1];this.i915GemObjectSlice(b,a,c,{obj:c});return!0},gemRingDispatchEvent:function(a,c,e,b,g){g=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(g.details);if(!g)return!1;c=parseInt(g[1]);e=parseInt(g[2]);g=parseInt(g[3]);this.i915GemRingSlice(b,a,c,e,{dev:c,ring:e,seqno:g});return!0},gemRingFlushEvent:function(a,
+c,e,b,g){c=/dev=(\d+), ring=(\w+), invalidate=(\w+), flush=(\w+)/.exec(g.details);if(!c)return!1;e=parseInt(c[1]);g=parseInt(c[2]);this.i915GemRingSlice(b,a,e,g,{dev:e,ring:g,invalidate:c[3],flush:c[4]});return!0},gemRequestEvent:function(a,c,e,b,g){g=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(g.details);if(!g)return!1;c=parseInt(g[1]);e=parseInt(g[2]);g=parseInt(g[3]);this.i915GemRingSlice(b,a,c,e,{dev:c,ring:e,seqno:g});return!0},gemRingWaitEvent:function(a,c,e,b,g){e=/dev=(\d+), ring=(\d+)/.exec(g.details);
+if(!e)return!1;c=parseInt(e[1]);e=parseInt(e[2]);this.i915GemRingSlice(b,a,c,e,{dev:c,ring:e});return!0},regRWEvent:function(a,c,e,b,g){a=/(\w+) reg=(\w+), len=(\d+), val=(\(\w+, \w+\))/.exec(g.details);if(!a)return!1;c=a[1];e=a[2];this.i915RegSlice(b,c,e,{rw:c,reg:e,len:a[3],data:a[3]});return!0},flipEvent:function(a,c,e,b,g){e=/plane=(\d+), obj=(\w+)/.exec(g.details);if(!e)return!1;c=parseInt(e[1]);e=e[2];"i915_flip_request"==a?this.i915FlipOpenSlice(b,e,c):this.i915FlipCloseSlice(b,{obj:e,plane:c});
return!0}};b.registerSubtype(d);return{I915Parser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
-base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("graph_ent",d.prototype.traceKernelFuncEnterEvent.bind(this));a.registerEventHandler("graph_ret",d.prototype.traceKernelFuncReturnEvent.bind(this));this.model_=a.model_;this.ppids_={}}var b=tracing.importer.linux_perf.Parser,a=/func=(.+)/;d.prototype={__proto__:b.prototype,traceKernelFuncEnterEvent:function(c,e,b,f,h){c=a.exec(h.details);if(!c||void 0===h.tgid)return!1;e=parseInt(h.tgid);c=c[1];
-b=this.model_.getOrCreateProcess(e).getOrCreateThread(b);b.name=h.threadName;h=b.kernelSliceGroup;if(!h.isTimestampValidForBeginOrEnd(f))return this.model_.importErrors.push("Timestamps are moving backward."),!1;h.beginSlice(null,c,f,{});return!0},traceKernelFuncReturnEvent:function(a,e,b,f,h){if(void 0===h.tgid)return!1;a=parseInt(h.tgid);b=this.model_.getOrCreateProcess(a).getOrCreateThread(b);b.name=h.threadName;h=b.kernelSliceGroup;if(!h.isTimestampValidForBeginOrEnd(f))return this.model_.importErrors.push("Timestamps are moving backward."),
-!1;0<h.openSliceCount&&h.endSlice(f);return!0}};b.registerSubtype(d);return{KernelFuncParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("graph_ent",d.prototype.traceKernelFuncEnterEvent.bind(this));a.registerEventHandler("graph_ret",d.prototype.traceKernelFuncReturnEvent.bind(this));this.model_=a.model_;this.ppids_={}}var b=tracing.importer.linux_perf.Parser,a=/func=(.+)/;d.prototype={__proto__:b.prototype,traceKernelFuncEnterEvent:function(c,e,b,g,h){c=a.exec(h.details);if(!c||void 0===h.tgid)return!1;e=parseInt(h.tgid);c=c[1];
+b=this.model_.getOrCreateProcess(e).getOrCreateThread(b);b.name=h.threadName;h=b.kernelSliceGroup;if(!h.isTimestampValidForBeginOrEnd(g))return this.model_.importErrors.push("Timestamps are moving backward."),!1;h.beginSlice(null,c,g,{});return!0},traceKernelFuncReturnEvent:function(a,e,b,g,h){if(void 0===h.tgid)return!1;a=parseInt(h.tgid);b=this.model_.getOrCreateProcess(a).getOrCreateThread(b);b.name=h.threadName;h=b.kernelSliceGroup;if(!h.isTimestampValidForBeginOrEnd(g))return this.model_.importErrors.push("Timestamps are moving backward."),
+!1;0<h.openSliceCount&&h.endSlice(g);return!0}};b.registerSubtype(d);return{KernelFuncParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("mali_dvfs_event",d.prototype.dvfsEventEvent.bind(this));a.registerEventHandler("mali_dvfs_set_clock",d.prototype.dvfsSetClockEvent.bind(this));a.registerEventHandler("mali_dvfs_set_voltage",d.prototype.dvfsSetVoltageEvent.bind(this));this.addJMCounter("mali_hwc_MESSAGES_SENT","Messages Sent");this.addJMCounter("mali_hwc_MESSAGES_RECEIVED","Messages Received");this.addJMCycles("mali_hwc_GPU_ACTIVE",
-"GPU Active");this.addJMCycles("mali_hwc_IRQ_ACTIVE","IRQ Active");for(var c=0;7>c;c++){var e="JS"+c,g="mali_hwc_"+e;this.addJMCounter(g+"_JOBS",e+" Jobs");this.addJMCounter(g+"_TASKS",e+" Tasks");this.addJMCycles(g+"_ACTIVE",e+" Active");this.addJMCycles(g+"_WAIT_READ",e+" Wait Read");this.addJMCycles(g+"_WAIT_ISSUE",e+" Wait Issue");this.addJMCycles(g+"_WAIT_DEPEND",e+" Wait Depend");this.addJMCycles(g+"_WAIT_FINISH",e+" Wait Finish")}this.addTilerCounter("mali_hwc_TRIANGLES","Triangles");this.addTilerCounter("mali_hwc_QUADS",
+"GPU Active");this.addJMCycles("mali_hwc_IRQ_ACTIVE","IRQ Active");for(var c=0;7>c;c++){var e="JS"+c,f="mali_hwc_"+e;this.addJMCounter(f+"_JOBS",e+" Jobs");this.addJMCounter(f+"_TASKS",e+" Tasks");this.addJMCycles(f+"_ACTIVE",e+" Active");this.addJMCycles(f+"_WAIT_READ",e+" Wait Read");this.addJMCycles(f+"_WAIT_ISSUE",e+" Wait Issue");this.addJMCycles(f+"_WAIT_DEPEND",e+" Wait Depend");this.addJMCycles(f+"_WAIT_FINISH",e+" Wait Finish")}this.addTilerCounter("mali_hwc_TRIANGLES","Triangles");this.addTilerCounter("mali_hwc_QUADS",
"Quads");this.addTilerCounter("mali_hwc_POLYGONS","Polygons");this.addTilerCounter("mali_hwc_POINTS","Points");this.addTilerCounter("mali_hwc_LINES","Lines");this.addTilerCounter("mali_hwc_VCACHE_HIT","VCache Hit");this.addTilerCounter("mali_hwc_VCACHE_MISS","VCache Miss");this.addTilerCounter("mali_hwc_FRONT_FACING","Front Facing");this.addTilerCounter("mali_hwc_BACK_FACING","Back Facing");this.addTilerCounter("mali_hwc_PRIM_VISIBLE","Prim Visible");this.addTilerCounter("mali_hwc_PRIM_CULLED","Prim Culled");
this.addTilerCounter("mali_hwc_PRIM_CLIPPED","Prim Clipped");this.addTilerCounter("mali_hwc_WRBUF_HIT","Wrbuf Hit");this.addTilerCounter("mali_hwc_WRBUF_MISS","Wrbuf Miss");this.addTilerCounter("mali_hwc_WRBUF_LINE","Wrbuf Line");this.addTilerCounter("mali_hwc_WRBUF_PARTIAL","Wrbuf Partial");this.addTilerCounter("mali_hwc_WRBUF_STALL","Wrbuf Stall");this.addTilerCycles("mali_hwc_ACTIVE","Tiler Active");this.addTilerCycles("mali_hwc_INDEX_WAIT","Index Wait");this.addTilerCycles("mali_hwc_INDEX_RANGE_WAIT",
"Index Range Wait");this.addTilerCycles("mali_hwc_VERTEX_WAIT","Vertex Wait");this.addTilerCycles("mali_hwc_PCACHE_WAIT","Pcache Wait");this.addTilerCycles("mali_hwc_WRBUF_WAIT","Wrbuf Wait");this.addTilerCycles("mali_hwc_BUS_READ","Bus Read");this.addTilerCycles("mali_hwc_BUS_WRITE","Bus Write");this.addTilerCycles("mali_hwc_TILER_UTLB_STALL","Tiler UTLB Stall");this.addTilerCycles("mali_hwc_TILER_UTLB_HIT","Tiler UTLB Hit");this.addFragCycles("mali_hwc_FRAG_ACTIVE","Active");this.addFragCounter("mali_hwc_FRAG_PRIMATIVES",
@@ -86,22 +91,22 @@
"Write Replayed");this.addL2Counter("mali_hwc_L2_WRITE_SNOOP","Write Snoop");this.addL2Counter("mali_hwc_L2_WRITE_HIT","Write Cache Hit");this.addL2Counter("mali_hwc_L2_EXT_READ_FULL","ExtRD with BIU Full");this.addL2Counter("mali_hwc_L2_EXT_READ_HALF","ExtRD with BIU >1/2 Full");this.addL2Counter("mali_hwc_L2_EXT_WRITE_FULL","ExtWR with BIU Full");this.addL2Counter("mali_hwc_L2_EXT_WRITE_HALF","ExtWR with BIU >1/2 Full");this.addL2Counter("mali_hwc_L2_EXT_READ","External Read (ExtRD)");this.addL2Counter("mali_hwc_L2_EXT_READ_LINE",
"ExtRD (linefill)");this.addL2Counter("mali_hwc_L2_EXT_WRITE","External Write (ExtWR)");this.addL2Counter("mali_hwc_L2_EXT_WRITE_LINE","ExtWR (linefill)");this.addL2Counter("mali_hwc_L2_EXT_WRITE_SMALL","ExtWR (burst size <64B)");this.addL2Counter("mali_hwc_L2_EXT_BARRIER","External Barrier");this.addL2Counter("mali_hwc_L2_EXT_AR_STALL","Address Read stalls");this.addL2Counter("mali_hwc_L2_EXT_R_BUF_FULL","Response Buffer full stalls");this.addL2Counter("mali_hwc_L2_EXT_RD_BUF_FULL","Read Data Buffer full stalls");
this.addL2Counter("mali_hwc_L2_EXT_R_RAW","RAW hazard stalls");this.addL2Counter("mali_hwc_L2_EXT_W_STALL","Write Data stalls");this.addL2Counter("mali_hwc_L2_EXT_W_BUF_FULL","Write Data Buffer full");this.addL2Counter("mali_hwc_L2_EXT_R_W_HAZARD","WAW or WAR hazard stalls");this.addL2Counter("mali_hwc_L2_TAG_HAZARD","Tag hazard replays");this.addL2Cycles("mali_hwc_L2_SNOOP_FULL","Snoop buffer full");this.addL2Cycles("mali_hwc_L2_REPLAY_FULL","Replay buffer full");a.registerEventHandler("tracing_mark_write:mali_driver",
-d.prototype.maliDDKEvent.bind(this));this.model_=a.model_}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,maliDDKOpenSlice:function(a,c,e,b,f){a=this.importer.model_.getOrCreateProcess(a).getOrCreateThread(c);b=/^([\w\d_]*)(?:\(\))?:?\s*(.*)$/.exec(b);a.sliceGroup.beginSlice("gpu-driver",b[1],e,{args:b[2],blockinfo:f})},maliDDKCloseSlice:function(a,c,e,b,f){a=this.importer.model_.getOrCreateProcess(a).getOrCreateThread(c);a.sliceGroup.openSliceCount&&a.sliceGroup.endSlice(e)},
-autoDetectLineRE:function(a){var c=/^\s*\(([\w\-]*)\)\s*(\w+):\s*([\w\\\/\.\-]*@\d*):?\s*(.*)$/;if(c.test(a))return c;c=/^s*()(\w+):\s*([\w\\\/.\-]*):?\s*(.*)$/;return c.test(a)?c:null},lineRE:null,maliDDKEvent:function(a,c,e,b,f){if(null==this.lineRE&&(this.lineRE=this.autoDetectLineRE(f.details),null==this.lineRE))return!1;a=this.lineRE.exec(f.details);c=""===a[1]?"mali":a[1];switch(a[2]){case "cros_trace_print_enter":this.maliDDKOpenSlice(e,c,b,a[4],a[3]);break;case "cros_trace_print_exit":this.maliDDKCloseSlice(e,
-c,b,[],a[3])}return!0},dvfsSample:function(a,c,e,b){b=parseInt(b);a=this.model_.getOrCreateProcess(0).getOrCreateCounter("DVFS",a);0==a.numSeries&&(a.seriesNames.push(c),a.seriesColors.push(tracing.getStringColorId(a.name)));a.timestamps.push(e);a.samples.push(b)},dvfsEventEvent:function(a,c,e,b,f){a=/utilization=(\d+)/.exec(f.details);if(!a)return!1;this.dvfsSample("DVFS Utilization","utilization",b,a[1]);return!0},dvfsSetClockEvent:function(a,c,e,b,f){a=/frequency=(\d+)/.exec(f.details);if(!a)return!1;
-this.dvfsSample("DVFS Frequency","frequency",b,a[1]);return!0},dvfsSetVoltageEvent:function(a,c,e,b,f){a=/voltage=(\d+)/.exec(f.details);if(!a)return!1;this.dvfsSample("DVFS Voltage","voltage",b,a[1]);return!0},hwcSample:function(a,c,e,b,f){f=/val=(\d+)/.exec(f.details);if(!f)return!1;f=parseInt(f[1]);a=this.model_.getOrCreateProcess(0).getOrCreateCounter(a,c);0==a.numSeries&&(a.seriesNames.push(e),a.seriesColors.push(tracing.getStringColorId(a.name)));a.timestamps.push(b);a.samples.push(f);return!0},
-jmSample:function(a,c,e,b){return this.hwcSample("mali:jm","JM: "+a,c,e,b)},addJMCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,h,d){return this.jmSample(c,"count",h,d)}.bind(this))},addJMCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,h,d){return this.jmSample(c,"cycles",h,d)}.bind(this))},tilerSample:function(a,c,e,b){return this.hwcSample("mali:tiler","Tiler: "+a,c,e,b)},addTilerCounter:function(a,c){this.importer.registerEventHandler(a,function(a,
-b,f,h,d){return this.tilerSample(c,"count",h,d)}.bind(this))},addTilerCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,h,d){return this.tilerSample(c,"cycles",h,d)}.bind(this))},fragSample:function(a,c,e,b){return this.hwcSample("mali:fragment","Fragment: "+a,c,e,b)},addFragCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,h,d){return this.fragSample(c,"count",h,d)}.bind(this))},addFragCycles:function(a,c){this.importer.registerEventHandler(a,function(a,
-b,f,h,d){return this.fragSample(c,"cycles",h,d)}.bind(this))},computeSample:function(a,c,b,g){return this.hwcSample("mali:compute","Compute: "+a,c,b,g)},addComputeCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,h,d){return this.computeSample(c,"count",h,d)}.bind(this))},addComputeCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,h,d){return this.computeSample(c,"cycles",h,d)}.bind(this))},addTripipeCycles:function(a,c){this.importer.registerEventHandler(a,
-function(a,b,f,h,d){return this.hwcSample("mali:shader","Tripipe: "+c,"cycles",h,d)}.bind(this))},arithSample:function(a,c,b,g){return this.hwcSample("mali:arith","Arith: "+a,c,b,g)},addArithCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,h,d){return this.arithSample(c,"count",h,d)}.bind(this))},addArithCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,h,d){return this.arithSample(c,"cycles",h,d)}.bind(this))},addLSCounter:function(a,c){this.importer.registerEventHandler(a,
-function(a,b,f,h,d){return this.hwcSample("mali:ls","LS: "+c,"count",h,d)}.bind(this))},textureSample:function(a,c,b,g){return this.hwcSample("mali:texture","Texture: "+a,c,b,g)},addTexCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,d,k){return this.textureSample(c,"count",d,k)}.bind(this))},addLSCCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,d,k){return this.hwcSample("mali:lsc","LSC: "+c,"count",d,k)}.bind(this))},addAXICounter:function(a,c){this.importer.registerEventHandler(a,
-function(a,b,f,d,k){return this.hwcSample("mali:axi","AXI: "+c,"count",d,k)}.bind(this))},mmuSample:function(a,c,b,g){return this.hwcSample("mali:mmu","MMU: "+a,c,b,g)},addMMUCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,d,k){return this.mmuSample(c,"count",d,k)}.bind(this))},addMMUCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,d,k){return this.mmuSample(c,"cycles",d,k)}.bind(this))},l2Sample:function(a,c,b,g){return this.hwcSample("mali:l2","L2: "+
-a,c,b,g)},addL2Counter:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,d,k){return this.l2Sample(c,"count",d,k)}.bind(this))},addL2Cycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,f,d,k){return this.l2Sample(c,"cycles",d,k)}.bind(this))}};b.registerSubtype(d);return{MaliParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+d.prototype.maliDDKEvent.bind(this));this.model_=a.model_}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,maliDDKOpenSlice:function(a,c,e,b,g){a=this.importer.model_.getOrCreateProcess(a).getOrCreateThread(c);b=/^([\w\d_]*)(?:\(\))?:?\s*(.*)$/.exec(b);a.sliceGroup.beginSlice("gpu-driver",b[1],e,{args:b[2],blockinfo:g})},maliDDKCloseSlice:function(a,c,e,b,g){a=this.importer.model_.getOrCreateProcess(a).getOrCreateThread(c);a.sliceGroup.openSliceCount&&a.sliceGroup.endSlice(e)},
+autoDetectLineRE:function(a){var c=/^\s*\(([\w\-]*)\)\s*(\w+):\s*([\w\\\/\.\-]*@\d*):?\s*(.*)$/;if(c.test(a))return c;c=/^s*()(\w+):\s*([\w\\\/.\-]*):?\s*(.*)$/;return c.test(a)?c:null},lineRE:null,maliDDKEvent:function(a,c,e,b,g){if(null==this.lineRE&&(this.lineRE=this.autoDetectLineRE(g.details),null==this.lineRE))return!1;a=this.lineRE.exec(g.details);c=""===a[1]?"mali":a[1];switch(a[2]){case "cros_trace_print_enter":this.maliDDKOpenSlice(e,c,b,a[4],a[3]);break;case "cros_trace_print_exit":this.maliDDKCloseSlice(e,
+c,b,[],a[3])}return!0},dvfsSample:function(a,c,e,b){var g=parseInt(b);a=this.model_.getOrCreateProcess(0).getOrCreateCounter("DVFS",a);0===a.numSeries&&a.addSeries(new tracing.trace_model.CounterSeries(c,tracing.getStringColorId(a.name)));a.series.forEach(function(a){a.addSample(e,g)})},dvfsEventEvent:function(a,c,e,b,g){a=/utilization=(\d+)/.exec(g.details);if(!a)return!1;this.dvfsSample("DVFS Utilization","utilization",b,a[1]);return!0},dvfsSetClockEvent:function(a,c,e,b,g){a=/frequency=(\d+)/.exec(g.details);
+if(!a)return!1;this.dvfsSample("DVFS Frequency","frequency",b,a[1]);return!0},dvfsSetVoltageEvent:function(a,c,e,b,g){a=/voltage=(\d+)/.exec(g.details);if(!a)return!1;this.dvfsSample("DVFS Voltage","voltage",b,a[1]);return!0},hwcSample:function(a,c,e,b,g){g=/val=(\d+)/.exec(g.details);if(!g)return!1;var h=parseInt(g[1]);a=this.model_.getOrCreateProcess(0).getOrCreateCounter(a,c);0===a.numSeries&&a.addSeries(new tracing.trace_model.CounterSeries(e,tracing.getStringColorId(a.name)));a.series.forEach(function(a){a.addSample(b,
+h)});return!0},jmSample:function(a,c,e,b){return this.hwcSample("mali:jm","JM: "+a,c,e,b)},addJMCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.jmSample(c,"count",h,d)}.bind(this))},addJMCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.jmSample(c,"cycles",d,k)}.bind(this))},tilerSample:function(a,c,b,f){return this.hwcSample("mali:tiler","Tiler: "+a,c,b,f)},addTilerCounter:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,d,k){return this.tilerSample(c,"count",d,k)}.bind(this))},addTilerCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.tilerSample(c,"cycles",d,k)}.bind(this))},fragSample:function(a,c,b,f){return this.hwcSample("mali:fragment","Fragment: "+a,c,b,f)},addFragCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.fragSample(c,"count",d,k)}.bind(this))},addFragCycles:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,d,k){return this.fragSample(c,"cycles",d,k)}.bind(this))},computeSample:function(a,c,b,f){return this.hwcSample("mali:compute","Compute: "+a,c,b,f)},addComputeCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.computeSample(c,"count",d,k)}.bind(this))},addComputeCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.computeSample(c,"cycles",d,k)}.bind(this))},addTripipeCycles:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,d,k){return this.hwcSample("mali:shader","Tripipe: "+c,"cycles",d,k)}.bind(this))},arithSample:function(a,c,b,f){return this.hwcSample("mali:arith","Arith: "+a,c,b,f)},addArithCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.arithSample(c,"count",d,k)}.bind(this))},addArithCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.arithSample(c,"cycles",d,k)}.bind(this))},addLSCounter:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,d,k){return this.hwcSample("mali:ls","LS: "+c,"count",d,k)}.bind(this))},textureSample:function(a,c,b,f){return this.hwcSample("mali:texture","Texture: "+a,c,b,f)},addTexCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.textureSample(c,"count",d,k)}.bind(this))},addLSCCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.hwcSample("mali:lsc","LSC: "+c,"count",d,k)}.bind(this))},addAXICounter:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,d,k){return this.hwcSample("mali:axi","AXI: "+c,"count",d,k)}.bind(this))},mmuSample:function(a,c,b,f){return this.hwcSample("mali:mmu","MMU: "+a,c,b,f)},addMMUCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.mmuSample(c,"count",d,k)}.bind(this))},addMMUCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.mmuSample(c,"cycles",d,k)}.bind(this))},l2Sample:function(a,c,b,f){return this.hwcSample("mali:l2","L2: "+
+a,c,b,f)},addL2Counter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.l2Sample(c,"count",d,k)}.bind(this))},addL2Cycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,d,k){return this.l2Sample(c,"cycles",d,k)}.bind(this))}};b.registerSubtype(d);return{MaliParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");base.require("tracing.trace_model.counter_series");
base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("power_start",d.prototype.powerStartEvent.bind(this));a.registerEventHandler("power_frequency",d.prototype.powerFrequencyEvent.bind(this));a.registerEventHandler("cpu_frequency",d.prototype.cpuFrequencyEvent.bind(this));a.registerEventHandler("cpu_idle",d.prototype.cpuIdleEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,cpuStateSlice:function(a,c,
-b,g){c=this.importer.getOrCreateCpuState(c);"1"!=b?this.importer.importError("Don't understand power_start events of type "+b):(b=c.cpu.getOrCreateCounter("","C-State"),0==b.numSeries&&(b.seriesNames.push("state"),b.seriesColors.push(tracing.getStringColorId(b.name+".state"))),b.timestamps.push(a),b.samples.push(g))},cpuIdleSlice:function(a,c,b){c=this.importer.getOrCreateCpuState(c).cpu.getOrCreateCounter("","C-State");0==c.numSeries&&(c.seriesNames.push("state"),c.seriesColors.push(tracing.getStringColorId(c.name)));
-4294967295!=b?c.samples.push(b):c.samples.push(0);c.timestamps.push(a)},cpuFrequencySlice:function(a,c,b){c=this.importer.getOrCreateCpuState(c).cpu.getOrCreateCounter("","Clock Frequency");0==c.numSeries&&(c.seriesNames.push("state"),c.seriesColors.push(tracing.getStringColorId(c.name+".state")));c.timestamps.push(a);c.samples.push(b)},powerStartEvent:function(a,c,b,g,f){a=/type=(\d+) state=(\d) cpu_id=(\d)+/.exec(f.details);if(!a)return!1;c=parseInt(a[3]);b=parseInt(a[2]);this.cpuStateSlice(g,c,
-a[1],b);return!0},powerFrequencyEvent:function(a,c,b,g,f){c=/type=(\d+) state=(\d+) cpu_id=(\d)+/.exec(f.details);if(!c)return!1;a=parseInt(c[3]);c=parseInt(c[2]);this.cpuFrequencySlice(g,a,c);return!0},cpuFrequencyEvent:function(a,c,b,g,f){c=/state=(\d+) cpu_id=(\d)+/.exec(f.details);if(!c)return!1;a=parseInt(c[2]);c=parseInt(c[1]);this.cpuFrequencySlice(g,a,c);return!0},cpuIdleEvent:function(a,c,b,g,f){c=/state=(\d+) cpu_id=(\d)+/.exec(f.details);if(!c)return!1;a=parseInt(c[2]);c=parseInt(c[1]);
-this.cpuIdleSlice(g,a,c);return!0}};b.registerSubtype(d);return{PowerParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+b,f){c=this.importer.getOrCreateCpuState(c);"1"!=b?this.importer.importError("Don't understand power_start events of type "+b):(b=c.cpu.getOrCreateCounter("","C-State"),0===b.numSeries&&b.addSeries(new tracing.trace_model.CounterSeries("state",tracing.getStringColorId(b.name+".state"))),b.series.forEach(function(c){c.addSample(a,f)}))},cpuIdleSlice:function(a,c,b){c=this.importer.getOrCreateCpuState(c).cpu.getOrCreateCounter("","C-State");0===c.numSeries&&c.addSeries(new tracing.trace_model.CounterSeries("state",
+tracing.getStringColorId(c.name)));var f=4294967295!=b?b:0;c.series.forEach(function(c){c.addSample(a,f)})},cpuFrequencySlice:function(a,c,b){c=this.importer.getOrCreateCpuState(c).cpu.getOrCreateCounter("","Clock Frequency");0===c.numSeries&&c.addSeries(new tracing.trace_model.CounterSeries("state",tracing.getStringColorId(c.name+".state")));c.series.forEach(function(c){c.addSample(a,b)})},powerStartEvent:function(a,c,b,f,g){a=/type=(\d+) state=(\d) cpu_id=(\d)+/.exec(g.details);if(!a)return!1;c=
+parseInt(a[3]);b=parseInt(a[2]);this.cpuStateSlice(f,c,a[1],b);return!0},powerFrequencyEvent:function(a,c,b,f,g){c=/type=(\d+) state=(\d+) cpu_id=(\d)+/.exec(g.details);if(!c)return!1;a=parseInt(c[3]);c=parseInt(c[2]);this.cpuFrequencySlice(f,a,c);return!0},cpuFrequencyEvent:function(a,c,b,f,g){c=/state=(\d+) cpu_id=(\d)+/.exec(g.details);if(!c)return!1;a=parseInt(c[2]);c=parseInt(c[1]);this.cpuFrequencySlice(f,a,c);return!0},cpuIdleEvent:function(a,c,b,f,g){c=/state=(\d+) cpu_id=(\d)+/.exec(g.details);
+if(!c)return!1;a=parseInt(c[2]);c=parseInt(c[1]);this.cpuIdleSlice(f,a,c);return!0}};b.registerSubtype(d);return{PowerParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("sched_switch",d.prototype.schedSwitchEvent.bind(this));a.registerEventHandler("sched_wakeup",d.prototype.schedWakeupEvent.bind(this))}var b=tracing.importer.linux_perf.Parser,a={},c=RegExp("prev_comm=(.+) prev_pid=(\\d+) prev_prio=(\\d+) prev_state=(\\S\\+?|\\S\\|\\S) ==> next_comm=(.+) next_pid=(\\d+) next_prio=(\\d+)");a.schedSwitchRE=c;var e=/comm=(.+) pid=(\d+) prio=(\d+) success=(\d+) target_cpu=(\d+)/;
a.schedWakeupRE=e;d.prototype={__proto__:b.prototype,schedSwitchEvent:function(a,b,e,d,l){var m=c.exec(l.details);if(!m)return!1;a=m[4];e=m[5];l=parseInt(m[6]);m=parseInt(m[7]);this.importer.getOrCreateCpuState(b).switchRunningLinuxPid(this.importer,a,d,l,e,m);return!0},schedWakeupEvent:function(a,c,b,d,l){l=e.exec(l.details);if(!l)return!1;a=b;c=l[1];b=parseInt(l[2]);l=parseInt(l[3]);this.importer.markPidRunnable(d,b,c,l,a);return!0}};b.registerSubtype(d);return{SchedParser:d,_SchedParserTestExports:a}});
"use strict";base.require("tracing.importer.linux_perf.parser");
@@ -109,211 +114,216 @@
b,e,d,l){c=a.exec(l.details);if(!c)return!1;b=this.importer.getOrCreatePseudoThread(c[1]);void 0!==b.lastActiveTs&&(e=d-b.lastActiveTs,l=b.lastActiveValue,void 0==l&&(l=" "),e=new tracing.trace_model.Slice("",l,tracing.getStringColorId(l),b.lastActiveTs,{},e),b.thread.sliceGroup.pushSlice(e));b.lastActiveTs=d;b.lastActiveValue=c[2];return!0},syncWaitEvent:function(a,b,e,d,l){a=c.exec(l.details);if(!a||void 0===l.tgid)return!1;b=parseInt(l.tgid);e=this.model_.getOrCreateProcess(b).getOrCreateThread(e);
e.name=l.threadName;l=e.kernelSliceGroup;if(!l.isTimestampValidForBeginOrEnd(d))return this.model_.importErrors.push("Timestamps are moving backward."),!1;e='fence_wait("'+a[2]+'")';if("begin"==a[1])l.beginSlice(null,e,d,{"Start state":a[3]});else if("end"==a[1])0<l.openSliceCount&&l.endSlice(d);else return!1;return!0},syncPtEvent:function(a,c,b,d,l){return e.exec(l.details)?!0:!1}};b.registerSubtype(d);return{SyncParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("workqueue_execute_start",d.prototype.executeStartEvent.bind(this));a.registerEventHandler("workqueue_execute_end",d.prototype.executeEndEvent.bind(this));a.registerEventHandler("workqueue_queue_work",d.prototype.executeQueueWork.bind(this));a.registerEventHandler("workqueue_activate_work",d.prototype.executeActivateWork.bind(this))}var b=tracing.importer.linux_perf.Parser,a=/work struct (.+): function (\S+)/,
-c=/work struct (.+)/;d.prototype={__proto__:b.prototype,executeStartEvent:function(c,b,f,d,k){c=a.exec(k.details);if(!c)return!1;f=this.importer.getOrCreateKernelThread(k.threadName,f,f);f.openSliceTS=d;f.openSlice=c[2];return!0},executeEndEvent:function(a,b,f,d,k){if(!c.exec(k.details))return!1;a=this.importer.getOrCreateKernelThread(k.threadName,f,f);a.openSlice&&(d=new tracing.trace_model.Slice("",a.openSlice,tracing.getStringColorId(a.openSlice),a.openSliceTS,{},d-a.openSliceTS),a.thread.sliceGroup.pushSlice(d));
+c=/work struct (.+)/;d.prototype={__proto__:b.prototype,executeStartEvent:function(c,b,g,d,k){c=a.exec(k.details);if(!c)return!1;g=this.importer.getOrCreateKernelThread(k.threadName,g,g);g.openSliceTS=d;g.openSlice=c[2];return!0},executeEndEvent:function(a,b,g,d,k){if(!c.exec(k.details))return!1;a=this.importer.getOrCreateKernelThread(k.threadName,g,g);a.openSlice&&(d=new tracing.trace_model.Slice("",a.openSlice,tracing.getStringColorId(a.openSlice),a.openSliceTS,{},d-a.openSliceTS),a.thread.sliceGroup.pushSlice(d));
a.openSlice=void 0;return!0},executeQueueWork:function(a,c,b,d,k){return!0},executeActivateWork:function(a,c,b,d,k){return!0}};b.registerSubtype(d);return{WorkqueueParser:d}});"use strict";
-base.exportTo("base",function(){function d(){}d.prototype={addEventListener:function(a,c){this.listeners_||(this.listeners_=Object.create(null));if(a in this.listeners_){var b=this.listeners_[a];0>b.indexOf(c)&&b.push(c)}else this.listeners_[a]=[c]},removeEventListener:function(a,c){if(this.listeners_&&a in this.listeners_){var b=this.listeners_[a],g=b.indexOf(c);0<=g&&(1==b.length?delete this.listeners_[a]:b.splice(g,1))}},dispatchEvent:function(a){if(!this.listeners_)return!0;var c=this;a.__defineGetter__("target",
-function(){return c});a.preventDefault=function(){this.returnValue=!1};var b=a.type,g=0;if(b in this.listeners_)for(var b=this.listeners_[b].concat(),f=0,d;d=b[f];f++)g=d.handleEvent?g|!1===d.handleEvent.call(d,a):g|!1===d.call(this,a);return!g&&a.returnValue},hasEventListener:function(a){return void 0!==this.listeners_[a]}};var b={decorate:function(a){for(var c in b)if("decorate"!=c){var e=b[c];"function"===typeof e&&(a[c]=e)}a.listenerCounts_={}},addEventListener:function(a,c,b){this.__proto__.addEventListener.call(this,
+base.exportTo("base",function(){function d(){}d.prototype={addEventListener:function(a,c){this.listeners_||(this.listeners_=Object.create(null));if(a in this.listeners_){var b=this.listeners_[a];0>b.indexOf(c)&&b.push(c)}else this.listeners_[a]=[c]},removeEventListener:function(a,c){if(this.listeners_&&a in this.listeners_){var b=this.listeners_[a],f=b.indexOf(c);0<=f&&(1==b.length?delete this.listeners_[a]:b.splice(f,1))}},dispatchEvent:function(a){if(!this.listeners_)return!0;var c=this;a.__defineGetter__("target",
+function(){return c});a.preventDefault=function(){this.returnValue=!1};var b=a.type,f=0;if(b in this.listeners_)for(var b=this.listeners_[b].concat(),g=0,d;d=b[g];g++)f=d.handleEvent?f|!1===d.handleEvent.call(d,a):f|!1===d.call(this,a);return!f&&a.returnValue},hasEventListener:function(a){return void 0!==this.listeners_[a]}};var b={decorate:function(a){for(var c in b)if("decorate"!=c){var e=b[c];"function"===typeof e&&(a[c]=e)}a.listenerCounts_={}},addEventListener:function(a,c,b){this.__proto__.addEventListener.call(this,
a,c,b);void 0===this.listenerCounts_[a]&&(this.listenerCounts_[a]=0);this.listenerCounts_[a]++},removeEventListener:function(a,c,b){this.__proto__.removeEventListener.call(this,a,c,b);this.listenerCounts_[a]--},hasEventListener:function(a){return 0<this.listenerCounts_[a]}};return{EventTarget:d,EventTargetHelper:b}});"use strict";base.require("base.event_target");
base.exportTo("base",function(){function d(b,a,c){var e=base.doc.createEvent("Event");e.initEvent(b,!!a,!!c);e.__proto__=global.Event.prototype;return e}d.prototype={__proto__:global.Event.prototype};return{Event:d,dispatchSimpleEvent:function(b,a,c,e){a=new d(a,c,e);return b.dispatchEvent(a)}}});"use strict";
base.exportTo("base",function(){function d(){this.isEmpty_=!0;this.max_=this.min_=void 0}d.prototype={__proto__:Object.prototype,reset:function(){this.isEmpty_=!0;this.max_=this.min_=void 0},get isEmpty(){return this.isEmpty_},addRange:function(b){b.isEmpty||(this.addValue(b.min),this.addValue(b.max))},addValue:function(b){this.isEmpty_?(this.min_=this.max_=b,this.isEmpty_=!1):(this.max_=Math.max(this.max_,b),this.min_=Math.min(this.min_,b))},get min(){return this.isEmpty_?void 0:this.min_},get max(){return this.isEmpty_?
void 0:this.max_},get range(){return this.isEmpty_?void 0:this.max_-this.min_},get center(){return 0.5*(this.min_+this.max_)}};d.compareByMinTimes=function(b,a){return b.isEmpty||a.isEmpty?b.isEmpty&&!a.isEmpty?-1:!b.isEmpty&&a.isEmpty?1:0:b.min_-a.min_};return{Range:d}});"use strict";
base.exportTo("tracing",function(){function d(){}function b(a){this.text_=a.toLowerCase()}function a(a){this.categories_={};a=a||[];for(var b=0;b<a.length;b++)this.addCategory(a[b])}d.prototype={__proto__:Object.prototype,matchCounter:function(a){return!0},matchCpu:function(a){return!0},matchProcess:function(a){return!0},matchSlice:function(a){return!0},matchThread:function(a){return!0}};b.prototype={__proto__:d.prototype,matchCounter:function(a){return 0===this.text_.length||void 0===a.name?!1:-1!==
-a.name.toLowerCase().indexOf(this.text_)},matchSlice:function(a){return 0===this.text_.length||void 0===a.title?!1:-1!==a.title.toLowerCase().indexOf(this.text_)}};a.prototype={__proto__:d.prototype,addCategory:function(a){this.categories_[a]=!0},matchCounter:function(a){return a.category?!this.categories_[a.category]:!0},matchSlice:function(a){return a.category?!this.categories_[a.category]:!0}};return{filterCounterArray:function(a,b){if(void 0===a)return b;for(var g=[],f=0;f<b.length;++f)a.matchCounter(b[f])&&
-g.push(b[f]);return g},filterSliceArray:function(a,b){if(void 0===a)return b;for(var g=[],f=0;f<b.length;++f)a.matchSlice(b[f])&&g.push(b[f]);return g},Filter:d,TitleFilter:b,CategoryFilter:a}});"use strict";base.exportTo("base",function(){var d=1;return{GUID:{allocate:function(){return d++}}}});"use strict";base.require("base.guid");base.require("base.range");
-base.exportTo("tracing.trace_model",function(){function d(b,a,c,e){this.guid_=base.GUID.allocate();this.parent=b;this.id=a;this.category=c||"";this.name=e;this.seriesNames=[];this.seriesColors=[];this.timestamps=[];this.samples=[];this.bounds=new base.Range}d.prototype={__proto__:Object.prototype,get guid(){return this.guid_},toJSON:function(){for(var b={},a=Object.keys(this),c=0;c<a.length;c++){var e=a[c];"function"!=typeof this[e]&&(b[e]="parent"==e?this[e].guid:this[e])}return b},get numSeries(){return this.seriesNames.length},
-get numSamples(){return this.timestamps.length},getSampleValue:function(b,a){return this.samples[b*this.numSeries+a]},getSampleStatistics:function(b){b.sort();for(var a=this.numSeries,c=[],e=0;e<a;++e){for(var g=0,f=Number.MAX_VALUE,d=-Number.MAX_VALUE,k=0;k<b.length;k++)var l=b[k],g=g+this.getSampleValue(l,e),f=Math.min(this.getSampleValue(l,e),f),d=Math.max(this.getSampleValue(l,e),d);g/=b.length;k=this.getSampleValue(b[0],e);l=this.getSampleValue(b[b.length-1],e);c.push({min:f,max:d,avg:g,start:k,
-end:l})}return c},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 Error("seriesNames.length must match seriesColors.length");if(this.numSeries*this.numSamples!=this.samples.length)throw Error("samples.length must be a multiple of numSamples.");this.totals=[];this.maxTotal=0;this.bounds.reset();if(0!=this.samples.length){this.bounds.addValue(this.timestamps[0]);this.bounds.addValue(this.timestamps[this.timestamps.length-
-1]);for(var b=this.numSeries,a=-Infinity,c=0;c<this.timestamps.length;c++){for(var e=0,g=0;g<b;g++)e+=this.samples[c*b+g],this.totals.push(e);e>a&&(a=e)}this.maxTotal=a}}};d.compare=function(b,a){var c=b.parent.compareTo(a);if(0!=c)return c;c=b.name.localeCompare(a.name);return 0==c?b.tid-a.tid:c};return{Counter:d}});"use strict";
-base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,g,f){this.category=b||"";this.title=a;this.start=e;this.colorId=c;this.args=g;this.didNotFinish=!1;void 0!==f&&(this.duration=f)}d.prototype={selected:!1,duration:void 0,get end(){return this.start+this.duration}};return{Slice:d}});"use strict";base.require("base.range");base.require("tracing.trace_model.slice");base.require("tracing.trace_model.counter");
+a.name.toLowerCase().indexOf(this.text_)},matchSlice:function(a){return 0===this.text_.length||void 0===a.title?!1:-1!==a.title.toLowerCase().indexOf(this.text_)}};a.prototype={__proto__:d.prototype,addCategory:function(a){this.categories_[a]=!0},matchCounter:function(a){return a.category?!this.categories_[a.category]:!0},matchSlice:function(a){return a.category?!this.categories_[a.category]:!0}};return{filterCounterArray:function(a,b){if(void 0===a)return b;for(var f=[],g=0;g<b.length;++g)a.matchCounter(b[g])&&
+f.push(b[g]);return f},filterSliceArray:function(a,b){if(void 0===a)return b;for(var f=[],g=0;g<b.length;++g)a.matchSlice(b[g])&&f.push(b[g]);return f},Filter:d,TitleFilter:b,CategoryFilter:a}});"use strict";base.require("base.guid");base.require("base.range");base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e){this.guid_=base.GUID.allocate();this.parent=b;this.id=a;this.category=c||"";this.name=e;this.series_=[];this.bounds=new base.Range}d.prototype={__proto__:Object.prototype,get guid(){return this.guid_},toJSON:function(){for(var b={},a=Object.keys(this),c=0;c<a.length;c++){var e=a[c];"function"!=typeof this[e]&&(b[e]="parent"==e?this[e].guid:this[e])}return b},set timestamps(b){throw Error("Bad counter API. No cookie.");},set seriesNames(b){throw Error("Bad counter API. No cookie.");
+},set seriesColors(b){throw Error("Bad counter API. No cookie.");},set samples(b){throw Error("Bad counter API. No cookie.");},addSeries:function(b){this.series_.push(b)},getSeries:function(b){return this.series_[b]},get series(){return this.series_},get numSeries(){return this.series_.length},get numSamples(){return 0===this.series_.length?0:this.series_[0].length},get timestamps(){return 0===this.series_.length?[]:this.series_[0].timestamps},getSampleStatistics:function(b){b.sort();var a=[];this.series_.forEach(function(c){a.push(c.getStatistics(b))});
+return a},shiftTimestampsForward:function(b){for(var a=0;a<this.series_.length;++a)this.series_[a].shiftTimestampsForward(b)},updateBounds:function(){this.totals=[];this.maxTotal=0;this.bounds.reset();if(0!==this.series_.length){var b=this.series_[0],a=this.series_[this.series_.length-1];this.bounds.addValue(b.getTimestamp(0));this.bounds.addValue(a.getTimestamp(a.length-1));this.maxTotal=-Infinity;for(var c=0;c<b.length;++c){var e=0;this.series_.forEach(function(a){e+=a.getSample(c).value;this.totals.push(e)}.bind(this));
+this.maxTotal=Math.max(e,this.maxTotal)}}}};d.compare=function(b,a){var c=b.parent.compareTo(a);if(0!=c)return c;c=b.name.localeCompare(a.name);return 0==c?b.tid-a.tid:c};return{Counter:d}});"use strict";base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f){this.category=b||"";this.title=a;this.colorId=c;this.start=e;this.args=f;this.didNotFinish=!1}d.prototype={selected:!1,duration:0,get end(){return this.start}};return{TraceModelEvent:d}});"use strict";base.require("tracing.trace_model.trace_model_event");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f,g){tracing.trace_model.TraceModelEvent.call(this,b,a,c,e,f);void 0!==g&&(this.duration=g)}d.prototype={__proto__:tracing.trace_model.TraceModelEvent.prototype,get end(){return this.start+this.duration}};return{Slice:d}});"use strict";base.require("base.range");base.require("tracing.trace_model.slice");base.require("tracing.trace_model.counter");
base.exportTo("tracing.trace_model",function(){function d(a){this.cpuNumber=a;this.slices=[];this.counters={};this.bounds=new base.Range}var b=tracing.trace_model.Counter;d.prototype={getOrCreateCounter:function(a,c){var e;e=a.length?a+"."+c:c;this.counters[e]||(this.counters[e]=new b(this,e,a,c));return this.counters[e]},shiftTimestampsForward:function(a){for(var c=0;c<this.slices.length;c++)this.slices[c].start+=a;for(var b in this.counters)this.counters[b].shiftTimestampsForward(a)},updateBounds:function(){this.bounds.reset();
this.slices.length&&(this.bounds.addValue(this.slices[0].start),this.bounds.addValue(this.slices[this.slices.length-1].end));for(var a in this.counters)this.counters[a].updateBounds(),this.bounds.addRange(this.counters[a].bounds)},addCategoriesToDict:function(a){for(var c=0;c<this.slices.length;c++)a[this.slices[c].category]=!0;for(var b in this.counters)a[this.counters[b].category]=!0}};d.compare=function(a,c){return a.cpuNumber-c.cpuNumber};return{Cpu:d}});"use strict";
-base.exportTo("base",function(){function d(a,c,b){if(0==a.length)return 1;for(var g=0,f=a.length-1,d,k,l=-1;g<=f;)d=Math.floor((g+f)/2),k=c(a[d])-b,0>k?g=d+1:(0<k||(l=d),f=d-1);return-1!=l?l:g}function b(a,c,b,g,f,h){if(0!=a.length&&!(g>f)){var k=d(a,c,g);if(-1!=k&&(0<k&&c(a[k-1])+b(a[k-1],k-1)>=g&&h(a[k-1]),k!=a.length))for(b=a.length;k<b&&!(c(a[k])>=f);k++)h(a[k])}}return{findLowIndexInSortedArray:d,findLowIndexInSortedIntervals:function(a,c,b,g){var f=d(a,c,g);return 0==f?g>=c(a[0])&&g<c(a[0])+
-b(a[0],0)?0:-1:f<a.length?g>=c(a[f])&&g<c(a[f])+b(a[f],f)?f:g>=c(a[f-1])&&g<c(a[f-1])+b(a[f-1],f-1)?f-1:a.length:f==a.length?g>=c(a[f-1])&&g<c(a[f-1])+b(a[f-1],f-1)?f-1:a.length:a.length},iterateOverIntersectingIntervals:b,getIntersectingIntervals:function(a,c,e,g,f){var d=[];b(a,c,e,g,f,function(a){d.push(a)});return d}}});"use strict";
+base.exportTo("base",function(){function d(a,c,b){if(0==a.length)return 1;for(var f=0,g=a.length-1,d,k,l=-1;f<=g;)d=Math.floor((f+g)/2),k=c(a[d])-b,0>k?f=d+1:(0<k||(l=d),g=d-1);return-1!=l?l:f}function b(a,c,b,f,g,h){if(0!=a.length&&!(f>g)){var k=d(a,c,f);if(-1!=k&&(0<k&&c(a[k-1])+b(a[k-1],k-1)>=f&&h(a[k-1]),k!=a.length))for(b=a.length;k<b&&!(c(a[k])>=g);k++)h(a[k])}}return{findLowIndexInSortedArray:d,findLowIndexInSortedIntervals:function(a,c,b,f){var g=d(a,c,f);return 0==g?f>=c(a[0])&&f<c(a[0])+
+b(a[0],0)?0:-1:g<a.length?f>=c(a[g])&&f<c(a[g])+b(a[g],g)?g:f>=c(a[g-1])&&f<c(a[g-1])+b(a[g-1],g-1)?g-1:a.length:g==a.length?f>=c(a[g-1])&&f<c(a[g-1])+b(a[g-1],g-1)?g-1:a.length:a.length},iterateOverIntersectingIntervals:b,getIntersectingIntervals:function(a,c,e,f,g){var d=[];b(a,c,e,f,g,function(a){d.push(a)});return d}}});"use strict";
base.exportTo("base",function(){function d(b,a){if(b instanceof Object)if(b instanceof Array)for(var c=0;c<b.length;c++)a(b,c,b[c]),d(b[c],a);else for(c in b){var e=b[c];a(b,c,e);d(e,a)}}return{asArray:function(b){for(var a=[],c=0;c<b.length;c++)a.push(b[c]);return a},concatenateArrays:function(){for(var b=[],a=0;a<arguments.length;a++){if(!(arguments[a]instanceof Array))throw Error("Arguments "+a+"is not an array");b.push.apply(b,arguments[a])}return b},compareArrays:function(b,a,c){for(var e=Math.min(b.length,
-a.length),g=0;g<e;g++){var f=c(b[g],a[g]);if(f)return f}return b.length==a.length?0:void 0===b[g]?-1:1},comparePossiblyUndefinedValues:function(b,a,c){return void 0!==b&&void 0!==a?c(b,a):void 0!==b?-1:void 0!==a?1:0},dictionaryKeys:function(b){var a=[],c;for(c in b)a.push(c);return a},dictionaryValues:function(b){var a=[],c;for(c in b)a.push(b[c]);return a},iterItems:function(b,a,c){c=c||this;for(var e in b)a.call(c,e,b[e])},iterObjectFieldsRecursively:d}});"use strict";base.require("base.iteration_helpers");
+a.length),f=0;f<e;f++){var g=c(b[f],a[f]);if(g)return g}return b.length==a.length?0:void 0===b[f]?-1:1},comparePossiblyUndefinedValues:function(b,a,c){return void 0!==b&&void 0!==a?c(b,a):void 0!==b?-1:void 0!==a?1:0},dictionaryKeys:function(b){var a=[],c;for(c in b)a.push(c);return a},dictionaryValues:function(b){var a=[],c;for(c in b)a.push(b[c]);return a},iterItems:function(b,a,c){c=c||this;for(var e in b)a.call(c,e,b[e])},iterObjectFieldsRecursively:d}});"use strict";base.require("base.iteration_helpers");
base.exportTo("base",function(){return{addSingletonGetter:function(d){d.getInstance=function(){return d.instance_||(d.instance_=new d)}},tracedFunction:function(d,b,a){return function(){console.time(b);try{d.apply(a,arguments)}finally{console.timeEnd(b)}}},normalizeException:function(d){return"string"==typeof d?{message:d,stack:["<unknown>"]}:{message:d.message,stack:d.stack?d.stack:["<unknown>"]}},instantiateTemplate:function(d){return document.querySelector(d).content.cloneNode(!0)},stackTrace:function(){var d=
Error().stack+"",d=d.split("\n");return d.slice(2)}}});"use strict";
base.exportTo("tracing.trace_model",function(){function d(b,a,c){this.objectInstance=b;this.ts=a;this.args=c;this.selected=!1}d.prototype={__proto__:Object.prototype,preInitialize:function(){},initialize:function(){}};d.nameToConstructorMap_={};d.register=function(b,a){if(d.nameToConstructorMap_[b])throw Error("Constructor already registerd for "+b);d.nameToConstructorMap_[b]=a};d.unregister=function(b){delete d.nameToConstructorMap_[b]};d.getConstructor=function(b){return d.nameToConstructorMap_[b]?
d.nameToConstructorMap_[b]:d};return{ObjectSnapshot:d}});"use strict";base.require("base.range");base.require("base.sorted_array_utils");base.require("tracing.trace_model.object_snapshot");
-base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,g){this.parent=b;this.id=a;this.category=c;this.name=e;this.creationTs=g;this.creationTsWasExplicit=!1;this.deletionTs=Number.MAX_VALUE;this.selected=this.deletionTsWasExplicit=!1;this.colorId=0;this.bounds=new base.Range;this.snapshots=[];this.hasImplicitSnapshots=!1}d.prototype={__proto__:Object.prototype,get typeName(){return this.name},addSnapshot:function(b,a){if(b<this.creationTs)throw Error("Snapshots must be >= instance.creationTs");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f){this.parent=b;this.id=a;this.category=c;this.name=e;this.creationTs=f;this.creationTsWasExplicit=!1;this.deletionTs=Number.MAX_VALUE;this.selected=this.deletionTsWasExplicit=!1;this.colorId=0;this.bounds=new base.Range;this.snapshots=[];this.hasImplicitSnapshots=!1}d.prototype={__proto__:Object.prototype,get typeName(){return this.name},addSnapshot:function(b,a){if(b<this.creationTs)throw Error("Snapshots must be >= instance.creationTs");
if(b>=this.deletionTs)throw Error("Snapshots cannot be added after an objects deletion timestamp.");var c;if(0<this.snapshots.length){c=this.snapshots[this.snapshots.length-1];if(c.ts==b)throw Error("Snapshots already exists at this time!");if(b<c.ts)throw Error("Snapshots must be added in increasing timestamp order");}c=new (tracing.trace_model.ObjectSnapshot.getConstructor(this.name))(this,b,a);this.snapshots.push(c);return c},wasDeleted:function(b){var a;if(0<this.snapshots.length&&(a=this.snapshots[this.snapshots.length-
1],a.ts>b))throw Error("Instance cannot be deleted at ts="+b+". A snapshot exists that is older.");this.deletionTs=b;this.deletionTsWasExplicit=!0},preInitialize:function(){for(var b=0;b<this.snapshots.length;b++)this.snapshots[b].preInitialize()},initialize:function(){for(var b=0;b<this.snapshots.length;b++)this.snapshots[b].initialize()},getSnapshotAt:function(b){if(b<this.creationTs){if(this.creationTsWasExplicit)throw Error("ts must be within lifetime of this instance");return this.snapshots[0]}if(b>
this.deletionTs)throw Error("ts must be within lifetime of this instance");var a=this.snapshots;b=base.findLowIndexInSortedIntervals(a,function(a){return a.ts},function(c,b){return b==a.length-1?a[b].objectInstance.deletionTs:a[b+1].ts-a[b].ts},b);return 0>b?this.snapshots[0]:b>=this.snapshots.length?this.snapshots[this.snapshots.length-1]:this.snapshots[b]},updateBounds:function(){this.bounds.reset();this.bounds.addValue(this.creationTs);this.deletionTs!=Number.MAX_VALUE?this.bounds.addValue(this.deletionTs):
0<this.snapshots.length&&this.bounds.addValue(this.snapshots[this.snapshots.length-1].ts)},shiftTimestampsForward:function(b){this.creationTs+=b;this.deletionTs!=Number.MAX_VALUE&&(this.deletionTs+=b);this.snapshots.forEach(function(a){a.ts+=b})}};d.nameToConstructorMap_={};d.register=function(b,a){if(d.nameToConstructorMap_[b])throw Error("Constructor already registerd for "+b);d.nameToConstructorMap_[b]=a};d.unregister=function(b){delete d.nameToConstructorMap_[b]};d.getConstructor=function(b){return d.nameToConstructorMap_[b]?
d.nameToConstructorMap_[b]:d};return{ObjectInstance:d}});"use strict";base.require("base.range");base.require("base.sorted_array_utils");
base.exportTo("tracing.trace_model",function(){function d(b,a,c){this.createObjectInstanceFunction_=b;this.parent=a;this.id=c;this.instances=[]}d.prototype={idWasCreated:function(b,a,c){if(0==this.instances.length)return this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c)),this.instances[0].creationTsWasExplicit=!0,this.instances[0];var e=this.instances[this.instances.length-1];if(c<e.deletionTs)throw Error("Mutation of the TimeToObjectInstanceMap must be done in ascending timestamp order.");
-e=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c);e.creationTsWasExplicit=!0;this.instances.push(e);return e},addSnapshot:function(b,a,c,e){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c));var g=base.findLowIndexInSortedIntervals(this.instances,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},c);if(0>g){g=this.instances[0];if(c>g.deletionTs||g.creationTsWasExplicit)throw Error("At the provided timestamp, no instance was still alive");
-if(0!=g.snapshots.length)throw Error("Cannot shift creationTs forward, snapshots have been added. First snap was at ts="+g.snapshots[0].ts+" and creationTs was "+g.creationTs);g.creationTs=c}else if(g>=this.instances.length)if(g=this.instances[this.instances.length-1],c>=g.deletionTs)g=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c),this.instances.push(g);else{for(var f,g=this.instances.length-1;0<=g;g--){b=this.instances[g];if(c>=b.deletionTs)break;!1==b.creationTsWasExplicit&&0==b.snapshots.length&&
-(f=g)}if(void 0===f)throw Error("Cannot add snapshot. No instance was alive that was mutable.");g=this.instances[f];g.creationTs=c}else g=this.instances[g];return g.addSnapshot(c,e)},get lastInstance(){return 0==this.instances.length?void 0:this.instances[this.instances.length-1]},idWasDeleted:function(b,a,c){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c));var e=this.instances[this.instances.length-1];if(c<e.creationTs)throw Error("Cannot delete a id before it was crated");
+e=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c);e.creationTsWasExplicit=!0;this.instances.push(e);return e},addSnapshot:function(b,a,c,e){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c));var f=base.findLowIndexInSortedIntervals(this.instances,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},c);if(0>f){f=this.instances[0];if(c>f.deletionTs||f.creationTsWasExplicit)throw Error("At the provided timestamp, no instance was still alive");
+if(0!=f.snapshots.length)throw Error("Cannot shift creationTs forward, snapshots have been added. First snap was at ts="+f.snapshots[0].ts+" and creationTs was "+f.creationTs);f.creationTs=c}else if(f>=this.instances.length)if(f=this.instances[this.instances.length-1],c>=f.deletionTs)f=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c),this.instances.push(f);else{for(var g,f=this.instances.length-1;0<=f;f--){b=this.instances[f];if(c>=b.deletionTs)break;!1==b.creationTsWasExplicit&&0==b.snapshots.length&&
+(g=f)}if(void 0===g)throw Error("Cannot add snapshot. No instance was alive that was mutable.");f=this.instances[g];f.creationTs=c}else f=this.instances[f];return f.addSnapshot(c,e)},get lastInstance(){return 0==this.instances.length?void 0:this.instances[this.instances.length-1]},idWasDeleted:function(b,a,c){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c));var e=this.instances[this.instances.length-1];if(c<e.creationTs)throw Error("Cannot delete a id before it was crated");
if(e.deletionTs==Number.MAX_VALUE)return e.wasDeleted(c),e;if(c<e.deletionTs)throw Error("id was already deleted earlier.");e=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c);this.instances.push(e);return e},getInstanceAt:function(b){b=base.findLowIndexInSortedIntervals(this.instances,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},b);return 0>b?this.instances[0].creationTsWasExplicit?void 0:this.instances[0]:b>=this.instances.length?void 0:this.instances[b]}};
return{TimeToObjectInstanceMap:d}});"use strict";base.require("base.utils");base.require("base.range");base.require("base.sorted_array_utils");base.require("tracing.trace_model.object_instance");base.require("tracing.trace_model.time_to_object_instance_map");
-base.exportTo("tracing.trace_model",function(){function d(b){this.parent=b;this.bounds=new base.Range;this.instanceMapsById_={};this.instancesByTypeName_={};this.createObjectInstance_=this.createObjectInstance_.bind(this)}d.prototype={__proto__:Object.prototype,createObjectInstance_:function(b,a,c,e,g){b=new (tracing.trace_model.ObjectInstance.getConstructor(e))(b,a,c,e,g);a=b.typeName;c=this.instancesByTypeName_[a];c||(c=[],this.instancesByTypeName_[a]=c);c.push(b);return b},getOrCreateInstanceMap_:function(b){var a=
-this.instanceMapsById_[b];if(a)return a;a=new tracing.trace_model.TimeToObjectInstanceMap(this.createObjectInstance_,this.parent,b);return this.instanceMapsById_[b]=a},idWasCreated:function(b,a,c,e){return this.getOrCreateInstanceMap_(b).idWasCreated(a,c,e)},addSnapshot:function(b,a,c,e,g){b=this.getOrCreateInstanceMap_(b,a,c,e).addSnapshot(a,c,e,g);if(b.objectInstance.category!=a)throw Error("Added snapshot with different category than when it was created");if(b.objectInstance.name!=c)throw Error("Added snapshot with different name than when it was created");
+base.exportTo("tracing.trace_model",function(){function d(b){this.parent=b;this.bounds=new base.Range;this.instanceMapsById_={};this.instancesByTypeName_={};this.createObjectInstance_=this.createObjectInstance_.bind(this)}d.prototype={__proto__:Object.prototype,createObjectInstance_:function(b,a,c,e,f){b=new (tracing.trace_model.ObjectInstance.getConstructor(e))(b,a,c,e,f);a=b.typeName;c=this.instancesByTypeName_[a];c||(c=[],this.instancesByTypeName_[a]=c);c.push(b);return b},getOrCreateInstanceMap_:function(b){var a=
+this.instanceMapsById_[b];if(a)return a;a=new tracing.trace_model.TimeToObjectInstanceMap(this.createObjectInstance_,this.parent,b);return this.instanceMapsById_[b]=a},idWasCreated:function(b,a,c,e){return this.getOrCreateInstanceMap_(b).idWasCreated(a,c,e)},addSnapshot:function(b,a,c,e,f){b=this.getOrCreateInstanceMap_(b,a,c,e).addSnapshot(a,c,e,f);if(b.objectInstance.category!=a)throw Error("Added snapshot with different category than when it was created");if(b.objectInstance.name!=c)throw Error("Added snapshot with different name than when it was created");
return b},idWasDeleted:function(b,a,c,e){if(b=this.getOrCreateInstanceMap_(b,a,c,e).idWasDeleted(a,c,e)){if(b.category!=a)throw Error("Deleting an object with a different category than when it was created");if(b.name!=c)throw Error("Deleting an object with a different name than when it was created");}},autoDeleteObjects:function(b){base.iterItems(this.instanceMapsById_,function(a,c){var e=c.lastInstance;e.deletionTs==Number.MAX_VALUE&&(c.idWasDeleted(e.category,e.name,b),e.deletionTsWasExplicit=!1)})},
getObjectInstanceAt:function(b,a){var c=this.instanceMapsById_[b];return c?c.getInstanceAt(a):void 0},getSnapshotAt:function(b,a){var c=this.getObjectInstanceAt(b,a);return c?c.getSnapshotAt(a):void 0},iterObjectInstances:function(b,a){a=a||this;base.iterItems(this.instanceMapsById_,function(c,e){e.instances.forEach(b,a)})},getAllObjectInstances:function(){var b=[];this.iterObjectInstances(function(a){b.push(a)});return b},getAllInstancesNamed:function(b){return this.instancesByTypeName_[b]},getAllInstancesByTypeName:function(){return this.instancesByTypeName_},
preInitializeAllObjects:function(){this.iterObjectInstances(function(b){b.preInitialize()})},initializeAllObjects:function(){this.iterObjectInstances(function(b){b.initialize()})},initializeInstances:function(){this.iterObjectInstances(function(b){b.initialize()})},updateBounds:function(){this.bounds.reset();this.iterObjectInstances(function(b){b.updateBounds();this.bounds.addRange(b.bounds)},this)},shiftTimestampsForward:function(b){this.iterObjectInstances(function(a){a.shiftTimestampsForward(b)})},
-addCategoriesToDict:function(b){this.iterObjectInstances(function(a){b[a.category]=!0})},toJSON:function(){return{}}};return{ObjectCollection:d}});"use strict";base.require("base.range");base.require("tracing.trace_model.slice");
-base.exportTo("tracing.trace_model",function(){function d(c,b,g,f,d){a.call(this,c,b,g,f,d)}function b(){this.slices=[];this.bounds=new base.Range}var a=tracing.trace_model.Slice;d.prototype={__proto__:a.prototype,toJSON:function(){for(var a={},b=Object.keys(this),g=0;g<b.length;g++){var f=b[g];"function"!=typeof this[f]&&(a[f]="startThread"==f||"endThread"==f?this[f].guid:this[f])}return a},id:void 0,startThread:void 0,endThread:void 0,subSlices:void 0};b.prototype={__proto__:Object.prototype,push:function(a){this.slices.push(a)},
-get length(){return this.slices.length},shiftTimestampsForward:function(a){for(var b=0;b<this.slices.length;b++){var g=this.slices[b];g.start+=a;for(var f=0;f<g.subSlices.length;f++)g.subSlices[f].start+=a}},updateBounds:function(){this.bounds.reset();for(var a=0;a<this.slices.length;a++)this.bounds.addValue(this.slices[a].start),this.bounds.addValue(this.slices[a].end)},computeSubGroups:function(){for(var a={},e=0;e<this.slices.length;++e){var g=this.slices[e],f=g.startThread.guid;a[f]||(a[f]=new b);
-a[f].slices.push(g)}var e=[],d;for(d in a)g=a[d],g.updateBounds(),e.push(g);return e}};return{AsyncSlice:d,AsyncSliceGroup:b}});"use strict";base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,g){this.category=b||"";this.title=a;this.colorId=c;this.start=e;this.args=g}d.prototype={selected:!1,duration:0,get end(){return this.start}};return{Sample:d}});"use strict";base.require("base.range");base.require("tracing.trace_model.slice");base.require("tracing.color_scheme");base.require("tracing.filter");
-base.exportTo("tracing.trace_model",function(){function d(a){this.sliceConstructor=a||b;this.openPartialSlices_=[];this.slices=[];this.bounds=new base.Range}var b=tracing.trace_model.Slice;d.prototype={__proto__:Object.prototype,get length(){return this.slices.length},pushSlice:function(a){this.slices.push(a);return a},pushSlices:function(a){this.slices.push.apply(this.slices,a)},beginSlice:function(a,c,b,g){if(this.openPartialSlices_.length&&b<this.openPartialSlices_[this.openPartialSlices_.length-
-1].start)throw Error("Slices must be added in increasing timestamp order");var f=tracing.getStringColorId(c);a=new this.sliceConstructor(a,c,f,b,g?g:{});this.openPartialSlices_.push(a);return a},isTimestampValidForBeginOrEnd:function(a){return this.openPartialSlices_.length?a>=this.openPartialSlices_[this.openPartialSlices_.length-1].start:!0},get openSliceCount(){return this.openPartialSlices_.length},get mostRecentlyOpenedPartialSlice(){return this.openPartialSlices_.length?this.openPartialSlices_[this.openPartialSlices_.length-
+addCategoriesToDict:function(b){this.iterObjectInstances(function(a){b[a.category]=!0})},toJSON:function(){return{}}};return{ObjectCollection:d}});"use strict";base.require("tracing.trace_model.slice");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f){tracing.trace_model.Slice.apply(this,arguments)}d.prototype={__proto__:tracing.trace_model.Slice.prototype,toJSON:function(){for(var b={},a=Object.keys(this),c=0;c<a.length;c++){var e=a[c];"function"!=typeof this[e]&&(b[e]="startThread"==e||"endThread"==e?this[e].guid:this[e])}return b},id:void 0,startThread:void 0,endThread:void 0,subSlices:void 0};return{AsyncSlice:d}});"use strict";base.require("base.range");base.require("tracing.trace_model.async_slice");
+base.exportTo("tracing.trace_model",function(){function d(){this.slices=[];this.bounds=new base.Range}d.prototype={__proto__:Object.prototype,push:function(b){this.slices.push(b)},get length(){return this.slices.length},shiftTimestampsForward:function(b){for(var a=0;a<this.slices.length;a++){var c=this.slices[a];c.start+=b;for(var e=0;e<c.subSlices.length;e++)c.subSlices[e].start+=b}},updateBounds:function(){this.bounds.reset();for(var b=0;b<this.slices.length;b++)this.bounds.addValue(this.slices[b].start),
+this.bounds.addValue(this.slices[b].end)},computeSubGroups:function(){for(var b={},a=0;a<this.slices.length;++a){var c=this.slices[a],e=c.startThread.guid;b[e]||(b[e]=new d);b[e].slices.push(c)}var a=[],f;for(f in b)c=b[f],c.updateBounds(),a.push(c);return a}};return{AsyncSliceGroup:d}});"use strict";base.require("tracing.trace_model.trace_model_event");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f){tracing.trace_model.TraceModelEvent.apply(this,arguments)}d.prototype={__proto__:tracing.trace_model.TraceModelEvent.prototype};return{Sample:d}});"use strict";base.require("base.range");base.require("tracing.trace_model.slice");base.require("tracing.color_scheme");base.require("tracing.filter");
+base.exportTo("tracing.trace_model",function(){function d(a){this.sliceConstructor=a||b;this.openPartialSlices_=[];this.slices=[];this.bounds=new base.Range}var b=tracing.trace_model.Slice;d.prototype={__proto__:Object.prototype,get length(){return this.slices.length},pushSlice:function(a){this.slices.push(a);return a},pushSlices:function(a){this.slices.push.apply(this.slices,a)},pushInstantEvent:function(a){this.slices.push(a)},beginSlice:function(a,c,b,f){if(this.openPartialSlices_.length&&b<this.openPartialSlices_[this.openPartialSlices_.length-
+1].start)throw Error("Slices must be added in increasing timestamp order");var g=tracing.getStringColorId(c);a=new this.sliceConstructor(a,c,g,b,f?f:{});this.openPartialSlices_.push(a);return a},isTimestampValidForBeginOrEnd:function(a){return this.openPartialSlices_.length?a>=this.openPartialSlices_[this.openPartialSlices_.length-1].start:!0},get openSliceCount(){return this.openPartialSlices_.length},get mostRecentlyOpenedPartialSlice(){return this.openPartialSlices_.length?this.openPartialSlices_[this.openPartialSlices_.length-
1]:void 0},endSlice:function(a){if(!this.openSliceCount)throw Error("endSlice called without an open slice");var c=this.openPartialSlices_[this.openSliceCount-1];this.openPartialSlices_.splice(this.openSliceCount-1,1);if(a<c.start)throw Error("Slice "+c.title+" end time is before its start.");c.duration=a-c.start;this.pushSlice(c);return c},autoCloseOpenSlices:function(a){a||(this.updateBounds(),a=this.bounds.max);for(;0<this.openSliceCount;)this.endSlice(a).didNotFinish=!0},shiftTimestampsForward:function(a){for(var c=
0;c<this.slices.length;c++){var b=this.slices[c];b.start+=a}for(c=0;c<this.openPartialSlices_.length;c++)b=this.openPartialSlices_[i],b.start+=a},updateBounds:function(){this.bounds.reset();for(var a=0;a<this.slices.length;a++)this.bounds.addValue(this.slices[a].start),this.bounds.addValue(this.slices[a].end);this.openPartialSlices_.length&&(this.bounds.addValue(this.openPartialSlices_[0].start),this.bounds.addValue(this.openPartialSlices_[this.openPartialSlices_.length-1].start))},copySlice:function(a){var c=
-new this.sliceConstructor(a.category,a.title,a.colorId,a.start,a.args,a.duration);c.didNotFinish=a.didNotFinish;return c}};d.merge=function(a,c){if(0<a.openPartialSlices_.length)throw Error("groupA has open partial slices");if(0<c.openPartialSlices_.length)throw Error("groupB has open partial slices");for(var b=new d,g=a.slices,f=c.slices,h=g.length-1,k=f.length-1,l=[],m=[],n=function(a){for(var c=0;c<m.length;c++){var f=m[c],g=f.end;if(a<f.start||g<a)throw Error("slice should not be split");var d=
-b.copySlice(f);f.start=a;f.duration=g-a;f.title+=" (cont.)";d.duration=a-d.start;m[c]=d;b.pushSlice(d)}},p=function(a){for(;0<l.length||0<m.length;){var c=l[l.length-1],b=m[m.length-1],c=c&&c.start,b=b&&b.start;if((void 0===c||c<a)&&(void 0===b||b<a))break;void 0===b||c>b?(n(c),l.pop()):m.pop()}};0<=h||0<=k;){var q=g[h],s=f[k];void 0===q||void 0!==s&&q.end<s.end?(q=b.copySlice(s),s=!0,k--):(q=b.copySlice(q),s=!1,h--);p(q.end);b.pushSlice(q);s?m.push(q):(n(q.end),l.push(q))}p();b.slices.reverse();
+new this.sliceConstructor(a.category,a.title,a.colorId,a.start,a.args,a.duration);c.didNotFinish=a.didNotFinish;return c}};d.merge=function(a,c){if(0<a.openPartialSlices_.length)throw Error("groupA has open partial slices");if(0<c.openPartialSlices_.length)throw Error("groupB has open partial slices");for(var b=new d,f=a.slices,g=c.slices,h=f.length-1,k=g.length-1,l=[],m=[],n=function(a){for(var c=0;c<m.length;c++){var f=m[c],g=f.end;if(a<f.start||g<a)throw Error("slice should not be split");var d=
+b.copySlice(f);f.start=a;f.duration=g-a;f.title+=" (cont.)";d.duration=a-d.start;m[c]=d;b.pushSlice(d)}},p=function(a){for(;0<l.length||0<m.length;){var c=l[l.length-1],b=m[m.length-1],c=c&&c.start,b=b&&b.start;if((void 0===c||c<a)&&(void 0===b||b<a))break;void 0===b||c>b?(n(c),l.pop()):m.pop()}};0<=h||0<=k;){var q=f[h],t=g[k];void 0===q||void 0!==t&&q.end<t.end?(q=b.copySlice(t),t=!0,k--):(q=b.copySlice(q),t=!1,h--);p(q.end);b.pushSlice(q);t?m.push(q):(n(q.end),l.push(q))}p();b.slices.reverse();
return b};return{SliceGroup:d}});"use strict";base.require("base.guid");base.require("base.range");base.require("tracing.trace_model.slice");base.require("tracing.trace_model.slice_group");base.require("tracing.trace_model.async_slice_group");base.require("tracing.trace_model.sample");
base.exportTo("tracing.trace_model",function(){function d(c,b,e,d,l,m){a.call(this,c,b,e,d,l,m);this.subSlices=[]}function b(a,b){this.guid_=base.GUID.allocate();if(!a)throw Error("Parent must be provided.");this.parent=a;this.sortIndex=0;this.tid=b;this.sliceGroup=new c(d);this.cpuSlices=void 0;this.samples_=[];this.kernelSliceGroup=new c;this.asyncSliceGroup=new e;this.bounds=new base.Range;this.ephemeralSettings={}}var a=tracing.trace_model.Slice,c=tracing.trace_model.SliceGroup,e=tracing.trace_model.AsyncSliceGroup;
d.prototype={__proto__:a.prototype};b.prototype={get guid(){return this.guid_},compareTo:function(a){return b.compare(this,a)},toJSON:function(){for(var a={},c=Object.keys(this),b=0;b<c.length;b++){var e=c[b];"function"!=typeof this[e]&&(a[e]="parent"==e?this[e].guid:this[e])}return a},addSample:function(a,c,b,e){if(this.samples_.length&&b<this.samples_[this.samples_.length-1].start)throw Error("Samples must be added in increasing timestamp order.");var d=tracing.getStringColorId(c);a=new tracing.trace_model.Sample(a,
c,d,b,e?e:{});this.samples_.push(a);return a},get samples(){return this.samples_},name:void 0,shiftTimestampsForward:function(a){this.sliceGroup.shiftTimestampsForward(a);if(this.cpuSlices)for(var c=0;c<this.cpuSlices.length;c++)this.cpuSlices[c].start+=a;if(this.samples_.length)for(c=0;c<this.samples_.length;c++)this.samples_[c].start+=a;this.kernelSliceGroup.shiftTimestampsForward(a);this.asyncSliceGroup.shiftTimestampsForward(a)},get isEmpty(){return this.sliceGroup.length||this.sliceGroup.openSliceCount||
this.cpuSlices&&this.cpuSlices.length||this.kernelSliceGroup.length||this.asyncSliceGroup.length||this.samples_.length?!1:!0},updateBounds:function(){this.bounds.reset();this.sliceGroup.updateBounds();this.bounds.addRange(this.sliceGroup.bounds);this.kernelSliceGroup.updateBounds();this.bounds.addRange(this.kernelSliceGroup.bounds);this.asyncSliceGroup.updateBounds();this.bounds.addRange(this.asyncSliceGroup.bounds);this.cpuSlices&&this.cpuSlices.length&&(this.bounds.addValue(this.cpuSlices[0].start),
this.bounds.addValue(this.cpuSlices[this.cpuSlices.length-1].end));this.samples_.length&&(this.bounds.addValue(this.samples_[0].start),this.bounds.addValue(this.samples_[this.samples_.length-1].end))},addCategoriesToDict:function(a){for(var c=0;c<this.sliceGroup.length;c++)a[this.sliceGroup.slices[c].category]=!0;for(c=0;c<this.kernelSliceGroup.length;c++)a[this.kernelSliceGroup.slices[c].category]=!0;for(c=0;c<this.asyncSliceGroup.length;c++)a[this.asyncSliceGroup.slices[c].category]=!0;for(c=0;c<
-this.samples_.length;c++)a[this.samples_[c].category]=!0},autoCloseOpenSlices:function(a){this.sliceGroup.autoCloseOpenSlices(a)},mergeKernelWithUserland:function(){if(0<this.kernelSliceGroup.length){var a=c.merge(this.sliceGroup,this.kernelSliceGroup);this.sliceGroup.slices=a.slices;this.kernelSliceGroup=new c;this.updateBounds()}},get userFriendlyName(){return this.name||this.tid},get userFriendlyDetails(){return"tid: "+this.tid+(this.name?", name: "+this.name:"")},getSettingsKey:function(){if(this.name){var a=
-this.parent.getSettingsKey();return a?a+"."+this.name:void 0}}};b.compare=function(a,c){var b=a.parent.compareTo(c.parent);return b||(b=a.sortIndex-c.sortIndex)?b:(b=base.comparePossiblyUndefinedValues(a.name,c.name,function(a,c){return a.localeCompare(c)}))?b:a.tid-c.tid};return{ThreadSlice:d,Thread:b}});"use strict";
-base.exportTo("base",function(){function d(){return d}var b=localStorage;d.get=function(a,c,e){a=d.namespace_(a,e);var g=b.getItem(a);if(null===g||void 0===g)return c;try{return JSON.parse(g).value}catch(f){return b.removeItem(d.namespace_(a,e)),c}};d.set=function(a,c,e){if(void 0===c)throw Error("Settings.set: value must not be undefined");c=JSON.stringify({value:c});b.setItem(d.namespace_(a,e),c)};d.keys=function(a){var c=[];a=a||"";for(var e=0;e<b.length;e++){var g=b.key(e);d.isnamespaced_(g,a)&&
-c.push(d.unnamespace_(g,a))}return c};d.isnamespaced_=function(a,c){return 0==a.indexOf(d.normalize_(c))};d.namespace_=function(a,c){return d.normalize_(c)+a};d.unnamespace_=function(a,c){return a.replace(d.normalize_(c),"")};d.normalize_=function(a){return d.NAMESPACE+(a?a+".":"")};d.setAlternativeStorageInstance=function(a){b=a};d.getAlternativeStorageInstance=function(){return b===localStorage?void 0:b};d.NAMESPACE="trace-viewer";return{Settings:d}});"use strict";base.require("base.settings");
-base.exportTo("tracing",function(){function d(a){this.model=a;this.objectsByKey_=[];this.nonuniqueKeys_=[];this.buildObjectsByKeyMap_();this.removeNonuniqueKeysFromSettings_()}var b=base.Settings;d.prototype={buildObjectsByKeyMap_:function(){var a=[this.model.kernel];a.push.apply(a,base.dictionaryValues(this.model.processes));a.push.apply(a,this.model.getAllThreads());for(var c={},b=0;b<a.length;b++){var g=a[b],f=g.getSettingsKey();f&&(c[f]=void 0===c[f]?g:"nonuniqueKey")}var d={};base.dictionaryKeys(c).forEach(function(a){"nonuniqueKey"===
-c[a]&&(delete c[a],d[a]=!0)});this.nonuniqueKeys=d;this.objectsByKey_=c},removeNonuniqueKeysFromSettings_:function(){var a=b.get("trace_model_settings",{}),c=!1;base.dictionaryKeys(a).forEach(function(b){this.nonuniqueKeys[b]&&(c=!0,delete a[b])},this);c&&b.set("trace_model_settings",a)},hasUniqueSettingKey:function(a){return(a=a.getSettingsKey())?void 0!==this.objectsByKey_[a]:!1},getSettingFor:function(a,c,e){var g=a.getSettingsKey();if(!g||!this.objectsByKey_[g])return c=a.ephemeralSettings[c],
-void 0!==c?c:e;a=b.get("trace_model_settings",{});a[g]||(a[g]={});c=a[g][c];return void 0!==c?c:e},setSettingFor:function(a,c,e){var g=a.getSettingsKey();g&&this.objectsByKey_[g]?(a=b.get("trace_model_settings",{}),a[g]||(a[g]={}),a[g][c]=e,b.set("trace_model_settings",a)):a.ephemeralSettings[c]=e}};return{TraceModelSettings:d}});"use strict";base.require("base.guid");base.require("base.range");base.require("tracing.trace_model.counter");base.require("tracing.trace_model.object_collection");base.require("tracing.trace_model.thread");
+this.samples_.length;c++)a[this.samples_[c].category]=!0},autoCloseOpenSlices:function(a){this.sliceGroup.autoCloseOpenSlices(a);this.kernelSliceGroup.autoCloseOpenSlices(a)},mergeKernelWithUserland:function(){if(0<this.kernelSliceGroup.length){var a=c.merge(this.sliceGroup,this.kernelSliceGroup);this.sliceGroup.slices=a.slices;this.kernelSliceGroup=new c;this.updateBounds()}},get userFriendlyName(){return this.name||this.tid},get userFriendlyDetails(){return"tid: "+this.tid+(this.name?", name: "+
+this.name:"")},getSettingsKey:function(){if(this.name){var a=this.parent.getSettingsKey();return a?a+"."+this.name:void 0}}};b.compare=function(a,c){var b=a.parent.compareTo(c.parent);return b||(b=a.sortIndex-c.sortIndex)?b:(b=base.comparePossiblyUndefinedValues(a.name,c.name,function(a,c){return a.localeCompare(c)}))?b:a.tid-c.tid};return{ThreadSlice:d,Thread:b}});"use strict";
+base.exportTo("base",function(){function d(){return d}var b=localStorage;d.get=function(a,c,e){a=d.namespace_(a,e);var f=b.getItem(a);if(null===f||void 0===f)return c;try{return JSON.parse(f).value}catch(g){return b.removeItem(d.namespace_(a,e)),c}};d.set=function(a,c,e){if(void 0===c)throw Error("Settings.set: value must not be undefined");c=JSON.stringify({value:c});b.setItem(d.namespace_(a,e),c)};d.keys=function(a){var c=[];a=a||"";for(var e=0;e<b.length;e++){var f=b.key(e);d.isnamespaced_(f,a)&&
+c.push(d.unnamespace_(f,a))}return c};d.isnamespaced_=function(a,c){return 0==a.indexOf(d.normalize_(c))};d.namespace_=function(a,c){return d.normalize_(c)+a};d.unnamespace_=function(a,c){return a.replace(d.normalize_(c),"")};d.normalize_=function(a){return d.NAMESPACE+(a?a+".":"")};d.setAlternativeStorageInstance=function(a){b=a};d.getAlternativeStorageInstance=function(){return b===localStorage?void 0:b};d.NAMESPACE="trace-viewer";return{Settings:d}});"use strict";base.require("base.settings");
+base.exportTo("tracing",function(){function d(a){this.model=a;this.objectsByKey_=[];this.nonuniqueKeys_=[];this.buildObjectsByKeyMap_();this.removeNonuniqueKeysFromSettings_()}var b=base.Settings;d.prototype={buildObjectsByKeyMap_:function(){var a=[this.model.kernel];a.push.apply(a,base.dictionaryValues(this.model.processes));a.push.apply(a,this.model.getAllThreads());for(var c={},b=0;b<a.length;b++){var f=a[b],g=f.getSettingsKey();g&&(c[g]=void 0===c[g]?f:"nonuniqueKey")}var d={};base.dictionaryKeys(c).forEach(function(a){"nonuniqueKey"===
+c[a]&&(delete c[a],d[a]=!0)});this.nonuniqueKeys=d;this.objectsByKey_=c},removeNonuniqueKeysFromSettings_:function(){var a=b.get("trace_model_settings",{}),c=!1;base.dictionaryKeys(a).forEach(function(b){this.nonuniqueKeys[b]&&(c=!0,delete a[b])},this);c&&b.set("trace_model_settings",a)},hasUniqueSettingKey:function(a){return(a=a.getSettingsKey())?void 0!==this.objectsByKey_[a]:!1},getSettingFor:function(a,c,e){var f=a.getSettingsKey();if(!f||!this.objectsByKey_[f])return c=a.ephemeralSettings[c],
+void 0!==c?c:e;a=b.get("trace_model_settings",{});a[f]||(a[f]={});c=a[f][c];return void 0!==c?c:e},setSettingFor:function(a,c,e){var f=a.getSettingsKey();f&&this.objectsByKey_[f]?(a=b.get("trace_model_settings",{}),a[f]||(a[f]={}),a[f][c]=e,b.set("trace_model_settings",a)):a.ephemeralSettings[c]=e}};return{TraceModelSettings:d}});"use strict";base.require("base.guid");base.require("base.range");base.require("tracing.trace_model.counter");base.require("tracing.trace_model.object_collection");base.require("tracing.trace_model.thread");
base.require("tracing.trace_model_settings");
base.exportTo("tracing.trace_model",function(){function d(a){if(!a)throw Error("Must provide a model");this.guid_=base.GUID.allocate();this.model=a;this.threads={};this.counters={};this.objects=new tracing.trace_model.ObjectCollection(this);this.bounds=new base.Range;this.sortIndex=0;this.ephemeralSettings={}}var b=tracing.trace_model.Thread,a=tracing.trace_model.Counter;d.compare=function(a,b){return a.sortIndex-b.sortIndex};d.prototype={get guid(){return this.guid_},get numThreads(){var a=0,b;for(b in this.threads)a++;
-return a},toJSON:function(){for(var a={},b=Object.keys(this),g=0;g<b.length;g++){var f=b[g];"function"!=typeof this[f]&&"model"!=f&&(a[f]=this[f])}return a},shiftTimestampsForward:function(a){for(var b in this.threads)this.threads[b].shiftTimestampsForward(a);for(var g in this.counters)this.counters[g].shiftTimestampsForward(a);this.objects.shiftTimestampsForward(a)},autoCloseOpenSlices:function(a){for(var b in this.threads)this.threads[b].autoCloseOpenSlices(a)},autoDeleteObjects:function(a){this.objects.autoDeleteObjects(a)},
+return a},toJSON:function(){for(var a={},b=Object.keys(this),f=0;f<b.length;f++){var g=b[f];"function"!=typeof this[g]&&"model"!=g&&(a[g]=this[g])}return a},shiftTimestampsForward:function(a){for(var b in this.threads)this.threads[b].shiftTimestampsForward(a);for(var f in this.counters)this.counters[f].shiftTimestampsForward(a);this.objects.shiftTimestampsForward(a)},autoCloseOpenSlices:function(a){for(var b in this.threads)this.threads[b].autoCloseOpenSlices(a)},autoDeleteObjects:function(a){this.objects.autoDeleteObjects(a)},
preInitializeObjects:function(){this.objects.preInitializeAllObjects()},initializeObjects:function(){this.objects.initializeAllObjects()},mergeKernelWithUserland:function(){for(var a in this.threads)this.threads[a].mergeKernelWithUserland()},updateBounds:function(){this.bounds.reset();for(var a in this.threads)this.threads[a].updateBounds(),this.bounds.addRange(this.threads[a].bounds);for(var b in this.counters)this.counters[b].updateBounds(),this.bounds.addRange(this.counters[b].bounds);this.objects.updateBounds();
-this.bounds.addRange(this.objects.bounds)},addCategoriesToDict:function(a){for(var b in this.threads)this.threads[b].addCategoriesToDict(a);for(var g in this.counters)a[this.counters[g].category]=!0;this.objects.addCategoriesToDict(a)},findAllThreadsNamed:function(a){var b=[],g;for(g in this.threads){var f=this.threads[g];f.name==a&&b.push(f)}return b},pruneEmptyContainers:function(){var a={},b;for(b in this.threads){var g=this.threads[b];g.isEmpty||(a[b]=g)}this.threads=a},getOrCreateThread:function(a){this.threads[a]||
-(this.threads[a]=new b(this,a));return this.threads[a]},getOrCreateCounter:function(c,b){var g=c+"."+b;this.counters[g]||(this.counters[g]=new a(this,g,c,b));return this.counters[g]},getSettingsKey:function(){throw Error("Not implemented");}};return{ProcessBase:d}});"use strict";base.require("tracing.trace_model.cpu");base.require("tracing.trace_model.process_base");
+this.bounds.addRange(this.objects.bounds)},addCategoriesToDict:function(a){for(var b in this.threads)this.threads[b].addCategoriesToDict(a);for(var f in this.counters)a[this.counters[f].category]=!0;this.objects.addCategoriesToDict(a)},findAllThreadsNamed:function(a){var b=[],f;for(f in this.threads){var g=this.threads[f];g.name==a&&b.push(g)}return b},pruneEmptyContainers:function(){var a={},b;for(b in this.threads){var f=this.threads[b];f.isEmpty||(a[b]=f)}this.threads=a},getOrCreateThread:function(a){this.threads[a]||
+(this.threads[a]=new b(this,a));return this.threads[a]},getOrCreateCounter:function(c,b){var f=c+"."+b;this.counters[f]||(this.counters[f]=new a(this,f,c,b));return this.counters[f]},getSettingsKey:function(){throw Error("Not implemented");}};return{ProcessBase:d}});"use strict";base.require("tracing.trace_model.cpu");base.require("tracing.trace_model.process_base");
base.exportTo("tracing.trace_model",function(){function d(c){if(void 0===c)throw Error("model must be provided");a.call(this,c);this.cpus={}}var b=tracing.trace_model.Cpu,a=tracing.trace_model.ProcessBase;d.compare=function(a,b){return 0};d.prototype={__proto__:a.prototype,compareTo:function(a){return d.compare(this,a)},get userFriendlyName(){return"Kernel"},get userFriendlyDetails(){return"Kernel"},getOrCreateCpu:function(a){this.cpus[a]||(this.cpus[a]=new b(a));return this.cpus[a]},shiftTimestampsForward:function(c){a.prototype.shiftTimestampsForward.call(this);
for(var b in this.cpus)this.cpus[b].shiftTimestampsForward(c)},updateBounds:function(){a.prototype.updateBounds.call(this);for(var c in this.cpus){var b=this.cpus[c];b.updateBounds();this.bounds.addRange(b.bounds)}},addCategoriesToDict:function(c){a.prototype.addCategoriesToDict.call(this,c);for(var b in this.cpus)this.cpus[b].addCategoriesToDict(c)},getSettingsKey:function(){return"kernel"}};return{Kernel:d}});"use strict";base.require("tracing.trace_model.process_base");
-base.exportTo("tracing.trace_model",function(){function d(b,a){if(void 0===b)throw Error("model must be provided");if(void 0===a)throw Error("pid must be provided");tracing.trace_model.ProcessBase.call(this,b);this.pid=a;this.name=void 0;this.labels=[]}d.compare=function(b,a){var c=tracing.trace_model.ProcessBase.compare(b,a);return c||(c=base.comparePossiblyUndefinedValues(b.name,a.name,function(a,c){return a.localeCompare(c)}))?c:(c=base.compareArrays(b.labels,a.labels,function(a,c){return a.localeCompare(c)}))?
-c:b.pid-a.pid};d.prototype={__proto__:tracing.trace_model.ProcessBase.prototype,compareTo:function(b){return d.compare(this,b)},get userFriendlyName(){var b;b=this.name?this.name:"Process "+this.pid;this.labels.length&&(b+=": "+this.labels.join(", "));return b},get userFriendlyDetails(){return this.name?this.name+" (pid "+this.pid+")":"pid: "+this.pid},getSettingsKey:function(){return this.name?this.labels.length?"processes."+this.name+"."+this.labels.join("."):"processes."+this.name:void 0}};return{Process:d}});
-"use strict";base.require("base.range");base.require("base.events");base.require("tracing.trace_model.process");base.require("tracing.trace_model.kernel");base.require("tracing.filter");
-base.exportTo("tracing",function(){function d(a,b){this.kernel=new c(this);this.processes={};this.importErrors=[];this.metadata=[];this.categories=[];this.bounds=new base.Range;a&&this.importTraces([a],b)}function b(a){this.importPriority=0}var a=tracing.trace_model.Process,c=tracing.trace_model.Kernel;d.importerConstructors_=[];d.registerImporter=function(a){d.importerConstructors_.push(a)};d.prototype={__proto__:base.EventTarget.prototype,get numProcesses(){var a=0,c;for(c in this.processes)a++;
-return a},getOrCreateProcess:function(c){this.processes[c]||(this.processes[c]=new a(this,c));return this.processes[c]},updateCategories_:function(){var a={};this.kernel.addCategoriesToDict(a);for(var c in this.processes)this.processes[c].addCategoriesToDict(a);this.categories=[];for(var b in a)""!=b&&this.categories.push(b)},updateBounds:function(){this.bounds.reset();this.kernel.updateBounds();this.bounds.addRange(this.kernel.bounds);for(var a in this.processes)this.processes[a].updateBounds(),
-this.bounds.addRange(this.processes[a].bounds)},shiftWorldToZero:function(){if(!this.bounds.isEmpty){var a=this.bounds.min;this.kernel.shiftTimestampsForward(-a);for(var c in this.processes)this.processes[c].shiftTimestampsForward(-a);this.updateBounds()}},getAllThreads:function(){var a=[],c;for(c in this.kernel.threads)a.push(d.threads[c]);for(var b in this.processes){var d=this.processes[b];for(c in d.threads)a.push(d.threads[c])}return a},getAllProcesses:function(){var a=[],c;for(c in this.processes)a.push(this.processes[c]);
-return a},getAllCounters:function(){var a=[];a.push.apply(a,base.dictionaryValues(this.kernel.counters));for(var c in this.processes){var b=this.processes[c],d;for(d in b.counters)a.push(b.counters[d])}return a},findAllThreadsNamed:function(a){var c=[];c.push.apply(c,this.kernel.findAllThreadsNamed(a));for(var b in this.processes)c.push.apply(c,this.processes[b].findAllThreadsNamed(a));return c},createImporter_:function(a){for(var c,b=0;b<d.importerConstructors_.length;++b)if(d.importerConstructors_[b].canImport(a)){c=
-d.importerConstructors_[b];break}if(!c)throw Error("Could not find an importer for the provided eventData.");return new c(this,a)},importTraces:function(a,c,b){void 0===c&&(c=!0);void 0===b&&(b=!0);a=a.slice(0);for(var d=[],k=0;k<a.length;++k)d.push(this.createImporter_(a[k]));for(k=0;k<d.length;k++){var l=d[k].extractSubtrace();l&&(a.push(l),d.push(this.createImporter_(l)))}d.sort(function(a,c){return a.importPriority-c.importPriority});for(k=0;k<d.length;k++)d[k].importEvents(0<k);this.updateBounds();
-this.kernel.autoCloseOpenSlices(this.bounds.max);for(var m in this.processes)this.processes[m].autoCloseOpenSlices(this.bounds.max);for(k=0;k<d.length;k++)d[k].finalizeImport();for(m in this.processes)this.processes[m].preInitializeObjects();if(b)for(m in this.kernel.pruneEmptyContainers(),this.processes)this.processes[m].pruneEmptyContainers();for(m in this.processes)this.processes[m].mergeKernelWithUserland();this.updateBounds();this.updateCategories_();c&&this.shiftWorldToZero();for(k=0;k<d.length;k++)d[k].joinRefs();
-for(m in this.processes)this.processes[m].autoDeleteObjects(this.bounds.max);for(m in this.processes)this.processes[m].initializeObjects()}};b.canImport=function(a){return a instanceof Array&&0==a.length?!0:"string"===typeof a||a instanceof String?0==a.length:!1};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){},importEvents:function(){},finalizeImport:function(){},joinRefs:function(){}};d.registerImporter(b);return{TraceModel:d}});"use strict";base.require("tracing.trace_model");
-base.require("tracing.color_scheme");base.require("tracing.importer.linux_perf.bus_parser");base.require("tracing.importer.linux_perf.clock_parser");base.require("tracing.importer.linux_perf.cpufreq_parser");base.require("tracing.importer.linux_perf.disk_parser");base.require("tracing.importer.linux_perf.drm_parser");base.require("tracing.importer.linux_perf.exynos_parser");base.require("tracing.importer.linux_perf.gesture_parser");base.require("tracing.importer.linux_perf.i915_parser");base.require("tracing.importer.linux_perf.mali_parser");
-base.require("tracing.importer.linux_perf.power_parser");base.require("tracing.importer.linux_perf.sched_parser");base.require("tracing.importer.linux_perf.sync_parser");base.require("tracing.importer.linux_perf.workqueue_parser");base.require("tracing.importer.linux_perf.android_parser");base.require("tracing.importer.linux_perf.kfunc_parser");
-base.exportTo("tracing.importer",function(){function d(a){this.cpu=a}function b(a,c){this.importPriority=2;this.model_=a;this.events_=c;this.clockSyncRecords_=[];this.cpuStates_={};this.wakeups_=[];this.kernelThreadStates_={};this.buildMapFromLinuxPidsToThreads();this.lineNumberBase=0;this.lineNumber=-1;this.pseudoThreadCounter=1;this.parsers_=[];this.eventHandlers_={}}function a(a){return"{"==a[0]?!1:e.test(a)?g:f.test(a)?h:k.test(a)?l:null}d.prototype={__proto__:Object.prototype,switchRunningLinuxPid:function(a,
+base.exportTo("tracing.trace_model",function(){function d(b,a){if(void 0===b)throw Error("model must be provided");if(void 0===a)throw Error("pid must be provided");tracing.trace_model.ProcessBase.call(this,b);this.pid=a;this.name=void 0;this.labels=[];this.instantEvents=[]}d.compare=function(b,a){var c=tracing.trace_model.ProcessBase.compare(b,a);return c||(c=base.comparePossiblyUndefinedValues(b.name,a.name,function(a,c){return a.localeCompare(c)}))?c:(c=base.compareArrays(b.labels,a.labels,function(a,
+c){return a.localeCompare(c)}))?c:b.pid-a.pid};d.prototype={__proto__:tracing.trace_model.ProcessBase.prototype,compareTo:function(b){return d.compare(this,b)},pushInstantEvent:function(b){this.instantEvents.push(b)},get userFriendlyName(){var b;b=this.name?this.name:"Process "+this.pid;this.labels.length&&(b+=": "+this.labels.join(", "));return b},get userFriendlyDetails(){return this.name?this.name+" (pid "+this.pid+")":"pid: "+this.pid},getSettingsKey:function(){return this.name?this.labels.length?
+"processes."+this.name+"."+this.labels.join("."):"processes."+this.name:void 0},shiftTimestampsForward:function(b){for(var a in this.instantEvents)this.instantEvents[a].start+=b;tracing.trace_model.ProcessBase.prototype.shiftTimestampsForward.apply(this,arguments)}};return{Process:d}});"use strict";base.require("base.range");base.require("base.events");base.require("tracing.trace_model.process");base.require("tracing.trace_model.kernel");base.require("tracing.filter");
+base.exportTo("tracing",function(){function d(a,b){this.kernel=new c(this);this.processes={};this.importErrors=[];this.metadata=[];this.categories=[];this.bounds=new base.Range;this.instantEvents=[];a&&this.importTraces([a],b)}function b(a){this.importPriority=0}var a=tracing.trace_model.Process,c=tracing.trace_model.Kernel;d.importerConstructors_=[];d.registerImporter=function(a){d.importerConstructors_.push(a)};d.prototype={__proto__:base.EventTarget.prototype,get numProcesses(){var a=0,c;for(c in this.processes)a++;
+return a},getOrCreateProcess:function(c){this.processes[c]||(this.processes[c]=new a(this,c));return this.processes[c]},pushInstantEvent:function(a){this.instantEvents.push(a)},updateCategories_:function(){var a={};this.kernel.addCategoriesToDict(a);for(var c in this.processes)this.processes[c].addCategoriesToDict(a);this.categories=[];for(var b in a)""!=b&&this.categories.push(b)},updateBounds:function(){this.bounds.reset();this.kernel.updateBounds();this.bounds.addRange(this.kernel.bounds);for(var a in this.processes)this.processes[a].updateBounds(),
+this.bounds.addRange(this.processes[a].bounds)},shiftWorldToZero:function(){if(!this.bounds.isEmpty){var a=this.bounds.min;this.kernel.shiftTimestampsForward(-a);for(var c in this.instantEvents)this.instantEvents[c].start-=a;for(var b in this.processes)this.processes[b].shiftTimestampsForward(-a);this.updateBounds()}},getAllThreads:function(){var a=[],c;for(c in this.kernel.threads)a.push(d.threads[c]);for(var b in this.processes){var d=this.processes[b];for(c in d.threads)a.push(d.threads[c])}return a},
+getAllProcesses:function(){var a=[],c;for(c in this.processes)a.push(this.processes[c]);return a},getAllCounters:function(){var a=[];a.push.apply(a,base.dictionaryValues(this.kernel.counters));for(var c in this.processes){var b=this.processes[c],d;for(d in b.counters)a.push(b.counters[d])}return a},findAllThreadsNamed:function(a){var c=[];c.push.apply(c,this.kernel.findAllThreadsNamed(a));for(var b in this.processes)c.push.apply(c,this.processes[b].findAllThreadsNamed(a));return c},createImporter_:function(a){for(var c,
+b=0;b<d.importerConstructors_.length;++b)if(d.importerConstructors_[b].canImport(a)){c=d.importerConstructors_[b];break}if(!c)throw Error("Could not find an importer for the provided eventData.");return new c(this,a)},importTraces:function(a,c,b){void 0===c&&(c=!0);void 0===b&&(b=!0);a=a.slice(0);for(var d=[],k=0;k<a.length;++k)d.push(this.createImporter_(a[k]));for(k=0;k<d.length;k++){var l=d[k].extractSubtrace();l&&(a.push(l),d.push(this.createImporter_(l)))}d.sort(function(a,c){return a.importPriority-
+c.importPriority});for(k=0;k<d.length;k++)d[k].importEvents(0<k);this.updateBounds();this.kernel.autoCloseOpenSlices(this.bounds.max);for(var m in this.processes)this.processes[m].autoCloseOpenSlices(this.bounds.max);for(k=0;k<d.length;k++)d[k].finalizeImport();for(m in this.processes)this.processes[m].preInitializeObjects();if(b)for(m in this.kernel.pruneEmptyContainers(),this.processes)this.processes[m].pruneEmptyContainers();for(m in this.processes)this.processes[m].mergeKernelWithUserland();this.updateBounds();
+this.updateCategories_();c&&this.shiftWorldToZero();for(k=0;k<d.length;k++)d[k].joinRefs();for(m in this.processes)this.processes[m].autoDeleteObjects(this.bounds.max);for(m in this.processes)this.processes[m].initializeObjects()}};b.canImport=function(a){return a instanceof Array&&0==a.length?!0:"string"===typeof a||a instanceof String?0==a.length:!1};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){},importEvents:function(){},finalizeImport:function(){},joinRefs:function(){}};
+d.registerImporter(b);return{TraceModel:d}});"use strict";base.require("tracing.trace_model");base.require("tracing.color_scheme");base.require("tracing.importer.linux_perf.bus_parser");base.require("tracing.importer.linux_perf.clock_parser");base.require("tracing.importer.linux_perf.cpufreq_parser");base.require("tracing.importer.linux_perf.disk_parser");base.require("tracing.importer.linux_perf.drm_parser");base.require("tracing.importer.linux_perf.exynos_parser");base.require("tracing.importer.linux_perf.gesture_parser");
+base.require("tracing.importer.linux_perf.i915_parser");base.require("tracing.importer.linux_perf.mali_parser");base.require("tracing.importer.linux_perf.power_parser");base.require("tracing.importer.linux_perf.sched_parser");base.require("tracing.importer.linux_perf.sync_parser");base.require("tracing.importer.linux_perf.workqueue_parser");base.require("tracing.importer.linux_perf.android_parser");base.require("tracing.importer.linux_perf.kfunc_parser");
+base.exportTo("tracing.importer",function(){function d(a){this.cpu=a}function b(a,c){this.importPriority=2;this.model_=a;this.events_=c;this.clockSyncRecords_=[];this.cpuStates_={};this.wakeups_=[];this.kernelThreadStates_={};this.buildMapFromLinuxPidsToThreads();this.lineNumberBase=0;this.lineNumber=-1;this.pseudoThreadCounter=1;this.parsers_=[];this.eventHandlers_={}}function a(a){return"{"==a[0]?!1:e.test(a)?f:g.test(a)?h:k.test(a)?l:null}d.prototype={__proto__:Object.prototype,switchRunningLinuxPid:function(a,
c,b,e,f,g){if(void 0!==this.lastActivePid&&0!=this.lastActivePid){var d=b-this.lastActiveTs;a=(a=a.threadsByLinuxPid[this.lastActivePid])?a.userFriendlyName:this.lastActiveComm;c=new tracing.trace_model.Slice("",a,tracing.getStringColorId(a),this.lastActiveTs,{comm:this.lastActiveComm,tid:this.lastActivePid,prio:this.lastActivePrio,stateWhenDescheduled:c},d);this.cpu.slices.push(c)}this.lastActiveTs=b;this.lastActivePid=e;this.lastActiveComm=f;this.lastActivePrio=g}};var c={},e=RegExp("^\\s*(.+)-(\\d+)\\s+\\(\\s*(\\d+|-+)\\)\\s\\[(\\d+)\\]\\s+[dX.][N.][Hhs.][0-9a-f.]\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$"),
-g=function(a){a=e.exec(a);if(!a)return a;var c=a[3];"-"===c[0]&&(c=void 0);return{threadName:a[1],pid:a[2],tgid:c,cpuNumber:a[4],timestamp:a[5],eventName:a[6],details:a[7]}};c.lineParserWithTGID=g;var f=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s+[dX.][N.][Hhs.][0-9a-f.]\s+(\d+\.\d+):\s+(\S+):\s(.*)$/,h=function(a){return(a=f.exec(a))?{threadName:a[1],pid:a[2],cpuNumber:a[3],timestamp:a[4],eventName:a[5],details:a[6]}:a};c.lineParserWithIRQInfo=h;var k=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s*(\d+\.\d+):\s+(\S+):\s(.*)$/,
+f=function(a){a=e.exec(a);if(!a)return a;var c=a[3];"-"===c[0]&&(c=void 0);return{threadName:a[1],pid:a[2],tgid:c,cpuNumber:a[4],timestamp:a[5],eventName:a[6],details:a[7]}};c.lineParserWithTGID=f;var g=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s+[dX.][N.][Hhs.][0-9a-f.]\s+(\d+\.\d+):\s+(\S+):\s(.*)$/,h=function(a){return(a=g.exec(a))?{threadName:a[1],pid:a[2],cpuNumber:a[3],timestamp:a[4],eventName:a[5],details:a[6]}:a};c.lineParserWithIRQInfo=h;var k=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s*(\d+\.\d+):\s+(\S+):\s(.*)$/,
l=function(a){return(a=k.exec(a))?{threadName:a[1],pid:a[2],cpuNumber:a[3],timestamp:a[4],eventName:a[5],details:a[6]}:a};c.lineParserWithLegacyFmt=l;c.traceEventClockSyncRE=/trace_event_clock_sync: parent_ts=(\d+\.?\d*)/;c.autoDetectLineParser=a;b.canImport=function(c){if(!("string"===typeof c||c instanceof String))return!1;if(b._extractEventsFromSystraceHTML(c,!1).ok||/^# tracer:/.test(c))return!0;var e=/^(.+)\n/.exec(c);e&&(c=e[1]);return a(c)?!0:!1};b._extractEventsFromSystraceHTML=function(a,
-c){function b(a){for(;d<g.length;d++)if(a.test(g[d]))return!0;return!1}function e(a,c){return-1===a.indexOf(c,a.length-c.length)?a:a.substring(a,a.length-c.length)}var f={ok:!1};void 0===c&&(c=!0);if(!1==/^<!DOCTYPE HTML>/.test(a))return f;var g=a.split("\n"),d=1;if(!b(/^ <script>$/)||!b(/^ var linuxPerfData = "\\$/))return f;var h=d+1;if(!b(/^ <\/script>$/))return f;var l=d;if(!b(/^<\/body>$/)||!b(/^<\/html>$/))return f;var k=g.slice(h,l),l=[];if(c)for(var x=0;x<k.length;x++){var y=k[x],y=e(y,
-"\\n\\");l.push(y)}else l=[k[k.length-1]];k=l[l.length-1];x=e(k,'\\n";');if(x==k)return f;l[l.length-1]=x;return{ok:!0,lines:c?l:void 0,events_begin_at_line:h}};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){},get model(){return this.model_},buildMapFromLinuxPidsToThreads:function(){this.threadsByLinuxPid={};this.model_.getAllThreads().forEach(function(a){this.threadsByLinuxPid[a.tid]=a}.bind(this))},getOrCreateCpuState:function(a){if(!this.cpuStates_[a]){var c=this.model_.kernel.getOrCreateCpu(a);
+c){function b(a){for(;d<g.length;d++)if(a.test(g[d]))return!0;return!1}function e(a,c){return-1===a.indexOf(c,a.length-c.length)?a:a.substring(a,a.length-c.length)}var f={ok:!1};void 0===c&&(c=!0);if(!1==/^<!DOCTYPE HTML>/.test(a))return f;var g=a.split("\n"),d=1;if(!b(/^ <script>$/)||!b(/^ var linuxPerfData = "\\$/))return f;var h=d+1;if(!b(/^ <\/script>$/))return f;var k=d;if(!b(/^<\/body>$/)||!b(/^<\/html>$/))return f;var l=g.slice(h,k),k=[];if(c)for(var x=0;x<l.length;x++){var y=l[x],y=e(y,
+"\\n\\");k.push(y)}else k=[l[l.length-1]];l=k[k.length-1];x=e(l,'\\n";');if(x==l)return f;k[k.length-1]=x;return{ok:!0,lines:c?k:void 0,events_begin_at_line:h}};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){},get model(){return this.model_},buildMapFromLinuxPidsToThreads:function(){this.threadsByLinuxPid={};this.model_.getAllThreads().forEach(function(a){this.threadsByLinuxPid[a.tid]=a}.bind(this))},getOrCreateCpuState:function(a){if(!this.cpuStates_[a]){var c=this.model_.kernel.getOrCreateCpu(a);
this.cpuStates_[a]=new d(c)}return this.cpuStates_[a]},getOrCreateKernelThread:function(a,c,b){this.kernelThreadStates_[a]||(b=this.model_.getOrCreateProcess(c).getOrCreateThread(b),b.name=a,this.kernelThreadStates_[a]={pid:c,thread:b,openSlice:void 0,openSliceTS:void 0},this.threadsByLinuxPid[c]=b);return this.kernelThreadStates_[a]},getOrCreatePseudoThread:function(a){var c=this.kernelThreadStates_[a];c||(c=this.getOrCreateKernelThread(a,0,this.pseudoThreadCounter),this.pseudoThreadCounter++);return c},
importEvents:function(a){this.createParsers();this.importCpuData();this.alignClocks(a)&&(this.buildMapFromLinuxPidsToThreads(),this.buildPerThreadCpuSlicesFromCpuState())},finalizeImport:function(){},joinRefs:function(){},buildPerThreadCpuSlicesFromCpuState:function(){for(var a in this.cpuStates_)for(var c=this.cpuStates_[a].cpu,b=0;b<c.slices.length;b++){var e=c.slices[b],f=this.threadsByLinuxPid[e.args.tid];f&&(f.tempCpuSlices||(f.tempCpuSlices=[]),f.tempCpuSlices.push(e))}for(b in this.wakeups_)if(a=
-this.wakeups_[b],f=this.threadsByLinuxPid[a.tid])f.tempWakeups=f.tempWakeups||[],f.tempWakeups.push(a);var g=tracing.getColorIdByName("running"),d=tracing.getColorIdByName("runnable"),h=tracing.getColorIdByName("sleeping"),l=tracing.getColorIdByName("iowait");this.model_.getAllThreads().forEach(function(a){if(void 0!==a.tempCpuSlices){var c=a.tempCpuSlices;delete a.tempCpuSlices;c.sort(function(a,c){return a.start-c.start});var b=a.tempWakeups||[];delete a.tempWakeups;b.sort(function(a,c){return a.ts-
-c.ts});var e=[];if(c.length){var f=c[0];if(b.length&&b[0].ts<f.start){var k=b.shift();e.push(new tracing.trace_model.Slice("","Runnable",d,k.ts,{"wakeup from tid":k.fromTid},f.start-k.ts))}e.push(new tracing.trace_model.Slice("","Running",g,f.start,{},f.duration))}k=void 0;for(f=1;f<c.length;f++){for(var m=c[f-1],p=c[f],n=p.start-m.end;b.length&&b[0].ts<p.start;){var q=b.shift();void 0===k&&q.ts>m.end&&(k=q)}q=function(a,c){void 0!==k&&(n=k.ts-m.end);e.push(new tracing.trace_model.Slice("",a,c,m.end,
-{},n));void 0!==k&&(e.push(new tracing.trace_model.Slice("","Runnable",d,k.ts,{"wakeup from tid":k.fromTid},p.start-k.ts)),k=void 0)};"S"==m.args.stateWhenDescheduled?q("Sleeping",h):"R"==m.args.stateWhenDescheduled||"R+"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Runnable",d,m.end,{},n)):"D"==m.args.stateWhenDescheduled?q("Uninterruptible Sleep",l):"T"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","__TASK_STOPPED",l,m.end,{},n)):"t"==m.args.stateWhenDescheduled?
-e.push(new tracing.trace_model.Slice("","debug",l,m.end,{},n)):"Z"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Zombie",l,m.end,{},n)):"X"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Exit Dead",l,m.end,{},n)):"x"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Task Dead",l,m.end,{},n)):"K"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Wakekill",l,m.end,{},n)):"W"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("",
-"Waking",l,m.end,{},n)):"D|K"==m.args.stateWhenDescheduled?q("Uninterruptible Sleep | WakeKill",l):"D|W"==m.args.stateWhenDescheduled?q("Uninterruptible Sleep | Waking",l):(e.push(new tracing.trace_model.Slice("","UNKNOWN",l,m.end,{},n)),this.model_.importErrors.push("Unrecognized sleep state: "+m.args.stateWhenDescheduled));e.push(new tracing.trace_model.Slice("","Running",g,p.start,{},p.duration))}a.cpuSlices=e}},this)},alignClocks:function(a){if(0==this.clockSyncRecords_.length){if(!a)return!0;
+this.wakeups_[b],f=this.threadsByLinuxPid[a.tid])f.tempWakeups=f.tempWakeups||[],f.tempWakeups.push(a);var g=tracing.getColorIdByName("running"),d=tracing.getColorIdByName("runnable"),h=tracing.getColorIdByName("sleeping"),k=tracing.getColorIdByName("iowait");this.model_.getAllThreads().forEach(function(a){if(void 0!==a.tempCpuSlices){var c=a.tempCpuSlices;delete a.tempCpuSlices;c.sort(function(a,c){return a.start-c.start});var b=a.tempWakeups||[];delete a.tempWakeups;b.sort(function(a,c){return a.ts-
+c.ts});var e=[];if(c.length){var f=c[0];if(b.length&&b[0].ts<f.start){var l=b.shift();e.push(new tracing.trace_model.Slice("","Runnable",d,l.ts,{"wakeup from tid":l.fromTid},f.start-l.ts))}e.push(new tracing.trace_model.Slice("","Running",g,f.start,{},f.duration))}l=void 0;for(f=1;f<c.length;f++){for(var m=c[f-1],n=c[f],p=n.start-m.end;b.length&&b[0].ts<n.start;){var q=b.shift();void 0===l&&q.ts>m.end&&(l=q)}q=function(a,c){void 0!==l&&(p=l.ts-m.end);e.push(new tracing.trace_model.Slice("",a,c,m.end,
+{},p));void 0!==l&&(e.push(new tracing.trace_model.Slice("","Runnable",d,l.ts,{"wakeup from tid":l.fromTid},n.start-l.ts)),l=void 0)};"S"==m.args.stateWhenDescheduled?q("Sleeping",h):"R"==m.args.stateWhenDescheduled||"R+"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Runnable",d,m.end,{},p)):"D"==m.args.stateWhenDescheduled?q("Uninterruptible Sleep",k):"T"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","__TASK_STOPPED",k,m.end,{},p)):"t"==m.args.stateWhenDescheduled?
+e.push(new tracing.trace_model.Slice("","debug",k,m.end,{},p)):"Z"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Zombie",k,m.end,{},p)):"X"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Exit Dead",k,m.end,{},p)):"x"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Task Dead",k,m.end,{},p)):"K"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Wakekill",k,m.end,{},p)):"W"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("",
+"Waking",k,m.end,{},p)):"D|K"==m.args.stateWhenDescheduled?q("Uninterruptible Sleep | WakeKill",k):"D|W"==m.args.stateWhenDescheduled?q("Uninterruptible Sleep | Waking",k):(e.push(new tracing.trace_model.Slice("","UNKNOWN",k,m.end,{},p)),this.model_.importErrors.push("Unrecognized sleep state: "+m.args.stateWhenDescheduled));e.push(new tracing.trace_model.Slice("","Running",g,n.start,{},n.duration))}a.cpuSlices=e}},this)},alignClocks:function(a){if(0==this.clockSyncRecords_.length){if(!a)return!0;
this.abortImport();return!1}a=this.clockSyncRecords_[0];if(0==a.parentTS||a.parentTS==a.perfTS)return!0;a=a.parentTS-a.perfTS;for(var c in this.cpuStates_){for(var b=this.cpuStates_[c].cpu,e=0;e<b.slices.length;e++){var f=b.slices[e];f.start+=a;f.duration=f.duration}for(var g in b.counters)for(e=b.counters[g],f=0;f<e.timestamps.length;f++)e.timestamps[f]+=a}for(var d in this.kernelThreadStates_)this.kernelThreadStates_[d].thread.shiftTimestampsForward(a);return!0},abortImport:function(){if(this.pushedEventsToThreads)throw Error("Cannot abort, have alrady pushedCpuDataToThreads.");
for(var a in this.cpuStates_)delete this.model_.kernel.cpus[a];for(var c in this.kernelThreadStates_){a=this.kernelThreadStates_[c].thread;var b=a.parent;delete b.threads[a.tid];delete this.model_.processes[b.pid]}this.model_.importErrors.push("Cannot import kernel trace without a clock sync.")},createParsers:function(){for(var a=tracing.importer.linux_perf.Parser.getSubtypeConstructors(),c=0;c<a.length;++c)this.parsers_.push(new a[c](this));this.registerEventHandler("tracing_mark_write:trace_event_clock_sync",
b.prototype.traceClockSyncEvent.bind(this));this.registerEventHandler("tracing_mark_write",b.prototype.traceMarkingWriteEvent.bind(this));this.registerEventHandler("0:trace_event_clock_sync",b.prototype.traceClockSyncEvent.bind(this));this.registerEventHandler("0",b.prototype.traceMarkingWriteEvent.bind(this))},registerEventHandler:function(a,c){this.eventHandlers_[a]=c},markPidRunnable:function(a,c,b,e,f){this.wakeups_.push({ts:a,tid:c,fromTid:f})},importError:function(a){this.model_.importErrors.push("Line "+
(this.lineNumberBase+this.lineNumber+1)+": "+a)},traceClockSyncEvent:function(a,c,b,e,f){a=/parent_ts=(\d+\.?\d*)/.exec(f.details);if(!a)return!1;this.clockSyncRecords_.push({perfTS:e,parentTS:1E3*a[1]});return!0},traceMarkingWriteEvent:function(a,c,b,e,f,g){var d=/^\s*(\w+):\s*(.*)$/.exec(f.details);if(d)f.subEventName=d[1],f.details=d[2];else if(d=f.details.substring(0,2),"B|"==d||"E"==d||"E|"==d||"C|"==d||"S|"==d||"F|"==d)f.subEventName="android";else return!1;a=a+":"+f.subEventName;d=this.eventHandlers_[a];
return d?d(a,c,b,e,f,g):(this.importError("Unknown trace_marking_write event "+a),!0)},importCpuData:function(){var c=b._extractEventsFromSystraceHTML(this.events_,!0);c.ok?(this.lineNumberBase=c.events_begin_at_line,this.lines_=c.lines):(this.lineNumberBase=0,this.lines_=this.events_.split("\n"));c=null;for(this.lineNumber=0;this.lineNumber<this.lines_.length;++this.lineNumber){var e=this.lines_[this.lineNumber];if(0!=e.length&&!/^#/.test(e)){if(null==c&&(c=a(e),null==c)){this.importError("Cannot parse line: "+
-e);continue}var f=c(e);if(f){var g=parseInt(f.pid),d=parseInt(f.cpuNumber),h=1E3*parseFloat(f.timestamp),l=f.eventName,k=this.eventHandlers_[l];k?k(l,d,g,h,f)||this.importError("Malformed "+l+" event ("+e+")"):this.importError("Unknown event "+l+" ("+e+")")}else this.importError("Unrecognized line: "+e)}}}};tracing.TraceModel.registerImporter(b);return{LinuxPerfImporter:b,_LinuxPerfImporterTestExports:c}});"use strict";base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/common.js");base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/mat2d.js");
+e);continue}var f=c(e);if(f){var g=parseInt(f.pid),d=parseInt(f.cpuNumber),h=1E3*parseFloat(f.timestamp),k=f.eventName,l=this.eventHandlers_[k];l?l(k,d,g,h,f)||this.importError("Malformed "+k+" event ("+e+")"):this.importError("Unknown event "+k+" ("+e+")")}else this.importError("Unrecognized line: "+e)}}}};tracing.TraceModel.registerImporter(b);return{LinuxPerfImporter:b,_LinuxPerfImporterTestExports:c}});"use strict";base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/common.js");base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/mat2d.js");
base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/mat4.js");base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/vec2.js");base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/vec3.js");base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/vec4.js");
-base.exportTo("base",function(){var d=vec2.create(),b=vec2.create(),a=vec4.create();mat2d.create();vec2.createFromArray=function(a){if(2!=a.length)throw Error("Should be length 2");var b=vec2.create();vec2.set(b,a[0],a[1]);return b};vec2.createXY=function(a,b){var g=vec2.create();vec2.set(g,a,b);return g};vec2.toString=function(a){return"["+a[0]+", "+a[1]+"]"};vec2.addTwoScaledUnitVectors=function(a,e,g,f,h){vec2.scale(d,e,g);vec2.scale(b,f,h);vec2.add(a,d,b)};vec3.createXYZ=function(a,b,g){var f=
-vec3.create();vec3.set(f,a,b,g);return f};vec3.toString=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};mat2d.translateXY=function(a,b,g){vec2.set(d,b,g);mat2d.translate(a,a,d)};mat2d.scaleXY=function(a,b,g){vec2.set(d,b,g);mat2d.scale(a,a,d)};vec4.unitize=function(a,b){a[0]=b[0]/b[3];a[1]=b[1]/b[3];a[2]=b[2]/b[3];a[3]=1;return a};vec2.copyFromVec4=function(c,b){vec4.unitize(a,b);vec2.copy(c,a)};return{}});"use strict";base.require("base.gl_matrix");
-base.exportTo("base",function(){function d(a,c,b,e){vec2.scale(h,c,e);vec2.scale(k,b,1-e);vec2.add(a,h,k);vec2.normalize(a,a);return a}function b(){this.p1=vec2.create();this.p2=vec2.create();this.p3=vec2.create();this.p4=vec2.create()}function a(a,c,b){return(a[0]-b[0])*(c[1]-b[1])-(c[0]-b[0])*(a[1]-b[1])}function c(c,b,e,f){var g=0>a(c,b,e);e=0>a(c,e,f);c=0>a(c,f,b);return g==e&&e==c}for(var e=[],g=0;8>g;g++)e[g]=vec2.create();var f=vec4.create();vec4.create();vec4.create();mat4.create();mat4.create();
+base.exportTo("base",function(){var d=vec2.create(),b=vec2.create(),a=vec4.create();mat2d.create();vec2.createFromArray=function(a){if(2!=a.length)throw Error("Should be length 2");var b=vec2.create();vec2.set(b,a[0],a[1]);return b};vec2.createXY=function(a,b){var f=vec2.create();vec2.set(f,a,b);return f};vec2.toString=function(a){return"["+a[0]+", "+a[1]+"]"};vec2.addTwoScaledUnitVectors=function(a,e,f,g,h){vec2.scale(d,e,f);vec2.scale(b,g,h);vec2.add(a,d,b)};vec3.createXYZ=function(a,b,f){var g=
+vec3.create();vec3.set(g,a,b,f);return g};vec3.toString=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};mat2d.translateXY=function(a,b,f){vec2.set(d,b,f);mat2d.translate(a,a,d)};mat2d.scaleXY=function(a,b,f){vec2.set(d,b,f);mat2d.scale(a,a,d)};vec4.unitize=function(a,b){a[0]=b[0]/b[3];a[1]=b[1]/b[3];a[2]=b[2]/b[3];a[3]=1;return a};vec2.copyFromVec4=function(c,b){vec4.unitize(a,b);vec2.copy(c,a)};return{}});"use strict";base.require("base.gl_matrix");
+base.exportTo("base",function(){function d(a,c,b,e){vec2.scale(h,c,e);vec2.scale(k,b,1-e);vec2.add(a,h,k);vec2.normalize(a,a);return a}function b(){this.p1=vec2.create();this.p2=vec2.create();this.p3=vec2.create();this.p4=vec2.create()}function a(a,c,b){return(a[0]-b[0])*(c[1]-b[1])-(c[0]-b[0])*(a[1]-b[1])}function c(c,b,e,f){var g=0>a(c,b,e);e=0>a(c,e,f);c=0>a(c,f,b);return g==e&&e==c}for(var e=[],f=0;8>f;f++)e[f]=vec2.create();var g=vec4.create();vec4.create();vec4.create();mat4.create();mat4.create();
vec2.createXY(0,0);vec2.createXY(1,0);vec2.createXY(0,1);vec2.createXY(1,1);var h=vec2.create(),k=vec2.create();b.FromXYWH=function(a,c,e,f){var g=new b;vec2.set(g.p1,a,c);vec2.set(g.p2,a+e,c);vec2.set(g.p3,a+e,c+f);vec2.set(g.p4,a,c+f);return g};b.FromRect=function(a){return new b.FromXYWH(a.x,a.y,a.width,a.height)};b.From4Vecs=function(a,c,e,f){var g=new b;vec2.set(g.p1,a[0],a[1]);vec2.set(g.p2,c[0],c[1]);vec2.set(g.p3,e[0],e[1]);vec2.set(g.p4,f[0],f[1]);return g};b.From8Array=function(a){if(8!=
a.length)throw Error("Array must be 8 long");var c=new b;c.p1[0]=a[0];c.p1[1]=a[1];c.p2[0]=a[2];c.p2[1]=a[3];c.p3[0]=a[4];c.p3[1]=a[5];c.p4[0]=a[6];c.p4[1]=a[7];return c};b.prototype={vecInside:function(a){return c(a,this.p1,this.p2,this.p3)||c(a,this.p1,this.p3,this.p4)},boundingRect:function(){var a=Math.min(this.p1[0],this.p2[0],this.p3[0],this.p4[0]),c=Math.min(this.p1[1],this.p2[1],this.p3[1],this.p4[1]),b=Math.max(this.p1[0],this.p2[0],this.p3[0],this.p4[0]),e=Math.max(this.p1[1],this.p2[1],
this.p3[1],this.p4[1]);return new base.Rect.FromXYWH(a,c,b-a,e-c)},clone:function(){var a=new b;vec2.copy(a.p1,this.p1);vec2.copy(a.p2,this.p2);vec2.copy(a.p3,this.p3);vec2.copy(a.p4,this.p4);return a},scale:function(a){var c=new b;this.scaleFast(c,a);return c},scaleFast:function(a,c){vec2.copy(a.p1,this.p1,c);vec2.copy(a.p2,this.p2,c);vec2.copy(a.p3,this.p3,c);vec2.copy(a.p3,this.p3,c)},isRectangle:function(){var a=this.boundingRect();return a.x==this.p1[0]&&a.y==this.p1[1]&&a.width==this.p2[0]-
-this.p1[0]&&a.y==this.p2[1]&&a.width==this.p3[0]-this.p1[0]&&a.height==this.p3[1]-this.p2[1]&&a.x==this.p4[0]&&a.height==this.p4[1]-this.p2[1]},projectUnitRect:function(a){var c=new b;this.projectUnitRectFast(c,a);return c},projectUnitRectFast:function(a,c){var b=e[0],g=e[1],h=e[2],k=e[3],v,w,t,r;vec2.sub(b,this.p2,this.p1);v=vec2.length(b);vec2.scale(b,b,1/v);vec2.sub(g,this.p4,this.p1);w=vec2.length(g);vec2.scale(g,g,1/w);vec2.sub(h,this.p3,this.p2);t=vec2.length(h);vec2.scale(h,h,1/t);vec2.sub(k,
-this.p3,this.p4);r=vec2.length(k);vec2.scale(k,k,1/r);var u=e[0],x=e[1],y=e[2],z=e[3];d(u,b,k,c.y);d(z,b,k,1-c.bottom);d(x,g,h,c.x);d(y,g,h,1-c.right);vec2.addTwoScaledUnitVectors(f,u,v*c.x,x,w*c.y);vec2.add(a.p1,this.p1,f);vec2.addTwoScaledUnitVectors(f,u,v*-(1-c.right),y,t*c.y);vec2.add(a.p2,this.p2,f);vec2.addTwoScaledUnitVectors(f,z,r*-(1-c.right),y,t*-(1-c.bottom));vec2.add(a.p3,this.p3,f);vec2.addTwoScaledUnitVectors(f,z,r*c.left,x,w*-(1-c.bottom));vec2.add(a.p4,this.p4,f)},toString:function(){return"Quad("+
-vec2.toString(this.p1)+", "+vec2.toString(this.p2)+", "+vec2.toString(this.p3)+", "+vec2.toString(this.p4)+")"}};return{vecInTriangle2:c,Quad:b}});"use strict";base.require("base.quad");base.require("tracing.trace_model");base.require("tracing.color_scheme");
+this.p1[0]&&a.y==this.p2[1]&&a.width==this.p3[0]-this.p1[0]&&a.height==this.p3[1]-this.p2[1]&&a.x==this.p4[0]&&a.height==this.p4[1]-this.p2[1]},projectUnitRect:function(a){var c=new b;this.projectUnitRectFast(c,a);return c},projectUnitRectFast:function(a,c){var b=e[0],f=e[1],h=e[2],k=e[3],v,w,s,r;vec2.sub(b,this.p2,this.p1);v=vec2.length(b);vec2.scale(b,b,1/v);vec2.sub(f,this.p4,this.p1);w=vec2.length(f);vec2.scale(f,f,1/w);vec2.sub(h,this.p3,this.p2);s=vec2.length(h);vec2.scale(h,h,1/s);vec2.sub(k,
+this.p3,this.p4);r=vec2.length(k);vec2.scale(k,k,1/r);var u=e[0],x=e[1],y=e[2],z=e[3];d(u,b,k,c.y);d(z,b,k,1-c.bottom);d(x,f,h,c.x);d(y,f,h,1-c.right);vec2.addTwoScaledUnitVectors(g,u,v*c.x,x,w*c.y);vec2.add(a.p1,this.p1,g);vec2.addTwoScaledUnitVectors(g,u,v*-(1-c.right),y,s*c.y);vec2.add(a.p2,this.p2,g);vec2.addTwoScaledUnitVectors(g,z,r*-(1-c.right),y,s*-(1-c.bottom));vec2.add(a.p3,this.p3,g);vec2.addTwoScaledUnitVectors(g,z,r*c.left,x,w*-(1-c.bottom));vec2.add(a.p4,this.p4,g)},toString:function(){return"Quad("+
+vec2.toString(this.p1)+", "+vec2.toString(this.p2)+", "+vec2.toString(this.p3)+", "+vec2.toString(this.p4)+")"}};return{vecInTriangle2:c,Quad:b}});"use strict";base.require("tracing.trace_model.trace_model_event");
+base.exportTo("tracing.trace_model",function(){function d(a,c,b,e,d){tracing.trace_model.TraceModelEvent.apply(this,arguments);this.type=void 0}function b(a,c,b,k,l){d.apply(this,arguments);this.type=e.GLOBAL}function a(a,c,b,k,l){d.apply(this,arguments);this.type=e.PROCESS}function c(a,c,b,k,l){d.apply(this,arguments);this.type=e.THREAD}var e={GLOBAL:1,PROCESS:2,THREAD:3};d.prototype={__proto__:tracing.trace_model.TraceModelEvent.prototype};b.prototype={__proto__:d.prototype};a.prototype={__proto__:d.prototype};
+c.prototype={__proto__:d.prototype};return{GlobalInstantEvent:b,ProcessInstantEvent:a,ThreadInstantEvent:c,InstantEventType:e}});"use strict";base.require("base.quad");base.require("tracing.trace_model");base.require("tracing.color_scheme");base.require("tracing.trace_model.instant_event");base.require("tracing.trace_model.counter_series");
base.exportTo("tracing.importer",function(){function d(a){if(!(a instanceof Object)){if(void 0===a||null===a)return a;if("string"==typeof a)return a.substring();if("boolean"==typeof a||"number"==typeof a)return a;throw Error("Unrecognized: "+typeof a);}if(a instanceof Array){for(var c=Array(a.length),b=0;b<a.length;b++)c[b]=d(a[b]);return c}if(a.__proto__!=Object.prototype)throw Error("Can only clone simple types");c={};for(b in a)c[b]=d(a[b]);return c}function b(a,c){this.importPriority=1;this.model_=
-a;this.systemTraceEvents_=this.events_=void 0;this.eventsWereFromString_=!1;this.allAsyncEvents_=[];this.allObjectEvents_=[];"string"===typeof c||c instanceof String?("["===c[0]&&(c=c.replace(/[\r|\n]*$/,"").replace(/\s*,\s*$/,""),"]"!==c[c.length-1]&&(c+="]")),this.events_=JSON.parse(c),this.eventsWereFromString_=!0):this.events_=c;if(this.events_.traceEvents){var b=this.events_;this.events_=this.events_.traceEvents;this.systemTraceEvents_=b.systemTraceEvents;for(var g in b)"traceEvents"!==g&&"systemTraceEvents"!==
-g&&this.model_.metadata.push({name:g,value:b[g]})}}b.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};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){var a=this.systemTraceEvents_;this.systemTraceEvents_=void 0;return a},deepCopyIfNeeded_:function(a){return this.eventsWereFromString_?a:d(a)},processAsyncEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);
-this.allAsyncEvents_.push({event:a,thread:c})},processCounterEvent:function(a){var c;c=void 0!==a.id?a.name+"["+a.id+"]":a.name;c=this.model_.getOrCreateProcess(a.pid).getOrCreateCounter(a.cat,c);if(0==c.numSeries){for(var b in a.args)c.seriesNames.push(b),c.seriesColors.push(tracing.getStringColorId(c.name+"."+b));if(0==c.numSeries){this.model_.importErrors.push("Expected counter "+a.name+" to have at least one argument to use as a value.");delete c.parent.counters[c.name];return}}c.timestamps.push(a.ts/
-1E3);for(var g=0;g<c.numSeries;g++)b=c.seriesNames[g],void 0===a.args[b]?c.samples.push(0):c.samples.push(a.args[b])},processObjectEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);this.allObjectEvents_.push({event:a,thread:c})},processDurationEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);if(c.sliceGroup.isTimestampValidForBeginOrEnd(a.ts/1E3))if("B"==a.ph)c.sliceGroup.beginSlice(a.cat,a.name,a.ts/1E3,this.deepCopyIfNeeded_(a.args));
-else if(c.sliceGroup.openSliceCount){var c=c.sliceGroup.endSlice(a.ts/1E3),b;for(b in a.args)void 0!==c.args[b]&&this.model_.importErrors.push("Both the B and E phases of "+c.name+"provided values for argument "+b+". The value of the E phase event will be used."),c.args[b]=this.deepCopyIfNeeded_(a.args[b])}else this.model_.importErrors.push("E phase event without a matching B phase event.");else this.model_.importErrors.push("Timestamps are moving backward.")},processMetadataEvent:function(a){if("process_name"==
-a.name){var c=this.model_.getOrCreateProcess(a.pid);c.name=a.args.name}else"process_labels"==a.name?(c=this.model_.getOrCreateProcess(a.pid),c.labels.push.apply(c.labels,a.args.labels.split(","))):"process_sort_index"==a.name?(c=this.model_.getOrCreateProcess(a.pid),c.sortIndex=a.args.sort_index):"thread_name"==a.name?(c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid),c.name=a.args.name):"thread_sort_index"==a.name?(c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid),c.sortIndex=
-a.args.sort_index):this.model_.importErrors.push("Unrecognized metadata name: "+a.name)},processInstantEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);c.sliceGroup.beginSlice(a.cat,a.name,a.ts/1E3,this.deepCopyIfNeeded_(a.args));c.sliceGroup.endSlice(a.ts/1E3)},processSampleEvent:function(a){this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid).addSample(a.cat,a.name,a.ts/1E3,this.deepCopyIfNeeded_(a.args))},importEvents:function(){for(var a=this.events_,
-c=0;c<a.length;c++){var b=a[c];"B"===b.ph||"E"===b.ph?this.processDurationEvent(b):"S"===b.ph||"F"===b.ph||"T"===b.ph?this.processAsyncEvent(b):"I"==b.ph||"i"==b.ph?this.processInstantEvent(b):"P"==b.ph?this.processSampleEvent(b):"C"==b.ph?this.processCounterEvent(b):"M"==b.ph?this.processMetadataEvent(b):"N"===b.ph||"D"===b.ph||"O"===b.ph?this.processObjectEvent(b):"s"!==b.ph&&("t"!==b.ph&&"f"!==b.ph)&&this.model_.importErrors.push("Unrecognized event phase: "+b.ph+" ("+b.name+")")}},finalizeImport:function(){this.createAsyncSlices_();
-this.createExplicitObjects_();this.createImplicitObjects_()},joinRefs:function(){this.joinObjectRefs_()},createAsyncSlices_:function(){if(0!=this.allAsyncEvents_.length){this.allAsyncEvents_.sort(function(a,c){return a.event.ts-c.event.ts});for(var a={},c=this.allAsyncEvents_,b=0;b<c.length;b++){var g=c[b],f=g.event,d=f.name;if(void 0===d)this.model_.importErrors.push("Async events (ph: S, T or F) require an name parameter.");else{var k=f.id;if(void 0===k)this.model_.importErrors.push("Async events (ph: S, T or F) require an id parameter.");
-else if("S"==f.ph)void 0===a[d]&&(a[d]={}),a[d][k]?this.model_.importErrors.push("At "+f.ts+", a slice of the same id "+k+" was alrady open."):(a[d][k]=[],a[d][k].push(g));else if(void 0===a[d])this.model_.importErrors.push("At "+f.ts+", no slice named "+d+" was open.");else if(void 0===a[d][k])this.model_.importErrors.push("At "+f.ts+", no slice named "+d+" with id="+k+" was open.");else{var l=a[d][k];l.push(g);if("F"==f.ph){var m=new tracing.trace_model.AsyncSlice(l[0].event.cat,d,tracing.getStringColorId(d),
-l[0].event.ts/1E3);m.duration=f.ts/1E3-l[0].event.ts/1E3;m.startThread=l[0].thread;m.endThread=g.thread;m.id=k;m.args=this.deepCopyIfNeeded_(l[0].event.args);m.subSlices=[];for(g=1;g<l.length;++g){var n=d;"T"==l[g-1].event.ph&&(n=d+":"+l[g-1].event.args.step);n=new tracing.trace_model.AsyncSlice(l[0].event.cat,n,tracing.getStringColorId(d+g),l[g-1].event.ts/1E3);n.duration=l[g].event.ts/1E3-l[g-1].event.ts/1E3;n.startThread=l[g-1].thread;n.endThread=l[g].thread;n.id=k;n.args=this.deepCopyIfNeeded_(l[g-
-1].event.args);m.subSlices.push(n)}var l=m.subSlices[m.subSlices.length-1],p;for(p in f.args)l.args[p]=this.deepCopyIfNeeded_(f.args[p]);m.startThread.asyncSliceGroup.push(m);delete a[d][k]}}}}}},createExplicitObjects_:function(){function a(a){var c=a.event;a=a.thread;void 0===c.name&&this.model_.importErrors.push("While processing "+JSON.stringify(c)+": Object events require an name parameter.");void 0===c.id&&this.model_.importErrors.push("While processing "+JSON.stringify(c)+": Object events require an id parameter.");
+a;this.systemTraceEvents_=this.events_=void 0;this.eventsWereFromString_=!1;this.allAsyncEvents_=[];this.allObjectEvents_=[];"string"===typeof c||c instanceof String?("["===c[0]&&(c=c.replace(/[\r|\n]*$/,"").replace(/\s*,\s*$/,""),"]"!==c[c.length-1]&&(c+="]")),this.events_=JSON.parse(c),this.eventsWereFromString_=!0):this.events_=c;if(this.events_.traceEvents){var b=this.events_;this.events_=this.events_.traceEvents;this.systemTraceEvents_=b.systemTraceEvents;for(var f in b)"traceEvents"!==f&&"systemTraceEvents"!==
+f&&this.model_.metadata.push({name:f,value:b[f]})}}b.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};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){var a=this.systemTraceEvents_;this.systemTraceEvents_=void 0;return a},deepCopyIfNeeded_:function(a){return this.eventsWereFromString_?a:d(a)},processAsyncEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);
+this.allAsyncEvents_.push({event:a,thread:c})},processCounterEvent:function(a){var c;c=void 0!==a.id?a.name+"["+a.id+"]":a.name;c=this.model_.getOrCreateProcess(a.pid).getOrCreateCounter(a.cat,c);if(0===c.numSeries){for(var b in a.args)c.addSeries(new tracing.trace_model.CounterSeries(b,tracing.getStringColorId(c.name+"."+b)));if(0===c.numSeries){this.model_.importErrors.push("Expected counter "+a.name+" to have at least one argument to use as a value.");delete c.parent.counters[c.name];return}}var f=
+a.ts/1E3;c.series.forEach(function(c){c.addSample(f,a.args[c.name]?a.args[c.name]:0)})},processObjectEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);this.allObjectEvents_.push({event:a,thread:c})},processDurationEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);if(c.sliceGroup.isTimestampValidForBeginOrEnd(a.ts/1E3))if("B"==a.ph)c.sliceGroup.beginSlice(a.cat,a.name,a.ts/1E3,this.deepCopyIfNeeded_(a.args));else if(c.sliceGroup.openSliceCount){var c=
+c.sliceGroup.endSlice(a.ts/1E3),b;for(b in a.args)void 0!==c.args[b]&&this.model_.importErrors.push("Both the B and E phases of "+c.name+"provided values for argument "+b+". The value of the E phase event will be used."),c.args[b]=this.deepCopyIfNeeded_(a.args[b])}else this.model_.importErrors.push("E phase event without a matching B phase event.");else this.model_.importErrors.push("Timestamps are moving backward.")},processMetadataEvent:function(a){if("process_name"==a.name){var c=this.model_.getOrCreateProcess(a.pid);
+c.name=a.args.name}else"process_labels"==a.name?(c=this.model_.getOrCreateProcess(a.pid),c.labels.push.apply(c.labels,a.args.labels.split(","))):"process_sort_index"==a.name?(c=this.model_.getOrCreateProcess(a.pid),c.sortIndex=a.args.sort_index):"thread_name"==a.name?(c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid),c.name=a.args.name):"thread_sort_index"==a.name?(c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid),c.sortIndex=a.args.sort_index):this.model_.importErrors.push("Unrecognized metadata name: "+
+a.name)},processInstantEvent:function(a){var c;switch(a.s){case "g":c=tracing.trace_model.GlobalInstantEvent;break;case "p":c=tracing.trace_model.ProcessInstantEvent;break;default:c=tracing.trace_model.ThreadInstantEvent}var b=tracing.getStringColorId(a.name);c=new c(a.cat,a.name,b,a.ts/1E3,this.deepCopyIfNeeded_(a.args));switch(c.type){case tracing.trace_model.InstantEventType.GLOBAL:this.model_.pushInstantEvent(c);break;case tracing.trace_model.InstantEventType.PROCESS:this.model_.getOrCreateProcess(a.pid).pushInstantEvent(c);
+break;case tracing.trace_model.InstantEventType.THREAD:this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid).sliceGroup.pushInstantEvent(c);break;default:throw Error("Unknown instant event type: "+a.s);}},processSampleEvent:function(a){this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid).addSample(a.cat,a.name,a.ts/1E3,this.deepCopyIfNeeded_(a.args))},importEvents:function(){for(var a=this.events_,c=0;c<a.length;c++){var b=a[c];"B"===b.ph||"E"===b.ph?this.processDurationEvent(b):
+"S"===b.ph||"F"===b.ph||"T"===b.ph?this.processAsyncEvent(b):"I"==b.ph||"i"==b.ph?this.processInstantEvent(b):"P"==b.ph?this.processSampleEvent(b):"C"==b.ph?this.processCounterEvent(b):"M"==b.ph?this.processMetadataEvent(b):"N"===b.ph||"D"===b.ph||"O"===b.ph?this.processObjectEvent(b):"s"!==b.ph&&("t"!==b.ph&&"f"!==b.ph)&&this.model_.importErrors.push("Unrecognized event phase: "+b.ph+" ("+b.name+")")}},finalizeImport:function(){this.createAsyncSlices_();this.createExplicitObjects_();this.createImplicitObjects_()},
+joinRefs:function(){this.joinObjectRefs_()},createAsyncSlices_:function(){if(0!=this.allAsyncEvents_.length){this.allAsyncEvents_.sort(function(a,c){return a.event.ts-c.event.ts});for(var a={},c=this.allAsyncEvents_,b=0;b<c.length;b++){var f=c[b],g=f.event,d=g.name;if(void 0===d)this.model_.importErrors.push("Async events (ph: S, T or F) require an name parameter.");else{var k=g.id;if(void 0===k)this.model_.importErrors.push("Async events (ph: S, T or F) require an id parameter.");else if("S"==g.ph)void 0===
+a[d]&&(a[d]={}),a[d][k]?this.model_.importErrors.push("At "+g.ts+", a slice of the same id "+k+" was alrady open."):(a[d][k]=[],a[d][k].push(f));else if(void 0===a[d])this.model_.importErrors.push("At "+g.ts+", no slice named "+d+" was open.");else if(void 0===a[d][k])this.model_.importErrors.push("At "+g.ts+", no slice named "+d+" with id="+k+" was open.");else{var l=a[d][k];l.push(f);if("F"==g.ph){var m=new tracing.trace_model.AsyncSlice(l[0].event.cat,d,tracing.getStringColorId(d),l[0].event.ts/
+1E3);m.duration=g.ts/1E3-l[0].event.ts/1E3;m.startThread=l[0].thread;m.endThread=f.thread;m.id=k;m.args=this.deepCopyIfNeeded_(l[0].event.args);m.subSlices=[];for(f=1;f<l.length;++f){var n=d;"T"==l[f-1].event.ph&&(n=d+":"+l[f-1].event.args.step);n=new tracing.trace_model.AsyncSlice(l[0].event.cat,n,tracing.getStringColorId(d+f),l[f-1].event.ts/1E3);n.duration=l[f].event.ts/1E3-l[f-1].event.ts/1E3;n.startThread=l[f-1].thread;n.endThread=l[f].thread;n.id=k;n.args=this.deepCopyIfNeeded_(l[f-1].event.args);
+m.subSlices.push(n)}var l=m.subSlices[m.subSlices.length-1],p;for(p in g.args)l.args[p]=this.deepCopyIfNeeded_(g.args[p]);m.startThread.asyncSliceGroup.push(m);delete a[d][k]}}}}}},createExplicitObjects_:function(){function a(a){var c=a.event;a=a.thread;void 0===c.name&&this.model_.importErrors.push("While processing "+JSON.stringify(c)+": Object events require an name parameter.");void 0===c.id&&this.model_.importErrors.push("While processing "+JSON.stringify(c)+": Object events require an id parameter.");
a=a.parent;var b=c.ts/1E3,e;if("N"==c.ph)try{e=a.objects.idWasCreated(c.id,c.cat,c.name,b)}catch(f){this.model_.importErrors.push("While processing create of "+c.id+" at ts="+b+": "+f);return}else if("O"==c.ph){if(void 0===c.args.snapshot){this.model_.importErrors.push("While processing "+c.id+" at ts="+b+": Snapshots must have args: {snapshot: ...}");return}var g;try{g=a.objects.addSnapshot(c.id,c.cat,c.name,b,this.deepCopyIfNeeded_(c.args.snapshot))}catch(d){this.model_.importErrors.push("While processing snapshot of "+
-c.id+" at ts="+b+": "+d);return}e=g.objectInstance}else if("D"==c.ph)try{e=a.objects.idWasDeleted(c.id,c.cat,c.name,b)}catch(s){this.model_.importErrors.push("While processing delete of "+c.id+" at ts="+b+": "+s);return}e&&(e.colorId=tracing.getStringColorId(e.typeName))}if(0!=this.allObjectEvents_.length){this.allObjectEvents_.sort(function(a,c){return a.event.ts-c.event.ts});for(var c=this.allObjectEvents_,b=0;b<c.length;b++){var g=c[b];try{a.call(this,g)}catch(f){this.model_.importErrors.push(f.message)}}}},
+c.id+" at ts="+b+": "+d);return}e=g.objectInstance}else if("D"==c.ph)try{e=a.objects.idWasDeleted(c.id,c.cat,c.name,b)}catch(t){this.model_.importErrors.push("While processing delete of "+c.id+" at ts="+b+": "+t);return}e&&(e.colorId=tracing.getStringColorId(e.typeName))}if(0!=this.allObjectEvents_.length){this.allObjectEvents_.sort(function(a,c){return a.event.ts-c.event.ts});for(var c=this.allObjectEvents_,b=0;b<c.length;b++){var f=c[b];try{a.call(this,f)}catch(g){this.model_.importErrors.push(g.message)}}}},
createImplicitObjects_:function(){base.iterItems(this.model_.processes,function(a,c){this.createImplicitObjectsForProcess_(c)},this)},createImplicitObjectsForProcess_:function(a){function c(c,b,e,d){if(e&&void 0!==e.id&&!(e instanceof tracing.trace_model.ObjectSnapshot)){var l=e.id,m=/(.+)\/(.+)/.exec(l);if(!m)throw Error("Implicit snapshots must have names.");delete e.id;var n=m[1],m=m[2],p;try{p=a.objects.addSnapshot(m,d.objectInstance.category,n,d.ts,e)}catch(q){this.model_.importErrors.push("While processing implicit snapshot of "+
l+" at ts="+d.ts+": "+q);return}p.objectInstance.hasImplicitSnapshots=!0;p.containingSnapshot=d;c[b]=p;if(!(p instanceof tracing.trace_model.ObjectSnapshot))throw Error("Created object must be instanceof snapshot");return p.args}}function b(a,c,d,k){if(a instanceof Object)if(a instanceof Array)for(var l=0;l<a.length;l++){var m=c.call(k,a,l,a[l],d);m?b(m,c,d,k):b(a[l],c,d,k)}else for(l in a)(m=c.call(k,a,l,a[l],d))?b(m,c,d,k):b(a[l],c,d,k)}a.objects.iterObjectInstances(function(a){a.snapshots.forEach(function(a){if(void 0!==
-a.args.id)throw Error("args cannot have an id field inside it");b(a.args,c,a,this)},this)},this)},joinObjectRefs_:function(){base.iterItems(this.model_.processes,function(a,c){this.joinObjectRefsForProcess_(c)},this)},joinObjectRefsForProcess_:function(a){var c=[];base.iterItems(a.threads,function(b,g){g.asyncSliceGroup.slices.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"start",b)},this);g.sliceGroup.slices.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"start",b)},this)},
-this);a.objects.iterObjectInstances(function(b){b.snapshots.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"ts",b)},this)},this);c.forEach(function(a){a.object[a.field]=a.value})},searchItemForIDRefs_:function(a,c,b,g){function f(f,d,h){void 0!==h&&(h.id_ref||h.idRef)&&(h=c.getSnapshotAt(h.id_ref||h.idRef,g[b]))&&a.push({object:f,field:d,value:h})}function d(a){if(a instanceof Object&&!(a instanceof tracing.trace_model.ObjectSnapshot||a instanceof Float32Array||a instanceof base.Quad))if(a instanceof
-Array)for(var c=0;c<a.length;c++)f(a,c,a[c]),d(a[c]);else for(c in a){var b=a[c];f(a,c,b);d(b)}}if(!g.args)throw Error("");d(g.args)}};tracing.TraceModel.registerImporter(b);return{TraceEventImporter:b}});"use strict";
+a.args.id)throw Error("args cannot have an id field inside it");b(a.args,c,a,this)},this)},this)},joinObjectRefs_:function(){base.iterItems(this.model_.processes,function(a,c){this.joinObjectRefsForProcess_(c)},this)},joinObjectRefsForProcess_:function(a){var c=[];base.iterItems(a.threads,function(b,f){f.asyncSliceGroup.slices.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"start",b)},this);f.sliceGroup.slices.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"start",b)},this)},
+this);a.objects.iterObjectInstances(function(b){b.snapshots.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"ts",b)},this)},this);c.forEach(function(a){a.object[a.field]=a.value})},searchItemForIDRefs_:function(a,c,b,f){function d(g,h,m){void 0!==m&&(m.id_ref||m.idRef)&&(m=c.getSnapshotAt(m.id_ref||m.idRef,f[b]))&&a.push({object:g,field:h,value:m})}function h(a){if(a instanceof Object&&!(a instanceof tracing.trace_model.ObjectSnapshot||a instanceof Float32Array||a instanceof base.Quad))if(a instanceof
+Array)for(var c=0;c<a.length;c++)d(a,c,a[c]),h(a[c]);else for(c in a){var b=a[c];d(a,c,b);h(b)}}if(!f.args)throw Error("");h(f.args)}};tracing.TraceModel.registerImporter(b);return{TraceEventImporter:b}});"use strict";
base.exportTo("tracing.importer.v8",function(){function d(){}d.prototype.root_=null;d.prototype.isEmpty=function(){return!this.root_};d.prototype.insert=function(b,a){if(this.isEmpty())this.root_=new d.Node(b,a);else if(this.splay_(b),this.root_.key!=b){var c=new d.Node(b,a);b>this.root_.key?(c.left=this.root_,c.right=this.root_.right,this.root_.right=null):(c.right=this.root_,c.left=this.root_.left,this.root_.left=null);this.root_=c}};d.prototype.remove=function(b){if(this.isEmpty())throw Error("Key not found: "+
b);this.splay_(b);if(this.root_.key!=b)throw Error("Key not found: "+b);var a=this.root_;if(this.root_.left){var c=this.root_.right;this.root_=this.root_.left;this.splay_(b);this.root_.right=c}else this.root_=this.root_.right;return a};d.prototype.find=function(b){if(this.isEmpty())return null;this.splay_(b);return this.root_.key==b?this.root_:null};d.prototype.findMin=function(){if(this.isEmpty())return null;for(var b=this.root_;b.left;)b=b.left;return b};d.prototype.findMax=function(b){if(this.isEmpty())return null;
for(b=b||this.root_;b.right;)b=b.right;return b};d.prototype.findGreatestLessThan=function(b){if(this.isEmpty())return null;this.splay_(b);return this.root_.key<=b?this.root_:this.root_.left?this.findMax(this.root_.left):null};d.prototype.exportKeysAndValues=function(){var b=[];this.traverse_(function(a){b.push([a.key,a.value])});return b};d.prototype.exportValues=function(){var b=[];this.traverse_(function(a){b.push(a.value)});return b};d.prototype.splay_=function(b){if(!this.isEmpty()){var a,c,
-e;a=c=e=new d.Node(null,null);for(var g=this.root_;;)if(b<g.key){if(!g.left)break;if(b<g.left.key){var f=g.left;g.left=f.right;f.right=g;g=f;if(!g.left)break}e=e.left=g;g=g.left}else if(b>g.key){if(!g.right)break;if(b>g.right.key&&(f=g.right,g.right=f.left,f.left=g,g=f,!g.right))break;c=c.right=g;g=g.right}else break;c.right=g.left;e.left=g.right;g.left=a.right;g.right=a.left;this.root_=g}};d.prototype.traverse_=function(b){for(var a=[this.root_];0<a.length;){var c=a.shift();null!=c&&(b(c),a.push(c.left),
+e;a=c=e=new d.Node(null,null);for(var f=this.root_;;)if(b<f.key){if(!f.left)break;if(b<f.left.key){var g=f.left;f.left=g.right;g.right=f;f=g;if(!f.left)break}e=e.left=f;f=f.left}else if(b>f.key){if(!f.right)break;if(b>f.right.key&&(g=f.right,f.right=g.left,g.left=f,f=g,!f.right))break;c=c.right=f;f=f.right}else break;c.right=f.left;e.left=f.right;f.left=a.right;f.right=a.left;this.root_=f}};d.prototype.traverse_=function(b){for(var a=[this.root_];0<a.length;){var c=a.shift();null!=c&&(b(c),a.push(c.left),
a.push(c.right))}};d.Node=function(b,a){this.key=b;this.value=a};d.Node.prototype.left=null;d.Node.prototype.right=null;return{SplayTree:d}});"use strict";base.require("tracing.importer.v8.splaytree");
base.exportTo("tracing.importer.v8",function(){function d(){this.dynamics_=new tracing.importer.v8.SplayTree;this.dynamicsNameGen_=new tracing.importer.v8.CodeMap.NameGenerator;this.statics_=new tracing.importer.v8.SplayTree;this.libraries_=new tracing.importer.v8.SplayTree;this.pages_=[]}d.PAGE_ALIGNMENT=12;d.PAGE_SIZE=1<<d.PAGE_ALIGNMENT;d.prototype.addCode=function(b,a){this.deleteAllCoveredNodes_(this.dynamics_,b,b+a.size);this.dynamics_.insert(b,a)};d.prototype.moveCode=function(b,a){var c=this.dynamics_.remove(b);
-this.deleteAllCoveredNodes_(this.dynamics_,a,a+c.value.size);this.dynamics_.insert(a,c.value)};d.prototype.deleteCode=function(b){this.dynamics_.remove(b)};d.prototype.addLibrary=function(b,a){this.markPages_(b,b+a.size);this.libraries_.insert(b,a)};d.prototype.addStaticCode=function(b,a){this.statics_.insert(b,a)};d.prototype.markPages_=function(b,a){for(var c=b;c<=a;c+=d.PAGE_SIZE)this.pages_[c>>>d.PAGE_ALIGNMENT]=1};d.prototype.deleteAllCoveredNodes_=function(b,a,c){for(var e=[],g=c-1;g>=a;){var f=
-b.findGreatestLessThan(g);if(!f)break;g=f.key;f=g+f.value.size;g<c&&a<f&&e.push(g);g-=1}a=0;for(c=e.length;a<c;++a)b.remove(e[a])};d.prototype.isAddressBelongsTo_=function(b,a){return b>=a.key&&b<a.key+a.value.size};d.prototype.findInTree_=function(b,a){var c=b.findGreatestLessThan(a);return c&&this.isAddressBelongsTo_(a,c)?c.value:null};d.prototype.findEntry=function(b){if(b>>>d.PAGE_ALIGNMENT in this.pages_)return this.findInTree_(this.statics_,b)||this.findInTree_(this.libraries_,b);var a=this.dynamics_.findMin(),
+this.deleteAllCoveredNodes_(this.dynamics_,a,a+c.value.size);this.dynamics_.insert(a,c.value)};d.prototype.deleteCode=function(b){this.dynamics_.remove(b)};d.prototype.addLibrary=function(b,a){this.markPages_(b,b+a.size);this.libraries_.insert(b,a)};d.prototype.addStaticCode=function(b,a){this.statics_.insert(b,a)};d.prototype.markPages_=function(b,a){for(var c=b;c<=a;c+=d.PAGE_SIZE)this.pages_[c>>>d.PAGE_ALIGNMENT]=1};d.prototype.deleteAllCoveredNodes_=function(b,a,c){for(var e=[],f=c-1;f>=a;){var d=
+b.findGreatestLessThan(f);if(!d)break;f=d.key;d=f+d.value.size;f<c&&a<d&&e.push(f);f-=1}a=0;for(c=e.length;a<c;++a)b.remove(e[a])};d.prototype.isAddressBelongsTo_=function(b,a){return b>=a.key&&b<a.key+a.value.size};d.prototype.findInTree_=function(b,a){var c=b.findGreatestLessThan(a);return c&&this.isAddressBelongsTo_(a,c)?c.value:null};d.prototype.findEntry=function(b){if(b>>>d.PAGE_ALIGNMENT in this.pages_)return this.findInTree_(this.statics_,b)||this.findInTree_(this.libraries_,b);var a=this.dynamics_.findMin(),
c=this.dynamics_.findMax();if(null!=c&&b<c.key+c.value.size&&b>=a.key){b=this.findInTree_(this.dynamics_,b);if(null==b)return null;b.nameUpdated_||(b.name=this.dynamicsNameGen_.getName(b.name),b.nameUpdated_=!0);return b}return null};d.prototype.findDynamicEntryByStartAddress=function(b){return(b=this.dynamics_.find(b))?b.value:null};d.prototype.getAllDynamicEntries=function(){return this.dynamics_.exportValues()};d.prototype.getAllDynamicEntriesWithAddresses=function(){return this.dynamics_.exportKeysAndValues()};
d.prototype.getAllStaticEntries=function(){return this.statics_.exportValues()};d.prototype.getAllLibrariesEntries=function(){return this.libraries_.exportValues()};d.CodeEntry=function(b,a){this.size=b;this.name=a||"";this.nameUpdated_=!1};d.CodeEntry.prototype.getName=function(){return this.name};d.CodeEntry.prototype.toString=function(){return this.name+": "+this.size.toString(16)};d.NameGenerator=function(){this.knownNames_={}};d.NameGenerator.prototype.getName=function(b){if(!(b in this.knownNames_))return this.knownNames_[b]=
0,b;var a=++this.knownNames_[b];return b+" {"+a+"}"};return{CodeMap:d}});"use strict";
-base.exportTo("tracing.importer.v8",function(){function d(){}function b(a){this.dispatchTable_=a;this.lineNum_=0;this.csvParser_=new d}d.CSV_FIELD_RE_=/^"((?:[^"]|"")*)"|([^,]*)/;d.DOUBLE_QUOTE_RE_=/""/g;d.prototype.parseLine=function(a){var c=d.CSV_FIELD_RE_,b=d.DOUBLE_QUOTE_RE_,g=0,f=a.length,h=[];if(0<f){do{var k=c.exec(a.substr(g));"string"===typeof k[1]?(k=k[1],g+=k.length+3,h.push(k.replace(b,'"'))):(k=k[2],g+=k.length+1,h.push(k))}while(g<=f)}return h};b.prototype.printError=function(a){};
-b.prototype.processLogChunk=function(a){this.processLog_(a.split("\n"))};b.prototype.processLogLine=function(a){this.processLog_([a])};b.prototype.processStack=function(a,c,b){c=c?[a,c]:[a];for(var g=0,f=b.length;g<f;++g){var d=b[g],k=d.charAt(0);"+"==k||"-"==k?(a+=parseInt(d,16),c.push(a)):"o"!=k&&c.push(parseInt(d,16))}return c};b.prototype.skipDispatch=function(a){return!1};b.prototype.dispatchLogRow_=function(a){var c=a[0];if(c in this.dispatchTable_&&(c=this.dispatchTable_[c],null!==c&&!this.skipDispatch(c))){for(var b=
-[],g=0;g<c.parsers.length;++g){var f=c.parsers[g];if(null===f)b.push(a[1+g]);else if("function"==typeof f)b.push(f(a[1+g]));else{b.push(a.slice(1+g));break}}c.processor.apply(this,b)}};b.prototype.processLog_=function(a){for(var c=0,b=a.length;c<b;++c,++this.lineNum_){var g=a[c];if(g)try{var f=this.csvParser_.parseLine(g);this.dispatchLogRow_(f)}catch(d){this.printError("line "+(this.lineNum_+1)+": "+(d.message||d))}}};return{LogReader:b}});"use strict";base.require("tracing.trace_model");base.require("tracing.trace_model.slice");
+base.exportTo("tracing.importer.v8",function(){function d(){}function b(a){this.dispatchTable_=a;this.lineNum_=0;this.csvParser_=new d}d.CSV_FIELD_RE_=/^"((?:[^"]|"")*)"|([^,]*)/;d.DOUBLE_QUOTE_RE_=/""/g;d.prototype.parseLine=function(a){var c=d.CSV_FIELD_RE_,b=d.DOUBLE_QUOTE_RE_,f=0,g=a.length,h=[];if(0<g){do{var k=c.exec(a.substr(f));"string"===typeof k[1]?(k=k[1],f+=k.length+3,h.push(k.replace(b,'"'))):(k=k[2],f+=k.length+1,h.push(k))}while(f<=g)}return h};b.prototype.printError=function(a){};
+b.prototype.processLogChunk=function(a){this.processLog_(a.split("\n"))};b.prototype.processLogLine=function(a){this.processLog_([a])};b.prototype.processStack=function(a,c,b){c=c?[a,c]:[a];for(var f=0,d=b.length;f<d;++f){var h=b[f],k=h.charAt(0);"+"==k||"-"==k?(a+=parseInt(h,16),c.push(a)):"o"!=k&&c.push(parseInt(h,16))}return c};b.prototype.skipDispatch=function(a){return!1};b.prototype.dispatchLogRow_=function(a){var c=a[0];if(c in this.dispatchTable_&&(c=this.dispatchTable_[c],null!==c&&!this.skipDispatch(c))){for(var b=
+[],f=0;f<c.parsers.length;++f){var d=c.parsers[f];if(null===d)b.push(a[1+f]);else if("function"==typeof d)b.push(d(a[1+f]));else{b.push(a.slice(1+f));break}}c.processor.apply(this,b)}};b.prototype.processLog_=function(a){for(var c=0,b=a.length;c<b;++c,++this.lineNum_){var f=a[c];if(f)try{var d=this.csvParser_.parseLine(f);this.dispatchLogRow_(d)}catch(h){this.printError("line "+(this.lineNum_+1)+": "+(h.message||h))}}};return{LogReader:b}});"use strict";base.require("tracing.trace_model");base.require("tracing.trace_model.slice");
base.require("tracing.color_scheme");base.require("tracing.importer.v8.log_reader");base.require("tracing.importer.v8.codemap");
base.exportTo("tracing.importer",function(){function d(a,b){this.importPriority=3;this.model_=a;this.logData_=b;this.code_map_=new tracing.importer.v8.CodeMap;this.v8_samples_thread_=this.v8_stack_thread_=this.v8_timer_thread_=void 0}var b=["/d8","/libv8.so"],a={"V8.Execute":{pause:!1,no_execution:!1},"V8.External":{pause:!1,no_execution:!0},"V8.CompileFullCode":{pause:!0,no_execution:!0},"V8.RecompileSynchronous":{pause:!0,no_execution:!0},"V8.RecompileParallel":{pause:!1,no_execution:!1},"V8.CompileEval":{pause:!0,
no_execution:!0},"V8.Parse":{pause:!0,no_execution:!0},"V8.PreParse":{pause:!0,no_execution:!0},"V8.ParseLazy":{pause:!0,no_execution:!0},"V8.GCScavenger":{pause:!0,no_execution:!0},"V8.GCCompactor":{pause:!0,no_execution:!0},"V8.GCContext":{pause:!0,no_execution:!0}};d.canImport=function(a){return"string"===typeof a||a instanceof String?"timer-event,"==a.substring(0,12)||"tick,"==a.substring(0,5)||"shared-library,"==a.substring(0,15)||"profiler,"==a.substring(0,9):!1};d.prototype={__proto__:Object.prototype,
-extractSubtrace:function(){},processTimerEvent_:function(c,b,g){var f=a[c];if(void 0!==f){b/=1E3;g/=1E3;var d=tracing.getStringColorId(c);c=new tracing.trace_model.Slice("v8",c,d,b,f,g);this.v8_timer_thread_.sliceGroup.pushSlice(c)}},processTimerEventStart_:function(c,b){var g=a[c];void 0!==g&&this.v8_timer_thread_.sliceGroup.beginSlice("v8",c,b/1E3,g)},processTimerEventEnd_:function(a,b){this.v8_timer_thread_.sliceGroup.endSlice(b/1E3)},processCodeCreateEvent_:function(a,b,g,f,d){a=new tracing.importer.v8.CodeMap.CodeEntry(f,
-d);a.kind=b;this.code_map_.addCode(g,a)},processCodeMoveEvent_:function(a,b){this.code_map_.moveCode(a,b)},processCodeDeleteEvent_:function(a){this.code_map_.deleteCode(a)},processSharedLibrary_:function(a,e,g){g=new tracing.importer.v8.CodeMap.CodeEntry(g-e,a);g.kind=-3;for(var f=0;f<b.length;f++){var d=b[f];if(0<=a.indexOf(d,a.length-d.length)){g.kind=-1;break}}this.code_map_.addLibrary(e,g)},findCodeKind_:function(a){for(name in CodeKinds)if(0<=CodeKinds[name].kinds.indexOf(a))return CodeKinds[name]},
-nameForCodeEntry_:function(a){return a?a.name:"UnknownCode"},processTickEvent_:function(a,b,d,f,h,k,l){b=this.code_map_.findEntry(a);b=this.nameForCodeEntry_(b);d/=1E3;this.v8_samples_thread_.addSample("v8",b,d);if(l&&l.length)for(a=0;8>a&&l[a];a++)b=this.code_map_.findEntry(l[a]),b=this.nameForCodeEntry_(b),f=tracing.getStringColorId(b),b=new tracing.trace_model.Slice("v8",b,f,d,{},0),this.v8_stack_thread_.sliceGroup.pushSlice(b)},processDistortion_:function(a){distortion_per_entry=a/1E6},processPlotRange_:function(a,
+extractSubtrace:function(){},processTimerEvent_:function(c,b,f){var d=a[c];if(void 0!==d){b/=1E3;f/=1E3;var h=tracing.getStringColorId(c);c=new tracing.trace_model.Slice("v8",c,h,b,d,f);this.v8_timer_thread_.sliceGroup.pushSlice(c)}},processTimerEventStart_:function(c,b){var f=a[c];void 0!==f&&this.v8_timer_thread_.sliceGroup.beginSlice("v8",c,b/1E3,f)},processTimerEventEnd_:function(a,b){this.v8_timer_thread_.sliceGroup.endSlice(b/1E3)},processCodeCreateEvent_:function(a,b,f,d,h){a=new tracing.importer.v8.CodeMap.CodeEntry(d,
+h);a.kind=b;this.code_map_.addCode(f,a)},processCodeMoveEvent_:function(a,b){this.code_map_.moveCode(a,b)},processCodeDeleteEvent_:function(a){this.code_map_.deleteCode(a)},processSharedLibrary_:function(a,e,f){f=new tracing.importer.v8.CodeMap.CodeEntry(f-e,a);f.kind=-3;for(var d=0;d<b.length;d++){var h=b[d];if(0<=a.indexOf(h,a.length-h.length)){f.kind=-1;break}}this.code_map_.addLibrary(e,f)},findCodeKind_:function(a){for(name in CodeKinds)if(0<=CodeKinds[name].kinds.indexOf(a))return CodeKinds[name]},
+nameForCodeEntry_:function(a){return a?a.name:"UnknownCode"},processTickEvent_:function(a,b,f,d,h,k,l){b=this.code_map_.findEntry(a);b=this.nameForCodeEntry_(b);f/=1E3;this.v8_samples_thread_.addSample("v8",b,f);if(l&&l.length)for(a=0;8>a&&l[a];a++)b=this.code_map_.findEntry(l[a]),b=this.nameForCodeEntry_(b),d=tracing.getStringColorId(b),b=new tracing.trace_model.Slice("v8",b,d,f,{},0),this.v8_stack_thread_.sliceGroup.pushSlice(b)},processDistortion_:function(a){distortion_per_entry=a/1E6},processPlotRange_:function(a,
b){xrange_start_override=a;xrange_end_override=b},importEvents:function(){var a=new tracing.importer.v8.LogReader({"timer-event":{parsers:[null,parseInt,parseInt],processor:this.processTimerEvent_.bind(this)},"shared-library":{parsers:[null,parseInt,parseInt],processor:this.processSharedLibrary_.bind(this)},"timer-event-start":{parsers:[null,parseInt],processor:this.processTimerEventStart_.bind(this)},"timer-event-end":{parsers:[null,parseInt],processor:this.processTimerEventEnd_.bind(this)},"code-creation":{parsers:[null,
parseInt,parseInt,parseInt,null],processor:this.processCodeCreateEvent_.bind(this)},"code-move":{parsers:[parseInt,parseInt],processor:this.processCodeMoveEvent_.bind(this)},"code-delete":{parsers:[parseInt],processor:this.processCodeDeleteEvent_.bind(this)},tick:{parsers:[parseInt,parseInt,parseInt,null,null,parseInt,"var-args"],processor:this.processTickEvent_.bind(this)},distortion:{parsers:[parseInt],processor:this.processDistortion_.bind(this)},"plot-range":{parsers:[parseInt,parseInt],processor:this.processPlotRange_.bind(this)}});
-this.v8_timer_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(1);this.v8_timer_thread_.name="V8 Timers";this.v8_stack_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(2);this.v8_stack_thread_.name="V8 JavaScript";this.v8_samples_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(3);this.v8_samples_thread_.name="V8 PC";for(var b=this.logData_.split("\n"),d=0;d<b.length;d++)a.processLogLine(b[d])},finalizeImport:function(){},joinRefs:function(){}};tracing.TraceModel.registerImporter(d);
+this.v8_timer_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(1);this.v8_timer_thread_.name="V8 Timers";this.v8_stack_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(2);this.v8_stack_thread_.name="V8 JavaScript";this.v8_samples_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(3);this.v8_samples_thread_.name="V8 PC";for(var b=this.logData_.split("\n"),f=0;f<b.length;f++)a.processLogLine(b[f])},finalizeImport:function(){},joinRefs:function(){}};tracing.TraceModel.registerImporter(d);
return{V8LogImporter:d}});"use strict";base.require("tracing.importer.linux_perf_importer");base.require("tracing.importer.trace_event_importer");base.require("tracing.importer.v8_log_importer");"use strict";base.exportTo("tracing.analysis",function(){return{tsRound:function(d){return Math.round(1E3*d)/1E3}}});"use strict";base.require("base.events");base.require("base.guid");base.require("base.range");
-base.exportTo("tracing",function(){function d(a,b){this.track=a;this.slice=b}function b(a,b,c){this.track=a;this.counter=b;this.sampleIndex=c}function a(a,b){this.track=a;this.objectSnapshot=b}function c(a,b){this.track=a;this.objectInstance=b}function e(a){this.bounds_dirty_=!0;this.bounds_=new base.Range;this.length_=0;this.guid_=base.GUID.allocate();a&&this.pushHits(a)}d.prototype={get modelObject(){return this.slice},get selected(){return this.slice.selected},set selected(a){this.slice.selected=
-a},addBoundsToRange:function(a){a.addValue(this.slice.start);a.addValue(this.slice.end)}};b.prototype={get modelObject(){return this.sampleIndex},get selected(){return!0==this.track.selectedSamples[this.sampleIndex]},set selected(a){this.track.selectedSamples[this.sampleIndex]=a?!0:!1;this.track.invalidate()},addBoundsToRange:function(a){this.track.timestamps&&a.addValue(this.track.timestamps[this.sampleIndex])}};a.prototype={get modelObject(){return this.objectSnapshot},get selected(){return this.objectSnapshot.selected},
-set selected(a){this.objectSnapshot.selected=a},addBoundsToRange:function(a){a.addValue(this.objectSnapshot.ts)}};c.prototype={get modelObject(){return this.objectInstance},get selected(){return this.objectInstance.selected},set selected(a){this.objectInstance.selected=a},addBoundsToRange:function(a){a.addRange(this.objectInstance.bounds)}};var g=[{constructor:d,name:"slice",pluralName:"slices"},{constructor:b,name:"counterSample",pluralName:"counterSamples"},{constructor:a,name:"objectSnapshot",
+base.exportTo("tracing",function(){function d(a,c){this.track=a;this.slice=c}function b(a,c,b){this.track=a;this.counter=c;this.sampleIndex=b}function a(a,c){this.track=a;this.objectSnapshot=c}function c(a,c){this.track=a;this.objectInstance=c}function e(a){this.bounds_dirty_=!0;this.bounds_=new base.Range;this.length_=0;this.guid_=base.GUID.allocate();a&&this.pushHits(a)}d.prototype={get modelObject(){return this.slice},get selected(){return this.slice.selected},set selected(a){this.slice.selected=
+a},addBoundsToRange:function(a){a.addValue(this.slice.start);a.addValue(this.slice.end)}};b.prototype={get modelObject(){return this.sampleIndex},get selected(){return!0==this.track.selectedSamples[this.sampleIndex]},set selected(a){this.track.selectedSamples[this.sampleIndex]=a?!0:!1},addBoundsToRange:function(a){this.track.timestamps&&a.addValue(this.track.timestamps[this.sampleIndex])}};a.prototype={get modelObject(){return this.objectSnapshot},get selected(){return this.objectSnapshot.selected},
+set selected(a){this.objectSnapshot.selected=a},addBoundsToRange:function(a){a.addValue(this.objectSnapshot.ts)}};c.prototype={get modelObject(){return this.objectInstance},get selected(){return this.objectInstance.selected},set selected(a){this.objectInstance.selected=a},addBoundsToRange:function(a){a.addRange(this.objectInstance.bounds)}};var f=[{constructor:d,name:"slice",pluralName:"slices"},{constructor:b,name:"counterSample",pluralName:"counterSamples"},{constructor:a,name:"objectSnapshot",
pluralName:"objectSnapshots"},{constructor:c,name:"objectInstance",pluralName:"objectInstances"}];e.prototype={__proto__:Object.prototype,get bounds(){if(this.bounds_dirty_){this.bounds_.reset();for(var a=0;a<this.length_;a++)this[a].addBoundsToRange(this.bounds_);this.bounds_dirty_=!1}return this.bounds_},get duration(){return this.bounds_.isEmpty?0:this.bounds_.max-this.bounds_.min},get length(){return this.length_},get guid(){return this.guid_},clear:function(){for(var a=0;a<this.length_;++a)delete this[a];
-this.length_=0;this.bounds_dirty_=!0},pushHit:function(a){this.push_(a)},pushHits:function(a){for(var b=0;b<a.length;b++)this.pushHit(a[b])},push_:function(a){this[this.length_++]=a;this.bounds_dirty_=!0;return a},addSlice:function(a,b){return this.push_(new d(a,b))},addCounterSample:function(a,c,e){return this.push_(new b(a,c,e))},addObjectSnapshot:function(b,c){return this.push_(new a(b,c))},addObjectInstance:function(a,b){return this.push_(new c(a,b))},addSelection:function(a){for(var b=0;b<a.length;b++)this.push_(a[b])},
-subSelection:function(a,b){b=b||1;var c=new e;c.bounds_dirty_=!0;if(0>a||a+b>this.length_)throw Error("Index out of bounds");for(var d=a;d<a+b;d++)c.push_(this[d]);return c},getCounterSampleHitsAsSelection:function(){var a=new e;this.enumHitsOfType(b,a.push_.bind(a));return a},getSliceHitsAsSelection:function(){var a=new e;this.enumHitsOfType(d,a.push_.bind(a));return a},getHitsOrganizedByType:function(){var a={};g.forEach(function(b){a[b.pluralName]=new e});for(var b=0;b<this.length_;b++){var c=
-this[b];g.forEach(function(b){c instanceof b.constructor&&a[b.pluralName].push_(c)})}return a},enumHitsOfType:function(a,b){for(var c=0;c<this.length_;c++)this[c]instanceof a&&b(this[c])},getNumSliceHits:function(){var a=0;this.enumHitsOfType(d,function(b){a++});return a},getNumCounterHits:function(){var a=0;this.enumHitsOfType(b,function(b){a++});return a},getNumObjectSnapshotHits:function(){var b=0;this.enumHitsOfType(a,function(a){b++});return b},getNumObjectInstanceHits:function(){var a=0;this.enumHitsOfType(c,
-function(b){a++});return a},map:function(a){for(var b=0;b<this.length_;b++)a(this[b])},getShiftedSelection:function(a){for(var b=new e,c=0;c<this.length_;c++){var d=this[c];d.track.addItemNearToProvidedHitToSelection(d,a,b)}return 0==b.length?void 0:b}};return{SelectionSliceHit:d,SelectionCounterSampleHit:b,SelectionObjectSnapshotHit:a,SelectionObjectInstanceHit:c,Selection:e,createSelectionFromObjectAndView:function(a,b){var c=new e;if(a instanceof tracing.trace_model.Slice)c.addSlice(void 0,a);
-else if(a instanceof tracing.trace_model.ObjectSnapshot)c.addObjectSnapshot(void 0,a);else if(a instanceof tracing.trace_model.ObjectInstance)c.addObjectInstance(void 0,a);else throw Error("Unrecognized selection type");return c}}});"use strict";
+this.length_=0;this.bounds_dirty_=!0},pushHit:function(a){this.push_(a)},pushHits:function(a){for(var c=0;c<a.length;c++)this.pushHit(a[c])},push_:function(a){this[this.length_++]=a;this.bounds_dirty_=!0;return a},addSlice:function(a,c){return this.push_(new d(a,c))},addCounterSample:function(a,c,e){return this.push_(new b(a,c,e))},addObjectSnapshot:function(c,b){return this.push_(new a(c,b))},addObjectInstance:function(a,b){return this.push_(new c(a,b))},addSelection:function(a){for(var c=0;c<a.length;c++)this.push_(a[c])},
+subSelection:function(a,c){c=c||1;var b=new e;b.bounds_dirty_=!0;if(0>a||a+c>this.length_)throw Error("Index out of bounds");for(var f=a;f<a+c;f++)b.push_(this[f]);return b},getCounterSampleHitsAsSelection:function(){var a=new e;this.enumHitsOfType(b,a.push_.bind(a));return a},getSliceHitsAsSelection:function(){var a=new e;this.enumHitsOfType(d,a.push_.bind(a));return a},getHitsOrganizedByType:function(){var a={};f.forEach(function(c){a[c.pluralName]=new e});for(var c=0;c<this.length_;c++){var b=
+this[c];f.forEach(function(c){b instanceof c.constructor&&a[c.pluralName].push_(b)})}return a},enumHitsOfType:function(a,c){for(var b=0;b<this.length_;b++)this[b]instanceof a&&c(this[b])},getNumSliceHits:function(){var a=0;this.enumHitsOfType(d,function(c){a++});return a},getNumCounterHits:function(){var a=0;this.enumHitsOfType(b,function(c){a++});return a},getNumObjectSnapshotHits:function(){var c=0;this.enumHitsOfType(a,function(a){c++});return c},getNumObjectInstanceHits:function(){var a=0;this.enumHitsOfType(c,
+function(c){a++});return a},map:function(a){for(var c=0;c<this.length_;c++)a(this[c])},getShiftedSelection:function(a){for(var c=new e,b=0;b<this.length_;b++){var f=this[b];f.track.addItemNearToProvidedHitToSelection(f,a,c)}return 0==c.length?void 0:c}};return{SelectionSliceHit:d,SelectionCounterSampleHit:b,SelectionObjectSnapshotHit:a,SelectionObjectInstanceHit:c,Selection:e,createSelectionFromObjectAndView:function(a,c){var b=new e;if(a instanceof tracing.trace_model.Slice)b.addSlice(void 0,a);
+else if(a instanceof tracing.trace_model.ObjectSnapshot)b.addObjectSnapshot(void 0,a);else if(a instanceof tracing.trace_model.ObjectInstance)b.addObjectInstance(void 0,a);else throw Error("Unrecognized selection type");return b}}});"use strict";
base.exportTo("ui",function(){return{decorate:function(d,b){var a;a="string"==typeof d?base.doc.querySelectorAll(d):[d];for(var c=0,e;e=a[c];c++)e instanceof b||b.decorate(e)},define:function(d,b){function a(){if(b&&a.prototype.__proto__!=b.prototype)throw Error(d+" prototye's __proto__ field is messed up. It MUST be the prototype of "+b.tagName);var c=d;if(b)for(var e=b;e&&e.tagName;)c=e.tagName,e=e.parentConstructor;c=base.doc.createElement(c);a.decorate.call(this,c,arguments);return c}if("function"==
-typeof d)throw Error("Passing functions as tagName is deprecated. Please use (tagName, opt_parentConstructor) to subclass");d=d.toLowerCase();if(b&&!b.tagName)throw Error("opt_parentConstructor was not created by ui.define");a.decorate=function(b,e){b.__proto__=a.prototype;b.decorate.apply(b,e)};a.tagName=d;a.parentConstructor=b?b:void 0;a.toString=function(){return a.parentConstructor?a.parentConstructor.toString()+"::"+a.tagName:a.tagName};return a},elementIsChildOf:function(d,b){if(d==b)return!1;
+typeof d)throw Error("Passing functions as tagName is deprecated. Please use (tagName, opt_parentConstructor) to subclass");d=d.toLowerCase();if(b&&!b.tagName)throw Error("opt_parentConstructor was not created by ui.define");a.decorate=function(c,b){c.__proto__=a.prototype;c.decorate.apply(c,b)};a.tagName=d;a.parentConstructor=b?b:void 0;a.toString=function(){return a.parentConstructor?a.parentConstructor.toString()+"::"+a.tagName:a.tagName};return a},elementIsChildOf:function(d,b){if(d==b)return!1;
for(var a=d;a.parentNode;){if(a==b)return!0;a=a.parentNode}return!1}}});"use strict";base.requireStylesheet("tracing.analysis.analysis_link");base.require("base.events");base.require("tracing.selection");base.require("tracing.analysis.util");base.require("ui");
base.exportTo("tracing.analysis",function(){var d=tracing.analysis.tsRound,b=base.Event.bind(void 0,"requestSelectionChange",!0,!1),a=ui.define("a");a.prototype={__proto__:HTMLAnchorElement.prototype,decorate:function(){this.classList.add("analysis-link");this.selectionGenerator;this.addEventListener("click",this.onClicked_.bind(this))},onClicked_:function(){var a=new b;a.selection=this.selectionGenerator();this.dispatchEvent(a)}};var c=ui.define("object-snapshot-link",a);c.prototype={__proto__:a.prototype,
decorate:function(){a.prototype.decorate.apply(this)},set objectSnapshot(a){this.textContent=a.objectInstance.typeName+" "+a.objectInstance.id+" @ "+d(a.ts)+" ms";this.selectionGenerator=function(){return tracing.createSelectionFromObjectAndView(a,this)}.bind(this)}};var e=ui.define("object-instance-link",a);e.prototype={__proto__:a.prototype,decorate:function(){a.prototype.decorate.apply(this)},set objectInstance(a){this.textContent=a.typeName+" "+a.id;this.selectionGenerator=function(){return tracing.createSelectionFromObjectAndView(a,
this)}.bind(this)}};return{RequestSelectionChangeEvent:b,AnalysisLink:a,ObjectSnapshotLink:c,ObjectInstanceLink:e}});"use strict";base.requireStylesheet("tracing.analysis.generic_object_view");base.require("base.utils");base.require("tracing.analysis.analysis_link");base.require("ui");
-base.exportTo("tracing.analysis",function(){var d=ui.define("x-generic-object-view");d.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.object_=void 0},get object(){return this.object_},set object(b){this.object_=b;this.updateContents_()},updateContents_:function(){this.textContent="";this.appendElementsForType_("",this.object_,0,0,5,"")},appendElementsForType_:function(b,a,c,e,d,f){e>d?this.appendSimpleText_(b,c,"<recursion limit reached>",f):void 0===a?this.appendSimpleText_(b,
-c,"undefined",f):null===a?this.appendSimpleText_(b,c,"null",f):a instanceof Object?a instanceof tracing.trace_model.ObjectSnapshot?(e=new tracing.analysis.ObjectSnapshotLink(a),e.objectSnapshot=a,this.appendElementWithLabel_(b,c,e,f)):a instanceof tracing.trace_model.ObjectInstance?(e=new tracing.analysis.ObjectInstanceLink(a),e.objectInstance=a,this.appendElementWithLabel_(b,c,e,f)):a instanceof Array?this.appendElementsForArray_(b,a,c,e,d,f):this.appendElementsForObject_(b,a,c,e,d,f):"string"==
-typeof a?this.appendSimpleText_(b,c,'"'+a+'"',f):this.appendSimpleText_(b,c,a,f)},appendElementsForArray_:function(b,a,c,e,d,f){if(0==a.length)this.appendSimpleText_(b,c,"[]",f);else{this.appendElementsForType_(b+"[",a[0],c,e+1,d,1<a.length?",":"]"+f);for(var h=1;h<a.length;h++)this.appendElementsForType_("",a[h],c+b.length+1,e+1,d,h<a.length-1?",":"]"+f)}},appendElementsForObject_:function(b,a,c,e,d,f){var h=base.dictionaryKeys(a);if(0==h.length)this.appendSimpleText_(b,c,"{}",f);else{this.appendElementsForType_(b+
-"{"+h[0]+": ",a[h[0]],c,e,d,1<h.length?",":"}"+f);for(var k=1;k<h.length;k++)this.appendElementsForType_(h[k]+": ",a[h[k]],c+b.length+1,e+1,d,k<h.length-1?",":"}"+f)}},appendElementWithLabel_:function(b,a,c,e){var d=document.createElement("div"),f=document.createElement("span");f.style.whiteSpace="pre";for(var h=0;h<a;h++)f.textContent+=" ";d.appendChild(f);a=document.createElement("span");a.textContent=b;d.appendChild(a);d.appendChild(c);b=document.createElement("span");b.textContent=e;d.appendChild(b);
-d.dataElement=c;this.appendChild(d)},appendSimpleText_:function(b,a,c,e){var d=this.ownerDocument.createElement("span");d.textContent=c;this.appendElementWithLabel_(b,a,d,e);return d}};return{GenericObjectView:d}});"use strict";base.requireStylesheet("tracing.analysis.analysis_results");base.require("tracing.analysis.util");base.require("tracing.analysis.analysis_link");base.require("tracing.analysis.generic_object_view");base.require("ui");
+base.exportTo("tracing.analysis",function(){var d=ui.define("x-generic-object-view");d.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.object_=void 0},get object(){return this.object_},set object(b){this.object_=b;this.updateContents_()},updateContents_:function(){this.textContent="";this.appendElementsForType_("",this.object_,0,0,5,"")},appendElementsForType_:function(b,a,c,e,f,d){e>f?this.appendSimpleText_(b,c,"<recursion limit reached>",d):void 0===a?this.appendSimpleText_(b,
+c,"undefined",d):null===a?this.appendSimpleText_(b,c,"null",d):a instanceof Object?a instanceof tracing.trace_model.ObjectSnapshot?(e=new tracing.analysis.ObjectSnapshotLink(a),e.objectSnapshot=a,this.appendElementWithLabel_(b,c,e,d)):a instanceof tracing.trace_model.ObjectInstance?(e=new tracing.analysis.ObjectInstanceLink(a),e.objectInstance=a,this.appendElementWithLabel_(b,c,e,d)):a instanceof Array?this.appendElementsForArray_(b,a,c,e,f,d):this.appendElementsForObject_(b,a,c,e,f,d):"string"==
+typeof a?this.appendSimpleText_(b,c,'"'+a+'"',d):this.appendSimpleText_(b,c,a,d)},appendElementsForArray_:function(b,a,c,e,f,d){if(0==a.length)this.appendSimpleText_(b,c,"[]",d);else{this.appendElementsForType_(b+"[",a[0],c,e+1,f,1<a.length?",":"]"+d);for(var h=1;h<a.length;h++)this.appendElementsForType_("",a[h],c+b.length+1,e+1,f,h<a.length-1?",":"]"+d)}},appendElementsForObject_:function(b,a,c,e,f,d){var h=base.dictionaryKeys(a);if(0==h.length)this.appendSimpleText_(b,c,"{}",d);else{this.appendElementsForType_(b+
+"{"+h[0]+": ",a[h[0]],c,e,f,1<h.length?",":"}"+d);for(var k=1;k<h.length;k++)this.appendElementsForType_(h[k]+": ",a[h[k]],c+b.length+1,e+1,f,k<h.length-1?",":"}"+d)}},appendElementWithLabel_:function(b,a,c,e){var f=document.createElement("div"),d=document.createElement("span");d.style.whiteSpace="pre";for(var h=0;h<a;h++)d.textContent+=" ";f.appendChild(d);a=document.createElement("span");a.textContent=b;f.appendChild(a);f.appendChild(c);b=document.createElement("span");b.textContent=e;f.appendChild(b);
+f.dataElement=c;this.appendChild(f)},appendSimpleText_:function(b,a,c,e){var f=this.ownerDocument.createElement("span");f.textContent=c;this.appendElementWithLabel_(b,a,f,e);return f}};return{GenericObjectView:d}});"use strict";base.requireStylesheet("tracing.analysis.analysis_results");base.require("tracing.analysis.util");base.require("tracing.analysis.analysis_link");base.require("tracing.analysis.generic_object_view");base.require("ui");
base.exportTo("tracing.analysis",function(){var d=ui.define("div");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.className="analysis-results"},clear:function(){this.textContent=""},createSelectionChangingLink:function(b,a,c){var e=this.ownerDocument.createElement("a");tracing.analysis.AnalysisLink.decorate(e);e.textContent=b;e.selectionGenerator=a;c&&(e.title=c);return e},appendElement_:function(b,a,c){a=b.ownerDocument.createElement(a);b.appendChild(a);void 0!=c&&(a.textContent=
-c);return a},appendText_:function(b,a){b.ownerDocument.createTextNode(a);b.appendChild(textNode);return textNode},appendTableCell_:function(b,a,c,e){a=this.appendElement_(a,"td",e);a.className=b.className+"-col-"+c;return a},appendTableCell:function(b,a,c){return this.appendTableCell_(b,a,a.children.length,c)},appendTableCellWithTooltip_:function(b,a,c,e,d){if(d)return a=this.appendElement_(a,"td"),a.className=b.className+"-col-"+c,b=this.appendElement_(a,"span",e),b.className="tooltip",b.title=d,
+c);return a},appendText_:function(b,a){b.ownerDocument.createTextNode(a);b.appendChild(textNode);return textNode},appendTableCell_:function(b,a,c,e){a=this.appendElement_(a,"td",e);a.className=b.className+"-col-"+c;return a},appendTableCell:function(b,a,c){return this.appendTableCell_(b,a,a.children.length,c)},appendTableCellWithTooltip_:function(b,a,c,e,f){if(f)return a=this.appendElement_(a,"td"),a.className=b.className+"-col-"+c,b=this.appendElement_(a,"span",e),b.className="tooltip",b.title=f,
a;this.appendTableCell_(b,a,c,e)},appendTable:function(b,a){var c=this.appendElement_(this,"table");c.headerRow=this.appendElement_(c,"tr");c.className=b+" analysis-table";c.numColumns=a;return c},appendTableHeader:function(b,a){this.appendElement_(b.headerRow,"th",a).className="analysis-table-header"},appendTableRow:function(b){return this.appendElement_(b,"tr")},appendSummaryRow:function(b,a,c){var e=this.appendElement_(b,"tr");e.className="analysis-table-row";this.appendTableCell_(b,e,0,a);void 0!==
c?(a=new tracing.analysis.GenericObjectView,a.object=c,a.classList.add("analysis-table-col-1"),a.style.display="table-cell",e.appendChild(a)):this.appendTableCell_(b,e,1,"");for(c=2;c<b.numColumns;c++)this.appendTableCell_(b,e,c,"")},appendSpacingRow:function(b){var a=this.appendElement_(b,"tr");a.className="analysis-table-row";for(var c=0;c<b.numColumns;c++)this.appendTableCell_(b,a,c," ")},appendSummaryRowTime:function(b,a,c){this.appendSummaryRow(b,a,tracing.analysis.tsRound(c)+" ms")},appendDataRow:function(b,
-a,c,e,d,f){var h=void 0;d&&(h="Min Duration:\t"+tracing.analysis.tsRound(d.min)+" ms \rMax Duration:\t"+tracing.analysis.tsRound(d.max)+" ms \rAvg Duration:\t"+tracing.analysis.tsRound(d.avg)+" ms (\u03c3 = "+tracing.analysis.tsRound(d.avg_stddev)+")",d.start&&(h+="\rStart Time:\t"+tracing.analysis.tsRound(d.start)+" ms"),d.end&&(h+="\rEnd Time:\t"+tracing.analysis.tsRound(d.end)+" ms"),d.frequency&&d.frequency_stddev&&(h+="\rFrequency:\t"+tracing.analysis.tsRound(d.frequency)+" occurrences/s (\u03c3 = "+
-tracing.analysis.tsRound(d.frequency_stddev)+")"));d=this.appendElement_(b,"tr");d.className="analysis-table-row";if(f){var k=this.appendTableCellWithTooltip_(b,d,0,a,h);k.textContent="";k.appendChild(this.createSelectionChangingLink(a,f,h))}else this.appendTableCellWithTooltip_(b,d,0,a,h);void 0!==c?this.appendTableCellWithTooltip_(b,d,1,tracing.analysis.tsRound(c)+" ms",h):this.appendTableCell_(b,d,1,"");void 0!==e?this.appendTableCellWithTooltip_(b,d,2,String(e)+" occurrences",h):this.appendTableCell_(b,
-d,2,"")}};return{AnalysisResults:d}});"use strict";base.require("tracing.analysis.util");base.require("ui");
-base.exportTo("tracing.analysis",function(){return{analyzeSingleCounterSampleHit:function(d,b){for(var a=b.counter,c=b.sampleIndex,e=[],g=0;g<a.numSeries;++g)e.push(a.samples[a.numSeries*c+g]);var f=d.appendTable("analysis-counter-table",2);d.appendTableHeader(f,"Selected counter:");d.appendSummaryRow(f,"Title",a.name);d.appendSummaryRowTime(f,"Timestamp",a.timestamps[c]);for(g=0;g<a.numSeries;g++)d.appendSummaryRow(f,a.seriesNames[g],e[g])},analyzeMultipleCounterSampleHits:function(d,b){for(var a=
-{},c=0;c<b.length;c++){var e=b[c].counter;a[e.guid]||(a[e.guid]=[]);a[e.guid].push(b[c])}var g=d.appendTable("analysis-counter-table",7);d.appendTableHeader(g,"Counters:");for(var f in a){for(var h=a[f],e=h[0].counter,k=[],c=0;c<h.length;c++)k.push(h[c].sampleIndex);h=e.getSampleStatistics(k);for(c=0;c<h.length;c++)d.appendDataRow(g,e.name+": "+e.seriesNames[c],void 0,void 0,h[c])}}}});"use strict";base.requireStylesheet("tracing.analysis.analyze_slices");base.require("tracing.analysis.util");base.require("ui");
-base.exportTo("tracing.analysis",function(){function d(b,a){var c=a.slice,e=b.appendTable("analysis-slice-table",2);b.appendTableHeader(e,"Selected slice:");b.appendSummaryRow(e,"Title",c.title);c.category&&b.appendSummaryRow(e,"Category",c.category);b.appendSummaryRowTime(e,"Start",c.start);b.appendSummaryRowTime(e,"Duration",c.duration);c.durationInUserTime&&b.appendSummaryRowTime(e,"Duration (U)",c.durationInUserTime);var d=0,f;for(f in c.args)d+=1;if(0<d)for(f in b.appendSummaryRow(e,"Args"),
-c.args)b.appendSummaryRow(e," "+f,c.args[f])}return{analyzeSingleSliceHit:d,analyzeMultipleSliceHits:function(b,a){var c=a.bounds.min,e=a.bounds.max;a.map(function(a){return a.slice.title});for(var g=0,f={},h=0;h<a.length;h++){var k=a[h].slice;f[k.title]||(f[k.title]={hits:[]},g++);f[k.title].hits.push(a[h])}var l;l=b.appendTable("analysis-slices-table",3);b.appendTableHeader(l,"Slices:");var m=0;base.iterItems(f,function(a,c){for(var e=0,f=0,h=Number.MAX_VALUE,k=-Number.MAX_VALUE,t=Number.MAX_VALUE,
-r=-Number.MAX_VALUE,f=0;f<c.hits.length;f++)var u=c.hits[f].slice,e=e+u.duration,h=Math.min(u.start,h),k=Math.max(u.start,k),t=Math.min(u.duration,t),r=Math.max(u.duration,r);m+=e;0==c.hits.length&&(f=0);f=e/c.hits.length;t={min:t,max:r,avg:f,avg_stddev:void 0,frequency:void 0,frequency_stddev:void 0};for(f=r=0;f<c.hits.length;f++)u=t.avg-c.hits[f].slice.duration,r+=u*u;t.avg_stddev=Math.sqrt(r/(c.hits.length-1));k-=h;if(2<c.hits.length&&0<k){h=c.hits.length-1;t.frequency=1E3*h/k;r=0;for(f=1;f<c.hits.length;f++)u=
-t.frequency-1E3/(c.hits[f].slice.start-c.hits[f-1].slice.start),r+=u*u;t.frequency_stddev=Math.sqrt(r/(h-1))}b.appendDataRow(l,a,e,c.hits.length,t,function(){return new tracing.Selection(c.hits)});if(1===g)for(f=0;f<c.hits.length;f++)d(b,c.hits[f])});1!==g&&(b.appendDataRow(l,"*Totals",m,a.length),b.appendSpacingRow(l));b.appendSummaryRowTime(l,"Selection start",c);b.appendSummaryRowTime(l,"Selection extent",e-c)}}});"use strict";base.require("tracing.analysis.analyze_counters");base.require("tracing.analysis.analyze_slices");
+a,c,e,f,d){var h=void 0;f&&(h="Min Duration:\t"+tracing.analysis.tsRound(f.min)+" ms \rMax Duration:\t"+tracing.analysis.tsRound(f.max)+" ms \rAvg Duration:\t"+tracing.analysis.tsRound(f.avg)+" ms (\u03c3 = "+tracing.analysis.tsRound(f.avg_stddev)+")",f.start&&(h+="\rStart Time:\t"+tracing.analysis.tsRound(f.start)+" ms"),f.end&&(h+="\rEnd Time:\t"+tracing.analysis.tsRound(f.end)+" ms"),f.frequency&&f.frequency_stddev&&(h+="\rFrequency:\t"+tracing.analysis.tsRound(f.frequency)+" occurrences/s (\u03c3 = "+
+tracing.analysis.tsRound(f.frequency_stddev)+")"));f=this.appendElement_(b,"tr");f.className="analysis-table-row";if(d){var k=this.appendTableCellWithTooltip_(b,f,0,a,h);k.textContent="";k.appendChild(this.createSelectionChangingLink(a,d,h))}else this.appendTableCellWithTooltip_(b,f,0,a,h);void 0!==c?c instanceof Array?this.appendTableCellWithTooltip_(b,f,1,"["+c.join(", ")+"]",h):this.appendTableCellWithTooltip_(b,f,1,tracing.analysis.tsRound(c)+" ms",h):this.appendTableCell_(b,f,1,"");void 0!==
+e?this.appendTableCellWithTooltip_(b,f,2,String(e)+" occurrences",h):this.appendTableCell_(b,f,2,"")}};return{AnalysisResults:d}});"use strict";base.require("tracing.analysis.util");base.require("ui");
+base.exportTo("tracing.analysis",function(){return{analyzeSingleCounterSampleHit:function(d,b){for(var a=b.counter,c=b.sampleIndex,e=[],f=0;f<a.numSeries;++f)e.push(a.getSeries(f).getSample(c).value);var g=d.appendTable("analysis-counter-table",2);d.appendTableHeader(g,"Selected counter:");d.appendSummaryRow(g,"Title",a.name);d.appendSummaryRowTime(g,"Timestamp",a.timestamps[c]);for(f=0;f<a.numSeries;f++)d.appendSummaryRow(g,a.getSeries(f).name,e[f])},analyzeMultipleCounterSampleHits:function(d,b){for(var a=
+{},c=0;c<b.length;c++){var e=b[c].counter;a[e.guid]||(a[e.guid]=[]);a[e.guid].push(b[c])}var f=d.appendTable("analysis-counter-table",2);d.appendTableHeader(f,"Counters:");for(var g in a){for(var h=a[g],e=h[0].counter,k=[],c=0;c<h.length;c++)k.push(h[c].sampleIndex);h=e.getSampleStatistics(k);for(c=0;c<h.length;c++){for(var l=[],m=0;m<k.length;++m)l.push(e.getSeries(c).getSample(k[m]).value);d.appendDataRow(f,e.name+": series("+e.getSeries(c).name+")",l,l.length,h[c])}}}}});"use strict";base.requireStylesheet("tracing.analysis.analyze_slices");
base.require("tracing.analysis.util");base.require("ui");
-base.exportTo("tracing.analysis",function(){function d(a,c){var e=c.slices,d=c.counterSamples,f=new tracing.Selection;f.addSelection(c.objectSnapshots);f.addSelection(c.objectInstances);1==e.length?tracing.analysis.analyzeSingleSliceHit(a,e[0]):1<e.length&&tracing.analysis.analyzeMultipleSliceHits(a,e);1==d.length?tracing.analysis.analyzeSingleCounterSampleHit(a,d[0]):1<d.length&&tracing.analysis.analyzeMultipleCounterSampleHits(a,d);f.length&&b(a,f)}function b(a,b){b=base.asArray(b).sort(base.Range.compareByMinTimes);
-var e=a.appendTable("analysis-object-sample-table",2);a.appendTableHeader(e,"Selected Objects:");b.forEach(function(b){var c=a.appendTableRow(e),d,k,l;if(b instanceof tracing.SelectionObjectSnapshotHit){var m=b.objectSnapshot;d=tracing.analysis.tsRound(m.ts);k=m.objectInstance.typeName+" "+m.objectInstance.id;l=function(){var a=new tracing.Selection;a.addObjectSnapshot(b.track,m);return a}}else{var n=b.objectInstance;d=n.deletionTs==Number.MAX_VALUE?"":tracing.analysis.tsRound(n.deletionTs);d=tracing.analysis.tsRound(n.creationTs)+
-"-"+d;k=n.typeName+" "+n.id;l=function(){var a=new tracing.Selection;a.addObjectInstance(b.track,n);return a}}a.appendTableCell(e,c,d);a.appendTableCell(e,c,"").appendChild(a.createSelectionChangingLink(k,l))})}return{analyzeSelection:function(a,b){d(a,b.getHitsOrganizedByType())},analyzeHitsByType:d}});"use strict";base.require("ui");
+base.exportTo("tracing.analysis",function(){function d(b,a){var c=a.slice,e=b.appendTable("analysis-slice-table",2);b.appendTableHeader(e,"Selected slice:");b.appendSummaryRow(e,"Title",c.title);c.category&&b.appendSummaryRow(e,"Category",c.category);b.appendSummaryRowTime(e,"Start",c.start);b.appendSummaryRowTime(e,"Duration",c.duration);c.durationInUserTime&&b.appendSummaryRowTime(e,"Duration (U)",c.durationInUserTime);var f=0,d;for(d in c.args)f+=1;if(0<f)for(d in b.appendSummaryRow(e,"Args"),
+c.args)b.appendSummaryRow(e," "+d,c.args[d])}return{analyzeSingleSliceHit:d,analyzeMultipleSliceHits:function(b,a){var c=a.bounds.min,e=a.bounds.max;a.map(function(a){return a.slice.title});for(var f=0,g={},h=0;h<a.length;h++){var k=a[h].slice;g[k.title]||(g[k.title]={hits:[]},f++);g[k.title].hits.push(a[h])}var l;l=b.appendTable("analysis-slices-table",3);b.appendTableHeader(l,"Slices:");var m=0;base.iterItems(g,function(a,c){for(var e=0,g=0,h=Number.MAX_VALUE,k=-Number.MAX_VALUE,s=Number.MAX_VALUE,
+r=-Number.MAX_VALUE,g=0;g<c.hits.length;g++)var u=c.hits[g].slice,e=e+u.duration,h=Math.min(u.start,h),k=Math.max(u.start,k),s=Math.min(u.duration,s),r=Math.max(u.duration,r);m+=e;0==c.hits.length&&(g=0);g=e/c.hits.length;s={min:s,max:r,avg:g,avg_stddev:void 0,frequency:void 0,frequency_stddev:void 0};for(g=r=0;g<c.hits.length;g++)u=s.avg-c.hits[g].slice.duration,r+=u*u;s.avg_stddev=Math.sqrt(r/(c.hits.length-1));k-=h;if(2<c.hits.length&&0<k){h=c.hits.length-1;s.frequency=1E3*h/k;r=0;for(g=1;g<c.hits.length;g++)u=
+s.frequency-1E3/(c.hits[g].slice.start-c.hits[g-1].slice.start),r+=u*u;s.frequency_stddev=Math.sqrt(r/(h-1))}b.appendDataRow(l,a,e,c.hits.length,s,function(){return new tracing.Selection(c.hits)});if(1===f)for(g=0;g<c.hits.length;g++)d(b,c.hits[g])});1!==f&&(b.appendDataRow(l,"*Totals",m,a.length),b.appendSpacingRow(l));b.appendSummaryRowTime(l,"Selection start",c);b.appendSummaryRowTime(l,"Selection extent",e-c)}}});"use strict";base.require("tracing.analysis.analyze_counters");base.require("tracing.analysis.analyze_slices");
+base.require("tracing.analysis.util");base.require("ui");
+base.exportTo("tracing.analysis",function(){function d(a,c){var e=c.slices,f=c.counterSamples,d=new tracing.Selection;d.addSelection(c.objectSnapshots);d.addSelection(c.objectInstances);1==e.length?tracing.analysis.analyzeSingleSliceHit(a,e[0]):1<e.length&&tracing.analysis.analyzeMultipleSliceHits(a,e);1==f.length?tracing.analysis.analyzeSingleCounterSampleHit(a,f[0]):1<f.length&&tracing.analysis.analyzeMultipleCounterSampleHits(a,f);d.length&&b(a,d)}function b(a,c){c=base.asArray(c).sort(base.Range.compareByMinTimes);
+var b=a.appendTable("analysis-object-sample-table",2);a.appendTableHeader(b,"Selected Objects:");c.forEach(function(c){var d=a.appendTableRow(b),h,k,l;if(c instanceof tracing.SelectionObjectSnapshotHit){var m=c.objectSnapshot;h=tracing.analysis.tsRound(m.ts);k=m.objectInstance.typeName+" "+m.objectInstance.id;l=function(){var a=new tracing.Selection;a.addObjectSnapshot(c.track,m);return a}}else{var n=c.objectInstance;h=n.deletionTs==Number.MAX_VALUE?"":tracing.analysis.tsRound(n.deletionTs);h=tracing.analysis.tsRound(n.creationTs)+
+"-"+h;k=n.typeName+" "+n.id;l=function(){var a=new tracing.Selection;a.addObjectInstance(c.track,n);return a}}a.appendTableCell(b,d,h);a.appendTableCell(b,d,"").appendChild(a.createSelectionChangingLink(k,l))})}return{analyzeSelection:function(a,c){d(a,c.getHitsOrganizedByType())},analyzeHitsByType:d}});"use strict";base.require("ui");
base.exportTo("tracing.analysis",function(){var d=ui.define("object-instance-view");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.objectInstance_=void 0},set modelObject(b){this.objectInstance=b},get modelObject(){return this.objectInstance},get objectInstance(){return this.objectInstance_},set objectInstance(b){this.objectInstance_=b;this.updateContents()},updateContents:function(){throw Error("Not implemented");}};d.typeNameToViewInfoMap={};d.register=function(b,a,c){if(d.typeNameToViewInfoMap[b])throw Error("Handler already registerd for "+
b);d.typeNameToViewInfoMap[b]={constructor:a,options:c||{showInTrackView:!0}}};d.unregister=function(b){if(void 0===d.typeNameToViewInfoMap[b])throw Error(b+" not registered");delete d.typeNameToViewInfoMap[b]};d.getViewInfo=function(b){return d.typeNameToViewInfoMap[b]};return{ObjectInstanceView:d}});"use strict";base.require("ui");
base.exportTo("tracing.analysis",function(){var d=ui.define("object-snapshot-view");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.objectSnapshot_=void 0},set modelObject(b){this.objectSnapshot=b},get modelObject(){return this.objectSnapshot},get objectSnapshot(){return this.objectSnapshot_},set objectSnapshot(b){this.objectSnapshot_=b;this.updateContents()},updateContents:function(){throw Error("Not implemented");}};d.typeNameToViewInfoMap={};d.register=function(b,a,c){if(d.typeNameToViewInfoMap[b])throw Error("Handler already registered for "+
b);d.typeNameToViewInfoMap[b]={constructor:a,options:c||{showInTrackView:!0}}};d.unregister=function(b){if(void 0===d.typeNameToViewInfoMap[b])throw Error(b+" not registered");delete d.typeNameToViewInfoMap[b]};d.getViewInfo=function(b){return d.typeNameToViewInfoMap[b]};return{ObjectSnapshotView:d}});"use strict";base.requireStylesheet("tracing.analysis.default_object_view");base.require("tracing.analysis.analysis_link");base.require("tracing.analysis.object_instance_view");base.require("tracing.analysis.object_snapshot_view");
base.require("tracing.analysis.util");
-base.exportTo("tracing.analysis",function(){var d=tracing.analysis.tsRound,b=ui.define("default-object-snapshot-view",tracing.analysis.ObjectSnapshotView);b.prototype={__proto__:tracing.analysis.ObjectSnapshotView.prototype,decorate:function(){tracing.analysis.ObjectSnapshotView.prototype.decorate.apply(this);this.classList.add("default-object-view");this.classList.add("default-object-snapshot-view")},updateContents:function(){var a=this.objectSnapshot;if(a){var b=a.objectInstance,g;g=""+('<div class="title">Snapshot of <a id="instance-link"></a> @ '+
-d(a.ts)+"ms</div>\n");g+="<table><tr>";g+='<tr><td>args:</td><td id="args"></td></tr>\n';this.innerHTML=g+="</table>";g=new tracing.analysis.ObjectInstanceLink;g.objectInstance=b;b=this.querySelector("#instance-link");b.parentElement.replaceChild(g,b);this.querySelector("#args").textContent=JSON.stringify(a.args,null,2)}else this.textContent=""}};var a=ui.define("default-object-instance-view",tracing.analysis.ObjectInstanceView);a.prototype={__proto__:tracing.analysis.ObjectInstanceView.prototype,
+base.exportTo("tracing.analysis",function(){var d=tracing.analysis.tsRound,b=ui.define("default-object-snapshot-view",tracing.analysis.ObjectSnapshotView);b.prototype={__proto__:tracing.analysis.ObjectSnapshotView.prototype,decorate:function(){tracing.analysis.ObjectSnapshotView.prototype.decorate.apply(this);this.classList.add("default-object-view");this.classList.add("default-object-snapshot-view")},updateContents:function(){var a=this.objectSnapshot;if(a){var b=a.objectInstance,f;f=""+('<div class="title">Snapshot of <a id="instance-link"></a> @ '+
+d(a.ts)+"ms</div>\n");f+="<table><tr>";f+='<tr><td>args:</td><td id="args"></td></tr>\n';this.innerHTML=f+="</table>";f=new tracing.analysis.ObjectInstanceLink;f.objectInstance=b;b=this.querySelector("#instance-link");b.parentElement.replaceChild(f,b);this.querySelector("#args").textContent=JSON.stringify(a.args,null,2)}else this.textContent=""}};var a=ui.define("default-object-instance-view",tracing.analysis.ObjectInstanceView);a.prototype={__proto__:tracing.analysis.ObjectInstanceView.prototype,
decorate:function(){tracing.analysis.ObjectInstanceView.prototype.decorate.apply(this);this.classList.add("default-object-view");this.classList.add("default-object-instance-view")},updateContents:function(){var a=this.objectInstance;if(a){var b;b=""+('<div class="title">'+a.typeName+" "+a.id+"</div>\n");b+="<table><tr>";b+="<tr><td>creationTs:</td><td>"+a.creationTs+"</td></tr>\n";b=a.deletionTs!=Number.MAX_VALUE?b+("<tr><td>deletionTs:</td><td>"+a.deletionTs+"</td></tr>\n"):b+"<tr><td>deletionTs:</td><td>not deleted</td></tr>\n";
-b+='<tr><td>snapshots:</td><td id="snapshots"></td></tr>\n';this.innerHTML=b+="</table>";var d=this.querySelector("#snapshots");a.snapshots.forEach(function(a){var b=new tracing.analysis.ObjectSnapshotLink;b.objectSnapshot=a;d.appendChild(b)})}else this.textContent=""}};return{DefaultObjectSnapshotView:b,DefaultObjectInstanceView:a}});"use strict";base.require("ui");
+b+='<tr><td>snapshots:</td><td id="snapshots"></td></tr>\n';this.innerHTML=b+="</table>";var d=this.querySelector("#snapshots");a.snapshots.forEach(function(a){var c=new tracing.analysis.ObjectSnapshotLink;c.objectSnapshot=a;d.appendChild(c)})}else this.textContent=""}};return{DefaultObjectSnapshotView:b,DefaultObjectInstanceView:a}});"use strict";base.require("ui");
base.exportTo("tracing.analysis",function(){var d=ui.define("slice-view");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.objectInstance_=void 0},set modelObject(b){this.slice=b},get modelObject(){return this.slice},get slice(){return this.slice_},set slice(b){this.slice_=b;this.updateContents()},updateContents:function(){throw Error("Not implemented");}};d.titleToViewInfoMap={};d.register=function(b,a){if(d.titleToViewInfoMap[b])throw Error("Handler already registerd for "+
b);d.titleToViewInfoMap[b]={constructor:a}};d.unregister=function(b){if(void 0===d.titleToViewInfoMap[b])throw Error(b+" not registered");delete d.titleToViewInfoMap[b]};d.getViewInfo=function(b){return d.titleToViewInfoMap[b]};return{SliceView:d}});"use strict";base.requireStylesheet("tracing.analysis.analysis_view");base.require("base.guid");base.require("tracing.analysis.analysis_results");base.require("tracing.analysis.analyze_selection");base.require("tracing.analysis.default_object_view");base.require("tracing.analysis.object_instance_view");
base.require("tracing.analysis.object_snapshot_view");base.require("tracing.analysis.slice_view");base.require("tracing.analysis.util");base.require("ui");
@@ -322,157 +332,175 @@
for(a=0;a<this.selections_.length&&this.selections_[a].guid!==b.state.selection_guid;++a);a>=this.selections_.length||(this.processSelection(this.selections_[a]),b.stopPropagation())}},processSelection:function(b){var a=b.getHitsOrganizedByType();1==b.length&&0==a.counterSamples.length&&this.tryToProcessSelectionUsingCustomViewer(b[0])||(this.changeViewType(tracing.analysis.AnalysisResults),this.currentView.clear(),this.currentSelection_=b,tracing.analysis.analyzeHitsByType(this.currentView,a))},
tryToProcessSelectionUsingCustomViewer:function(b){var a,c,e;a=b.modelObject;if(b instanceof tracing.SelectionObjectSnapshotHit)c=a.objectInstance.typeName,e=tracing.analysis.ObjectSnapshotView,b=tracing.analysis.DefaultObjectSnapshotView;else if(b instanceof tracing.SelectionObjectInstanceHit)c=a.typeName,e=tracing.analysis.ObjectInstanceView,b=tracing.analysis.DefaultObjectInstanceView;else if(b instanceof tracing.SelectionSliceHit)c=a.title,e=tracing.analysis.SliceView,b=void 0;else return!1;b=
(c=e.getViewInfo(c))?c.constructor:b;if(!b)return!1;this.changeViewType(b);this.currentView.modelObject=a;return!0}};return{AnalysisView:d}});"use strict";base.require("base.events");
-base.exportTo("base",function(){function d(a,b,c,e,d,m){d=new base.Event(b+"Change",d,m);d.propertyName=b;d.newValue=c;d.oldValue=e;var n;d.throwError=function(a){n=a};a.dispatchEvent(d);if(n)throw n;}function b(a){return a.replace(/([A-Z])/g,"-$1").toLowerCase()}function a(a,c){switch(c){case e.JS:var d=a+"_base_";return function(){return this[d]};case e.ATTR:var k=b(a);return function(){return this.getAttribute(k)};case e.BOOL_ATTR:return k=b(a),function(){return this.hasAttribute(k)}}}function c(a,
-c,h,k,l){switch(c){case e.JS:var m=a+"_base_";return function(b){var c=this[m];b!==c&&(this[m]=b,h&&h.call(this,b,c),d(this,a,b,c,k,l))};case e.ATTR:var n=b(a);return function(b){var c=this.getAttribute(n);b!==c&&(void 0==b?this.removeAttribute(n):this.setAttribute(n,b),h&&h.call(this,b,c),d(this,a,b,c,k,l))};case e.BOOL_ATTR:return n=b(a),function(b){var c=this.getAttribute(n)===a;b!==c&&(b?this.setAttribute(n,a):this.removeAttribute(n),h&&h.call(this,b,c),d(this,a,b,c,k,l))}}}var e={JS:"js",ATTR:"attr",
-BOOL_ATTR:"boolAttr"};return{PropertyKind:e,defineProperty:function(b,d,h,k,l,m){console.error("Don't use base.defineProperty");"function"==typeof b&&(b=b.prototype);h=h||e.JS;b.__lookupGetter__(d)||b.__defineGetter__(d,a(d,h));b.__lookupSetter__(d)||b.__defineSetter__(d,c(d,h,k,l,m))},dispatchPropertyChange:d,setPropertyAndDispatchChange:function(a,b,c){var e=a[b];a[b+"_"]=c;e!==c&&base.dispatchPropertyChange(a,b,c,e,!0,!1)}}});"use strict";base.requireStylesheet("ui.overlay");base.require("base.properties");
+base.exportTo("base",function(){function d(a,c,b,e,d,m){d=new base.Event(c+"Change",d,m);d.propertyName=c;d.newValue=b;d.oldValue=e;var n;d.throwError=function(a){n=a};a.dispatchEvent(d);if(n)throw n;}function b(a){return a.replace(/([A-Z])/g,"-$1").toLowerCase()}function a(a,c){switch(c){case e.JS:var d=a+"_base_";return function(){return this[d]};case e.ATTR:var k=b(a);return function(){return this.getAttribute(k)};case e.BOOL_ATTR:return k=b(a),function(){return this.hasAttribute(k)}}}function c(a,
+c,h,k,l){switch(c){case e.JS:var m=a+"_base_";return function(c){var b=this[m];c!==b&&(this[m]=c,h&&h.call(this,c,b),d(this,a,c,b,k,l))};case e.ATTR:var n=b(a);return function(c){var b=this.getAttribute(n);c!==b&&(void 0==c?this.removeAttribute(n):this.setAttribute(n,c),h&&h.call(this,c,b),d(this,a,c,b,k,l))};case e.BOOL_ATTR:return n=b(a),function(c){var b=this.getAttribute(n)===a;c!==b&&(c?this.setAttribute(n,a):this.removeAttribute(n),h&&h.call(this,c,b),d(this,a,c,b,k,l))}}}var e={JS:"js",ATTR:"attr",
+BOOL_ATTR:"boolAttr"};return{PropertyKind:e,defineProperty:function(b,d,h,k,l,m){console.error("Don't use base.defineProperty");"function"==typeof b&&(b=b.prototype);h=h||e.JS;b.__lookupGetter__(d)||b.__defineGetter__(d,a(d,h));b.__lookupSetter__(d)||b.__defineSetter__(d,c(d,h,k,l,m))},dispatchPropertyChange:d,setPropertyAndDispatchChange:function(a,c,b){var e=a[c];a[c+"_"]=b;e!==b&&base.dispatchPropertyChange(a,c,b,e,!0,!1)}}});"use strict";base.requireStylesheet("ui.overlay");base.require("base.properties");
base.require("base.events");base.require("ui");
base.exportTo("ui",function(){var d=ui.define("div");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.classList.add("overlay-root");this.createToolBar_();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.onKeydown_=this.onKeydown_.bind(this);this.onFocusIn_=this.onFocusIn_.bind(this);this.addEventListener("mousedown",
this.onMousedown_.bind(this))},toggleToolbar:function(a){a?this.contentHost.firstChild?this.contentHost.insertBefore(this.contentHost.firstChild,this.toolbar_):this.contentHost.appendChild(this.toolbar_):this.toolbar_.parentElement&&this.contentHost.removeChild(this.toolbar_)},createToolBar_:function(){this.toolbar_=this.ownerDocument.createElement("div");this.toolbar_.className="tool-bar";this.exitButton_=this.ownerDocument.createElement("span");this.exitButton_.className="exit-button";this.exitButton_.textContent=
-"x";this.exitButton_.title="Close Overlay (esc)";this.toolbar_.appendChild(this.exitButton_)},showOverlay:function(a){a.oldParent_=a.parentNode;this.contentHost.appendChild(a);this.contentHost.appendChild(this.tabCatcher);this.ownerDocument.body.classList.add("disabled-by-overlay");a.tabIndex=0;var b=a.querySelector("button, input, list, select, a");b||(b=a);b.focus();this.ownerDocument.addEventListener("focusin",this.onFocusIn_,!0);a.addEventListener("keydown",this.onKeydown_)},onMousedown_:function(a){a.target==
+"x";this.exitButton_.title="Close Overlay (esc)";this.toolbar_.appendChild(this.exitButton_)},showOverlay:function(a){a.oldParent_=a.parentNode;this.contentHost.appendChild(a);this.contentHost.appendChild(this.tabCatcher);this.ownerDocument.body.classList.add("disabled-by-overlay");a.tabIndex=0;var c=a.querySelector("button, input, list, select, a");c||(c=a);c.focus();this.ownerDocument.addEventListener("focusin",this.onFocusIn_,!0);a.addEventListener("keydown",this.onKeydown_)},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.onKeydown_);this.ownerDocument.removeEventListener("focusin",this.onFocusIn_)}};var b=ui.define("div");b.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){if(!this.ownerDocument.querySelector(".overlay-root")){var a=this.ownerDocument.createElement("div");ui.decorate(a,d);this.ownerDocument.body.appendChild(a)}this.classList.add("overlay");this.obeyCloseEvents=this.visible_=!1;this.additionalCloseKeyCodes=
[];this.onKeyDown=this.onKeyDown.bind(this);this.onKeyPress=this.onKeyPress.bind(this);this.onDocumentClick=this.onDocumentClick.bind(this);this.addEventListener("visibleChange",b.prototype.onVisibleChange_.bind(this),!0);this.obeyCloseEvents=!0},get visible(){return this.visible_},set visible(a){base.setPropertyAndDispatchChange(this,"visible",a)},get obeyCloseEvents(){return this.obeyCloseEvents_},set obeyCloseEvents(a){base.setPropertyAndDispatchChange(this,"obeyCloseEvents",a);this.ownerDocument.querySelector(".overlay-root").toggleToolbar(a)},
get toolbar(){return this.ownerDocument.querySelector(".overlay-root .tool-bar")},onVisibleChange_:function(){var a=this.ownerDocument.querySelector(".overlay-root");this.visible?(a.setAttribute("visible","visible"),a.showOverlay(this),document.addEventListener("keydown",this.onKeyDown,!0),document.addEventListener("keypress",this.onKeyPress,!0),document.addEventListener("click",this.onDocumentClick,!0)):(a.removeAttribute("visible"),document.removeEventListener("keydown",this.onKeyDown,!0),document.removeEventListener("keypress",
-this.onKeyPress,!0),document.removeEventListener("click",this.onDocumentClick,!0),a.hideOverlay(this))},onKeyDown:function(a){this.obeyCloseEvents&&27==a.keyCode&&(this.visible=!1,a.preventDefault())},onKeyPress:function(a){if(this.obeyCloseEvents)for(var b=0;b<this.additionalCloseKeyCodes.length;b++)if(a.keyCode==this.additionalCloseKeyCodes[b]){this.visible=!1;a.preventDefault();break}},onDocumentClick:function(a){if(this.obeyCloseEvents){for(var b=a.target;null!==b;){if(b===this)return;b=b.parentNode}this.visible=
+this.onKeyPress,!0),document.removeEventListener("click",this.onDocumentClick,!0),a.hideOverlay(this))},onKeyDown:function(a){this.obeyCloseEvents&&27==a.keyCode&&(this.visible=!1,a.preventDefault())},onKeyPress:function(a){if(this.obeyCloseEvents)for(var c=0;c<this.additionalCloseKeyCodes.length;c++)if(a.keyCode==this.additionalCloseKeyCodes[c]){this.visible=!1;a.preventDefault();break}},onDocumentClick:function(a){if(this.obeyCloseEvents){for(var c=a.target;null!==c;){if(c===this)return;c=c.parentNode}this.visible=
!1;a.preventDefault()}}};return{Overlay:b}});"use strict";base.requireTemplate("tracing.category_filter_dialog");base.require("base.utils");base.require("tracing.filter");base.require("ui.overlay");
base.exportTo("tracing",function(){var d=ui.define("div");d.prototype={__proto__:ui.Overlay.prototype,decorate:function(){ui.Overlay.prototype.decorate.call(this);this.className="view-category-filter-overlay";this.obeyCloseEvents=!0;var b=base.instantiateTemplate("#view-category-filter-dialog-template");this.appendChild(b);this.formEl_=this.querySelector("form");this.categoriesEl_=this.querySelector(".categories");this.addEventListener("visibleChange",this.onVisibleChange_.bind(this))},set categories(b){this.categories_=
b},set settingUpdatedCallback(b){this.settingUpdatedCallback_=b},unselectedCategories_:function(){for(var b=this.formEl_.querySelectorAll("input"),a=[],c=0;c<b.length;++c){var e=b[c];!1===e.checked&&a.push(e.value)}return a},onVisibleChange_:function(){this.visible&&this.updateForm_()},updateForm_:function(){this.categoriesEl_.innerHTML="";for(var b=this.categories_.sort(),a=0;a<b.length;a++){var c=b[a],e=document.createElement("input");e.type="checkbox";e.id=c;e.value=c;e.checked=!0;e.onchange=this.updateSetting_.bind(this);
-var d=document.createElement("label");d.textContent=c;d.setAttribute("for",c);c=document.createElement("div");c.appendChild(e);c.appendChild(d);this.categoriesEl_.appendChild(c)}},updateSetting_:function(b){void 0!==this.settingUpdatedCallback_&&this.settingUpdatedCallback_(this.unselectedCategories_())}};return{CategoryFilterDialog:d}});"use strict";base.require("base.events");
-base.exportTo("tracing",function(){function d(a){this.parentEl_=a;this.modelTrackContainer_=null;this.scaleX_=1;this.gridTimebase_=this.panY_=this.panX_=0;this.gridStep_=1E3/60;this.hasCalledSetupFunction_=this.gridEnabled_=!1;this.onResize_=this.onResize_.bind(this);this.checkForAttachInterval_=setInterval(this.checkForAttach_.bind(this),250);this.markers=[]}function b(a,b){this.viewport_=a;this.positionWorld_=b;this.selected_=!1}d.prototype={__proto__:base.EventTarget.prototype,setWhenPossible:function(a){this.pendingSetFunction_=
-a},get isAttachedToDocument_(){var a=this.parentEl_;if(void 0!==a){for(;a.parentNode;)a=a.parentNode;return a==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.onResize_));var a=this.parentEl_.clientWidth+"x"+this.parentEl_.clientHeight;if(this.pendingSetFunction_){this.lastSize_=a;try{this.pendingSetFunction_()}catch(b){console.log("While running setWhenPossible:",b.message?b.message+"\n"+b.stack:b.stack)}this.pendingSetFunction_=void 0}window.clearInterval(this.checkForAttachInterval_);this.checkForAttachInterval_=void 0}},dispatchChangeEvent:function(){base.dispatchSimpleEvent(this,"change")},dispatchMarkersChangeEvent_:function(){base.dispatchSimpleEvent(this,
-"markersChange")},detach:function(){this.checkForAttachInterval_&&(window.clearInterval(this.checkForAttachInterval_),this.checkForAttachInterval_=void 0);this.iframe_&&(this.iframe_.removeEventListener("resize",this.onResize_),this.parentEl_.removeChild(this.iframe_))},getStateInViewCoordinates:function(){return{panX:this.xWorldVectorToView(this.panX),panY:this.panY,scaleX:this.scaleX}},setStateInViewCoordinates:function(a){this.panX=this.xViewVectorToWorld(a.panX);this.panY=a.panY},set modelTrackContainer(a){this.modelTrackContainer_=
-a},get scaleX(){return this.scaleX_},set scaleX(a){this.scaleX_!=a&&(this.scaleX_=a,this.dispatchChangeEvent())},get panX(){return this.panX_},set panX(a){this.panX_!=a&&(this.panX_=a,this.dispatchChangeEvent())},get panY(){return this.panY_},set panY(a){this.panY_=a;this.modelTrackContainer_.scrollTop=a},setPanAndScale:function(a,b){if(this.scaleX_!=b||this.panX_!=a)this.scaleX_=b,this.panX_=a,this.dispatchChangeEvent()},xWorldToView:function(a){return(a+this.panX_)*this.scaleX_},xWorldVectorToView:function(a){return a*
-this.scaleX_},xViewToWorld:function(a){return a/this.scaleX_-this.panX_},xViewVectorToWorld:function(a){return a/this.scaleX_},xPanWorldPosToViewPos:function(a,b,e){if("string"==typeof b)if("left"==b)b=0;else if("center"==b)b=e/2;else if("right"==b)b=e-1;else throw Error("unrecognized string for viewPos. left|center|right");this.panX=b/this.scaleX_-a},xPanWorldBoundsIntoView:function(a,b,e){0>this.xWorldToView(a)?this.xPanWorldPosToViewPos(a,"left",e):this.xWorldToView(b)>e&&this.xPanWorldPosToViewPos(b,
-"right",e)},xSetWorldBounds:function(a,b,e){this.setPanAndScale(-a,e/(b-a))},get gridEnabled(){return this.gridEnabled_},set gridEnabled(a){this.gridEnabled_!=a&&(this.gridEnabled_=a&&!0,this.dispatchChangeEvent())},get gridTimebase(){return this.gridTimebase_},set gridTimebase(a){this.gridTimebase_!=a&&(this.gridTimebase_=a,this.dispatchChangeEvent())},get gridStep(){return this.gridStep_},applyTransformToCanvas:function(a){a.transform(this.scaleX_,0,0,1,this.panX_*this.scaleX_,0)},addMarker:function(a){a=
-new b(this,a);this.markers.push(a);this.dispatchChangeEvent();this.dispatchMarkersChangeEvent_();return a},removeMarker:function(a){for(var b=0;b<this.markers.length;++b)if(this.markers[b]===a)return this.markers.splice(b,1),this.dispatchChangeEvent(),this.dispatchMarkersChangeEvent_(),!0},findMarkerNear:function(a,b){for(var e=this.xViewVectorToWorld(b),d=0;d<this.markers.length;++d)if(Math.abs(this.markers[d].positionWorld-a)<=e)return this.markers[d]},drawGridLines:function(a,b,e){if(this.gridEnabled){var d=
-this.gridTimebase;for(a.beginPath();d<e;){if(d>=b){var f=this.xWorldToView(d);a.moveTo(f,0);a.lineTo(f,a.canvas.height)}d+=this.gridStep}a.strokeStyle="rgba(255,0,0,0.25)";a.stroke()}},drawMarkerArrows:function(a,b,e,d){for(var f=0;f<this.markers.length;++f)this.markers[f].drawTriangle_(a,b,e,a.canvas.height,d,this)},drawMarkerLines:function(a,b,e){for(var d=0;d<this.markers.length;++d)this.markers[d].drawLine(a,b,e,a.canvas.height,this)}};b.prototype={get positionWorld(){return this.positionWorld_},
-set positionWorld(a){this.positionWorld_=a;this.viewport_.dispatchChangeEvent()},set selected(a){this.selected_=a;this.viewport_.dispatchChangeEvent()},get selected(){return this.selected_},get color(){return this.selected?"rgb(255,0,0)":"rgb(0,0,0)"},drawTriangle_:function(a,b,e,d,f,h){a.beginPath();var k=this.positionWorld_;k<b||k>e||(b=h.xWorldToView(k),a.moveTo(b,f),a.lineTo(b-3,f/2),a.lineTo(b+3,f/2),a.lineTo(b,f),a.closePath(),a.fillStyle=this.color,a.fill(),f!==d&&(a.beginPath(),a.moveTo(b,
-f),a.lineTo(b,d),a.closePath(),a.strokeStyle=this.color,a.stroke()))},drawLine:function(a,b,e,d,f){a.beginPath();var h=this.positionWorld_;h>=b&&h<e&&(b=f.xWorldToView(h),a.moveTo(b,0),a.lineTo(b,d));a.strokeStyle=this.color;a.stroke()}};return{TimelineViewport:d,ViewportMarker:b}});"use strict";base.require("base.events");base.require("ui");
+var d=document.createElement("label");d.textContent=c;d.setAttribute("for",c);c=document.createElement("div");c.appendChild(e);c.appendChild(d);this.categoriesEl_.appendChild(c)}},updateSetting_:function(b){void 0!==this.settingUpdatedCallback_&&this.settingUpdatedCallback_(this.unselectedCategories_())}};return{CategoryFilterDialog:d}});"use strict";base.exportTo("tracing",function(){return{mouseModeConstants:{MOUSE_MODE_SELECTION:1,MOUSE_MODE_PANSCAN:2,MOUSE_MODE_ZOOM:3}}});"use strict";base.require("base.events");
+base.exportTo("tracing",function(){function d(a){this.parentEl_=a;this.modelTrackContainer_=null;this.scaleX_=1;this.gridTimebase_=this.panY_=this.panX_=0;this.gridStep_=1E3/60;this.hasCalledSetupFunction_=this.gridEnabled_=!1;this.onResize_=this.onResize_.bind(this);this.onModelTrackControllerScroll_=this.onModelTrackControllerScroll_.bind(this);this.checkForAttachInterval_=setInterval(this.checkForAttach_.bind(this),250);this.markers=[]}function b(a,c){this.viewport_=a;this.positionWorld_=c;this.selected_=
+!1}d.prototype={__proto__:base.EventTarget.prototype,setWhenPossible:function(a){this.pendingSetFunction_=a},get isAttachedToDocument_(){var a=this.parentEl_;if(void 0!==a){for(;a.parentNode;)a=a.parentNode;return a==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.onResize_));var a=this.parentEl_.clientWidth+"x"+this.parentEl_.clientHeight;if(this.pendingSetFunction_){this.lastSize_=a;try{this.pendingSetFunction_()}catch(c){console.log("While running setWhenPossible:",c.message?c.message+"\n"+c.stack:c.stack)}this.pendingSetFunction_=void 0}window.clearInterval(this.checkForAttachInterval_);this.checkForAttachInterval_=void 0}},dispatchChangeEvent:function(){base.dispatchSimpleEvent(this,
+"change")},dispatchMarkersChangeEvent_:function(){base.dispatchSimpleEvent(this,"markersChange")},detach:function(){this.checkForAttachInterval_&&(window.clearInterval(this.checkForAttachInterval_),this.checkForAttachInterval_=void 0);this.iframe_&&(this.iframe_.removeEventListener("resize",this.onResize_),this.parentEl_.removeChild(this.iframe_))},getStateInViewCoordinates:function(){return{panX:this.xWorldVectorToView(this.panX),panY:this.panY,scaleX:this.scaleX}},setStateInViewCoordinates:function(a){this.panX=
+this.xViewVectorToWorld(a.panX);this.panY=a.panY},onModelTrackControllerScroll_:function(a){this.panY_=this.modelTrackContainer_.scrollTop},set modelTrackContainer(a){this.modelTrackContainer_&&this.modelTrackContainer_.removeEventListener("scroll",this.onModelTrackControllerScroll_);this.modelTrackContainer_=a;this.modelTrackContainer_.addEventListener("scroll",this.onModelTrackControllerScroll_)},get scaleX(){return this.scaleX_},set scaleX(a){this.scaleX_!=a&&(this.scaleX_=a,this.dispatchChangeEvent())},
+get panX(){return this.panX_},set panX(a){this.panX_!=a&&(this.panX_=a,this.dispatchChangeEvent())},get panY(){return this.panY_},set panY(a){this.panY_=a;this.modelTrackContainer_.scrollTop=a},setPanAndScale:function(a,c){if(this.scaleX_!=c||this.panX_!=a)this.scaleX_=c,this.panX_=a,this.dispatchChangeEvent()},xWorldToView:function(a){return(a+this.panX_)*this.scaleX_},xWorldVectorToView:function(a){return a*this.scaleX_},xViewToWorld:function(a){return a/this.scaleX_-this.panX_},xViewVectorToWorld:function(a){return a/
+this.scaleX_},xPanWorldPosToViewPos:function(a,c,b){if("string"==typeof c)if("left"==c)c=0;else if("center"==c)c=b/2;else if("right"==c)c=b-1;else throw Error("unrecognized string for viewPos. left|center|right");this.panX=c/this.scaleX_-a},xPanWorldBoundsIntoView:function(a,c,b){0>this.xWorldToView(a)?this.xPanWorldPosToViewPos(a,"left",b):this.xWorldToView(c)>b&&this.xPanWorldPosToViewPos(c,"right",b)},xSetWorldBounds:function(a,c,b){this.setPanAndScale(-a,b/(c-a))},get gridEnabled(){return this.gridEnabled_},
+set gridEnabled(a){this.gridEnabled_!=a&&(this.gridEnabled_=a&&!0,this.dispatchChangeEvent())},get gridTimebase(){return this.gridTimebase_},set gridTimebase(a){this.gridTimebase_!=a&&(this.gridTimebase_=a,this.dispatchChangeEvent())},get gridStep(){return this.gridStep_},applyTransformToCanvas:function(a){a.transform(this.scaleX_,0,0,1,this.panX_*this.scaleX_,0)},addMarker:function(a){a=new b(this,a);this.markers.push(a);this.dispatchChangeEvent();this.dispatchMarkersChangeEvent_();return a},removeMarker:function(a){for(var c=
+0;c<this.markers.length;++c)if(this.markers[c]===a)return this.markers.splice(c,1),this.dispatchChangeEvent(),this.dispatchMarkersChangeEvent_(),!0},findMarkerNear:function(a,c){for(var b=this.xViewVectorToWorld(c),d=0;d<this.markers.length;++d)if(Math.abs(this.markers[d].positionWorld-a)<=b)return this.markers[d]},drawGridLines:function(a,c,b){if(this.gridEnabled){var d=this.gridTimebase;for(a.beginPath();d<b;){if(d>=c){var g=this.xWorldToView(d);a.moveTo(g,0);a.lineTo(g,a.canvas.height)}d+=this.gridStep}a.strokeStyle=
+"rgba(255,0,0,0.25)";a.stroke()}},drawMarkerArrows:function(a,c,b,d){for(var g=0;g<this.markers.length;++g)this.markers[g].drawTriangle_(a,c,b,a.canvas.height,d,this)},drawMarkerLines:function(a,c,b){for(var d=0;d<this.markers.length;++d)this.markers[d].drawLine(a,c,b,a.canvas.height,this)}};b.prototype={get positionWorld(){return this.positionWorld_},set positionWorld(a){this.positionWorld_=a;this.viewport_.dispatchChangeEvent()},set selected(a){this.selected_=a;this.viewport_.dispatchChangeEvent()},
+get selected(){return this.selected_},get color(){return this.selected?"rgb(255,0,0)":"rgb(0,0,0)"},drawTriangle_:function(a,c,b,d,g,h){a.beginPath();var k=this.positionWorld_;k<c||k>b||(c=h.xWorldToView(k),a.moveTo(c,g),a.lineTo(c-3,g/2),a.lineTo(c+3,g/2),a.lineTo(c,g),a.closePath(),a.fillStyle=this.color,a.fill(),g!==d&&(a.beginPath(),a.moveTo(c,g),a.lineTo(c,d),a.closePath(),a.strokeStyle=this.color,a.stroke()))},drawLine:function(a,c,b,d,g){a.beginPath();var h=this.positionWorld_;h>=c&&h<b&&(c=
+g.xWorldToView(h),a.moveTo(c,0),a.lineTo(c,d));a.strokeStyle=this.color;a.stroke()}};return{TimelineViewport:d,ViewportMarker:b}});"use strict";base.require("base.utils");
+base.exportTo("base",function(){function d(a){try{a.callback.call(a.context)}catch(c){base.onAnimationFrameError(c,a.stack)}}function b(){k=!1;var a=f;h=g;f=[];g=[];for(var c=0;c<a.length;c++)d(a[c]);for(;0<h.length;)d(h.shift());h=void 0}function a(){if(!e)return"";var a=base.stackTrace();a.shift();return a.join("\n")}function c(c,e){g.push({callback:c,context:e||window,stack:a()});k||(k=!0,window.webkitRequestAnimationFrame(b))}var e=!1,f=[],g=[],h=void 0,k=!1;return{onAnimationFrameError:function(a,
+c){c&&console.log(c);a.message?console.error(a.message,a.stack):console.error(a)},requestPreAnimationFrame:function(c,e){f.push({callback:c,context:e||window,stack:a()});k||(k=!0,window.webkitRequestAnimationFrame(b))},requestAnimationFrame:c,requestAnimationFrameInThisFrameIfPossible:function(b,e){h?h.push({callback:b,context:e||window,stack:a()}):c(b,e)}}});"use strict";base.require("base.events");base.require("ui");
base.exportTo("ui",function(){var d=ui.define("div");d.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.observer_=new WebKitMutationObserver(this.didMutate_.bind(this));this.observer_.observe(this,{childList:!0});Object.defineProperty(this,"textContent",{get:void 0,set:this.onSetTextContent_})},appendChild:function(b){HTMLUnknownElement.prototype.appendChild.call(this,b);this.didMutate_(this.observer_.takeRecords())},insertBefore:function(b,a){HTMLUnknownElement.prototype.insertBefore.call(this,
b,a);this.didMutate_(this.observer_.takeRecords())},removeChild:function(b){HTMLUnknownElement.prototype.removeChild.call(this,b);this.didMutate_(this.observer_.takeRecords())},replaceChild:function(b,a){HTMLUnknownElement.prototype.replaceChild.call(this,b,a);this.didMutate_(this.observer_.takeRecords())},onSetTextContent_:function(b){if(""!=b)throw Error("textContent can only be set to ''.");this.clear()},clear:function(){for(;this.lastChild;)HTMLUnknownElement.prototype.removeChild.call(this,this.lastChild);
this.didMutate_(this.observer_.takeRecords())},didMutate_:function(b){this.beginDecorating_();for(var a=0;a<b.length;a++){var c=b[a].addedNodes;if(c)for(var e=0;e<c.length;e++)this.decorateChild_(c[e]);if(c=b[a].removedNodes)for(e=0;e<c.length;e++)this.undecorateChild_(c[e])}this.doneDecoratingForNow_()},decorateChild_:function(b){throw Error("Not implemented");},undecorateChild_:function(b){throw Error("Not implemented");},beginDecorating_:function(){},doneDecoratingForNow_:function(){}};return{ContainerThatDecoratesItsChildren:d}});
-"use strict";base.requireStylesheet("tracing.tracks.track");base.require("ui");base.require("ui.container_that_decorates_its_children");
-base.exportTo("tracing.tracks",function(){var d=ui.define("track",ui.ContainerThatDecoratesItsChildren);d.prototype={__proto__:ui.ContainerThatDecoratesItsChildren.prototype,decorate:function(b){ui.ContainerThatDecoratesItsChildren.prototype.decorate.call(this);if(void 0===b)throw Error("viewport is required when creating a Track.");this.viewport_=b;this.classList.add("track");this.categoryFilter_=void 0},get viewport(){return this.viewport_},context:function(){if(this.parentNode){if(!this.parentNode.context)throw Error("Parent container does not support context() method.");
-return this.parentNode.context()}},get categoryFilter(){return this.categoryFilter_},set categoryFilter(b){this.categoryFilter_!=b&&(this.categoryFilter_=b,this.updateContents_())},decorateChild_:function(b){b instanceof d&&(b.categoryFilter=this.categoryFilter)},undecorateChild_:function(b){b.detach&&b.detach()},updateContents_:function(){}};return{Track:d}});"use strict";base.requireStylesheet("tracing.tracks.drawing_container");base.require("tracing.tracks.track");base.require("ui");
-base.exportTo("tracing.tracks",function(){var d=ui.define("drawing-container",tracing.tracks.Track);d.prototype={__proto__:tracing.tracks.Track.prototype,decorate:function(b){tracing.tracks.Track.prototype.decorate.call(this,b);this.classList.add("drawing-container");this.canvas_=document.createElement("canvas");this.canvas_.className="drawing-container-canvas";this.appendChild(this.canvas_);this.ctx_=this.canvas_.getContext("2d");this.viewportChange_=this.viewportChange_.bind(this);this.viewport.addEventListener("change",
-this.viewportChange_)},get canvas(){return this.canvas_},context:function(){return this.ctx_},viewportChange_:function(){this.invalidate()},invalidate:function(){this.rafPending_||(this.rafPending_=!0,base.requestPreAnimationFrame(function(){this.rafPending_=!1;this.ctx_.clearRect(0,0,this.canvas_.width,this.canvas_.height);this.updateCanvasSizeIfNeeded_()},this))},updateCanvasSizeIfNeeded_:function(){var b=this.querySelectorAll("heading");if(void 0!==b&&null!==b&&0!==b.length){for(var a=void 0,c=
-0;c<b.length;c++){var e=b[c].getBoundingClientRect();if(0<e.right){a=e;break}}if(void 0!==a){var c=base.asArray(this.children).filter(this.visibleFilter_),e=this.getBoundingClientRect(),b=c[0].getBoundingClientRect(),c=c[c.length-1].getBoundingClientRect(),d=a.right-e.left,e=b.top-e.top+this.scrollTop;this.canvas_.style.top+"px"!==e&&(this.canvas_.style.top=e+"px");this.canvas_.style.left+"px"!==d&&(this.canvas_.style.left=d+"px");a=b.width-a.right;b=c.bottom-b.top;c=window.devicePixelRatio||1;this.canvas_.width!=
-a*c&&(this.canvas_.width=a*c,this.canvas_.style.width=a+"px");this.canvas_.height!=b*c&&(this.canvas_.height=b*c,this.canvas_.style.height=b+"px")}}},visibleFilter_:function(b){return b instanceof tracing.tracks.Track?"none"!==window.getComputedStyle(b).display:!1}};return{DrawingContainer:d}});"use strict";base.require("base.utils");
-base.exportTo("base",function(){function d(a){try{a.callback.call(a.context)}catch(b){base.onAnimationFrameError(b,a.stack)}}function b(){k=!1;var a=g;h=f;g=[];f=[];for(var b=0;b<a.length;b++)d(a[b]);for(;0<h.length;)d(h.shift());h=void 0}function a(){if(!e)return"";var a=base.stackTrace();a.shift();return a.join("\n")}function c(c,e){f.push({callback:c,context:e||window,stack:a()});k||(k=!0,window.webkitRequestAnimationFrame(b))}var e=!1,g=[],f=[],h=void 0,k=!1;return{onAnimationFrameError:function(a,
-b){b&&console.log(b);a.message?console.error(a.message,a.stack):console.error(a)},requestPreAnimationFrame:function(c,e){g.push({callback:c,context:e||window,stack:a()});k||(k=!0,window.webkitRequestAnimationFrame(b))},requestAnimationFrame:c,requestAnimationFrameInThisFrameIfPossible:function(b,e){h?h.push({callback:b,context:e||window,stack:a()}):c(b,e)}}});"use strict";
-base.exportTo("tracing",function(){function d(b,a,c,e){this.ctx_=b;this.minRectSize_=a;this.maxMergeDist_=c;this.pallette_=e}d.prototype={y_:0,h_:0,merging_:!1,mergeStartX_:0,mergeCurRight_:0,setYandH:function(b,a){this.flush();this.y_=b;this.h_=a},fillRect:function(b,a,c){var e=b+a;a<this.minRectSize_?(e-this.mergeStartX_>this.maxMergeDist_&&this.flush(),this.merging_?(this.mergeCurRight_=e,this.mergedColorId=Math.max(this.mergedColorId,c)):(this.merging_=!0,this.mergeStartX_=b,this.mergeCurRight_=
-e,this.mergedColorId=c)):(this.merging_&&this.flush(),this.ctx_.fillStyle=this.pallette_[c],this.ctx_.fillRect(b,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:d}});"use strict";base.requireStylesheet("tracing.tracks.drawable_track");base.requireStylesheet("tracing.tracks.drawing_container");base.require("base.raf");
-base.require("tracing.tracks.track");base.require("tracing.fast_rect_renderer");base.require("tracing.color_scheme");base.require("ui");
-base.exportTo("tracing.tracks",function(){var d=ui.define("drawable-track",tracing.tracks.Track);d.prototype={__proto__:tracing.tracks.Track.prototype,decorate:function(b){tracing.tracks.Track.prototype.decorate.call(this,b);this.classList.add("drawable-track");this.slices_=null;this.headingDiv_=document.createElement("heading");this.appendChild(this.headingDiv_);this.canvasContainer_=document.createElement("div");this.canvasContainer_.className="drawable-container";this.appendChild(this.canvasContainer_);
-this.viewportChange_=this.viewportChange_.bind(this);this.viewport.addEventListener("change",this.viewportChange_)},detach:function(){this.viewport.removeEventListener("change",this.viewportChange_)},get heading(){return this.headingDiv_.textContent},set heading(b){this.headingDiv_.textContent=b},set tooltip(b){this.headingDiv_.title=b},viewportChange_:function(){this.invalidate()},invalidate:function(){this.rafPending_||(base.requestPreAnimationFrame(function(){this.rafPending_=!1;base.requestAnimationFrameInThisFrameIfPossible(function(){var b=
-this.context();if(void 0!==b){b.save();var a=window.devicePixelRatio||1,c=this.canvasContainer_.getBoundingClientRect(),e=b.canvas.getBoundingClientRect();b.translate(0,a*(c.top-e.top));e=this.viewport.xViewToWorld(0);a=this.viewport.xViewToWorld(c.width*a);this.draw(e,a);this.viewport.drawGridLines(b,e,a);this.viewport.drawMarkerLines(b,e,a);b.restore()}},this)},this),this.rafPending_=!0)},draw:function(b,a){throw Error("Implementation missing");},addIntersectingItemsInRangeToSelection:function(b,
-a,c,e,d){var f=window.devicePixelRatio||1,h=this.viewport.xViewVectorToWorld(1);b=this.viewport.xViewToWorld(b*f);a=this.viewport.xViewToWorld(a*f);f=this.getBoundingClientRect();c=Math.max(c,f.top);e=Math.min(e,f.bottom);c>e||this.addIntersectingItemsInRangeToSelectionInWorldSpace(b,a,h,d)},addIntersectingItemsInRangeToSelectionInWorldSpace:function(b,a,c,e){}};return{DrawableTrack:d}});"use strict";base.requireStylesheet("tracing.tracks.ruler_track");base.require("tracing.tracks.track");base.require("tracing.tracks.drawable_track");
-base.require("ui");
-base.exportTo("tracing.tracks",function(){var d=ui.define("ruler-track",tracing.tracks.DrawableTrack),b=Math.log(10);d.prototype={__proto__:tracing.tracks.DrawableTrack.prototype,decorate:function(a){tracing.tracks.DrawableTrack.prototype.decorate.call(this,a);this.classList.add("ruler-track");this.strings_secs_=[];this.strings_msecs_=[];this.addEventListener("mousedown",this.onMouseDown);this.viewportMarkersChange_=this.viewportMarkersChange_.bind(this);a.addEventListener("markersChange",this.viewportMarkersChange_)},
-detach:function(){tracing.tracks.DrawableTrack.prototype.detach.call(this);this.viewport.removeEventListener("markersChange",this.viewportMarkersChange_)},viewportMarkersChange_:function(){2>this.viewport.markers.length?this.classList.remove("ruler-track-with-distance-measurements"):this.classList.add("ruler-track-with-distance-measurements")},onMouseDown:function(a){0==a.button&&this.placeAndBeginDraggingMarker(a.clientX)},placeAndBeginDraggingMarker:function(a){var b=window.devicePixelRatio||1;
-a=this.viewport.xViewToWorld((a-this.canvasContainer_.offsetLeft)*b);var e=this.viewport.findMarkerNear(a,6),d=!1,f=!1;e||(e=this.viewport.addMarker(a),d=!0);e.selected=!0;var h=this,k=function(a){a=h.viewport.xViewToWorld((a.clientX-h.canvasContainer_.offsetLeft)*b);e.positionWorld=a;f=!0},l=function(a){e.selected=!1;f||d||h.viewport.removeMarker(e);document.removeEventListener("mouseup",l);document.removeEventListener("mousemove",k)};document.addEventListener("mouseup",l);document.addEventListener("mousemove",
-k)},drawLine_:function(a,b,e,d,f,h){a.beginPath();a.moveTo(b,e);a.lineTo(d,f);a.closePath();a.strokeStyle=h;a.stroke()},drawArrow_:function(a,b,e,d,f,h,k){this.drawLine_(a,b,e,d,f,k);var l=d-b,m=f-e,n=Math.sqrt(l*l+m*m),p=(n-10)/n;b+=p*l;e+=p*m;m=m/n*h;h*=-(l/n);a.beginPath();a.fillStyle=k;a.moveTo(b+m,e+h);a.lineTo(d,f);a.lineTo(b-m,e-h);a.lineTo(b+m,e+h);a.closePath();a.fill()},draw:function(a,c){var e=this.context(),d=window.devicePixelRatio||1,f=this.getBoundingClientRect(),h=f.width*d,k=f.height*
-d,l=this.classList.contains("ruler-track-with-distance-measurements"),m=l?k/2:k,f=this.viewport;f.drawMarkerArrows(e,a,c,m);var n=150*d,p=f.xViewVectorToWorld(n),q,s,v;s=Math.pow(10,Math.ceil(Math.log(p)/b));d=[10,5,2,1];for(p=0;p<d.length;++p)if(!(f.xWorldVectorToView(s/d[p])<n)){q=s/d[p-1];break}v=void 0;100>q?(n="ms",s=1,v=this.strings_msecs_):(n="s",s=1E3,v=this.strings_secs_);var w=f.xWorldVectorToView(q/5),p=Math.floor(a/q)*q,k=Math.floor(0.25*k);e.fillStyle="rgb(0, 0, 0)";e.strokeStyle="rgb(0, 0, 0)";
-e.textAlign="left";e.textBaseline="top";d=window.devicePixelRatio||1;e.font=9*d+"px sans-serif";for(var t=p;t<c;t+=q){var r=Math.floor(f.xWorldToView(t)),p=Math.floor(1E5*(t/s))/1E5;v[p]||(v[p]=p+" "+n);e.fillText(v[p],r+2*d,0);e.beginPath();e.moveTo(r,0);e.lineTo(r,m);for(p=1;5>p;++p){var u=Math.floor(r+w*p);e.moveTo(u,m-k);e.lineTo(u,m)}e.stroke()}if(l)for(e.moveTo(0,m),e.lineTo(h,m),e.stroke(),h=f.markers.slice(),h.sort(function(a,b){return a.positionWorld_-b.positionWorld_}),m+=2,q=m+4,p=0;p<
-h.length-1;p++)v=h[p+1],w=h[p],k=v.positionWorld-w.positionWorld,d=f.xWorldVectorToView(k),l=f.xWorldToView(w.positionWorld+k/2),100>k?(n="ms",s=1):(n="s",s=1E3),s=k/s,n=Math.abs(Math.floor(1E3*s)/1E3)+" "+n,s=e.measureText(n).width,t=f.xViewVectorToWorld(s),s=s+26+10,r=w.positionWorld+k/2-t/2,u=r+t,k=m,t=f.xWorldToView(r),r=f.xWorldToView(u),w=f.xWorldToView(w.positionWorld),v=f.xWorldToView(v.positionWorld),u=!1,s<=d&&(e.fillStyle="rgb(0,0,0)",e.fillText(n,t,k),u=!0),26<=d&&(u?(n=t-10,s=r+10):s=
-n=l,this.drawArrow_(e,n,q,w,q,3,"rgb(128,121,121)"),this.drawArrow_(e,s,q,v,q,3,"rgb(128,121,121)"))},addIntersectingItemsInRangeToSelection:function(a,b,e,d,f){},addAllObjectsMatchingFilterToSelection:function(a,b){}};return{RulerTrack:d}});"use strict";
+"use strict";base.requireStylesheet("tracing.tracks.track");base.require("ui");base.require("ui.container_that_decorates_its_children");base.require("tracing.color_scheme");
+base.exportTo("tracing.tracks",function(){var d=tracing.getColorPaletteHighlightIdBoost(),b=ui.define("track",ui.ContainerThatDecoratesItsChildren);b.prototype={__proto__:ui.ContainerThatDecoratesItsChildren.prototype,decorate:function(a){ui.ContainerThatDecoratesItsChildren.prototype.decorate.call(this);if(void 0===a)throw Error("viewport is required when creating a Track.");this.viewport_=a;this.classList.add("track");this.categoryFilter_=void 0},get viewport(){return this.viewport_},context:function(){if(this.parentNode){if(!this.parentNode.context)throw Error("Parent container does not support context() method.");
+return this.parentNode.context()}},get categoryFilter(){return this.categoryFilter_},set categoryFilter(a){this.categoryFilter_!=a&&(this.categoryFilter_=a,this.updateContents_())},decorateChild_:function(a){a instanceof b&&(a.categoryFilter=this.categoryFilter)},undecorateChild_:function(a){a.detach&&a.detach()},updateContents_:function(){},drawTrack:function(a){var c=this.context();if(void 0!==c){c.save();var b=this.setupCanvasForDraw_();this.draw(a,b.left,b.right);c.restore()}},draw:function(a,
+c,b){},setupCanvasForDraw_:function(){var a=this.context(),c=window.devicePixelRatio||1,b=this.getBoundingClientRect(),d=a.canvas.getBoundingClientRect();a.translate(0,c*(b.top-d.top));a=this.viewport.xViewToWorld(0);c=this.viewport.xViewToWorld(b.width*c);return{left:a,right:c}},decorateHit:function(a){},addIntersectingItemsInRangeToSelection:function(a,c,b,d,g){var h=window.devicePixelRatio||1,k=this.viewport.xViewVectorToWorld(1);a=this.viewport.xViewToWorld(a*h);c=this.viewport.xViewToWorld(c*
+h);h=this.getBoundingClientRect();b=Math.max(b,h.top);d=Math.min(d,h.bottom);b>d||this.addIntersectingItemsInRangeToSelectionInWorldSpace(a,c,k,g)},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,c,b,d){},drawInstantEvents_:function(a,c,b){var f=this.context(),g=window.devicePixelRatio||1,g=this.getBoundingClientRect().height*g,h=this.viewport,k=h.xViewVectorToWorld(1),l=tracing.getColorPalette();f.save();h.applyTransformToCanvas(f);h=new tracing.FastRectRenderer(f,2*k,2*k,l);h.setYandH(0,
+g);for(c=base.findLowIndexInSortedArray(a,function(a){return a.start},c);c<a.length;++c){var m=a[c],n=m.start;if(n>b)break;Math.max(m.duration,0.001);m=m.selected?m.colorId+d:m.colorId;0.001<k?h.fillRect(n,k,m):(f.fillStyle=l[m],f.beginPath(),f.moveTo(n-4*k,g),f.lineTo(n,0),f.lineTo(n+4*k,g),f.closePath(),f.fill())}h.flush();f.restore()}};return{Track:b}});"use strict";base.requireStylesheet("tracing.tracks.drawing_container");base.require("base.raf");base.require("tracing.tracks.track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d={SLICE:1,INSTANT_EVENT:2},b=ui.define("drawing-container",tracing.tracks.Track);b.prototype={__proto__:tracing.tracks.Track.prototype,decorate:function(a){tracing.tracks.Track.prototype.decorate.call(this,a);this.classList.add("drawing-container");this.canvas_=document.createElement("canvas");this.canvas_.className="drawing-container-canvas";this.canvas_.style.left=tracing.constants.HEADING_WIDTH+"px";this.appendChild(this.canvas_);this.ctx_=this.canvas_.getContext("2d");
+this.viewportChange_=this.viewportChange_.bind(this);this.viewport.addEventListener("change",this.viewportChange_)},get canvas(){return this.canvas_},context:function(){return this.ctx_},viewportChange_:function(){this.invalidate()},invalidate:function(){this.rafPending_||(this.rafPending_=!0,base.requestPreAnimationFrame(function(){this.rafPending_=!1;this.ctx_.clearRect(0,0,this.canvas_.width,this.canvas_.height);this.updateCanvasSizeIfNeeded_();base.requestAnimationFrameInThisFrameIfPossible(function(){for(var a=
+0;a<this.children.length;++a)this.children[a]instanceof tracing.tracks.Track&&this.children[a].drawTrack(d.INSTANT_EVENT);for(a=0;a<this.children.length;++a)this.children[a]instanceof tracing.tracks.Track&&this.children[a].drawTrack(d.SLICE);var c=window.devicePixelRatio||1,b=this.canvas_.getBoundingClientRect(),a=this.viewport.xViewToWorld(0),c=this.viewport.xViewToWorld(b.width*c);this.viewport.drawGridLines(this.ctx_,a,c);this.viewport.drawMarkerLines(this.ctx_,a,c)},this)},this))},updateCanvasSizeIfNeeded_:function(){var a=
+base.asArray(this.children).filter(this.visibleFilter_),b=this.getBoundingClientRect(),e=a[0].getBoundingClientRect(),d=a[a.length-1].getBoundingClientRect(),a=e.width-tracing.constants.HEADING_WIDTH,d=d.bottom-e.top,g=window.devicePixelRatio||1;this.canvas_.width!=a*g&&(this.canvas_.width=a*g,this.canvas_.style.width=a+"px");this.canvas_.height!=d*g&&(this.canvas_.height=d*g,this.canvas_.style.height=d+"px");b=e.top-b.top+this.scrollTop;this.canvas_.style.top+"px"!==b&&(this.canvas_.style.top=b+
+"px")},visibleFilter_:function(a){return a instanceof tracing.tracks.Track?"none"!==window.getComputedStyle(a).display:!1}};return{DrawingContainer:b,DrawType:d}});"use strict";base.exportTo("tracing",function(){return{constants:{HEADING_WIDTH:250}}});"use strict";base.requireStylesheet("tracing.tracks.heading_track");base.require("tracing.constants");base.require("tracing.tracks.track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("heading-track",tracing.tracks.Track);d.prototype={__proto__:tracing.tracks.Track.prototype,decorate:function(b){tracing.tracks.Track.prototype.decorate.call(this,b);this.classList.add("heading-track");this.headingDiv_=document.createElement("heading");this.headingDiv_.style.width=tracing.constants.HEADING_WIDTH+"px";this.appendChild(this.headingDiv_)},get heading(){return this.headingDiv_.textContent},set heading(b){this.headingDiv_.textContent=
+b},set tooltip(b){this.headingDiv_.title=b},draw:function(b,a,c){throw Error("draw implementation missing");}};return{HeadingTrack:d}});"use strict";base.requireStylesheet("tracing.tracks.ruler_track");base.require("tracing.constants");base.require("tracing.tracks.track");base.require("tracing.tracks.heading_track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("ruler-track",tracing.tracks.HeadingTrack),b=Math.log(10);d.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("ruler-track");this.strings_secs_=[];this.strings_msecs_=[];this.addEventListener("mousedown",this.onMouseDown);this.viewportMarkersChange_=this.viewportMarkersChange_.bind(this);a.addEventListener("markersChange",this.viewportMarkersChange_)},
+detach:function(){tracing.tracks.HeadingTrack.prototype.detach.call(this);this.viewport.removeEventListener("markersChange",this.viewportMarkersChange_)},viewportMarkersChange_:function(){2>this.viewport.markers.length?this.classList.remove("ruler-track-with-distance-measurements"):this.classList.add("ruler-track-with-distance-measurements")},onMouseDown:function(a){0===a.button&&this.placeAndBeginDraggingMarker(a.clientX)},placeAndBeginDraggingMarker:function(a){var b=window.devicePixelRatio||1;
+a=this.viewport.xViewToWorld((a-this.offsetLeft-tracing.constants.HEADING_WIDTH)*b);var e=this.viewport.findMarkerNear(a,6),d=!1,g=!1;e||(e=this.viewport.addMarker(a),d=!0);e.selected=!0;var h=function(a){a=this.viewport.xViewToWorld((a.clientX-this.offsetLeft-tracing.constants.HEADING_WIDTH)*b);e.positionWorld=a;g=!0}.bind(this),k=function(a){e.selected=!1;g||d||this.viewport.removeMarker(e);document.removeEventListener("mouseup",k);document.removeEventListener("mousemove",h)}.bind(this);document.addEventListener("mouseup",
+k);document.addEventListener("mousemove",h)},drawLine_:function(a,b,e,d,g,h){a.beginPath();a.moveTo(b,e);a.lineTo(d,g);a.closePath();a.strokeStyle=h;a.stroke()},drawArrow_:function(a,b,e,d,g,h,k){this.drawLine_(a,b,e,d,g,k);var l=d-b,m=g-e,n=Math.sqrt(l*l+m*m),p=(n-10)/n;b+=p*l;e+=p*m;m=m/n*h;h*=-(l/n);a.beginPath();a.fillStyle=k;a.moveTo(b+m,e+h);a.lineTo(d,g);a.lineTo(b-m,e-h);a.lineTo(b+m,e+h);a.closePath();a.fill()},draw:function(a,b,e){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,
+e)}},drawSlices_:function(a,c){var e=this.context(),d=window.devicePixelRatio||1,g=this.getBoundingClientRect(),h=g.width*d,k=g.height*d,l=this.classList.contains("ruler-track-with-distance-measurements"),g=l?k/2:k,m=this.viewport;m.drawMarkerArrows(e,a,c,g);var d=150*d,n=m.xViewVectorToWorld(d),p,q,t,v;v=Math.pow(10,Math.ceil(Math.log(n)/b));q=[10,5,2,1];for(n=0;n<q.length;++n)if(!(m.xWorldVectorToView(v/q[n])<d)){p=v/q[n-1];break}v=void 0;100>p?(q="ms",t=1,v=this.strings_msecs_):(q="s",t=1E3,v=
+this.strings_secs_);var w=m.xWorldVectorToView(p/5),n=Math.floor(a/p)*p,k=Math.floor(0.25*k);e.fillStyle="rgb(0, 0, 0)";e.strokeStyle="rgb(0, 0, 0)";e.textAlign="left";e.textBaseline="top";d=window.devicePixelRatio||1;e.font=9*d+"px sans-serif";for(var s=n;s<c;s+=p){var r=Math.floor(m.xWorldToView(s)),n=Math.floor(1E5*(s/t))/1E5;v[n]||(v[n]=n+" "+q);e.fillText(v[n],r+2*d,0);e.beginPath();e.moveTo(r,0);e.lineTo(r,g);for(n=1;5>n;++n){var u=Math.floor(r+w*n);e.moveTo(u,g-k);e.lineTo(u,g)}e.stroke()}e.moveTo(0,
+g);e.lineTo(h,g);e.stroke();if(l){p=m.markers.slice();p.sort(function(a,b){return a.positionWorld_-b.positionWorld_});l=g+2;d=l+4;for(n=0;n<p.length-1;n++){k=p[n+1];s=p[n];r=k.positionWorld-s.positionWorld;w=m.xWorldVectorToView(r);v=m.xWorldToView(s.positionWorld+r/2);100>r?(q="ms",t=1):(q="s",t=1E3);t=r/t;q=Math.abs(Math.floor(1E3*t)/1E3)+" "+q;t=e.measureText(q).width;u=m.xViewVectorToWorld(t);t=t+26+10;var x=s.positionWorld+r/2-u/2,y=x+u,r=l,u=m.xWorldToView(x),x=m.xWorldToView(y),s=m.xWorldToView(s.positionWorld),
+k=m.xWorldToView(k.positionWorld),y=!1;t<=w&&(e.fillStyle="rgb(0,0,0)",e.fillText(q,u,r),y=!0);26<=w&&(y?(q=u-10,v=x+10):q=v,this.drawArrow_(e,q,d,s,d,3,"rgb(128,121,121)"),this.drawArrow_(e,v,d,k,d,3,"rgb(128,121,121)"))}e.moveTo(0,2*g);e.lineTo(h,2*g);e.stroke()}},addIntersectingItemsInRangeToSelection:function(a,b,e,d,g){},addAllObjectsMatchingFilterToSelection:function(a,b){}};return{RulerTrack:d}});"use strict";
base.exportTo("base",function(){function d(){this.iframe_=void 0}d.prototype={__proto__:Object.prototype,measure:function(b){this.iframe_.contentDocument.body.appendChild(b);var a=this.iframe_.contentWindow.getComputedStyle(b),c=parseInt(a.width,10),a=parseInt(a.height,10);this.iframe_.contentDocument.body.removeChild(b);return{width:c,height:a}},attach:function(){var b=document.createElement("iframe");b.style.cssText="position:absolute;width:100%;height:0;border:0;visibility:hidden";document.body.appendChild(b);
this.iframe_=b;this.iframe_.contentDocument.body.style.cssText="padding:0;margin:0;overflow:hidden";for(var b=document.querySelectorAll("link[rel=stylesheet]"),a=0;a<b.length;a++){var c=b[a],e=this.iframe_.contentDocument.createElement("link");e.rel="stylesheet";e.href=c.href;this.iframe_.contentDocument.head.appendChild(e)}},detach:function(){document.body.removeChild(this.iframe_);this.iframe_=void 0}};return{MeasuringStick:d}});"use strict";base.require("tracing.tracks.track");base.require("tracing.filter");
base.require("ui");
-base.exportTo("tracing.tracks",function(){var d=ui.define("container-track",tracing.tracks.Track);d.prototype={__proto__:tracing.tracks.Track.prototype,decorate:function(b){tracing.tracks.Track.prototype.decorate.call(this,b)},detach:function(){this.textContent=""},get tracks_(){for(var b=[],a=0;a<this.children.length;a++)this.children[a].classList.contains("track")&&b.push(this.children[a]);return b},addIntersectingItemsInRangeToSelection:function(b,a,c,e,d){for(var f=0;f<this.tracks_.length;f++){var h=this.tracks_[f].getBoundingClientRect(),
-k=Math.max(c,h.top),h=Math.min(e,h.bottom);k<=h&&this.tracks_[f].addIntersectingItemsInRangeToSelection(b,a,c,e,d)}},addAllObjectsMatchingFilterToSelection:function(b,a){for(var c=0;c<this.tracks_.length;c++)this.tracks_[c].addAllObjectsMatchingFilterToSelection(b,a)}};return{ContainerTrack:d}});"use strict";base.requireStylesheet("tracing.tracks.slice_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.drawable_track");base.require("tracing.fast_rect_renderer");base.require("tracing.color_scheme");
-base.require("ui");
-base.exportTo("tracing.tracks",function(){function d(){}function b(a,b){this.string=a;this.width=b}var a=tracing.getColorPalette(),c=ui.define("slice-track",tracing.tracks.DrawableTrack);c.prototype={__proto__:tracing.tracks.DrawableTrack.prototype,SHOULD_ELIDE_TEXT:!0,decorate:function(a){tracing.tracks.DrawableTrack.prototype.decorate.call(this,a);this.classList.add("slice-track");this.elidedTitleCache=new d;this.asyncStyle_=!1},decorateHit:function(a){},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()},get hasVisibleContent(){return 0<this.slices.length},labelWidth:function(a){var b=this.context(),c=g[a];c||(c=b.measureText(a).width,g[a]=c);return c+2},labelWidthWorld:function(a,b){return this.labelWidth(a)*b},draw:function(b,c){var d=this.context(),f=window.devicePixelRatio||1,
-g=this.getBoundingClientRect().height*f,p=this.viewport,q=p.xViewVectorToWorld(1);d.save();p.applyTransformToCanvas(d);this.asyncStyle_&&(d.globalAlpha=0.25);var s=new tracing.FastRectRenderer(d,2*q,2*q,a);s.setYandH(0,g);for(var v=this.slices_,w=base.findLowIndexInSortedArray(v,function(a){return a.start+a.duration},b),t=w;t<v.length;++t){var r=v[t],u=r.start;if(u>c)break;var x=Math.max(r.duration,0.001),y=r.selected?r.colorId+e:r.colorId;x<q&&(x=q);0<r.duration?s.fillRect(u,x,y):0.001<q?s.fillRect(u,
-q,y):(d.fillStyle=a[y],d.beginPath(),d.moveTo(u-4*q,g),d.lineTo(u,0),d.lineTo(u+4*q,g),d.closePath(),d.fill())}s.flush();d.restore();if(8<g)for(d.textAlign="center",d.textBaseline="top",d.font=10*f+"px sans-serif",d.strokeStyle="rgb(0,0,0)",d.fillStyle="rgb(0,0,0)",g=20*q,s=this.SHOULD_ELIDE_TEXT,t=w;t<v.length;++t){r=v[t];if(r.start>c)break;r.duration<=g||(w=r.title+(r.didNotFinish?" (Did Not Finish)":""),u=this.labelWidth(w),s&&this.labelWidthWorld(w,q)>r.duration&&(u=this.elidedTitleCache.get(this,
-q,w,u,r.duration),w=u.string,u=u.width),u*q<r.duration&&(r=p.xWorldToView(r.start+0.5*r.duration),d.fillText(w,r,2.5*f,u)))}},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,c,e){var d=this;base.iterateOverIntersectingIntervals(this.slices_,function(a){return a.start},function(a){return a.duration},a,b,function(a){a=e.addSlice(d,a);d.decorateHit(a)})},indexOfSlice_:function(a){for(var b=base.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)if(a.matchSlice(this.slices_[c])){var e=b.addSlice(this,this.slices_[c]);
-this.decorateHit(e)}}};var e=tracing.getColorPaletteHighlightIdBoost(),g={},f={};d.prototype={get:function(a,c,e,d,g){var p=f[e];p||(p={},f[e]=p);d=p[c];d||(p[c]={},d=p[c]);p=d[g];if(void 0===p){for(p=!1;a.labelWidthWorld(e,c)>g&&!(1>0.75*e.length);)e=e.substring(0,0.75*e.length),p=!0;p&&3<e.length&&(e=e.substring(0,e.length-3)+"...");p=new b(e,a.labelWidth(e));d[g]=p}return p}};return{SliceTrack:c}});"use strict";base.require("tracing.tracks.container_track");base.require("tracing.tracks.slice_track");
+base.exportTo("tracing.tracks",function(){var d=ui.define("container-track",tracing.tracks.Track);d.prototype={__proto__:tracing.tracks.Track.prototype,decorate:function(b){tracing.tracks.Track.prototype.decorate.call(this,b)},detach:function(){this.textContent=""},get tracks_(){for(var b=[],a=0;a<this.children.length;a++)this.children[a].classList.contains("track")&&b.push(this.children[a]);return b},drawTrack:function(b){for(var a=0;a<this.children.length;++a)this.children[a]instanceof tracing.tracks.Track&&
+this.children[a].drawTrack(b)},addIntersectingItemsInRangeToSelection:function(b,a,c,e,d){for(var g=0;g<this.tracks_.length;g++){var h=this.tracks_[g].getBoundingClientRect(),k=Math.max(c,h.top),h=Math.min(e,h.bottom);k<=h&&this.tracks_[g].addIntersectingItemsInRangeToSelection(b,a,c,e,d)}tracing.tracks.Track.prototype.addIntersectingItemsInRangeToSelection.apply(this,arguments)},addAllObjectsMatchingFilterToSelection:function(b,a){for(var c=0;c<this.tracks_.length;c++)this.tracks_[c].addAllObjectsMatchingFilterToSelection(b,
+a)}};return{ContainerTrack:d}});"use strict";
+base.exportTo("tracing",function(){function d(b,a,c,e){this.ctx_=b;this.minRectSize_=a;this.maxMergeDist_=c;this.pallette_=e}d.prototype={y_:0,h_:0,merging_:!1,mergeStartX_:0,mergeCurRight_:0,setYandH:function(b,a){this.flush();this.y_=b;this.h_=a},fillRect:function(b,a,c){var e=b+a;a<this.minRectSize_?(e-this.mergeStartX_>this.maxMergeDist_&&this.flush(),this.merging_?(this.mergeCurRight_=e,this.mergedColorId=Math.max(this.mergedColorId,c)):(this.merging_=!0,this.mergeStartX_=b,this.mergeCurRight_=
+e,this.mergedColorId=c)):(this.merging_&&this.flush(),this.ctx_.fillStyle=this.pallette_[c],this.ctx_.fillRect(b,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:d}});"use strict";base.requireStylesheet("tracing.tracks.slice_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.heading_track");
+base.require("tracing.fast_rect_renderer");base.require("tracing.color_scheme");base.require("ui");
+base.exportTo("tracing.tracks",function(){function d(){}function b(a,b){this.string=a;this.width=b}var a=tracing.getColorPalette(),c=ui.define("slice-track",tracing.tracks.HeadingTrack);c.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,SHOULD_ELIDE_TEXT:!0,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("slice-track");this.elidedTitleCache=new d;this.asyncStyle_=!1;this.slices_=null},get asyncStyle(){return this.asyncStyle_},set asyncStyle(a){this.asyncStyle_=
+!!a},get slices(){return this.slices_},set slices(a){this.slices_=a||[]},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},get hasVisibleContent(){return 0<this.slices.length},labelWidth:function(a){var b=this.context(),c=f[a];c||(c=b.measureText(a).width,f[a]=c);return c+2},labelWidthWorld:function(a,b){return this.labelWidth(a)*b},draw:function(a,b,c){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,c)}},drawSlices_:function(b,c){var d=this.context(),
+f=window.devicePixelRatio||1,g=this.getBoundingClientRect().height*f,p=this.viewport,q=p.xViewVectorToWorld(1);d.save();p.applyTransformToCanvas(d);this.asyncStyle_&&(d.globalAlpha=0.25);var t=new tracing.FastRectRenderer(d,2*q,2*q,a);t.setYandH(0,g);for(var v=this.slices_,w=base.findLowIndexInSortedArray(v,function(a){return a.start+a.duration},b),s=w;s<v.length;++s){var r=v[s],u=r.start;if(u>c)break;var x=Math.max(r.duration,0.001),y=r.selected?r.colorId+e:r.colorId;x<q&&(x=q);0<r.duration?t.fillRect(u,
+x,y):0.001<q?t.fillRect(u,q,y):(d.fillStyle=a[y],d.beginPath(),d.moveTo(u-4*q,g),d.lineTo(u,0),d.lineTo(u+4*q,g),d.closePath(),d.fill())}t.flush();d.restore();if(8<g)for(d.textAlign="center",d.textBaseline="top",d.font=10*f+"px sans-serif",d.strokeStyle="rgb(0,0,0)",d.fillStyle="rgb(0,0,0)",g=20*q,t=this.SHOULD_ELIDE_TEXT,s=w;s<v.length;++s){r=v[s];if(r.start>c)break;r.duration<=g||(w=r.title+(r.didNotFinish?" (Did Not Finish)":""),u=this.labelWidth(w),t&&this.labelWidthWorld(w,q)>r.duration&&(u=
+this.elidedTitleCache.get(this,q,w,u,r.duration),w=u.string,u=u.width),u*q<r.duration&&(r=p.xWorldToView(r.start+0.5*r.duration),d.fillText(w,r,2.5*f,u)))}},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,c,e){base.iterateOverIntersectingIntervals(this.slices_,function(a){return a.start},function(a){return a.duration},a,b,function(a){a=e.addSlice(this,a);this.decorateHit(a)}.bind(this))},indexOfSlice_:function(a){for(var b=base.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)if(a.matchSlice(this.slices_[c])){var e=
+b.addSlice(this,this.slices_[c]);this.decorateHit(e)}}};var e=tracing.getColorPaletteHighlightIdBoost(),f={},g={};d.prototype={get:function(a,c,e,d,f){var p=g[e];p||(p={},g[e]=p);d=p[c];d||(p[c]={},d=p[c]);p=d[f];if(void 0===p){for(p=!1;a.labelWidthWorld(e,c)>f&&!(1>0.75*e.length);)e=e.substring(0,0.75*e.length),p=!0;p&&3<e.length&&(e=e.substring(0,e.length-3)+"...");p=new b(e,a.labelWidth(e));d[f]=p}return p}};return{SliceTrack:c}});"use strict";base.require("tracing.tracks.container_track");base.require("tracing.tracks.slice_track");
base.require("tracing.filter");base.require("tracing.trace_model");base.require("ui");
base.exportTo("tracing.tracks",function(){var d=ui.define("cpu-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("cpu-track")},get cpu(){return this.cpu_},set cpu(b){this.cpu_=b;this.updateContents_()},get tooltip(){return this.tooltip_},set tooltip(b){this.tooltip_=b;this.updateContents_()},get hasVisibleContent(){return 0<this.children.length},
updateContents_:function(){this.detach();if(this.cpu_){var b=tracing.filterSliceArray(this.categoryFilter_,this.cpu_.slices);if(b.length){var a=new tracing.tracks.SliceTrack(this.viewport);a.slices=b;a.heading="CPU "+this.cpu_.cpuNumber+":";this.appendChild(a)}for(var c in this.cpu_.counters){b=this.cpu_.counters[c];if(!this.categoryFilter_.matchCounter(b))break;a=new tracing.tracks.CounterTrack(this.viewport);a.heading="CPU "+this.cpu_.cpuNumber+" "+b.name+":";a.counter=b;a.categoryFilter=this.categoryFilter_;
-this.appendChild(a)}}}};return{CpuTrack:d}});"use strict";base.requireStylesheet("tracing.tracks.object_instance_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.drawable_track");base.require("tracing.color_scheme");base.require("ui");
-base.exportTo("tracing.tracks",function(){var d=tracing.getColorPalette(),b=tracing.getColorPaletteHighlightIdBoost(),a=ui.define("object-instance-track",tracing.tracks.DrawableTrack);a.prototype={__proto__:tracing.tracks.DrawableTrack.prototype,decorate:function(a){tracing.tracks.DrawableTrack.prototype.decorate.call(this,a);this.classList.add("object-instance-track");this.objectInstances_=[];this.objectSnapshots_=[]},get objectInstances(){return this.objectInstances_},set objectInstances(a){this.invalidate();
-a&&0!=a.length?(this.heading=a[0].typeName,this.objectInstances_=a,this.objectSnapshots_=[],this.objectInstances_.forEach(function(a){this.objectSnapshots_.push.apply(this.objectSnapshots_,a.snapshots)},this)):(this.heading="",this.objectInstances_=[],this.objectSnapshots_=[])},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a;this.invalidate()},get snapshotRadiusView(){return 7*(window.devicePixelRatio||1)},draw:function(a,e){var g=this.context(),f=window.devicePixelRatio||
-1,h=this.getBoundingClientRect().height*f,k=0.5*h,l=2*Math.PI,m=this.viewport,n=this.snapshotRadiusView,p=m.xViewVectorToWorld(h),q;g.save();m.applyTransformToCanvas(g);var s=this.objectInstances_;q=base.findLowIndexInSortedArray(s,function(a){return a.deletionTs},a);g.globalAlpha=0.25;for(g.strokeStyle="rgb(0,0,0)";q<s.length;++q){var v=s[q],w=v.creationTs;if(w>e)break;var t=v.selected?v.colorId+b:v.colorId,v=v.deletionTs==Number.MAX_VALUE?e:v.deletionTs;g.fillStyle=d[t];g.fillRect(w,f,v-w,h-2*f)}g.globalAlpha=
-1;g.restore();f=this.objectSnapshots_;for(q=base.findLowIndexInSortedArray(f,function(a){return a.ts+p},a);q<f.length;++q){h=f[q];w=h.ts;if(w-p>e)break;w=m.xWorldToView(w);t=h.selected?h.objectInstance.colorId+b:h.objectInstance.colorId;g.fillStyle=d[t];g.beginPath();g.arc(w,k,n,0,l);g.fill();h.selected?(g.lineWidth=5,g.strokeStyle="rgb(100,100,0)",g.stroke(),g.beginPath(),g.arc(w,k,n-1,0,l),g.lineWidth=2,g.strokeStyle="rgb(255,255,0)"):(g.lineWidth=1,g.strokeStyle="rgb(0,0,0)");g.stroke()}g.lineWidth=
-1},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,f){function h(a){f.addObjectInstance(k,a)}var k=this,l=!1,m=d*this.snapshotRadiusView;base.iterateOverIntersectingIntervals(this.objectSnapshots_,function(a){return a.ts-m},function(a){return 2*m},a,b,function(a){f.addObjectSnapshot(k,a);l=!0});l||base.iterateOverIntersectingIntervals(this.objectInstances_,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},a,b,h)},addItemNearToProvidedHitToSelection:function(a,
-b,d){if(a instanceof tracing.SelectionObjectSnapshotHit){if(a=this.objectSnapshots_.indexOf(a.objectSnapshot),b=a+b,0<=b&&b<this.objectSnapshots_.length)return d.addObjectSnapshot(this,this.objectSnapshots_[b]),!0}else if(a instanceof tracing.SelectionObjectInstanceHit){if(a=this.objectInstances_.indexOf(a.objectInstance),b=a+b,0<=b&&b<this.objectInstances_.length)return d.addObjectInstance(this,this.objectInstances_[b]),!0}else throw Error("Unrecognized hit");return!1},addAllObjectsMatchingFilterToSelection:function(a,
-b){}};a.typeNameToTrackConstructorMap={};a.register=function(b,e){if(a.typeNameToTrackConstructorMap[b])throw Error("Handler already registered for "+b);a.typeNameToTrackConstructorMap[b]=e};a.getTrackConstructor=function(b){return a.typeNameToTrackConstructorMap[b]};return{ObjectInstanceTrack:a}});"use strict";base.requireStylesheet("tcmalloc.heap_instance_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.drawable_track");base.require("tracing.tracks.object_instance_track");
-base.require("tracing.color_scheme");base.require("ui");
-base.exportTo("tcmalloc",function(){var d=tracing.getColorPalette(),b=tracing.getColorPaletteHighlightIdBoost(),a=ui.define("heap-instance-track",tracing.tracks.DrawableTrack);a.prototype={__proto__:tracing.tracks.DrawableTrack.prototype,decorate:function(a){tracing.tracks.DrawableTrack.prototype.decorate.call(this,a);this.classList.add("heap-instance-track");this.objectInstance_=null},set objectInstances(a){this.invalidate();if(a){if(1!=a.length)throw Error("Bad object instance count.");this.objectInstance_=
-a[0];this.maxBytes_=this.computeMaxBytes_(this.objectInstance_.snapshots)}else this.objectInstance_=[]},computeMaxBytes_:function(a){for(var b=0,d=0;d<a.length;d++){for(var f=a[d],h=Object.keys(f.heap_.children),k=0,l=0;l<h.length;l++)k+=f.heap_.children[h[l]].currentBytes;k>b&&(b=k)}return b},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a;this.invalidate()},draw:function(a,e){for(var g=this.context(),f=window.devicePixelRatio||1,f=this.getBoundingClientRect().height*
-f,h=this.viewport,k=h.xViewVectorToWorld(f),l=this.objectInstance_.snapshots,m=base.findLowIndexInSortedArray(l,function(a){return a.ts+k},a);m<l.length;++m){var n=l[m],p=n.ts;if(p-k>e)break;p=h.xWorldToView(p);0>p&&(p=0);for(var q=h.xWorldToView(m<l.length-1?l[m+1].ts:l[l.length-1].ts+5E3),s=this.maxBytes_,v=f,w=Object.keys(n.heap_.children),t=w.length-1;0<=t;t--){var r=n.heap_.children[w[t]];g.fillStyle=this.objectInstance_.selectedTraces&&0<this.objectInstance_.selectedTraces.length&&this.objectInstance_.selectedTraces[0]==
-w[t]?"rgb(239, 248, 206)":d[(n.selected?n.objectInstance.colorId+b:n.objectInstance.colorId)+t];r=f*r.currentBytes/s;g.fillRect(p,v-r,q-p+1,r);v-=r}}g.lineWidth=1},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,f){var h=this;base.iterateOverIntersectingIntervals(this.objectInstance_.snapshots,function(a){return a.ts},function(a){return 5E3},a,b,function(a){f.addObjectSnapshot(h,a)})},addItemNearToProvidedHitToSelection:function(a,b,d){if(a instanceof tracing.SelectionObjectSnapshotHit){var f=
-this.objectInstance_.snapshots;a=f.indexOf(a.objectSnapshot)+b;if(0<=a&&a<f.length)return d.addObjectSnapshot(this,f[a]),!0}else throw Error("Unrecognized hit");return!1},addAllObjectsMatchingFilterToSelection:function(a,b){}};tracing.tracks.ObjectInstanceTrack.register("memory::Heap",a);return{HeapInstanceTrack:a}});"use strict";base.requireStylesheet("tracing.tracks.counter_track");base.require("tracing.tracks.drawable_track");base.require("tracing.color_scheme");base.require("ui");
-base.exportTo("tracing.tracks",function(){var d=tracing.getColorPalette(),b=ui.define("counter-track",tracing.tracks.DrawableTrack);b.prototype={__proto__:tracing.tracks.DrawableTrack.prototype,decorate:function(a){tracing.tracks.DrawableTrack.prototype.decorate.call(this,a);this.classList.add("counter-track");this.selectedSamples_={};this.categoryFilter_=new tracing.Filter},decorateHit:function(a){},get counter(){return this.counter_},set counter(a){this.counter_=a;this.heading=a.name+": ";this.invalidate()},
-get categoryFilter(){return this.categoryFilter_},set categoryFilter(a){this.categoryFilter_=a},get selectedSamples(){return this.selectedSamples_},draw:function(a,b){var e=this.context(),g=window.devicePixelRatio||1,g=this.getBoundingClientRect().height*g,f=this.counter_,h=this.viewport,k=h.xViewVectorToWorld(1),l=h.xViewVectorToWorld(1);e.save();h.applyTransformToCanvas(e);for(var h=f.numSeries,m=f.numSamples,n=base.findLowIndexInSortedArray(f.timestamps,function(a){return a},a),n=0<n-1?n-1:0,p=
-g/f.maxTotal,q=f.numSeries-1;0<=q;q--){e.fillStyle=d[f.seriesColors[q]];e.beginPath();for(var s=n-1,v=0<=s?f.timestamps[s]-l:-1,w=g,t=!1;;){var r=s+1;if(r>=m){e.lineTo(v,w);e.lineTo(v+8*k,w);e.lineTo(v+8*k,g);break}var u=f.timestamps[r],x=f.totals[r*h+q],x=g-p*x;if(u>b){e.lineTo(u,w);e.lineTo(u,g);break}if(r+1<m&&(s=f.timestamps[r+1],s-v<=l&&s<b)){s=r;continue}t||(e.moveTo(a,g),t=!0);u-v<l&&(u=v+l);e.lineTo(u,w);e.lineTo(u,x);s=r;v=u;w=x}e.closePath();e.fill()}e.fillStyle="rgba(255, 0, 0, 1)";for(r in this.selectedSamples_)if(this.selectedSamples_[r])for(u=
-f.timestamps[r],q=f.numSeries-1;0<=q;q--)x=f.totals[r*h+q],x=g-p*x,e.fillRect(u-k,x-1,3*k,3);e.restore()},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,g){function f(a,b){return b==h.timestamps.length-1?0:h.timestamps[b+1]-h.timestamps[b]}var h=this.counter_;a=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},f,a);for(b=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},f,b);a<=b;a++)0>a||a>=h.timestamps.length||(d=g.addCounterSample(this,
-this.counter,a),this.decorateHit(d))},addAllObjectsMatchingFilterToSelection:function(a,b){}};return{CounterTrack:b}});"use strict";base.requireStylesheet("tracing.tracks.spacing_track");
-base.exportTo("tracing.tracks",function(){var d=ui.define("spacing-track",tracing.tracks.DrawableTrack);d.prototype={__proto__:tracing.tracks.DrawableTrack.prototype,decorate:function(b){tracing.tracks.DrawableTrack.prototype.decorate.call(this,b);this.classList.add("spacing-track")},draw:function(b,a){},addAllObjectsMatchingFilterToSelection:function(b,a){}};return{SpacingTrack:d}});"use strict";base.require("base.sorted_array_utils");base.require("tracing.tracks.container_track");base.require("ui");
+this.appendChild(a)}}}};return{CpuTrack:d}});"use strict";base.requireStylesheet("tracing.tracks.object_instance_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.heading_track");base.require("tracing.color_scheme");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=tracing.getColorPalette(),b=tracing.getColorPaletteHighlightIdBoost(),a=ui.define("object-instance-track",tracing.tracks.HeadingTrack);a.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("object-instance-track");this.objectInstances_=[];this.objectSnapshots_=[]},get objectInstances(){return this.objectInstances_},set objectInstances(a){a&&0!=
+a.length?(this.heading=a[0].typeName,this.objectInstances_=a,this.objectSnapshots_=[],this.objectInstances_.forEach(function(a){this.objectSnapshots_.push.apply(this.objectSnapshots_,a.snapshots)},this)):(this.heading="",this.objectInstances_=[],this.objectSnapshots_=[])},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},get snapshotRadiusView(){return 7*(window.devicePixelRatio||1)},draw:function(a,b,d){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,
+d)}},drawSlices_:function(a,e){var f=this.context(),g=window.devicePixelRatio||1,h=this.getBoundingClientRect().height*g,k=0.5*h,l=2*Math.PI,m=this.viewport,n=this.snapshotRadiusView,p=m.xViewVectorToWorld(h),q;f.save();m.applyTransformToCanvas(f);var t=this.objectInstances_;q=base.findLowIndexInSortedArray(t,function(a){return a.deletionTs},a);f.globalAlpha=0.25;for(f.strokeStyle="rgb(0,0,0)";q<t.length;++q){var v=t[q],w=v.creationTs;if(w>e)break;var s=v.selected?v.colorId+b:v.colorId,v=v.deletionTs==
+Number.MAX_VALUE?e:v.deletionTs;f.fillStyle=d[s];f.fillRect(w,g,v-w,h-2*g)}f.globalAlpha=1;f.restore();g=this.objectSnapshots_;for(q=base.findLowIndexInSortedArray(g,function(a){return a.ts+p},a);q<g.length;++q){h=g[q];w=h.ts;if(w-p>e)break;w=m.xWorldToView(w);s=h.selected?h.objectInstance.colorId+b:h.objectInstance.colorId;f.fillStyle=d[s];f.beginPath();f.arc(w,k,n,0,l);f.fill();h.selected?(f.lineWidth=5,f.strokeStyle="rgb(100,100,0)",f.stroke(),f.beginPath(),f.arc(w,k,n-1,0,l),f.lineWidth=2,f.strokeStyle=
+"rgb(255,255,0)"):(f.lineWidth=1,f.strokeStyle="rgb(0,0,0)");f.stroke()}f.lineWidth=1},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,g){function h(a){g.addObjectInstance(k,a)}var k=this,l=!1,m=d*this.snapshotRadiusView;base.iterateOverIntersectingIntervals(this.objectSnapshots_,function(a){return a.ts-m},function(a){return 2*m},a,b,function(a){g.addObjectSnapshot(k,a);l=!0});l||base.iterateOverIntersectingIntervals(this.objectInstances_,function(a){return a.creationTs},function(a){return a.deletionTs-
+a.creationTs},a,b,h)},addItemNearToProvidedHitToSelection:function(a,b,d){if(a instanceof tracing.SelectionObjectSnapshotHit){if(a=this.objectSnapshots_.indexOf(a.objectSnapshot),b=a+b,0<=b&&b<this.objectSnapshots_.length)return d.addObjectSnapshot(this,this.objectSnapshots_[b]),!0}else if(a instanceof tracing.SelectionObjectInstanceHit){if(a=this.objectInstances_.indexOf(a.objectInstance),b=a+b,0<=b&&b<this.objectInstances_.length)return d.addObjectInstance(this,this.objectInstances_[b]),!0}else throw Error("Unrecognized hit");
+return!1},addAllObjectsMatchingFilterToSelection:function(a,b){}};a.typeNameToTrackConstructorMap={};a.register=function(b,e){if(a.typeNameToTrackConstructorMap[b])throw Error("Handler already registered for "+b);a.typeNameToTrackConstructorMap[b]=e};a.getTrackConstructor=function(b){return a.typeNameToTrackConstructorMap[b]};return{ObjectInstanceTrack:a}});"use strict";base.requireStylesheet("tcmalloc.heap_instance_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.heading_track");
+base.require("tracing.tracks.object_instance_track");base.require("tracing.color_scheme");base.require("ui");
+base.exportTo("tcmalloc",function(){var d=tracing.getColorPalette(),b=tracing.getColorPaletteHighlightIdBoost(),a=ui.define("heap-instance-track",tracing.tracks.HeadingTrack);a.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("heap-instance-track");this.objectInstance_=null},set objectInstances(a){if(a){if(1!=a.length)throw Error("Bad object instance count.");this.objectInstance_=a[0];this.maxBytes_=
+this.computeMaxBytes_(this.objectInstance_.snapshots)}else this.objectInstance_=[]},computeMaxBytes_:function(a){for(var b=0,d=0;d<a.length;d++){for(var g=a[d],h=Object.keys(g.heap_.children),k=0,l=0;l<h.length;l++)k+=g.heap_.children[h[l]].currentBytes;k>b&&(b=k)}return b},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},draw:function(a,b,d){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,d)}},drawSlices_:function(a,e){var f=this.context(),
+g=window.devicePixelRatio||1,h=this.getBoundingClientRect(),k=h.width*g,g=h.height*g,h=this.viewport,l=this.maxBytes_,m=this.objectInstance_.snapshots,n=base.findLowIndexInSortedArray(m,function(a){return a.ts},a);for(0<n&&(n-=1);n<m.length;++n){var p=m[n],q=p.ts;if(q>e)break;q=h.xWorldToView(q);0>q&&(q=0);var t=h.xWorldToView(n<m.length-1?m[n+1].ts:m[m.length-1].ts+5E3);t>k&&(t=k);for(var q=Math.floor(q),t=Math.floor(t),v=g,w=Object.keys(p.heap_.children),s=w.length-1;0<=s;s--){var r=p.heap_.children[w[s]];
+f.fillStyle=this.objectInstance_.selectedTraces&&0<this.objectInstance_.selectedTraces.length&&this.objectInstance_.selectedTraces[0]==w[s]?"rgb(239, 248, 206)":d[(p.selected?p.objectInstance.colorId+b:p.objectInstance.colorId)+s];r=g*r.currentBytes/l;f.fillRect(q,v-r,Math.max(t-q,1),r);v-=r}}f.lineWidth=1},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,g){var h=this;base.iterateOverIntersectingIntervals(this.objectInstance_.snapshots,function(a){return a.ts},function(a){return 5E3},
+a,b,function(a){g.addObjectSnapshot(h,a)})},addItemNearToProvidedHitToSelection:function(a,b,d){if(a instanceof tracing.SelectionObjectSnapshotHit){var g=this.objectInstance_.snapshots;a=g.indexOf(a.objectSnapshot)+b;if(0<=a&&a<g.length)return d.addObjectSnapshot(this,g[a]),!0}else throw Error("Unrecognized hit");return!1},addAllObjectsMatchingFilterToSelection:function(a,b){}};tracing.tracks.ObjectInstanceTrack.register("memory::Heap",a);return{HeapInstanceTrack:a}});"use strict";base.requireStylesheet("tracing.tracks.counter_track");
+base.require("tracing.tracks.heading_track");base.require("tracing.color_scheme");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=tracing.getColorPalette(),b=ui.define("counter-track",tracing.tracks.HeadingTrack);b.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("counter-track");this.selectedSamples_={};this.categoryFilter_=new tracing.Filter},decorateHit:function(a){},get counter(){return this.counter_},set counter(a){this.counter_=a;this.heading=a.name+": "},get categoryFilter(){return this.categoryFilter_},
+set categoryFilter(a){this.categoryFilter_=a},get selectedSamples(){return this.selectedSamples_},draw:function(a,b,e){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,e)}},drawSlices_:function(a,b){var e=this.context(),f=window.devicePixelRatio||1,f=this.getBoundingClientRect().height*f,g=this.counter_,h=this.viewport,k=h.xViewVectorToWorld(1),l=h.xViewVectorToWorld(1);e.save();h.applyTransformToCanvas(e);for(var h=g.numSeries,m=g.numSamples,n=base.findLowIndexInSortedArray(g.timestamps,
+function(a){return a},a),n=0<n-1?n-1:0,p=f/g.maxTotal,q=g.numSeries-1;0<=q;q--){e.fillStyle=d[g.series[q].color];e.beginPath();for(var t=n-1,v=0<=t?g.timestamps[t]-l:-1,w=f,s=!1;;){var r=t+1;if(r>=m){e.lineTo(v,w);e.lineTo(v+8*k,w);e.lineTo(v+8*k,f);break}var u=g.timestamps[r],x=g.totals[r*h+q],x=f-p*x;if(u>b){e.lineTo(u,w);e.lineTo(u,f);break}if(r+1<m&&(t=g.timestamps[r+1],t-v<=l&&t<b)){t=r;continue}s||(e.moveTo(a,f),s=!0);u-v<l&&(u=v+l);e.lineTo(u,w);e.lineTo(u,x);t=r;v=u;w=x}e.closePath();e.fill()}e.fillStyle=
+"rgba(255, 0, 0, 1)";for(r in this.selectedSamples_)if(this.selectedSamples_[r])for(u=g.timestamps[r],q=g.numSeries-1;0<=q;q--)x=g.totals[r*h+q],x=f-p*x,e.fillRect(u-k,x-1,3*k,3);e.restore()},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,e,d){function g(a,b){return b===h.timestamps.length-1?0:h.timestamps[b+1]-h.timestamps[b]}var h=this.counter_;a=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},g,a);for(b=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},
+g,b);a<=b;a++)0>a||a>=h.timestamps.length||(e=d.addCounterSample(this,this.counter,a),this.decorateHit(e))},addAllObjectsMatchingFilterToSelection:function(a,b){}};return{CounterTrack:b}});"use strict";base.requireStylesheet("tracing.tracks.spacing_track");base.require("tracing.tracks.heading_track");
+base.exportTo("tracing.tracks",function(){var d=ui.define("spacing-track",tracing.tracks.HeadingTrack);d.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(b){tracing.tracks.HeadingTrack.prototype.decorate.call(this,b);this.classList.add("spacing-track")},draw:function(b,a,c){},addAllObjectsMatchingFilterToSelection:function(b,a){}};return{SpacingTrack:d}});"use strict";base.require("base.sorted_array_utils");base.require("tracing.tracks.container_track");base.require("ui");
base.exportTo("tracing.tracks",function(){var d=ui.define("slice-group-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("slice-group-track");this.heading_=this.tooltip_=""},get group(){return this.group_},set group(b){this.group_=b;this.updateContents_()},get heading(){return this.heading_},set heading(b){this.heading_=b;this.updateContents_()},
get tooltip(){return this.tooltip_},set tooltip(b){this.tooltip_=b;this.updateContents_()},set decorateHit(b){this.decorateHit_=b;this.updateContents_()},addSliceTrack_:function(b){var a=new tracing.tracks.SliceTrack(this.viewport);a.slices=b;a.decorateHit=this.decorateHit_;a.categoryFilter_=this.categoryFilter;this.appendChild(a);return a},get subRows(){return base.asArray(this.children).map(function(b){return b.slices})},get hasVisibleContent(){return 0<this.children.length},updateContents_:function(){if(this.group_){var b=
tracing.filterSliceArray(this.categoryFilter,this.group_.slices);if(this.areArrayContentsSame_(this.filteredSlices_,b))this.updateHeadingAndTooltip_();else if(this.filteredSlices_=b,this.detach(),b.length){for(var b=this.buildSubRows_(b),a=0;a<b.length;a++){var c=b[a];c.length&&this.addSliceTrack_(c)}this.updateHeadingAndTooltip_()}}else this.updateHeadingAndTooltip_()},updateHeadingAndTooltip_:function(){this.firstChild&&(this.firstChild.heading=this.heading_,this.firstChild.tooltip=this.tooltip_)},
-buildSubRows_:function(b){if(!b.length)return[];for(var a=[],c=0;c<b.length;c++)b[c].subSlices&&b[c].subSlices.splice(0,b[c].subSlices.length),a.push(c);a.sort(function(a,c){var d=b[a],e=b[c];return d.start!=e.start?d.start-e.start:c-a});var d=[[]];this.badSlices_=[];for(c=0;c<a.length;c++){for(var g=b[a[c]],f=!1,h=d.length-1;0<=h;h--)if(0!=d[h].length){var k=d[h][d[h].length-1];g.start<k.start&&(this.badSlices_.push(g),f=!0);if(g.start>=k.start&&g.end<=k.end){for(;d.length<=h+1;)d.push([]);d[h+1].push(g);
-k.subSlices&&k.subSlices.push(g);f=!0;break}}f||d[0].push(g)}return d},areArrayContentsSame_:function(b,a){if(!(b&&a&&b.length&&a.length)||b.length!=a.length)return!1;for(var c=0;c<b.length;++c)if(b[c]!=a[c])return!1;return!0}};return{SliceGroupTrack:d}});"use strict";base.require("tracing.tracks.slice_group_track");base.require("ui");
+buildSubRows_:function(b){if(!b.length)return[];for(var a=[],c=0;c<b.length;c++)b[c].subSlices&&b[c].subSlices.splice(0,b[c].subSlices.length),a.push(c);a.sort(function(a,c){var e=b[a],d=b[c];return e.start!=d.start?e.start-d.start:c-a});var e=[[]];this.badSlices_=[];for(c=0;c<a.length;c++){for(var d=b[a[c]],g=!1,h=e.length-1;0<=h;h--)if(0!=e[h].length){var k=e[h][e[h].length-1];d.start<k.start&&(this.badSlices_.push(d),g=!0);if(d.start>=k.start&&d.end<=k.end){for(;e.length<=h+1;)e.push([]);e[h+1].push(d);
+k.subSlices&&k.subSlices.push(d);g=!0;break}}g||e[0].push(d)}return e},areArrayContentsSame_:function(b,a){if(!(b&&a&&b.length&&a.length)||b.length!=a.length)return!1;for(var c=0;c<b.length;++c)if(b[c]!=a[c])return!1;return!0}};return{SliceGroupTrack:d}});"use strict";base.require("tracing.tracks.slice_group_track");base.require("ui");
base.exportTo("tracing.tracks",function(){var d=ui.define("async-slice-group-track",tracing.tracks.SliceGroupTrack);d.prototype={__proto__:tracing.tracks.SliceGroupTrack.prototype,decorate:function(b){tracing.tracks.SliceGroupTrack.prototype.decorate.call(this,b);this.classList.add("async-slice-group-track")},addSliceTrack_:function(b){b=tracing.tracks.SliceGroupTrack.prototype.addSliceTrack_.call(this,b);b.asyncStyle=!0;return b},buildSubRows_:function(){var b=tracing.filterSliceArray(this.categoryFilter,
-this.group_.slices);b.sort(function(a,b){return a.start-b.start});for(var a=[],c=0;c<b.length;c++){for(var d=b[c],g=!1,f=0;f<a.length;f++){var h=a[f];if(d.start>=h[h.length-1].end){g=!0;if(void 0===d.subSlices||1>d.subSlices.length)throw Error("AsyncEvent missing subSlices: ")+d.name;for(f=0;f<d.subSlices.length;f++)h.push(d.subSlices[f]);break}}if(!g&&(h=[],void 0!==d.subSlices)){for(f=0;f<d.subSlices.length;f++)h.push(d.subSlices[f]);a.push(h)}}return a}};return{AsyncSliceGroupTrack:d}});"use strict";
+this.group_.slices);b.sort(function(a,b){return a.start-b.start});for(var a=[],c=0;c<b.length;c++){for(var e=b[c],d=!1,g=0;g<a.length;g++){var h=a[g];if(e.start>=h[h.length-1].end){d=!0;if(void 0===e.subSlices||1>e.subSlices.length)throw Error("AsyncEvent missing subSlices: ")+e.name;for(g=0;g<e.subSlices.length;g++)h.push(e.subSlices[g]);break}}if(!d&&(h=[],void 0!==e.subSlices)){for(g=0;g<e.subSlices.length;g++)h.push(e.subSlices[g]);a.push(h)}}return a}};return{AsyncSliceGroupTrack:d}});"use strict";
base.requireStylesheet("tracing.tracks.thread_track");base.require("tracing.tracks.container_track");base.require("tracing.tracks.slice_track");base.require("tracing.tracks.slice_group_track");base.require("tracing.tracks.async_slice_group_track");base.require("tracing.filter");base.require("ui");
base.exportTo("tracing.tracks",function(){var d=ui.define("thread-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("thread-track")},get thread(){return this.thread_},set thread(b){this.thread_=b;this.updateContents_()},get hasVisibleContent(){return 0<this.tracks_.length},updateContents_:function(){this.detach();if(this.thread_){this.heading=this.thread_.userFriendlyName+
": ";this.tooltip=this.thread_.userFriendlyDetails;if(this.thread_.asyncSliceGroup.length){var b=new tracing.tracks.AsyncSliceGroupTrack(this.viewport);b.categoryFilter=this.categoryFilter;b.decorateHit=function(a){};b.group=this.thread_.asyncSliceGroup;b.hasVisibleContent&&this.appendChild(b)}this.thread_.samples.length&&(b=new tracing.tracks.SliceTrack(this.viewport),b.categoryFilter=b,b.group=this.thread_,b.slices=this.thread_.samples,b.decorateHit=function(a){a.thread=this.thread_},this.appendChild(b));
this.thread_.cpuSlices&&(b=new tracing.tracks.SliceTrack(this.viewport),b.categoryFilter=this.categoryFilter,b.heading="",b.height="4px",b.decorateHit=function(a){a.thread=this.thread_},b.slices=this.thread_.cpuSlices,b.hasVisibleContent&&this.appendChild(b));this.thread_.sliceGroup.length&&(b=new tracing.tracks.SliceGroupTrack(this.viewport),b.categoryFilter=this.categoryFilter,b.heading=this.thread_.userFriendlyName,b.tooltip=this.thread_.userFriendlyDetails,b.decorateHit=function(a){a.thread=this.thread_},
b.group=this.thread_.sliceGroup,b.hasVisibleContent&&this.appendChild(b))}},collapsedDidChange:function(b){if(b){b=parseInt(this.tracks[0].height);for(var a=0;a<this.tracks.length;++a)2<b?this.tracks[a].height=Math.floor(b)+"px":this.tracks[a].style.display="none",b*=0.5}else for(a=0;a<this.tracks.length;++a)this.tracks[a].height=this.tracks[0].height,this.tracks[a].style.display=""}};return{ThreadTrack:d}});"use strict";base.require("ui");base.require("base.settings");
base.exportTo("ui",function(){function d(a){var b=document.createElement("span");a&&(a.className&&(b.className=a.className),a.textContent&&(b.textContent=a.textContent),a.parent&&a.parent.appendChild(b));return b}var b=1;return{createSpan:d,createDiv:function(a){var b=document.createElement("div");a&&(a.className&&(b.className=a.className),a.parent&&a.parent.appendChild(b));return b},createScopedStyle:function(a){var b=document.createElement("style");b.scoped=!0;b.innerHTML=a;return b},createSelector:function(a,
-b,d,g,f){function h(f){f=n.selectedOptions[0].targetPropertyValue;base.Settings.set(d,f);a[b]=f}for(var k,l=0;l<f.length;l++){var m=f[l];if(m.value==g){k=l;break}}if(void 0===k)throw Error("defaultValue must be in the items list");var n=document.createElement("select");n.addEventListener("change",h);for(l=0;l<f.length;l++){var m=f[l],p=document.createElement("option");p.textContent=m.label;p.targetPropertyValue=m.value;n.appendChild(p)}a.__lookupSetter__("selectedIndex");n.__defineGetter__("selectedValue",
-function(a){return n.children[n.selectedIndex].targetPropertyValue});n.__defineSetter__("selectedValue",function(a){for(var b=0;b<n.children.length;b++)if(n.children[b].targetPropertyValue==a){n.selectedIndex=b;h();return}throw Error("Not a valid value");});f=base.Settings.get(d,g);m=!1;for(l=0;l<n.children.length;l++)if(n.children[l].targetPropertyValue==f){m=!0;a[b]=f;n.selectedIndex=l;break}m||(n.selectedIndex=k,a[b]=g);return n},createCheckBox:function(a,c,e,g,f){function h(){base.Settings.set(e,
-k.checked);a[c]=k.checked}var k=document.createElement("input");k.type="checkbox";g=base.Settings.get(e,g);k.checked=!!g;a[c]=g;k.addEventListener("change",h);g="#checkbox-"+b++;var l=d({className:"labeled-checkbox"});k.setAttribute("id",g);var m=document.createElement("label");m.textContent=f;m.setAttribute("for",g);l.appendChild(k);l.appendChild(m);l.__defineSetter__("checked",function(a){k.checked=!!a;h()});l.__defineGetter__("checked",function(){return k.checked});return l}}});"use strict";base.require("tcmalloc.heap_instance_track");
+b,e,d,g){function h(d){d=n.selectedOptions[0].targetPropertyValue;base.Settings.set(e,d);a[b]=d}for(var k,l=0;l<g.length;l++){var m=g[l];if(m.value==d){k=l;break}}if(void 0===k)throw Error("defaultValue must be in the items list");var n=document.createElement("select");n.addEventListener("change",h);for(l=0;l<g.length;l++){var m=g[l],p=document.createElement("option");p.textContent=m.label;p.targetPropertyValue=m.value;n.appendChild(p)}a.__lookupSetter__("selectedIndex");n.__defineGetter__("selectedValue",
+function(a){return n.children[n.selectedIndex].targetPropertyValue});n.__defineSetter__("selectedValue",function(a){for(var b=0;b<n.children.length;b++)if(n.children[b].targetPropertyValue==a){n.selectedIndex=b;h();return}throw Error("Not a valid value");});g=base.Settings.get(e,d);m=!1;for(l=0;l<n.children.length;l++)if(n.children[l].targetPropertyValue==g){m=!0;a[b]=g;n.selectedIndex=l;break}m||(n.selectedIndex=k,a[b]=d);return n},createCheckBox:function(a,c,e,f,g){function h(){base.Settings.set(e,
+k.checked);a[c]=k.checked}var k=document.createElement("input");k.type="checkbox";f=base.Settings.get(e,f);k.checked=!!f;a[c]=f;k.addEventListener("change",h);f="#checkbox-"+b++;var l=d({className:"labeled-checkbox"});k.setAttribute("id",f);var m=document.createElement("label");m.textContent=g;m.setAttribute("for",f);l.appendChild(k);l.appendChild(m);l.__defineSetter__("checked",function(a){k.checked=!!a;h()});l.__defineGetter__("checked",function(){return k.checked});return l}}});"use strict";base.require("tcmalloc.heap_instance_track");
base.require("tracing.analysis.object_snapshot_view");base.require("tracing.analysis.object_instance_view");base.require("tracing.tracks.container_track");base.require("tracing.tracks.counter_track");base.require("tracing.tracks.object_instance_track");base.require("tracing.tracks.spacing_track");base.require("tracing.tracks.thread_track");base.require("tracing.trace_model_settings");base.require("tracing.filter");base.require("ui");base.require("ui.dom_helpers");base.requireStylesheet("tracing.tracks.process_track_base");
base.exportTo("tracing.tracks",function(){var d=tracing.analysis.ObjectSnapshotView,b=tracing.analysis.ObjectInstanceView,a=tracing.TraceModelSettings,c=tracing.tracks.SpacingTrack,e=ui.define("process-track-base",tracing.tracks.ContainerTrack);e.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(a){tracing.tracks.ContainerTrack.prototype.decorate.call(this,a);this.processBase_=void 0;this.classList.add("process-track-base");this.classList.add("expanded");this.expandEl_=
document.createElement("expand-button");this.expandEl_.classList.add("expand-button-expanded");this.processNameEl_=ui.createSpan();this.headerEl_=ui.createDiv({className:"process-track-header"});this.headerEl_.appendChild(this.expandEl_);this.headerEl_.appendChild(this.processNameEl_);this.headerEl_.addEventListener("click",this.onHeaderClick_.bind(this));this.appendChild(this.headerEl_)},get processBase(){return this.processBase_},set processBase(b){if(this.processBase_=b)this.expanded=(new a(this.processBase_.model)).getSettingFor(this.processBase_,
"expanded",!0);this.updateContents_()},get expanded(){return this.expandEl_.classList.contains("expand-button-expanded")},set expanded(b){b=!!b;this.expandEl_.classList.contains("expand-button-expanded")!==b&&(b?(this.classList.add("expanded"),this.expandEl_.classList.add("expand-button-expanded")):(this.classList.remove("expanded"),this.expandEl_.classList.remove("expand-button-expanded")),this.viewport_.dispatchChangeEvent(),this.processBase_&&(new a(this.processBase_.model)).setSettingFor(this.processBase_,
"expanded",b))},get hasVisibleContent(){return this.expanded?1<this.children.length:!0},onHeaderClick_:function(a){a.stopPropagation();a.preventDefault();this.expanded=!this.expanded},updateContents_:function(){this.tracks_.forEach(function(a){this.removeChild(a)},this);this.processBase_&&(this.processNameEl_.textContent=this.processBase_.userFriendlyName,this.headerEl_.title=this.processBase_.userFriendlyDetails,this.willAppendTracks_(),this.appendObjectInstanceTracks_(),this.appendCounterTracks_(),
-this.appendThreadTracks_(),this.didAppendTracks_())},willAppendTracks_:function(){},didAppendTracks_:function(){},appendObjectInstanceTracks_:function(){var a=this.processBase_.objects.getAllInstancesByTypeName(),e=base.dictionaryKeys(a);e.sort();var h=!1;e.forEach(function(c){var e=a[c],f=b.getViewInfo(c),n=d.getViewInfo(c);f&&!f.options.showInTrackView&&(f=void 0);n&&!n.options.showInTrackView&&(n=void 0);for(var n=f||n,f=[],p=0;p<e.length;p++){var q=e[p];0!==q.snapshots.length&&(q.hasImplicitSnapshots&&
-!n||f.push(q))}0!==f.length&&(c=tracing.tracks.ObjectInstanceTrack.getTrackConstructor(c),c||(c=tracing.tracks.ObjectInstanceTrack),c=new c(this.viewport),c.categoryFilter=this.categoryFilter_,c.objectInstances=f,this.appendChild(c),h=!0)},this);h&&this.appendChild(new c(this.viewport))},appendCounterTracks_:function(){var a=base.dictionaryValues(this.processBase.counters).filter(this.categoryFilter.matchCounter,this.categoryFilter);a.sort(tracing.trace_model.Counter.compare);a.forEach(function(a){var b=
+this.appendThreadTracks_(),this.didAppendTracks_())},willAppendTracks_:function(){},didAppendTracks_:function(){},appendObjectInstanceTracks_:function(){var a=this.processBase_.objects.getAllInstancesByTypeName(),e=base.dictionaryKeys(a);e.sort();var h=!1;e.forEach(function(c){var e=a[c],g=b.getViewInfo(c),n=d.getViewInfo(c);g&&!g.options.showInTrackView&&(g=void 0);n&&!n.options.showInTrackView&&(n=void 0);for(var n=g||n,g=[],p=0;p<e.length;p++){var q=e[p];0!==q.snapshots.length&&(q.hasImplicitSnapshots&&
+!n||g.push(q))}0!==g.length&&(c=tracing.tracks.ObjectInstanceTrack.getTrackConstructor(c),c||(c=tracing.tracks.ObjectInstanceTrack),c=new c(this.viewport),c.categoryFilter=this.categoryFilter_,c.objectInstances=g,this.appendChild(c),h=!0)},this);h&&this.appendChild(new c(this.viewport))},appendCounterTracks_:function(){var a=base.dictionaryValues(this.processBase.counters).filter(this.categoryFilter.matchCounter,this.categoryFilter);a.sort(tracing.trace_model.Counter.compare);a.forEach(function(a){var b=
new tracing.tracks.CounterTrack(this.viewport);b.categoryFilter=this.categoryFilter_;b.counter=a;this.appendChild(b);this.appendChild(new c(this.viewport))}.bind(this))},appendThreadTracks_:function(){var a=base.dictionaryValues(this.processBase.threads).filter(function(a){return this.categoryFilter_.matchThread(a)},this);a.sort(tracing.trace_model.Thread.compare);a.forEach(function(a){var b=new tracing.tracks.ThreadTrack(this.viewport);b.categoryFilter=this.categoryFilter_;b.thread=a;b.hasVisibleContent&&
(this.appendChild(b),this.appendChild(new c(this.viewport)))}.bind(this))}};return{ProcessTrackBase:e}});"use strict";base.require("tracing.tracks.process_track_base");base.require("tracing.tracks.cpu_track");base.require("tracing.tracks.spacing_track");
-base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=tracing.tracks.SpacingTrack,a=ui.define("kernel-track",d);a.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},set kernel(a){this.processBase=a},get kernel(){return this.processBase},willAppendTracks_:function(){var a=this.categoryFilter,d=base.dictionaryValues(this.kernel.cpus);d.sort(tracing.trace_model.Cpu.compare);for(var g=!1,f=0;f<d.length;++f){var h=
-d[f];if(!a.matchCpu(h))return;var k=new tracing.tracks.CpuTrack(this.viewport);k.categoryFilter=a;k.cpu=h;k.hasVisibleContent&&(this.appendChild(k),g=!0)}g&&this.appendChild(new b(this.viewport))}};return{KernelTrack:a}});"use strict";base.require("tracing.tracks.process_track_base");
-base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=ui.define("process-track",d);b.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},set process(a){this.processBase=a},get process(){return this.processBase}};return{ProcessTrack:b}});"use strict";base.requireStylesheet("tracing.tracks.trace_model_track");base.require("base.measuring_stick");base.require("tracing.tracks.container_track");base.require("tracing.tracks.kernel_track");
-base.require("tracing.tracks.process_track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=tracing.tracks.SpacingTrack,a=ui.define("kernel-track",d);a.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},set kernel(a){this.processBase=a},get kernel(){return this.processBase},willAppendTracks_:function(){var a=this.categoryFilter,d=base.dictionaryValues(this.kernel.cpus);d.sort(tracing.trace_model.Cpu.compare);for(var f=!1,g=0;g<d.length;++g){var h=
+d[g];if(!a.matchCpu(h))return;var k=new tracing.tracks.CpuTrack(this.viewport);k.categoryFilter=a;k.cpu=h;k.hasVisibleContent&&(this.appendChild(k),f=!0)}f&&this.appendChild(new b(this.viewport))}};return{KernelTrack:a}});"use strict";base.require("tracing.tracks.process_track_base");
+base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=ui.define("process-track",d);b.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},drawTrack:function(a){switch(a){case tracing.tracks.DrawType.INSTANT_EVENT:if(!this.processBase.instantEvents||0===this.processBase.instantEvents.length)break;var b=this.context();if(void 0===b)break;b.save();var d=this.setupCanvasForDraw_();this.drawInstantEvents_(this.processBase.instantEvents,
+d.left,d.right);b.restore()}tracing.tracks.ContainerTrack.prototype.drawTrack.call(this,a)},set process(a){this.processBase=a},get process(){return this.processBase},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,f){base.iterateOverIntersectingIntervals(this.processBase.instantEvents,function(a){return a.start},function(a){return a.duration},a,b,function(a){a=f.addSlice(this,a);this.decorateHit(a)}.bind(this));tracing.tracks.ContainerTrack.prototype.addIntersectingItemsInRangeToSelectionInWorldSpace.apply(this,
+arguments)}};return{ProcessTrack:b}});"use strict";base.requireStylesheet("tracing.tracks.trace_model_track");base.require("base.measuring_stick");base.require("tracing.tracks.container_track");base.require("tracing.tracks.kernel_track");base.require("tracing.tracks.process_track");base.require("ui");
base.exportTo("tracing.tracks",function(){var d=ui.define("trace-model-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("model-track")},detach:function(){tracing.tracks.ContainerTrack.prototype.detach.call(this)},get model(){return this.model_},set model(b){this.model_=b;this.updateContents_()},get hasVisibleContent(){return 0<this.children.length},
-applyCategoryFilter_:function(){this.updateContents_()},updateContents_:function(){this.textContent="";if(this.model_&&this.categoryFilter){var b=this.categoryFilter;this.appendKernelTrack_();var a=this.model_.getAllProcesses();a.sort(tracing.trace_model.Process.compare);for(var c=0;c<a.length;++c){var d=a[c];if(!b.matchProcess(d))break;var g=new tracing.tracks.ProcessTrack(this.viewport);g.categoryFilter=b;g.process=d;g.hasVisibleContent&&this.appendChild(g)}}},appendKernelTrack_:function(){if(this.categoryFilter.matchProcess(this.model.kernel)){var b=
-new tracing.tracks.KernelTrack(this.viewport);b.categoryFilter=this.categoryFilter;b.kernel=this.model.kernel;b.hasVisibleContent&&this.appendChild(b)}}};return{TraceModelTrack:d}});"use strict";base.requireStylesheet("tracing.timeline_track_view");base.require("base.events");base.require("base.settings");base.require("tracing.filter");base.require("tracing.selection");base.require("tracing.timeline_viewport");base.require("tracing.tracks.drawing_container");base.require("tracing.tracks.trace_model_track");
-base.require("tracing.tracks.ruler_track");base.require("ui");
+applyCategoryFilter_:function(){this.updateContents_()},updateContents_:function(){this.textContent="";if(this.model_&&this.categoryFilter){var b=this.categoryFilter;this.appendKernelTrack_();var a=this.model_.getAllProcesses();a.sort(tracing.trace_model.Process.compare);for(var c=0;c<a.length;++c){var d=a[c];if(!b.matchProcess(d))break;var f=new tracing.tracks.ProcessTrack(this.viewport);f.categoryFilter=b;f.process=d;f.hasVisibleContent&&this.appendChild(f)}}},appendKernelTrack_:function(){if(this.categoryFilter.matchProcess(this.model.kernel)){var b=
+new tracing.tracks.KernelTrack(this.viewport);b.categoryFilter=this.categoryFilter;b.kernel=this.model.kernel;b.hasVisibleContent&&this.appendChild(b)}},drawTrack:function(b){switch(b){case tracing.tracks.DrawType.INSTANT_EVENT:if(!this.model_.instantEvents||0===this.model_.instantEvents.length)break;var a=this.context();if(void 0===a)break;a.save();var c=this.setupCanvasForDraw_();this.drawInstantEvents_(this.model_.instantEvents,c.left,c.right);a.restore()}tracing.tracks.ContainerTrack.prototype.drawTrack.call(this,
+b)},addIntersectingItemsInRangeToSelectionInWorldSpace:function(b,a,c,d){base.iterateOverIntersectingIntervals(this.model_.instantEvents,function(a){return a.start},function(a){return a.duration},b,a,function(a){a=d.addSlice(this,a);this.decorateHit(a)}.bind(this));tracing.tracks.ContainerTrack.prototype.addIntersectingItemsInRangeToSelectionInWorldSpace.apply(this,arguments)}};return{TraceModelTrack:d}});"use strict";base.requireStylesheet("ui.tool_button");base.requireStylesheet("ui.mouse_mode_selector");
+base.requireTemplate("ui.mouse_mode_selector");base.require("base.events");base.require("tracing.mouse_mode_constants");base.require("ui");
+base.exportTo("ui",function(){var d=ui.define("div");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(b){this.classList.add("mouse-mode-selector");this.parentEl_=b;b=base.instantiateTemplate("#mouse-mode-selector-template");this.appendChild(b);this.buttonsEl_=this.querySelector(".buttons");this.dragHandleEl_=this.querySelector(".drag-handle");this.panScanModeButton_=this.buttonsEl_.querySelector(".pan-scan-mode-button");this.selectionModeButton_=this.buttonsEl_.querySelector(".selection-mode-button");
+this.zoomModeButton_=this.buttonsEl_.querySelector(".zoom-mode-button");this.pos_={x:base.Settings.get("mouse_mode_selector.x",window.innerWidth-50),y:base.Settings.get("mouse_mode_selector.y",100)};this.constrainPositionToWindowBounds_();this.updateStylesFromPosition_();this.isDraggingModeSelectorDragHandle_=!1;this.initialRelativeMouseDownPos_={x:0,y:0};this.dragHandleEl_.addEventListener("mousedown",this.onDragHandleMouseDown_.bind(this));document.addEventListener("mousemove",this.onDragHandleMouseMove_.bind(this));
+document.addEventListener("mouseup",this.onDragHandleMouseUp_.bind(this));window.addEventListener("resize",this.onWindowResize_.bind(this));this.buttonsEl_.addEventListener("mouseup",this.onButtonMouseUp_);this.buttonsEl_.addEventListener("mousedown",this.onButtonMouseDown_);this.buttonsEl_.addEventListener("click",this.onButtonPress_.bind(this));document.addEventListener("mousemove",this.onMouseMove_.bind(this));document.addEventListener("mouseup",this.onMouseUp_.bind(this));this.parentEl_.addEventListener("mousedown",
+this.onMouseDown_.bind(this));document.addEventListener("keypress",this.onKeyPress_.bind(this));document.addEventListener("keydown",this.onKeyDown_.bind(this));document.addEventListener("keyup",this.onKeyUp_.bind(this));this.mode=base.Settings.get("mouse_mode_selector.mouseMode",tracing.mouseModeConstants.MOUSE_MODE_PANSCAN);this.isInteracting_=this.isInTemporaryAlternativeMouseMode_=!1},get mode(){return this.currentMode_},set mode(b){if(this.currentMode_!==b){var a=tracing.mouseModeConstants;this.currentMode_=
+b;this.panScanModeButton_.classList.remove("active");this.selectionModeButton_.classList.remove("active");this.zoomModeButton_.classList.remove("active");switch(b){case a.MOUSE_MODE_PANSCAN:this.panScanModeButton_.classList.add("active");break;case a.MOUSE_MODE_SELECTION:this.selectionModeButton_.classList.add("active");break;case a.MOUSE_MODE_ZOOM:this.zoomModeButton_.classList.add("active");break;default:throw Error("Unknown selection mode: "+b);}base.Settings.set("mouse_mode_selector.mouseMode",
+b)}},getCurrentModeEventNames_:function(){var b=tracing.mouseModeConstants,a={begin:"",update:"",end:""};switch(this.mode){case b.MOUSE_MODE_PANSCAN:a.begin="beginpan";a.update="updatepan";a.end="endpan";break;case b.MOUSE_MODE_SELECTION:a.begin="beginselection";a.update="updateselection";a.end="endselection";break;case b.MOUSE_MODE_ZOOM:a.begin="beginzoom";a.update="updatezoom";a.end="endzoom";break;default:throw Error("Unsupported interaction mode");}return a},onMouseDown_:function(b){var a=this.getCurrentModeEventNames_(),
+a=new base.Event(a.begin,!0,!0);a.data=b;this.dispatchEvent(a);this.isInteracting_=!0},onMouseMove_:function(b){var a=this.getCurrentModeEventNames_(),a=new base.Event(a.update,!0,!0);a.data=b;this.dispatchEvent(a)},onMouseUp_:function(b){var a=this.getCurrentModeEventNames_(),a=new base.Event(a.end,!0,!0),c=!b.shiftKey,d=base.isMac&&!b.metaKey||!base.isMac&&!b.ctrlKey;a.data=b;this.dispatchEvent(a);this.isInteracting_=!1;this.isInTemporaryAlternativeMouseMode_&&(c&&d)&&(this.mode=tracing.mouseModeConstants.MOUSE_MODE_PANSCAN)},
+onButtonMouseDown_:function(b){b.preventDefault();b.stopImmediatePropagation()},onButtonMouseUp_:function(b){b.preventDefault();b.stopImmediatePropagation()},onButtonPress_:function(b){var a=tracing.mouseModeConstants;switch(b.target){case this.panScanModeButton_:this.mode=a.MOUSE_MODE_PANSCAN;break;case this.selectionModeButton_:this.mode=a.MOUSE_MODE_SELECTION;break;case this.zoomModeButton_:this.mode=a.MOUSE_MODE_ZOOM;break;default:throw Error("Unknown mouse mode button pressed");}b.preventDefault();
+this.isInTemporaryAlternativeMouseMode_=!1},onKeyPress_:function(b){if(!this.isInteracting_){var a=tracing.mouseModeConstants;switch(b.keyCode){case 49:this.mode=a.MOUSE_MODE_PANSCAN;break;case 50:this.mode=a.MOUSE_MODE_SELECTION;break;case 51:this.mode=a.MOUSE_MODE_ZOOM}}},onKeyDown_:function(b){if(!this.isInteracting_){var a=tracing.mouseModeConstants,c=base.isMac&&b.metaKey||!base.isMac&&b.ctrlKey,d=b.shiftKey;this.mode===a.MOUSE_MODE_PANSCAN&&(c||d)&&(this.mode=c?a.MOUSE_MODE_ZOOM:a.MOUSE_MODE_SELECTION,
+this.isInTemporaryAlternativeMouseMode_=!0,b.preventDefault())}},onKeyUp_:function(b){if(!this.isInteracting_){var a=tracing.mouseModeConstants,c=base.isMac&&!b.metaKey||!base.isMac&&!b.ctrlKey;b=b.shiftKey;this.isInTemporaryAlternativeMouseMode_&&(c||b)&&(this.mode=a.MOUSE_MODE_PANSCAN);this.isInTemporaryAlternativeMouseMode_=!1}},constrainPositionToWindowBounds_:function(){var b=window.innerHeight-this.offsetHeight,a=window.innerWidth-this.offsetWidth;this.pos_.x=Math.max(this.pos_.x,0);this.pos_.x=
+Math.min(this.pos_.x,a);this.pos_.y=Math.max(this.pos_.y,0);this.pos_.y=Math.min(this.pos_.y,b)},updateStylesFromPosition_:function(){this.style.left=this.pos_.x+"px";this.style.top=this.pos_.y+"px";base.Settings.set("mouse_mode_selector.x",this.pos_.x);base.Settings.set("mouse_mode_selector.y",this.pos_.y)},onDragHandleMouseDown_:function(b){b.preventDefault();b.stopImmediatePropagation();this.isDraggingModeSelectorDragHandle_=!0;this.initialRelativeMouseDownPos_.x=b.clientX-this.offsetLeft;this.initialRelativeMouseDownPos_.y=
+b.clientY-this.offsetTop},onDragHandleMouseMove_:function(b){this.isDraggingModeSelectorDragHandle_&&(this.pos_.x=b.clientX-this.initialRelativeMouseDownPos_.x,this.pos_.y=b.clientY-this.initialRelativeMouseDownPos_.y,this.constrainPositionToWindowBounds_(),this.updateStylesFromPosition_())},onDragHandleMouseUp_:function(b){this.isDraggingModeSelectorDragHandle_=!1},onWindowResize_:function(b){this.constrainPositionToWindowBounds_();this.updateStylesFromPosition_()}};return{MouseModeSelector:d}});
+"use strict";base.requireStylesheet("tracing.timeline_track_view");base.require("base.events");base.require("base.properties");base.require("base.settings");base.require("tracing.filter");base.require("tracing.selection");base.require("tracing.timeline_viewport");base.require("tracing.mouse_mode_constants");base.require("tracing.tracks.drawing_container");base.require("tracing.tracks.trace_model_track");base.require("tracing.tracks.ruler_track");base.require("ui");base.require("ui.mouse_mode_selector");
base.exportTo("tracing",function(){var d=tracing.Selection,b=tracing.TimelineViewport,a=ui.define("div");a.prototype={__proto__:HTMLDivElement.prototype,model_:null,decorate:function(){this.classList.add("timeline-track-view");this.categoryFilter_=new tracing.CategoryFilter;this.viewport_=new b(this);this.viewportStateAtMouseDown_=null;this.rulerTrackContainer_=new tracing.tracks.DrawingContainer(this.viewport_);this.appendChild(this.rulerTrackContainer_);this.rulerTrackContainer_.invalidate();this.rulerTrack_=
-new tracing.tracks.RulerTrack(this.viewport_);this.rulerTrackContainer_.appendChild(this.rulerTrack_);this.modelTrackContainer_=new tracing.tracks.DrawingContainer(this.viewport_);this.appendChild(this.modelTrackContainer_);this.modelTrackContainer_.style.display="block";this.modelTrackContainer_.invalidate();this.viewport_.modelTrackContainer=this.modelTrackContainer_;this.modelTrack_=new tracing.tracks.TraceModelTrack(this.viewport_);this.modelTrackContainer_.appendChild(this.modelTrack_);this.modeIndicator_=
-this.ownerDocument.createElement("div");this.modeIndicator_.className="mode-indicator";this.modeIndicator_.addEventListener("click",this.toggleMouseMode_.bind(this));this.appendChild(this.modeIndicator_);this.dragBox_=this.ownerDocument.createElement("div");this.dragBox_.className="drag-box";this.appendChild(this.dragBox_);this.hideDragBox_();this.bindEventListener_(document,"mousemove",this.onMouseMove_,this);this.bindEventListener_(document,"mouseup",this.onMouseUp_,this);this.bindEventListener_(document,
-"keypress",this.onKeypress_,this);this.bindEventListener_(document,"keydown",this.onKeydown_,this);this.bindEventListener_(document,"keyup",this.onKeyup_,this);this.addEventListener("mousewheel",this.onMouseWheel_);this.addEventListener("mousedown",this.onMouseDown_);this.addEventListener("dblclick",this.onDblClick_);this.mouseViewPosAtMouseDown={x:0,y:0};this.lastMouseViewPos_={x:0,y:0};this.selection_=new d;this.isInTemporaryAlternativeMouseMode_=this.isPanningAndScanning_=!1;this.currentMouseMode_=
-0;this.mouseMode=base.Settings.get("timeline_track_view.mouseMode",1)},mouseModeHandlers_:{selection:{down:function(a){var b=this.modelTrackContainer_.canvas,d=this.modelTrack_.getBoundingClientRect(),f=b.getBoundingClientRect();d&&(a.clientX>=d.left&&a.clientX<d.right&&a.clientY>=d.top&&a.clientY<d.bottom&&a.clientX>=f.left&&a.clientX<f.right)&&(this.viewport_.xViewToWorld(a.clientX-b.offsetLeft),this.dragBeginEvent_=a,a.preventDefault())},move:function(a){this.dragBeginEvent_&&(this.dragBoxXStart_=
-this.dragBeginEvent_.clientX,this.dragBoxXEnd_=a.clientX,this.dragBoxYStart_=this.dragBeginEvent_.clientY,this.dragBoxYEnd_=a.clientY,this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_,a.shiftKey))},up:function(a){if(this.dragBeginEvent_){this.hideDragBox_();var b=this.dragBeginEvent_||a;this.dragBeginEvent_=null;var g=Math.min(b.clientY,a.clientY),f=Math.max(b.clientY,a.clientY),h=Math.min(b.clientX,a.clientX),b=Math.max(b.clientX,a.clientX);this.modelTrackContainer_.getBoundingClientRect();
-var k=this.modelTrackContainer_.canvas,h=h-k.offsetLeft,b=b-k.offsetLeft,k=new d;this.modelTrack_.addIntersectingItemsInRangeToSelection(h,b,g,f,k);this.selection=k;(base.isMac&&a.metaKey||!base.isMac&&a.ctrlKey)&&this.zoomToSelection_()}},dblclick:function(a){this.rulerTrack_.placeAndBeginDraggingMarker(a.clientX);a.preventDefault()},wheel:function(a){}},panscan:{down:function(a){this.beginPanScan_(a)},move:function(a){this.updatePanScan_(a)},up:function(a){this.endPanScan_(a)},dblclick:function(a){},
-wheel:function(a){}}},bindEventListener_:function(a,b,d,f){this.boundListeners_||(this.boundListeners_=[]);d=d.bind(f);this.boundListeners_.push({object:a,event:b,boundFunc:d});a.addEventListener(b,d)},detach:function(){this.modelTrack_.detach();for(var a=0;a<this.boundListeners_.length;a++){var b=this.boundListeners_[a];b.object.removeEventListener(b.event,b.boundFunc)}this.boundListeners_=void 0;this.viewport_.detach()},get mouseMode(){return this.currentMouseMode_},set mouseMode(a){this.currentMouseMode_=
-a;this.updateModeIndicator_();base.Settings.set("timeline_track_view.mouseMode",a)},get currentMouseModeHandler_(){switch(this.mouseMode){case 1:return this.mouseModeHandlers_.selection;case 2:return this.mouseModeHandlers_.panscan}},get viewport(){return this.viewport_},get categoryFilter(){return this.categoryFilter_},set categoryFilter(a){this.modelTrackContainer_.invalidate();this.categoryFilter_=a;this.modelTrack_.categoryFilter=a},get model(){return this.model_},set model(a){if(!a)throw Error("Model cannot be null");
-var b=this.model_!=a;this.model_=a;this.modelTrack_.model=a;this.modelTrack_.categoryFilter=this.categoryFilter;b&&this.viewport_.setWhenPossible(this.setInitialViewport_.bind(this));base.setPropertyAndDispatchChange(this,"model",a)},get hasVisibleContent(){return this.modelTrack_.hasVisibleContent},setInitialViewport_:function(){var a=this.modelTrackContainer_.canvas.width,b,d;this.model_.bounds.isEmpty?(b=0,d=1E3):0==this.model_.bounds.range?(b=this.model_.bounds.min,d=1E3):(b=this.model_.bounds.min,
-d=this.model_.bounds.range);var f=0.15*d;this.viewport_.xSetWorldBounds(b-f,b+d+f,a)},addAllObjectsMatchingFilterToSelection:function(a,b){this.modelTrack_.addAllObjectsMatchingFilterToSelection(a,b)},get focusElement(){return this.focusElement_?this.focusElement_:this.parentElement},set focusElement(a){this.focusElement_=a},get listenToKeys_(){return!this.viewport_.isAttachedToDocument_||this.activeElement instanceof tracing.FindControl?!1:this.focusElement_?0<=this.focusElement.tabIndex?document.activeElement==
-this.focusElement?!0:ui.elementIsChildOf(document.activeElement,this.focusElement):!0:!0},onKeypress_:function(a){var b=this.viewport_;if(this.listenToKeys_&&"INPUT"!=document.activeElement.nodeName){var d=this.modelTrackContainer_.canvas.clientWidth;switch(a.keyCode){case 32:this.toggleMouseMode_();break;case 119:case 44:this.zoomBy_(1.5);break;case 115:case 111:this.zoomBy_(1/1.5);break;case 103:this.onGridToggle_(!0);break;case 71:this.onGridToggle_(!1);break;case 87:case 60:this.zoomBy_(10);break;
-case 83:case 79:this.zoomBy_(0.1);break;case 97:b.panX+=b.xViewVectorToWorld(0.1*d);break;case 100:case 101:b.panX-=b.xViewVectorToWorld(0.1*d);break;case 65:b.panX+=b.xViewVectorToWorld(0.5*d);break;case 68:b.panX-=b.xViewVectorToWorld(0.5*d);break;case 48:case 122:this.setInitialViewport_();break;case 102:this.zoomToSelection()}}},onMouseWheel_:function(a){this.currentMouseModeHandler_.wheel.call(this,a)},onKeydown_:function(a){if(this.listenToKeys_){var b,d=this.viewport_,f=this.modelTrackContainer_.canvas.clientWidth;
-switch(a.keyCode){case 16:if(this.isPanningAndScanning_||this.dragBeginEvent_)break;this.toggleMouseMode_();this.isInTemporaryAlternativeMouseMode_=!0;a.preventDefault();break;case 37:(b=this.selection.getShiftedSelection(-1))?(this.selection=b,this.panToSelection(),a.preventDefault()):d.panX+=d.xViewVectorToWorld(0.1*f);break;case 39:(b=this.selection.getShiftedSelection(1))?(this.selection=b,this.panToSelection(),a.preventDefault()):d.panX-=d.xViewVectorToWorld(0.1*f);break;case 9:-1==this.focusElement.tabIndex&&
-(a.shiftKey?this.selectPrevious_(a):this.selectNext_(a),a.preventDefault())}}},onKeyup_:function(a){this.listenToKeys_&&(a.shiftKey||this.dragBeginEvent_&&this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_),this.isPanningAndScanning_||this.dragBeginEvent_||(!this.isInTemporaryAlternativeMouseMode_||16!==a.keyCode)||(this.toggleMouseMode_(),this.isInTemporaryAlternativeMouseMode_=!1,a.preventDefault()))},zoomBy_:function(a){var b=this.viewport_,d=this.modelTrackContainer_.canvas.clientWidth,
-f=this.lastMouseViewPos_.x*(window.devicePixelRatio||1),h=b.xViewToWorld(f);b.scaleX*=a;b.xPanWorldPosToViewPos(h,f,d)},zoomToSelection:function(){if(this.selection&&this.selection.length){var a=this.selection.bounds;if(a.range){var b=a.center,a=0.5*a.range,d=0.5*a;this.viewport_.xSetWorldBounds(b-a-d,b+a+d,this.modelTrackContainer_.canvas.width)}}},panToSelection:function(){if(this.selection&&this.selection.length){var a=this.selection.bounds,b=a.center,d=this.modelTrackContainer_.canvas.width;if(a.range){var f=
-0.5*a.range,h=0.5*f;this.viewport_.xPanWorldBoundsIntoView(b-f-h,b+f+h,d);this.viewport_.xPanWorldBoundsIntoView(a.min,a.max,d)}else(0>this.viewport_.xWorldToView(a.center)||this.viewport_.xWorldToView(a.center)>d)&&this.viewport_.xPanWorldPosToViewPos(b,"center",d)}},toggleMouseMode_:function(){this.mouseMode=1===this.mouseMode?2:1},get keyHelp(){var a="Qwerty Controls\n w/s : Zoom in/out (with shift: go faster)\n a/d : Pan left/right\n\nDvorak Controls\n ,/o : Zoom in/out (with shift: go faster)\n a/e : Pan left/right\n\nMouse Controls\n drag (Selection mode) : Select slices (with "+
-(0==navigator.platform.indexOf("Mac")?"cmd":"ctrl")+": zoom to slices)\n drag (Pan mode) : Pan left/right/up/down)\n\n",a=this.focusElement.tabIndex?a+" <- : Select previous event on current timeline\n -> : Select next event on current timeline\n":a+"General Navigation\n g/General : Shows grid at the start/end of the selected task\n <-,^TAB : Select previous event on current timeline\n ->, TAB : Select next event on current timeline\n";
-return a+"\nSpace to switch between select / pan modes\nShift to temporarily switch between select / pan modes\nScroll to zoom in/out (in pan mode)\nDbl-click to add timing markers\nf to zoom into selection\nz to reset zoom and pan to initial view\n/ to search\n"},get selection(){return this.selection_},set selection(a){if(!(a instanceof d))throw Error("Expected Selection");var b;for(b=0;b<this.selection_.length;b++)this.selection_[b].selected=!1;this.selection_.clear();this.selection_.addSelection(a);
-base.dispatchSimpleEvent(this,"selectionChange");for(b=0;b<this.selection_.length;b++)this.selection_[b].selected=!0;this.selection_.length&&this.selection_[0].track&&this.selection_[0].track.scrollIntoViewIfNeeded();this.viewport_.dispatchChangeEvent()},updateModeIndicator_:function(){switch(this.currentMouseMode_){case 1:this.classList.remove("mode-panscan");this.classList.add("mode-selection");this.modeIndicator_.setAttribute("title","Selection mode: use the mouse to select events.");break;case 2:this.classList.remove("mode-selection"),
-this.classList.add("mode-panscan"),this.modeIndicator_.setAttribute("title","Pan mode: use the mouse to pan around and scroll to zoom.")}},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,b,d,f){var h=Math.min(b,f);f=Math.max(b,f);b=Math.min(a,d);a=Math.max(a,d);this.modelTrack_.getBoundingClientRect();d=b+(a-b);f=h+(f-h);var k=this.modelTrackContainer_.getBoundingClientRect(),
-l=k.left,m=k.top,n=k.right,k=k.bottom,p=window.getComputedStyle(this.querySelector("heading")).width,p=parseInt(p),l=l+p;p={};b>n||d<l||h>k||f<m?h=!1:(p.left=Math.max(l,b),p.top=Math.max(m,h),p.right=Math.min(n,d),p.bottom=Math.min(k,f),p.width=p.right-p.left,p.height=p.bottom-p.top,h=p);this.dragBox_.style.left=h.left+"px";this.dragBox_.style.width=h.width+"px";this.dragBox_.style.top=h.top+"px";this.dragBox_.style.height=h.height+"px";h=window.devicePixelRatio||1;d=this.modelTrackContainer_.canvas;
-b=this.viewport_.xViewToWorld((b-d.offsetLeft)*h);h=this.viewport_.xViewToWorld((a-d.offsetLeft)*h);a=Math.round(100*(h-b))/100;this.dragBox_.textContent=a+"ms";a=new base.Event("selectionChanging");a.loWX=b;a.hiWX=h;this.dispatchEvent(a)},onGridToggle_:function(a){var b=a?this.selection_.bounds.min:this.selection_.bounds.max;if(this.viewport_.gridEnabled&&this.viewport_.gridSide===a&&this.viewport_.gridTimebase===b)this.viewport_.gridside=void 0,this.viewport_.gridEnabled=!1,this.viewport_.gridTimebase=
-void 0;else{var d=Math.ceil((b-this.model_.bounds.min)/this.viewport_.gridStep_);this.viewport_.gridTimebase=b-(d+1)*this.viewport_.gridStep_;this.viewport_.gridEnabled=!0;this.viewport_.gridSide=a;this.viewport_.gridTimebase=b}},onMouseDown_:function(a){0!=a.button||ui.elementIsChildOf(a.target,this.rulerTrack_)||(this.lastMouseViewPos_=this.extractRelativeMousePosition(a),this.mouseViewPosAtMouseDown.x=this.lastMouseViewPos_.x,this.mouseViewPosAtMouseDown.y=this.lastMouseViewPos_.y,this.currentMouseModeHandler_.down.call(this,
-a),a.preventDefault(),document.activeElement&&document.activeElement.blur(),0<=this.focusElement.tabIndex&&this.focusElement.focus())},onMouseMove_:function(a){this.lastMouseViewPos_=this.extractRelativeMousePosition(a);this.currentMouseModeHandler_.move.call(this,a)},onMouseUp_:function(a){this.lastMouseViewPos_=this.extractRelativeMousePosition(a);this.currentMouseModeHandler_.up.call(this,a)},onDblClick_:function(a){this.currentMouseModeHandler_.dblclick.call(this,a)},extractRelativeMousePosition:function(a){var b=
-this.modelTrackContainer_.canvas;return{x:a.clientX-b.offsetLeft,y:a.clientY-b.offsetTop}},beginPanScan_:function(a){this.viewportStateAtMouseDown_=this.viewport_.getStateInViewCoordinates();this.isPanningAndScanning_=!0},updatePanScan_:function(a){this.isPanningAndScanning_&&(this.viewport_.setStateInViewCoordinates({panX:this.viewportStateAtMouseDown_.panX+(this.lastMouseViewPos_.x-this.mouseViewPosAtMouseDown.x),panY:this.viewportStateAtMouseDown_.panY-(this.lastMouseViewPos_.y-this.mouseViewPosAtMouseDown.y)}),
-a.preventDefault(),a.stopPropagation())},endPanScan_:function(a){this.isPanningAndScanning_=!1;this.isInTemporaryAlternativeMouseMode_&&!a.shiftKey&&this.toggleMouseMode_()}};return{TimelineTrackView:a}});"use strict";base.require("tracing.timeline_track_view");base.require("tracing.filter");base.require("ui.overlay");
+new tracing.tracks.RulerTrack(this.viewport_);this.rulerTrackContainer_.appendChild(this.rulerTrack_);this.modelTrackContainer_=new tracing.tracks.DrawingContainer(this.viewport_);this.appendChild(this.modelTrackContainer_);this.modelTrackContainer_.style.display="block";this.modelTrackContainer_.invalidate();this.viewport_.modelTrackContainer=this.modelTrackContainer_;this.modelTrack_=new tracing.tracks.TraceModelTrack(this.viewport_);this.modelTrackContainer_.appendChild(this.modelTrack_);this.mouseModeSelector_=
+new ui.MouseModeSelector(this);this.appendChild(this.mouseModeSelector_);this.dragBox_=this.ownerDocument.createElement("div");this.dragBox_.className="drag-box";this.appendChild(this.dragBox_);this.hideDragBox_();this.bindEventListener_(document,"keypress",this.onKeypress_,this);this.bindEventListener_(document,"beginpan",this.onBeginPanScan_,this);this.bindEventListener_(document,"updatepan",this.onUpdatePanScan_,this);this.bindEventListener_(document,"endpan",this.onEndPanScan_,this);this.bindEventListener_(document,
+"beginselection",this.onBeginSelection_,this);this.bindEventListener_(document,"updateselection",this.onUpdateSelection_,this);this.bindEventListener_(document,"endselection",this.onEndSelection_,this);this.bindEventListener_(document,"beginzoom",this.onBeginZoom_,this);this.bindEventListener_(document,"updatezoom",this.onUpdateZoom_,this);this.bindEventListener_(document,"endzoom",this.onEndZoom_,this);this.bindEventListener_(document,"keydown",this.onKeydown_,this);this.bindEventListener_(document,
+"keyup",this.onKeyup_,this);this.addEventListener("mousemove",this.onMouseMove_);this.addEventListener("dblclick",this.onDblClick_);this.mouseViewPosAtMouseDown_={x:0,y:0};this.lastMouseViewPos_={x:0,y:0};this.selection_=new d;this.isZooming_=this.isPanningAndScanning_=!1},distanceCoveredInPanScan_:function(a){a=this.lastMouseViewPos_.x-this.mouseViewPosAtMouseDown_.x;var b=this.lastMouseViewPos_.y-this.mouseViewPosAtMouseDown_.y;return Math.sqrt(a*a+b*b)},bindEventListener_:function(a,b,d,g){this.boundListeners_||
+(this.boundListeners_=[]);d=d.bind(g);this.boundListeners_.push({object:a,event:b,boundFunc:d});a.addEventListener(b,d)},detach:function(){this.modelTrack_.detach();for(var a=0;a<this.boundListeners_.length;a++){var b=this.boundListeners_[a];b.object.removeEventListener(b.event,b.boundFunc)}this.boundListeners_=void 0;this.viewport_.detach()},get viewport(){return this.viewport_},get categoryFilter(){return this.categoryFilter_},set categoryFilter(a){this.modelTrackContainer_.invalidate();this.categoryFilter_=
+a;this.modelTrack_.categoryFilter=a},get model(){return this.model_},set model(a){if(!a)throw Error("Model cannot be null");var b=this.model_!=a;this.model_=a;this.modelTrack_.model=a;this.modelTrack_.categoryFilter=this.categoryFilter;b&&this.viewport_.setWhenPossible(this.setInitialViewport_.bind(this));base.setPropertyAndDispatchChange(this,"model",a)},get hasVisibleContent(){return this.modelTrack_.hasVisibleContent},setInitialViewport_:function(){var a=this.modelTrackContainer_.canvas.width,
+b,d;this.model_.bounds.isEmpty?(b=0,d=1E3):0==this.model_.bounds.range?(b=this.model_.bounds.min,d=1E3):(b=this.model_.bounds.min,d=this.model_.bounds.range);var g=0.15*d;this.viewport_.xSetWorldBounds(b-g,b+d+g,a)},addAllObjectsMatchingFilterToSelection:function(a,b){this.modelTrack_.addAllObjectsMatchingFilterToSelection(a,b)},get focusElement(){return this.focusElement_?this.focusElement_:this.parentElement},set focusElement(a){this.focusElement_=a},get listenToKeys_(){return!this.viewport_.isAttachedToDocument_||
+this.activeElement instanceof tracing.FindControl?!1:this.focusElement_?0<=this.focusElement.tabIndex?document.activeElement==this.focusElement?!0:ui.elementIsChildOf(document.activeElement,this.focusElement):!0:!0},onMouseMove_:function(a){this.isZooming_||this.storeLastMousePos_(a)},onKeypress_:function(a){var b=this.viewport_;if(this.listenToKeys_&&"INPUT"!=document.activeElement.nodeName){var d=this.modelTrackContainer_.canvas.clientWidth;switch(a.keyCode){case 119:case 44:this.zoomBy_(1.5);break;
+case 115:case 111:this.zoomBy_(1/1.5);break;case 103:this.onGridToggle_(!0);break;case 71:this.onGridToggle_(!1);break;case 87:case 60:this.zoomBy_(10);break;case 83:case 79:this.zoomBy_(0.1);break;case 97:b.panX+=b.xViewVectorToWorld(0.1*d);break;case 100:case 101:b.panX-=b.xViewVectorToWorld(0.1*d);break;case 65:b.panX+=b.xViewVectorToWorld(0.5*d);break;case 68:b.panX-=b.xViewVectorToWorld(0.5*d);break;case 48:case 122:this.setInitialViewport_();break;case 102:this.zoomToSelection()}}},onKeydown_:function(a){if(this.listenToKeys_){var b,
+d=this.viewport_,g=this.modelTrackContainer_.canvas.clientWidth;switch(a.keyCode){case 37:(b=this.selection.getShiftedSelection(-1))?(this.selection=b,this.panToSelection(),a.preventDefault()):d.panX+=d.xViewVectorToWorld(0.1*g);break;case 39:(b=this.selection.getShiftedSelection(1))?(this.selection=b,this.panToSelection(),a.preventDefault()):d.panX-=d.xViewVectorToWorld(0.1*g);break;case 9:-1==this.focusElement.tabIndex&&(a.shiftKey?this.selectPrevious_(a):this.selectNext_(a),a.preventDefault())}}},
+onKeyup_:function(a){this.listenToKeys_&&(a.shiftKey||this.dragBeginEvent_&&this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_))},zoomBy_:function(a){var b=this.viewport_,d=this.modelTrackContainer_.canvas.clientWidth,g=this.lastMouseViewPos_.x*(window.devicePixelRatio||1),h=b.xViewToWorld(g);b.scaleX*=a;b.xPanWorldPosToViewPos(h,g,d)},zoomToSelection:function(){if(this.selection&&this.selection.length){var a=this.selection.bounds;if(a.range){var b=
+a.center,a=0.5*a.range,d=0.5*a;this.viewport_.xSetWorldBounds(b-a-d,b+a+d,this.modelTrackContainer_.canvas.width)}}},panToSelection:function(){if(this.selection&&this.selection.length){var a=this.selection.bounds,b=a.center,d=this.modelTrackContainer_.canvas.width;if(a.range){var g=0.5*a.range,h=0.5*g;this.viewport_.xPanWorldBoundsIntoView(b-g-h,b+g+h,d);this.viewport_.xPanWorldBoundsIntoView(a.min,a.max,d)}else(0>this.viewport_.xWorldToView(a.center)||this.viewport_.xWorldToView(a.center)>d)&&this.viewport_.xPanWorldPosToViewPos(b,
+"center",d)}},get keyHelp(){var a="Qwerty Controls\n w/s : Zoom in/out (with shift: go faster)\n a/d : Pan left/right\n\nDvorak Controls\n ,/o : Zoom in/out (with shift: go faster)\n a/e : Pan left/right\n\nMouse Controls\n drag (Selection mode) : Select slices (with "+(0==navigator.platform.indexOf("Mac")?"cmd":"ctrl")+": zoom to slices)\n drag (Pan mode) : Pan left/right/up/down)\n\n",a=this.focusElement.tabIndex?
+a+" <- : Select previous event on current timeline\n -> : Select next event on current timeline\n":a+"General Navigation\n g/General : Shows grid at the start/end of the selected task\n <-,^TAB : Select previous event on current timeline\n ->, TAB : Select next event on current timeline\n";return a+"\nSpace to switch between select / pan modes\nShift to temporarily switch between select / pan modes\nScroll to zoom in/out (in pan mode)\nDbl-click to add timing markers\nf to zoom into selection\nz to reset zoom and pan to initial view\n/ to search\n"},
+get selection(){return this.selection_},set selection(a){if(!(a instanceof d))throw Error("Expected Selection");var b;for(b=0;b<this.selection_.length;b++)this.selection_[b].selected=!1;this.selection_.clear();this.selection_.addSelection(a);base.dispatchSimpleEvent(this,"selectionChange");for(b=0;b<this.selection_.length;b++)this.selection_[b].selected=!0;this.selection_.length&&this.selection_[0].track&&this.selection_[0].track.scrollIntoViewIfNeeded();this.viewport_.dispatchChangeEvent()},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,b,d,g){var h=Math.min(b,g);g=Math.max(b,g);b=Math.min(a,d);a=Math.max(a,d);this.modelTrack_.getBoundingClientRect();d=b+(a-b);g=h+(g-h);var k=this.modelTrackContainer_.getBoundingClientRect(),l=k.left,m=k.top,n=k.right,k=k.bottom,p=window.getComputedStyle(this.querySelector("heading")).width,p=parseInt(p),l=l+p;p={};b>n||d<l||h>k||g<m?h=!1:(p.left=Math.max(l,b),p.top=
+Math.max(m,h),p.right=Math.min(n,d),p.bottom=Math.min(k,g),p.width=p.right-p.left,p.height=p.bottom-p.top,h=p);this.dragBox_.style.left=h.left+"px";this.dragBox_.style.width=h.width+"px";this.dragBox_.style.top=h.top+"px";this.dragBox_.style.height=h.height+"px";h=window.devicePixelRatio||1;d=this.modelTrackContainer_.canvas;b=this.viewport_.xViewToWorld((b-d.offsetLeft)*h);h=this.viewport_.xViewToWorld((a-d.offsetLeft)*h);a=Math.round(100*(h-b))/100;this.dragBox_.textContent=a+"ms";a=new base.Event("selectionChanging");
+a.loWX=b;a.hiWX=h;this.dispatchEvent(a)},onGridToggle_:function(a){var b=a?this.selection_.bounds.min:this.selection_.bounds.max;if(this.viewport_.gridEnabled&&this.viewport_.gridSide===a&&this.viewport_.gridTimebase===b)this.viewport_.gridside=void 0,this.viewport_.gridEnabled=!1,this.viewport_.gridTimebase=void 0;else{var d=Math.ceil((b-this.model_.bounds.min)/this.viewport_.gridStep_);this.viewport_.gridTimebase=b-(d+1)*this.viewport_.gridStep_;this.viewport_.gridEnabled=!0;this.viewport_.gridSide=
+a;this.viewport_.gridTimebase=b}},canBeginInteraction_:function(a){return 0!=a.button||ui.elementIsChildOf(a.target,this.rulerTrack_)?!1:!0},onDblClick_:function(a){if(this.isPanningAndScanning_){var b=new base.Event("endpan");b.data=a;this.onEndPanScan_(b)}this.isZooming_&&(b=new base.Event("endzoom"),b.data=a,this.onEndZoom_(b));this.rulerTrack_.placeAndBeginDraggingMarker(a.clientX);a.preventDefault()},storeLastMousePos_:function(a){this.lastMouseViewPos_=this.extractRelativeMousePosition_(a)},
+extractRelativeMousePosition_:function(a){var b=this.modelTrackContainer_.canvas;return{x:a.clientX-b.offsetLeft,y:a.clientY-b.offsetTop}},storeInitialMouseDownPos_:function(a){a=this.extractRelativeMousePosition_(a);this.mouseViewPosAtMouseDown_.x=a.x;this.mouseViewPosAtMouseDown_.y=a.y},focusElements_:function(){document.activeElement&&document.activeElement.blur();0<=this.focusElement.tabIndex&&this.focusElement.focus()},storeInitialInteractionPositionsAndFocus_:function(a){this.storeInitialMouseDownPos_(a);
+this.storeLastMousePos_(a);this.focusElements_()},onBeginPanScan_:function(a){var b=this.viewport_;a=a.data;this.canBeginInteraction_(a)&&(this.viewportStateAtMouseDown_=b.getStateInViewCoordinates(),this.isPanningAndScanning_=!0,this.storeInitialInteractionPositionsAndFocus_(a),a.preventDefault())},onUpdatePanScan_:function(a){this.isPanningAndScanning_&&(a=a.data,this.viewport_.setStateInViewCoordinates({panX:this.viewportStateAtMouseDown_.panX+(this.lastMouseViewPos_.x-this.mouseViewPosAtMouseDown_.x),
+panY:this.viewportStateAtMouseDown_.panY-(this.lastMouseViewPos_.y-this.mouseViewPosAtMouseDown_.y)}),a.preventDefault(),a.stopPropagation(),this.storeLastMousePos_(a))},onEndPanScan_:function(a){var b=a.data;this.isPanningAndScanning_=!1;this.storeLastMousePos_(b);4<this.distanceCoveredInPanScan_(b)||(this.dragBeginEvent_=b,this.onEndSelection_(a))},onBeginSelection_:function(a){a=a.data;if(this.canBeginInteraction_(a)){var b=this.modelTrackContainer_.canvas,d=this.modelTrack_.getBoundingClientRect(),
+b=b.getBoundingClientRect();d&&(a.clientX>=d.left&&a.clientX<d.right&&a.clientY>=d.top&&a.clientY<d.bottom&&a.clientX>=b.left&&a.clientX<b.right)&&(this.dragBeginEvent_=a,this.storeInitialInteractionPositionsAndFocus_(a),a.preventDefault())}},onUpdateSelection_:function(a){a=a.data;this.dragBeginEvent_&&(this.dragBoxXStart_=this.dragBeginEvent_.clientX,this.dragBoxXEnd_=a.clientX,this.dragBoxYStart_=this.dragBeginEvent_.clientY,this.dragBoxYEnd_=a.clientY,this.setDragBoxPosition_(this.dragBoxXStart_,
+this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_))},onEndSelection_:function(a){if(this.dragBeginEvent_){var b=a.data;this.hideDragBox_();var f=this.dragBeginEvent_||b;this.dragBeginEvent_=null;var g=Math.min(f.clientY,b.clientY),h=Math.max(f.clientY,b.clientY),k=Math.min(f.clientX,b.clientX),b=Math.max(f.clientX,b.clientX);this.modelTrackContainer_.getBoundingClientRect();f=this.modelTrackContainer_.canvas;k-=f.offsetLeft;b-=f.offsetLeft;f=new d;this.modelTrack_.addIntersectingItemsInRangeToSelection(k,
+b,g,h,f);this.selection=f;(base.isMac&&a.metaKey||!base.isMac&&a.ctrlKey)&&this.zoomToSelection_()}},onBeginZoom_:function(a){a=a.data;this.canBeginInteraction_(a)&&(this.isZooming_=!0,this.storeInitialInteractionPositionsAndFocus_(a),a.preventDefault())},onUpdateZoom_:function(a){if(this.isZooming_){a=a.data;var b=this.extractRelativeMousePosition_(a);this.zoomBy_(1+0.01*(this.lastMouseViewPos_.y-b.y));this.storeLastMousePos_(a)}},onEndZoom_:function(a){this.isZooming_=!1}};return{TimelineTrackView:a}});
+"use strict";base.require("tracing.timeline_track_view");base.require("tracing.filter");base.require("ui.overlay");
base.exportTo("tracing",function(){function d(){this.model_=this.timeline_=void 0;this.filterText_="";this.filterHits_=new tracing.Selection;this.filterHitsDirty_=!0;this.currentHitIndex_=-1}var b=ui.define("div");b.prototype={__proto__:ui.Overlay.prototype,decorate:function(){ui.Overlay.prototype.decorate.call(this);this.className="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="button find-previous";a.textContent="\u2190";a.addEventListener("click",this.findPrevious_.bind(this));var b=document.createElement("div");b.className="button find-next";b.textContent="\u2192";b.addEventListener("click",this.findNext_.bind(this));this.filterEl_=document.createElement("input");this.filterEl_.type="input";this.filterEl_.addEventListener("input",this.filterTextChanged_.bind(this));this.filterEl_.addEventListener("keydown",function(a){13==a.keyCode?a.shiftKey?this.findPrevious_():
this.findNext_():27==a.keyCode&&(this.filterEl_.blur(),this.updateHitCountEl_())}.bind(this));this.filterEl_.addEventListener("blur",function(a){this.updateHitCountEl_()}.bind(this));this.filterEl_.addEventListener("focus",function(a){this.controller.reset();this.filterTextChanged_();this.filterEl_.select()}.bind(this));this.filterEl_.addEventListener("mouseup",function(a){a.preventDefault()});this.appendChild(this.filterEl_);this.appendChild(a);this.appendChild(b);this.appendChild(this.hitCountEl_);
diff --git a/style.css b/style.css
index 09a19c2..eeddb89 100644
--- a/style.css
+++ b/style.css
@@ -1 +1 @@
-* WARNING:This file is generated by generate_standalone_timeline_view.py * * Do not edit directly. */.analysis-link{color:-webkit-link;cursor:pointer;text-decoration:underline}.analysis-link:hover{cursor:pointer}x-generic-object-view{display:block;font-family:monospace}.analysis-results{font-family:monospace;white-space:pre}.analysis-results *{-webkit-user-select:text!important;cursor:text}.analysis-table{border-collapse:collapse;border-width:0;margin-bottom:25px}.analysis-table>tr>td:first-child{padding-left:2px}.analysis-table>tr>td{padding:2px 4px 2px 4px}.analysis-table-header{text-align:left}.analysis-table-row{vertical-align:top}.analysis-table-row:nth-child(2n+0){background-color:#e2e2e2}.selection-changing-link{color:-webkit-link;cursor:pointer;text-decoration:underline}.analysis-slices-table-col-1,.analysis-slices-table-col-2{text-align:right}.default-object-snapshot-view #args{white-space:pre}.default-object-instance-view #snapshots>*{display:block}.default-object-view{overflow:auto}.default-object-view *{display:block;-webkit-user-select:text}.default-object-view .title,.default-object-view .title{border-bottom:1px solid #808080;font-size:110%;font-weight:bold}.default-object-view td,.default-object-view th{font-family:monospace;vertical-align:top}.analysis-view{background-color:white;display:-webkit-flex}.analysis-view:not(.viewing-object){overflow:auto}.analysis-view>*{-webkit-flex:1 0 auto}.overlay-root *{-webkit-user-select:none;box-sizing:border-box}.overlay-root{-webkit-flex-flow:row;-webkit-justify-content:center;-webkit-user-select:none;background:rgba(0,0,0,0.8);display:-webkit-flex;font-family:sans-serif;height:100%;left:0;position:fixed;top:0;width:100%;z-index:1000}.overlay-root:not([visible]){display:none}.overlay-root>.content-host{-webkit-flex-flow:column;-webkit-justify-content:center;-webkit-user-select:auto;display:-webkit-flex}.overlay *{-webkit-user-select:auto}.overlay-root>.content-host>*{background:#fff}.overlay-root>.content-host .tool-bar{cursor:pointer;display:-webkit-flex;height:24px;padding:1px}.overlay-root>.content-host .tool-bar .exit-button{background-color:rgba(0,0,0,0.8);border:1px solid white;color:white;height:100%;padding-left:4px;width:19px}.overlay{max-height:500px;overflow:auto;padding:8px}.track-button{background-color:rgba(255,255,255,0.5);border:1px solid rgba(0,0,0,0.1);color:rgba(0,0,0,0.2);font-size:10px;height:12px;text-align:center;width:12px}.track-button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.5);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.track-close-button{left:2px;position:absolute;top:2px}.track-collapse-button{left:3px;position:absolute;top:2px}.drawing-container{-webkit-box-flex:1;display:inline;overflow:auto;position:relative}.drawing-container-canvas{-webkit-box-flex:1;display:block;left:0;pointer-events:none;position:absolute;top:0}.drawable-track{-webkit-box-align:stretch;-webkit-box-orient:horizontal;display:-webkit-box;margin:0;padding:0 5px 0 0}.drawable-track>heading{background-color:rgba(214,221,229,0.3);border-right:1px solid #8e8e8e;display:block;overflow:hidden;padding-left:18px;padding-right:5px;text-align:left;text-overflow:ellipsis;white-space:nowrap}.drawable-container{-webkit-box-flex:1;width:100%}.drawing-container{-webkit-box-flex:1;display:inline;overflow:auto;position:relative}.drawing-container-canvas{-webkit-box-flex:1;display:block;left:0;pointer-events:none;position:absolute;top:0}.ruler-track{height:12px}.ruler-track-with-distance-measurements{height:24px}.ruler-track .drawable-container{border-bottom:1px solid #8e8e8e}.slice-track{height:18px}.object-instance-track{height:18px}.heap-instance-track{height:150px}.heap-instance-track ul{list-style:none;list-style-position:outside;margin:0;overflow:hidden}.counter-track{height:30px;position:relative}.spacing-track{height:4px}.thread-track{-webkit-box-orient:vertical;display:-webkit-box;position:relative}.process-track-header{-webkit-flex:0 0 auto;background-image:-webkit-gradient(linear,0 0,100% 0,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;font-size:75%}.process-track-base:not(.expanded)>.track{display:none}.process-track-header>expand-button{display:inline;padding:2px 4px 2px 4px}.process-track-header>expand-button.expand-button-expanded{content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNtCDrVoAAAAoSURBVChTY2CgKggNDVUHYnsUQ4EC//FhBoIKkI0DKlYAYhmqupsBAMwgJH8K5nKoAAAAAElFTkSuQmCC)}.process-track-header>expand-button:not(.expand-button-expanded){content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFAAAAVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASd3+7gAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjbQg61aAAAAGklEQVQYV2P4//8/IyOQYMBkMEIBA5yBWzEAD3Mj+VR5R78AAAAASUVORK5CYII=)}.model-track{-webkit-box-flex:1}.timeline-track-view *{-webkit-user-select:none;cursor:default}.timeline-track-view.mode-panscan{cursor:move}.timeline-track-view{-webkit-box-orient:vertical;display:-webkit-box}.timeline-track-view heading{width:250px}.timeline-track-view .mode-indicator{height:32px;position:absolute;right:5px;top:38px;width:33px}.timeline-track-view.mode-selection .mode-indicator{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAABACAYAAACunKHjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABR0RVh0Q3JlYXRpb24gVGltZQA3LzkvMTM2Qb6aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAABWdJREFUeJztm01IG2kcxp933rGKM+6WNUiPfpGT2LrYS4W6lz30sD2pCYriyYIrJgE9lILbLaliC1LBj0uLouRWKWUPIntxD3qpLmgFcUvXS8BDm8TNmtq047x7iG+cZNJtrfMRk/xgZMwM8/7nyfP8Z94kQxhjKAAIdheQLYgAQAjh/5OmpqZqURR/FQThJwDf2FaZOURVVf1NUZRfVlZW/gbAAIAxBsIY40KQa9euXS0uLv4duSdAOtF4PP7j6urqCwBMKwRpbGx0SpL0ghBSZneVVsAY+zcWi11dW1v7izHGeI+gJSUl9/JFBAAghJSVlJTcA0CB4x4BoJhSeiPfriCU0hsAigEo3BEXAOSNGzSUIXHuSUcI+eYGDULyT4GCEEl4NJDH0QBQcESSgiOOKTjimKQQjLEzL6qqYmZmBjU1NYYcz4pFJ4QRqKqK2tpaTExMoLW11chDm46hQnCFZVmGx+PB8PAwJEkycgjTMDQa6Q33+vXrWFhYwOXLl22PgKXRyIQsy5icnER/f39WX5lMdYQWl8uF2dnZrGukOiGswOl0YmpqCm1tbVYO+0VY5giOLMvwer0YGRmBJEn56Qgtzc3NePbsGRoaGuwqIQVb7yxlWcbU1BQ8Ho/tjdTyaGTC7XZjbm4OtbW1+ReNdJxOJ6anp+FyuWwZPyscwZFlGT6fD6Ojo5Y1Up0Q2URzczOeP39uaSM13BFGLZIkYXp6Gh6PB6qqmu4IMaM8Z0BV1S/a7+DgAH19fVhfX8+4nRACQRAgiiJE0fAydRj6CdVp+oQkSbh//z7a29sRi8Uy7kMIASHEkNo+h+E9QlXVjEswGMT29nbKa5cuXUJPTw8opcl3XrtQSiEIgvbbetOwRIhoNAqv14vR0VHdtra2Nly5csXoMk6NJc3S5/Ph9evX2NjYQCAQ0G2/c+cOSktLbWnKOiGMIv0dHxoawsbGBoqKiiCKIh4/foxgMJiyT0VFBbq7uy3pBZ/CcEdoTzAQCGBxcRGU0mTje/fuHe7evasTrKWlBfX19bnjCD7A8vIyxsfHIYoiBCExDCEElFJsbm5ieXlZV9Tt27dtc4Up0djZ2YHf70dRUVFSBA4Xw+/3IxqN6iLS1dVldElfhOHRiEaj6O3txeHhYfKyl74Pj8jY2JguIl1dXaiqqjrf0SCEoL+/H+/fv0/2hU/tRynF0tIS1tfXdcUNDg5aHhFDHUEIwe7uLiilnz0mF2N4eFgXkerqanR0dJxvR5zmTlAQBLx58wZPnjzRRaSzsxNVVVVGlvf/tfAVqzKZ/m4IgoCFhQW8evVKt31gYMDUmadpjvga+AxzZGRE54rKykp0dHRYUwdfscMR6b1lZmZGJ0Z7ezscDkfuOwI4uYrMz89jb29PV6zP50sp2gyyQgjgJCIPHjzQuaKurg43b940d3y+Ymc0tBHZ2trC06dPdWK43W4cHR3ldjQ4PCKBQACxWCylYD5NN4uscgQ/0cPDQzx8+FBXrJnNkj+mUF5XV/fWNLlPCWMMiqJAUZRksZTSjJO4s7K1teVgjIWy9ueF6XMV7QTODMz/nPwr4f3CKrLWEVaTVVcNOykIcYw2GgcAZBtrsYMDvsIdoX78+PEPm4qxjeNzVoETR3yIRCKPHA7HD4SQ8/FT2TPCGItFIpFHAD4AJ46Ih0Khl+Fw+BZjLPM3sjkEYywWDodvhUKhlwDiwMmdJUHisT/HxYsXvy8vL/9ZFMWmXHMHYyymKMpKKBSa3N/f/xPAWwBxxhhLeSQaCTG+BfAdEo1TPH49F2AAFCQaZBjAP0i4gTGW+mw4kDhpioQgF5B7l1cViZ4QB3AEzUPy/wFLs9ZeouNzXgAAAABJRU5ErkJggg==);background-size:33px 32px}.timeline-track-view.mode-panscan .mode-indicator{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAABACAYAAACunKHjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABR0RVh0Q3JlYXRpb24gVGltZQA3LzkvMTM2Qb6aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAABipJREFUeJztm09oE1kcxz9v/qQlHXdlW2zxuNq9CUn9c7AiC7JoCQsehMSbEKVC0RwET0K71YOHIoKmgqHYi1IEteBByl4sUglqt7S97WG9SbBN67pNtTWZt4d0xjSpNknjm6J+YEpn8t7Mb375zu/93i9vhJSS74DmtQGbBQNACOHsi/b29p8Nw/hD07TfgR88s+zL8Na27YfZbLZ7bGzsH0ACSCkRUkrHEWL//v176+rq/uTrc0Axb5eWln57+vTpc0AWOkLs2bPnl4aGhudCiC1eW6kCKeV/mUxm74sXL/6WUkonRuj19fW934oTAIQQW+rr63sBHVZiBFCn63rHtzaC6LreAdQBWUcRPsAzNezcuZNAIODFpbeQv3dXEZpXapBS0tXVhWVZRKPRwhFMFZr7x0va29sJBoO0trZy+PBhz+zw1BG2bROLxdz9WCyG3+/3xBbXEVJK5duJEydoaWlxjbEsi2PHjmHbtjIbShyhGr/fTzgcLjkejUZpbm5Wbo8nirBtmzNnzmBZ1ppGnT17VpkqShyhkh07dhAKhT75+cGDB5UPp8oVURwgP0UsFlOiihJHqOLAgQO0tbWt2661tZUjR44osCiPsX6T2iGlZHR0lLa2NnK5HLZtMz09varNrl270DQNXdcxTRPDMJQkWa4jCmXyJRFCYJompmmSzWZLPvf5fBhG3ixN05TZplQRkL855wbXwjAM1xEqUa6IQta6ZnEQU4Xnc43NwndFrPBdESvUzBGfyxS/FOXkI+Wy4cwyEAgQj8e5cOECuVyu6syuUjtyuRzxeJx4PE5zc/OGM8uqx6mWlhZOnjzpKqHaZ7vaeOBcLxgM8uDBA4aGhhgYGGBhYaGq81UcLC3LIhwOE4lEsCxrVT/btj+bIxSzlvPKdagzD3EIh8OEQiESiQR3794t2wYH53eNxn379s2u17ijo4NTp06tKqZsRlKpFBcvXmRiYmLdts+ePWuSUqbLUkQwGCQajRIMBoH8t7GZ2bZtG9euXWNiYoJLly6RSqXW7VNWjMjlcvj9fk/G943Q0NBQdg20LEWMj48TiUQIhUKcP3/+k5WlzcLCwgI3btxgaGgIn8+Hruvr9ilLEc6JHj16xOPHjzl+/DidnZ0l7YLBYEVTZillyXNc7jnW6gtw584dbt68ybt37zBNs+zgXZYjhBAYhoGmaSwvLzMwMMDDhw/p6elh9+7dbrtyve/g5B2FlHuO4r7j4+P09PTw+vVrt5ZRyQhW0fAphEDTNEzTZHZ2ltOnTxMIBOju7mb79u1uQaVcnNJdIeWew+n76tUrrly5wpMnTzAMA9M0EUIghKgoplWcUDkXcZwyPT3N0aNHiUQiVVWSqg3AQggSiQSJRAJd1/H5fGiaVnU1a0OzT+fCQgju3buHpmkVnWcjCRXArVu3ME0TXdddB1Tr2A2Xgpz4sZKYVdy/2pyk8EuoBTWriVVr0EZyk1oWdT0vzBQrwqvCjPoqaRGbJVv1XBEbCZa1xHNFbJYJ3HdFrOC5Ir7ZGHHo0CHOnTvn7hc/GiMjI+7/vb29JJNJJXYpLedLKRkZGWFycnLdourk5CRjY2PKviCljnAywevXr6/riMuXL7t9VKB8oYgQgpcvXzI4OIht22tug4ODzMzMuDPIL7mVOEIVQgh0XWd4eJhUKlViWCqVYnh4eNVESgWeLCYDWFxcpL+/v0QN/f39LC4uKrOpxBEqcVSRTCaZmppyj09NTZFMJpWrATxccAr5qXRfXx+ZTAaAvr6+VatkVCrC04RK0zRmZ2e5f/8+ADMzM56slgGPU2zIPya3b9/Gsiyla6aK8TzFdipN79+/r6jqXGs8dwSoS5o+R+GjsQBs7p+wao+7hsDRov3hw4dRj4zxjJV7tuGjIpbn5+evNjU1/SqEaPDONHVIKTPz8/NXgWX4qIildDo9PTc31ymlzHhnnhqklJm5ubnOdDo9DSzBx4Uigvxrf01bt25ta2xs7DIMo/1rU4eUMpPNZsfS6XT8zZs3fwGzwJKUUq56JZq8M34EfiIfOI2V418DEsiSD5BzwL/k1SClXP1uOORvWifvEB9f3zpMm3xMWAJyFLwk/z8A3jc7RUU1LgAAAABJRU5ErkJggg==);background-size:33px 32px}.model-track-container{-webkit-box-flex:1;overflow:auto}.drag-box{background-color:rgba(0,0,255,0.25);border:1px solid #000060;font-size:75%;position:fixed}x-drag-handle{-webkit-user-select:none;box-sizing:border-box;display:block}x-drag-handle.horizontal-drag-handle{background-image:-webkit-gradient(linear,0 0,0 100%,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;cursor:ns-resize;height:7px;position:relative;z-index:10}x-drag-handle.vertical-drag-handle{background-image:-webkit-gradient(linear,0 0,100% 0,from(#e5e5e5),to(#d1d1d1));border-left:1px solid white;border-right:1px solid #8e8e8e;cursor:ew-resize;position:relative;width:7px;z-index:10}.timeline-view *{-webkit-user-select:none;box-sizing:border-box}.timeline-view{-webkit-box-flex:1;-webkit-box-orient:vertical;cursor:default;display:-webkit-box;font-family:sans-serif;padding:0}.timeline-view>.control>.title{font-size:14px;height:19px;padding-left:2px;padding-right:8px;padding-top:2px}.timeline-view>.control{background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;display:-webkit-flex;padding-top:1px}.timeline-view>.control>.controls.category-filter{margin-left:auto}.timeline-view>.control>.controls{display:-webkit-flex}.timeline-view>.control>span{padding-left:5px;padding-right:10px}.timeline-view>.control>.controls>button,.timeline-view>.control>.controls>label{font-size:11px;height:19px;margin:1px 2px 1px 2px}.timeline-view>.control>.spacer{-webkit-box-flex:1}.timeline-view>.container{-webkit-box-flex:1;border-bottom:1px solid #8e8e8e;display:-webkit-box}.timeline-view>.container>*{-webkit-box-flex:1}.timeline-view>.analysis-view{display:-webkit-flex;padding-left:2px;padding-right:2px}.timeline-view>.analysis-view:not(.viewing-object){height:250px}.timeline-view>.analysis-view.viewing-object{height:500px}.timeline-view .selection{margin:2px}.timeline-view .selection ul{margin:0}.find-control{-webkit-user-select:none;display:-webkit-box;position:relative}.find-control .hit-count-label{left:0;opacity:.25;pointer-events:none;position:absolute;text-align:right;top:2px;width:170px;z-index:1}.find-control input{-webkit-user-select:auto;background-color:#f8f8f8;border:1px solid rgba(0,0,0,0.5);box-sizing:border-box;height:19px;margin-bottom:1px;margin-left:0;margin-right:0;margin-top:1px;padding:0;width:170px}.find-control input:focus{background-color:white}.button.find-previous{border-left:none;margin-left:0;margin-right:0}.button.find-next{border-left:none;margin-left:0}.view-help-overlay{padding:6px}.button{background-color:#f8f8f8;border:1px solid rgba(0,0,0,0.5);color:rgba(0,0,0,0.8);font-size:14px;height:19px;margin:1px;min-width:23px;text-align:center}.button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.8);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.view-info-button{padding-left:4px;padding-right:4px;width:auto}.view-info-button:hover{border:solid 1px}.view-import-errors-button{border:solid 1px rgba(128,0,0,0.2);color:darkred}.view-import-errors-button:hover{border:solid 1px red;color:red}.view-import-errors-overlay{-webkit-user-select:text;max-height:500px;max-width:800px;min-height:200px;min-width:400px;overflow:auto}.import-errors-dialog-text{font-family:monospace;margin:8px;white-space:pre}.metadata-dialog{max-height:500px;max-width:800px;min-height:200px;min-width:400px;overflow:auto}.metadata-dialog-text{font-family:monospace;margin:8px;white-space:pre}.category-filter-dialog{max-height:500px;min-width:400px;overflow-y:auto;padding:20px}.category-filter-dialog-form{font-size:80%;padding:10px}.category-filter-dialog-form input{margin-right:7px}
\ No newline at end of file
+* WARNING:This file is generated by generate_standalone_timeline_view.py * * Do not edit directly. */.analysis-link{color:-webkit-link;cursor:pointer;text-decoration:underline}.analysis-link:hover{cursor:pointer}x-generic-object-view{display:block;font-family:monospace}.analysis-results{font-family:monospace;white-space:pre}.analysis-results *{-webkit-user-select:text!important;cursor:text}.analysis-table{border-collapse:collapse;border-width:0;margin-bottom:25px}.analysis-table>tr>td:first-child{padding-left:2px}.analysis-table>tr>td{padding:2px 4px 2px 4px}.analysis-table-header{text-align:left}.analysis-table-row{vertical-align:top}.analysis-table-row:nth-child(2n+0){background-color:#e2e2e2}.selection-changing-link{color:-webkit-link;cursor:pointer;text-decoration:underline}.analysis-slices-table-col-1,.analysis-slices-table-col-2{text-align:right}.default-object-snapshot-view #args{white-space:pre}.default-object-instance-view #snapshots>*{display:block}.default-object-view{overflow:auto}.default-object-view *{display:block;-webkit-user-select:text}.default-object-view .title,.default-object-view .title{border-bottom:1px solid #808080;font-size:110%;font-weight:bold}.default-object-view td,.default-object-view th{font-family:monospace;vertical-align:top}.analysis-view{background-color:white;display:-webkit-flex}.analysis-view:not(.viewing-object){overflow:auto}.analysis-view>*{-webkit-flex:1 0 auto}.overlay-root *{-webkit-user-select:none;box-sizing:border-box}.overlay-root{-webkit-flex-flow:row;-webkit-justify-content:center;-webkit-user-select:none;background:rgba(0,0,0,0.8);display:-webkit-flex;font-family:sans-serif;height:100%;left:0;position:fixed;top:0;width:100%;z-index:1000}.overlay-root:not([visible]){display:none}.overlay-root>.content-host{-webkit-flex-flow:column;-webkit-justify-content:center;-webkit-user-select:auto;display:-webkit-flex}.overlay *{-webkit-user-select:auto}.overlay-root>.content-host>*{background:#fff}.overlay-root>.content-host .tool-bar{cursor:pointer;display:-webkit-flex;height:24px;padding:1px}.overlay-root>.content-host .tool-bar .exit-button{background-color:rgba(0,0,0,0.8);border:1px solid white;color:white;height:100%;padding-left:4px;width:19px}.overlay{max-height:500px;overflow:auto;padding:8px}.track-button{background-color:rgba(255,255,255,0.5);border:1px solid rgba(0,0,0,0.1);color:rgba(0,0,0,0.2);font-size:10px;height:12px;text-align:center;width:12px}.track-button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.5);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.track-close-button{left:2px;position:absolute;top:2px}.track-collapse-button{left:3px;position:absolute;top:2px}.drawing-container{-webkit-box-flex:1;display:inline;overflow:auto;position:relative}.drawing-container-canvas{-webkit-box-flex:1;display:block;pointer-events:none;position:absolute;top:0}.heading-track{-webkit-box-align:stretch;-webkit-box-orient:horizontal;display:-webkit-box;margin:0;padding:0 5px 0 0}.heading-track>heading{-webkit-box-sizing:border-box;background-color:rgba(214,221,229,0.3);border-right:1px solid #8e8e8e;box-sizing:border-box;display:block;overflow:hidden;padding-left:18px;padding-right:5px;text-align:left;text-overflow:ellipsis;white-space:nowrap}.ruler-track{height:12px}.ruler-track-with-distance-measurements{height:24px}.slice-track{height:18px}.object-instance-track{height:18px}.heap-instance-track{height:150px}.heap-instance-track ul{list-style:none;list-style-position:outside;margin:0;overflow:hidden}.counter-track{height:30px;position:relative}.spacing-track{height:4px}.thread-track{-webkit-box-orient:vertical;display:-webkit-box;position:relative}.process-track-header{-webkit-flex:0 0 auto;background-image:-webkit-gradient(linear,0 0,100% 0,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;font-size:75%}.process-track-base:not(.expanded)>.track{display:none}.process-track-header>expand-button{display:inline;padding:2px 4px 2px 4px}.process-track-header>expand-button.expand-button-expanded{content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNtCDrVoAAAAoSURBVChTY2CgKggNDVUHYnsUQ4EC//FhBoIKkI0DKlYAYhmqupsBAMwgJH8K5nKoAAAAAElFTkSuQmCC)}.process-track-header>expand-button:not(.expand-button-expanded){content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFAAAAVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASd3+7gAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjbQg61aAAAAGklEQVQYV2P4//8/IyOQYMBkMEIBA5yBWzEAD3Mj+VR5R78AAAAASUVORK5CYII=)}.model-track{-webkit-box-flex:1}.tool-button{background-position:center center;background-repeat:no-repeat;border-bottom:1px solid #bcbcbc;border-top:1px solid #f1f1f1;cursor:pointer;height:30px}.tool-button.active{cursor:auto}.mouse-mode-selector{-webkit-user-drag:element;-webkit-user-select:none;background:#DDD;border:1px solid #BBB;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,0.2);height:108px;left:calc(100% - 120px);position:fixed;top:100px;user-drag:element;user-select:none;width:29px;z-index:20}.mouse-mode-selector .drag-handle{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABkCAYAAADaIVPoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAlGSURBVHic7VxfSFPvH362taMLZxIqtAr8k01MwYQkaMGUVRfByEHxFYZ1E2oQBgrd7KZYUER1UaghonlR0CC7UWrrYhetGwum4kxksi4kdf6b25ye03Z+F/421B238579MXIPyM6fd5/nPHt9/+zzvO9Ejx8/Zq9fvw6TyYRUvP5tELEsy87MzKCkpASpeP3bIH7y5AkAIFWvfxsyNZyp4X+shkVOp5Pd74dIJ8T7/QDpRkbwv44DJ/jQfj+Aw+HAjx8/wDAMxOLEP/9QKASKolBTU4OKioqo+/sq2OFwYGRkBMeOHUNxcTFkMhlEIpHgeKFQCH6/Hy6XCyMjIwAQJXpfBY+OjuLkyZMoLy8HRVGQSCQJCWZZFjKZDLm5uRgfH8fo6GhyBK+uriIvL0/wg4URCoVQVFQEmUwGqVQaV3B4QrMXWJZFMBiERCJBcXExFhcXo8oQNxq32w2LxQK/30/61ihIJBLk5uZCKpWCoihQFAWpVMr5Nzk5iba2NiwvL+9ZZnuMI0eOQCKRJC54cnISAPD9+/eEBYvFYkgkEl5/b9++BQA8e/aMV3mKojg7QSLBs7OzmJ+fBwAsLCxgdnY2YdEikShuu7XZbLDb7QCAsbEx2Gw2wTGJBI+NjUWdMwxDEkIQuru7o859Pp+gWESCm5qaos4pihJETIJPnz5FncvlckGxiHppt9sd8zxVSCZvzBp2u90YGhriFWhoaAgul0vwg2zH6Ogo9Ho9r7J6vR5ms5l3bM7vwwzDYGJiAtPT0/yf8v/Iy8tDdXU1CgoK4pZ9//49Ll++jOzsbEilUgQCAQwMDGBwcJCYt6SkBHfu3EFlZSUYhsHGxgbMZjNu3LixoxxnDVutVkFiga1JidVqFdSDd3R0CBILbE1KOjo68O3bt5jlOAXrdDqUl5cLIj5+/DgaGxtjzoj2Ql9fH7RarSDec+fOwWQyob6+PmY5zk7L5/NBpVKhoqICX758wc2bNyP3Xr58GTm+e/du5PjNmze4ePEiTpw4Aa/Xi83NTeKHpmkaBoMB165dg8FgwOfPnyP3qqqqIsfj4+OR4ytXruD+/ftQqVTwer3Y2NiIycEpmGVZeDweyGQy6PV6zM3Ncb55+3W9Xo+1tTUsLy/zUxeDt7S0FMPDw7x4h4eHiXhjDks0TfMeApI5RKWSl2jisXuI4jtkJYrdQxTfIYsLRIIvXboU8zxVePToUcxzEhAJzsnJQXV1NQCguLgYOTk5golJUFZWFqnV+vp6lJWVCY5FJJimaVRWViI/Px/nz58HTdOCicNg2fg+AE3TuHXrFpRKJe7du8eLNxgMcl4nznhsbm6irq4Of/78IX0rJ9bX15GdnR23HMuyePXqFa+YLMtibW2N896+5rSkUilcLheOHDmyZ42QIhgMIhgM4tevX5BKpVH391VwVVUV7HY7RCIRioqK9kzL8EUwGMTKygpmZmbgdrtx9uzZqDL7KvjUqVMQiURwOByYn5+HWCxOOGsZCoVw6NAh1NTUoLS0NKpMxj3815ER/K/jwAnOuIfpRMY9/Fvdw2SB1D2MBz7u4b4K3u0eJjKtDCM8J0/IPQy3h2Qjnnv4/Plz3u5iUt1Dl8sFi8WSEuMsltNnNpvR3NxMbJwlxT1cXV3F0NAQVldXicgTxczMDPR6PZxOZ1LiEQ18DMPAYrEkzUPiC7/fj5aWFiIPaS8IGulHRkYiBnU68fTpU3R2diYUQ/DUZnp6GlarNS2G+HYMDg6ivb09PYb4brjdbpjN5rS367GxMbS0tAhq1wlPXtfX12G1WtPerufn59He3k7crgVPPPLz86HT6ZCVlYVQKASv14tAICA0HG8olUr09fVBLpcL4iWqYYqioNFoAACLi4uw2WyYm5vDwsJCSsXK5XIYjUYAwNTUFLq7uwXzEgm+evUqFAoFamtrAQATExNpab8vXryAWq1Ga2srAGBgYEDwuMxbsEajweHDhxEIBHDmzBnk5uYC2PrGk0oYjUaUlZUhEAigqakJCoUCANDV1SUoHi/BGo0GCoUiYnH4fD7U1dUB2FqgJnR5RDwYjUao1eodvA8fPgSw9UF/+PCBOCYvwQqFIqqt5OTkRJZFTExMEBPzgVqtjuItKyuLLIsYGBggjslLMFfHQNM0amtrQVFUyiYfe/G2tbVBLpcLWuCa0PfhjY0N3L59G2KxeM/lCfHAxz3kes/Xr19j8ibNPdxNvLCwkEgI3u4hCW/GPdyGjHuYTmTcwzTgwFktGcH/Og6c4Ix7mE5k3MOMe0iGlLmH4bROohsuSd3DcFqHawYVRjz3kFiwy+WC3W4HwzCorq5ObGUrh3u4F8xmMzo7O+H3+9Ha2gqdTrdn2VjuIW/BDMPAbrfvyD/b7XbMzs7iwoULnN9M+CDe3kOfz4eurq4d+eeuri7YbDY8ePCAcwlzwu5heGsOV7I9vJkrFbvUnE4nOjo6OJPtY2Nj0Ov1xElEXjVcUFCA//77Dx6PB+/evdtxr7GxEUePHsXq6mpS1k9vR3l5OUwmE5xOZ9RPVZlMJpw+fZqYl5dghmGwtLQU2Uq7HVNTUzE7kUQQ5v3582fUPavVKqjTJJracCXd4+0TSga4ftNHaBMiEsyVR1pZWRFETAIuL1poLpxIMFdadGlpSRAxCbgyk2kR7PV6o67RNJ1yU/z3799R13w+nyBTPG6nZbFY4hpmHz9+BLA180rWXqbm5ua4v8fV0NAAYGsr7evXr3nFjVvDOp2O17Z3iqJizn5I0d/fz2vbu1wuR39/P++4cQX7fL7IJxkLDQ0NgtddcIGmafT29sYt19vbSzQOxxXMsiwkEknECOeCRqOBRCIRZJvE4i0sLIwY4VwwGo0oLCwk4uXVaTEMA4VCwbmJury8HAqFIiUdF8MwUKvVnJuotVot1Go1MS/vXjoQCEClUiE/Pz9yLT8/HyqVKqXLHQKBAAwGA5RKZeSaUqmEwWAQxEs0LHk8Hmi12shv3mi1Wng8HmLS7eDz7+jxeNDT0wO5XA65XI6enp64vElzD7d3YsnopPi6h9s7sXidVFLdQ5Zlk9Y5kbqH4XUlsTZ6ZtzDXTjEsmxCiTO+2M3Dsmxa3MPdvCKHw8FmZWUlJIYPAoEAZDJZ5HxzcxP7wStOBymAHaQA0iKWi/fAeUsHTvD/AOsopsJRclbzAAAAAElFTkSuQmCC) 2px 3px no-repeat;background-repeat:no-repeat;border-bottom:1px solid #bcbcbc;cursor:move;display:block;height:13px;width:27px}.mouse-mode-selector .pan-scan-mode-button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABkCAYAAADaIVPoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAlGSURBVHic7VxfSFPvH362taMLZxIqtAr8k01MwYQkaMGUVRfByEHxFYZ1E2oQBgrd7KZYUER1UaghonlR0CC7UWrrYhetGwum4kxksi4kdf6b25ye03Z+F/421B238579MXIPyM6fd5/nPHt9/+zzvO9Ejx8/Zq9fvw6TyYRUvP5tELEsy87MzKCkpASpeP3bIH7y5AkAIFWvfxsyNZyp4X+shkVOp5Pd74dIJ8T7/QDpRkbwv44DJ/jQfj+Aw+HAjx8/wDAMxOLEP/9QKASKolBTU4OKioqo+/sq2OFwYGRkBMeOHUNxcTFkMhlEIpHgeKFQCH6/Hy6XCyMjIwAQJXpfBY+OjuLkyZMoLy8HRVGQSCQJCWZZFjKZDLm5uRgfH8fo6GhyBK+uriIvL0/wg4URCoVQVFQEmUwGqVQaV3B4QrMXWJZFMBiERCJBcXExFhcXo8oQNxq32w2LxQK/30/61ihIJBLk5uZCKpWCoihQFAWpVMr5Nzk5iba2NiwvL+9ZZnuMI0eOQCKRJC54cnISAPD9+/eEBYvFYkgkEl5/b9++BQA8e/aMV3mKojg7QSLBs7OzmJ+fBwAsLCxgdnY2YdEikShuu7XZbLDb7QCAsbEx2Gw2wTGJBI+NjUWdMwxDEkIQuru7o859Pp+gWESCm5qaos4pihJETIJPnz5FncvlckGxiHppt9sd8zxVSCZvzBp2u90YGhriFWhoaAgul0vwg2zH6Ogo9Ho9r7J6vR5ms5l3bM7vwwzDYGJiAtPT0/yf8v/Iy8tDdXU1CgoK4pZ9//49Ll++jOzsbEilUgQCAQwMDGBwcJCYt6SkBHfu3EFlZSUYhsHGxgbMZjNu3LixoxxnDVutVkFiga1JidVqFdSDd3R0CBILbE1KOjo68O3bt5jlOAXrdDqUl5cLIj5+/DgaGxtjzoj2Ql9fH7RarSDec+fOwWQyob6+PmY5zk7L5/NBpVKhoqICX758wc2bNyP3Xr58GTm+e/du5PjNmze4ePEiTpw4Aa/Xi83NTeKHpmkaBoMB165dg8FgwOfPnyP3qqqqIsfj4+OR4ytXruD+/ftQqVTwer3Y2NiIycEpmGVZeDweyGQy6PV6zM3Ncb55+3W9Xo+1tTUsLy/zUxeDt7S0FMPDw7x4h4eHiXhjDks0TfMeApI5RKWSl2jisXuI4jtkJYrdQxTfIYsLRIIvXboU8zxVePToUcxzEhAJzsnJQXV1NQCguLgYOTk5golJUFZWFqnV+vp6lJWVCY5FJJimaVRWViI/Px/nz58HTdOCicNg2fg+AE3TuHXrFpRKJe7du8eLNxgMcl4nznhsbm6irq4Of/78IX0rJ9bX15GdnR23HMuyePXqFa+YLMtibW2N896+5rSkUilcLheOHDmyZ42QIhgMIhgM4tevX5BKpVH391VwVVUV7HY7RCIRioqK9kzL8EUwGMTKygpmZmbgdrtx9uzZqDL7KvjUqVMQiURwOByYn5+HWCxOOGsZCoVw6NAh1NTUoLS0NKpMxj3815ER/K/jwAnOuIfpRMY9/Fvdw2SB1D2MBz7u4b4K3u0eJjKtDCM8J0/IPQy3h2Qjnnv4/Plz3u5iUt1Dl8sFi8WSEuMsltNnNpvR3NxMbJwlxT1cXV3F0NAQVldXicgTxczMDPR6PZxOZ1LiEQ18DMPAYrEkzUPiC7/fj5aWFiIPaS8IGulHRkYiBnU68fTpU3R2diYUQ/DUZnp6GlarNS2G+HYMDg6ivb09PYb4brjdbpjN5rS367GxMbS0tAhq1wlPXtfX12G1WtPerufn59He3k7crgVPPPLz86HT6ZCVlYVQKASv14tAICA0HG8olUr09fVBLpcL4iWqYYqioNFoAACLi4uw2WyYm5vDwsJCSsXK5XIYjUYAwNTUFLq7uwXzEgm+evUqFAoFamtrAQATExNpab8vXryAWq1Ga2srAGBgYEDwuMxbsEajweHDhxEIBHDmzBnk5uYC2PrGk0oYjUaUlZUhEAigqakJCoUCANDV1SUoHi/BGo0GCoUiYnH4fD7U1dUB2FqgJnR5RDwYjUao1eodvA8fPgSw9UF/+PCBOCYvwQqFIqqt5OTkRJZFTExMEBPzgVqtjuItKyuLLIsYGBggjslLMFfHQNM0amtrQVFUyiYfe/G2tbVBLpcLWuCa0PfhjY0N3L59G2KxeM/lCfHAxz3kes/Xr19j8ibNPdxNvLCwkEgI3u4hCW/GPdyGjHuYTmTcwzTgwFktGcH/Og6c4Ix7mE5k3MOMe0iGlLmH4bROohsuSd3DcFqHawYVRjz3kFiwy+WC3W4HwzCorq5ObGUrh3u4F8xmMzo7O+H3+9Ha2gqdTrdn2VjuIW/BDMPAbrfvyD/b7XbMzs7iwoULnN9M+CDe3kOfz4eurq4d+eeuri7YbDY8ePCAcwlzwu5heGsOV7I9vJkrFbvUnE4nOjo6OJPtY2Nj0Ov1xElEXjVcUFCA//77Dx6PB+/evdtxr7GxEUePHsXq6mpS1k9vR3l5OUwmE5xOZ9RPVZlMJpw+fZqYl5dghmGwtLQU2Uq7HVNTUzE7kUQQ5v3582fUPavVKqjTJJracCXd4+0TSga4ftNHaBMiEsyVR1pZWRFETAIuL1poLpxIMFdadGlpSRAxCbgyk2kR7PV6o67RNJ1yU/z3799R13w+nyBTPG6nZbFY4hpmHz9+BLA180rWXqbm5ua4v8fV0NAAYGsr7evXr3nFjVvDOp2O17Z3iqJizn5I0d/fz2vbu1wuR39/P++4cQX7fL7IJxkLDQ0NgtddcIGmafT29sYt19vbSzQOxxXMsiwkEknECOeCRqOBRCIRZJvE4i0sLIwY4VwwGo0oLCwk4uXVaTEMA4VCwbmJury8HAqFIiUdF8MwUKvVnJuotVot1Go1MS/vXjoQCEClUiE/Pz9yLT8/HyqVKqXLHQKBAAwGA5RKZeSaUqmEwWAQxEs0LHk8Hmi12shv3mi1Wng8HmLS7eDz7+jxeNDT0wO5XA65XI6enp64vElzD7d3YsnopPi6h9s7sXidVFLdQ5Zlk9Y5kbqH4XUlsTZ6ZtzDXTjEsmxCiTO+2M3Dsmxa3MPdvCKHw8FmZWUlJIYPAoEAZDJZ5HxzcxP7wStOBymAHaQA0iKWi/fAeUsHTvD/AOsopsJRclbzAAAAAElFTkSuQmCC);background-position:0 -10px}.mouse-mode-selector .pan-scan-mode-button.active{background-position:-30px -10px}.mouse-mode-selector .selection-mode-button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABkCAYAAADaIVPoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAlGSURBVHic7VxfSFPvH362taMLZxIqtAr8k01MwYQkaMGUVRfByEHxFYZ1E2oQBgrd7KZYUER1UaghonlR0CC7UWrrYhetGwum4kxksi4kdf6b25ye03Z+F/421B238579MXIPyM6fd5/nPHt9/+zzvO9Ejx8/Zq9fvw6TyYRUvP5tELEsy87MzKCkpASpeP3bIH7y5AkAIFWvfxsyNZyp4X+shkVOp5Pd74dIJ8T7/QDpRkbwv44DJ/jQfj+Aw+HAjx8/wDAMxOLEP/9QKASKolBTU4OKioqo+/sq2OFwYGRkBMeOHUNxcTFkMhlEIpHgeKFQCH6/Hy6XCyMjIwAQJXpfBY+OjuLkyZMoLy8HRVGQSCQJCWZZFjKZDLm5uRgfH8fo6GhyBK+uriIvL0/wg4URCoVQVFQEmUwGqVQaV3B4QrMXWJZFMBiERCJBcXExFhcXo8oQNxq32w2LxQK/30/61ihIJBLk5uZCKpWCoihQFAWpVMr5Nzk5iba2NiwvL+9ZZnuMI0eOQCKRJC54cnISAPD9+/eEBYvFYkgkEl5/b9++BQA8e/aMV3mKojg7QSLBs7OzmJ+fBwAsLCxgdnY2YdEikShuu7XZbLDb7QCAsbEx2Gw2wTGJBI+NjUWdMwxDEkIQuru7o859Pp+gWESCm5qaos4pihJETIJPnz5FncvlckGxiHppt9sd8zxVSCZvzBp2u90YGhriFWhoaAgul0vwg2zH6Ogo9Ho9r7J6vR5ms5l3bM7vwwzDYGJiAtPT0/yf8v/Iy8tDdXU1CgoK4pZ9//49Ll++jOzsbEilUgQCAQwMDGBwcJCYt6SkBHfu3EFlZSUYhsHGxgbMZjNu3LixoxxnDVutVkFiga1JidVqFdSDd3R0CBILbE1KOjo68O3bt5jlOAXrdDqUl5cLIj5+/DgaGxtjzoj2Ql9fH7RarSDec+fOwWQyob6+PmY5zk7L5/NBpVKhoqICX758wc2bNyP3Xr58GTm+e/du5PjNmze4ePEiTpw4Aa/Xi83NTeKHpmkaBoMB165dg8FgwOfPnyP3qqqqIsfj4+OR4ytXruD+/ftQqVTwer3Y2NiIycEpmGVZeDweyGQy6PV6zM3Ncb55+3W9Xo+1tTUsLy/zUxeDt7S0FMPDw7x4h4eHiXhjDks0TfMeApI5RKWSl2jisXuI4jtkJYrdQxTfIYsLRIIvXboU8zxVePToUcxzEhAJzsnJQXV1NQCguLgYOTk5golJUFZWFqnV+vp6lJWVCY5FJJimaVRWViI/Px/nz58HTdOCicNg2fg+AE3TuHXrFpRKJe7du8eLNxgMcl4nznhsbm6irq4Of/78IX0rJ9bX15GdnR23HMuyePXqFa+YLMtibW2N896+5rSkUilcLheOHDmyZ42QIhgMIhgM4tevX5BKpVH391VwVVUV7HY7RCIRioqK9kzL8EUwGMTKygpmZmbgdrtx9uzZqDL7KvjUqVMQiURwOByYn5+HWCxOOGsZCoVw6NAh1NTUoLS0NKpMxj3815ER/K/jwAnOuIfpRMY9/Fvdw2SB1D2MBz7u4b4K3u0eJjKtDCM8J0/IPQy3h2Qjnnv4/Plz3u5iUt1Dl8sFi8WSEuMsltNnNpvR3NxMbJwlxT1cXV3F0NAQVldXicgTxczMDPR6PZxOZ1LiEQ18DMPAYrEkzUPiC7/fj5aWFiIPaS8IGulHRkYiBnU68fTpU3R2diYUQ/DUZnp6GlarNS2G+HYMDg6ivb09PYb4brjdbpjN5rS367GxMbS0tAhq1wlPXtfX12G1WtPerufn59He3k7crgVPPPLz86HT6ZCVlYVQKASv14tAICA0HG8olUr09fVBLpcL4iWqYYqioNFoAACLi4uw2WyYm5vDwsJCSsXK5XIYjUYAwNTUFLq7uwXzEgm+evUqFAoFamtrAQATExNpab8vXryAWq1Ga2srAGBgYEDwuMxbsEajweHDhxEIBHDmzBnk5uYC2PrGk0oYjUaUlZUhEAigqakJCoUCANDV1SUoHi/BGo0GCoUiYnH4fD7U1dUB2FqgJnR5RDwYjUao1eodvA8fPgSw9UF/+PCBOCYvwQqFIqqt5OTkRJZFTExMEBPzgVqtjuItKyuLLIsYGBggjslLMFfHQNM0amtrQVFUyiYfe/G2tbVBLpcLWuCa0PfhjY0N3L59G2KxeM/lCfHAxz3kes/Xr19j8ibNPdxNvLCwkEgI3u4hCW/GPdyGjHuYTmTcwzTgwFktGcH/Og6c4Ix7mE5k3MOMe0iGlLmH4bROohsuSd3DcFqHawYVRjz3kFiwy+WC3W4HwzCorq5ObGUrh3u4F8xmMzo7O+H3+9Ha2gqdTrdn2VjuIW/BDMPAbrfvyD/b7XbMzs7iwoULnN9M+CDe3kOfz4eurq4d+eeuri7YbDY8ePCAcwlzwu5heGsOV7I9vJkrFbvUnE4nOjo6OJPtY2Nj0Ov1xElEXjVcUFCA//77Dx6PB+/evdtxr7GxEUePHsXq6mpS1k9vR3l5OUwmE5xOZ9RPVZlMJpw+fZqYl5dghmGwtLQU2Uq7HVNTUzE7kUQQ5v3582fUPavVKqjTJJracCXd4+0TSga4ftNHaBMiEsyVR1pZWRFETAIuL1poLpxIMFdadGlpSRAxCbgyk2kR7PV6o67RNJ1yU/z3799R13w+nyBTPG6nZbFY4hpmHz9+BLA180rWXqbm5ua4v8fV0NAAYGsr7evXr3nFjVvDOp2O17Z3iqJizn5I0d/fz2vbu1wuR39/P++4cQX7fL7IJxkLDQ0NgtddcIGmafT29sYt19vbSzQOxxXMsiwkEknECOeCRqOBRCIRZJvE4i0sLIwY4VwwGo0oLCwk4uXVaTEMA4VCwbmJury8HAqFIiUdF8MwUKvVnJuotVot1Go1MS/vXjoQCEClUiE/Pz9yLT8/HyqVKqXLHQKBAAwGA5RKZeSaUqmEwWAQxEs0LHk8Hmi12shv3mi1Wng8HmLS7eDz7+jxeNDT0wO5XA65XI6enp64vElzD7d3YsnopPi6h9s7sXidVFLdQ5Zlk9Y5kbqH4XUlsTZ6ZtzDXTjEsmxCiTO+2M3Dsmxa3MPdvCKHw8FmZWUlJIYPAoEAZDJZ5HxzcxP7wStOBymAHaQA0iKWi/fAeUsHTvD/AOsopsJRclbzAAAAAElFTkSuQmCC);background-position:0 -40px}.mouse-mode-selector .selection-mode-button.active{background-position:-30px -40px}.mouse-mode-selector .zoom-mode-button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABkCAYAAADaIVPoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAlGSURBVHic7VxfSFPvH362taMLZxIqtAr8k01MwYQkaMGUVRfByEHxFYZ1E2oQBgrd7KZYUER1UaghonlR0CC7UWrrYhetGwum4kxksi4kdf6b25ye03Z+F/421B238579MXIPyM6fd5/nPHt9/+zzvO9Ejx8/Zq9fvw6TyYRUvP5tELEsy87MzKCkpASpeP3bIH7y5AkAIFWvfxsyNZyp4X+shkVOp5Pd74dIJ8T7/QDpRkbwv44DJ/jQfj+Aw+HAjx8/wDAMxOLEP/9QKASKolBTU4OKioqo+/sq2OFwYGRkBMeOHUNxcTFkMhlEIpHgeKFQCH6/Hy6XCyMjIwAQJXpfBY+OjuLkyZMoLy8HRVGQSCQJCWZZFjKZDLm5uRgfH8fo6GhyBK+uriIvL0/wg4URCoVQVFQEmUwGqVQaV3B4QrMXWJZFMBiERCJBcXExFhcXo8oQNxq32w2LxQK/30/61ihIJBLk5uZCKpWCoihQFAWpVMr5Nzk5iba2NiwvL+9ZZnuMI0eOQCKRJC54cnISAPD9+/eEBYvFYkgkEl5/b9++BQA8e/aMV3mKojg7QSLBs7OzmJ+fBwAsLCxgdnY2YdEikShuu7XZbLDb7QCAsbEx2Gw2wTGJBI+NjUWdMwxDEkIQuru7o859Pp+gWESCm5qaos4pihJETIJPnz5FncvlckGxiHppt9sd8zxVSCZvzBp2u90YGhriFWhoaAgul0vwg2zH6Ogo9Ho9r7J6vR5ms5l3bM7vwwzDYGJiAtPT0/yf8v/Iy8tDdXU1CgoK4pZ9//49Ll++jOzsbEilUgQCAQwMDGBwcJCYt6SkBHfu3EFlZSUYhsHGxgbMZjNu3LixoxxnDVutVkFiga1JidVqFdSDd3R0CBILbE1KOjo68O3bt5jlOAXrdDqUl5cLIj5+/DgaGxtjzoj2Ql9fH7RarSDec+fOwWQyob6+PmY5zk7L5/NBpVKhoqICX758wc2bNyP3Xr58GTm+e/du5PjNmze4ePEiTpw4Aa/Xi83NTeKHpmkaBoMB165dg8FgwOfPnyP3qqqqIsfj4+OR4ytXruD+/ftQqVTwer3Y2NiIycEpmGVZeDweyGQy6PV6zM3Ncb55+3W9Xo+1tTUsLy/zUxeDt7S0FMPDw7x4h4eHiXhjDks0TfMeApI5RKWSl2jisXuI4jtkJYrdQxTfIYsLRIIvXboU8zxVePToUcxzEhAJzsnJQXV1NQCguLgYOTk5golJUFZWFqnV+vp6lJWVCY5FJJimaVRWViI/Px/nz58HTdOCicNg2fg+AE3TuHXrFpRKJe7du8eLNxgMcl4nznhsbm6irq4Of/78IX0rJ9bX15GdnR23HMuyePXqFa+YLMtibW2N896+5rSkUilcLheOHDmyZ42QIhgMIhgM4tevX5BKpVH391VwVVUV7HY7RCIRioqK9kzL8EUwGMTKygpmZmbgdrtx9uzZqDL7KvjUqVMQiURwOByYn5+HWCxOOGsZCoVw6NAh1NTUoLS0NKpMxj3815ER/K/jwAnOuIfpRMY9/Fvdw2SB1D2MBz7u4b4K3u0eJjKtDCM8J0/IPQy3h2Qjnnv4/Plz3u5iUt1Dl8sFi8WSEuMsltNnNpvR3NxMbJwlxT1cXV3F0NAQVldXicgTxczMDPR6PZxOZ1LiEQ18DMPAYrEkzUPiC7/fj5aWFiIPaS8IGulHRkYiBnU68fTpU3R2diYUQ/DUZnp6GlarNS2G+HYMDg6ivb09PYb4brjdbpjN5rS367GxMbS0tAhq1wlPXtfX12G1WtPerufn59He3k7crgVPPPLz86HT6ZCVlYVQKASv14tAICA0HG8olUr09fVBLpcL4iWqYYqioNFoAACLi4uw2WyYm5vDwsJCSsXK5XIYjUYAwNTUFLq7uwXzEgm+evUqFAoFamtrAQATExNpab8vXryAWq1Ga2srAGBgYEDwuMxbsEajweHDhxEIBHDmzBnk5uYC2PrGk0oYjUaUlZUhEAigqakJCoUCANDV1SUoHi/BGo0GCoUiYnH4fD7U1dUB2FqgJnR5RDwYjUao1eodvA8fPgSw9UF/+PCBOCYvwQqFIqqt5OTkRJZFTExMEBPzgVqtjuItKyuLLIsYGBggjslLMFfHQNM0amtrQVFUyiYfe/G2tbVBLpcLWuCa0PfhjY0N3L59G2KxeM/lCfHAxz3kes/Xr19j8ibNPdxNvLCwkEgI3u4hCW/GPdyGjHuYTmTcwzTgwFktGcH/Og6c4Ix7mE5k3MOMe0iGlLmH4bROohsuSd3DcFqHawYVRjz3kFiwy+WC3W4HwzCorq5ObGUrh3u4F8xmMzo7O+H3+9Ha2gqdTrdn2VjuIW/BDMPAbrfvyD/b7XbMzs7iwoULnN9M+CDe3kOfz4eurq4d+eeuri7YbDY8ePCAcwlzwu5heGsOV7I9vJkrFbvUnE4nOjo6OJPtY2Nj0Ov1xElEXjVcUFCA//77Dx6PB+/evdtxr7GxEUePHsXq6mpS1k9vR3l5OUwmE5xOZ9RPVZlMJpw+fZqYl5dghmGwtLQU2Uq7HVNTUzE7kUQQ5v3582fUPavVKqjTJJracCXd4+0TSga4ftNHaBMiEsyVR1pZWRFETAIuL1poLpxIMFdadGlpSRAxCbgyk2kR7PV6o67RNJ1yU/z3799R13w+nyBTPG6nZbFY4hpmHz9+BLA180rWXqbm5ua4v8fV0NAAYGsr7evXr3nFjVvDOp2O17Z3iqJizn5I0d/fz2vbu1wuR39/P++4cQX7fL7IJxkLDQ0NgtddcIGmafT29sYt19vbSzQOxxXMsiwkEknECOeCRqOBRCIRZJvE4i0sLIwY4VwwGo0oLCwk4uXVaTEMA4VCwbmJury8HAqFIiUdF8MwUKvVnJuotVot1Go1MS/vXjoQCEClUiE/Pz9yLT8/HyqVKqXLHQKBAAwGA5RKZeSaUqmEwWAQxEs0LHk8Hmi12shv3mi1Wng8HmLS7eDz7+jxeNDT0wO5XA65XI6enp64vElzD7d3YsnopPi6h9s7sXidVFLdQ5Zlk9Y5kbqH4XUlsTZ6ZtzDXTjEsmxCiTO+2M3Dsmxa3MPdvCKHw8FmZWUlJIYPAoEAZDJZ5HxzcxP7wStOBymAHaQA0iKWi/fAeUsHTvD/AOsopsJRclbzAAAAAElFTkSuQmCC);background-position:0 -70px;border-bottom:0}.mouse-mode-selector .zoom-mode-button.active{background-position:-30px -70px}.timeline-track-view *{-webkit-user-select:none;cursor:default}.timeline-track-view .tool-button{cursor:pointer}.timeline-track-view{-webkit-box-orient:vertical;display:-webkit-box}.timeline-track-view .mode-indicator{height:32px;position:absolute;right:5px;top:38px;width:33px}.model-track-container{-webkit-box-flex:1;overflow:auto}.drag-box{background-color:rgba(0,0,255,0.25);border:1px solid #000060;font-size:75%;position:fixed}x-drag-handle{-webkit-user-select:none;box-sizing:border-box;display:block}x-drag-handle.horizontal-drag-handle{background-image:-webkit-gradient(linear,0 0,0 100%,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;cursor:ns-resize;height:7px;position:relative;z-index:10}x-drag-handle.vertical-drag-handle{background-image:-webkit-gradient(linear,0 0,100% 0,from(#e5e5e5),to(#d1d1d1));border-left:1px solid white;border-right:1px solid #8e8e8e;cursor:ew-resize;position:relative;width:7px;z-index:10}.timeline-view *{-webkit-user-select:none;box-sizing:border-box}.timeline-view{-webkit-box-flex:1;-webkit-box-orient:vertical;cursor:default;display:-webkit-box;font-family:sans-serif;padding:0}.timeline-view>.control>.title{font-size:14px;height:19px;padding-left:2px;padding-right:8px;padding-top:2px}.timeline-view>.control{background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;display:-webkit-flex;padding-top:1px}.timeline-view>.control>.controls.category-filter{margin-left:auto}.timeline-view>.control>.controls{display:-webkit-flex}.timeline-view>.control>span{padding-left:5px;padding-right:10px}.timeline-view>.control>.controls>button,.timeline-view>.control>.controls>label{font-size:11px;height:19px;margin:1px 2px 1px 2px}.timeline-view>.control>.spacer{-webkit-box-flex:1}.timeline-view>.container{-webkit-box-flex:1;border-bottom:1px solid #8e8e8e;display:-webkit-box}.timeline-view>.container>*{-webkit-box-flex:1}.timeline-view>.analysis-view{display:-webkit-flex;padding-left:2px;padding-right:2px}.timeline-view>.analysis-view:not(.viewing-object){height:250px}.timeline-view>.analysis-view.viewing-object{height:500px}.timeline-view .selection{margin:2px}.timeline-view .selection ul{margin:0}.find-control{-webkit-user-select:none;display:-webkit-box;position:relative}.find-control .hit-count-label{left:0;opacity:.25;pointer-events:none;position:absolute;text-align:right;top:2px;width:170px;z-index:1}.find-control input{-webkit-user-select:auto;background-color:#f8f8f8;border:1px solid rgba(0,0,0,0.5);box-sizing:border-box;height:19px;margin-bottom:1px;margin-left:0;margin-right:0;margin-top:1px;padding:0;width:170px}.find-control input:focus{background-color:white}.button.find-previous{border-left:none;margin-left:0;margin-right:0}.button.find-next{border-left:none;margin-left:0}.view-help-overlay{padding:6px}.button{background-color:#f8f8f8;border:1px solid rgba(0,0,0,0.5);color:rgba(0,0,0,0.8);font-size:14px;height:19px;margin:1px;min-width:23px;text-align:center}.button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.8);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.view-info-button{padding-left:4px;padding-right:4px;width:auto}.view-info-button:hover{border:solid 1px}.view-import-errors-button{border:solid 1px rgba(128,0,0,0.2);color:darkred}.view-import-errors-button:hover{border:solid 1px red;color:red}.view-import-errors-overlay{-webkit-user-select:text;max-height:500px;max-width:800px;min-height:200px;min-width:400px;overflow:auto}.import-errors-dialog-text{font-family:monospace;margin:8px;white-space:pre}.metadata-dialog{max-height:500px;max-width:800px;min-height:200px;min-width:400px;overflow:auto}.metadata-dialog-text{font-family:monospace;margin:8px;white-space:pre}.category-filter-dialog{max-height:500px;min-width:400px;overflow-y:auto;padding:20px}.category-filter-dialog-form{font-size:80%;padding:10px}.category-filter-dialog-form input{margin-right:7px}
\ No newline at end of file
diff --git a/trace-viewer/PRESUBMIT.py b/trace-viewer/PRESUBMIT.py
index 70a8026..6f7153c 100644
--- a/trace-viewer/PRESUBMIT.py
+++ b/trace-viewer/PRESUBMIT.py
@@ -15,13 +15,12 @@
"\n"
)
+
def _CommonChecks(input_api, output_api):
results = []
results.extend(input_api.canned_checks.PanProjectChecks(
input_api, output_api, excluded_paths=_EXCLUDED_PATHS))
- from web_dev_style import css_checker, js_checker
-
src_dir = os.path.join(input_api.change.RepositoryRoot(), "src")
def IsResource(maybe_resource):
@@ -30,6 +29,7 @@
return False
return True
+ from web_dev_style import css_checker, js_checker
results.extend(css_checker.CSSChecker(input_api, output_api,
file_filter=IsResource).RunChecks())
results.extend(js_checker.JSChecker(input_api, output_api,
@@ -40,6 +40,11 @@
if len(gyp_result) > 0:
results.extend([output_api.PresubmitError(gyp_result)])
+ from build import check_grit
+ grit_result = check_grit.GritCheck()
+ if len(grit_result) > 0:
+ results.extend([output_api.PresubmitError(grit_result)])
+
black_list = input_api.DEFAULT_BLACK_LIST
sources = lambda x: input_api.FilterSourceFile(x, black_list=black_list)
results.extend(input_api.canned_checks.CheckLicense(
@@ -47,6 +52,7 @@
source_file_filter=sources))
return results
+
def GetPathsToPrepend(input_api):
web_dev_style_path = input_api.os_path.join(
input_api.change.RepositoryRoot(),
@@ -54,6 +60,7 @@
"web_dev_style")
return [input_api.PresubmitLocalPath(), web_dev_style_path]
+
def RunWithPrependedPath(prepended_path, fn, *args):
import sys
old_path = sys.path
@@ -64,6 +71,7 @@
finally:
sys.path = old_path
+
def CheckChangeOnUpload(input_api, output_api):
def go():
results = []
@@ -71,6 +79,7 @@
return results
return RunWithPrependedPath(GetPathsToPrepend(input_api), go)
+
def CheckChangeOnCommit(input_api, output_api):
def go():
results = []
diff --git a/trace-viewer/build/check_grit.py b/trace-viewer/build/check_grit.py
new file mode 100644
index 0000000..ac78368
--- /dev/null
+++ b/trace-viewer/build/check_grit.py
@@ -0,0 +1,53 @@
+# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import parse_deps
+import re
+
+srcdir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../src"))
+
+def GritCheck():
+ filenames = [os.path.join(srcdir, x) for x in [
+ "base.js",
+ "about_tracing/profiling_view.js"]]
+
+ grit_files = []
+ load_sequence = parse_deps.calc_load_sequence(filenames, srcdir)
+ for module in load_sequence:
+ for style_sheet in module.style_sheets:
+ # I'm assuming we only have url()'s associated with images
+ grit_files.extend(re.findall(
+ 'url\((?:["|\']?)([^"\'()]*)(?:["|\']?)\)',
+ style_sheet.contents))
+
+ for idx, filename in enumerate(grit_files):
+ while filename.startswith("../"):
+ filename = filename[3:]
+ grit_files[idx] = "src/" + filename
+
+ known_images = []
+ for (dirpath, dirnames, filenames) in os.walk('src/images'):
+ for name in filenames:
+ known_images.append(os.path.join(dirpath, name))
+
+ u = set(grit_files).union(set(known_images))
+ i = set(grit_files).intersection(set(known_images))
+ diff = list(u - i)
+
+ if len(diff) == 0:
+ return ''
+
+ error = 'Entries in CSS url()s do not match files in src/images:\n'
+ in_grit_only = list(set(grit_files) - set(known_images))
+ in_known_only = list(set(known_images) - set(grit_files))
+
+ if len(in_grit_only) > 0:
+ error += ' In CSS urls()s only:\n ' + '\n '.join(sorted(in_grit_only))
+ if len(in_known_only) > 0:
+ if len(in_grit_only) > 0:
+ error += '\n\n'
+ error += ' In src/images only:\n ' + '\n '.join(sorted(in_known_only))
+
+ return error
diff --git a/trace-viewer/build/check_gyp.py b/trace-viewer/build/check_gyp.py
index 5518ae0..6b2dc6a 100644
--- a/trace-viewer/build/check_gyp.py
+++ b/trace-viewer/build/check_gyp.py
@@ -8,7 +8,8 @@
FILE_GROUPS = ["tracing_html_files",
"tracing_css_files",
"tracing_js_files",
- "tracing_template_files"]
+ "tracing_template_files",
+ "tracing_img_files"]
def GypCheck():
f = open(GYP_FILE, 'r')
diff --git a/trace-viewer/build/generate_standalone_timeline_view.py b/trace-viewer/build/generate_standalone_timeline_view.py
index d9fdd2a..fb2421a 100755
--- a/trace-viewer/build/generate_standalone_timeline_view.py
+++ b/trace-viewer/build/generate_standalone_timeline_view.py
@@ -2,11 +2,13 @@
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+
import base64
import optparse
import parse_deps
import sys
import os
+import re
from generate_template_contents import generate_templates
@@ -64,7 +66,25 @@
for style_sheet in module.style_sheets:
style_sheet_chunks.append("""%s\n""" % style_sheet.contents)
- return ''.join(style_sheet_chunks)
+ # Borrowed from grit html_format.py.
+ def InlineUrl(m):
+ filename = m.group('filename')
+ idx = filename.index('/images')
+ filename = "%s%s" % (srcdir, filename[idx:])
+ ext = filename[filename.rindex('.') + 1:]
+
+ with open(filename, 'rb') as f:
+ data = f.read();
+ data = base64.standard_b64encode(data)
+
+ return "url(data:image/%s;base64,%s)" % (ext, data)
+
+ full_style_sheet = ''.join(style_sheet_chunks)
+ # I'm assuming we only have url()'s associated with images
+ return re.sub('url\((?P<quote>"|\'|)(?P<filename>[^"\'()]*)(?P=quote)\)',
+ lambda m: InlineUrl(m),
+ full_style_sheet)
+
def generate_js():
filenames = _get_input_filenames()
diff --git a/trace-viewer/src/base/events.js b/trace-viewer/src/base/events.js
index 2b51031..7986721 100644
--- a/trace-viewer/src/base/events.js
+++ b/trace-viewer/src/base/events.js
@@ -36,9 +36,6 @@
* @param {boolean=} opt_bubbles Whether the event bubbles or not.
* @param {boolean=} opt_cancelable Whether the default action of the event
* can be prevented.
- * @param {boolean=} opt_bubbles Whether the event bubbles or not.
- * @param {boolean=} opt_cancelable Whether the default action of the event
- * can be prevented.
* @return {boolean} If any of the listeners called {@code preventDefault}
* during the dispatch this will return false.
*/
diff --git a/trace-viewer/src/base/unittest.css b/trace-viewer/src/base/unittest.css
index 1d3f691..e99e4c3 100644
--- a/trace-viewer/src/base/unittest.css
+++ b/trace-viewer/src/base/unittest.css
@@ -9,6 +9,11 @@
margin-top: 0;
}
+#test-harness h1 a {
+ color: black;
+ text-decoration: none;
+}
+
#stats {
margin-bottom: 10px;
}
@@ -56,28 +61,23 @@
background-color: #eee;
}
-.individual-result {
- padding: 5px;
-}
-
.individual-result pre {
overflow-y: auto;
}
-.test-result {
+.test-result,
+.individual-result {
counter-increment: suite-count;
- padding: 5px;
+ padding: 10px 0;
}
-.test-result:before {
- content: counter(suite-count) ' - ';
- display: inline-block;
+.test-result:before,
+.individual-result:before {
+ content: counter(suite-count) ' -';
margin-right: 5px;
- text-align: right;
- width: 2em;
}
-.test-result > span {
+span.results {
padding-left: 10px;
}
diff --git a/trace-viewer/src/base/unittest.js b/trace-viewer/src/base/unittest.js
index 6fdc17a..f64294d 100644
--- a/trace-viewer/src/base/unittest.js
+++ b/trace-viewer/src/base/unittest.js
@@ -55,6 +55,10 @@
},
run: function() {
+ this.clear_(document.querySelector('#test-results'));
+ this.clear_(document.querySelector('#exception-list'));
+ this.clear_(document.querySelector('#message-list'));
+
this.updateStats_();
this.runSuites_();
},
@@ -82,20 +86,26 @@
base.require(modules);
},
+ clear_: function(el) {
+ while (el.firstChild)
+ el.removeChild(el.firstChild);
+ },
+
runSuites_: function(opt_idx) {
var idx = opt_idx || 0;
var suiteCount = this.suites_.length;
if (idx >= suiteCount) {
- var harness = document.querySelector('#test-harness');
+ var harness = document.querySelector('#test-results');
+ harness.appendChild(document.createElement('br'));
harness.appendChild(document.createTextNode('Test Run Complete'));
return;
}
var suite = this.suites_[idx];
- suite.displayInfo();
suite.showLongResults = (suiteCount === 1);
+ suite.displayInfo();
suite.runTests(this.tests_);
this.stats_.duration += suite.duration;
@@ -271,7 +281,8 @@
},
outputResults: function() {
- if ((this.results === TestResults.PASSED) && showCondensed_) {
+ if ((this.results === TestResults.PASSED) && showCondensed_ &&
+ !this.showLongResults) {
var parent = this.resultsEl_.parentNode;
parent.removeChild(this.resultsEl_);
this.resultsEl_ = undefined;
@@ -289,6 +300,7 @@
status.innerText = 'FAILED';
status.classList.add('failed');
}
+
status.innerText += ' (' + this.duration_ + 'ms)';
var child = this.showLongResults ? this.outputLongResults() :
@@ -342,10 +354,10 @@
resultEl.classList.add('results');
testEl.appendChild(resultEl);
if (test.result === TestResults.PASSED) {
- resultEl.className = 'passed';
+ resultEl.classList.add('passed');
resultEl.innerText = 'passed';
} else {
- resultEl.className = 'failed';
+ resultEl.classList.add('failed');
resultEl.innerText = 'FAILED';
var preEl = document.createElement('pre');
@@ -430,9 +442,14 @@
testRunner.loadSuites();
}
+ function runSuites() {
+ testRunner.run();
+ }
+
return {
showCondensed: showCondensed,
testSuite: testSuite,
+ runSuites: runSuites,
Suites: Suites
};
});
diff --git a/trace-viewer/src/cc/layer_tree_quad_stack_viewer.js b/trace-viewer/src/cc/layer_tree_quad_stack_viewer.js
index 5c7fa3e..3166787 100644
--- a/trace-viewer/src/cc/layer_tree_quad_stack_viewer.js
+++ b/trace-viewer/src/cc/layer_tree_quad_stack_viewer.js
@@ -34,7 +34,7 @@
__proto__: HTMLDivElement.prototype,
decorate: function() {
- this.pictureAsImage_ = {}; // Maps picture.guid to PictureAsImage.
+ this.pictureAsCanvas_ = {}; // Maps picture.guid to PictureAsCanvas.
this.quads_ = [];
this.messages_ = [];
this.controls_ = document.createElement('top-controls');
@@ -83,10 +83,10 @@
},
set layerTreeImpl(layerTreeImpl) {
- // FIXME(pdr): We may want to clear pictureAsImage_ here to save memory at
- // the cost of performance. Note that pictureAsImage_ will be
- // cleared when this is destructed, but this view might live
- // for several layerTreeImpls.
+ // FIXME(pdr): We may want to clear pictureAsCanvas_ here to save memory
+ // at the cost of performance. Note that pictureAsCanvas_ will
+ // be cleared when this is destructed, but this view might
+ // live for several layerTreeImpls.
this.layerTreeImpl_ = layerTreeImpl;
this.selection = null;
this.updateContents_();
@@ -168,27 +168,27 @@
continue;
}
- var pictureAsImage = this.pictureAsImage_[picture.guid];
- if (!pictureAsImage) {
+ var pictureAsCanvas = this.pictureAsCanvas_[picture.guid];
+ if (!pictureAsCanvas) {
hasPendingRasterizeImage = true;
- this.pictureAsImage_[picture.guid] =
- cc.PictureAsImage.Pending(this);
+ this.pictureAsCanvas_[picture.guid] =
+ cc.PictureAsCanvas.Pending(this);
picture.rasterize(
{stopIndex: undefined},
- function(pictureAsImage) {
- var picture_ = pictureAsImage.picture;
- this.pictureAsImage_[picture_.guid] = pictureAsImage;
+ function(pictureAsCanvas) {
+ var picture_ = pictureAsCanvas.picture;
+ this.pictureAsCanvas_[picture_.guid] = pictureAsCanvas;
this.scheduleUpdateContents_();
}.bind(this));
continue;
}
- if (pictureAsImage.isPending()) {
+ if (pictureAsCanvas.isPending()) {
hasPendingRasterizeImage = true;
continue;
}
- if (pictureAsImage.error) {
+ if (pictureAsCanvas.error) {
if (!firstPictureError)
- firstPictureError = pictureAsImage.error;
+ firstPictureError = pictureAsCanvas.error;
break;
}
}
@@ -245,11 +245,11 @@
var unitRect = picture.layerRect.asUVRectInside(layer.bounds);
var iq = layerQuad.projectUnitRect(unitRect);
- var pictureAsImage = this.pictureAsImage_[picture.guid];
- if (this.showContents && pictureAsImage.image)
- iq.backgroundImage = pictureAsImage.image;
+ var pictureAsCanvas = this.pictureAsCanvas_[picture.guid];
+ if (this.showContents && pictureAsCanvas.canvas)
+ iq.canvas = pictureAsCanvas.canvas;
else
- iq.backgroundColor = 'rgba(0,0,0,0.1)';
+ iq.canvas = undefined;
iq.stackingGroupId = layerQuad.stackingGroupId;
this.quads_.push(iq);
diff --git a/trace-viewer/src/cc/picture.js b/trace-viewer/src/cc/picture.js
index 6372faa..bcf55a4 100644
--- a/trace-viewer/src/cc/picture.js
+++ b/trace-viewer/src/cc/picture.js
@@ -8,7 +8,7 @@
base.require('base.rect');
base.require('base.raf');
base.require('tracing.trace_model.object_instance');
-base.require('cc.picture_as_image');
+base.require('cc.picture_as_canvas');
base.require('cc.util');
base.exportTo('cc', function() {
@@ -116,12 +116,12 @@
*
* @param {{opt_stopIndex: number, params}} The SkPicture operation to
* rasterize up to. If not defined, the entire SkPicture is rasterized.
- * @param {function(cc.PictureAsImage)} The callback function
- * that is called after rasterization is complete or fails.
+ * @param {function(cc.PictureAsCanvas)} The callback function that is
+ * called after rasterization is complete or fails.
*/
rasterize: function(params, rasterCompleteCallback) {
if (!PictureSnapshot.CanRasterize() || !PictureSnapshot.CanGetOps()) {
- rasterCompleteCallback(new cc.PictureAsImage(
+ rasterCompleteCallback(new cc.PictureAsCanvas(
this, cc.PictureSnapshot.HowToEnablePictureDebugging()));
return;
}
@@ -140,23 +140,19 @@
});
if (raster) {
- var helperCanvas = document.createElement('canvas');
- helperCanvas.width = raster.width;
- helperCanvas.height = raster.height;
- var ctx = helperCanvas.getContext('2d');
+ var canvas = document.createElement('canvas');
+ var ctx = canvas.getContext('2d');
+ canvas.width = raster.width;
+ canvas.height = raster.height;
var imageData = ctx.createImageData(raster.width, raster.height);
imageData.data.set(new Uint8ClampedArray(raster.data));
ctx.putImageData(imageData, 0, 0);
- var img = document.createElement('img');
- img.onload = function() {
- rasterCompleteCallback(new cc.PictureAsImage(this, img));
- }.bind(this);
- img.src = helperCanvas.toDataURL();
+ rasterCompleteCallback(new cc.PictureAsCanvas(this, canvas));
} else {
var error = 'Failed to rasterize picture. ' +
'Your recording may be from an old Chrome version. ' +
'The SkPicture format is not backward compatible.';
- rasterCompleteCallback(new cc.PictureAsImage(this, error));
+ rasterCompleteCallback(new cc.PictureAsCanvas(this, error));
}
}
};
diff --git a/trace-viewer/src/cc/picture_as_canvas.js b/trace-viewer/src/cc/picture_as_canvas.js
new file mode 100644
index 0000000..e3bc2e1
--- /dev/null
+++ b/trace-viewer/src/cc/picture_as_canvas.js
@@ -0,0 +1,53 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.exportTo('cc', function() {
+
+ /**
+ * @constructor
+ */
+ function PictureAsCanvas(picture, errorOrCanvas) {
+ this.picture_ = picture;
+ if (errorOrCanvas instanceof HTMLCanvasElement) {
+ this.error_ = undefined;
+ this.canvas_ = errorOrCanvas;
+ } else {
+ this.error_ = errorOrCanvas;
+ this.canvas_ = undefined;
+ }
+ };
+
+ /**
+ * Creates a new pending PictureAsCanvas (no canvas and no error).
+ *
+ * @return {PictureAsCanvas} a new pending PictureAsCanvas.
+ */
+ PictureAsCanvas.Pending = function(picture) {
+ return new PictureAsCanvas(picture, undefined);
+ };
+
+ PictureAsCanvas.prototype = {
+ get picture() {
+ return this.picture_;
+ },
+
+ get error() {
+ return this.error_;
+ },
+
+ get canvas() {
+ return this.canvas_;
+ },
+
+ isPending: function() {
+ return this.error_ === undefined && this.canvas_ === undefined;
+ }
+ };
+
+ return {
+ PictureAsCanvas: PictureAsCanvas
+ };
+});
diff --git a/trace-viewer/src/cc/picture_as_image.js b/trace-viewer/src/cc/picture_as_image.js
deleted file mode 100644
index d813488..0000000
--- a/trace-viewer/src/cc/picture_as_image.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-'use strict';
-
-base.exportTo('cc', function() {
-
- /**
- * @constructor
- */
- function PictureAsImage(picture, errorOrImage) {
- this.picture_ = picture;
- if (errorOrImage instanceof HTMLElement) {
- this.error_ = undefined;
- this.image_ = errorOrImage;
- } else {
- this.error_ = errorOrImage;
- this.image_ = undefined;
- }
- };
-
- /**
- * Creates a new pending PictureAsImage (no image and no error).
- *
- * @return {PictureAsImage} a new pending PictureAsImage.
- */
- PictureAsImage.Pending = function(picture) {
- return new PictureAsImage(picture, undefined);
- };
-
- PictureAsImage.prototype = {
- get picture() {
- return this.picture_;
- },
-
- get error() {
- return this.error_;
- },
-
- get image() {
- return this.image_;
- },
-
- isPending: function() {
- return this.error_ === undefined && this.image_ === undefined;
- }
- };
-
- return {
- PictureAsImage: PictureAsImage
- };
-});
diff --git a/trace-viewer/src/cc/picture_debugger.css b/trace-viewer/src/cc/picture_debugger.css
index 6680b39..de92c17 100644
--- a/trace-viewer/src/cc/picture_debugger.css
+++ b/trace-viewer/src/cc/picture_debugger.css
@@ -21,7 +21,7 @@
}
picture-debugger > left-panel > picture-info {
- -webkit-flex: 1 0 auto;
+ -webkit-flex: 0 0 auto;
padding-top: 2px;
}
diff --git a/trace-viewer/src/cc/picture_debugger.js b/trace-viewer/src/cc/picture_debugger.js
index 74a7a44..64f6fef 100644
--- a/trace-viewer/src/cc/picture_debugger.js
+++ b/trace-viewer/src/cc/picture_debugger.js
@@ -28,7 +28,7 @@
__proto__: HTMLUnknownElement.prototype,
decorate: function() {
- this.pictureAsImage_ = undefined;
+ this.pictureAsCanvas_ = undefined;
this.leftPanel_ = document.createElement('left-panel');
@@ -115,7 +115,7 @@
this.picture_ = picture;
this.rasterize_();
- this.updateContents_();
+ this.scheduleUpdateContents_();
},
scheduleUpdateContents_: function() {
@@ -137,27 +137,29 @@
}
// Return if picture hasn't finished rasterizing.
- if (!this.pictureAsImage_)
+ if (!this.pictureAsCanvas_)
return;
this.infoBar_.visible = false;
this.infoBar_.removeAllButtons();
- if (this.pictureAsImage_.error) {
+ if (this.pictureAsCanvas_.error) {
this.infoBar_.message = 'Cannot rasterize...';
this.infoBar_.addButton('More info...', function() {
var overlay = new ui.Overlay();
- overlay.textContent = this.pictureAsImage_.error;
+ overlay.textContent = this.pictureAsCanvas_.error;
overlay.visible = true;
overlay.obeyCloseEvents = true;
}.bind(this));
this.infoBar_.visible = true;
}
- // FIXME: There's no reason to store the image src in two places.
- // pictureAsImage_.image could store the src instead of the image.
- var src = this.pictureAsImage_.image ? 'url("' +
- this.pictureAsImage_.image.src + '")' : '';
- this.rasterArea_.style.backgroundImage = src;
+ // FIXME(pdr): Append the canvas instead of using a background image.
+ if (this.pictureAsCanvas_.canvas) {
+ var imageUrl = this.pictureAsCanvas_.canvas.toDataURL();
+ this.rasterArea_.style.backgroundImage = 'url("' + imageUrl + '")';
+ } else {
+ this.rasterArea_.style.backgroundImage = '';
+ }
},
rasterize_: function() {
@@ -168,14 +170,14 @@
}
},
- onRasterComplete_: function(pictureAsImage) {
- this.pictureAsImage_ = pictureAsImage;
+ onRasterComplete_: function(pictureAsCanvas) {
+ this.pictureAsCanvas_ = pictureAsCanvas;
this.scheduleUpdateContents_();
},
onChangeDrawOps_: function() {
this.rasterize_();
- this.updateContents_();
+ this.scheduleUpdateContents_();
}
};
diff --git a/trace-viewer/src/cc/picture_ops_list_view.css b/trace-viewer/src/cc/picture_ops_list_view.css
index 29656f6..90e517e 100644
--- a/trace-viewer/src/cc/picture_ops_list_view.css
+++ b/trace-viewer/src/cc/picture_ops_list_view.css
@@ -34,6 +34,12 @@
max-width: 300px; /* force long strings to wrap */
}
+picture-ops-list-view > .x-list-view .list-item > .elementInfo {
+ color: purple;
+ font-size: small;
+ font-weight: bold;
+}
+
.x-list-view:focus > .list-item[beforeSelection] {
background-color: rgb(171, 217, 202);
outline: 1px dotted rgba(0, 0, 0, 0.1);
diff --git a/trace-viewer/src/cc/picture_ops_list_view.js b/trace-viewer/src/cc/picture_ops_list_view.js
index f65f7b7..c300a00 100644
--- a/trace-viewer/src/cc/picture_ops_list_view.js
+++ b/trace-viewer/src/cc/picture_ops_list_view.js
@@ -12,6 +12,13 @@
base.require('ui.dom_helpers');
base.exportTo('cc', function() {
+ var ANNOTATION = 'Comment';
+ var BEGIN_ANNOTATION = 'BeginCommentGroup';
+ var END_ANNOTATION = 'EndCommentGroup';
+ var ANNOTATION_ID = 'ID: ';
+ var ANNOTATION_CLASS = 'CLASS: ';
+ var ANNOTATION_TAG = 'TAG: ';
+
var constants = cc.constants;
/**
@@ -53,11 +60,30 @@
if (!ops)
return;
+ ops = this.opsTaggedWithAnnotations_(ops);
+
for (var i = 0; i < ops.length; i++) {
var op = ops[i];
var item = document.createElement('div');
+ item.opIndex = op.opIndex;
item.textContent = i + ') ' + op.cmd_string;
+ // Display the element info associated with the op, if available.
+ if (op.elementInfo.tag || op.elementInfo.id || op.elementInfo.class) {
+ var elementInfo = document.createElement('span');
+ elementInfo.classList.add('elementInfo');
+ var tag = op.elementInfo.tag ? op.elementInfo.tag : 'unknown';
+ var id = op.elementInfo.id ? 'id=' + op.elementInfo.id : undefined;
+ var className = op.elementInfo.class ? 'class=' +
+ op.elementInfo.class : undefined;
+ elementInfo.textContent =
+ '<' + tag + (id ? ' ' : '') +
+ (id ? id : '') + (className ? ' ' : '') +
+ (className ? className : '') + '>';
+ item.appendChild(elementInfo);
+ }
+
+ // Display each of the Skia ops.
op.info.forEach(function(info) {
var infoItem = document.createElement('div');
infoItem.textContent = info;
@@ -86,7 +112,7 @@
var op = ops[i];
if (op === this.selectedOp_) {
beforeSelectedOp = false;
- this.selectedOpIndex_ = i;
+ this.selectedOpIndex_ = op.opIndex;
} else if (beforeSelectedOp) {
op.setAttribute('beforeSelection', 'beforeSelection');
} else {
@@ -99,6 +125,70 @@
get selectedOpIndex() {
return this.selectedOpIndex_;
+ },
+
+ /**
+ * Return Skia operations tagged by annotation.
+ *
+ * The ops returned from Picture.getOps() contain both Skia ops and
+ * annotations threaded together. This function removes all annotations
+ * from the list and tags each op with the associated annotations.
+ * Additionally, the last {tag, id, class} is stored as elementInfo on
+ * each op.
+ *
+ * @param {Array} ops Array of Skia operations and annotations.
+ * @return {Array} Skia ops where op.annotations contains the associated
+ * annotations for a given op.
+ */
+ opsTaggedWithAnnotations_: function(ops) {
+ // This algorithm works by walking all the ops and pushing any
+ // annotations onto a stack. When a non-annotation op is found, the
+ // annotations stack is traversed and stored with the op.
+ var annotationGroups = new Array();
+ var opsWithoutAnnotations = new Array();
+ for (var opIndex = 0; opIndex < ops.length; opIndex++) {
+ var op = ops[opIndex];
+ op.opIndex = opIndex;
+ switch (op.cmd_string) {
+ case BEGIN_ANNOTATION:
+ annotationGroups.push(new Array());
+ break;
+ case END_ANNOTATION:
+ annotationGroups.pop();
+ break;
+ case ANNOTATION:
+ annotationGroups[annotationGroups.length - 1].push(op);
+ break;
+ default:
+ var annotations = new Array();
+ var elementInfo = {};
+ annotationGroups.forEach(function(annotationGroup) {
+ elementInfo = {};
+ annotationGroup.forEach(function(annotation) {
+ annotation.info.forEach(function(info) {
+ if (info.indexOf(ANNOTATION_TAG) != -1)
+ elementInfo.tag = info.substring(
+ info.indexOf(ANNOTATION_TAG) +
+ ANNOTATION_TAG.length).toLowerCase();
+ else if (info.indexOf(ANNOTATION_ID) != -1)
+ elementInfo.id = info.substring(
+ info.indexOf(ANNOTATION_ID) +
+ ANNOTATION_ID.length);
+ else if (info.indexOf(ANNOTATION_CLASS) != -1)
+ elementInfo.class = info.substring(
+ info.indexOf(ANNOTATION_CLASS) +
+ ANNOTATION_CLASS.length);
+
+ annotations.push(info);
+ });
+ });
+ });
+ op.annotations = annotations;
+ op.elementInfo = elementInfo;
+ opsWithoutAnnotations.push(op);
+ }
+ }
+ return opsWithoutAnnotations;
}
};
diff --git a/trace-viewer/src/images/chrome-left.png b/trace-viewer/src/images/chrome-left.png
new file mode 100644
index 0000000..8eef2bf
--- /dev/null
+++ b/trace-viewer/src/images/chrome-left.png
Binary files differ
diff --git a/trace-viewer/src/images/chrome-mid.png b/trace-viewer/src/images/chrome-mid.png
new file mode 100644
index 0000000..c67e697
--- /dev/null
+++ b/trace-viewer/src/images/chrome-mid.png
Binary files differ
diff --git a/trace-viewer/src/images/chrome-right.png b/trace-viewer/src/images/chrome-right.png
new file mode 100644
index 0000000..834004a
--- /dev/null
+++ b/trace-viewer/src/images/chrome-right.png
Binary files differ
diff --git a/trace-viewer/src/images/collapse.png b/trace-viewer/src/images/collapse.png
new file mode 100644
index 0000000..c5fb718
--- /dev/null
+++ b/trace-viewer/src/images/collapse.png
Binary files differ
diff --git a/trace-viewer/src/images/expand.png b/trace-viewer/src/images/expand.png
new file mode 100644
index 0000000..8f2d0ef
--- /dev/null
+++ b/trace-viewer/src/images/expand.png
Binary files differ
diff --git a/trace-viewer/src/images/ui-states.png b/trace-viewer/src/images/ui-states.png
new file mode 100644
index 0000000..301cefa
--- /dev/null
+++ b/trace-viewer/src/images/ui-states.png
Binary files differ
diff --git a/trace-viewer/src/tcmalloc/heap_instance_track.js b/trace-viewer/src/tcmalloc/heap_instance_track.js
index 1cf0a48..fb699e8 100644
--- a/trace-viewer/src/tcmalloc/heap_instance_track.js
+++ b/trace-viewer/src/tcmalloc/heap_instance_track.js
@@ -7,7 +7,7 @@
base.requireStylesheet('tcmalloc.heap_instance_track');
base.require('base.sorted_array_utils');
-base.require('tracing.tracks.drawable_track');
+base.require('tracing.tracks.heading_track');
base.require('tracing.tracks.object_instance_track');
base.require('tracing.color_scheme');
base.require('ui');
@@ -20,24 +20,23 @@
/**
* A track that displays heap memory data.
* @constructor
- * @extends {DrawableTrack}
+ * @extends {HeadingTrack}
*/
var HeapInstanceTrack = ui.define(
- 'heap-instance-track', tracing.tracks.DrawableTrack);
+ 'heap-instance-track', tracing.tracks.HeadingTrack);
HeapInstanceTrack.prototype = {
- __proto__: tracing.tracks.DrawableTrack.prototype,
+ __proto__: tracing.tracks.HeadingTrack.prototype,
decorate: function(viewport) {
- tracing.tracks.DrawableTrack.prototype.decorate.call(this, viewport);
+ tracing.tracks.HeadingTrack.prototype.decorate.call(this, viewport);
this.classList.add('heap-instance-track');
this.objectInstance_ = null;
},
set objectInstances(objectInstances) {
- this.invalidate();
if (!objectInstances) {
this.objectInstance_ = [];
return;
@@ -72,33 +71,46 @@
set height(height) {
this.style.height = height;
- this.invalidate();
},
- draw: function(viewLWorld, viewRWorld) {
+ draw: function(type, viewLWorld, viewRWorld) {
+ switch (type) {
+ case tracing.tracks.DrawType.SLICE:
+ this.drawSlices_(viewLWorld, viewRWorld);
+ break;
+ }
+ },
+
+ drawSlices_: function(viewLWorld, viewRWorld) {
var ctx = this.context();
var pixelRatio = window.devicePixelRatio || 1;
var bounds = this.getBoundingClientRect();
+ var width = bounds.width * pixelRatio;
var height = bounds.height * pixelRatio;
// Culling parameters.
var vp = this.viewport;
- var snapshotRadiusWorld = vp.xViewVectorToWorld(height);
- // Snapshots. Has to run in worldspace because ctx.arc gets transformed.
+ // Scale by the size of the largest snapshot.
+ var maxBytes = this.maxBytes_;
+
var objectSnapshots = this.objectInstance_.snapshots;
var lowIndex = base.findLowIndexInSortedArray(
objectSnapshots,
function(snapshot) {
- return snapshot.ts +
- snapshotRadiusWorld;
+ return snapshot.ts;
},
viewLWorld);
+ // Assure that the stack with the left edge off screen still gets drawn
+ if (lowIndex > 0)
+ lowIndex -= 1;
+
for (var i = lowIndex; i < objectSnapshots.length; ++i) {
var snapshot = objectSnapshots[i];
+
var left = snapshot.ts;
- if (left - snapshotRadiusWorld > viewRWorld)
+ if (left > viewRWorld)
break;
var leftView = vp.xWorldToView(left);
if (leftView < 0)
@@ -111,9 +123,12 @@
else
right = objectSnapshots[objectSnapshots.length - 1].ts + 5000;
var rightView = vp.xWorldToView(right);
+ if (rightView > width)
+ rightView = width;
- // Scale by the size of the largest snapshot.
- var maxBytes = this.maxBytes_;
+ // Floor the bounds to avoid a small gap between stacks.
+ leftView = Math.floor(leftView);
+ rightView = Math.floor(rightView);
// Draw a stacked bar graph. Largest item is stored first in the
// heap data structure, so iterate backwards. Likewise draw from
@@ -134,9 +149,10 @@
snapshot.objectInstance.colorId;
ctx.fillStyle = palette[colorId + k];
}
+
var barHeight = height * trace.currentBytes / maxBytes;
ctx.fillRect(leftView, currentY - barHeight,
- rightView - leftView + 1, barHeight);
+ Math.max(rightView - leftView, 1), barHeight);
currentY -= barHeight;
}
}
diff --git a/trace-viewer/src/tcmalloc/tcmalloc_snapshot_view.css b/trace-viewer/src/tcmalloc/tcmalloc_snapshot_view.css
index 6ba8140..8368fa7 100644
--- a/trace-viewer/src/tcmalloc/tcmalloc_snapshot_view.css
+++ b/trace-viewer/src/tcmalloc/tcmalloc_snapshot_view.css
@@ -29,12 +29,12 @@
/* Collapsed state for list element */
.tcmalloc-snapshot-view .collapsed {
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFAAAAVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASd3+7gAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjbQg61aAAAAGklEQVQYV2P4//8/IyOQYMBkMEIBA5yBWzEAD3Mj+VR5R78AAAAASUVORK5CYII=);
+ background-image: url(../images/expand.png);
}
/* Expanded state for list element. Must be located under the collapsed one. */
.tcmalloc-snapshot-view .expanded {
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNtCDrVoAAAAoSURBVChTY2CgKggNDVUHYnsUQ4EC//FhBoIKkI0DKlYAYhmqupsBAMwgJH8K5nKoAAAAAElFTkSuQmCC);
+ background-image: url(../images/collapse.png);
}
/* Allocation size in MB, right-aligned for easier comparison of columns. */
diff --git a/trace-viewer/src/tests.html b/trace-viewer/src/tests.html
index e5cf59b..3ffb1ae 100644
--- a/trace-viewer/src/tests.html
+++ b/trace-viewer/src/tests.html
@@ -32,14 +32,6 @@
}
function launchTests() {
- var format = document.getElementById('short-format');
- format.checked = localStorage.getItem('testing::short-format') === 'true';
- format.addEventListener('click', function(ev) {
- localStorage.setItem('testing::short-format', ev.target.checked);
- base.unittest.showCondensed(ev.target.checked);
- });
- base.unittest.showCondensed(format.checked);
-
var stats = document.getElementById('stats');
var suite = undefined;
@@ -72,6 +64,15 @@
return;
}
+ var format = document.getElementById('short-format');
+ format.checked = localStorage.getItem('testing::short-format') === 'true';
+ format.addEventListener('click', function(ev) {
+ localStorage.setItem('testing::short-format', ev.target.checked);
+ base.unittest.showCondensed(ev.target.checked);
+ base.unittest.runSuites();
+ });
+ base.unittest.showCondensed(format.checked);
+
launchTests();
}
@@ -83,7 +84,7 @@
</head>
<body id="test-harness">
- <h1>Trace-Viewer Tests</h3>
+ <h1><a href='/src/tests.html'>Trace-Viewer Tests</a></h1>
<div id="stats">
<br />
diff --git a/trace-viewer/src/tracing/analysis/analysis_results.js b/trace-viewer/src/tracing/analysis/analysis_results.js
index fc815e9..342a8a6 100644
--- a/trace-viewer/src/tracing/analysis/analysis_results.js
+++ b/trace-viewer/src/tracing/analysis/analysis_results.js
@@ -197,8 +197,13 @@
}
if (opt_duration !== undefined) {
- this.appendTableCellWithTooltip_(table, row, 1,
- tracing.analysis.tsRound(opt_duration) + ' ms', tooltip);
+ if (opt_duration instanceof Array) {
+ this.appendTableCellWithTooltip_(table, row, 1,
+ '[' + opt_duration.join(', ') + ']', tooltip);
+ } else {
+ this.appendTableCellWithTooltip_(table, row, 1,
+ tracing.analysis.tsRound(opt_duration) + ' ms', tooltip);
+ }
} else {
this.appendTableCell_(table, row, 1, '');
}
diff --git a/trace-viewer/src/tracing/analysis/analyze_counters.js b/trace-viewer/src/tracing/analysis/analyze_counters.js
index aa51ba2..25ef76c 100644
--- a/trace-viewer/src/tracing/analysis/analyze_counters.js
+++ b/trace-viewer/src/tracing/analysis/analyze_counters.js
@@ -11,9 +11,10 @@
function analyzeSingleCounterSampleHit(results, counterSampleHit) {
var ctr = counterSampleHit.counter;
var sampleIndex = counterSampleHit.sampleIndex;
+
var values = [];
for (var i = 0; i < ctr.numSeries; ++i)
- values.push(ctr.samples[ctr.numSeries * sampleIndex + i]);
+ values.push(ctr.getSeries(i).getSample(sampleIndex).value);
var table = results.appendTable('analysis-counter-table', 2);
results.appendTableHeader(table, 'Selected counter:');
@@ -22,7 +23,7 @@
table, 'Timestamp', ctr.timestamps[sampleIndex]);
for (var i = 0; i < ctr.numSeries; i++)
- results.appendSummaryRow(table, ctr.seriesNames[i], values[i]);
+ results.appendSummaryRow(table, ctr.getSeries(i).name, values[i]);
}
function analyzeMultipleCounterSampleHits(results, counterSampleHits) {
@@ -34,20 +35,28 @@
hitsByCounter[ctr.guid].push(counterSampleHits[i]);
}
- var table = results.appendTable('analysis-counter-table', 7);
+ var table = results.appendTable('analysis-counter-table', 2);
results.appendTableHeader(table, 'Counters:');
for (var id in hitsByCounter) {
var hits = hitsByCounter[id];
var ctr = hits[0].counter;
+
var sampleIndices = [];
for (var i = 0; i < hits.length; i++)
sampleIndices.push(hits[i].sampleIndex);
var stats = ctr.getSampleStatistics(sampleIndices);
for (var i = 0; i < stats.length; i++) {
+ var samples = [];
+ for (var k = 0; k < sampleIndices.length; ++k)
+ samples.push(ctr.getSeries(i).getSample(sampleIndices[k]).value);
+
results.appendDataRow(
- table, ctr.name + ': ' + ctr.seriesNames[i], undefined,
- undefined, stats[i]);
+ table,
+ ctr.name + ': series(' + ctr.getSeries(i).name + ')',
+ samples,
+ samples.length,
+ stats[i]);
}
}
}
diff --git a/trace-viewer/src/tracing/analysis/analyze_counters_test.js b/trace-viewer/src/tracing/analysis/analyze_counters_test.js
index fa2f851..3b92c52 100644
--- a/trace-viewer/src/tracing/analysis/analyze_counters_test.js
+++ b/trace-viewer/src/tracing/analysis/analyze_counters_test.js
@@ -9,12 +9,13 @@
base.require('tracing.analysis.stub_analysis_results');
base.require('tracing.analysis.analyze_counters');
base.require('tracing.selection');
-base.require('tracing.trace_model');
+base.require('tracing.trace_model.counter');
+base.require('tracing.trace_model.counter_series');
base.unittest.testSuite('tracing.analysis.analyze_counters', function() {
var Counter = tracing.trace_model.Counter;
- var Model = tracing.TraceModel;
- var Thread = tracing.trace_model.Thread;
+ var CounterSeries = tracing.trace_model.CounterSeries;
+
var Selection = tracing.Selection;
var AnalysisView = tracing.analysis.AnalysisView;
var StubAnalysisResults = tracing.analysis.StubAnalysisResults;
@@ -22,29 +23,44 @@
var createSelectionWithCounters = function(numSamples) {
if (numSamples > 2 || numSamples < 1)
throw new Error('This function only supports 1 or 2 samples');
+
var ctr = new Counter(null, 0, '', 'ctr');
- ctr.seriesNames.push('value');
- ctr.seriesColors.push(0);
- ctr.timestamps.push(0, 10);
- ctr.samples.push(0, 10);
+ var series = new CounterSeries('value', 0);
+ ctr.addSeries(series);
+
+ series.addSample(0, 0);
+ series.addSample(10, 10);
var selection = new Selection();
var t1track = {};
selection.addCounterSample(t1track, ctr, 1);
- if (numSamples == 1)
+ if (numSamples === 1)
return selection;
selection.addCounterSample(t1track, ctr, 0);
return selection;
};
+ function createSeries(ctr) {
+ var allocatedSeries = new CounterSeries('bytesallocated', 0);
+ var freeSeries = new CounterSeries('bytesfree', 1);
+
+ ctr.addSeries(allocatedSeries);
+ ctr.addSeries(freeSeries);
+
+ allocatedSeries.addSample(0, 0);
+ allocatedSeries.addSample(10, 25);
+ allocatedSeries.addSample(20, 10);
+
+ freeSeries.addSample(0, 15);
+ freeSeries.addSample(10, 20);
+ freeSeries.addSample(20, 5);
+ }
+
var createSelectionWithTwoSeriesSingleCounter = function() {
var ctr = new Counter(null, 0, 'foo', 'ctr[0]');
- ctr.seriesNames.push('bytesallocated', 'bytesfree');
- ctr.seriesColors.push(0, 1);
- ctr.timestamps.push(0, 10, 20);
- ctr.samples.push(0, 25, 10, 15, 20, 5);
+ createSeries(ctr);
var selection = new Selection();
var t1track = {};
@@ -55,16 +71,10 @@
var createSelectionWithTwoSeriesTwoCounters = function() {
var ctr1 = new Counter(null, 0, '', 'ctr1');
- ctr1.seriesNames.push('bytesallocated', 'bytesfree');
- ctr1.seriesColors.push(0, 1);
- ctr1.timestamps.push(0, 10, 20);
- ctr1.samples.push(0, 25, 10, 15, 20, 5);
+ createSeries(ctr1);
var ctr2 = new Counter(null, 0, '', 'ctr2');
- ctr2.seriesNames.push('bytesallocated', 'bytesfree');
- ctr2.seriesColors.push(0, 1);
- ctr2.timestamps.push(0, 10, 20);
- ctr2.samples.push(0, 25, 10, 15, 20, 5);
+ createSeries(ctr2);
var selection = new Selection();
var t1track = {};
@@ -75,19 +85,34 @@
var createSelectionWithTwoCountersDiffSeriesDiffHits = function() {
var ctr1 = new Counter(null, 0, '', 'a');
- ctr1.seriesNames.push('bytesallocated');
- ctr1.seriesColors.push(0);
- ctr1.timestamps.push(0, 10, 20);
- ctr1.samples.push(0, 25, 10);
+ var allocatedSeries = new CounterSeries('bytesallocated', 0);
+ ctr1.addSeries(allocatedSeries);
+
+ allocatedSeries.addSample(0, 0);
+ allocatedSeries.addSample(10, 25);
+ allocatedSeries.addSample(20, 15);
+
assertEquals('a', ctr1.name);
assertEquals(3, ctr1.numSamples);
assertEquals(1, ctr1.numSeries);
var ctr2 = new Counter(null, 0, '', 'b');
- ctr2.seriesNames.push('bytesallocated', 'bytesfree');
- ctr2.seriesColors.push(0, 1);
- ctr2.timestamps.push(0, 10, 20, 30);
- ctr2.samples.push(0, 25, 10, 15, 20, 5, 25, 0);
+ var allocatedSeries = new CounterSeries('bytesallocated', 0);
+ var freeSeries = new CounterSeries('bytesfree', 1);
+
+ ctr2.addSeries(allocatedSeries);
+ ctr2.addSeries(freeSeries);
+
+ allocatedSeries.addSample(0, 0);
+ allocatedSeries.addSample(10, 25);
+ allocatedSeries.addSample(20, 10);
+ allocatedSeries.addSample(30, 15);
+
+ freeSeries.addSample(0, 20);
+ freeSeries.addSample(10, 5);
+ freeSeries.addSample(20, 25);
+ freeSeries.addSample(30, 0);
+
assertEquals('b', ctr2.name);
assertEquals(4, ctr2.numSamples);
assertEquals(2, ctr2.numSeries);
@@ -121,6 +146,7 @@
var results = new StubAnalysisResults();
tracing.analysis.analyzeSelection(results, selection);
+
assertEquals(1, results.tables.length);
var table = results.tables[0];
assertEquals('Selected counter:', table.tableHeader);
@@ -142,10 +168,10 @@
assertEquals('Counters:', table.tableHeader);
assertEquals(4, table.rows.length);
- assertEquals('ctr1: bytesallocated', table.rows[0].label);
- assertEquals('ctr1: bytesfree', table.rows[1].label);
- assertEquals('ctr2: bytesallocated', table.rows[2].label);
- assertEquals('ctr2: bytesfree', table.rows[3].label);
+ assertEquals('ctr1: series(bytesallocated)', table.rows[0].label);
+ assertEquals('ctr1: series(bytesfree)', table.rows[1].label);
+ assertEquals('ctr2: series(bytesallocated)', table.rows[2].label);
+ assertEquals('ctr2: series(bytesfree)', table.rows[3].label);
});
test('analyzeSelectionWithComplexSeriesTwoCounters', function() {
@@ -158,8 +184,8 @@
assertEquals('Counters:', table.tableHeader);
assertEquals(3, table.rows.length);
- assertEquals('a: bytesallocated', table.rows[0].label);
- assertEquals('b: bytesallocated', table.rows[1].label);
- assertEquals('b: bytesfree', table.rows[2].label);
+ assertEquals('a: series(bytesallocated)', table.rows[0].label);
+ assertEquals('b: series(bytesallocated)', table.rows[1].label);
+ assertEquals('b: series(bytesfree)', table.rows[2].label);
});
});
diff --git a/trace-viewer/src/tracing/constants.js b/trace-viewer/src/tracing/constants.js
new file mode 100644
index 0000000..df821e4
--- /dev/null
+++ b/trace-viewer/src/tracing/constants.js
@@ -0,0 +1,15 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.exportTo('tracing', function() {
+ var constants = {
+ HEADING_WIDTH: 250
+ };
+
+ return {
+ constants: constants
+ };
+});
diff --git a/trace-viewer/src/tracing/importer/linux_perf/android_parser.js b/trace-viewer/src/tracing/importer/linux_perf/android_parser.js
index f9c0168..7486e53 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/android_parser.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/android_parser.js
@@ -9,6 +9,8 @@
* userland.
*/
base.require('tracing.importer.linux_perf.parser');
+base.require('tracing.trace_model.counter_series');
+
base.exportTo('tracing.importer.linux_perf', function() {
var Parser = tracing.importer.linux_perf.Parser;
@@ -139,15 +141,14 @@
var ctr = this.model_.getOrCreateProcess(ppid)
.getOrCreateCounter(category, name);
// Initialize the counter's series fields if needed.
- if (ctr.numSeries == 0) {
- ctr.seriesNames.push('value');
- ctr.seriesColors.push(
- tracing.getStringColorId(ctr.name + '.' + 'value'));
+ if (ctr.numSeries === 0) {
+ ctr.addSeries(new tracing.trace_model.CounterSeries(value,
+ tracing.getStringColorId(ctr.name + '.' + 'value')));
}
- // Add the sample value.
- ctr.timestamps.push(ts);
- ctr.samples.push(value);
+ ctr.series.forEach(function(series) {
+ series.addSample(ts, value);
+ });
break;
diff --git a/trace-viewer/src/tracing/importer/linux_perf/android_parser_test.js b/trace-viewer/src/tracing/importer/linux_perf/android_parser_test.js
index 78287e4..891603d 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/android_parser_test.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/android_parser_test.js
@@ -175,7 +175,8 @@
assertEquals(1, counters.length);
assertEquals('cat1', counters[0].category);
assertEquals('counter1', counters[0].name);
+
assertEquals(1, counters[0].numSamples);
- assertEquals(10, counters[0].getSampleValue(0, 0));
+ assertEquals(10, counters[0].getSeries(0).getSample(0).value);
});
});
diff --git a/trace-viewer/src/tracing/importer/linux_perf/bus_parser.js b/trace-viewer/src/tracing/importer/linux_perf/bus_parser.js
index 3b6af11..c2825d1 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/bus_parser.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/bus_parser.js
@@ -9,6 +9,7 @@
* userland.
*/
base.require('tracing.importer.linux_perf.parser');
+base.require('tracing.trace_model.counter_series');
base.exportTo('tracing.importer.linux_perf', function() {
@@ -52,29 +53,23 @@
var ctr = this.model_.getOrCreateProcess(0)
.getOrCreateCounter(null, 'bus ' + name + ' read');
- // Initialize the counter's series fields if needed.
- if (ctr.numSeries == 0) {
- ctr.seriesNames.push('value');
- ctr.seriesColors.push(
- tracing.getStringColorId(ctr.name + '.' + 'value'));
+ if (ctr.numSeries === 0) {
+ ctr.addSeries(new tracing.trace_model.CounterSeries('value',
+ tracing.getStringColorId(ctr.name + '.' + 'value')));
}
-
- // Add the sample value.
- ctr.timestamps.push(ts);
- ctr.samples.push(r_bw);
+ ctr.series.forEach(function(series) {
+ series.addSample(ts, r_bw);
+ });
ctr = this.model_.getOrCreateProcess(0)
.getOrCreateCounter(null, 'bus ' + name + ' write');
- // Initialize the counter's series fields if needed.
- if (ctr.numSeries == 0) {
- ctr.seriesNames.push('value');
- ctr.seriesColors.push(
- tracing.getStringColorId(ctr.name + '.' + 'value'));
+ if (ctr.numSeries === 0) {
+ ctr.addSeries(new tracing.trace_model.CounterSeries('value',
+ tracing.getStringColorId(ctr.name + '.' + 'value')));
}
-
- // Add the sample value.
- ctr.timestamps.push(ts);
- ctr.samples.push(w_bw);
+ ctr.series.forEach(function(series) {
+ series.addSample(ts, r_bw);
+ });
return true;
}
diff --git a/trace-viewer/src/tracing/importer/linux_perf/bus_parser_test.js b/trace-viewer/src/tracing/importer/linux_perf/bus_parser_test.js
index d7fd69d..b026a1c 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/bus_parser_test.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/bus_parser_test.js
@@ -55,6 +55,6 @@
var counters = m.getAllCounters();
assertEquals(10, counters.length);
- assertEquals(2, counters[0].samples.length);
+ assertEquals(2, counters[0].series[0].samples.length);
});
});
diff --git a/trace-viewer/src/tracing/importer/linux_perf/clock_parser.js b/trace-viewer/src/tracing/importer/linux_perf/clock_parser.js
index 52e5d04..c281524 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/clock_parser.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/clock_parser.js
@@ -9,6 +9,8 @@
* userland.
*/
base.require('tracing.importer.linux_perf.parser');
+base.require('tracing.trace_model.counter_series');
+
base.exportTo('tracing.importer.linux_perf', function() {
var Parser = tracing.importer.linux_perf.Parser;
@@ -41,15 +43,13 @@
var ctr = this.model_.getOrCreateProcess(0)
.getOrCreateCounter(null, name);
// Initialize the counter's series fields if needed.
- if (ctr.numSeries == 0) {
- ctr.seriesNames.push('value');
- ctr.seriesColors.push(
- tracing.getStringColorId(ctr.name + '.' + 'value'));
+ if (ctr.numSeries === 0) {
+ ctr.addSeries(new tracing.trace_model.CounterSeries('value',
+ tracing.getStringColorId(ctr.name + '.' + 'value')));
}
-
- // Add the sample value.
- ctr.timestamps.push(ts);
- ctr.samples.push(rate);
+ ctr.series.forEach(function(series) {
+ series.addSample(ts, rate);
+ });
return true;
}
diff --git a/trace-viewer/src/tracing/importer/linux_perf/clock_parser_test.js b/trace-viewer/src/tracing/importer/linux_perf/clock_parser_test.js
index b1ca21e..be36b50 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/clock_parser_test.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/clock_parser_test.js
@@ -47,6 +47,6 @@
var counters = m.getAllCounters();
assertEquals(1, counters.length);
- assertEquals(10, counters[0].samples.length);
+ assertEquals(10, counters[0].series[0].samples.length);
});
});
diff --git a/trace-viewer/src/tracing/importer/linux_perf/exynos_parser.js b/trace-viewer/src/tracing/importer/linux_perf/exynos_parser.js
index 54b43aa..5a295a9 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/exynos_parser.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/exynos_parser.js
@@ -76,13 +76,13 @@
exynosBusfreqSample: function(name, ts, frequency) {
var targetCpu = this.importer.getOrCreateCpuState(0);
var counter = targetCpu.cpu.getOrCreateCounter('', name);
- if (counter.numSeries == 0) {
- counter.seriesNames.push('frequency');
- counter.seriesColors.push(
- tracing.getStringColorId(counter.name + '.' + 'frequency'));
+ if (counter.numSeries === 0) {
+ counter.addSeries(new tracing.trace_model.CounterSeries('frequency',
+ tracing.getStringColorId(counter.name + '.' + 'frequency')));
}
- counter.timestamps.push(ts);
- counter.samples.push(frequency);
+ counter.series.forEach(function(series) {
+ series.addSample(ts, frequency);
+ });
},
/**
diff --git a/trace-viewer/src/tracing/importer/linux_perf/exynos_parser_test.js b/trace-viewer/src/tracing/importer/linux_perf/exynos_parser_test.js
index 00ac5da..c5e5efe 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/exynos_parser_test.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/exynos_parser_test.js
@@ -41,7 +41,7 @@
var c0 = m.kernel.cpus[0];
assertEquals(0, c0.slices.length);
- assertEquals(3, c0.counters['INT Frequency'].samples.length);
- assertEquals(1, c0.counters['MIF Frequency'].samples.length);
+ assertEquals(3, c0.counters['INT Frequency'].series[0].samples.length);
+ assertEquals(1, c0.counters['MIF Frequency'].series[0].samples.length);
});
});
diff --git a/trace-viewer/src/tracing/importer/linux_perf/mali_parser.js b/trace-viewer/src/tracing/importer/linux_perf/mali_parser.js
index b48a962..059add3 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/mali_parser.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/mali_parser.js
@@ -299,12 +299,13 @@
var value = parseInt(s);
var counter = this.model_.getOrCreateProcess(0).
getOrCreateCounter('DVFS', counterName);
- if (counter.numSeries == 0) {
- counter.seriesNames.push(seriesName);
- counter.seriesColors.push(tracing.getStringColorId(counter.name));
+ if (counter.numSeries === 0) {
+ counter.addSeries(new tracing.trace_model.CounterSeries(seriesName,
+ tracing.getStringColorId(counter.name)));
}
- counter.timestamps.push(ts);
- counter.samples.push(value);
+ counter.series.forEach(function(series) {
+ series.addSample(ts, value);
+ });
},
dvfsEventEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
@@ -342,12 +343,13 @@
var counter = this.model_.getOrCreateProcess(0).
getOrCreateCounter(cat, counterName);
- if (counter.numSeries == 0) {
- counter.seriesNames.push(seriesName);
- counter.seriesColors.push(tracing.getStringColorId(counter.name));
+ if (counter.numSeries === 0) {
+ counter.addSeries(new tracing.trace_model.CounterSeries(seriesName,
+ tracing.getStringColorId(counter.name)));
}
- counter.timestamps.push(ts);
- counter.samples.push(value);
+ counter.series.forEach(function(series) {
+ series.addSample(ts, value);
+ });
return true;
},
diff --git a/trace-viewer/src/tracing/importer/linux_perf/mali_parser_test.js b/trace-viewer/src/tracing/importer/linux_perf/mali_parser_test.js
index 918bbea..6eca952 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/mali_parser_test.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/mali_parser_test.js
@@ -211,7 +211,7 @@
var c0 = counters[0];
assertEquals(c0.name, 'DVFS Frequency');
- assertEquals(2, c0.samples.length);
+ assertEquals(2, c0.series[0].samples.length);
});
test('DVFSVoltageImport', function() {
@@ -229,7 +229,7 @@
var c0 = counters[0];
assertEquals(c0.name, 'DVFS Voltage');
- assertEquals(2, c0.samples.length);
+ assertEquals(2, c0.series[0].samples.length);
});
test('DVFSUtilizationImport', function() {
@@ -247,7 +247,7 @@
var c0 = counters[0];
assertEquals(c0.name, 'DVFS Utilization');
- assertEquals(2, c0.samples.length);
+ assertEquals(2, c0.series[0].samples.length);
});
test('maliHWCImport', function() {
@@ -468,7 +468,7 @@
// all counters should have 1 sample
for (var tI = 0; tI < counters.length; tI++) {
var counter = counters[tI];
- assertEquals(1, counter.samples.length);
+ assertEquals(1, counter.series[0].samples.length);
}
// TODO(sleffler) verify counter names? (not sure if it's worth the effort)
});
diff --git a/trace-viewer/src/tracing/importer/linux_perf/power_parser.js b/trace-viewer/src/tracing/importer/linux_perf/power_parser.js
index 18fe69c..e2238d9 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/power_parser.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/power_parser.js
@@ -8,6 +8,8 @@
* @fileoverview Parses power events in the Linux event trace format.
*/
base.require('tracing.importer.linux_perf.parser');
+base.require('tracing.trace_model.counter_series');
+
base.exportTo('tracing.importer.linux_perf', function() {
var Parser = tracing.importer.linux_perf.Parser;
@@ -43,42 +45,40 @@
return;
}
powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State');
- if (powerCounter.numSeries == 0) {
- powerCounter.seriesNames.push('state');
- powerCounter.seriesColors.push(
- tracing.getStringColorId(powerCounter.name + '.' + 'state'));
+ if (powerCounter.numSeries === 0) {
+ powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
+ tracing.getStringColorId(powerCounter.name + '.' + 'state')));
}
- powerCounter.timestamps.push(ts);
- powerCounter.samples.push(cpuState);
+ powerCounter.series.forEach(function(series) {
+ series.addSample(ts, cpuState);
+ });
},
cpuIdleSlice: function(ts, targetCpuNumber, cpuState) {
var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber);
var powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State');
- if (powerCounter.numSeries == 0) {
- powerCounter.seriesNames.push('state');
- powerCounter.seriesColors.push(
- tracing.getStringColorId(powerCounter.name));
+ if (powerCounter.numSeries === 0) {
+ powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
+ tracing.getStringColorId(powerCounter.name)));
}
// NB: 4294967295/-1 means an exit from the current state
- if (cpuState != 4294967295)
- powerCounter.samples.push(cpuState);
- else
- powerCounter.samples.push(0);
- powerCounter.timestamps.push(ts);
+ var val = (cpuState != 4294967295 ? cpuState : 0);
+ powerCounter.series.forEach(function(series) {
+ series.addSample(ts, val);
+ });
},
cpuFrequencySlice: function(ts, targetCpuNumber, powerState) {
var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber);
var powerCounter =
targetCpu.cpu.getOrCreateCounter('', 'Clock Frequency');
- if (powerCounter.numSeries == 0) {
- powerCounter.seriesNames.push('state');
- powerCounter.seriesColors.push(
- tracing.getStringColorId(powerCounter.name + '.' + 'state'));
+ if (powerCounter.numSeries === 0) {
+ powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
+ tracing.getStringColorId(powerCounter.name + '.' + 'state')));
}
- powerCounter.timestamps.push(ts);
- powerCounter.samples.push(powerState);
+ powerCounter.series.forEach(function(series) {
+ series.addSample(ts, powerState);
+ });
},
/**
diff --git a/trace-viewer/src/tracing/importer/linux_perf/power_parser_test.js b/trace-viewer/src/tracing/importer/linux_perf/power_parser_test.js
index b3b56d5..b9e4421 100644
--- a/trace-viewer/src/tracing/importer/linux_perf/power_parser_test.js
+++ b/trace-viewer/src/tracing/importer/linux_perf/power_parser_test.js
@@ -22,11 +22,11 @@
var c0 = m.kernel.cpus[0];
assertEquals(0, c0.slices.length);
- assertEquals(1, c0.counters['Clock Frequency'].samples.length);
+ assertEquals(1, c0.counters['Clock Frequency'].series[0].samples.length);
var c1 = m.kernel.cpus[1];
assertEquals(0, c1.slices.length);
- assertEquals(2, c1.counters['Clock Frequency'].samples.length);
+ assertEquals(2, c1.counters['Clock Frequency'].series[0].samples.length);
});
test('cpuFrequencyImport', function() {
@@ -45,11 +45,11 @@
var c0 = m.kernel.cpus[0];
assertEquals(0, c0.slices.length);
- assertEquals(2, c0.counters['Clock Frequency'].samples.length);
+ assertEquals(2, c0.counters['Clock Frequency'].series[0].samples.length);
var c1 = m.kernel.cpus[1];
assertEquals(0, c1.slices.length);
- assertEquals(2, c1.counters['Clock Frequency'].samples.length);
+ assertEquals(2, c1.counters['Clock Frequency'].series[0].samples.length);
});
test('cpuIdleImport', function() {
@@ -72,10 +72,10 @@
var c0 = m.kernel.cpus[0];
assertEquals(0, c0.slices.length);
- assertEquals(2, c0.counters['C-State'].samples.length);
+ assertEquals(2, c0.counters['C-State'].series[0].samples.length);
var c1 = m.kernel.cpus[1];
assertEquals(0, c1.slices.length);
- assertEquals(4, c1.counters['C-State'].samples.length);
+ assertEquals(4, c1.counters['C-State'].series[0].samples.length);
});
});
diff --git a/trace-viewer/src/tracing/importer/timeline_stream_importer.js b/trace-viewer/src/tracing/importer/timeline_stream_importer.js
index 715475c..0123179 100644
--- a/trace-viewer/src/tracing/importer/timeline_stream_importer.js
+++ b/trace-viewer/src/tracing/importer/timeline_stream_importer.js
@@ -148,20 +148,22 @@
this.model_.importErrors.push(importError);
return;
}
- if (counter.seriesNames.length == 0) {
- // First time
- counter.seriesNames = counterSeriesNames;
- counter.seriesColors = counterSeriesColors;
+ if (counter.series.length === 0) {
+ for (var i = 0; i < counterSeriesNames.length; ++i) {
+ counter.addSeries(new tracing.trace_model.CounterSeries(
+ counterSeriesNames[i], counterSeriesColors[i]));
+ }
} else {
- if (counter.seriesNames.length != counterSeriesNames.length) {
+ if (counter.series.length != counterSeriesNames.length) {
var importError = 'Streamed counter ' + counterName +
'changed number of seriesNames';
this.model_.importErrors.push(importError);
return;
} else {
- for (var i = 0; i < counter.seriesNames.length; i++) {
- var oldSeriesName = counter.seriesNames[i];
+ for (var i = 0; i < counter.series.length; i++) {
+ var oldSeriesName = counter.series[i].name;
var newSeriesName = counterSeriesNames[i];
+
if (oldSeriesName != newSeriesName) {
var importError = 'Streamed counter ' + counterName +
'series name changed from ' +
@@ -175,10 +177,11 @@
}
for (var c = 0; c < counterValues.length; c++) {
var count = counterValues[c];
- var x = count['t'];
- var y = count['v'];
- counter.timestamps.push(x);
- counter.samples = counter.samples.concat(y);
+ var ts = count['t'];
+ var values = count['v'];
+ for (var i = 0; i < values.length; ++i) {
+ counter.series[i].addSample(ts, values[i]);
+ }
}
modelDirty = true;
}
diff --git a/trace-viewer/src/tracing/importer/timeline_stream_importer_test.js b/trace-viewer/src/tracing/importer/timeline_stream_importer_test.js
index 013a9ef..f12107e 100644
--- a/trace-viewer/src/tracing/importer/timeline_stream_importer_test.js
+++ b/trace-viewer/src/tracing/importer/timeline_stream_importer_test.js
@@ -206,13 +206,16 @@
assertNotUndefined(model.processes[1]);
assertNotUndefined(model.processes[1].counters['streamed.Allocator']);
+
var counter = model.processes[1].counters['streamed.Allocator'];
- assertNotUndefined(counter.samples);
- assertEquals(counter.samples.length, 5);
- assertEquals(counter.seriesNames.length, 1);
- assertEquals(counter.seriesColors.length, 1);
- assertEquals(counter.samples[2], 48);
- assertEquals(counter.timestamps[4], 64);
+ assertNotUndefined(counter.series);
+
+ assertEquals(1, counter.series.length);
+ assertEquals(5, counter.series[0].length);
+
+ assertEquals(48, counter.series[0].getSample(2).value);
+ assertEquals(64, counter.timestamps[4]);
+
assertEquals(model.bounds.min, 2);
assertEquals(model.bounds.max, 64);
});
diff --git a/trace-viewer/src/tracing/importer/trace_event_importer.js b/trace-viewer/src/tracing/importer/trace_event_importer.js
index a157b83..b6e5a07 100644
--- a/trace-viewer/src/tracing/importer/trace_event_importer.js
+++ b/trace-viewer/src/tracing/importer/trace_event_importer.js
@@ -11,6 +11,9 @@
base.require('base.quad');
base.require('tracing.trace_model');
base.require('tracing.color_scheme');
+base.require('tracing.trace_model.instant_event');
+base.require('tracing.trace_model.counter_series');
+
base.exportTo('tracing.importer', function() {
function deepCopy(value) {
@@ -161,32 +164,29 @@
var ctr = this.model_.getOrCreateProcess(event.pid)
.getOrCreateCounter(event.cat, ctr_name);
+
// Initialize the counter's series fields if needed.
- if (ctr.numSeries == 0) {
+ if (ctr.numSeries === 0) {
for (var seriesName in event.args) {
- ctr.seriesNames.push(seriesName);
- ctr.seriesColors.push(
- tracing.getStringColorId(ctr.name + '.' + seriesName));
+ ctr.addSeries(new tracing.trace_model.CounterSeries(seriesName,
+ tracing.getStringColorId(ctr.name + '.' + seriesName)));
}
- if (ctr.numSeries == 0) {
+
+ if (ctr.numSeries === 0) {
this.model_.importErrors.push('Expected counter ' + event.name +
' to have at least one argument to use as a value.');
+
// Drop the counter.
delete ctr.parent.counters[ctr.name];
return;
}
}
- // Add the sample values.
- ctr.timestamps.push(event.ts / 1000);
- for (var i = 0; i < ctr.numSeries; i++) {
- var seriesName = ctr.seriesNames[i];
- if (event.args[seriesName] === undefined) {
- ctr.samples.push(0);
- continue;
- }
- ctr.samples.push(event.args[seriesName]);
- }
+ var ts = event.ts / 1000;
+ ctr.series.forEach(function(series) {
+ var val = event.args[series.name] ? event.args[series.name] : 0;
+ series.addSample(ts, val);
+ });
},
processObjectEvent: function(event) {
@@ -257,11 +257,44 @@
// Treat an Instant event as a duration 0 slice.
// SliceTrack's redraw() knows how to handle this.
processInstantEvent: function(event) {
- var thread = this.model_.getOrCreateProcess(event.pid)
- .getOrCreateThread(event.tid);
- thread.sliceGroup.beginSlice(event.cat, event.name, event.ts / 1000,
- this.deepCopyIfNeeded_(event.args));
- thread.sliceGroup.endSlice(event.ts / 1000);
+ var constructor;
+ switch (event.s) {
+ case 'g':
+ constructor = tracing.trace_model.GlobalInstantEvent;
+ break;
+ case 'p':
+ constructor = tracing.trace_model.ProcessInstantEvent;
+ break;
+ case 't':
+ // fall through
+ default:
+ // Default to thread to support old style input files.
+ constructor = tracing.trace_model.ThreadInstantEvent;
+ break;
+ }
+
+ var colorId = tracing.getStringColorId(event.name);
+ var instantEvent = new constructor(event.cat, event.name,
+ colorId, event.ts / 1000, this.deepCopyIfNeeded_(event.args));
+
+ switch (instantEvent.type) {
+ case tracing.trace_model.InstantEventType.GLOBAL:
+ this.model_.pushInstantEvent(instantEvent);
+ break;
+
+ case tracing.trace_model.InstantEventType.PROCESS:
+ var process = this.model_.getOrCreateProcess(event.pid);
+ process.pushInstantEvent(instantEvent);
+ break;
+
+ case tracing.trace_model.InstantEventType.THREAD:
+ var thread = this.model_.getOrCreateProcess(event.pid)
+ .getOrCreateThread(event.tid);
+ thread.sliceGroup.pushInstantEvent(instantEvent);
+ break;
+ default:
+ throw new Error('Unknown instant event type: ' + event.s);
+ }
},
processSampleEvent: function(event) {
diff --git a/trace-viewer/src/tracing/importer/trace_event_importer_test.js b/trace-viewer/src/tracing/importer/trace_event_importer_test.js
index 4b8b161..5cd9c95 100644
--- a/trace-viewer/src/tracing/importer/trace_event_importer_test.js
+++ b/trace-viewer/src/tracing/importer/trace_event_importer_test.js
@@ -452,6 +452,7 @@
var m = new tracing.TraceModel(events, false);
var p = m.processes[1];
var t = p.threads[1];
+
assertEquals(3, t.sliceGroup.length);
assertEquals(0.002, t.sliceGroup.slices[0].start);
assertEquals(0, t.sliceGroup.slices[0].duration);
@@ -469,14 +470,12 @@
assertEquals('bar', immed.category);
assertEquals(0.002, immed.start);
assertEquals(0, immed.duration);
- assertEquals(0, immed.subSlices.length);
var slower = findSliceNamed(t.sliceGroup, 'slower');
assertEquals('slower', slower.title);
assertEquals('baz', slower.category);
assertEquals(0.004, slower.start);
assertEquals(0, slower.duration);
- assertEquals(0, slower.subSlices.length);
});
test('simpleCounter', function() {
@@ -498,11 +497,17 @@
assertEquals(3, ctr.numSamples);
assertEquals(1, ctr.numSeries);
- assertArrayEquals(['value'], ctr.seriesNames);
- assertArrayEquals([tracing.getStringColorId('ctr.value')],
- ctr.seriesColors);
+ assertEquals('value', ctr.series[0].name);
+ assertEquals(tracing.getStringColorId('ctr.value'), ctr.series[0].color);
+
assertArrayEquals([0, 0.01, 0.02], ctr.timestamps);
- assertArrayEquals([0, 10, 0], ctr.samples);
+
+ var samples = [];
+ ctr.series[0].samples.forEach(function(sample) {
+ samples.push(sample.value);
+ });
+ assertArrayEquals([0, 10, 0], samples);
+
assertArrayEquals([0, 10, 0], ctr.totals);
assertEquals(10, ctr.maxTotal);
});
@@ -529,41 +534,70 @@
assertEquals('foo', ctr.category);
assertEquals(2, ctr.numSamples);
assertEquals(1, ctr.numSeries);
- assertArrayEquals([0, 0.01], ctr.timestamps);
- assertArrayEquals([0, 10], ctr.samples);
- var ctr = m.processes[1].counters['foo.ctr[1]'];
+ assertArrayEquals([0, 0.01], ctr.timestamps);
+ var samples = [];
+ ctr.series[0].samples.forEach(function(sample) {
+ samples.push(sample.value);
+ });
+ assertArrayEquals([0, 10], samples);
+
+ ctr = m.processes[1].counters['foo.ctr[1]'];
assertEquals('ctr[1]', ctr.name);
assertEquals('foo', ctr.category);
assertEquals(3, ctr.numSamples);
assertEquals(1, ctr.numSeries);
assertArrayEquals([0.01, 0.015, 0.018], ctr.timestamps);
- assertArrayEquals([10, 20, 30], ctr.samples);
- var ctr = m.processes[1].counters['bar.ctr[2]'];
+ samples = [];
+ ctr.series[0].samples.forEach(function(sample) {
+ samples.push(sample.value);
+ });
+ assertArrayEquals([10, 20, 30], samples);
+
+ ctr = m.processes[1].counters['bar.ctr[2]'];
assertEquals('ctr[2]', ctr.name);
assertEquals('bar', ctr.category);
assertEquals(1, ctr.numSamples);
assertEquals(1, ctr.numSeries);
assertArrayEquals([0.02], ctr.timestamps);
- assertArrayEquals([40], ctr.samples);
+ var samples = [];
+ ctr.series[0].samples.forEach(function(sample) {
+ samples.push(sample.value);
+ });
+ assertArrayEquals([40], samples);
});
test('multiCounterUpdateBounds', function() {
var ctr = new tracing.trace_model.Counter(undefined, 'testBasicCounter',
'', 'testBasicCounter');
- ctr.seriesNames = ['value1', 'value2'];
- ctr.seriesColors = ['testBasicCounter.value1', 'testBasicCounter.value2'];
- ctr.timestamps = [0, 1, 2, 3, 4, 5, 6, 7];
- ctr.samples = [0, 0,
- 1, 0,
- 1, 1,
- 2, 1.1,
- 3, 0,
- 1, 7,
- 3, 0,
- 3.1, 0.5];
+ var value1Series = new tracing.trace_model.CounterSeries(
+ 'value1', 'testBasicCounter.value1');
+ var value2Series = new tracing.trace_model.CounterSeries(
+ 'value2', 'testBasicCounter.value2');
+ ctr.addSeries(value1Series);
+ ctr.addSeries(value2Series);
+
+ value1Series.addSample(0, 0);
+ value1Series.addSample(1, 1);
+ value1Series.addSample(2, 1);
+ value1Series.addSample(3, 2);
+ value1Series.addSample(4, 3);
+ value1Series.addSample(5, 1);
+ value1Series.addSample(6, 3);
+ value1Series.addSample(7, 3.1);
+
+ value2Series.addSample(0, 0);
+ value2Series.addSample(1, 0);
+ value2Series.addSample(2, 1);
+ value2Series.addSample(3, 1.1);
+ value2Series.addSample(4, 0);
+ value2Series.addSample(5, 7);
+ value2Series.addSample(6, 0);
+ value2Series.addSample(7, 0.5);
+
ctr.updateBounds();
+
assertEquals(0, ctr.bounds.min);
assertEquals(7, ctr.bounds.max);
assertEquals(8, ctr.maxTotal);
@@ -593,14 +627,23 @@
assertEquals(3, ctr.numSamples);
assertEquals(2, ctr.numSeries);
- assertArrayEquals(['value1', 'value2'], ctr.seriesNames);
- assertArrayEquals([tracing.getStringColorId('ctr.value1'),
- tracing.getStringColorId('ctr.value2')],
- ctr.seriesColors);
+ assertEquals('value1', ctr.series[0].name);
+ assertEquals('value2', ctr.series[1].name);
+ assertEquals(tracing.getStringColorId('ctr.value1'), ctr.series[0].color);
+ assertEquals(tracing.getStringColorId('ctr.value2'), ctr.series[1].color);
+
assertArrayEquals([0, 0.01, 0.02], ctr.timestamps);
- assertArrayEquals([0, 7,
- 10, 4,
- 0, 1], ctr.samples);
+ var samples = [];
+ ctr.series[0].samples.forEach(function(sample) {
+ samples.push(sample.value);
+ });
+ assertArrayEquals([0, 10, 0], samples);
+
+ var samples1 = [];
+ ctr.series[1].samples.forEach(function(sample) {
+ samples1.push(sample.value);
+ });
+ assertArrayEquals([7, 4, 1], samples1);
assertArrayEquals([0, 7,
10, 14,
0, 1], ctr.totals);
diff --git a/trace-viewer/src/tracing/mouse_mode_constants.js b/trace-viewer/src/tracing/mouse_mode_constants.js
new file mode 100644
index 0000000..f2accf6
--- /dev/null
+++ b/trace-viewer/src/tracing/mouse_mode_constants.js
@@ -0,0 +1,17 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.exportTo('tracing', function() {
+
+ var mouseModeConstants = {};
+ mouseModeConstants.MOUSE_MODE_SELECTION = 1;
+ mouseModeConstants.MOUSE_MODE_PANSCAN = 2;
+ mouseModeConstants.MOUSE_MODE_ZOOM = 3;
+
+ return {
+ mouseModeConstants: mouseModeConstants
+ };
+});
diff --git a/trace-viewer/src/tracing/selection.js b/trace-viewer/src/tracing/selection.js
index 14a149c..9a95685 100644
--- a/trace-viewer/src/tracing/selection.js
+++ b/trace-viewer/src/tracing/selection.js
@@ -54,7 +54,6 @@
this.track.selectedSamples[this.sampleIndex] = true;
else
this.track.selectedSamples[this.sampleIndex] = false;
- this.track.invalidate();
},
addBoundsToRange: function(range) {
diff --git a/trace-viewer/src/tracing/timeline_track_view.css b/trace-viewer/src/tracing/timeline_track_view.css
index 5dfb2b9..9113491 100644
--- a/trace-viewer/src/tracing/timeline_track_view.css
+++ b/trace-viewer/src/tracing/timeline_track_view.css
@@ -8,8 +8,8 @@
cursor: default;
}
-.timeline-track-view.mode-panscan {
- cursor: move;
+.timeline-track-view .tool-button {
+ cursor: pointer;
}
.timeline-track-view {
@@ -17,10 +17,6 @@
display: -webkit-box;
}
-.timeline-track-view heading {
- width: 250px;
-}
-
.timeline-track-view .mode-indicator {
height: 32px;
position: absolute;
@@ -29,16 +25,6 @@
width: 33px;
}
-.timeline-track-view.mode-selection .mode-indicator {
- background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAABACAYAAACunKHjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABR0RVh0Q3JlYXRpb24gVGltZQA3LzkvMTM2Qb6aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAABWdJREFUeJztm01IG2kcxp933rGKM+6WNUiPfpGT2LrYS4W6lz30sD2pCYriyYIrJgE9lILbLaliC1LBj0uLouRWKWUPIntxD3qpLmgFcUvXS8BDm8TNmtq047x7iG+cZNJtrfMRk/xgZMwM8/7nyfP8Z94kQxhjKAAIdheQLYgAQAjh/5OmpqZqURR/FQThJwDf2FaZOURVVf1NUZRfVlZW/gbAAIAxBsIY40KQa9euXS0uLv4duSdAOtF4PP7j6urqCwBMKwRpbGx0SpL0ghBSZneVVsAY+zcWi11dW1v7izHGeI+gJSUl9/JFBAAghJSVlJTcA0CB4x4BoJhSeiPfriCU0hsAigEo3BEXAOSNGzSUIXHuSUcI+eYGDULyT4GCEEl4NJDH0QBQcESSgiOOKTjimKQQjLEzL6qqYmZmBjU1NYYcz4pFJ4QRqKqK2tpaTExMoLW11chDm46hQnCFZVmGx+PB8PAwJEkycgjTMDQa6Q33+vXrWFhYwOXLl22PgKXRyIQsy5icnER/f39WX5lMdYQWl8uF2dnZrGukOiGswOl0YmpqCm1tbVYO+0VY5giOLMvwer0YGRmBJEn56Qgtzc3NePbsGRoaGuwqIQVb7yxlWcbU1BQ8Ho/tjdTyaGTC7XZjbm4OtbW1+ReNdJxOJ6anp+FyuWwZPyscwZFlGT6fD6Ojo5Y1Up0Q2URzczOeP39uaSM13BFGLZIkYXp6Gh6PB6qqmu4IMaM8Z0BV1S/a7+DgAH19fVhfX8+4nRACQRAgiiJE0fAydRj6CdVp+oQkSbh//z7a29sRi8Uy7kMIASHEkNo+h+E9QlXVjEswGMT29nbKa5cuXUJPTw8opcl3XrtQSiEIgvbbetOwRIhoNAqv14vR0VHdtra2Nly5csXoMk6NJc3S5/Ph9evX2NjYQCAQ0G2/c+cOSktLbWnKOiGMIv0dHxoawsbGBoqKiiCKIh4/foxgMJiyT0VFBbq7uy3pBZ/CcEdoTzAQCGBxcRGU0mTje/fuHe7evasTrKWlBfX19bnjCD7A8vIyxsfHIYoiBCExDCEElFJsbm5ieXlZV9Tt27dtc4Up0djZ2YHf70dRUVFSBA4Xw+/3IxqN6iLS1dVldElfhOHRiEaj6O3txeHhYfKyl74Pj8jY2JguIl1dXaiqqjrf0SCEoL+/H+/fv0/2hU/tRynF0tIS1tfXdcUNDg5aHhFDHUEIwe7uLiilnz0mF2N4eFgXkerqanR0dJxvR5zmTlAQBLx58wZPnjzRRaSzsxNVVVVGlvf/tfAVqzKZ/m4IgoCFhQW8evVKt31gYMDUmadpjvga+AxzZGRE54rKykp0dHRYUwdfscMR6b1lZmZGJ0Z7ezscDkfuOwI4uYrMz89jb29PV6zP50sp2gyyQgjgJCIPHjzQuaKurg43b940d3y+Ymc0tBHZ2trC06dPdWK43W4cHR3ldjQ4PCKBQACxWCylYD5NN4uscgQ/0cPDQzx8+FBXrJnNkj+mUF5XV/fWNLlPCWMMiqJAUZRksZTSjJO4s7K1teVgjIWy9ueF6XMV7QTODMz/nPwr4f3CKrLWEVaTVVcNOykIcYw2GgcAZBtrsYMDvsIdoX78+PEPm4qxjeNzVoETR3yIRCKPHA7HD4SQ8/FT2TPCGItFIpFHAD4AJ46Ih0Khl+Fw+BZjLPM3sjkEYywWDodvhUKhlwDiwMmdJUHisT/HxYsXvy8vL/9ZFMWmXHMHYyymKMpKKBSa3N/f/xPAWwBxxhhLeSQaCTG+BfAdEo1TPH49F2AAFCQaZBjAP0i4gTGW+mw4kDhpioQgF5B7l1cViZ4QB3AEzUPy/wFLs9ZeouNzXgAAAABJRU5ErkJggg==);
- background-size: 33px 32px;
-}
-
-.timeline-track-view.mode-panscan .mode-indicator {
- background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAABACAYAAACunKHjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABR0RVh0Q3JlYXRpb24gVGltZQA3LzkvMTM2Qb6aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAABipJREFUeJztm09oE1kcxz9v/qQlHXdlW2zxuNq9CUn9c7AiC7JoCQsehMSbEKVC0RwET0K71YOHIoKmgqHYi1IEteBByl4sUglqt7S97WG9SbBN67pNtTWZt4d0xjSpNknjm6J+YEpn8t7Mb375zu/93i9vhJSS74DmtQGbBQNACOHsi/b29p8Nw/hD07TfgR88s+zL8Na27YfZbLZ7bGzsH0ACSCkRUkrHEWL//v176+rq/uTrc0Axb5eWln57+vTpc0AWOkLs2bPnl4aGhudCiC1eW6kCKeV/mUxm74sXL/6WUkonRuj19fW934oTAIQQW+rr63sBHVZiBFCn63rHtzaC6LreAdQBWUcRPsAzNezcuZNAIODFpbeQv3dXEZpXapBS0tXVhWVZRKPRwhFMFZr7x0va29sJBoO0trZy+PBhz+zw1BG2bROLxdz9WCyG3+/3xBbXEVJK5duJEydoaWlxjbEsi2PHjmHbtjIbShyhGr/fTzgcLjkejUZpbm5Wbo8nirBtmzNnzmBZ1ppGnT17VpkqShyhkh07dhAKhT75+cGDB5UPp8oVURwgP0UsFlOiihJHqOLAgQO0tbWt2661tZUjR44osCiPsX6T2iGlZHR0lLa2NnK5HLZtMz09varNrl270DQNXdcxTRPDMJQkWa4jCmXyJRFCYJompmmSzWZLPvf5fBhG3ixN05TZplQRkL855wbXwjAM1xEqUa6IQta6ZnEQU4Xnc43NwndFrPBdESvUzBGfyxS/FOXkI+Wy4cwyEAgQj8e5cOECuVyu6syuUjtyuRzxeJx4PE5zc/OGM8uqx6mWlhZOnjzpKqHaZ7vaeOBcLxgM8uDBA4aGhhgYGGBhYaGq81UcLC3LIhwOE4lEsCxrVT/btj+bIxSzlvPKdagzD3EIh8OEQiESiQR3794t2wYH53eNxn379s2u17ijo4NTp06tKqZsRlKpFBcvXmRiYmLdts+ePWuSUqbLUkQwGCQajRIMBoH8t7GZ2bZtG9euXWNiYoJLly6RSqXW7VNWjMjlcvj9fk/G943Q0NBQdg20LEWMj48TiUQIhUKcP3/+k5WlzcLCwgI3btxgaGgIn8+Hruvr9ilLEc6JHj16xOPHjzl+/DidnZ0l7YLBYEVTZillyXNc7jnW6gtw584dbt68ybt37zBNs+zgXZYjhBAYhoGmaSwvLzMwMMDDhw/p6elh9+7dbrtyve/g5B2FlHuO4r7j4+P09PTw+vVrt5ZRyQhW0fAphEDTNEzTZHZ2ltOnTxMIBOju7mb79u1uQaVcnNJdIeWew+n76tUrrly5wpMnTzAMA9M0EUIghKgoplWcUDkXcZwyPT3N0aNHiUQiVVWSqg3AQggSiQSJRAJd1/H5fGiaVnU1a0OzT+fCQgju3buHpmkVnWcjCRXArVu3ME0TXdddB1Tr2A2Xgpz4sZKYVdy/2pyk8EuoBTWriVVr0EZyk1oWdT0vzBQrwqvCjPoqaRGbJVv1XBEbCZa1xHNFbJYJ3HdFrOC5Ir7ZGHHo0CHOnTvn7hc/GiMjI+7/vb29JJNJJXYpLedLKRkZGWFycnLdourk5CRjY2PKviCljnAywevXr6/riMuXL7t9VKB8oYgQgpcvXzI4OIht22tug4ODzMzMuDPIL7mVOEIVQgh0XWd4eJhUKlViWCqVYnh4eNVESgWeLCYDWFxcpL+/v0QN/f39LC4uKrOpxBEqcVSRTCaZmppyj09NTZFMJpWrATxccAr5qXRfXx+ZTAaAvr6+VatkVCrC04RK0zRmZ2e5f/8+ADMzM56slgGPU2zIPya3b9/Gsiyla6aK8TzFdipN79+/r6jqXGs8dwSoS5o+R+GjsQBs7p+wao+7hsDRov3hw4dRj4zxjJV7tuGjIpbn5+evNjU1/SqEaPDONHVIKTPz8/NXgWX4qIildDo9PTc31ymlzHhnnhqklJm5ubnOdDo9DSzBx4Uigvxrf01bt25ta2xs7DIMo/1rU4eUMpPNZsfS6XT8zZs3fwGzwJKUUq56JZq8M34EfiIfOI2V418DEsiSD5BzwL/k1SClXP1uOORvWifvEB9f3zpMm3xMWAJyFLwk/z8A3jc7RUU1LgAAAABJRU5ErkJggg==);
- background-size: 33px 32px;
-}
-
.model-track-container {
-webkit-box-flex: 1;
overflow: auto;
diff --git a/trace-viewer/src/tracing/timeline_track_view.js b/trace-viewer/src/tracing/timeline_track_view.js
index d56377d..454e74e 100644
--- a/trace-viewer/src/tracing/timeline_track_view.js
+++ b/trace-viewer/src/tracing/timeline_track_view.js
@@ -20,21 +20,23 @@
*/
base.requireStylesheet('tracing.timeline_track_view');
base.require('base.events');
+base.require('base.properties');
base.require('base.settings');
base.require('tracing.filter');
base.require('tracing.selection');
base.require('tracing.timeline_viewport');
+base.require('tracing.mouse_mode_constants');
base.require('tracing.tracks.drawing_container');
base.require('tracing.tracks.trace_model_track');
base.require('tracing.tracks.ruler_track');
base.require('ui');
+base.require('ui.mouse_mode_selector');
base.exportTo('tracing', function() {
var Selection = tracing.Selection;
var Viewport = tracing.TimelineViewport;
- var MOUSE_MODE_SELECTION = 1;
- var MOUSE_MODE_PANSCAN = 2;
+ var MIN_SELECTION_DISTANCE = 4;
function intersectRect_(r1, r2) {
var results = new Object;
@@ -95,156 +97,52 @@
this.modelTrack_ = new tracing.tracks.TraceModelTrack(this.viewport_);
this.modelTrackContainer_.appendChild(this.modelTrack_);
- this.modeIndicator_ = this.ownerDocument.createElement('div');
- this.modeIndicator_.className = 'mode-indicator';
- this.modeIndicator_.addEventListener('click',
- this.toggleMouseMode_.bind(this));
- this.appendChild(this.modeIndicator_);
+ this.mouseModeSelector_ = new ui.MouseModeSelector(this);
+ this.appendChild(this.mouseModeSelector_);
this.dragBox_ = this.ownerDocument.createElement('div');
this.dragBox_.className = 'drag-box';
this.appendChild(this.dragBox_);
this.hideDragBox_();
- this.bindEventListener_(document, 'mousemove', this.onMouseMove_, this);
- this.bindEventListener_(document, 'mouseup', this.onMouseUp_, this);
this.bindEventListener_(document, 'keypress', this.onKeypress_, this);
+
+ this.bindEventListener_(document, 'beginpan', this.onBeginPanScan_, this);
+ this.bindEventListener_(document, 'updatepan',
+ this.onUpdatePanScan_, this);
+ this.bindEventListener_(document, 'endpan', this.onEndPanScan_, this);
+
+ this.bindEventListener_(document, 'beginselection',
+ this.onBeginSelection_, this);
+ this.bindEventListener_(document, 'updateselection',
+ this.onUpdateSelection_, this);
+ this.bindEventListener_(document, 'endselection',
+ this.onEndSelection_, this);
+
+ this.bindEventListener_(document, 'beginzoom', this.onBeginZoom_, this);
+ this.bindEventListener_(document, 'updatezoom', this.onUpdateZoom_, this);
+ this.bindEventListener_(document, 'endzoom', this.onEndZoom_, this);
+
this.bindEventListener_(document, 'keydown', this.onKeydown_, this);
this.bindEventListener_(document, 'keyup', this.onKeyup_, this);
- this.addEventListener('mousewheel', this.onMouseWheel_);
- this.addEventListener('mousedown', this.onMouseDown_);
+ this.addEventListener('mousemove', this.onMouseMove_);
this.addEventListener('dblclick', this.onDblClick_);
- this.mouseViewPosAtMouseDown = {x: 0, y: 0};
+ this.mouseViewPosAtMouseDown_ = {x: 0, y: 0};
this.lastMouseViewPos_ = {x: 0, y: 0};
this.selection_ = new Selection();
+
this.isPanningAndScanning_ = false;
- this.isInTemporaryAlternativeMouseMode_ = false;
+ this.isZooming_ = false;
- this.currentMouseMode_ = 0;
-
- this.mouseMode = base.Settings.get('timeline_track_view.mouseMode',
- MOUSE_MODE_SELECTION);
},
- mouseModeHandlers_: {
- selection: {
- down: function(e) {
- var canv = this.modelTrackContainer_.canvas;
- var rect = this.modelTrack_.getBoundingClientRect();
- var canvRect = canv.getBoundingClientRect();
- var inside = rect &&
- e.clientX >= rect.left &&
- e.clientX < rect.right &&
- e.clientY >= rect.top &&
- e.clientY < rect.bottom &&
- e.clientX >= canvRect.left &&
- e.clientX < canvRect.right;
+ distanceCoveredInPanScan_: function(e) {
+ var x = this.lastMouseViewPos_.x - this.mouseViewPosAtMouseDown_.x;
+ var y = this.lastMouseViewPos_.y - this.mouseViewPosAtMouseDown_.y;
- if (!inside)
- return;
-
- var pos = {
- x: e.clientX - canv.offsetLeft,
- y: e.clientY - canv.offsetTop
- };
-
- var wX = this.viewport_.xViewToWorld(pos.x);
-
- this.dragBeginEvent_ = e;
- e.preventDefault();
- },
-
- move: function(e) {
- if (!this.dragBeginEvent_)
- return;
-
- // Update the drag box
- this.dragBoxXStart_ = this.dragBeginEvent_.clientX;
- this.dragBoxXEnd_ = e.clientX;
- this.dragBoxYStart_ = this.dragBeginEvent_.clientY;
- this.dragBoxYEnd_ = e.clientY;
- this.setDragBoxPosition_(this.dragBoxXStart_, this.dragBoxYStart_,
- this.dragBoxXEnd_, this.dragBoxYEnd_, e.shiftKey);
- },
-
- up: function(e) {
- if (!this.dragBeginEvent_)
- return;
-
- // Stop the dragging.
- this.hideDragBox_();
- var eDown = this.dragBeginEvent_ || e;
- this.dragBeginEvent_ = null;
-
- // Figure out extents of the drag.
- var loY = Math.min(eDown.clientY, e.clientY);
- var hiY = Math.max(eDown.clientY, e.clientY);
- var loX = Math.min(eDown.clientX, e.clientX);
- var hiX = Math.max(eDown.clientX, e.clientX);
- var tracksContainer =
- this.modelTrackContainer_.getBoundingClientRect();
- var topBoundary = tracksContainer.height;
-
- // Convert to worldspace.
- var canv = this.modelTrackContainer_.canvas;
- var loVX = loX - canv.offsetLeft;
- var hiVX = hiX - canv.offsetLeft;
-
- // Figure out what has been hit.
- var selection = new Selection();
- this.modelTrack_.addIntersectingItemsInRangeToSelection(
- loVX, hiVX, loY, hiY, selection);
-
- // Activate the new selection, and zoom if ctrl key held down.
- this.selection = selection;
- if ((base.isMac && e.metaKey) || (!base.isMac && e.ctrlKey))
- this.zoomToSelection_();
- },
-
- dblclick: function(e) {
- this.rulerTrack_.placeAndBeginDraggingMarker(e.clientX);
- e.preventDefault();
- },
-
- wheel: function(e) {
- }
- },
-
- panscan: {
- down: function(e) {
- this.beginPanScan_(e);
- },
-
- move: function(e) {
- this.updatePanScan_(e);
- },
-
- up: function(e) {
- this.endPanScan_(e);
- },
-
- dblclick: function(e) {
- },
-
- wheel: function(e) {
- // TODO(aerotwist): Figure out how to do zoom without stealing scroll
- // events.
- if (true)
- return;
-
- var delta = e.wheelDeltaY / 120;
-
- // If wheelDeltaY is zero use wheelDelta instead.
- if (e.wheelDeltaY === 0)
- delta = e.wheelDelta / 120;
-
- var zoomScale = Math.pow(1.5, delta);
- this.zoomBy_(zoomScale);
- e.preventDefault();
- }
- }
+ return Math.sqrt(x * x + y * y);
},
/**
@@ -273,26 +171,6 @@
this.viewport_.detach();
},
- get mouseMode() {
- return this.currentMouseMode_;
- },
-
- set mouseMode(mode) {
- this.currentMouseMode_ = mode;
- this.updateModeIndicator_();
-
- base.Settings.set('timeline_track_view.mouseMode', mode);
- },
-
- get currentMouseModeHandler_() {
- switch (this.mouseMode) {
- case MOUSE_MODE_SELECTION:
- return this.mouseModeHandlers_.selection;
- case MOUSE_MODE_PANSCAN:
- return this.mouseModeHandlers_.panscan;
- }
- },
-
get viewport() {
return this.viewport_;
},
@@ -399,7 +277,18 @@
return true;
},
+ onMouseMove_: function(e) {
+
+ // Zooming requires the delta since the last mousemove so we need to avoid
+ // tracking it when the zoom interaction is active.
+ if (this.isZooming_)
+ return;
+
+ this.storeLastMousePos_(e);
+ },
+
onKeypress_: function(e) {
+ var mouseModeConstants = tracing.mouseModeConstants;
var vp = this.viewport_;
if (!this.listenToKeys_)
return;
@@ -408,9 +297,7 @@
var viewWidth = this.modelTrackContainer_.canvas.clientWidth;
var curMouseV, curCenterW;
switch (e.keyCode) {
- case 32: // space
- this.toggleMouseMode_();
- break;
+
case 119: // w
case 44: // ,
this.zoomBy_(1.5);
@@ -456,27 +343,16 @@
}
},
- onMouseWheel_: function(e) {
- this.currentMouseModeHandler_.wheel.call(this, e);
- },
-
// Not all keys send a keypress.
onKeydown_: function(e) {
if (!this.listenToKeys_)
return;
var sel;
+ var mouseModeConstants = tracing.mouseModeConstants;
var vp = this.viewport_;
var viewWidth = this.modelTrackContainer_.canvas.clientWidth;
switch (e.keyCode) {
- case 16: // shift
- // Prevent the user switching modes during an interaction.
- if (this.isPanningAndScanning_ || this.dragBeginEvent_)
- return;
- this.toggleMouseMode_();
- this.isInTemporaryAlternativeMouseMode_ = true;
- e.preventDefault();
- break;
case 37: // left arrow
sel = this.selection.getShiftedSelection(-1);
if (sel) {
@@ -519,17 +395,6 @@
}
}
- // Prevent the user switching modes during an interaction.
- if (this.isPanningAndScanning_ || this.dragBeginEvent_)
- return;
-
- // If the user has successfully switched mouse modes temporarily and has
- // now released the shift key switch back.
- if (this.isInTemporaryAlternativeMouseMode_ && e.keyCode === 16) {
- this.toggleMouseMode_();
- this.isInTemporaryAlternativeMouseMode_ = false;
- e.preventDefault();
- }
},
/**
@@ -595,11 +460,6 @@
this.viewport_.xPanWorldBoundsIntoView(bounds.min, bounds.max, viewWidth);
},
- toggleMouseMode_: function() {
- this.mouseMode = (this.mouseMode === MOUSE_MODE_SELECTION) ?
- MOUSE_MODE_PANSCAN : MOUSE_MODE_SELECTION;
- },
-
get keyHelp() {
var mod = navigator.platform.indexOf('Mac') == 0 ? 'cmd' : 'ctrl';
var help = 'Qwerty Controls\n' +
@@ -663,23 +523,6 @@
this.viewport_.dispatchChangeEvent(); // Triggers a redraw.
},
- updateModeIndicator_: function() {
- switch (this.currentMouseMode_) {
- case MOUSE_MODE_SELECTION:
- this.classList.remove('mode-panscan');
- this.classList.add('mode-selection');
- this.modeIndicator_.setAttribute('title', 'Selection mode: use the ' +
- 'mouse to select events.');
- break;
- case MOUSE_MODE_PANSCAN:
- this.classList.remove('mode-selection');
- this.classList.add('mode-panscan');
- this.modeIndicator_.setAttribute('title', 'Pan mode: use the mouse ' +
- 'to pan around and scroll to zoom.');
- break;
- }
- },
-
hideDragBox_: function() {
this.dragBox_.style.left = '-1000px';
this.dragBox_.style.top = '-1000px';
@@ -760,43 +603,40 @@
this.viewport_.gridTimebase = tb;
},
- onMouseDown_: function(e) {
+ canBeginInteraction_: function(e) {
if (e.button != 0)
- return;
+ return false;
// Ensure that we do not interfere with the user adding markers.
if (ui.elementIsChildOf(e.target, this.rulerTrack_))
- return;
+ return false;
- this.lastMouseViewPos_ = this.extractRelativeMousePosition(e);
-
- this.mouseViewPosAtMouseDown.x = this.lastMouseViewPos_.x;
- this.mouseViewPosAtMouseDown.y = this.lastMouseViewPos_.y;
-
- this.currentMouseModeHandler_.down.call(this, e);
- e.preventDefault();
-
- if (document.activeElement)
- document.activeElement.blur();
- if (this.focusElement.tabIndex >= 0)
- this.focusElement.focus();
- },
-
- onMouseMove_: function(e) {
- this.lastMouseViewPos_ = this.extractRelativeMousePosition(e);
- this.currentMouseModeHandler_.move.call(this, e);
- },
-
- onMouseUp_: function(e) {
- this.lastMouseViewPos_ = this.extractRelativeMousePosition(e);
- this.currentMouseModeHandler_.up.call(this, e);
+ return true;
},
onDblClick_: function(e) {
- this.currentMouseModeHandler_.dblclick.call(this, e);
+
+ if (this.isPanningAndScanning_) {
+ var endPanEvent = new base.Event('endpan');
+ endPanEvent.data = e;
+ this.onEndPanScan_(endPanEvent);
+ }
+
+ if (this.isZooming_) {
+ var endZoomEvent = new base.Event('endzoom');
+ endZoomEvent.data = e;
+ this.onEndZoom_(endZoomEvent);
+ }
+
+ this.rulerTrack_.placeAndBeginDraggingMarker(e.clientX);
+ e.preventDefault();
},
- extractRelativeMousePosition: function(e) {
+ storeLastMousePos_: function(e) {
+ this.lastMouseViewPos_ = this.extractRelativeMousePosition_(e);
+ },
+
+ extractRelativeMousePosition_: function(e) {
var canv = this.modelTrackContainer_.canvas;
return {
x: e.clientX - canv.offsetLeft,
@@ -804,39 +644,192 @@
};
},
- beginPanScan_: function(e) {
+ storeInitialMouseDownPos_: function(e) {
+
+ var position = this.extractRelativeMousePosition_(e);
+
+ this.mouseViewPosAtMouseDown_.x = position.x;
+ this.mouseViewPosAtMouseDown_.y = position.y;
+ },
+
+ focusElements_: function() {
+ if (document.activeElement)
+ document.activeElement.blur();
+ if (this.focusElement.tabIndex >= 0)
+ this.focusElement.focus();
+ },
+
+ storeInitialInteractionPositionsAndFocus_: function(mouseEvent) {
+
+ this.storeInitialMouseDownPos_(mouseEvent);
+ this.storeLastMousePos_(mouseEvent);
+
+ this.focusElements_();
+ },
+
+ onBeginPanScan_: function(e) {
var vp = this.viewport_;
+ var mouseEvent = e.data;
+
+ if (!this.canBeginInteraction_(mouseEvent))
+ return;
this.viewportStateAtMouseDown_ = vp.getStateInViewCoordinates();
this.isPanningAndScanning_ = true;
+
+ this.storeInitialInteractionPositionsAndFocus_(mouseEvent);
+ mouseEvent.preventDefault();
},
- updatePanScan_: function(e) {
+ onUpdatePanScan_: function(e) {
if (!this.isPanningAndScanning_)
return;
var vp = this.viewport_;
var viewWidth = this.modelTrackContainer_.canvas.clientWidth;
+ var mouseEvent = e.data;
var x = this.viewportStateAtMouseDown_.panX + (this.lastMouseViewPos_.x -
- this.mouseViewPosAtMouseDown.x);
+ this.mouseViewPosAtMouseDown_.x);
var y = this.viewportStateAtMouseDown_.panY - (this.lastMouseViewPos_.y -
- this.mouseViewPosAtMouseDown.y);
+ this.mouseViewPosAtMouseDown_.y);
vp.setStateInViewCoordinates({
panX: x,
panY: y
});
- e.preventDefault();
- e.stopPropagation();
+ mouseEvent.preventDefault();
+ mouseEvent.stopPropagation();
+
+ this.storeLastMousePos_(mouseEvent);
},
- endPanScan_: function(e) {
+ onEndPanScan_: function(e) {
+ var mouseEvent = e.data;
this.isPanningAndScanning_ = false;
- if (this.isInTemporaryAlternativeMouseMode_ && !e.shiftKey)
- this.toggleMouseMode_();
+ this.storeLastMousePos_(mouseEvent);
+
+ if (this.distanceCoveredInPanScan_(mouseEvent) > MIN_SELECTION_DISTANCE)
+ return;
+
+ this.dragBeginEvent_ = mouseEvent;
+ this.onEndSelection_(e);
+
+ },
+
+ onBeginSelection_: function(e) {
+
+ var mouseEvent = e.data;
+
+ if (!this.canBeginInteraction_(mouseEvent))
+ return;
+
+ var canv = this.modelTrackContainer_.canvas;
+ var rect = this.modelTrack_.getBoundingClientRect();
+ var canvRect = canv.getBoundingClientRect();
+
+ var inside = rect &&
+ mouseEvent.clientX >= rect.left &&
+ mouseEvent.clientX < rect.right &&
+ mouseEvent.clientY >= rect.top &&
+ mouseEvent.clientY < rect.bottom &&
+ mouseEvent.clientX >= canvRect.left &&
+ mouseEvent.clientX < canvRect.right;
+
+ if (!inside)
+ return;
+
+ this.dragBeginEvent_ = mouseEvent;
+
+ this.storeInitialInteractionPositionsAndFocus_(mouseEvent);
+ mouseEvent.preventDefault();
+
+ },
+
+ onUpdateSelection_: function(e) {
+ var mouseEvent = e.data;
+
+ if (!this.dragBeginEvent_)
+ return;
+
+ // Update the drag box
+ this.dragBoxXStart_ = this.dragBeginEvent_.clientX;
+ this.dragBoxXEnd_ = mouseEvent.clientX;
+ this.dragBoxYStart_ = this.dragBeginEvent_.clientY;
+ this.dragBoxYEnd_ = mouseEvent.clientY;
+ this.setDragBoxPosition_(this.dragBoxXStart_, this.dragBoxYStart_,
+ this.dragBoxXEnd_, this.dragBoxYEnd_);
+
+ },
+
+ onEndSelection_: function(e) {
+
+ if (!this.dragBeginEvent_)
+ return;
+
+ var mouseEvent = e.data;
+
+ // Stop the dragging.
+ this.hideDragBox_();
+ var eDown = this.dragBeginEvent_ || mouseEvent;
+ this.dragBeginEvent_ = null;
+
+ // Figure out extents of the drag.
+ var loY = Math.min(eDown.clientY, mouseEvent.clientY);
+ var hiY = Math.max(eDown.clientY, mouseEvent.clientY);
+ var loX = Math.min(eDown.clientX, mouseEvent.clientX);
+ var hiX = Math.max(eDown.clientX, mouseEvent.clientX);
+ var tracksContainerBoundingRect =
+ this.modelTrackContainer_.getBoundingClientRect();
+ var topBoundary = tracksContainerBoundingRect.height;
+
+ // Convert to worldspace.
+ var canv = this.modelTrackContainer_.canvas;
+ var loVX = loX - canv.offsetLeft;
+ var hiVX = hiX - canv.offsetLeft;
+
+ // Figure out what has been hit.
+ var selection = new Selection();
+ this.modelTrack_.addIntersectingItemsInRangeToSelection(
+ loVX, hiVX, loY, hiY, selection);
+
+ // Activate the new selection, and zoom if ctrl key held down.
+ this.selection = selection;
+ if ((base.isMac && e.metaKey) || (!base.isMac && e.ctrlKey))
+ this.zoomToSelection_();
+ },
+
+ onBeginZoom_: function(e) {
+
+ var mouseEvent = e.data;
+
+ if (!this.canBeginInteraction_(mouseEvent))
+ return;
+
+ this.isZooming_ = true;
+
+ this.storeInitialInteractionPositionsAndFocus_(mouseEvent);
+ mouseEvent.preventDefault();
+ },
+
+ onUpdateZoom_: function(e) {
+
+ if (!this.isZooming_)
+ return;
+ var mouseEvent = e.data;
+ var newPosition = this.extractRelativeMousePosition_(mouseEvent);
+
+ var zoomScaleValue = 1 + (this.lastMouseViewPos_.y -
+ newPosition.y) * 0.01;
+
+ this.zoomBy_(zoomScaleValue);
+ this.storeLastMousePos_(mouseEvent);
+ },
+
+ onEndZoom_: function(e) {
+ this.isZooming_ = false;
}
};
diff --git a/trace-viewer/src/tracing/timeline_track_view_test.js b/trace-viewer/src/tracing/timeline_track_view_test.js
index b9b7f5f..62efa87 100644
--- a/trace-viewer/src/tracing/timeline_track_view_test.js
+++ b/trace-viewer/src/tracing/timeline_track_view_test.js
@@ -117,8 +117,12 @@
var model = new tracing.TraceModel();
var c1 = model.kernel.getOrCreateCpu(0);
c1.getOrCreateCounter('', 'b');
+
var p1 = model.getOrCreateProcess(1);
- p1.getOrCreateCounter('', 'a').samples = [1];
+ var ctr = p1.getOrCreateCounter('', 'a');
+ var series = new tracing.trace_model.CounterSeries('a', 0);
+ series.addSample(0, 1);
+ ctr.addSeries(series);
var timeline = new tracing.TimelineTrackView();
timeline.model = model;
diff --git a/trace-viewer/src/tracing/timeline_viewport.js b/trace-viewer/src/tracing/timeline_viewport.js
index 2407198..e92742a 100644
--- a/trace-viewer/src/tracing/timeline_viewport.js
+++ b/trace-viewer/src/tracing/timeline_viewport.js
@@ -36,6 +36,8 @@
this.hasCalledSetupFunction_ = false;
this.onResize_ = this.onResize_.bind(this);
+ this.onModelTrackControllerScroll_ =
+ this.onModelTrackControllerScroll_.bind(this);
// The following code uses an interval to detect when the parent element
// is attached to the document. That is a trigger to run the setup function
@@ -148,8 +150,19 @@
this.panY = state.panY;
},
+ onModelTrackControllerScroll_: function(e) {
+ this.panY_ = this.modelTrackContainer_.scrollTop;
+ },
+
set modelTrackContainer(m) {
+
+ if (this.modelTrackContainer_)
+ this.modelTrackContainer_.removeEventListener('scroll',
+ this.onModelTrackControllerScroll_);
+
this.modelTrackContainer_ = m;
+ this.modelTrackContainer_.addEventListener('scroll',
+ this.onModelTrackControllerScroll_);
},
get scaleX() {
diff --git a/trace-viewer/src/tracing/trace_model.js b/trace-viewer/src/tracing/trace_model.js
index 45f85e9..62b318d 100644
--- a/trace-viewer/src/tracing/trace_model.js
+++ b/trace-viewer/src/tracing/trace_model.js
@@ -47,6 +47,7 @@
this.metadata = [];
this.categories = [];
this.bounds = new base.Range();
+ this.instantEvents = [];
if (opt_eventData)
this.importTraces([opt_eventData], opt_shiftWorldToZero);
@@ -84,6 +85,10 @@
return this.processes[pid];
},
+ pushInstantEvent: function(instantEvent) {
+ this.instantEvents.push(instantEvent);
+ },
+
/**
* Generates the set of categories from the slices and counters.
*/
@@ -116,6 +121,8 @@
return;
var timeBase = this.bounds.min;
this.kernel.shiftTimestampsForward(-timeBase);
+ for (var id in this.instantEvents)
+ this.instantEvents[id].start -= timeBase;
for (var pid in this.processes)
this.processes[pid].shiftTimestampsForward(-timeBase);
this.updateBounds();
diff --git a/trace-viewer/src/tracing/trace_model/async_slice.js b/trace-viewer/src/tracing/trace_model/async_slice.js
new file mode 100644
index 0000000..fdf387f
--- /dev/null
+++ b/trace-viewer/src/tracing/trace_model/async_slice.js
@@ -0,0 +1,55 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.require('tracing.trace_model.slice');
+
+/**
+ * @fileoverview Provides the AsyncSlice class.
+ */
+base.exportTo('tracing.trace_model', function() {
+ /**
+ * A AsyncSlice represents an interval of time during which an
+ * asynchronous operation is in progress. An AsyncSlice consumes no CPU time
+ * itself and so is only associated with Threads at its start and end point.
+ *
+ * @constructor
+ */
+ function AsyncSlice(category, title, colorId, start, args) {
+ tracing.trace_model.Slice.apply(this, arguments);
+ };
+
+ AsyncSlice.prototype = {
+ __proto__: tracing.trace_model.Slice.prototype,
+
+ toJSON: function() {
+ var obj = new Object();
+ var keys = Object.keys(this);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (typeof this[key] == 'function')
+ continue;
+ if (key == 'startThread' || key == 'endThread') {
+ obj[key] = this[key].guid;
+ continue;
+ }
+ obj[key] = this[key];
+ }
+ return obj;
+ },
+
+ id: undefined,
+
+ startThread: undefined,
+
+ endThread: undefined,
+
+ subSlices: undefined
+ };
+
+ return {
+ AsyncSlice: AsyncSlice
+ };
+});
diff --git a/trace-viewer/src/tracing/trace_model/async_slice_group.js b/trace-viewer/src/tracing/trace_model/async_slice_group.js
index ace34b8..f1cdf69 100644
--- a/trace-viewer/src/tracing/trace_model/async_slice_group.js
+++ b/trace-viewer/src/tracing/trace_model/async_slice_group.js
@@ -8,50 +8,9 @@
* @fileoverview Provides the AsyncSliceGroup class.
*/
base.require('base.range');
-base.require('tracing.trace_model.slice');
+base.require('tracing.trace_model.async_slice');
+
base.exportTo('tracing.trace_model', function() {
-
- var Slice = tracing.trace_model.Slice;
-
- /**
- * A AsyncSlice represents an interval of time during which an
- * asynchronous operation is in progress. An AsyncSlice consumes no CPU time
- * itself and so is only associated with Threads at its start and end point.
- *
- * @constructor
- */
- function AsyncSlice(category, title, colorId, start, args) {
- Slice.call(this, category, title, colorId, start, args);
- };
-
- AsyncSlice.prototype = {
- __proto__: Slice.prototype,
-
- toJSON: function() {
- var obj = new Object();
- var keys = Object.keys(this);
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- if (typeof this[key] == 'function')
- continue;
- if (key == 'startThread' || key == 'endThread') {
- obj[key] = this[key].guid;
- continue;
- }
- obj[key] = this[key];
- }
- return obj;
- },
-
- id: undefined,
-
- startThread: undefined,
-
- endThread: undefined,
-
- subSlices: undefined
- };
-
/**
* A group of AsyncSlices.
* @constructor
@@ -128,7 +87,6 @@
};
return {
- AsyncSlice: AsyncSlice,
AsyncSliceGroup: AsyncSliceGroup
};
});
diff --git a/trace-viewer/src/tracing/trace_model/async_slice_group_test.js b/trace-viewer/src/tracing/trace_model/async_slice_group_test.js
index 36aebda..aa8915e 100644
--- a/trace-viewer/src/tracing/trace_model/async_slice_group_test.js
+++ b/trace-viewer/src/tracing/trace_model/async_slice_group_test.js
@@ -38,8 +38,8 @@
'{',
' "category" : "",',
' "title" : "a",',
- ' "start" : 0,',
' "colorId" : 0,',
+ ' "start" : 0,',
' "didNotFinish" : false,',
' "duration" : 1,',
' "startThread" : __T1_GUID__,',
@@ -47,8 +47,8 @@
' "subSlices" : [ {',
' "category" : "",',
' "title" : "a",',
- ' "start" : 0,',
' "colorId" : 0,',
+ ' "start" : 0,',
' "didNotFinish" : false,',
' "duration" : 1,',
' "startThread" : __T1_GUID__,',
diff --git a/trace-viewer/src/tracing/trace_model/counter.js b/trace-viewer/src/tracing/trace_model/counter.js
index 7d74aab..833ba59 100644
--- a/trace-viewer/src/tracing/trace_model/counter.js
+++ b/trace-viewer/src/tracing/trace_model/counter.js
@@ -6,6 +6,7 @@
base.require('base.guid');
base.require('base.range');
+base.require('tracing.trace_model.counter_series');
/**
* @fileoverview Provides the Counter class.
@@ -23,10 +24,8 @@
this.id = id;
this.category = category || '';
this.name = name;
- this.seriesNames = [];
- this.seriesColors = [];
- this.timestamps = [];
- this.samples = [];
+
+ this.series_ = [];
this.bounds = new base.Range();
}
@@ -56,16 +55,48 @@
return obj;
},
+ set timestamps(arg) {
+ throw new Error('Bad counter API. No cookie.');
+ },
+
+ set seriesNames(arg) {
+ throw new Error('Bad counter API. No cookie.');
+ },
+
+ set seriesColors(arg) {
+ throw new Error('Bad counter API. No cookie.');
+ },
+
+ set samples(arg) {
+ throw new Error('Bad counter API. No cookie.');
+ },
+
+ addSeries: function(series) {
+ this.series_.push(series);
+ },
+
+ getSeries: function(idx) {
+ return this.series_[idx];
+ },
+
+ get series() {
+ return this.series_;
+ },
+
get numSeries() {
- return this.seriesNames.length;
+ return this.series_.length;
},
get numSamples() {
- return this.timestamps.length;
+ if (this.series_.length === 0)
+ return 0;
+ return this.series_[0].length;
},
- getSampleValue: function(index, seriesIndex) {
- return this.samples[index * this.numSeries + seriesIndex];
+ get timestamps() {
+ if (this.series_.length === 0)
+ return [];
+ return this.series_[0].timestamps;
},
/**
@@ -82,33 +113,11 @@
*/
getSampleStatistics: function(sampleIndices) {
sampleIndices.sort();
- var sampleIndex = this.sampleIndex;
- var numSeries = this.numSeries;
- var numSamples = this.numSamples;
var ret = [];
-
- for (var i = 0; i < numSeries; ++i) {
- var sum = 0;
- var min = Number.MAX_VALUE;
- var max = -Number.MAX_VALUE;
- for (var j = 0; j < sampleIndices.length; j++) {
- var x = sampleIndices[j];
- sum += this.getSampleValue(x, i);
- min = Math.min(this.getSampleValue(x, i), min);
- max = Math.max(this.getSampleValue(x, i), max);
- }
- var avg = sum / sampleIndices.length;
- var start = this.getSampleValue(sampleIndices[0], i);
- var end = this.getSampleValue(
- sampleIndices[sampleIndices.length - 1], i);
-
- ret.push({min: min,
- max: max,
- avg: avg,
- start: start,
- end: end});
- }
+ this.series_.forEach(function(series) {
+ ret.push(series.getStatistics(sampleIndices));
+ });
return ret;
},
@@ -117,40 +126,41 @@
* specified.
*/
shiftTimestampsForward: function(amount) {
- for (var sI = 0; sI < this.timestamps.length; sI++)
- this.timestamps[sI] = (this.timestamps[sI] + amount);
+ for (var i = 0; i < this.series_.length; ++i)
+ this.series_[i].shiftTimestampsForward(amount);
},
/**
* Updates the bounds for this counter based on the samples it contains.
*/
updateBounds: function() {
- if (this.seriesNames.length != this.seriesColors.length)
- throw new Error('seriesNames.length must match seriesColors.length');
- if (this.numSeries * this.numSamples != this.samples.length)
- throw new Error('samples.length must be a multiple of numSamples.');
-
this.totals = [];
this.maxTotal = 0;
this.bounds.reset();
- if (this.samples.length == 0)
+
+ if (this.series_.length === 0)
return;
- this.bounds.addValue(this.timestamps[0]);
- this.bounds.addValue(this.timestamps[this.timestamps.length - 1]);
+ var firstSeries = this.series_[0];
+ var lastSeries = this.series_[this.series_.length - 1];
+
+ this.bounds.addValue(firstSeries.getTimestamp(0));
+ this.bounds.addValue(lastSeries.getTimestamp(lastSeries.length - 1));
var numSeries = this.numSeries;
- var maxTotal = -Infinity;
- for (var i = 0; i < this.timestamps.length; i++) {
+ this.maxTotal = -Infinity;
+
+ // Sum the samples at each timestamp.
+ // Note, this assumes that all series have all timestamps.
+ for (var i = 0; i < firstSeries.length; ++i) {
var total = 0;
- for (var j = 0; j < numSeries; j++) {
- total += this.samples[i * numSeries + j];
+ this.series_.forEach(function(series) {
+ total += series.getSample(i).value;
this.totals.push(total);
- }
- if (total > maxTotal)
- maxTotal = total;
+ }.bind(this));
+
+ this.maxTotal = Math.max(total, this.maxTotal);
}
- this.maxTotal = maxTotal;
}
};
diff --git a/trace-viewer/src/tracing/trace_model/counter_series.js b/trace-viewer/src/tracing/trace_model/counter_series.js
new file mode 100644
index 0000000..414753a
--- /dev/null
+++ b/trace-viewer/src/tracing/trace_model/counter_series.js
@@ -0,0 +1,143 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.require('base.guid');
+
+/**
+ * @fileoverview Provides the CounterSeries class.
+ */
+base.exportTo('tracing.trace_model', function() {
+
+ function CounterSample(timestamp, value) {
+ this.guid_ = base.GUID.allocate();
+ this.timestamp_ = timestamp;
+ this.value_ = value;
+ }
+
+ CounterSample.prototype = {
+ __proto__: Object.prototype,
+
+ get value() {
+ return this.value_;
+ },
+
+ set timestamp(timestamp) {
+ this.timestamp_ = timestamp;
+ },
+
+ toJSON: function() {
+ var obj = new Object();
+ var keys = Object.keys(this);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (typeof this[key] == 'function')
+ continue;
+ if (key == 'parent') {
+ obj[key] = this[key].guid;
+ continue;
+ }
+ obj[key] = this[key];
+ }
+ return obj;
+ }
+ };
+
+ function CounterSeries(name, color) {
+ this.guid_ = base.GUID.allocate();
+
+ this.name_ = name;
+ this.color_ = color;
+
+ this.timestamps_ = [];
+ this.samples_ = [];
+ }
+
+ CounterSeries.prototype = {
+ __proto__: Object.prototype,
+
+ toJSON: function() {
+ var obj = new Object();
+ var keys = Object.keys(this);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (typeof this[key] == 'function')
+ continue;
+ if (key == 'parent') {
+ obj[key] = this[key].guid;
+ continue;
+ }
+ obj[key] = this[key];
+ }
+ return obj;
+ },
+
+ get length() {
+ return this.timestamps_.length;
+ },
+
+ get name() {
+ return this.name_;
+ },
+
+ get color() {
+ return this.color_;
+ },
+
+ get samples() {
+ return this.samples_;
+ },
+
+ get timestamps() {
+ return this.timestamps_;
+ },
+
+ getSample: function(idx) {
+ return this.samples_[idx];
+ },
+
+ getTimestamp: function(idx) {
+ return this.timestamps_[idx];
+ },
+
+ addSample: function(ts, val) {
+ this.timestamps_.push(ts);
+ this.samples_.push(new CounterSample(ts, val));
+ },
+
+ getStatistics: function(sampleIndices) {
+ var sum = 0;
+ var min = Number.MAX_VALUE;
+ var max = -Number.MAX_VALUE;
+
+ for (var i = 0; i < sampleIndices.length; ++i) {
+ var sample = this.getSample(sampleIndices[i]).value;
+
+ sum += sample;
+ min = Math.min(sample, min);
+ max = Math.max(sample, max);
+ }
+
+ return {
+ min: min,
+ max: max,
+ avg: (sum / sampleIndices.length),
+ start: this.getSample(sampleIndices[0]).value,
+ end: this.getSample(sampleIndices.length - 1).value
+ };
+ },
+
+ shiftTimestampsForward: function(amount) {
+ for (var i = 0; i < this.timestamps_.length; ++i) {
+ this.timestamps_[i] += amount;
+ this.samples_[i].timestamp = this.timestamps_[i];
+ }
+ }
+ };
+
+ return {
+ CounterSeries: CounterSeries
+ };
+});
diff --git a/trace-viewer/src/tracing/trace_model/counter_test.js b/trace-viewer/src/tracing/trace_model/counter_test.js
index 0f521f7..cfd0a7b 100644
--- a/trace-viewer/src/tracing/trace_model/counter_test.js
+++ b/trace-viewer/src/tracing/trace_model/counter_test.js
@@ -6,14 +6,26 @@
base.require('tracing.test_utils');
base.require('tracing.trace_model.counter');
+base.require('tracing.trace_model.counter_series');
base.unittest.testSuite('tracing.trace_model.counter', function() {
var createCounterWithTwoSeries = function() {
var ctr = new tracing.trace_model.Counter(null, 0, '', 'myCounter');
- ctr.seriesNames.push('a', 'b');
- ctr.seriesColors.push(0, 1);
- ctr.timestamps.push(0, 1, 2, 3);
- ctr.samples.push(5, 10, 6, 15, 5, 12, 7, 16);
+ var aSeries = new tracing.trace_model.CounterSeries('a', 0);
+ var bSeries = new tracing.trace_model.CounterSeries('b', 0);
+ ctr.addSeries(aSeries);
+ ctr.addSeries(bSeries);
+
+ aSeries.addSample(0, 5);
+ aSeries.addSample(1, 6);
+ aSeries.addSample(2, 5);
+ aSeries.addSample(3, 7);
+
+ bSeries.addSample(0, 10);
+ bSeries.addSample(1, 15);
+ bSeries.addSample(2, 12);
+ bSeries.addSample(3, 16);
+
return ctr;
};
diff --git a/trace-viewer/src/tracing/trace_model/instant_event.js b/trace-viewer/src/tracing/trace_model/instant_event.js
new file mode 100644
index 0000000..27030c6
--- /dev/null
+++ b/trace-viewer/src/tracing/trace_model/instant_event.js
@@ -0,0 +1,63 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.require('tracing.trace_model.trace_model_event');
+
+/**
+ * @fileoverview Provides the InstantEvent class.
+ */
+base.exportTo('tracing.trace_model', function() {
+ var InstantEventType = {
+ GLOBAL: 1,
+ PROCESS: 2,
+ THREAD: 3
+ };
+
+ function InstantEvent(category, title, colorId, start, args) {
+ tracing.trace_model.TraceModelEvent.apply(this, arguments);
+
+ this.type = undefined;
+ };
+
+ InstantEvent.prototype = {
+ __proto__: tracing.trace_model.TraceModelEvent.prototype
+ };
+
+ function GlobalInstantEvent(category, title, colorId, start, args) {
+ InstantEvent.apply(this, arguments);
+ this.type = InstantEventType.GLOBAL;
+ };
+
+ GlobalInstantEvent.prototype = {
+ __proto__: InstantEvent.prototype
+ };
+
+ function ProcessInstantEvent(category, title, colorId, start, args) {
+ InstantEvent.apply(this, arguments);
+ this.type = InstantEventType.PROCESS;
+ };
+
+ ProcessInstantEvent.prototype = {
+ __proto__: InstantEvent.prototype
+ };
+
+ function ThreadInstantEvent(category, title, colorId, start, args) {
+ InstantEvent.apply(this, arguments);
+ this.type = InstantEventType.THREAD;
+ };
+
+ ThreadInstantEvent.prototype = {
+ __proto__: InstantEvent.prototype
+ };
+
+ return {
+ GlobalInstantEvent: GlobalInstantEvent,
+ ProcessInstantEvent: ProcessInstantEvent,
+ ThreadInstantEvent: ThreadInstantEvent,
+
+ InstantEventType: InstantEventType
+ };
+});
diff --git a/trace-viewer/src/tracing/trace_model/process.js b/trace-viewer/src/tracing/trace_model/process.js
index 032db98..d58fa39 100644
--- a/trace-viewer/src/tracing/trace_model/process.js
+++ b/trace-viewer/src/tracing/trace_model/process.js
@@ -23,6 +23,7 @@
this.pid = pid;
this.name = undefined;
this.labels = [];
+ this.instantEvents = [];
};
/**
@@ -54,6 +55,10 @@
return Process.compare(this, that);
},
+ pushInstantEvent: function(instantEvent) {
+ this.instantEvents.push(instantEvent);
+ },
+
get userFriendlyName() {
var res;
if (this.name)
@@ -77,6 +82,14 @@
if (!this.labels.length)
return 'processes.' + this.name;
return 'processes.' + this.name + '.' + this.labels.join('.');
+ },
+
+ shiftTimestampsForward: function(amount) {
+ for (var id in this.instantEvents)
+ this.instantEvents[id].start += amount;
+
+ tracing.trace_model.ProcessBase.prototype
+ .shiftTimestampsForward.apply(this, arguments);
}
};
diff --git a/trace-viewer/src/tracing/trace_model/sample.js b/trace-viewer/src/tracing/trace_model/sample.js
index a2c712e..b80a5c1 100644
--- a/trace-viewer/src/tracing/trace_model/sample.js
+++ b/trace-viewer/src/tracing/trace_model/sample.js
@@ -4,37 +4,24 @@
'use strict';
+base.require('tracing.trace_model.trace_model_event');
+
/**
* @fileoverview Provides the Sample class.
*/
base.exportTo('tracing.trace_model', function() {
-
/**
* A Sample represents a sample taken at an instant in time
* plus parameters associated with that sample.
*
- * NOTE: The Sample class implements the same interface as
- * Slice. These must be kept in sync.
- *
- * All time units are stored in milliseconds.
* @constructor
*/
- function Sample(category, title, colorId, ts, args) {
- this.category = category || '';
- this.title = title;
- this.colorId = colorId;
- this.start = ts;
- this.args = args;
+ function Sample(category, title, colorId, start, args) {
+ tracing.trace_model.TraceModelEvent.apply(this, arguments);
}
Sample.prototype = {
- selected: false,
-
- duration: 0,
-
- get end() {
- return this.start;
- }
+ __proto__: tracing.trace_model.TraceModelEvent.prototype
};
return {
diff --git a/trace-viewer/src/tracing/trace_model/slice.js b/trace-viewer/src/tracing/trace_model/slice.js
index 05e4954..4edb9b6 100644
--- a/trace-viewer/src/tracing/trace_model/slice.js
+++ b/trace-viewer/src/tracing/trace_model/slice.js
@@ -4,36 +4,28 @@
'use strict';
+base.require('tracing.trace_model.trace_model_event');
+
/**
* @fileoverview Provides the Slice class.
*/
base.exportTo('tracing.trace_model', function() {
-
/**
* A Slice represents an interval of time plus parameters associated
* with that interval.
*
- * NOTE: The Sample class implements the same interface as
- * Slice. These must be kept in sync.
- *
- * All time units are stored in milliseconds.
* @constructor
*/
function Slice(category, title, colorId, start, args, opt_duration) {
- this.category = category || '';
- this.title = title;
- this.start = start;
- this.colorId = colorId;
- this.args = args;
- this.didNotFinish = false;
+ tracing.trace_model.TraceModelEvent.
+ call(this, category, title, colorId, start, args);
+
if (opt_duration !== undefined)
this.duration = opt_duration;
}
Slice.prototype = {
- selected: false,
-
- duration: undefined,
+ __proto__: tracing.trace_model.TraceModelEvent.prototype,
get end() {
return this.start + this.duration;
diff --git a/trace-viewer/src/tracing/trace_model/slice_group.js b/trace-viewer/src/tracing/trace_model/slice_group.js
index 0a199f3..5004d5f 100644
--- a/trace-viewer/src/tracing/trace_model/slice_group.js
+++ b/trace-viewer/src/tracing/trace_model/slice_group.js
@@ -64,6 +64,14 @@
},
/**
+ * Push an instant event into the slice list.
+ * @param {tracing.trace_model.InstantEvent} instantEvent The instantEvent.
+ */
+ pushInstantEvent: function(instantEvent) {
+ this.slices.push(instantEvent);
+ },
+
+ /**
* Opens a new slice in the group's slices.
*
* Calls to beginSlice and
@@ -273,7 +281,7 @@
openB[i] = newSlice;
result.pushSlice(newSlice);
}
- }
+ };
var closeOpenSlices = function(upTo) {
while (openA.length > 0 || openB.length > 0) {
@@ -294,7 +302,7 @@
openB.pop();
}
}
- }
+ };
while (idxA >= 0 || idxB >= 0) {
var sA = slicesA[idxA];
diff --git a/trace-viewer/src/tracing/trace_model/thread.js b/trace-viewer/src/tracing/trace_model/thread.js
index 1214c2e..28261c4 100644
--- a/trace-viewer/src/tracing/trace_model/thread.js
+++ b/trace-viewer/src/tracing/trace_model/thread.js
@@ -230,6 +230,7 @@
autoCloseOpenSlices: function(opt_maxTimestamp) {
this.sliceGroup.autoCloseOpenSlices(opt_maxTimestamp);
+ this.kernelSliceGroup.autoCloseOpenSlices(opt_maxTimestamp);
},
mergeKernelWithUserland: function() {
diff --git a/trace-viewer/src/tracing/trace_model/trace_model_event.js b/trace-viewer/src/tracing/trace_model/trace_model_event.js
new file mode 100644
index 0000000..e016729
--- /dev/null
+++ b/trace-viewer/src/tracing/trace_model/trace_model_event.js
@@ -0,0 +1,42 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+/**
+ * @fileoverview Provides the TraceModelEvent class.
+ */
+base.exportTo('tracing.trace_model', function() {
+ /**
+ * A TraceModelEvent represents the basic set of information collected for
+ * each type of event in the system.
+ *
+ * All time units are stored in milliseconds.
+ * @constructor
+ */
+ function TraceModelEvent(category, title, colorId, start, args) {
+ this.category = category || '';
+ this.title = title;
+ this.colorId = colorId;
+ this.start = start;
+ this.args = args;
+
+ this.didNotFinish = false;
+ }
+
+ TraceModelEvent.prototype = {
+ selected: false,
+
+ duration: 0,
+
+ get end() {
+ return this.start;
+ }
+ };
+
+ return {
+ TraceModelEvent: TraceModelEvent
+ };
+});
+
diff --git a/trace-viewer/src/tracing/trace_model_test.js b/trace-viewer/src/tracing/trace_model_test.js
index 1bdb462..83000df 100644
--- a/trace-viewer/src/tracing/trace_model_test.js
+++ b/trace-viewer/src/tracing/trace_model_test.js
@@ -24,16 +24,36 @@
t.asyncSliceGroup.push(tracing.test_utils.newAsyncSlice(0, 1, t, t));
var c = p.getOrCreateCounter('', 'ProcessCounter');
- c.seriesNames.push('a', 'b');
- c.seriesColors.push(0, 1);
- c.timestamps.push(0, 1, 2, 3);
- c.samples.push(5, 10, 6, 15, 5, 12, 7, 16);
+ var aSeries = new tracing.trace_model.CounterSeries('a', 0);
+ var bSeries = new tracing.trace_model.CounterSeries('b', 0);
+ c.addSeries(aSeries);
+ c.addSeries(bSeries);
+
+ aSeries.addSample(0, 5);
+ aSeries.addSample(1, 6);
+ aSeries.addSample(2, 5);
+ aSeries.addSample(3, 7);
+
+ bSeries.addSample(0, 10);
+ bSeries.addSample(1, 15);
+ bSeries.addSample(2, 12);
+ bSeries.addSample(3, 16);
var c1 = cpu.getOrCreateCounter('', 'CpuCounter');
- c1.seriesNames.push('a', 'b');
- c1.seriesColors.push(0, 1);
- c1.timestamps.push(0, 1, 2, 3);
- c1.samples.push(5, 10, 6, 15, 5, 12, 7, 16);
+ var aSeries = new tracing.trace_model.CounterSeries('a', 0);
+ var bSeries = new tracing.trace_model.CounterSeries('b', 0);
+ c1.addSeries(aSeries);
+ c1.addSeries(bSeries);
+
+ aSeries.addSample(0, 5);
+ aSeries.addSample(1, 6);
+ aSeries.addSample(2, 5);
+ aSeries.addSample(3, 7);
+
+ bSeries.addSample(0, 10);
+ bSeries.addSample(1, 15);
+ bSeries.addSample(2, 12);
+ bSeries.addSample(3, 16);
m.updateBounds();
diff --git a/trace-viewer/src/tracing/tracks/container_track.js b/trace-viewer/src/tracing/tracks/container_track.js
index 46695cd..0b94fdf 100644
--- a/trace-viewer/src/tracing/tracks/container_track.js
+++ b/trace-viewer/src/tracing/tracks/container_track.js
@@ -35,6 +35,14 @@
return tracks;
},
+ drawTrack: function(type) {
+ for (var i = 0; i < this.children.length; ++i) {
+ if (!(this.children[i] instanceof tracing.tracks.Track))
+ continue;
+ this.children[i].drawTrack(type);
+ }
+ },
+
/**
* Adds items intersecting the given range to a selection.
* @param {number} loVX Lower X bound of the interval to search, in
@@ -57,6 +65,9 @@
this.tracks_[i].addIntersectingItemsInRangeToSelection(
loVX, hiVX, loY, hiY, selection);
}
+
+ tracing.tracks.Track.prototype.addIntersectingItemsInRangeToSelection.
+ apply(this, arguments);
},
addAllObjectsMatchingFilterToSelection: function(filter, selection) {
diff --git a/trace-viewer/src/tracing/tracks/counter_track.js b/trace-viewer/src/tracing/tracks/counter_track.js
index 199e313..d7ff627 100644
--- a/trace-viewer/src/tracing/tracks/counter_track.js
+++ b/trace-viewer/src/tracing/tracks/counter_track.js
@@ -6,7 +6,7 @@
base.requireStylesheet('tracing.tracks.counter_track');
-base.require('tracing.tracks.drawable_track');
+base.require('tracing.tracks.heading_track');
base.require('tracing.color_scheme');
base.require('ui');
@@ -17,18 +17,18 @@
/**
* A track that displays a Counter object.
* @constructor
- * @extends {DrawableTrack}
+ * @extends {HeadingTrack}
*/
var CounterTrack =
- ui.define('counter-track', tracing.tracks.DrawableTrack);
+ ui.define('counter-track', tracing.tracks.HeadingTrack);
CounterTrack.prototype = {
- __proto__: tracing.tracks.DrawableTrack.prototype,
+ __proto__: tracing.tracks.HeadingTrack.prototype,
decorate: function(viewport) {
- tracing.tracks.DrawableTrack.prototype.decorate.call(this, viewport);
+ tracing.tracks.HeadingTrack.prototype.decorate.call(this, viewport);
this.classList.add('counter-track');
this.selectedSamples_ = {};
this.categoryFilter_ = new tracing.Filter();
@@ -49,7 +49,6 @@
set counter(counter) {
this.counter_ = counter;
this.heading = counter.name + ': ';
- this.invalidate();
},
get categoryFilter() {
@@ -62,14 +61,21 @@
/**
* @return {Object} A sparse, mutable map from sample index to bool. Samples
- * indices the map that are true are drawn as selected. Callers that mutate
- * the map must manually call invalidate on the track to trigger a redraw.
+ * indices the map that are true are drawn as selected.
*/
get selectedSamples() {
return this.selectedSamples_;
},
- draw: function(viewLWorld, viewRWorld) {
+ draw: function(type, viewLWorld, viewRWorld) {
+ switch (type) {
+ case tracing.tracks.DrawType.SLICE:
+ this.drawSlices_(viewLWorld, viewRWorld);
+ break;
+ }
+ },
+
+ drawSlices_: function(viewLWorld, viewRWorld) {
var ctx = this.context();
var pixelRatio = window.devicePixelRatio || 1;
@@ -93,18 +99,17 @@
// Figure out where drawing should begin.
var numSeries = counter.numSeries;
var numSamples = counter.numSamples;
- var startIndex = base.findLowIndexInSortedArray(counter.timestamps,
- function(x) {
- return x;
- },
- viewLWorld);
- startIndex = startIndex - 1 > 0 ? startIndex - 1 : 0;
+ var startIndex = base.findLowIndexInSortedArray(
+ counter.timestamps,
+ function(x) { return x; },
+ viewLWorld);
+ startIndex = startIndex - 1 > 0 ? startIndex - 1 : 0;
// Draw indices one by one until we fall off the viewRWorld.
var yScale = height / counter.maxTotal;
for (var seriesIndex = counter.numSeries - 1;
seriesIndex >= 0; seriesIndex--) {
- var colorId = counter.seriesColors[seriesIndex];
+ var colorId = counter.series[seriesIndex].color;
ctx.fillStyle = palette[colorId];
ctx.beginPath();
@@ -120,6 +125,7 @@
// drawing a sample at xLast, skip subsequent samples that are less than
// skipDistanceWorld from xLast.
var hasMoved = false;
+
while (true) {
var i = iLast + 1;
if (i >= numSamples) {
@@ -130,7 +136,6 @@
}
var x = counter.timestamps[i];
-
var y = counter.totals[i * numSeries + seriesIndex];
var yView = height - (yScale * y);
@@ -152,6 +157,7 @@
ctx.moveTo(viewLWorld, height);
hasMoved = true;
}
+
if (x - xLast < skipDistanceWorld) {
// We know that xNext > xLast + skipDistanceWorld, so we can
// safely move this sample's x over that much without passing
@@ -161,6 +167,7 @@
}
ctx.lineTo(x, yLastView);
ctx.lineTo(x, yView);
+
iLast = i;
xLast = x;
yLastView = yView;
@@ -168,6 +175,7 @@
ctx.closePath();
ctx.fill();
}
+
ctx.fillStyle = 'rgba(255, 0, 0, 1)';
for (var i in this.selectedSamples_) {
if (!this.selectedSamples_[i])
@@ -188,7 +196,7 @@
loWX, hiWX, viewPixWidthWorld, selection) {
function getSampleWidth(x, i) {
- if (i == counter.timestamps.length - 1)
+ if (i === counter.timestamps.length - 1)
return 0;
return counter.timestamps[i + 1] - counter.timestamps[i];
}
diff --git a/trace-viewer/src/tracing/tracks/counter_track_test.js b/trace-viewer/src/tracing/tracks/counter_track_test.js
index 72c4c68..be13a31 100644
--- a/trace-viewer/src/tracing/tracks/counter_track_test.js
+++ b/trace-viewer/src/tracing/tracks/counter_track_test.js
@@ -17,17 +17,19 @@
this.addHTMLOutput(testEl);
var ctr = new Counter(undefined, 'foo', '', 'foo');
- var n = samples.length / timestamps.length;
-
- ctr.timestamps = timestamps;
- ctr.samples = samples;
- ctr.seriesNames = [];
- ctr.seriesColors = [];
+ var n = samples.length;
for (var i = 0; i < n; ++i) {
- ctr.seriesNames.push('value' + i);
- ctr.seriesColors.push(tracing.getStringColorId(ctr.seriesNames[i]));
+ ctr.addSeries(new tracing.trace_model.CounterSeries('value' + i,
+ tracing.getStringColorId('value' + i)));
}
+
+ for (var i = 0; i < samples.length; ++i) {
+ for (var k = 0; k < timestamps.length; ++k) {
+ ctr.series[i].addSample(timestamps[k], samples[i][k]);
+ }
+ }
+
ctr.updateBounds();
var viewport = new Viewport(testEl);
@@ -55,18 +57,20 @@
test('instantiate', function() {
var ctr = new Counter(undefined, 'testBasicCounter', '',
'testBasicCounter');
- ctr.seriesNames = ['value1', 'value2'];
- ctr.seriesColors = [tracing.getStringColorId('testBasicCounter.value1'),
- tracing.getStringColorId('testBasicCounter.value2')];
- ctr.timestamps = [0, 1, 2, 3, 4, 5, 6, 7];
- ctr.samples = [0, 5,
- 3, 3,
- 1, 1,
- 2, 1.1,
- 3, 0,
- 1, 7,
- 3, 0,
- 3.1, 0.5];
+ ctr.addSeries(new tracing.trace_model.CounterSeries('value1',
+ tracing.getStringColorId('testBasicCounter.value1')));
+ ctr.addSeries(new tracing.trace_model.CounterSeries('value2',
+ tracing.getStringColorId('testBasicCounter.value2')));
+
+ var timestamps = [0, 1, 2, 3, 4, 5, 6, 7];
+ var samples = [[0, 3, 1, 2, 3, 1, 3, 3.1],
+ [5, 3, 1, 1.1, 0, 7, 0, 0.5]];
+ for (var i = 0; i < samples.length; ++i) {
+ for (var k = 0; k < timestamps.length; ++k) {
+ ctr.series[i].addSample(timestamps[k], samples[i][k]);
+ }
+ }
+
ctr.updateBounds();
var div = document.createElement('div');
@@ -88,24 +92,16 @@
test('basicCounterXPointPicking', function() {
var timestamps = [0, 1, 2, 3, 4, 5, 6, 7];
- var samples = [0, 5,
- 3, 3,
- 1, 1,
- 2, 1.1,
- 3, 0,
- 1, 7,
- 3, 0,
- 3.1, 0.5];
+ var samples = [[0, 3, 1, 2, 3, 1, 3, 3.1],
+ [5, 3, 1, 1.1, 0, 7, 0, 0.5]];
+
runTest.call(this, timestamps, samples, function(ctr, container, track) {
- var clientRect = container.canvas.getBoundingClientRect();
+ var clientRect = track.getBoundingClientRect();
var y75 = clientRect.top + (0.75 * clientRect.height);
- var sel;
- var vW = 10;
- var wW = clientRect.width;
// In bounds.
- sel = new tracing.Selection();
- var x = (1.5 / vW) * wW;
+ var sel = new tracing.Selection();
+ var x = 0.15 * clientRect.width;
track.addIntersectingItemsInRangeToSelection(x, x + 1, y75, y75 + 1, sel);
assertEquals(1, sel.length);
@@ -115,12 +111,12 @@
// Outside bounds.
sel = new tracing.Selection();
- var x = (-5 / vW) * wW;
+ var x = -0.5 * clientRect.width;
track.addIntersectingItemsInRangeToSelection(x, x + 1, y75, y75 + 1, sel);
assertEquals(0, sel.length);
sel = new tracing.Selection();
- var x = (8 / vW) * wW;
+ var x = 0.8 * clientRect.width;
track.addIntersectingItemsInRangeToSelection(x, x + 1, y75, y75 + 1, sel);
assertEquals(0, sel.length);
});
diff --git a/trace-viewer/src/tracing/tracks/drawable_track.js b/trace-viewer/src/tracing/tracks/drawable_track.js
deleted file mode 100644
index 831bf37..0000000
--- a/trace-viewer/src/tracing/tracks/drawable_track.js
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-'use strict';
-
-base.requireStylesheet('tracing.tracks.drawable_track');
-base.requireStylesheet('tracing.tracks.drawing_container');
-
-base.require('base.raf');
-base.require('tracing.tracks.track');
-base.require('tracing.fast_rect_renderer');
-base.require('tracing.color_scheme');
-base.require('ui');
-
-base.exportTo('tracing.tracks', function() {
- /**
- * A drawable track constructed. Provides the basic heading and
- * invalidation-managment infrastructure. Subclasses must implement drawing
- * and picking code.
- * @constructor
- * @extends {HTMLDivElement}
- */
- var DrawableTrack = ui.define('drawable-track', tracing.tracks.Track);
-
- DrawableTrack.prototype = {
- __proto__: tracing.tracks.Track.prototype,
-
- decorate: function(viewport) {
- tracing.tracks.Track.prototype.decorate.call(this, viewport);
- this.classList.add('drawable-track');
- this.slices_ = null;
-
- this.headingDiv_ = document.createElement('heading');
- this.appendChild(this.headingDiv_);
-
- this.canvasContainer_ = document.createElement('div');
- this.canvasContainer_.className = 'drawable-container';
- this.appendChild(this.canvasContainer_);
-
- this.viewportChange_ = this.viewportChange_.bind(this);
- this.viewport.addEventListener('change', this.viewportChange_);
- },
-
- detach: function() {
- this.viewport.removeEventListener('change', this.viewportChange_);
- },
-
- get heading() {
- return this.headingDiv_.textContent;
- },
-
- set heading(text) {
- this.headingDiv_.textContent = text;
- },
-
- set tooltip(text) {
- this.headingDiv_.title = text;
- },
-
- viewportChange_: function() {
- this.invalidate();
- },
-
- invalidate: function() {
- if (this.rafPending_)
- return;
-
- base.requestPreAnimationFrame(function() {
- this.rafPending_ = false;
- base.requestAnimationFrameInThisFrameIfPossible(function() {
- var ctx = this.context();
- if (ctx === undefined)
- return;
-
- ctx.save();
-
- var pixelRatio = window.devicePixelRatio || 1;
- var bounds = this.canvasContainer_.getBoundingClientRect();
- var canvasBounds = ctx.canvas.getBoundingClientRect();
-
- ctx.translate(0, pixelRatio * (bounds.top - canvasBounds.top));
-
- var viewLWorld = this.viewport.xViewToWorld(0);
- var viewRWorld = this.viewport.xViewToWorld(
- bounds.width * pixelRatio);
- this.draw(viewLWorld, viewRWorld);
-
- this.viewport.drawGridLines(ctx, viewLWorld, viewRWorld);
- this.viewport.drawMarkerLines(ctx, viewLWorld, viewRWorld);
-
- ctx.restore();
- }, this);
- }, this);
- this.rafPending_ = true;
- },
-
- draw: function(viewLWorld, viewRWorld) {
- throw new Error('Implementation missing');
- },
-
- addIntersectingItemsInRangeToSelection: function(
- loVX, hiVX, loVY, hiVY, selection) {
-
- var pixelRatio = window.devicePixelRatio || 1;
- var viewPixWidthWorld = this.viewport.xViewVectorToWorld(1);
- var loWX = this.viewport.xViewToWorld(loVX * pixelRatio);
- var hiWX = this.viewport.xViewToWorld(hiVX * pixelRatio);
-
- var clientRect = this.getBoundingClientRect();
- var a = Math.max(loVY, clientRect.top);
- var b = Math.min(hiVY, clientRect.bottom);
- if (a > b)
- return;
-
- this.addIntersectingItemsInRangeToSelectionInWorldSpace(
- loWX, hiWX, viewPixWidthWorld, selection);
- },
-
- addIntersectingItemsInRangeToSelectionInWorldSpace: function(
- loWX, hiWX, viewPixWidthWorld, selection) {
- }
- };
-
- return {
- DrawableTrack: DrawableTrack
- };
-});
diff --git a/trace-viewer/src/tracing/tracks/drawing_container.css b/trace-viewer/src/tracing/tracks/drawing_container.css
index b51b64c..defd254 100644
--- a/trace-viewer/src/tracing/tracks/drawing_container.css
+++ b/trace-viewer/src/tracing/tracks/drawing_container.css
@@ -13,7 +13,6 @@
.drawing-container-canvas {
-webkit-box-flex: 1;
display: block;
- left: 0;
pointer-events: none;
position: absolute;
top: 0;
diff --git a/trace-viewer/src/tracing/tracks/drawing_container.js b/trace-viewer/src/tracing/tracks/drawing_container.js
index 1418aa1..594ce10 100644
--- a/trace-viewer/src/tracing/tracks/drawing_container.js
+++ b/trace-viewer/src/tracing/tracks/drawing_container.js
@@ -6,10 +6,16 @@
base.requireStylesheet('tracing.tracks.drawing_container');
+base.require('base.raf');
base.require('tracing.tracks.track');
base.require('ui');
base.exportTo('tracing.tracks', function() {
+ var DrawType = {
+ SLICE: 1,
+ INSTANT_EVENT: 2
+ };
+
var DrawingContainer = ui.define('drawing-container', tracing.tracks.Track);
DrawingContainer.prototype = {
@@ -21,6 +27,7 @@
this.canvas_ = document.createElement('canvas');
this.canvas_.className = 'drawing-container-canvas';
+ this.canvas_.style.left = tracing.constants.HEADING_WIDTH + 'px';
this.appendChild(this.canvas_);
this.ctx_ = this.canvas_.getContext('2d');
@@ -51,48 +58,48 @@
this.rafPending_ = false;
this.ctx_.clearRect(0, 0, this.canvas_.width, this.canvas_.height);
this.updateCanvasSizeIfNeeded_();
+
+ base.requestAnimationFrameInThisFrameIfPossible(function() {
+ for (var i = 0; i < this.children.length; ++i) {
+ if (!(this.children[i] instanceof tracing.tracks.Track))
+ continue;
+ this.children[i].drawTrack(DrawType.INSTANT_EVENT);
+ }
+
+ for (var i = 0; i < this.children.length; ++i) {
+ if (!(this.children[i] instanceof tracing.tracks.Track))
+ continue;
+ this.children[i].drawTrack(DrawType.SLICE);
+ }
+
+ var pixelRatio = window.devicePixelRatio || 1;
+ var bounds = this.canvas_.getBoundingClientRect();
+ var viewLWorld = this.viewport.xViewToWorld(0);
+ var viewRWorld = this.viewport.xViewToWorld(
+ bounds.width * pixelRatio);
+
+ this.viewport.drawGridLines(this.ctx_, viewLWorld, viewRWorld);
+ this.viewport.drawMarkerLines(this.ctx_, viewLWorld, viewRWorld);
+ }, this);
}, this);
},
updateCanvasSizeIfNeeded_: function() {
- // Find the first heading with size.
- var headings = this.querySelectorAll('heading');
- if (headings === undefined || headings === null || headings.length === 0)
- return;
- var headingBounds = undefined;
- for (var i = 0; i < headings.length; i++) {
- var rect = headings[i].getBoundingClientRect();
- if (rect.right > 0) {
- headingBounds = rect;
- break;
- }
- }
- if (headingBounds === undefined)
- return;
-
- var visibleChildTracks = base.asArray(this.children).filter(
- this.visibleFilter_);
+ var visibleChildTracks =
+ base.asArray(this.children).filter(this.visibleFilter_);
var thisBounds = this.getBoundingClientRect();
+
var firstChildTrackBounds = visibleChildTracks[0].getBoundingClientRect();
var lastChildTrackBounds =
visibleChildTracks[visibleChildTracks.length - 1].
getBoundingClientRect();
- var canvasLeft = headingBounds.right - thisBounds.left;
- var canvasTop = firstChildTrackBounds.top - thisBounds.top +
- this.scrollTop;
-
- if (this.canvas_.style.top + 'px' !== canvasTop)
- this.canvas_.style.top = canvasTop + 'px';
- if (this.canvas_.style.left + 'px' !== canvasLeft)
- this.canvas_.style.left = canvasLeft + 'px';
-
- var innerWidth = firstChildTrackBounds.width - headingBounds.right;
+ var innerWidth = firstChildTrackBounds.width -
+ tracing.constants.HEADING_WIDTH;
var innerHeight = lastChildTrackBounds.bottom - firstChildTrackBounds.top;
var pixelRatio = window.devicePixelRatio || 1;
-
if (this.canvas_.width != innerWidth * pixelRatio) {
this.canvas_.width = innerWidth * pixelRatio;
this.canvas_.style.width = innerWidth + 'px';
@@ -102,6 +109,11 @@
this.canvas_.height = innerHeight * pixelRatio;
this.canvas_.style.height = innerHeight + 'px';
}
+
+ var canvasTop =
+ firstChildTrackBounds.top - thisBounds.top + this.scrollTop;
+ if (this.canvas_.style.top + 'px' !== canvasTop)
+ this.canvas_.style.top = canvasTop + 'px';
},
visibleFilter_: function(element) {
@@ -112,6 +124,7 @@
};
return {
- DrawingContainer: DrawingContainer
+ DrawingContainer: DrawingContainer,
+ DrawType: DrawType
};
});
diff --git a/trace-viewer/src/tracing/tracks/drawable_track.css b/trace-viewer/src/tracing/tracks/heading_track.css
similarity index 82%
rename from trace-viewer/src/tracing/tracks/drawable_track.css
rename to trace-viewer/src/tracing/tracks/heading_track.css
index 45b9290..5ff9019 100644
--- a/trace-viewer/src/tracing/tracks/drawable_track.css
+++ b/trace-viewer/src/tracing/tracks/heading_track.css
@@ -3,7 +3,7 @@
* found in the LICENSE file.
*/
-.drawable-track {
+.heading-track {
-webkit-box-align: stretch;
-webkit-box-orient: horizontal;
display: -webkit-box;
@@ -11,9 +11,11 @@
padding: 0 5px 0 0;
}
-.drawable-track > heading {
+.heading-track > heading {
+ -webkit-box-sizing: border-box;
background-color: rgba(214, 221, 229, 0.3);
border-right: 1px solid #8e8e8e;
+ box-sizing: border-box;
display: block;
overflow: hidden;
padding-left: 18px;
@@ -22,9 +24,3 @@
text-overflow: ellipsis;
white-space: nowrap;
}
-
-.drawable-container {
- -webkit-box-flex: 1;
- width: 100%;
-}
-
diff --git a/trace-viewer/src/tracing/tracks/heading_track.js b/trace-viewer/src/tracing/tracks/heading_track.js
new file mode 100644
index 0000000..0a7a9fd
--- /dev/null
+++ b/trace-viewer/src/tracing/tracks/heading_track.js
@@ -0,0 +1,54 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.requireStylesheet('tracing.tracks.heading_track');
+
+base.require('tracing.constants');
+base.require('tracing.tracks.track');
+base.require('ui');
+
+base.exportTo('tracing.tracks', function() {
+ /**
+ * A track with a header. Provides the basic heading and tooltip
+ * infrastructure. Subclasses must implement drawing code.
+ * @constructor
+ * @extends {HTMLDivElement}
+ */
+ var HeadingTrack = ui.define('heading-track', tracing.tracks.Track);
+
+ HeadingTrack.prototype = {
+ __proto__: tracing.tracks.Track.prototype,
+
+ decorate: function(viewport) {
+ tracing.tracks.Track.prototype.decorate.call(this, viewport);
+ this.classList.add('heading-track');
+
+ this.headingDiv_ = document.createElement('heading');
+ this.headingDiv_.style.width = tracing.constants.HEADING_WIDTH + 'px';
+ this.appendChild(this.headingDiv_);
+ },
+
+ get heading() {
+ return this.headingDiv_.textContent;
+ },
+
+ set heading(text) {
+ this.headingDiv_.textContent = text;
+ },
+
+ set tooltip(text) {
+ this.headingDiv_.title = text;
+ },
+
+ draw: function(type, viewLWorld, viewRWorld) {
+ throw new Error('draw implementation missing');
+ }
+ };
+
+ return {
+ HeadingTrack: HeadingTrack
+ };
+});
diff --git a/trace-viewer/src/tracing/tracks/object_instance_track.js b/trace-viewer/src/tracing/tracks/object_instance_track.js
index 2e168fb..4cf94ce 100644
--- a/trace-viewer/src/tracing/tracks/object_instance_track.js
+++ b/trace-viewer/src/tracing/tracks/object_instance_track.js
@@ -7,7 +7,7 @@
base.requireStylesheet('tracing.tracks.object_instance_track');
base.require('base.sorted_array_utils');
-base.require('tracing.tracks.drawable_track');
+base.require('tracing.tracks.heading_track');
base.require('tracing.color_scheme');
base.require('ui');
@@ -19,17 +19,17 @@
/**
* A track that displays an array of Slice objects.
* @constructor
- * @extends {DrawableTrack}
+ * @extends {HeadingTrack}
*/
var ObjectInstanceTrack = ui.define(
- 'object-instance-track', tracing.tracks.DrawableTrack);
+ 'object-instance-track', tracing.tracks.HeadingTrack);
ObjectInstanceTrack.prototype = {
- __proto__: tracing.tracks.DrawableTrack.prototype,
+ __proto__: tracing.tracks.HeadingTrack.prototype,
decorate: function(viewport) {
- tracing.tracks.DrawableTrack.prototype.decorate.call(this, viewport);
+ tracing.tracks.HeadingTrack.prototype.decorate.call(this, viewport);
this.classList.add('object-instance-track');
this.objectInstances_ = [];
this.objectSnapshots_ = [];
@@ -40,7 +40,6 @@
},
set objectInstances(objectInstances) {
- this.invalidate();
if (!objectInstances || objectInstances.length == 0) {
this.heading = '';
this.objectInstances_ = [];
@@ -62,14 +61,21 @@
set height(height) {
this.style.height = height;
- this.invalidate();
},
get snapshotRadiusView() {
return 7 * (window.devicePixelRatio || 1);
},
- draw: function(viewLWorld, viewRWorld) {
+ draw: function(type, viewLWorld, viewRWorld) {
+ switch (type) {
+ case tracing.tracks.DrawType.SLICE:
+ this.drawSlices_(viewLWorld, viewRWorld);
+ break;
+ }
+ },
+
+ drawSlices_: function(viewLWorld, viewRWorld) {
var ctx = this.context();
var pixelRatio = window.devicePixelRatio || 1;
diff --git a/trace-viewer/src/tracing/tracks/process_track.js b/trace-viewer/src/tracing/tracks/process_track.js
index 7883762..fc06a86 100644
--- a/trace-viewer/src/tracing/tracks/process_track.js
+++ b/trace-viewer/src/tracing/tracks/process_track.js
@@ -21,6 +21,30 @@
tracing.tracks.ProcessTrackBase.prototype.decorate.call(this, viewport);
},
+ drawTrack: function(type) {
+ switch (type) {
+ case tracing.tracks.DrawType.INSTANT_EVENT:
+ if (!this.processBase.instantEvents ||
+ this.processBase.instantEvents.length === 0)
+ break;
+
+ var ctx = this.context();
+ if (ctx === undefined)
+ break;
+
+ ctx.save();
+ var worldBounds = this.setupCanvasForDraw_();
+ this.drawInstantEvents_(
+ this.processBase.instantEvents,
+ worldBounds.left,
+ worldBounds.right);
+ ctx.restore();
+ break;
+ }
+
+ tracing.tracks.ContainerTrack.prototype.drawTrack.call(this, type);
+ },
+
// Process maps to processBase because we derive from ProcessTrackBase.
set process(process) {
this.processBase = process;
@@ -28,10 +52,26 @@
get process() {
return this.processBase;
+ },
+
+ addIntersectingItemsInRangeToSelectionInWorldSpace: function(
+ loWX, hiWX, viewPixWidthWorld, selection) {
+ function onPickHit(instantEvent) {
+ var hit = selection.addSlice(this, instantEvent);
+ this.decorateHit(hit);
+ }
+ base.iterateOverIntersectingIntervals(this.processBase.instantEvents,
+ function(x) { return x.start; },
+ function(x) { return x.duration; },
+ loWX, hiWX,
+ onPickHit.bind(this));
+
+ tracing.tracks.ContainerTrack.prototype.
+ addIntersectingItemsInRangeToSelectionInWorldSpace.
+ apply(this, arguments);
}
};
-
return {
ProcessTrack: ProcessTrack
};
diff --git a/trace-viewer/src/tracing/tracks/process_track_base.css b/trace-viewer/src/tracing/tracks/process_track_base.css
index 11c7f89..616ea0f 100644
--- a/trace-viewer/src/tracing/tracks/process_track_base.css
+++ b/trace-viewer/src/tracing/tracks/process_track_base.css
@@ -25,10 +25,10 @@
}
.process-track-header > expand-button.expand-button-expanded {
- content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNtCDrVoAAAAoSURBVChTY2CgKggNDVUHYnsUQ4EC//FhBoIKkI0DKlYAYhmqupsBAMwgJH8K5nKoAAAAAElFTkSuQmCC);
+ content: url(../../images/collapse.png);
}
/* A minus icon */
.process-track-header> expand-button:not(.expand-button-expanded) {
- content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFAAAAVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASd3+7gAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjbQg61aAAAAGklEQVQYV2P4//8/IyOQYMBkMEIBA5yBWzEAD3Mj+VR5R78AAAAASUVORK5CYII=);
+ content: url(../../images/expand.png);
}
diff --git a/trace-viewer/src/tracing/tracks/ruler_track.css b/trace-viewer/src/tracing/tracks/ruler_track.css
index d3bc0d1..5b91547 100644
--- a/trace-viewer/src/tracing/tracks/ruler_track.css
+++ b/trace-viewer/src/tracing/tracks/ruler_track.css
@@ -10,7 +10,3 @@
.ruler-track-with-distance-measurements {
height: 24px;
}
-
-.ruler-track .drawable-container {
- border-bottom: 1px solid #8e8e8e;
-}
diff --git a/trace-viewer/src/tracing/tracks/ruler_track.js b/trace-viewer/src/tracing/tracks/ruler_track.js
index a8b7c65..ecde9a7 100644
--- a/trace-viewer/src/tracing/tracks/ruler_track.js
+++ b/trace-viewer/src/tracing/tracks/ruler_track.js
@@ -6,8 +6,9 @@
base.requireStylesheet('tracing.tracks.ruler_track');
+base.require('tracing.constants');
base.require('tracing.tracks.track');
-base.require('tracing.tracks.drawable_track');
+base.require('tracing.tracks.heading_track');
base.require('ui');
base.exportTo('tracing.tracks', function() {
@@ -15,10 +16,10 @@
/**
* A track that displays the ruler.
* @constructor
- * @extends {DrawableTrack}
+ * @extends {HeadingTrack}
*/
- var RulerTrack = ui.define('ruler-track', tracing.tracks.DrawableTrack);
+ var RulerTrack = ui.define('ruler-track', tracing.tracks.HeadingTrack);
var logOf10 = Math.log(10);
function log10(x) {
@@ -26,10 +27,10 @@
}
RulerTrack.prototype = {
- __proto__: tracing.tracks.DrawableTrack.prototype,
+ __proto__: tracing.tracks.HeadingTrack.prototype,
decorate: function(viewport) {
- tracing.tracks.DrawableTrack.prototype.decorate.call(this, viewport);
+ tracing.tracks.HeadingTrack.prototype.decorate.call(this, viewport);
this.classList.add('ruler-track');
this.strings_secs_ = [];
this.strings_msecs_ = [];
@@ -41,7 +42,7 @@
},
detach: function() {
- tracing.tracks.DrawableTrack.prototype.detach.call(this);
+ tracing.tracks.HeadingTrack.prototype.detach.call(this);
this.viewport.removeEventListener('markersChange',
this.viewportMarkersChange_);
},
@@ -54,16 +55,20 @@
},
onMouseDown: function(e) {
- if (e.button != 0)
+ if (e.button !== 0)
return;
this.placeAndBeginDraggingMarker(e.clientX);
},
placeAndBeginDraggingMarker: function(clientX) {
var pixelRatio = window.devicePixelRatio || 1;
- var viewX = (clientX - this.canvasContainer_.offsetLeft) * pixelRatio;
+
+ var viewX =
+ (clientX - this.offsetLeft - tracing.constants.HEADING_WIDTH) *
+ pixelRatio;
var worldX = this.viewport.xViewToWorld(viewX);
var marker = this.viewport.findMarkerNear(worldX, 6);
+
var createdMarker = false;
var movedMarker = false;
if (!marker) {
@@ -72,21 +77,24 @@
}
marker.selected = true;
- var that = this;
var onMouseMove = function(e) {
- var viewX = (e.clientX - that.canvasContainer_.offsetLeft) * pixelRatio;
- var worldX = that.viewport.xViewToWorld(viewX);
+ var viewX =
+ (e.clientX - this.offsetLeft - tracing.constants.HEADING_WIDTH) *
+ pixelRatio;
+ var worldX = this.viewport.xViewToWorld(viewX);
+
marker.positionWorld = worldX;
movedMarker = true;
- };
+ }.bind(this);
var onMouseUp = function(e) {
marker.selected = false;
if (!movedMarker && !createdMarker)
- that.viewport.removeMarker(marker);
+ this.viewport.removeMarker(marker);
+
document.removeEventListener('mouseup', onMouseUp);
document.removeEventListener('mousemove', onMouseMove);
- };
+ }.bind(this);
document.addEventListener('mouseup', onMouseUp);
document.addEventListener('mousemove', onMouseMove);
@@ -125,7 +133,15 @@
ctx.fill();
},
- draw: function(viewLWorld, viewRWorld) {
+ draw: function(type, viewLWorld, viewRWorld) {
+ switch (type) {
+ case tracing.tracks.DrawType.SLICE:
+ this.drawSlices_(viewLWorld, viewRWorld);
+ break;
+ }
+ },
+
+ drawSlices_: function(viewLWorld, viewRWorld) {
var ctx = this.context();
var pixelRatio = window.devicePixelRatio || 1;
@@ -228,14 +244,13 @@
ctx.stroke();
}
+ // Draw bottom bar.
+ ctx.moveTo(0, rulerHeight);
+ ctx.lineTo(width, rulerHeight);
+ ctx.stroke();
// Give distance between directly adjacent markers.
if (measurements) {
- // Divide canvas horizontally between ruler and measurements.
- ctx.moveTo(0, rulerHeight);
- ctx.lineTo(width, rulerHeight);
- ctx.stroke();
-
// Obtain a sorted array of markers
var sortedMarkers = vp.markers.slice();
sortedMarkers.sort(function(a, b) {
@@ -322,6 +337,10 @@
rightMarkerView, arrowPosY, arrowWidthView, arrowColor);
}
}
+ // Draw bottom bar.
+ ctx.moveTo(0, rulerHeight * 2);
+ ctx.lineTo(width, rulerHeight * 2);
+ ctx.stroke();
}
},
diff --git a/trace-viewer/src/tracing/tracks/slice_track.js b/trace-viewer/src/tracing/tracks/slice_track.js
index c59a9cd..00f27ce 100644
--- a/trace-viewer/src/tracing/tracks/slice_track.js
+++ b/trace-viewer/src/tracing/tracks/slice_track.js
@@ -7,7 +7,7 @@
base.requireStylesheet('tracing.tracks.slice_track');
base.require('base.sorted_array_utils');
-base.require('tracing.tracks.drawable_track');
+base.require('tracing.tracks.heading_track');
base.require('tracing.fast_rect_renderer');
base.require('tracing.color_scheme');
base.require('ui');
@@ -19,15 +19,15 @@
/**
* A track that displays an array of Slice objects.
* @constructor
- * @extends {DrawableTrack}
+ * @extends {HeadingTrack}
*/
var SliceTrack = ui.define(
- 'slice-track', tracing.tracks.DrawableTrack);
+ 'slice-track', tracing.tracks.HeadingTrack);
SliceTrack.prototype = {
- __proto__: tracing.tracks.DrawableTrack.prototype,
+ __proto__: tracing.tracks.HeadingTrack.prototype,
/**
* Should we elide text on trace labels?
@@ -39,18 +39,11 @@
SHOULD_ELIDE_TEXT: true,
decorate: function(viewport) {
- tracing.tracks.DrawableTrack.prototype.decorate.call(this, viewport);
+ tracing.tracks.HeadingTrack.prototype.decorate.call(this, viewport);
this.classList.add('slice-track');
this.elidedTitleCache = new ElidedTitleCache();
this.asyncStyle_ = false;
- },
-
- /**
- * Called by all the addToSelection functions on the created selection
- * hit objects. Override this function on parent classes to add
- * context-specific information to the hit.
- */
- decorateHit: function(hit) {
+ this.slices_ = null;
},
get asyncStyle() {
@@ -59,7 +52,6 @@
set asyncStyle(v) {
this.asyncStyle_ = !!v;
- this.invalidate();
},
get slices() {
@@ -68,7 +60,6 @@
set slices(slices) {
this.slices_ = slices || [];
- this.invalidate();
},
get height() {
@@ -77,7 +68,6 @@
set height(height) {
this.style.height = height;
- this.invalidate();
},
get hasVisibleContent() {
@@ -92,7 +82,15 @@
return this.labelWidth(title) * pixWidth;
},
- draw: function(viewLWorld, viewRWorld) {
+ draw: function(type, viewLWorld, viewRWorld) {
+ switch (type) {
+ case tracing.tracks.DrawType.SLICE:
+ this.drawSlices_(viewLWorld, viewRWorld);
+ break;
+ }
+ },
+
+ drawSlices_: function(viewLWorld, viewRWorld) {
var ctx = this.context();
var pixelRatio = window.devicePixelRatio || 1;
@@ -122,9 +120,9 @@
for (var i = lowSlice; i < slices.length; ++i) {
var slice = slices[i];
var x = slice.start;
- if (x > viewRWorld) {
+ if (x > viewRWorld)
break;
- }
+
// Less than 0.001 causes short events to disappear when zoomed in.
var w = Math.max(slice.duration, 0.001);
var colorId = slice.selected ?
@@ -199,17 +197,15 @@
addIntersectingItemsInRangeToSelectionInWorldSpace: function(
loWX, hiWX, viewPixWidthWorld, selection) {
-
- var that = this;
function onPickHit(slice) {
- var hit = selection.addSlice(that, slice);
- that.decorateHit(hit);
+ var hit = selection.addSlice(this, slice);
+ this.decorateHit(hit);
}
base.iterateOverIntersectingIntervals(this.slices_,
function(x) { return x.start; },
function(x) { return x.duration; },
loWX, hiWX,
- onPickHit);
+ onPickHit.bind(this));
},
/**
diff --git a/trace-viewer/src/tracing/tracks/spacing_track.js b/trace-viewer/src/tracing/tracks/spacing_track.js
index a31c6d9..d44cc2a 100644
--- a/trace-viewer/src/tracing/tracks/spacing_track.js
+++ b/trace-viewer/src/tracing/tracks/spacing_track.js
@@ -6,28 +6,29 @@
base.requireStylesheet('tracing.tracks.spacing_track');
+base.require('tracing.tracks.heading_track');
+
base.exportTo('tracing.tracks', function() {
/**
* @constructor
*/
- var SpacingTrack = ui.define('spacing-track', tracing.tracks.DrawableTrack);
+ var SpacingTrack = ui.define('spacing-track', tracing.tracks.HeadingTrack);
SpacingTrack.prototype = {
- __proto__: tracing.tracks.DrawableTrack.prototype,
+ __proto__: tracing.tracks.HeadingTrack.prototype,
decorate: function(viewport) {
- tracing.tracks.DrawableTrack.prototype.decorate.call(this, viewport);
+ tracing.tracks.HeadingTrack.prototype.decorate.call(this, viewport);
this.classList.add('spacing-track');
},
- draw: function(viewLWorld, viewRWorld) {
+ draw: function(type, viewLWorld, viewRWorld) {
},
addAllObjectsMatchingFilterToSelection: function(filter, selection) {
}
};
-
return {
SpacingTrack: SpacingTrack
};
diff --git a/trace-viewer/src/tracing/tracks/trace_model_track.js b/trace-viewer/src/tracing/tracks/trace_model_track.js
index 0fada12..bbd9583 100644
--- a/trace-viewer/src/tracing/tracks/trace_model_track.js
+++ b/trace-viewer/src/tracing/tracks/trace_model_track.js
@@ -89,6 +89,45 @@
if (!track.hasVisibleContent)
return;
this.appendChild(track);
+ },
+
+ drawTrack: function(type) {
+ switch (type) {
+ case tracing.tracks.DrawType.INSTANT_EVENT:
+ if (!this.model_.instantEvents ||
+ this.model_.instantEvents.length === 0)
+ break;
+
+ var ctx = this.context();
+ if (ctx === undefined)
+ break;
+
+ ctx.save();
+ var worldBounds = this.setupCanvasForDraw_();
+ this.drawInstantEvents_(
+ this.model_.instantEvents, worldBounds.left, worldBounds.right);
+ ctx.restore();
+ break;
+ }
+
+ tracing.tracks.ContainerTrack.prototype.drawTrack.call(this, type);
+ },
+
+ addIntersectingItemsInRangeToSelectionInWorldSpace: function(
+ loWX, hiWX, viewPixWidthWorld, selection) {
+ function onPickHit(instantEvent) {
+ var hit = selection.addSlice(this, instantEvent);
+ this.decorateHit(hit);
+ }
+ base.iterateOverIntersectingIntervals(this.model_.instantEvents,
+ function(x) { return x.start; },
+ function(x) { return x.duration; },
+ loWX, hiWX,
+ onPickHit.bind(this));
+
+ tracing.tracks.ContainerTrack.prototype.
+ addIntersectingItemsInRangeToSelectionInWorldSpace.
+ apply(this, arguments);
}
};
diff --git a/trace-viewer/src/tracing/tracks/track.js b/trace-viewer/src/tracing/tracks/track.js
index 4299d82..5596526 100644
--- a/trace-viewer/src/tracing/tracks/track.js
+++ b/trace-viewer/src/tracing/tracks/track.js
@@ -11,10 +11,13 @@
*/
base.requireStylesheet('tracing.tracks.track');
+
base.require('ui');
base.require('ui.container_that_decorates_its_children');
+base.require('tracing.color_scheme');
base.exportTo('tracing.tracks', function() {
+ var highlightIdBoost = tracing.getColorPaletteHighlightIdBoost();
/**
* The base class for all tracks.
@@ -70,6 +73,120 @@
},
updateContents_: function() {
+ },
+
+ drawTrack: function(type) {
+ var ctx = this.context();
+ if (ctx === undefined)
+ return;
+
+ ctx.save();
+ var worldBounds = this.setupCanvasForDraw_();
+ this.draw(type, worldBounds.left, worldBounds.right);
+ ctx.restore();
+ },
+
+ draw: function(type, viewLWorld, viewRWorld) {
+ },
+
+ setupCanvasForDraw_: function() {
+ var ctx = this.context();
+ var pixelRatio = window.devicePixelRatio || 1;
+ var bounds = this.getBoundingClientRect();
+ var canvasBounds = ctx.canvas.getBoundingClientRect();
+
+ ctx.translate(0, pixelRatio * (bounds.top - canvasBounds.top));
+
+ var viewLWorld = this.viewport.xViewToWorld(0);
+ var viewRWorld = this.viewport.xViewToWorld(bounds.width * pixelRatio);
+
+ return {left: viewLWorld, right: viewRWorld};
+ },
+
+ /**
+ * Called by all the addToSelection functions on the created selection
+ * hit objects. Override this function on parent classes to add
+ * context-specific information to the hit.
+ */
+ decorateHit: function(hit) {
+ },
+
+ addIntersectingItemsInRangeToSelection: function(
+ loVX, hiVX, loVY, hiVY, selection) {
+
+ var pixelRatio = window.devicePixelRatio || 1;
+ var viewPixWidthWorld = this.viewport.xViewVectorToWorld(1);
+ var loWX = this.viewport.xViewToWorld(loVX * pixelRatio);
+ var hiWX = this.viewport.xViewToWorld(hiVX * pixelRatio);
+
+ var clientRect = this.getBoundingClientRect();
+ var a = Math.max(loVY, clientRect.top);
+ var b = Math.min(hiVY, clientRect.bottom);
+ if (a > b)
+ return;
+
+ this.addIntersectingItemsInRangeToSelectionInWorldSpace(
+ loWX, hiWX, viewPixWidthWorld, selection);
+ },
+
+ addIntersectingItemsInRangeToSelectionInWorldSpace: function(
+ loWX, hiWX, viewPixWidthWorld, selection) {
+ },
+
+ drawInstantEvents_: function(instantEvents, viewLWorld, viewRWorld) {
+ var ctx = this.context();
+ var pixelRatio = window.devicePixelRatio || 1;
+
+ var bounds = this.getBoundingClientRect();
+ var height = bounds.height * pixelRatio;
+
+ // Culling parameters.
+ var vp = this.viewport;
+ var pixWidth = vp.xViewVectorToWorld(1);
+
+ var palette = tracing.getColorPalette();
+
+ // Begin rendering in world space.
+ ctx.save();
+ vp.applyTransformToCanvas(ctx);
+
+ var tr = new tracing.FastRectRenderer(ctx, 2 * pixWidth, 2 * pixWidth,
+ palette);
+ tr.setYandH(0, height);
+
+ var lowInstantEvent = base.findLowIndexInSortedArray(
+ instantEvents,
+ function(instantEvent) { return instantEvent.start; },
+ viewLWorld);
+
+ for (var i = lowInstantEvent; i < instantEvents.length; ++i) {
+ var instantEvent = instantEvents[i];
+ var x = instantEvent.start;
+ if (x > viewRWorld)
+ break;
+
+ // Less than 0.001 causes short events to disappear when zoomed in.
+ var w = Math.max(instantEvent.duration, 0.001);
+ var colorId = instantEvent.selected ?
+ instantEvent.colorId + highlightIdBoost :
+ instantEvent.colorId;
+
+ // InstantEvent: draw a triangle. If zoomed too far, collapse
+ // into the FastRectRenderer.
+ if (pixWidth > 0.001) {
+ tr.fillRect(x, pixWidth, colorId);
+ } else {
+ ctx.fillStyle = palette[colorId];
+ ctx.beginPath();
+ ctx.moveTo(x - (4 * pixWidth), height);
+ ctx.lineTo(x, 0);
+ ctx.lineTo(x + (4 * pixWidth), height);
+ ctx.closePath();
+ ctx.fill();
+ }
+ }
+ tr.flush();
+ ctx.restore();
}
};
diff --git a/trace-viewer/src/ui/camera.js b/trace-viewer/src/ui/camera.js
index eae778e..cc6cfe6 100644
--- a/trace-viewer/src/ui/camera.js
+++ b/trace-viewer/src/ui/camera.js
@@ -16,7 +16,6 @@
*/
function Camera(targetElement) {
this.targetElement_ = targetElement;
- this.debug_ = false;
this.onMouseDown_ = this.onMouseDown_.bind(this);
this.onMouseMove_ = this.onMouseMove_.bind(this);
@@ -52,14 +51,6 @@
this.repaint_();
},
- get debug() {
- return this.debug_;
- },
-
- set debug(debug) {
- this.debug_ = !!debug;
- },
-
repaint_: function() {
if (!this.repaintPending_)
return;
@@ -112,9 +103,6 @@
transformString += ' rotateY(' + this.rotations_.y + 'deg)';
var container = this.targetElement_.contentContainer;
container.style.webkitTransform = transformString;
-
- if (this.debug)
- this.updateDebugIndicator_();
},
updateCameraStart_: function(x, y) {
@@ -156,31 +144,6 @@
this.updateCamera_(e.x, e.y);
},
- indicatorLine_: function(context, x0, y0, x1, y1) {
- context.beginPath();
- context.moveTo(x0, y0);
- context.lineTo(x1, y1);
- context.lineWidth = 3;
- context.strokeStyle = '#ff0000';
- context.stroke();
- },
-
- updateDebugIndicator_: function() {
- var crossHairsParent = this.targetElement_.parentElement;
- var crossHairsTarget = this.targetElement_;
- this.crossHairs_ = this.crossHairs_ || document.createElement('canvas');
- this.crossHairs_.className = 'camera-debug-indicator';
- crossHairsParent.appendChild(this.crossHairs_);
- var width = this.crossHairs_.width = crossHairsTarget.offsetWidth;
- var height = this.crossHairs_.height = crossHairsTarget.offsetHeight;
-
- var context = this.crossHairs_.getContext('2d');
- var offset = crossHairsTarget.offsetTop;
- this.crossHairs_.style.top = offset + 'px';
- this.indicatorLine_(context, 0, height / 2, width, height / 2);
- this.indicatorLine_(context, width / 2, 0, width / 2, height);
- }
-
};
return {
diff --git a/trace-viewer/src/ui/mouse_mode_selector.css b/trace-viewer/src/ui/mouse_mode_selector.css
new file mode 100644
index 0000000..bd35987
--- /dev/null
+++ b/trace-viewer/src/ui/mouse_mode_selector.css
@@ -0,0 +1,61 @@
+/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+.mouse-mode-selector {
+
+ -webkit-user-drag: element;
+ -webkit-user-select: none;
+
+ background: #DDD;
+ border: 1px solid #BBB;
+ border-radius: 4px;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.2);
+ height: 108px;
+ left: calc(100% - 120px);
+ position: fixed;
+ top: 100px;
+ user-drag: element;
+ user-select: none;
+ width: 29px;
+ z-index: 20;
+}
+
+.mouse-mode-selector .drag-handle {
+ background: url(../images/ui-states.png) 2px 3px no-repeat;
+ background-repeat: no-repeat;
+ border-bottom: 1px solid #BCBCBC;
+ cursor: move;
+ display: block;
+ height: 13px;
+ width: 27px;
+}
+
+.mouse-mode-selector .pan-scan-mode-button {
+ background-image: url(../images/ui-states.png);
+ background-position: 0 -10px;
+}
+
+.mouse-mode-selector .pan-scan-mode-button.active {
+ background-position: -30px -10px;
+}
+
+.mouse-mode-selector .selection-mode-button {
+ background-image: url(../images/ui-states.png);
+ background-position: 0 -40px;
+}
+
+.mouse-mode-selector .selection-mode-button.active {
+ background-position: -30px -40px;
+}
+
+.mouse-mode-selector .zoom-mode-button {
+ background-image: url(../images/ui-states.png);
+ background-position: 0 -70px;
+ border-bottom: none;
+}
+
+.mouse-mode-selector .zoom-mode-button.active {
+ background-position: -30px -70px;
+}
diff --git a/trace-viewer/src/ui/mouse_mode_selector.html b/trace-viewer/src/ui/mouse_mode_selector.html
new file mode 100644
index 0000000..3ffb1c1
--- /dev/null
+++ b/trace-viewer/src/ui/mouse_mode_selector.html
@@ -0,0 +1,14 @@
+<!--
+Copyright (c) 2013 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<template id="mouse-mode-selector-template">
+ <div class="drag-handle"></div>
+ <div class="buttons">
+ <div class="pan-scan-mode-button tool-button"></div>
+ <div class="selection-mode-button tool-button"></div>
+ <div class="zoom-mode-button tool-button"></div>
+ </div>
+</template>
diff --git a/trace-viewer/src/ui/mouse_mode_selector.js b/trace-viewer/src/ui/mouse_mode_selector.js
new file mode 100644
index 0000000..d9cf1f4
--- /dev/null
+++ b/trace-viewer/src/ui/mouse_mode_selector.js
@@ -0,0 +1,355 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.requireStylesheet('ui.tool_button');
+base.requireStylesheet('ui.mouse_mode_selector');
+
+base.requireTemplate('ui.mouse_mode_selector');
+
+base.require('base.events');
+base.require('tracing.mouse_mode_constants');
+base.require('ui');
+
+base.exportTo('ui', function() {
+
+ /**
+ * Provides a panel for switching the interaction mode between
+ * panning, selecting and zooming. It handles the user interaction
+ * and dispatches events for the various modes, which are picked up
+ * and used by the Timeline Track View.
+ *
+ * @constructor
+ * @extends {HTMLDivElement}
+ */
+ var MouseModeSelector = ui.define('div');
+
+ MouseModeSelector.prototype = {
+ __proto__: HTMLDivElement.prototype,
+
+ decorate: function(parentEl) {
+
+ this.classList.add('mouse-mode-selector');
+ this.parentEl_ = parentEl;
+
+ var node = base.instantiateTemplate('#mouse-mode-selector-template');
+ this.appendChild(node);
+
+ this.buttonsEl_ = this.querySelector('.buttons');
+ this.dragHandleEl_ = this.querySelector('.drag-handle');
+ this.panScanModeButton_ =
+ this.buttonsEl_.querySelector('.pan-scan-mode-button');
+ this.selectionModeButton_ =
+ this.buttonsEl_.querySelector('.selection-mode-button');
+ this.zoomModeButton_ =
+ this.buttonsEl_.querySelector('.zoom-mode-button');
+
+ this.pos_ = {
+ x: base.Settings.get('mouse_mode_selector.x', window.innerWidth - 50),
+ y: base.Settings.get('mouse_mode_selector.y', 100)
+ };
+
+ this.constrainPositionToWindowBounds_();
+ this.updateStylesFromPosition_();
+
+ this.isDraggingModeSelectorDragHandle_ = false;
+ this.initialRelativeMouseDownPos_ = {x: 0, y: 0};
+
+ this.dragHandleEl_.addEventListener('mousedown',
+ this.onDragHandleMouseDown_.bind(this));
+ document.addEventListener('mousemove',
+ this.onDragHandleMouseMove_.bind(this));
+ document.addEventListener('mouseup',
+ this.onDragHandleMouseUp_.bind(this));
+ window.addEventListener('resize',
+ this.onWindowResize_.bind(this));
+
+ this.buttonsEl_.addEventListener('mouseup', this.onButtonMouseUp_);
+ this.buttonsEl_.addEventListener('mousedown', this.onButtonMouseDown_);
+ this.buttonsEl_.addEventListener('click', this.onButtonPress_.bind(this));
+
+ document.addEventListener('mousemove', this.onMouseMove_.bind(this));
+ document.addEventListener('mouseup', this.onMouseUp_.bind(this));
+ this.parentEl_.addEventListener('mousedown',
+ this.onMouseDown_.bind(this));
+
+ document.addEventListener('keypress', this.onKeyPress_.bind(this));
+ document.addEventListener('keydown', this.onKeyDown_.bind(this));
+ document.addEventListener('keyup', this.onKeyUp_.bind(this));
+
+ this.mode = base.Settings.get('mouse_mode_selector.mouseMode',
+ tracing.mouseModeConstants.MOUSE_MODE_PANSCAN);
+
+ this.isInTemporaryAlternativeMouseMode_ = false;
+ this.isInteracting_ = false;
+ },
+
+ get mode() {
+ return this.currentMode_;
+ },
+
+ set mode(newMode) {
+
+ if (this.currentMode_ === newMode)
+ return;
+
+ var mouseModeConstants = tracing.mouseModeConstants;
+
+ this.currentMode_ = newMode;
+ this.panScanModeButton_.classList.remove('active');
+ this.selectionModeButton_.classList.remove('active');
+ this.zoomModeButton_.classList.remove('active');
+
+ switch (newMode) {
+
+ case mouseModeConstants.MOUSE_MODE_PANSCAN:
+ this.panScanModeButton_.classList.add('active');
+ break;
+
+ case mouseModeConstants.MOUSE_MODE_SELECTION:
+ this.selectionModeButton_.classList.add('active');
+ break;
+
+ case mouseModeConstants.MOUSE_MODE_ZOOM:
+ this.zoomModeButton_.classList.add('active');
+ break;
+
+ default:
+ throw new Error('Unknown selection mode: ' + newMode);
+ break;
+ }
+
+ base.Settings.set('mouse_mode_selector.mouseMode', newMode);
+ },
+
+ getCurrentModeEventNames_: function() {
+
+ var mouseModeConstants = tracing.mouseModeConstants;
+ var modeEventNames = {
+ begin: '',
+ update: '',
+ end: ''
+ };
+
+ switch (this.mode) {
+
+ case mouseModeConstants.MOUSE_MODE_PANSCAN:
+ modeEventNames.begin = 'beginpan';
+ modeEventNames.update = 'updatepan';
+ modeEventNames.end = 'endpan';
+ break;
+
+ case mouseModeConstants.MOUSE_MODE_SELECTION:
+ modeEventNames.begin = 'beginselection';
+ modeEventNames.update = 'updateselection';
+ modeEventNames.end = 'endselection';
+ break;
+
+ case mouseModeConstants.MOUSE_MODE_ZOOM:
+ modeEventNames.begin = 'beginzoom';
+ modeEventNames.update = 'updatezoom';
+ modeEventNames.end = 'endzoom';
+ break;
+
+ default:
+ throw new Error('Unsupported interaction mode');
+ break;
+ }
+
+ return modeEventNames;
+ },
+
+ onMouseDown_: function(e) {
+ var eventNames = this.getCurrentModeEventNames_();
+ var mouseEvent = new base.Event(eventNames.begin, true, true);
+ mouseEvent.data = e;
+ this.dispatchEvent(mouseEvent);
+ this.isInteracting_ = true;
+ },
+
+ onMouseMove_: function(e) {
+ var eventNames = this.getCurrentModeEventNames_();
+ var mouseEvent = new base.Event(eventNames.update, true, true);
+ mouseEvent.data = e;
+ this.dispatchEvent(mouseEvent);
+ },
+
+ onMouseUp_: function(e) {
+ var eventNames = this.getCurrentModeEventNames_();
+ var mouseEvent = new base.Event(eventNames.end, true, true);
+ var userHasReleasedShiftKey = !e.shiftKey;
+ var userHasReleasedCmdOrCtrl = (base.isMac && !e.metaKey) ||
+ (!base.isMac && !e.ctrlKey);
+
+ mouseEvent.data = e;
+ this.dispatchEvent(mouseEvent);
+ this.isInteracting_ = false;
+
+ if (this.isInTemporaryAlternativeMouseMode_ && userHasReleasedShiftKey &&
+ userHasReleasedCmdOrCtrl) {
+ this.mode = tracing.mouseModeConstants.MOUSE_MODE_PANSCAN;
+ }
+ },
+
+ onButtonMouseDown_: function(e) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ },
+
+ onButtonMouseUp_: function(e) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ },
+
+ onButtonPress_: function(e) {
+
+ var mouseModeConstants = tracing.mouseModeConstants;
+ var newInteractionMode = mouseModeConstants.MOUSE_MODE_PANSCAN;
+
+ switch (e.target) {
+ case this.panScanModeButton_:
+ this.mode = mouseModeConstants.MOUSE_MODE_PANSCAN;
+ break;
+
+ case this.selectionModeButton_:
+ this.mode = mouseModeConstants.MOUSE_MODE_SELECTION;
+ break;
+
+ case this.zoomModeButton_:
+ this.mode = mouseModeConstants.MOUSE_MODE_ZOOM;
+ break;
+
+ default:
+ throw new Error('Unknown mouse mode button pressed');
+ break;
+ }
+
+ e.preventDefault();
+ this.isInTemporaryAlternativeMouseMode_ = false;
+ },
+
+ onKeyPress_: function(e) {
+
+ // Prevent the user from changing modes during an interaction.
+ if (this.isInteracting_)
+ return;
+
+ var mouseModeConstants = tracing.mouseModeConstants;
+
+ switch (e.keyCode) {
+ case 49: // 1
+ this.mode = mouseModeConstants.MOUSE_MODE_PANSCAN;
+ break;
+ case 50: // 2
+ this.mode = mouseModeConstants.MOUSE_MODE_SELECTION;
+ break;
+ case 51: // 3
+ this.mode = mouseModeConstants.MOUSE_MODE_ZOOM;
+ break;
+ }
+ },
+
+ onKeyDown_: function(e) {
+
+ // Prevent the user from changing modes during an interaction.
+ if (this.isInteracting_)
+ return;
+
+ var mouseModeConstants = tracing.mouseModeConstants;
+ var userIsPressingCmdOrCtrl = (base.isMac && e.metaKey) ||
+ (!base.isMac && e.ctrlKey);
+ var userIsPressingShiftKey = e.shiftKey;
+
+ if (this.mode !== mouseModeConstants.MOUSE_MODE_PANSCAN)
+ return;
+
+ if (userIsPressingCmdOrCtrl || userIsPressingShiftKey) {
+
+ this.mode = userIsPressingCmdOrCtrl ?
+ mouseModeConstants.MOUSE_MODE_ZOOM :
+ mouseModeConstants.MOUSE_MODE_SELECTION;
+
+ this.isInTemporaryAlternativeMouseMode_ = true;
+ e.preventDefault();
+ }
+ },
+
+ onKeyUp_: function(e) {
+
+ // Prevent the user from changing modes during an interaction.
+ if (this.isInteracting_)
+ return;
+
+ var mouseModeConstants = tracing.mouseModeConstants;
+ var userHasReleasedCmdOrCtrl = (base.isMac && !e.metaKey) ||
+ (!base.isMac && !e.ctrlKey);
+ var userHasReleasedShiftKey = e.shiftKey;
+
+ if (this.isInTemporaryAlternativeMouseMode_ &&
+ (userHasReleasedCmdOrCtrl || userHasReleasedShiftKey)) {
+ this.mode = mouseModeConstants.MOUSE_MODE_PANSCAN;
+ }
+
+ this.isInTemporaryAlternativeMouseMode_ = false;
+
+ },
+
+ constrainPositionToWindowBounds_: function() {
+ var top = 0;
+ var bottom = window.innerHeight - this.offsetHeight;
+ var left = 0;
+ var right = window.innerWidth - this.offsetWidth;
+
+ this.pos_.x = Math.max(this.pos_.x, left);
+ this.pos_.x = Math.min(this.pos_.x, right);
+
+ this.pos_.y = Math.max(this.pos_.y, top);
+ this.pos_.y = Math.min(this.pos_.y, bottom);
+ },
+
+ updateStylesFromPosition_: function() {
+ this.style.left = this.pos_.x + 'px';
+ this.style.top = this.pos_.y + 'px';
+
+ base.Settings.set('mouse_mode_selector.x', this.pos_.x);
+ base.Settings.set('mouse_mode_selector.y', this.pos_.y);
+ },
+
+ onDragHandleMouseDown_: function(e) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+
+ this.isDraggingModeSelectorDragHandle_ = true;
+
+ this.initialRelativeMouseDownPos_.x = e.clientX - this.offsetLeft;
+ this.initialRelativeMouseDownPos_.y = e.clientY - this.offsetTop;
+
+ },
+
+ onDragHandleMouseMove_: function(e) {
+ if (!this.isDraggingModeSelectorDragHandle_)
+ return;
+
+ this.pos_.x = (e.clientX - this.initialRelativeMouseDownPos_.x);
+ this.pos_.y = (e.clientY - this.initialRelativeMouseDownPos_.y);
+
+ this.constrainPositionToWindowBounds_();
+ this.updateStylesFromPosition_();
+ },
+
+ onDragHandleMouseUp_: function(e) {
+ this.isDraggingModeSelectorDragHandle_ = false;
+ },
+
+ onWindowResize_: function(e) {
+ this.constrainPositionToWindowBounds_();
+ this.updateStylesFromPosition_();
+ }
+ };
+
+ return {
+ MouseModeSelector: MouseModeSelector
+ };
+});
diff --git a/trace-viewer/src/ui/mouse_tracker.js b/trace-viewer/src/ui/mouse_tracker.js
new file mode 100644
index 0000000..b21b495
--- /dev/null
+++ b/trace-viewer/src/ui/mouse_tracker.js
@@ -0,0 +1,82 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+/**
+ * @fileoverview A Mouse-event abtraction that waits for
+ * mousedown, then watches for subsequent mousemove events
+ * until the next mouseup event, then waits again.
+ * State changes are signaled with
+ * 'mouse-tracker-start' : mousedown and tracking
+ * 'mouse-tracker-move' : mouse move
+ * 'mouse-tracker-end' : mouseup and not tracking.
+ */
+
+base.exportTo('ui', function() {
+
+ /**
+ * @constructor
+ * @param {HTMLElement} targetElement will recv events 'mouse-tracker-start',
+ * 'mouse-tracker-move', 'mouse-tracker-end'.
+ */
+ function MouseTracker(targetElement) {
+ this.targetElement_ = targetElement;
+
+ this.onMouseDown_ = this.onMouseDown_.bind(this);
+ this.onMouseMove_ = this.onMouseMove_.bind(this);
+ this.onMouseUp_ = this.onMouseUp_.bind(this);
+
+ this.targetElement_.addEventListener('mousedown', this.onMouseDown_);
+ }
+
+ MouseTracker.prototype = {
+
+ onMouseDown_: function(e) {
+ if (e.button !== 0)
+ return true;
+
+ e = this.remakeEvent_(e, 'mouse-tracker-start');
+ this.targetElement_.dispatchEvent(e);
+ document.addEventListener('mousemove', this.onMouseMove_);
+ document.addEventListener('mouseup', this.onMouseUp_);
+ this.targetElement_.addEventListener('blur', this.onMouseUp_);
+ this.savePreviousUserSelect_ = document.body.style['-webkit-user-select'];
+ document.body.style['-webkit-user-select'] = 'none';
+ e.preventDefault();
+ return true;
+ },
+
+ onMouseMove_: function(e) {
+ e = this.remakeEvent_(e, 'mouse-tracker-move');
+ this.targetElement_.dispatchEvent(e);
+ },
+
+ onMouseUp_: function(e) {
+ document.removeEventListener('mousemove', this.onMouseMove_);
+ document.removeEventListener('mouseup', this.onMouseUp_);
+ this.targetElement_.removeEventListener('blur', this.onMouseUp_);
+ document.body.style['-webkit-user-select'] =
+ this.savePreviousUserSelect_;
+ e = this.remakeEvent_(e, 'mouse-tracker-end');
+ this.targetElement_.dispatchEvent(e);
+ },
+
+ remakeEvent_: function(e, newType) {
+ var remade = new base.Event(newType, true, true);
+ remade.x = e.x;
+ remade.y = e.y;
+ remade.offsetX = e.offsetX;
+ remade.offsetY = e.offsetY;
+ remade.clientX = e.clientX;
+ remade.clientY = e.clientY;
+ return remade;
+ }
+
+ };
+
+ return {
+ MouseTracker: MouseTracker
+ };
+});
diff --git a/trace-viewer/src/ui/quad_stack.css b/trace-viewer/src/ui/quad_stack.css
index abd5cff..6894486 100644
--- a/trace-viewer/src/ui/quad_stack.css
+++ b/trace-viewer/src/ui/quad_stack.css
@@ -4,8 +4,10 @@
*/
quad-stack {
- display: block;
- min-height: 100%;
+ -webkit-flex: 1 1 100%;
+ -webkit-flex-direction: column;
+ display: -webkit-flex;
+ min-height: 357px;
outline: none;
position: relative;
width: 100%;
@@ -13,7 +15,7 @@
}
quad-stack > view-container {
- -webkit-flex: 1 1 auto;
+ -webkit-flex: 1 1 100%;
-webkit-transform-style: preserve-3d;
display: -webkit-flex;
outline: none;
@@ -22,6 +24,23 @@
quad-stack quad-view {
-webkit-transform: translateZ(0); /* actual xform for depth is set in rAF */
+ left: 0;
position: absolute;
top: 0;
+}
+
+quad-stack > view-container > rect-view {
+ background-image:
+ url('../images/chrome-left.png'),
+ url('../images/chrome-right.png'),
+ url('../images/chrome-mid.png');
+ background-position: left top, right top, left top;
+ background-repeat: no-repeat, no-repeat, repeat-x;
+ background-size: auto 72px;
+ border: 1px solid #999;
+ border-radius: 6px;
+ box-shadow: 0 0 20px rgba(0, 0, 0, 0.4);
+ margin-top: -72px;
+ padding-top: 72px;
+ position: absolute;
}
\ No newline at end of file
diff --git a/trace-viewer/src/ui/quad_stack.js b/trace-viewer/src/ui/quad_stack.js
index 2dd8d9f..0468a6d 100644
--- a/trace-viewer/src/ui/quad_stack.js
+++ b/trace-viewer/src/ui/quad_stack.js
@@ -14,6 +14,7 @@
base.require('ui.quad_view');
base.require('cc.region');
base.require('ui.camera');
+base.require('ui.rect_view');
base.exportTo('ui', function() {
var QuadView = ui.QuadView;
@@ -37,19 +38,16 @@
this.contentContainer_ = document.createElement('view-container');
this.appendChild(this.contentContainer_);
this.viewport_ = undefined;
+ this.worldViewportRectView_ = new ui.RectView();
this.quads_ = undefined;
- this.debug_ = false;
},
initialize: function(unpaddedWorldRect, opt_worldViewportRect) {
this.viewport_ = new ui.QuadViewViewport(unpaddedWorldRect);
- if (this.debug) {
- this.viewport_.addEventListener('change', function() {
- this.updateDebugIndicator_();
- }.bind(this));
- this.updateDebugIndicator_();
- }
+ this.viewport_.addEventListener('change', function() {
+ this.worldViewportRectView_.viewport = this.viewport_;
+ }.bind(this));
this.worldViewportRect_ = base.Rect.FromXYWH(
opt_worldViewportRect.x || 0,
@@ -57,6 +55,9 @@
opt_worldViewportRect.width,
opt_worldViewportRect.height
);
+
+ this.worldViewportRectView_.viewport = this.viewport_;
+ this.worldViewportRectView_.rect = this.worldViewportRect_;
},
get layers() {
@@ -77,15 +78,6 @@
this.updateContents_();
},
- get debug() {
- return this.debug_;
- },
-
- set debug(debug) {
- this.debug_ = debug;
- this.updateDebugIndicator_();
- },
-
get viewport() {
return this.viewport_;
},
@@ -94,11 +86,14 @@
return this.worldViewportRect_;
},
+ get worldViewportRectView() {
+ return this.worldViewportRectView_;
+ },
+
get contentContainer() {
return this.contentContainer_;
},
-
updateContents_: function() {
// Build the stacks.
var stackingGroupsById = {};
@@ -110,6 +105,10 @@
stackingGroupsById[quad.stackingGroupId].push(quad);
}
+ // Remove worldViewportRectView to re-insert after Quads.
+ if (this.worldViewportRectView_.parentNode === this.contentContainer_)
+ this.contentContainer_.removeChild(this.worldViewportRectView_);
+
// Get rid of old quad views if needed.
var numStackingGroups = base.dictionaryValues(stackingGroupsById).length;
while (this.contentContainer_.children.length > numStackingGroups) {
@@ -152,34 +151,21 @@
});
}
- var topQuadIndex = this.contentContainer_.children.length - 1;
- var topQuad = this.contentContainer_.children[topQuadIndex];
- topQuad.worldViewportRect = this.worldViewportRect_;
+ // Add worldViewportRectView after the Quads.
+ this.contentContainer_.appendChild(this.worldViewportRectView_);
for (var i = 0; i < this.contentContainer_.children.length; i++) {
var child = this.contentContainer_.children[i];
- child.quads = child.pendingQuads;
- delete child.pendingQuads;
+ if (child instanceof ui.QuadView) {
+ child.quads = child.pendingQuads;
+ delete child.pendingQuads;
+ }
}
+ this.viewport.updateBoxSize(this.contentContainer_);
this.layers = this.contentContainer_.children;
},
- updateDebugIndicator_: function() {
- this.indicatorCanvas_ = this.indicatorCanvas_ ||
- document.createElement('canvas');
- this.indicatorCanvas_.className = 'quad-stack-debug-indicator';
- this.contentContainer_.appendChild(this.indicatorCanvas_);
-
- var resizedCanvas = this.viewport_.updateBoxSize(this.indicatorCanvas_);
- var ctx = this.indicatorCanvas_.getContext('2d');
- ctx.fillStyle = 'red';
- ctx.fontStyle = '30px Arial';
- ctx.textAlign = 'center';
- ctx.textBaseline = 'middle';
- ctx.fillText('X', this.indicatorCanvas_.width / 2,
- this.indicatorCanvas_.height / 2);
- }
};
diff --git a/trace-viewer/src/ui/quad_stack_test.js b/trace-viewer/src/ui/quad_stack_test.js
index d4119bc..8368098 100644
--- a/trace-viewer/src/ui/quad_stack_test.js
+++ b/trace-viewer/src/ui/quad_stack_test.js
@@ -23,8 +23,6 @@
quads.forEach(function(quad) { quadsBbox.addQuad(quad); });
var stack = new ui.QuadStack();
- if (stack.debug)
- throw new Error('ui.QuadStack debug flag must not be truthy.');
var deviceViewportSizeForFrame = {width: 200, height: 100};
stack.initialize(quadsBbox.asRect(), deviceViewportSizeForFrame);
diff --git a/trace-viewer/src/ui/quad_stack_viewer.js b/trace-viewer/src/ui/quad_stack_viewer.js
index 514b0b2..0403cce 100644
--- a/trace-viewer/src/ui/quad_stack_viewer.js
+++ b/trace-viewer/src/ui/quad_stack_viewer.js
@@ -21,12 +21,8 @@
__proto__: HTMLUnknownElement.prototype,
decorate: function() {
- this.layerTreeImpl_ = undefined;
- this.selection_ = undefined;
-
- this.showInvalidations_ = true;
- this.showOtherLayers_ = true;
- this.showContents_ = true;
+ this.className = 'quad-stack-viewer';
+ this.scale_ = 0.25;
this.quadStack_ = new ui.QuadStack();
this.appendChild(this.quadStack_);
@@ -46,6 +42,10 @@
this.scale_ = newValue;
if (this.quadStack_.viewport)
this.quadStack_.viewport.scale = newValue;
+ },
+
+ get camera() {
+ return this.camera_;
}
};
diff --git a/trace-viewer/src/ui/quad_view.js b/trace-viewer/src/ui/quad_view.js
index aa3e5e8..76181f9 100644
--- a/trace-viewer/src/ui/quad_view.js
+++ b/trace-viewer/src/ui/quad_view.js
@@ -13,7 +13,10 @@
base.require('ui.quad_view_viewport');
base.exportTo('ui', function() {
- var RASTER_SCALE = 0.75; // Adjust the resolution of our backing canvases.
+ // FIXME(pdr): Remove this extra scaling so our rasters are pixel-perfect.
+ // https://code.google.com/p/trace-viewer/issues/detail?id=228
+ // FIXME(jjb): simplify until we have the camera working (or 228 happens ;-)
+ var RASTER_SCALE = 1.0; // Adjust the resolution of our backing canvases.
// Care of bckenney@ via
// http://extremelysatisfactorytotalitarianism.com/blog/?p=2120
@@ -67,7 +70,6 @@
this.quads_ = undefined;
this.viewport_ = undefined;
- this.worldViewportRect_ = undefined;
this.canvas_ = document.createElement('canvas');
this.appendChild(this.canvas_);
@@ -115,38 +117,6 @@
}
this.viewport_ = this.viewport_ ||
this.createViewportFromQuads_(this.quads_);
-
- this.quads_.forEach(function(quad) {
- if (!quad.backgroundRasterData)
- return;
- var tex = quad.backgroundRasterData;
- var helperCanvas = document.createElement('canvas');
- helperCanvas.width = tex.width;
- helperCanvas.height = tex.height;
- var ctx = helperCanvas.getContext('2d');
- var imageData = ctx.createImageData(tex.width, tex.height);
- imageData.data.set(tex.data);
- ctx.putImageData(imageData, 0, 0);
- var img = document.createElement('img');
- img.onload = function() {
- quad.backgroundImage = img;
- this.scheduleRedrawCanvas_();
- }.bind(this);
- img.src = helperCanvas.toDataURL();
- }, this);
- this.updateChildren_();
- },
-
- get worldViewportRect() {
- return this.worldViewportRect_;
- },
-
- /**
- * When set, darkens the canvas outside of the viewport in order to
- * make waht is inside vs outside the viewport more obvious.
- */
- set worldViewportRect(rect) {
- this.worldViewportRect_ = rect;
this.updateChildren_();
},
@@ -200,26 +170,26 @@
// Background colors.
for (var i = 0; i < quads.length; i++) {
var quad = quads[i];
- if (quad.backgroundImage) {
+ if (quad.canvas) {
if (quad.isRectangle()) {
var bounds = quad.boundingRect();
- ctx.drawImage(quad.backgroundImage, 0, 0,
- quad.backgroundImage.width, quad.backgroundImage.height,
+ ctx.drawImage(quad.canvas, 0, 0,
+ quad.canvas.width, quad.canvas.height,
bounds.x, bounds.y, bounds.width, bounds.height);
} else {
ctx.save();
var quadBBox = new base.BBox2();
quadBBox.addQuad(quad);
- var iw = quad.backgroundImage.width;
- var ih = quad.backgroundImage.height;
+ var iw = quad.canvas.width;
+ var ih = quad.canvas.height;
drawTexturedTriangle(
- ctx, quad.backgroundImage,
+ ctx, quad.canvas,
quad.p1[0], quad.p1[1],
quad.p2[0], quad.p2[1],
quad.p4[0], quad.p4[1],
0, 0, iw, 0, 0, ih);
drawTexturedTriangle(
- ctx, quad.backgroundImage,
+ ctx, quad.canvas,
quad.p2[0], quad.p2[1],
quad.p3[0], quad.p3[1],
quad.p4[0], quad.p4[1],
@@ -281,9 +251,6 @@
ctx.stroke();
}
- if (this.worldViewportRect_)
- this.drawDeviceViewport_(ctx);
-
ctx.restore();
},
@@ -324,39 +291,6 @@
return new ui.QuadViewViewport(quadBBox.asRect());
},
- drawDeviceViewport_: function(ctx) {
- var vW = this.worldViewportRect_.width;
- var vH = this.worldViewportRect_.height;
- var vp = this.viewport_;
-
- ctx.fillStyle = 'rgba(0,0,0,0.2)';
-
- // Cover above and below the viewport with dark grey.
- ctx.fillRect(vp.worldRect.x,
- vp.worldRect.y,
- vp.worldRect.width,
- -vp.worldRect.y);
- ctx.fillRect(vp.worldRect.x,
- vH,
- vp.worldRect.width,
- vp.worldRect.height - vH);
-
- // Cover left and right of the viewport with dark grey.
- ctx.fillRect(vp.worldRect.x,
- 0,
- -vp.worldRect.x,
- vH);
- ctx.fillRect(vW,
- 0,
- vp.worldRect.width - vW,
- vH);
-
- // Stroke area around viewport.
- ctx.lineWidth = vp.getDeviceLineWidthAssumingTransformIsApplied(2.0);
- ctx.strokeStyle = 'rgba(0,0,255,1)';
- ctx.strokeRect(0, 0, vW, vH);
- },
-
onMouseDown_: function(e) {
if (!this.hasEventListener('selectionChanged'))
return;
diff --git a/trace-viewer/src/ui/quad_view_test.js b/trace-viewer/src/ui/quad_view_test.js
index b17c5e6..5b19779 100644
--- a/trace-viewer/src/ui/quad_view_test.js
+++ b/trace-viewer/src/ui/quad_view_test.js
@@ -34,7 +34,7 @@
quadView.title = 'Test Tree';
quadView.quads = quads;
quadView.viewport = new QuadViewViewport(quadsBBox.asRect(), 10.0);
- quadView.deviceViewportSizeForFrame = {widht: 50, height: 30};
+ quadView.deviceViewportSizeForFrame = {width: 50, height: 30};
quadView.addEventListener(
'selectionChanged',
@@ -75,7 +75,6 @@
data[13] = 0;
data[14] = 255;
data[15] = 255;
- quads[0].backgroundRasterData = { data: data, width: 2, height: 2 };
var quadsBBox = new base.BBox2();
for (var i = 0; i < quads.length; i++)
@@ -114,7 +113,6 @@
data[13] = 0;
data[14] = 255;
data[15] = 255;
- quads[0].backgroundRasterData = { data: data, width: 2, height: 2 };
var quadsBBox = new base.BBox2();
for (var i = 0; i < quads.length; i++)
quadsBBox.addQuad(quads[i]);
diff --git a/trace-viewer/src/ui/quad_view_viewport.js b/trace-viewer/src/ui/quad_view_viewport.js
index 737e182..d1bb3a2 100644
--- a/trace-viewer/src/ui/quad_view_viewport.js
+++ b/trace-viewer/src/ui/quad_view_viewport.js
@@ -8,6 +8,9 @@
base.require('base.events');
base.exportTo('ui', function() {
+ // FIXME(pdr): Replace this padding with just what's necessary for
+ // drawing borders / highlights.
+ // https://code.google.com/p/trace-viewer/issues/detail?id=228
var DEFAULT_PAD_PERCENTAGE = 0.75;
function QuadViewViewport(worldRect,
@@ -60,6 +63,10 @@
return this.worldRect_;
},
+ get unpaddedWorldRect() {
+ return this.unpaddedWorldRect_;
+ },
+
updateBoxSize: function(canvas) {
var resizedCanvas = false;
if (canvas.width !== this.worldWidthInDevicePixels_) {
@@ -91,8 +98,8 @@
return res;
},
- getWorldToDevicePixelTransform: function() {
- return this.transformDevicePixelsToWorld_;
+ getWorldToDevicePixelsTransform: function() {
+ return this.transformWorldToDevicePixels_;
},
getDeviceLineWidthAssumingTransformIsApplied: function(
@@ -113,7 +120,6 @@
//-------------------------------------------
updateScale_: function() {
- // Scale the world to the size selected by the user.
this.worldWidthInDevicePixels_ =
this.worldRect_.width * this.worldPixelsPerDevicePixel_;
this.worldHeightInDevicePixels_ =
@@ -128,12 +134,9 @@
/** Adjust the scaled world box for Retina-like displays */
updateLayoutRect_: function() {
- var devicePixelsPerLayoutPixel = 1 / this.devicePixelRatio;
- this.layoutRect_ = base.Rect.FromXYWH(
- this.worldRect.x * devicePixelsPerLayoutPixel,
- this.worldRect.y * devicePixelsPerLayoutPixel,
- this.worldWidthInDevicePixels_ * devicePixelsPerLayoutPixel,
- this.worldHeightInDevicePixels_ * devicePixelsPerLayoutPixel);
+ var devicePixelsPerLayoutPixel =
+ this.worldPixelsPerDevicePixel_ / this.devicePixelRatio;
+ this.layoutRect_ = this.worldRect.scale(devicePixelsPerLayoutPixel);
},
setWorldRect_: function(worldRect, opt_padding) {
@@ -147,8 +150,8 @@
worldPad = Math.min(worldRect.width,
worldRect.height) * padding;
- worldRect = worldRect.enlarge(worldPad);
- this.worldRect_ = worldRect;
+ this.unpaddedWorldRect_ = worldRect;
+ this.worldRect_ = worldRect.clone().enlarge(worldPad);
},
updateTransform_: function() {
diff --git a/trace-viewer/src/ui/quad_view_viewport_test.js b/trace-viewer/src/ui/quad_view_viewport_test.js
index 35c02c3..16fba57 100644
--- a/trace-viewer/src/ui/quad_view_viewport_test.js
+++ b/trace-viewer/src/ui/quad_view_viewport_test.js
@@ -10,7 +10,7 @@
base.unittest.testSuite('ui.quad_view_viewport', function() {
var QuadViewViewport = ui.QuadViewViewport;
- test('basicsHighDPI', function() {
+ test('basicsHighDPIUnpadded', function() {
var bbox = new base.BBox2();
bbox.addXY(0, 0);
bbox.addXY(4000, 2000);
@@ -37,9 +37,11 @@
var tmp = vp.layoutPixelsToWorldPixels(vec2.createXY(250, 125));
assertEquals(4000, tmp[0]);
assertEquals(2000, tmp[1]);
+
+ assertRectEquals(bbox.asRect(), vp.unpaddedWorldRect);
});
- test('basicsHighDPIUnpadded', function() {
+ test('basicsHighDPI', function() {
var bbox = new base.BBox2();
bbox.addXY(0, 0);
bbox.addXY(4000, 2000);
@@ -65,5 +67,7 @@
var tmp = vp.layoutPixelsToWorldPixels(vec2.createXY(275, 150));
assertEquals(4200, tmp[0]);
assertEquals(2200, tmp[1]);
+
+ assertRectEquals(bbox.asRect(), vp.unpaddedWorldRect);
});
});
diff --git a/trace-viewer/src/ui/rect_view.css b/trace-viewer/src/ui/rect_view.css
new file mode 100644
index 0000000..5a2f43e
--- /dev/null
+++ b/trace-viewer/src/ui/rect_view.css
@@ -0,0 +1,8 @@
+/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+rect-view {
+ border: 1px solid #999;
+}
\ No newline at end of file
diff --git a/trace-viewer/src/ui/rect_view.js b/trace-viewer/src/ui/rect_view.js
new file mode 100644
index 0000000..4c6cfa9
--- /dev/null
+++ b/trace-viewer/src/ui/rect_view.js
@@ -0,0 +1,66 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+/**
+ * @fileoverview RectView is used to visualize a rect.
+ */
+
+base.exportTo('ui', function() {
+ // Area above the RectView used draw decorations.
+ var DECORATION_HEIGHT = 36;
+
+ /**
+ * @constructor
+ */
+ var RectView = ui.define('rect-view');
+
+ RectView.prototype = {
+ __proto__: HTMLUnknownElement.prototype,
+
+ decorate: function() {
+ this.viewport_ = undefined;
+ this.rect_ = undefined;
+ },
+
+ set viewport(viewport) {
+ this.viewport_ = viewport;
+ this.updateContents_();
+ },
+
+ set rect(rect) {
+ this.rect_ = rect;
+ this.updateContents_();
+ },
+
+ updateContents_: function() {
+ if (this.viewport_ === undefined || this.rect_ === undefined)
+ return;
+
+ var devicePixelsPerLayoutPixel = 1 / this.viewport_.devicePixelRatio;
+
+ var topLeft = vec2.fromValues(this.rect_.x, this.rect_.y);
+ var botRight = vec2.fromValues(
+ topLeft[0] + this.rect_.width,
+ topLeft[1] + this.rect_.height);
+ vec2.transformMat2d(topLeft, topLeft,
+ this.viewport_.getWorldToDevicePixelsTransform());
+ vec2.scale(topLeft, topLeft, devicePixelsPerLayoutPixel);
+ vec2.transformMat2d(botRight, botRight,
+ this.viewport_.getWorldToDevicePixelsTransform());
+ vec2.scale(botRight, botRight, devicePixelsPerLayoutPixel);
+ this.style.width = botRight[0] - topLeft[0] + 'px';
+ this.style.height = DECORATION_HEIGHT + botRight[1] - topLeft[1] + 'px';
+ this.style.left = topLeft[0] + 'px';
+ this.style.top = DECORATION_HEIGHT + topLeft[1] + 'px';
+ this.style.backgroundSize = 'auto ' + DECORATION_HEIGHT + 'px';
+ }
+
+ };
+
+ return {
+ RectView: RectView
+ };
+});
diff --git a/trace-viewer/src/ui/rect_view_test.js b/trace-viewer/src/ui/rect_view_test.js
new file mode 100644
index 0000000..2293157
--- /dev/null
+++ b/trace-viewer/src/ui/rect_view_test.js
@@ -0,0 +1,37 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.require('base.bbox2');
+base.require('base.quad');
+base.require('ui.quad_stack');
+base.require('ui.quad_view_viewport');
+base.require('ui.rect_view');
+
+base.unittest.testSuite('ui.rect_view', function() {
+
+ test('rect_size', function() {
+ var quads = [
+ base.Quad.FromXYWH(100, 100, 300, 400),
+ base.Quad.FromXYWH(100, 100, 100, 100)
+ ];
+ quads[0].stackingGroupId = 0;
+ quads[1].stackingGroupId = 1;
+
+ var quadsBbox = new base.BBox2();
+ quads.forEach(function(quad) { quadsBbox.addQuad(quad); });
+
+ var stack = new ui.QuadStack();
+
+ var deviceViewportSizeForFrame = {width: 1000, height: 400};
+ stack.initialize(quadsBbox.asRect(), deviceViewportSizeForFrame);
+ stack.quads = quads;
+
+ this.addHTMLOutput(stack);
+
+ assertEquals('125px', stack.worldViewportRectView.style.width);
+ assertEquals((50 + 36) + 'px', stack.worldViewportRectView.style.height);
+ });
+});
diff --git a/trace-viewer/src/ui/text_end_value_bar.js b/trace-viewer/src/ui/text_end_value_bar.js
new file mode 100644
index 0000000..3c52313
--- /dev/null
+++ b/trace-viewer/src/ui/text_end_value_bar.js
@@ -0,0 +1,80 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+/**
+ * @fileoverview A scrollbar-like control with constant text hi/lo values.
+ */
+base.require('ui');
+base.require('base.properties');
+base.require('ui.value_bar');
+
+base.exportTo('ui', function() {
+
+ /**
+ * @constructor
+ */
+ var TextEndValueBar = ui.define('text-end-value-bar');
+
+ TextEndValueBar.prototype = {
+ __proto__: ui.ValueBar.prototype,
+
+ decorate: function() {
+ this.lowestValueProperties_ = {textContent: ''};
+ this.highestValueProperties_ = {textContent: ''};
+ ui.ValueBar.prototype.decorate.call(this);
+ this.classList.add('text-end-value-bar');
+ },
+
+ get lowestValueProperties() {
+ return this.lowestValueProperties_;
+ },
+
+ set lowestValueProperties(newValue) {
+ console.assert(typeof newValue === 'object' &&
+ (newValue.style || newValue.textContent));
+ this.lowestValueProperties_ = newValue;
+ base.dispatchPropertyChange(this, 'lowestValue',
+ this.lowestValue, this.lowestValue);
+ },
+
+ get highestValueProperties() {
+ return this.highestValueProperties_;
+ },
+
+ set highestValueProperties(newValue) {
+ console.assert(typeof newValue === 'object' &&
+ (newValue.style || newValue.textContent));
+ this.highestValueProperties_ = newValue;
+ base.dispatchPropertyChange(this, 'highestValue',
+ this.highestValue, this.highestValue);
+ },
+
+ copyOwnProperties_: function(dst, src) {
+ if (!src)
+ return;
+ Object.keys(src).forEach(function(key) {
+ dst[key] = src[key];
+ });
+ },
+
+ updateLowestValueElement: function(element) {
+ this.copyOwnProperties_(element.style,
+ this.lowestValueProperties_.style);
+ element.textContent = this.lowestValueProperties_.textContent || '';
+ },
+
+ updateHighestValueElement: function(element) {
+ this.copyOwnProperties_(element.style,
+ this.highestValueProperties_.style);
+ element.textContent = this.highestValueProperties_.textContent || '';
+ },
+
+ };
+
+ return {
+ TextEndValueBar: TextEndValueBar
+ };
+});
diff --git a/trace-viewer/src/ui/text_end_value_bar_test.js b/trace-viewer/src/ui/text_end_value_bar_test.js
new file mode 100644
index 0000000..6aea723
--- /dev/null
+++ b/trace-viewer/src/ui/text_end_value_bar_test.js
@@ -0,0 +1,45 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.requireStylesheet('ui.value_bar');
+base.require('base.unittest');
+base.require('base.bbox2');
+base.require('ui.dom_helpers');
+base.require('ui.text_end_value_bar');
+
+base.unittest.testSuite('ui.text_end_value_bar', function() {
+
+ function synClick(element) {
+ var event = new MouseEvent('click', {});
+ element.dispatchEvent(event);
+ }
+
+ test('instantiate', function() {
+ var container = ui.createDiv();
+ container.style.position = 'relative';
+ container.style.height = '200px';
+
+ var valueBar = new ui.TextEndValueBar();
+ valueBar.style['-webkit-flex-direction'] = 'column';
+
+ this.addHTMLOutput(container);
+ container.appendChild(valueBar);
+
+ valueBar.lowestValueProperties = {
+ style: {
+ 'fontSize': '24px',
+ },
+ textContent: 'Z'
+ };
+ valueBar.highestValueProperties = {
+ style: {
+ 'fontSize': '24px',
+ },
+ textContent: 'Y'
+ };
+ assertEquals('ZY', valueBar.textContent);
+ });
+});
diff --git a/trace-viewer/src/ui/tool_button.css b/trace-viewer/src/ui/tool_button.css
new file mode 100644
index 0000000..bb9abd3
--- /dev/null
+++ b/trace-viewer/src/ui/tool_button.css
@@ -0,0 +1,17 @@
+/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+.tool-button {
+ background-position: center center;
+ background-repeat: no-repeat;
+ border-bottom: 1px solid #BCBCBC;
+ border-top: 1px solid #F1F1F1;
+ cursor: pointer;
+ height: 30px;
+}
+
+.tool-button.active {
+ cursor: auto;
+}
diff --git a/trace-viewer/src/ui/value_bar.css b/trace-viewer/src/ui/value_bar.css
new file mode 100644
index 0000000..7227d3b
--- /dev/null
+++ b/trace-viewer/src/ui/value_bar.css
@@ -0,0 +1,112 @@
+/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* Base class rules, internal to value-bar */
+
+.value-bar {
+ -webkit-flex-wrap: nowrap;
+ color: gray;
+ display: -webkit-flex;
+ position: absolute;
+ z-index: 100;
+}
+
+.value-bar .value-control {
+ -webkit-user-select: none;
+ background-color: whitesmoke;
+ border: 1px solid gray;
+ cursor: pointer;
+ font-family: sans-serif;
+ font-size: 12px;
+}
+
+.value-bar .lowest-value-control {
+ position: relative;
+ z-index: 100;
+}
+
+.value-bar .highest-value-control {
+ position: relative;
+ z-index: 100;
+}
+
+.value-bar .value-range-control {
+ background-color: lightgray;
+ position: relative;
+}
+
+.value-bar .value-slider {
+ background-color: gray;
+ position: absolute;
+ z-index: 99;
+}
+
+.value-bar[orient='vertical'] .lowest-value-control {
+ border-bottom: none;
+}
+
+.value-bar[orient='vertical'] .value-slider {
+ cursor: row-resize;
+ width: 18px;
+}
+
+.value-bar[orient='vertical'] .value-slider-top {
+ border-bottom: 1px solid black;
+ height: 5px;
+}
+
+ .value-bar[orient='vertical'] .value-slider-bottom {
+ border-top: 1px solid black;
+ height: 5px;
+}
+
+.value-bar[orient='vertical'] .value-range-control {
+ height: 100px;
+}
+
+.value-bar[orient='vertical'] .highest-value-control {
+ border-top: none;
+}
+
+.value-bar[orient='vertical'] .value-display {
+ left: 25px;
+}
+
+.value-bar[orient='horizontal'] .lowest-value-control {
+ border-right: none;
+}
+
+.value-bar[orient='horizontal'] .value-slider {
+ cursor: col-resize;
+ height: 18px;
+ white-space: nowrap;
+}
+
+.value-bar[orient='horizontal'] .value-slider-top {
+ border-right: 1px solid black;
+ display: inline-block;
+ height: 18px;
+ width: 5px;
+}
+
+.value-bar[orient='horizontal'] .value-slider-bottom {
+ border-left: 1px solid black;
+ display: inline-block;
+ height: 18px;
+ width: 5px;
+}
+
+
+.value-bar[orient='horizontal'] .value-range-control {
+ width: 100px;
+}
+
+.value-bar[orient='horizontal'] .highest-value-control {
+ border-left: none;
+}
+
+.value-bar[orient='horizontal'] .value-display {
+ left: 25px;
+}
diff --git a/trace-viewer/src/ui/value_bar.js b/trace-viewer/src/ui/value_bar.js
new file mode 100644
index 0000000..2441d3c
--- /dev/null
+++ b/trace-viewer/src/ui/value_bar.js
@@ -0,0 +1,336 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+/**
+ * @fileoverview A base class for scrollbar-like controls.
+ */
+base.require('ui');
+base.require('base.properties');
+base.require('ui.mouse_tracker');
+
+base.requireStylesheet('ui.value_bar');
+
+base.exportTo('ui', function() {
+
+ /**
+ * @constructor
+ */
+ var ValueBar = ui.define('value-bar');
+
+ ValueBar.prototype = {
+ __proto__: HTMLDivElement.prototype,
+
+ decorate: function() {
+ this.className = 'value-bar';
+ this.lowestValueControl_ = this.createLowestValueControl_();
+ this.valueRangeControl_ = this.createValueRangeControl_();
+ this.highestValueControl_ = this.createHighestValueControl_();
+ this.valueSliderControl_ =
+ this.createValueSlider_(this.valueRangeControl_);
+
+ this.vertical = true;
+ this.exponentBase_ = 1.0;
+ this.lowestValue = 0.1;
+ this.highestValue = 2.0;
+ this.value = 0.5;
+ },
+
+ get lowestValue() {
+ return this.lowestValue_;
+ },
+
+ set lowestValue(newValue) {
+ base.setPropertyAndDispatchChange(this, 'lowestValue', newValue);
+ },
+
+ get value() {
+ return this.value_;
+ },
+
+ set value(newValue) {
+ if (newValue === this.value)
+ return;
+ newValue = this.limitValue_(newValue);
+ base.setPropertyAndDispatchChange(this, 'value', newValue);
+ },
+
+ // A value that changes when you mouseover slider.
+ get previewValue() {
+ return this.previewValue_;
+ },
+
+ set previewValue(newValue) {
+ if (newValue === this.previewValue_)
+ return;
+ newValue = this.limitValue_(newValue);
+ base.setPropertyAndDispatchChange(this, 'previewValue', newValue);
+ },
+
+ get highestValue() {
+ return this.highestValue_;
+ },
+
+ set highestValue(newValue) {
+ base.setPropertyAndDispatchChange(this, 'highestValue', newValue);
+ },
+
+ get vertical() {
+ return this.vertical_;
+ },
+
+ set vertical(newValue) {
+ this.vertical_ = !!newValue;
+ delete this.rangeControlOffset_;
+ delete this.rangeControlPixelRange_;
+ delete this.valueSliderCenterOffset_;
+ this.setAttribute('orient', this.vertical_ ? 'vertical' : 'horizontal');
+ base.setPropertyAndDispatchChange(this, 'value', this.value);
+ },
+
+ get exponentBase() {
+ return this.exponentBase_;
+ },
+
+ // Controls the amount of non-linearity in the value bar.
+ // Higher bases make changes at low value value slower
+ // and changes at high values faster.
+ set exponentBase(newValue) {
+ this.exponentBase_ = newValue;
+ },
+
+ // Override to change content.
+ updateLowestValueElement: function(element) {
+ element.removeAttribute('style');
+ var str = event.newValue.toFixed(1) + '';
+ element.textContent = str.substr(0, 3);
+ },
+
+ updateHighestValueElement: function(element) {
+ element.removeAttribute('style');
+ var str = event.newValue.toFixed(1) + '';
+ element.textContent = str.substr(0, 3);
+ },
+
+ get rangeControlOffset() {
+ if (!this.rangeControlOffset_) {
+ var rect = this.valueRangeControl_.getBoundingClientRect();
+ this.rangeControlOffset_ = this.vertical_ ? rect.top : rect.left;
+ }
+ return this.rangeControlOffset_;
+ },
+
+ get valueSlideCenterOffset() {
+ var offsetDirection = this.vertical_ ? 'offsetTop' : 'offsetLeft';
+ return this.valueSliderCenter_[offsetDirection] + 1;
+ },
+
+ get rangeControlPixelRange() {
+ if (!this.rangeControlPixelRange_ || this.rangeControlPixelRange_ < 1) {
+ var rangeRect = this.valueRangeControl_.getBoundingClientRect();
+ this.rangeControlPixelRange_ =
+ this.vertical_ ? rangeRect.height - 1 : rangeRect.width - 1;
+ }
+ return this.rangeControlPixelRange_;
+ },
+
+ // The value <--> pixel conversion formulas are all normalized to the
+ // range 0-1 to avoid overflow surprises. Three layers of normalization
+ // include:
+ // 1. pixel range of the valuebar
+ // 2. exponent/log of the normalized ranges
+ // 3. value range
+
+ // offset zero gives 0, offset rangeControlPixelRange_ gives 1,
+ // exponential in between.
+ fractionalValue_: function(offset) {
+ if (!this.rangeControlPixelRange)
+ return 0;
+ console.assert(offset >= 0);
+ // min offset is zero, so this ratio is (offset - min) / (max - min)
+ var fractionOfRange = offset / this.rangeControlPixelRange_;
+ if (fractionOfRange > 1)
+ fractionOfRange = 1.0;
+ if (this.exponentBase === 1)
+ return fractionOfRange;
+ // The - 1 terms are Math.pow(this.exponentBase_, 0) for the minimum
+ // pixel range of zero.
+ var numerator = Math.pow(this.exponentBase_, fractionOfRange) - 1;
+ return numerator / (this.exponentBase_ - 1);
+ },
+
+ // fractionalValue zero gives zero, 1.0 gives rangeControlPixelRange_
+ pixelByValue_: function(fractionalValue) {
+ console.assert(fractionalValue >= 0 && fractionalValue <= 1);
+ if (this.exponentBase_ === 1)
+ return this.rangeControlPixelRange * fractionalValue;
+
+ // fractionalValue *(this.exponentBase_^1 - this.exponentBase_^0) +
+ // this.exponentBase_^0
+ var expPixel = fractionalValue * (this.exponentBase_ - 1) + 1;
+ var fractionalPixel = Math.log(expPixel) / Math.log(this.exponentBase_);
+ // (max - min) * fractionalPixel + min for min == 0
+ return this.rangeControlPixelRange * fractionalPixel;
+ },
+
+ limitValue_: function(newValue) {
+ var limitedValue = newValue;
+ if (newValue < this.lowestValue)
+ limitedValue = this.lowestValue;
+ if (newValue > this.highestValue)
+ limitedValue = this.highestValue;
+ return limitedValue;
+ },
+
+ eventToPixelOffset_: function(event) {
+ var coord = this.vertical_ ? 'y' : 'x';
+ var pixelOffset = event[coord] - this.rangeControlOffset;
+ return Math.max(pixelOffset, 1);
+ },
+
+ convertPixelOffsetToValue_: function(offset) {
+ var rangeInValue = this.highestValue - this.lowestValue;
+ return this.fractionalValue_(offset) * (rangeInValue) + this.lowestValue;
+ },
+
+ convertValueToPixelOffset: function(value) {
+ if (!this.highestValue)
+ return 0;
+ var rangeInValue = this.highestValue - this.lowestValue;
+ var valueInPx =
+ this.pixelByValue_((value - this.lowestValue) / rangeInValue);
+ return valueInPx;
+ },
+
+ setValueOnRangeClick_: function(event) {
+ var pixelOffset = this.eventToPixelOffset_(event);
+ this.value = this.convertPixelOffsetToValue_(pixelOffset);
+ },
+
+ setPreviewValueByEvent_: function(event) {
+ var pixelOffset = this.eventToPixelOffset_(event);
+ if (event.currentTarget.classList.contains('lowest-value-control'))
+ pixelOffset = 0; // There is a 4 pixel error on the bottom of the range.
+ this.previewValue = this.convertPixelOffsetToValue_(pixelOffset);
+ },
+ /**
+ @param {Event} event: mouse event relative to slider control
+ */
+ slideStart_: function(event) {
+ this.slideStart_ = event;
+ },
+ /**
+ @param {Event} event: mouse event relative to slider control
+ */
+ slideValue_: function(event) {
+ var pixelOffset = this.eventToPixelOffset_(event);
+ this.value =
+ this.convertPixelOffsetToValue_(pixelOffset);
+ },
+
+ slideEnd_: function(event) {
+ this.preview = this.value;
+ },
+
+ onValueChange_: function(valueKey) {
+ var pixelOffset = this.convertValueToPixelOffset(this[valueKey]);
+ pixelOffset = pixelOffset - this.valueSlideCenterOffset;
+ if (this.vertical_) {
+ this.valueSliderControl_.style.left = 0;
+ this.valueSliderControl_.style.top = pixelOffset + 'px';
+ } else {
+ this.valueSliderControl_.style.left = pixelOffset + 'px';
+ this.valueSliderControl_.style.top = 0;
+ }
+ },
+
+ createValueControl_: function(className) {
+ return ui.createDiv({
+ className: className + ' value-control',
+ parent: this
+ });
+ },
+
+ createLowestValueControl_: function() {
+ var lowestValueControl = this.createValueControl_('lowest-value-control');
+
+ lowestValueControl.addEventListener('click', function() {
+ this.value = this.lowestValue;
+ base.dispatchSimpleEvent(this, 'lowestValueClick');
+ }.bind(this));
+ lowestValueControl.addEventListener('mouseover',
+ this.setPreviewValueByEvent_.bind(this));
+
+ // Interior element to control the whitespace around the button text
+ var lowestValueControlContent =
+ ui.createSpan({className: 'lowest-value-control-content'});
+ lowestValueControl.appendChild(lowestValueControlContent);
+
+ this.addEventListener('lowestValueChange', function(event) {
+ this.updateLowestValueElement(lowestValueControlContent);
+ }.bind(this));
+
+ return lowestValueControl;
+ },
+
+ createValueRangeControl_: function() {
+ var valueRangeControl = this.createValueControl_('value-range-control');
+ // As the user moves over our range control, preview the result.
+ valueRangeControl.addEventListener('mousemove',
+ this.setPreviewValueByEvent_.bind(this));
+ // Accept the current value.
+ valueRangeControl.addEventListener('click',
+ this.setValueOnRangeClick_.bind(this));
+ this.addEventListener('valueChange',
+ this.onValueChange_.bind(this, 'value'), true);
+ return valueRangeControl;
+ },
+
+ createHighestValueControl_: function() {
+ var highestValueControl =
+ this.createValueControl_('highest-value-control');
+ highestValueControl.addEventListener('click', function() {
+ this.value = this.highestValue;
+ base.dispatchSimpleEvent(this, 'highestValueClick');
+ }.bind(this));
+ var highestValueControlContent =
+ ui.createSpan({className: 'highest-value-control-content'});
+ highestValueControl.appendChild(highestValueControlContent);
+ this.addEventListener('highestValueChange', function(event) {
+ this.updateHighestValueElement(highestValueControlContent);
+ }.bind(this));
+ return highestValueControl;
+ },
+
+ createValueSlider_: function(rangeControl) {
+ var valueSlider = ui.createDiv({
+ className: 'value-slider',
+ parent: rangeControl
+ });
+ ui.createDiv({
+ className: 'value-slider-top',
+ parent: valueSlider
+ });
+ this.valueSliderCenter_ = ui.createDiv({
+ className: 'value-slider-bottom',
+ parent: valueSlider
+ });
+
+ this.mouseTracker = new ui.MouseTracker(valueSlider);
+ valueSlider.addEventListener('mouse-tracker-start',
+ this.slideStart_.bind(this));
+ valueSlider.addEventListener('mouse-tracker-move',
+ this.slideValue_.bind(this));
+ valueSlider.addEventListener('mouse-tracker-end',
+ this.slideEnd_.bind(this));
+ return valueSlider;
+ },
+
+ };
+
+ return {
+ ValueBar: ValueBar
+ };
+});
diff --git a/trace-viewer/src/ui/value_bar_test.js b/trace-viewer/src/ui/value_bar_test.js
new file mode 100644
index 0000000..0c403be
--- /dev/null
+++ b/trace-viewer/src/ui/value_bar_test.js
@@ -0,0 +1,169 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+base.requireStylesheet('ui.value_bar');
+base.require('base.unittest');
+base.require('base.bbox2');
+base.require('ui.dom_helpers');
+base.require('ui.value_bar');
+base.require('ui.value_display');
+
+base.unittest.testSuite('ui.value_bar', function() {
+
+ function synClick(element) {
+ var event = new MouseEvent('click', {});
+ element.dispatchEvent(event);
+ }
+
+ function createValueBar(testFramework) {
+ var container = ui.createDiv();
+ container.style.position = 'relative';
+ container.style.height = '200px';
+
+ var valueBar = new ui.ValueBar();
+ valueBar.style['-webkit-flex-direction'] = 'column';
+
+ testFramework.addHTMLOutput(container);
+ container.appendChild(valueBar);
+
+ return valueBar;
+ }
+
+ test('vertical', function() {
+ var valueBar = createValueBar(this);
+
+ // Test public change event api
+ var changeEventsTested = 0;
+ valueBar.addEventListener('lowestValueChange', function(event) {
+ assertEquals(event.newValue, valueBar.lowestValue);
+ changeEventsTested++;
+ });
+
+ valueBar.addEventListener('highestValueChange', function(event) {
+ assertEquals(event.newValue, valueBar.highestValue);
+ changeEventsTested++;
+ });
+
+ valueBar.addEventListener('valueChange', function(event) {
+ assertEquals(event.newValue, valueBar.value);
+ changeEventsTested++;
+ });
+
+ valueBar.addEventListener('previewValueChange', function(event) {
+ assertEquals(event.newValue, valueBar.previewValue);
+ changeEventsTested++;
+ });
+
+ valueBar.lowestValue = 0.2;
+ assertEquals(valueBar.lowestValue, 0.2);
+
+ valueBar.highestValue = 3.0;
+ assertEquals(valueBar.highestValue, 3.0);
+
+ valueBar.value = 1.0;
+ assertEquals(valueBar.value, 1.0);
+
+ valueBar.previewValue = 0.5;
+ assertEquals(valueBar.previewValue, 0.5);
+
+ // Verify that all change events fired.
+ assertEquals(changeEventsTested, 4);
+ });
+
+ test('rangeControl', function() {
+ var valueBar = createValueBar(this);
+
+ var controlRange = valueBar.rangeControlPixelRange;
+ assertEquals(valueBar.fractionalValue_(0), 0);
+ assertEquals(valueBar.fractionalValue_(controlRange), 1);
+
+ assertEquals(valueBar.pixelByValue_(0), 0);
+ assertEquals(valueBar.pixelByValue_(1), controlRange);
+
+ var lowestValueButton = valueBar.querySelector('.lowest-value-control');
+ synClick(lowestValueButton);
+ assertEquals(valueBar.value, valueBar.lowestValue);
+
+ var highestValueButton = valueBar.querySelector('.highest-value-control');
+ synClick(highestValueButton);
+ assertEquals(valueBar.value, valueBar.highestValue);
+ });
+
+ test('valueDisplay', function() {
+ var valueBar = createValueBar(this);
+ var valueDisplay = new ui.ValueDisplay();
+ valueDisplay.style.position = 'absolute';
+ valueDisplay.style.left = '60px';
+ valueDisplay.style.width = '200px';
+ valueDisplay.style.display = '-webkit-flex';
+ valueDisplay['-webkit-flex-direction'] = 'column';
+ valueDisplay.valueBar = valueBar;
+ valueBar.parentElement.appendChild(valueDisplay);
+
+ valueBar.lowestValue = 0.2;
+ var lowestValueButton = valueBar.querySelector('.lowest-value-control');
+ synClick(lowestValueButton);
+ assertEquals('0.20 (\u2192 0.20)', valueDisplay.textContent);
+
+ valueBar.highestValue = 3.0;
+ var highestValueButton = valueBar.querySelector('.highest-value-control');
+ synClick(highestValueButton);
+ assertEquals('3.00 (\u2192 3.00)', valueDisplay.textContent);
+ });
+
+ test('horizontal', function() {
+ var container = ui.createDiv();
+ container.style.position = 'relative';
+ container.style.height = '200px';
+
+ var valueBar = new ui.ValueBar();
+ valueBar.style['-webkit-flex-direction'] = 'row';
+
+ this.addHTMLOutput(container);
+ container.appendChild(valueBar);
+ valueBar.vertical = false;
+
+ valueBar.lowestValue = -70;
+ assertEquals(valueBar.lowestValue, -70);
+
+ valueBar.highestValue = 70;
+ assertEquals(valueBar.highestValue, 70);
+
+ valueBar.value = 0.0;
+ assertEquals(valueBar.value, 0.0);
+
+ valueBar.previewValue = 0.5;
+ assertEquals(valueBar.previewValue, 0.5);
+
+ var controlRange = valueBar.rangeControlPixelRange;
+ assertEquals(valueBar.fractionalValue_(0), 0);
+ assertEquals(valueBar.fractionalValue_(controlRange), 1);
+
+ assertEquals(valueBar.pixelByValue_(0), 0);
+ assertEquals(valueBar.pixelByValue_(1), controlRange);
+ });
+
+ test('overrideContent', function() {
+ var container = ui.createDiv();
+ container.style.position = 'relative';
+ container.style.height = '200px';
+
+ var ABBar = ui.define('ab-bar');
+ ABBar.prototype = {
+ __proto__: ui.ValueBar.prototype,
+ updateLowestValueElement: function(element) {
+ element.style.fontSize = '25px';
+ element.textContent = 'A';
+ },
+ updateHighestValueElement: function(element) {
+ element.style.fontSize = '25px';
+ element.textContent = 'B';
+ }
+ };
+ var aBBar = new ABBar();
+ assertEquals('AB', aBBar.textContent);
+ });
+});
diff --git a/trace-viewer/src/ui/value_display.js b/trace-viewer/src/ui/value_display.js
new file mode 100644
index 0000000..3a4c194
--- /dev/null
+++ b/trace-viewer/src/ui/value_display.js
@@ -0,0 +1,81 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+/**
+ * @fileoverview A text widget for monitoring ValueBar value and previewValue.
+ */
+base.require('ui');
+base.require('base.properties');
+base.require('ui.mouse_tracker');
+
+base.exportTo('ui', function() {
+
+ /**
+ * @constructor
+ */
+ var ValueDisplay = ui.define('value-display');
+
+ ValueDisplay.prototype = {
+ __proto__: HTMLDivElement.prototype,
+
+ decorate: function() {
+ this.className = 'value-display';
+ this.currentValueDisplay_ = ui.createDiv({
+ className: 'value-value',
+ parent: this
+ });
+ this.previewValueDisplay_ = ui.createDiv({
+ className: 'value-set-to',
+ parent: this
+ });
+ this.setValueText_ = this.setValueText_.bind(this);
+ this.setPreviewValueText_ = this.setPreviewValueText_.bind(this);
+ },
+
+ get valueBar() {
+ return this.valueBar_;
+ },
+
+ set valueBar(newValue) {
+ if (this.valueBar_)
+ this.detach_();
+ this.valueBar_ = newValue;
+ if (this.valueBar_)
+ this.attach_();
+ },
+
+ attach_: function() {
+ this.valueBar_.addEventListener('valueChange',
+ this.setValueText_);
+ this.valueBar_.addEventListener('previewValueChange',
+ this.setPreviewValueText_);
+ },
+
+ dettach_: function() {
+ this.valueBar_.removeEventListener('valueChange',
+ this.setValueText_);
+ this.valueBar_.removeEventListener('previewValueChange',
+ this.setPreviewValueText_);
+ },
+
+ setValueText_: function(event) {
+ if (typeof event.newValue === undefined)
+ return;
+ this.currentValueDisplay_.textContent = event.newValue.toFixed(2);
+ this.setPreviewValueText_(event);
+ },
+
+ setPreviewValueText_: function(event) {
+ this.previewValueDisplay_.textContent =
+ ' (\u2192 ' + event.newValue.toFixed(2) + ')';
+ }
+
+ };
+
+ return {
+ ValueDisplay: ValueDisplay
+ };
+});
diff --git a/trace-viewer/test_data/instant_events.json b/trace-viewer/test_data/instant_events.json
new file mode 100644
index 0000000..ab396d8
--- /dev/null
+++ b/trace-viewer/test_data/instant_events.json
@@ -0,0 +1,83 @@
+{
+ "traceEvents": [
+ {
+ "name": "Thread size event",
+ "args": {
+ "state": {
+ "tile_count": 151,
+ "global_state": {
+ "memory_limit_in_bytes": 454557696,
+ "memory_limit_policy": "ALLOW_PREPAINT_ONLY",
+ "tree_priority": "SAME_PRIORITY_FOR_BOTH_TREES"
+ },
+ "memory_requirements": {
+ "memory_required_bytes": 16777216,
+ "memory_used_bytes": 17760256,
+ "memory_nice_to_have_bytes": 34078720
+ }
+ }
+ },
+ "pid": 36092,
+ "ts": 510075891653,
+ "cat": "cc",
+ "s": "t",
+ "tid": 28163,
+ "ph": "i"
+ },
+ {
+ "name": "Process size event",
+ "args": {
+ "state": {
+ "tile_count": 146,
+ "global_state": {
+ "memory_limit_in_bytes": 454557696,
+ "memory_limit_policy": "ALLOW_PREPAINT_ONLY",
+ "tree_priority": "SAME_PRIORITY_FOR_BOTH_TREES"
+ },
+ "memory_requirements": {
+ "memory_required_bytes": 16187392,
+ "memory_used_bytes": 17760256,
+ "memory_nice_to_have_bytes": 33488896
+ }
+ }
+ },
+ "pid": 36092,
+ "ts": 510075907469,
+ "cat": "cc",
+ "s": "p",
+ "tid": 28163,
+ "ph": "i"
+ },
+ {
+ "name": "Thread size event",
+ "args": {},
+ "pid": 36092,
+ "ts": 510075964350,
+ "cat": "cc",
+ "s": "t",
+ "tid": 28164,
+ "ph": "i"
+ },
+ {
+ "name": "Thread size event",
+ "args": {},
+ "pid": 36091,
+ "ts": 510075960350,
+ "cat": "cc",
+ "s": "t",
+ "tid": 28160,
+ "ph": "i"
+ },
+ {
+ "name": "Global size event",
+ "args": {},
+ "pid": 36091,
+ "ts": 510075958350,
+ "cat": "cc",
+ "s": "g",
+ "tid": 28160,
+ "ph": "i"
+ }
+ ]
+}
+
diff --git a/trace-viewer/third_party/web_dev_style/web_dev_style/css_checker.py b/trace-viewer/third_party/web_dev_style/web_dev_style/css_checker.py
index 04a6081..fa05e2f 100644
--- a/trace-viewer/third_party/web_dev_style/web_dev_style/css_checker.py
+++ b/trace-viewer/third_party/web_dev_style/web_dev_style/css_checker.py
@@ -91,13 +91,11 @@
def milliseconds_for_small_times(line):
return re.search(small_seconds, line)
+ def no_data_uris_in_source_files(line):
+ return re.search(r'\(\s*\'?\s*data:', line)
+
def one_rule_per_line(line):
- match = re.search(r'[_a-zA-Z0-9-](?<!data):(?!//)[^;]+;\s*[^ }]\s*', line)
- if match:
- data_match = re.search(r'url\(data', match.string)
- if data_match:
- return False
- return match
+ return re.search(r'[_a-zA-Z0-9-](?<!data):(?!//)[^;]+;\s*[^ }]\s*', line)
any_reg = re.compile(r':(?:-webkit-)?any\(.*?\)', re.DOTALL)
multi_sels = re.compile(r'(?:}[\n\s]*)?([^,]+,(?=[^{}]+?{).*[,{])\s*$',
@@ -168,6 +166,9 @@
'test': milliseconds_for_small_times,
'after': suggest_ms_from_s,
},
+ { 'desc': 'Don\'t use data URIs in source files. Use grit instead.',
+ 'test': no_data_uris_in_source_files,
+ },
{ 'desc': 'One rule per line (what not to do: color: red; margin: 0;).',
'test': one_rule_per_line,
},
diff --git a/trace-viewer/trace_viewer.gyp b/trace-viewer/trace_viewer.gyp
index d13e0d1..6fb8c4b 100644
--- a/trace-viewer/trace_viewer.gyp
+++ b/trace-viewer/trace_viewer.gyp
@@ -12,6 +12,7 @@
'src/tracing/record_selection_dialog.html',
'src/tracing/timeline_view.html',
'src/tracing/category_filter_dialog.html',
+ 'src/ui/mouse_mode_selector.html',
],
'tracing_css_files': [
'src/base/unittest.css',
@@ -22,9 +23,17 @@
'src/ui/quad_view.css',
'src/ui/overlay.css',
'src/ui/list_view.css',
+ 'src/ui/tool_button.css',
+ 'src/ui/mouse_mode_selector.css',
'src/ui/list_and_associated_view.css',
+ 'src/ui/rect_view.css',
'src/ui/filter_control.css',
'src/ui/drag_handle.css',
+ 'src/ui/mouse_tracker.js',
+ 'src/ui/text_end_value_bar.js',
+ 'src/ui/value_bar.js',
+ 'src/ui/value_bar.css',
+ 'src/ui/value_display.js',
'src/tcmalloc/tcmalloc_instance_view.css',
'src/tcmalloc/tcmalloc_snapshot_view.css',
'src/tcmalloc/heap_instance_track.css',
@@ -41,7 +50,7 @@
'src/tracing/tracks/process_track_base.css',
'src/tracing/tracks/trace_model_track.css',
'src/tracing/tracks/track.css',
- 'src/tracing/tracks/drawable_track.css',
+ 'src/tracing/tracks/heading_track.css',
'src/tracing/tracks/drawing_container.css',
'src/tracing/tracks/object_instance_track.css',
'src/tracing/tracks/slice_track.css',
@@ -92,22 +101,27 @@
'src/ui/drag_handle.js',
'src/ui/quad_stack.js',
'src/ui/list_view.js',
+ 'src/ui/mouse_mode_selector.js',
'src/ui/quad_view.js',
'src/ui/quad_stack_viewer.js',
+ 'src/ui/rect_view.js',
'src/ui/dom_helpers.js',
'src/tcmalloc/heap_instance_track.js',
'src/tcmalloc/tcmalloc_instance_view.js',
'src/tcmalloc/heap.js',
'src/tcmalloc/tcmalloc_snapshot_view.js',
+ 'src/tracing/constants.js',
'src/tracing/category_filter_dialog.js',
'src/tracing/record_selection_dialog.js',
'src/tracing/standalone_timeline_view.js',
+ 'src/tracing/importer.js',
+ 'src/tracing/mouse_mode_constants.js',
'src/tracing/trace_model.js',
'src/tracing/trace_model_settings.js',
- 'src/tracing/importer.js',
'src/tracing/trace_model/process_base.js',
'src/tracing/trace_model/cpu.js',
'src/tracing/trace_model/time_to_object_instance_map.js',
+ 'src/tracing/trace_model/async_slice.js',
'src/tracing/trace_model/async_slice_group.js',
'src/tracing/trace_model/slice_group.js',
'src/tracing/trace_model/thread.js',
@@ -119,6 +133,9 @@
'src/tracing/trace_model/object_instance.js',
'src/tracing/trace_model/process.js',
'src/tracing/trace_model/counter.js',
+ 'src/tracing/trace_model/counter_series.js',
+ 'src/tracing/trace_model/instant_event.js',
+ 'src/tracing/trace_model/trace_model_event.js',
'src/tracing/test_utils.js',
'src/tracing/timeline_viewport.js',
'src/tracing/analysis/stub_analysis_table.js',
@@ -142,7 +159,7 @@
'src/tracing/tracks/container_track.js',
'src/tracing/tracks/async_slice_group_track.js',
'src/tracing/tracks/ruler_track.js',
- 'src/tracing/tracks/drawable_track.js',
+ 'src/tracing/tracks/heading_track.js',
'src/tracing/tracks/drawing_container.js',
'src/tracing/tracks/object_instance_track.js',
'src/tracing/tracks/thread_track.js',
@@ -184,7 +201,7 @@
'src/tracing/selection.js',
'src/tcmalloc.js',
'src/cc/picture.js',
- 'src/cc/picture_as_image.js',
+ 'src/cc/picture_as_canvas.js',
'src/cc/constants.js',
'src/cc/layer_viewer.js',
'src/cc/picture_view.js',
@@ -203,11 +220,20 @@
'src/cc/tile_view.js',
'src/cc/selection.js',
],
+ 'tracing_img_files': [
+ 'src/images/chrome-left.png',
+ 'src/images/chrome-right.png',
+ 'src/images/chrome-mid.png',
+ 'src/images/collapse.png',
+ 'src/images/expand.png',
+ 'src/images/ui-states.png',
+ ],
'tracing_files': [
'<@(tracing_template_files)',
'<@(tracing_html_files)',
'<@(tracing_css_files)',
'<@(tracing_js_files)',
+ '<@(tracing_img_files)',
],
},
'targets': [