Remove the Raster Stats feature from the Performance page. (#7981)
diff --git a/packages/devtools_app/lib/devtools_app.dart b/packages/devtools_app/lib/devtools_app.dart index 1266ef0..5081aaf 100644 --- a/packages/devtools_app/lib/devtools_app.dart +++ b/packages/devtools_app/lib/devtools_app.dart
@@ -40,7 +40,6 @@ export 'src/screens/performance/panes/flutter_frames/flutter_frames_chart.dart'; export 'src/screens/performance/panes/flutter_frames/flutter_frames_controller.dart'; export 'src/screens/performance/panes/frame_analysis/frame_analysis_model.dart'; -export 'src/screens/performance/panes/raster_stats/raster_stats_controller.dart'; export 'src/screens/performance/panes/rebuild_stats/rebuild_stats_controller.dart'; export 'src/screens/performance/panes/rebuild_stats/rebuild_stats_model.dart'; export 'src/screens/performance/panes/timeline_events/perfetto/tracing/model.dart';
diff --git a/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_hints.dart b/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_hints.dart index 0df3fa5..5be0064 100644 --- a/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_hints.dart +++ b/packages/devtools_app/lib/src/screens/performance/panes/frame_analysis/frame_hints.dart
@@ -67,7 +67,7 @@ if (frame.hasShaderTime) ShaderCompilationHint(shaderTime: frame.shaderDuration), const SizedBox(height: denseSpacing), - const RasterStatsHint(), + const GeneralRasterJankHint(), ] : <Widget>[]; @@ -386,8 +386,8 @@ } @visibleForTesting -class RasterStatsHint extends StatelessWidget { - const RasterStatsHint({super.key}); +class GeneralRasterJankHint extends StatelessWidget { + const GeneralRasterJankHint({super.key}); @override Widget build(BuildContext context) { @@ -397,16 +397,22 @@ text: TextSpan( children: [ TextSpan( - text: 'Consider using the', + text: 'To learn about rendering performance in Flutter, check ' + 'out the Flutter documentation on ', style: theme.regularTextStyle, ), - TextSpan( - text: ' Raster Stats ', - style: theme.subtleFixedFontStyle, + GaLinkTextSpan( + link: GaLink( + display: 'Performance & Optimization', + url: flutterPerformanceDocsUrl, + gaScreenName: gac.performance, + gaSelectedItemDescription: + gac.PerformanceDocs.flutterPerformanceDocs.name, + ), + context: context, ), TextSpan( - text: 'tab to identify rendering layers that are expensive to ' - 'rasterize.', + text: '.', style: theme.regularTextStyle, ), ],
diff --git a/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats.dart b/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats.dart deleted file mode 100644 index 3602342..0000000 --- a/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats.dart +++ /dev/null
@@ -1,482 +0,0 @@ -// Copyright 2022 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 'dart:async'; -import 'dart:math' as math; - -import 'package:devtools_app_shared/ui.dart'; -import 'package:flutter/material.dart'; - -import '../../../../shared/analytics/constants.dart' as gac; -import '../../../../shared/common_widgets.dart'; -import '../../../../shared/globals.dart'; -import '../../../../shared/primitives/utils.dart'; -import '../../../../shared/table/table.dart'; -import '../../../../shared/table/table_data.dart'; -import '../../performance_utils.dart'; -import 'raster_stats_controller.dart'; -import 'raster_stats_model.dart'; - -class RasterStatsView extends StatelessWidget { - const RasterStatsView({ - super.key, - required this.rasterStatsController, - required this.impellerEnabled, - }); - - final RasterStatsController rasterStatsController; - - final bool impellerEnabled; - - @override - Widget build(BuildContext context) { - if (impellerEnabled) { - return Center( - child: RichText( - textAlign: TextAlign.center, - text: TextSpan( - text: 'The Raster Stats tool is not currently available for the ' - 'Impeller backend.\nLearn more about the status of ', - style: Theme.of(context).regularTextStyle, - children: [ - GaLinkTextSpan( - link: GaLink( - display: 'Impeller', - url: impellerDocsUrl, - gaScreenName: gac.performance, - gaSelectedItemDescription: - gac.PerformanceDocs.impellerDocsLinkFromRasterStats.name, - ), - context: context, - ), - const TextSpan(text: '.'), - ], - ), - ), - ); - } - return Column( - children: [ - if (!offlineDataController.showingOfflineData.value) - _RasterStatsControls( - rasterStatsController: rasterStatsController, - ), - Expanded( - child: _LayerVisualizer( - rasterStatsController: rasterStatsController, - ), - ), - ], - ); - } -} - -class _RasterStatsControls extends StatelessWidget { - const _RasterStatsControls({required this.rasterStatsController}); - - final RasterStatsController rasterStatsController; - - @override - Widget build(BuildContext context) { - return OutlineDecoration.onlyBottom( - child: Padding( - padding: const EdgeInsets.all(denseSpacing), - child: Row( - children: [ - GaDevToolsButton( - tooltip: 'Take a snapshot of the rendering layers on the current' - ' screen', - icon: Icons.camera_outlined, - label: 'Take Snapshot', - gaScreen: gac.performance, - gaSelection: gac.PerformanceEvents.collectRasterStats.name, - onPressed: rasterStatsController.collectRasterStats, - ), - const SizedBox(width: denseSpacing), - ClearButton( - gaScreen: gac.performance, - gaSelection: gac.PerformanceEvents.clearRasterStats.name, - onPressed: rasterStatsController.clearData, - ), - ], - ), - ), - ); - } -} - -class _LayerVisualizer extends StatelessWidget { - const _LayerVisualizer({required this.rasterStatsController}); - - final RasterStatsController rasterStatsController; - - @override - Widget build(BuildContext context) { - return MultiValueListenableBuilder( - listenables: [ - rasterStatsController.rasterStats, - rasterStatsController.loadingSnapshot, - ], - builder: (context, values, _) { - final rasterStats = values.first as RasterStats?; - final loading = values.second as bool; - if (loading) { - return const CenteredCircularProgressIndicator(); - } - if (rasterStats == null || rasterStats.layerSnapshots.isEmpty) { - return const Center( - child: Text( - 'Take a snapshot to view raster stats for the current screen.', - ), - ); - } - return SplitPane( - axis: Axis.horizontal, - initialFractions: const [0.5, 0.5], - children: [ - LayerSnapshotTable( - controller: rasterStatsController, - snapshots: rasterStats.layerSnapshots, - ), - ValueListenableBuilder<LayerSnapshot?>( - valueListenable: rasterStatsController.selectedSnapshot, - builder: (context, snapshot, _) { - return LayerImage( - snapshot: snapshot, - originalFrameSize: rasterStats.originalFrameSize, - includeFullScreenButton: true, - ); - }, - ), - ], - ); - }, - ); - } -} - -@visibleForTesting -class LayerSnapshotTable extends StatelessWidget { - const LayerSnapshotTable({ - super.key, - required this.controller, - required this.snapshots, - }); - - static final _layerColumn = _LayerColumn(); - static final _timeColumn = _RenderingTimeColumn(); - static final _percentageColumn = _RenderingTimePercentageColumn(); - static final _columns = <ColumnData<LayerSnapshot>>[ - _layerColumn, - _timeColumn, - _percentageColumn, - ]; - - final RasterStatsController controller; - - final List<LayerSnapshot> snapshots; - - @override - Widget build(BuildContext context) { - final borderSide = defaultBorderSide(Theme.of(context)); - return Container( - decoration: BoxDecoration( - border: Border(right: borderSide), - ), - child: FlatTable<LayerSnapshot>( - keyFactory: (LayerSnapshot snapshot) => - ValueKey<String?>('${snapshot.id}'), - data: snapshots, - dataKey: 'raster-layer-snapshots', - columns: _columns, - defaultSortColumn: _percentageColumn, - defaultSortDirection: SortDirection.descending, - onItemSelected: controller.selectSnapshot, - selectionNotifier: controller.selectedSnapshot, - ), - ); - } -} - -class _LayerColumn extends ColumnData<LayerSnapshot> { - _LayerColumn() - : super( - 'Layer', - fixedWidthPx: scaleByFontFactor(150), - ); - - @override - String getValue(LayerSnapshot dataObject) => dataObject.displayName; -} - -class _RenderingTimeColumn extends ColumnData<LayerSnapshot> { - _RenderingTimeColumn() - : super( - 'Rendering time', - fixedWidthPx: scaleByFontFactor(120), - ); - - @override - int getValue(LayerSnapshot dataObject) => dataObject.duration.inMicroseconds; - - @override - String getDisplayValue(LayerSnapshot dataObject) => - durationText(dataObject.duration); - - @override - bool get numeric => true; -} - -class _RenderingTimePercentageColumn extends ColumnData<LayerSnapshot> { - _RenderingTimePercentageColumn() - : super( - 'Percent rendering time', - fixedWidthPx: scaleByFontFactor(180), - ); - - @override - double getValue(LayerSnapshot dataObject) => - dataObject.percentRenderingTimeAsDouble; - - @override - String getDisplayValue(LayerSnapshot dataObject) => - dataObject.percentRenderingTimeDisplay; - - @override - bool get numeric => true; -} - -@visibleForTesting -class LayerImage extends StatelessWidget { - const LayerImage({ - super.key, - required this.snapshot, - required this.originalFrameSize, - this.includeFullScreenButton = false, - }); - - final LayerSnapshot? snapshot; - - final Size? originalFrameSize; - - final bool includeFullScreenButton; - - double get _fullscreenButtonWidth => defaultButtonHeight + denseSpacing * 2; - - static const _placeholderImageSize = 60.0; - - @override - Widget build(BuildContext context) { - final snapshot = this.snapshot; - final originalFrameSize = this.originalFrameSize; - if (snapshot == null || originalFrameSize == null) { - return const Icon( - Icons.image, - size: _placeholderImageSize, - ); - } - final theme = Theme.of(context); - return Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: - includeFullScreenButton ? _fullscreenButtonWidth : defaultSpacing, - ), - Flexible( - child: Container( - color: theme.focusColor, - margin: const EdgeInsets.symmetric(horizontal: defaultSpacing), - child: LayoutBuilder( - builder: (context, constraints) { - final scaleFactor = _calculateScaleFactor( - constraints, - originalFrameSize, - ); - final scaledSize = _scaledLayerSize(scaleFactor); - final scaledOffset = _scaledLayerOffset(scaleFactor); - final theme = Theme.of(context); - return Stack( - children: [ - CustomPaint( - painter: _CheckerBoardBackgroundPainter( - theme.colorScheme.surface, - theme.colorScheme.outlineVariant, - ), - child: Image.memory(snapshot.bytes), - ), - Positioned( - left: scaledOffset.dx, - top: scaledOffset.dy, - child: Container( - height: scaledSize.height, - width: scaledSize.width, - decoration: BoxDecoration( - border: Border.all( - color: theme.colorScheme.primary, - ), - ), - ), - ), - ], - ); - }, - ), - ), - ), - includeFullScreenButton - ? _FullScreenButton( - snapshot: snapshot, - originalFrameSize: originalFrameSize, - ) - : const SizedBox(width: defaultSpacing), - ], - ); - } - - double _calculateScaleFactor( - BoxConstraints constraints, - Size originalFrameSize, - ) { - final widthScaleFactor = constraints.maxWidth / originalFrameSize.width; - final heightScaleFactor = constraints.maxHeight / originalFrameSize.height; - return math.min(widthScaleFactor, heightScaleFactor); - } - - Size _scaledLayerSize(double scale) { - final layerSnapshot = snapshot!; - final scaledWidth = layerSnapshot.size.width * scale; - final scaledHeight = layerSnapshot.size.height * scale; - return Size(scaledWidth, scaledHeight); - } - - Offset _scaledLayerOffset(double scale) { - final layerSnapshot = snapshot!; - final scaledDx = layerSnapshot.offset.dx * scale; - final scaledDy = layerSnapshot.offset.dy * scale; - return Offset(scaledDx, scaledDy); - } -} - -class _FullScreenButton extends StatelessWidget { - const _FullScreenButton({ - required this.snapshot, - required this.originalFrameSize, - }); - - final LayerSnapshot snapshot; - - final Size originalFrameSize; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.only( - bottom: denseSpacing, - right: denseSpacing, - ), - alignment: Alignment.bottomRight, - child: GaDevToolsButton.iconOnly( - icon: Icons.fullscreen, - outlined: false, - gaScreen: gac.performance, - gaSelection: gac.PerformanceEvents.fullScreenLayerImage.name, - onPressed: () { - unawaited( - showDialog( - context: context, - builder: (context) => _LayerImageDialog( - snapshot: snapshot, - originalFrameSize: originalFrameSize, - ), - ), - ); - }, - ), - ); - } -} - -class _LayerImageDialog extends StatelessWidget { - const _LayerImageDialog({ - required this.snapshot, - required this.originalFrameSize, - }); - - final LayerSnapshot snapshot; - - final Size originalFrameSize; - - static const _padding = 300.0; - - @override - Widget build(BuildContext context) { - final media = MediaQuery.of(context); - final mediaWidth = media.size.width; - final mediaHeight = media.size.height; - return DevToolsDialog( - includeDivider: false, - scrollable: false, - content: SizedBox( - width: mediaWidth - _padding, - height: mediaHeight - _padding, - child: LayerImage( - snapshot: snapshot, - originalFrameSize: originalFrameSize, - ), - ), - actions: const [ - DialogCloseButton(), - ], - ); - } -} - -class _CheckerBoardBackgroundPainter extends CustomPainter { - _CheckerBoardBackgroundPainter(Color color1, Color color2) - : _color1 = color1, - _color2 = color2; - - final Color _color1; - final Color _color2; - final _squareSize = 20.0; - - @override - void paint(Canvas canvas, Size size) { - canvas.clipRect(Rect.fromLTWH(0, 0, size.width, size.height)); - final backgroundPaint = Paint() - ..color = _color1 - ..style = PaintingStyle.fill; - final checkerPaint = Paint() - ..color = _color2 - ..style = PaintingStyle.fill; - - canvas.drawRect( - Rect.fromLTWH(0, 0, size.width, size.height), - backgroundPaint, - ); - - bool flipper = true; - - for (var x = 0.0; x < size.width; x += _squareSize) { - for (var y = 0.0; y < size.height; y += _squareSize * 2) { - double dy = y; - if (flipper) { - dy += _squareSize; - } - canvas.drawRect( - Rect.fromLTWH(x, dy, _squareSize, _squareSize), - checkerPaint, - ); - } - flipper = !flipper; - } - } - - @override - bool shouldRepaint(covariant CustomPainter oldDelegate) { - return false; - } -}
diff --git a/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats_controller.dart b/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats_controller.dart deleted file mode 100644 index a274adf..0000000 --- a/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats_controller.dart +++ /dev/null
@@ -1,84 +0,0 @@ -// Copyright 2022 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 'package:flutter/foundation.dart'; -import 'package:logging/logging.dart'; - -import '../../../../shared/globals.dart'; -import '../../performance_controller.dart'; -import '../../performance_model.dart'; -import '../flutter_frames/flutter_frame_model.dart'; -import 'raster_stats_model.dart'; - -final _log = Logger('raster_stats_controller'); - -class RasterStatsController extends PerformanceFeatureController { - RasterStatsController(super.performanceController); - - /// The active raster stats for the view. - ValueListenable<RasterStats?> get rasterStats => _rasterStats; - final _rasterStats = ValueNotifier<RasterStats?>(null); - - ValueListenable<bool> get loadingSnapshot => _loadingSnapshot; - final _loadingSnapshot = ValueNotifier<bool>(false); - - final selectedSnapshot = ValueNotifier<LayerSnapshot?>(null); - - void selectSnapshot(LayerSnapshot? snapshot) { - assert(_rasterStats.value != null); - _rasterStats.value!.selectedSnapshot = snapshot; - selectedSnapshot.value = snapshot; - } - - Future<void> collectRasterStats() async { - clearData(); - _loadingSnapshot.value = true; - try { - final response = await serviceConnection.renderFrameWithRasterStats; - final json = response?.json ?? <String, Object?>{}; - final rasterStats = RasterStats.fromJson(json); - setData(rasterStats); - } catch (e, st) { - _log.shout('Error collecting raster stats: $e', e, st); - notificationService.pushError( - 'Error collecting raster stats: $e', - stackTrace: st.toString(), - ); - clearData(); - } finally { - _loadingSnapshot.value = false; - } - } - - void setData(RasterStats? stats) { - _rasterStats.value = stats; - selectedSnapshot.value = stats?.selectedSnapshot; - } - - @override - void handleSelectedFrame(FlutterFrame frame) { - // TODO(kenz): show raster stats for the selected frame, if available. - } - - @override - Future<void> setOfflineData(OfflinePerformanceData offlineData) async { - final offlineRasterStats = offlineData.rasterStats; - if (offlineRasterStats != null) { - setData(offlineRasterStats); - } - } - - @override - void clearData() { - setData(null); - } - - @override - Future<void> init() { - return Future.value(); - } - - @override - void onBecomingActive() {} -}
diff --git a/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats_model.dart b/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats_model.dart deleted file mode 100644 index a82f26b..0000000 --- a/packages/devtools_app/lib/src/screens/performance/panes/raster_stats/raster_stats_model.dart +++ /dev/null
@@ -1,173 +0,0 @@ -// Copyright 2022 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 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import '../../../../shared/primitives/utils.dart'; - -class RasterStats { - RasterStats._({ - required this.layerSnapshots, - required this.originalFrameSize, - required this.totalRasterTime, - required this.selectedSnapshot, - }); - - factory RasterStats.fromJson(Map<String, Object?> json) { - Size? originalFrameSize; - final originalWidth = json[_frameWidthKey] as num?; - final originalHeight = json[_frameHeightKey] as num?; - if (originalHeight != null && originalWidth != null) { - originalFrameSize = Size( - originalWidth.toDouble(), - originalHeight.toDouble(), - ); - } - int? selectedId; - LayerSnapshot? selected; - if (json[_selectedIdKey] != null) { - selectedId = json[_selectedIdKey] as int?; - } - - final snapshotsFromJson = - (json[_snapshotsJsonKey] as List).cast<Map<String, dynamic>>(); - - final snapshots = <LayerSnapshot>[]; - var totalRasterTime = Duration.zero; - for (final snapshotJson in snapshotsFromJson) { - final layerSnapshot = LayerSnapshot.fromJson(snapshotJson); - snapshots.add(layerSnapshot); - totalRasterTime += layerSnapshot.duration; - if (layerSnapshot.id == selectedId) { - selected = layerSnapshot; - } - } - - for (final snapshot in snapshots) { - snapshot.totalRenderingDuration = totalRasterTime; - } - - // Sort by percent rendering time in descending order. - snapshots.sort( - (a, b) => b.percentRenderingTimeAsDouble - .compareTo(a.percentRenderingTimeAsDouble), - ); - - selected ??= snapshots.safeFirst; - - return RasterStats._( - layerSnapshots: snapshots, - selectedSnapshot: selected, - originalFrameSize: originalFrameSize, - totalRasterTime: totalRasterTime, - ); - } - - static const _snapshotsJsonKey = 'snapshots'; - - static const _selectedIdKey = 'selectedId'; - - static const _frameWidthKey = 'frame_width'; - - static const _frameHeightKey = 'frame_height'; - - final List<LayerSnapshot> layerSnapshots; - - final Size? originalFrameSize; - - final Duration totalRasterTime; - - /// The selected snapshot for this set of raster stats data. - /// - /// This field is mutable, and is managed by the [RasterStatsController]. It - /// is included in [RasterStats] so that it can be encoded in and decoded from - /// json. - LayerSnapshot? selectedSnapshot; - - Map<String, dynamic> get json => { - _frameWidthKey: originalFrameSize?.width.toDouble(), - _frameHeightKey: originalFrameSize?.height.toDouble(), - _snapshotsJsonKey: layerSnapshots - .map((snapshot) => snapshot.json) - .toList(growable: false), - _selectedIdKey: selectedSnapshot?.id, - }; -} - -class LayerSnapshot { - LayerSnapshot({ - required this.id, - required this.duration, - required this.size, - required this.offset, - required this.bytes, - }); - - factory LayerSnapshot.fromJson(Map<String, Object?> json) { - final id = json[_layerIdKey] as int; - final dur = Duration(microseconds: json[_durationKey] as int); - final size = Size( - (json[_widthKey] as num).toDouble(), - (json[_heightKey] as num).toDouble(), - ); - final offset = Offset( - (json[_leftKey] as num).toDouble(), - (json[_topKey] as num).toDouble(), - ); - final imageBytes = Uint8List.fromList( - (json[_snapshotJsonKey] as List<Object?>).cast<int>(), - ); - return LayerSnapshot( - id: id, - duration: dur, - size: size, - offset: offset, - bytes: imageBytes, - ); - } - - static const _layerIdKey = 'layer_unique_id'; - static const _durationKey = 'duration_micros'; - static const _snapshotJsonKey = 'snapshot'; - static const _widthKey = 'width'; - static const _heightKey = 'height'; - static const _leftKey = 'left'; - static const _topKey = 'top'; - - final int id; - - final Duration duration; - - final Size size; - - final Offset offset; - - final Uint8List bytes; - - /// The total rendering time for the set of snapshots that this - /// [LayerSnapshot] is a part of. - /// - /// This will be set after this [LayerSnapshot] is created, once all the - /// [LayerSnapshot]s in a set have been processed. - Duration? totalRenderingDuration; - - double get percentRenderingTimeAsDouble => - duration.inMicroseconds / totalRenderingDuration!.inMicroseconds; - - String get percentRenderingTimeDisplay => - percent(percentRenderingTimeAsDouble); - - String get displayName => 'Layer $id'; - - Map<String, Object?> get json => { - _layerIdKey: id, - _durationKey: duration.inMicroseconds, - _widthKey: size.width, - _heightKey: size.height, - _leftKey: offset.dx, - _topKey: offset.dy, - _snapshotJsonKey: bytes, - }; -}
diff --git a/packages/devtools_app/lib/src/screens/performance/performance_controller.dart b/packages/devtools_app/lib/src/screens/performance/performance_controller.dart index 8f4aa63..a91f089 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_controller.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_controller.dart
@@ -16,7 +16,6 @@ import 'panes/controls/enhance_tracing/enhance_tracing_controller.dart'; import 'panes/flutter_frames/flutter_frame_model.dart'; import 'panes/flutter_frames/flutter_frames_controller.dart'; -import 'panes/raster_stats/raster_stats_controller.dart'; import 'panes/rebuild_stats/rebuild_stats_controller.dart'; import 'panes/rebuild_stats/rebuild_stats_model.dart'; import 'panes/timeline_events/timeline_events_controller.dart'; @@ -37,12 +36,10 @@ // only create a controller when it is needed, flutterFramesController = FlutterFramesController(this); timelineEventsController = TimelineEventsController(this); - rasterStatsController = RasterStatsController(this); rebuildStatsController = RebuildStatsController(this); _featureControllers = [ flutterFramesController, timelineEventsController, - rasterStatsController, rebuildStatsController, ]; @@ -61,8 +58,6 @@ late final TimelineEventsController timelineEventsController; - late final RasterStatsController rasterStatsController; - late final RebuildStatsController rebuildStatsController; late List<PerformanceFeatureController> _featureControllers; @@ -258,7 +253,6 @@ perfettoTraceBinary: timelineEventsController.fullPerfettoTrace, frames: flutterFramesController.flutterFrames.value, selectedFrame: flutterFramesController.selectedFrame.value, - rasterStats: rasterStatsController.rasterStats.value, rebuildCountModel: rebuildCountModel, displayRefreshRate: flutterFramesController.displayRefreshRate.value, ).toJson(),
diff --git a/packages/devtools_app/lib/src/screens/performance/performance_model.dart b/packages/devtools_app/lib/src/screens/performance/performance_model.dart index 63ce0f1..06d47ce 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_model.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_model.dart
@@ -9,7 +9,6 @@ import '../../shared/primitives/trees.dart'; import '../../shared/primitives/utils.dart'; import 'panes/flutter_frames/flutter_frame_model.dart'; -import 'panes/raster_stats/raster_stats_model.dart'; import 'panes/rebuild_stats/rebuild_stats_model.dart'; import 'panes/timeline_events/perfetto/tracing/model.dart'; @@ -18,7 +17,6 @@ this.perfettoTraceBinary, this.frames = const <FlutterFrame>[], this.selectedFrame, - this.rasterStats, this.rebuildCountModel, double? displayRefreshRate, }) : displayRefreshRate = displayRefreshRate ?? defaultRefreshRate; @@ -35,14 +33,12 @@ perfettoTraceBinary: json.traceBinary, frames: frames, selectedFrame: selectedFrame, - rasterStats: json.rasterStats, rebuildCountModel: json.rebuildCountModel, displayRefreshRate: json.displayRefreshRate, ); } static const traceBinaryKey = 'traceBinary'; - static const rasterStatsKey = 'rasterStats'; static const rebuildCountModelKey = 'rebuildCountModel'; static const displayRefreshRateKey = 'displayRefreshRate'; static const flutterFramesKey = 'flutterFrames'; @@ -50,8 +46,6 @@ final Uint8List? perfettoTraceBinary; - final RasterStats? rasterStats; - final RebuildCountModel? rebuildCountModel; final double displayRefreshRate; @@ -68,7 +62,6 @@ flutterFramesKey: frames.map((frame) => frame.json).toList(), selectedFrameIdKey: selectedFrame?.id, displayRefreshRateKey: displayRefreshRate, - rasterStatsKey: rasterStats?.json, rebuildCountModelKey: rebuildCountModel?.toJson(), }; } @@ -80,12 +73,6 @@ return value == null ? null : Uint8List.fromList(value); } - RasterStats? get rasterStats { - final raw = (json[OfflinePerformanceData.rasterStatsKey] as Map? ?? {}) - .cast<String, Object>(); - return raw.isNotEmpty ? RasterStats.fromJson(raw) : null; - } - int? get selectedFrameId => json[OfflinePerformanceData.selectedFrameIdKey] as int?;
diff --git a/packages/devtools_app/lib/src/screens/performance/performance_utils.dart b/packages/devtools_app/lib/src/screens/performance/performance_utils.dart index 87639f0..67e6092 100644 --- a/packages/devtools_app/lib/src/screens/performance/performance_utils.dart +++ b/packages/devtools_app/lib/src/screens/performance/performance_utils.dart
@@ -8,6 +8,8 @@ const impellerDocsUrl = 'https://flutter.dev/to/impeller'; +const flutterPerformanceDocsUrl = 'https://docs.flutter.dev/perf'; + void pushNoTimelineEventsAvailableWarning() { notificationService.push( 'No timeline events available for the selected frame. Timeline '
diff --git a/packages/devtools_app/lib/src/screens/performance/tabbed_performance_view.dart b/packages/devtools_app/lib/src/screens/performance/tabbed_performance_view.dart index 0a6b478..a317171 100644 --- a/packages/devtools_app/lib/src/screens/performance/tabbed_performance_view.dart +++ b/packages/devtools_app/lib/src/screens/performance/tabbed_performance_view.dart
@@ -17,7 +17,6 @@ import 'panes/flutter_frames/flutter_frame_model.dart'; import 'panes/flutter_frames/flutter_frames_controller.dart'; import 'panes/frame_analysis/frame_analysis.dart'; -import 'panes/raster_stats/raster_stats.dart'; import 'panes/rebuild_stats/rebuild_stats.dart'; import 'panes/timeline_events/timeline_events_view.dart'; import 'performance_controller.dart'; @@ -63,15 +62,12 @@ serviceConnection.serviceManager.connectedApp!.isFlutterAppNow!; var showFrameAnalysis = isFlutterApp; - var showRasterStats = isFlutterApp; var showRebuildStats = FeatureFlags.widgetRebuildStats && isFlutterApp; final offlineData = controller.offlinePerformanceData; if (isOffline) { final hasOfflineData = offlineData != null; showFrameAnalysis = showFrameAnalysis && hasOfflineData && offlineData.frames.isNotEmpty; - showRasterStats = - showRasterStats && hasOfflineData && offlineData.rasterStats != null; showRebuildStats = showRebuildStats && hasOfflineData && offlineData.rebuildCountModel != null; @@ -79,7 +75,6 @@ final tabsAndControllers = _generateTabs( showFrameAnalysis: showFrameAnalysis, - showRasterStats: showRasterStats, showRebuildStats: showRebuildStats, ); final tabs = tabsAndControllers @@ -121,10 +116,9 @@ PerformanceFeatureController? featureController, })> _generateTabs({ required bool showFrameAnalysis, - required bool showRasterStats, required bool showRebuildStats, }) { - if (showFrameAnalysis || showRasterStats || showRebuildStats) { + if (showFrameAnalysis || showRebuildStats) { assert(serviceConnection.serviceManager.connectedApp!.isFlutterAppNow!); } return [ @@ -158,19 +152,6 @@ ), featureController: controller.rebuildStatsController, ), - if (showRasterStats) - ( - tab: _buildTab(tabName: 'Raster Stats'), - tabView: KeepAliveWrapper( - child: Center( - child: RasterStatsView( - rasterStatsController: controller.rasterStatsController, - impellerEnabled: controller.impellerEnabled, - ), - ), - ), - featureController: controller.rasterStatsController, - ), ( tab: _buildTab( tabName: 'Timeline Events',
diff --git a/packages/devtools_app/lib/src/shared/analytics/constants/_performance_constants.dart b/packages/devtools_app/lib/src/shared/analytics/constants/_performance_constants.dart index cefdc0d..11026e1 100644 --- a/packages/devtools_app/lib/src/shared/analytics/constants/_performance_constants.dart +++ b/packages/devtools_app/lib/src/shared/analytics/constants/_performance_constants.dart
@@ -41,6 +41,7 @@ } enum PerformanceDocs { + flutterPerformanceDocs, performanceOverlayDocs, trackWidgetBuildsDocs, trackPaintsDocs,
diff --git a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md index 8c7f33f..522fec9 100644 --- a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md +++ b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md
@@ -19,7 +19,11 @@ ## Performance updates -TODO: Remove this section if there are not any general updates. +* Removed the "Raster Stats" feature. This tool did not work for the Impeller rendering +engine, and the information it gave for the SKIA rendering engine was misleading and +inactionable. Users should follow official Flutter guidance for +[Performance & Optimization](https://docs.flutter.dev/perf) when debugging the +rendering performance of their Flutter apps. - [#7981](https://github.com/flutter/devtools/pull/7981). ## CPU profiler updates
diff --git a/packages/devtools_app/test/performance/frame_analysis/frame_hints_test.dart b/packages/devtools_app/test/performance/frame_analysis/frame_hints_test.dart index 3d9d884..ef495a8 100644 --- a/packages/devtools_app/test/performance/frame_analysis/frame_hints_test.dart +++ b/packages/devtools_app/test/performance/frame_analysis/frame_hints_test.dart
@@ -126,7 +126,7 @@ expect(find.byType(EnhanceTracingHint), findsOneWidget); expect(find.byType(IntrinsicOperationsHint), findsNothing); expect(find.text('Raster Jank Detected'), findsOneWidget); - expect(find.byType(RasterStatsHint), findsOneWidget); + expect(find.byType(GeneralRasterJankHint), findsOneWidget); expect(find.byType(CanvasSaveLayerHint), findsNothing); expect(find.byType(ShaderCompilationHint), findsNothing); },
diff --git a/packages/devtools_app/test/performance/performance_controller_test.dart b/packages/devtools_app/test/performance/performance_controller_test.dart index f0b2eb0..726b36b 100644 --- a/packages/devtools_app/test/performance/performance_controller_test.dart +++ b/packages/devtools_app/test/performance/performance_controller_test.dart
@@ -48,17 +48,10 @@ test('setActiveFeature', () async { expect(controller.flutterFramesController.isActiveFeature, isFalse); expect(controller.timelineEventsController.isActiveFeature, isFalse); - expect(controller.rasterStatsController.isActiveFeature, isFalse); await controller.setActiveFeature(controller.timelineEventsController); expect(controller.flutterFramesController.isActiveFeature, isTrue); expect(controller.timelineEventsController.isActiveFeature, isTrue); - expect(controller.rasterStatsController.isActiveFeature, isFalse); - - await controller.setActiveFeature(controller.rasterStatsController); - expect(controller.flutterFramesController.isActiveFeature, isTrue); - expect(controller.timelineEventsController.isActiveFeature, isFalse); - expect(controller.rasterStatsController.isActiveFeature, isTrue); }); }); }
diff --git a/packages/devtools_app/test/performance/performance_model_test.dart b/packages/devtools_app/test/performance/performance_model_test.dart index 8b3bdea..f95aae7 100644 --- a/packages/devtools_app/test/performance/performance_model_test.dart +++ b/packages/devtools_app/test/performance/performance_model_test.dart
@@ -3,7 +3,6 @@ // found in the LICENSE file. import 'package:devtools_app/devtools_app.dart'; -import 'package:devtools_test/test_data.dart'; import 'package:flutter_test/flutter_test.dart'; import '../test_infra/test_data/performance/sample_performance_data.dart'; @@ -15,7 +14,6 @@ expect(offlineData.perfettoTraceBinary, isNull); expect(offlineData.frames, isEmpty); expect(offlineData.selectedFrame, isNull); - expect(offlineData.rasterStats, isNull); expect(offlineData.rebuildCountModel, isNull); expect(offlineData.displayRefreshRate, 60.0); }); @@ -26,7 +24,6 @@ expect(offlineData.selectedFrame, isNull); expect(offlineData.selectedFrame, isNull); expect(offlineData.displayRefreshRate, equals(60.0)); - expect(offlineData.rasterStats, isNull); offlineData = OfflinePerformanceData.fromJson(rawPerformanceData); expect(offlineData.perfettoTraceBinary, isNotNull); @@ -34,10 +31,6 @@ expect(offlineData.selectedFrame, isNotNull); expect(offlineData.selectedFrame!.id, equals(2)); expect(offlineData.displayRefreshRate, equals(60)); - expect( - offlineData.rasterStats!.json, - equals(rasterStatsFromDevToolsJson), - ); expect(offlineData.rebuildCountModel, isNull); }); @@ -50,7 +43,6 @@ OfflinePerformanceData.flutterFramesKey: <Object?>[], OfflinePerformanceData.selectedFrameIdKey: null, OfflinePerformanceData.displayRefreshRateKey: 60, - OfflinePerformanceData.rasterStatsKey: null, OfflinePerformanceData.rebuildCountModelKey: null, }), );
diff --git a/packages/devtools_app/test/performance/raster_stats/goldens/raster_stats_changed_selection.png b/packages/devtools_app/test/performance/raster_stats/goldens/raster_stats_changed_selection.png deleted file mode 100644 index abd7558..0000000 --- a/packages/devtools_app/test/performance/raster_stats/goldens/raster_stats_changed_selection.png +++ /dev/null Binary files differ
diff --git a/packages/devtools_app/test/performance/raster_stats/goldens/raster_stats_with_data.png b/packages/devtools_app/test/performance/raster_stats/goldens/raster_stats_with_data.png deleted file mode 100644 index 85a8cf1..0000000 --- a/packages/devtools_app/test/performance/raster_stats/goldens/raster_stats_with_data.png +++ /dev/null Binary files differ
diff --git a/packages/devtools_app/test/performance/raster_stats/raster_stats_controller_test.dart b/packages/devtools_app/test/performance/raster_stats/raster_stats_controller_test.dart deleted file mode 100644 index 2cccce3..0000000 --- a/packages/devtools_app/test/performance/raster_stats/raster_stats_controller_test.dart +++ /dev/null
@@ -1,94 +0,0 @@ -// Copyright 2022 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 'package:devtools_app/devtools_app.dart'; -import 'package:devtools_app/src/screens/performance/panes/raster_stats/raster_stats_model.dart'; -import 'package:devtools_app_shared/ui.dart'; -import 'package:devtools_app_shared/utils.dart'; -import 'package:devtools_test/devtools_test.dart'; -import 'package:devtools_test/test_data.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:vm_service/vm_service.dart'; - -void main() { - group('$RasterStatsController', () { - late RasterStatsController controller; - late MockServiceConnectionManager mockServiceConnection; - - setUp(() { - mockServiceConnection = createMockServiceConnectionWithDefaults(); - when(mockServiceConnection.renderFrameWithRasterStats).thenAnswer( - (_) => Future.value(Response.parse(rasterStatsFromServiceJson)), - ); - setGlobal( - DevToolsEnvironmentParameters, - ExternalDevToolsEnvironmentParameters(), - ); - setGlobal(ServiceConnectionManager, mockServiceConnection); - setGlobal(IdeTheme, IdeTheme()); - setGlobal(NotificationService, NotificationService()); - - controller = - RasterStatsController(createMockPerformanceControllerWithDefaults()); - }); - - test('calling collectRasterStats sets data', () async { - var rasterStats = controller.rasterStats.value; - expect(rasterStats, isNull); - - await controller.collectRasterStats(); - - rasterStats = controller.rasterStats.value; - expect(rasterStats, isNotNull); - expect(rasterStats!.layerSnapshots.length, equals(2)); - expect(rasterStats.selectedSnapshot, isNotNull); - expect(rasterStats.originalFrameSize, isNotNull); - expect(rasterStats.totalRasterTime, isNot(equals(Duration.zero))); - }); - - test( - 'calling collectRasterStats sets null data for bad service response', - () async { - var rasterStats = controller.rasterStats.value; - expect(rasterStats, isNull); - - when(mockServiceConnection.renderFrameWithRasterStats) - .thenAnswer((_) => throw Exception('something went wrong')); - await controller.collectRasterStats(); - - rasterStats = controller.rasterStats.value; - expect(rasterStats, isNull); - }, - ); - - test('calling clear nulls out raster stats', () async { - await controller.collectRasterStats(); - var rasterStats = controller.rasterStats.value; - expect(rasterStats, isNotNull); - expect(rasterStats!.layerSnapshots.length, equals(2)); - expect(rasterStats.selectedSnapshot, isNotNull); - expect(rasterStats.originalFrameSize, isNotNull); - expect(rasterStats.totalRasterTime, isNot(equals(Duration.zero))); - - controller.clearData(); - - rasterStats = controller.rasterStats.value; - expect(rasterStats, isNull); - }); - - test('setOfflineData', () async { - final rasterStats = RasterStats.fromJson(rasterStatsFromServiceJson); - - // Ensure we are starting in a null state. - expect(controller.rasterStats.value, isNull); - - final offlineData = OfflinePerformanceData(rasterStats: rasterStats); - await controller.setOfflineData(offlineData); - - expect(controller.rasterStats.value, isNotNull); - expect(controller.rasterStats.value!.layerSnapshots.length, equals(2)); - }); - }); -}
diff --git a/packages/devtools_app/test/performance/raster_stats/raster_stats_model_test.dart b/packages/devtools_app/test/performance/raster_stats/raster_stats_model_test.dart deleted file mode 100644 index dfd57f6..0000000 --- a/packages/devtools_app/test/performance/raster_stats/raster_stats_model_test.dart +++ /dev/null
@@ -1,83 +0,0 @@ -// Copyright 2022 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 'package:devtools_app/src/screens/performance/panes/raster_stats/raster_stats_model.dart'; -import 'package:devtools_app/src/shared/primitives/utils.dart'; -import 'package:devtools_test/test_data.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - late RasterStats rasterStats; - - group('$RasterStats model', () { - test('parse from service data', () { - rasterStats = RasterStats.fromJson(rasterStatsFromServiceJson); - expect(rasterStats.layerSnapshots.length, equals(2)); - expect(rasterStats.selectedSnapshot, isNotNull); - expect(rasterStats.selectedSnapshot!.id, equals(12731)); - expect(rasterStats.originalFrameSize, equals(const Size(100.0, 200.0))); - expect( - rasterStats.totalRasterTime, - equals(const Duration(microseconds: 494)), - ); - - // verify each of the [LayerSnapshot]s were parsed correctly - final first = rasterStats.layerSnapshots[0]; - final second = rasterStats.layerSnapshots[1]; - expect(first.id, equals(12731)); - expect(first.duration.inMicroseconds, equals(389)); - expect(first.totalRenderingDuration!.inMicroseconds, equals(494)); - expect(first.percentRenderingTimeDisplay, equals('78.74%')); - expect(first.size, equals(const Size(50, 50))); - expect(first.offset, equals(const Offset(25, 25))); - expect(second.id, equals(12734)); - expect(second.duration.inMicroseconds, equals(105)); - expect(second.totalRenderingDuration!.inMicroseconds, equals(494)); - expect(second.percentRenderingTimeDisplay, equals('21.26%')); - expect(second.size, equals(const Size(20, 40))); - expect(second.offset, equals(const Offset(35, 30))); - }); - - test('parse from devtools data', () { - rasterStats = RasterStats.fromJson(rasterStatsFromDevToolsJson); - expect(rasterStats.layerSnapshots.length, equals(2)); - expect(rasterStats.selectedSnapshot, isNotNull); - expect(rasterStats.selectedSnapshot!.id, equals(12734)); - expect(rasterStats.originalFrameSize, equals(const Size(100.0, 200.0))); - expect( - rasterStats.totalRasterTime, - equals(const Duration(microseconds: 494)), - ); - - // verify each of the [LayerSnapshot]s were parsed correctly - final first = rasterStats.layerSnapshots[0]; - final second = rasterStats.layerSnapshots[1]; - expect(first.id, equals(12731)); - expect(first.duration.inMicroseconds, equals(389)); - expect(first.totalRenderingDuration!.inMicroseconds, equals(494)); - expect(first.percentRenderingTimeDisplay, equals('78.74%')); - expect(first.size, equals(const Size(50, 50))); - expect(first.offset, equals(const Offset(25, 25))); - expect(second.id, equals(12734)); - expect(second.duration.inMicroseconds, equals(105)); - expect(second.totalRenderingDuration!.inMicroseconds, equals(494)); - expect(second.percentRenderingTimeDisplay, equals('21.26%')); - expect(second.size, equals(const Size(20, 40))); - expect(second.offset, equals(const Offset(35, 30))); - }); - - test('to json', () { - rasterStats = RasterStats.fromJson(rasterStatsFromServiceJson); - final json = rasterStats.json; - final expected = Map<String, Object?>.from(rasterStatsFromServiceJson); - // The expected output should not have the 'type' field that comes from - // the service protocol and it should have an additional field for the id - // of the selected snapshot. - expected.remove('type'); - expected['selectedId'] = 12731; - expect(collectionEquals(json, expected), isTrue); - }); - }); -}
diff --git a/packages/devtools_app/test/performance/raster_stats/raster_stats_test.dart b/packages/devtools_app/test/performance/raster_stats/raster_stats_test.dart deleted file mode 100644 index bd8ab55..0000000 --- a/packages/devtools_app/test/performance/raster_stats/raster_stats_test.dart +++ /dev/null
@@ -1,124 +0,0 @@ -// Copyright 2022 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 'package:devtools_app/devtools_app.dart'; -import 'package:devtools_app/src/screens/performance/panes/raster_stats/raster_stats.dart'; -import 'package:devtools_app_shared/ui.dart'; -import 'package:devtools_app_shared/utils.dart'; -import 'package:devtools_test/devtools_test.dart'; -import 'package:devtools_test/helpers.dart'; -import 'package:devtools_test/test_data.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:vm_service/vm_service.dart'; - -import '../../test_infra/matchers/matchers.dart'; - -void main() { - group('$RasterStatsView', () { - late RasterStatsController controller; - - setUp(() async { - final mockServiceConnection = createMockServiceConnectionWithDefaults(); - when(mockServiceConnection.renderFrameWithRasterStats).thenAnswer( - (_) => Future.value(Response.parse(rasterStatsFromServiceJson)), - ); - setGlobal(ServiceConnectionManager, mockServiceConnection); - setGlobal(OfflineDataController, OfflineDataController()); - setGlobal(IdeTheme, IdeTheme()); - - controller = - RasterStatsController(createMockPerformanceControllerWithDefaults()); - await controller.collectRasterStats(); - }); - - Future<void> pumpRasterStatsView( - WidgetTester tester, { - bool impellerEnabled = false, - }) async { - await tester.pumpWidget( - wrap( - RasterStatsView( - rasterStatsController: controller, - impellerEnabled: impellerEnabled, - ), - ), - ); - await tester.pumpAndSettle(); - } - - testWidgets('renders in empty state', (WidgetTester tester) async { - controller.clearData(); - await pumpRasterStatsView(tester); - - expect(find.byType(LayerSnapshotTable), findsNothing); - expect(find.byType(LayerImage), findsNothing); - expect( - find.text( - 'Take a snapshot to view raster stats for the current screen.', - ), - findsOneWidget, - ); - }); - - testWidgets('renders with data', (tester) async { - await pumpRasterStatsView(tester); - - expect(find.byType(LayerSnapshotTable), findsOneWidget); - expect(find.richText('Layer'), findsOneWidget); - expect(find.richText('Rendering time'), findsOneWidget); - expect(find.richText('Percent rendering time'), findsOneWidget); - expect(find.richText('Layer 12731'), findsOneWidget); - expect(find.richText('0.4 ms'), findsOneWidget); - expect(find.richText('78.74%'), findsOneWidget); - expect(find.richText('Layer 12734'), findsOneWidget); - expect(find.richText('0.1 ms'), findsOneWidget); - expect(find.richText('21.26%'), findsOneWidget); - - expect(find.byType(LayerImage), findsOneWidget); - - await expectLater( - find.byType(RasterStatsView), - matchesDevToolsGolden('goldens/raster_stats_with_data.png'), - ); - }); - - testWidgets('renders for Impeller', (WidgetTester tester) async { - controller.clearData(); - await pumpRasterStatsView(tester, impellerEnabled: true); - - expect(find.byType(LayerSnapshotTable), findsNothing); - expect(find.byType(LayerImage), findsNothing); - expect( - find.richTextContaining( - 'The Raster Stats tool is not currently available for the ' - 'Impeller backend.', - ), - findsOneWidget, - ); - }); - - testWidgets('can change layer selection', (tester) async { - await pumpRasterStatsView(tester); - - final rasterStats = controller.rasterStats.value!; - final layers = rasterStats.layerSnapshots; - final firstLayer = layers.first; - final secondLayer = layers.last; - expect(firstLayer.displayName, equals('Layer 12731')); - expect(secondLayer.displayName, equals('Layer 12734')); - - expect(rasterStats.selectedSnapshot, equals(firstLayer)); - - await tester.tap(find.richText('Layer 12734')); - await tester.pumpAndSettle(); - - expect(controller.selectedSnapshot.value, equals(secondLayer)); - await expectLater( - find.byType(RasterStatsView), - matchesDevToolsGolden('goldens/raster_stats_changed_selection.png'), - ); - }); - }); -}
diff --git a/packages/devtools_app/test/performance/tabbed_performance_view_test.dart b/packages/devtools_app/test/performance/tabbed_performance_view_test.dart index 098ad21..0e6768e 100644 --- a/packages/devtools_app/test/performance/tabbed_performance_view_test.dart +++ b/packages/devtools_app/test/performance/tabbed_performance_view_test.dart
@@ -4,7 +4,6 @@ import 'package:devtools_app/devtools_app.dart'; import 'package:devtools_app/src/screens/performance/panes/frame_analysis/frame_analysis.dart'; -import 'package:devtools_app/src/screens/performance/panes/raster_stats/raster_stats.dart'; import 'package:devtools_app/src/screens/performance/panes/rebuild_stats/rebuild_stats.dart'; import 'package:devtools_app/src/screens/performance/panes/timeline_events/perfetto/perfetto.dart'; import 'package:devtools_app/src/screens/performance/panes/timeline_events/timeline_events_view.dart'; @@ -113,11 +112,10 @@ await pumpView(tester); expect(find.byType(AnalyticsTabbedView), findsOneWidget); - expect(find.byType(DevToolsTab), findsNWidgets(4)); + expect(find.byType(DevToolsTab), findsNWidgets(3)); expect(find.text('Timeline Events'), findsOneWidget); expect(find.text('Frame Analysis'), findsOneWidget); - expect(find.text('Raster Stats'), findsOneWidget); expect(find.text('Rebuild Stats'), findsOneWidget); }); }, @@ -138,7 +136,7 @@ await pumpView(tester, performanceController: controller); expect(find.byType(AnalyticsTabbedView), findsOneWidget); - expect(find.byType(DevToolsTab), findsNWidgets(4)); + expect(find.byType(DevToolsTab), findsNWidgets(3)); // The frame analysis tab should be selected by default. expect(find.byType(FlutterFrameAnalysisView), findsOneWidget); @@ -155,7 +153,7 @@ await pumpView(tester); expect(find.byType(AnalyticsTabbedView), findsOneWidget); - expect(find.byType(DevToolsTab), findsNWidgets(4)); + expect(find.byType(DevToolsTab), findsNWidgets(3)); // The frame analysis tab should be selected by default. expect( @@ -167,27 +165,6 @@ ); testWidgetsWithWindowSize( - 'builds content for Raster Stats tab', - windowSize, - (WidgetTester tester) async { - await tester.runAsync(() async { - await setUpServiceManagerWithTimeline(); - await pumpView(tester); - await tester.pumpAndSettle(); - expect(find.byType(AnalyticsTabbedView), findsOneWidget); - expect(find.byType(DevToolsTab), findsNWidgets(4)); - - await tester.tap(find.text('Raster Stats')); - await tester.pumpAndSettle(); - - expect(find.byType(RasterStatsView), findsOneWidget); - expect(find.text('Take Snapshot'), findsOneWidget); - expect(find.byType(ClearButton), findsOneWidget); - }); - }, - ); - - testWidgetsWithWindowSize( 'builds content for Rebuild Stats tab', windowSize, (WidgetTester tester) async { @@ -196,7 +173,7 @@ await pumpView(tester); await tester.pumpAndSettle(); expect(find.byType(AnalyticsTabbedView), findsOneWidget); - expect(find.byType(DevToolsTab), findsNWidgets(4)); + expect(find.byType(DevToolsTab), findsNWidgets(3)); await tester.tap(find.text('Rebuild Stats')); await tester.pumpAndSettle(); @@ -215,7 +192,7 @@ await pumpView(tester); expect(find.byType(AnalyticsTabbedView), findsOneWidget); - expect(find.byType(DevToolsTab), findsNWidgets(4)); + expect(find.byType(DevToolsTab), findsNWidgets(3)); await tester.tap(find.text('Timeline Events')); await tester.pumpAndSettle(); @@ -249,7 +226,6 @@ expect(find.byType(DevToolsTab), findsOneWidget); expect(find.text('Timeline Events'), findsOneWidget); expect(find.text('Frame Analysis'), findsNothing); - expect(find.text('Raster Stats'), findsNothing); }); }, );
diff --git a/packages/devtools_test/lib/src/mocks/generated.dart b/packages/devtools_test/lib/src/mocks/generated.dart index 229fe20..745cc24 100644 --- a/packages/devtools_test/lib/src/mocks/generated.dart +++ b/packages/devtools_test/lib/src/mocks/generated.dart
@@ -23,7 +23,6 @@ MockSpec<TimelineEventsController>(), MockSpec<LoggingController>(), MockSpec<LoggingControllerV2>(), - MockSpec<RasterStatsController>(), MockSpec<ProgramExplorerController>(), MockSpec<ScriptManager>(), MockSpec<ServiceConnectionManager>(),
diff --git a/packages/devtools_test/lib/src/mocks/generated_mocks_factories.dart b/packages/devtools_test/lib/src/mocks/generated_mocks_factories.dart index cb52260..9fa9f19 100644 --- a/packages/devtools_test/lib/src/mocks/generated_mocks_factories.dart +++ b/packages/devtools_test/lib/src/mocks/generated_mocks_factories.dart
@@ -36,10 +36,6 @@ when(flutterFramesController.displayRefreshRate) .thenReturn(ValueNotifier<double>(defaultRefreshRate)); - // Stubs for Raster Stats feature. - when(controller.rasterStatsController) - .thenReturn(RasterStatsController(controller)); - // Stubs for Timeline Events feature. when(controller.timelineEventsController) .thenReturn(timelineEventsController);
diff --git a/packages/devtools_test/lib/src/test_data/_performance_data.dart b/packages/devtools_test/lib/src/test_data/_performance_data.dart index 0bb1173..aaaf7b5 100644 --- a/packages/devtools_test/lib/src/test_data/_performance_data.dart +++ b/packages/devtools_test/lib/src/test_data/_performance_data.dart
@@ -6,8 +6,6 @@ // ignore_for_file: prefer-trailing-comma // ignore_for_file: require_trailing_commas -import '_performance_raster_stats.dart'; - final samplePerformanceData = <String, Object?>{ "devToolsSnapshot": true, "devToolsVersion": "2.34.0", @@ -108243,7 +108241,6 @@ } ], "displayRefreshRate": 60, - "rasterStats": rasterStatsFromDevToolsJson, "rebuildCountModel": null, } };
diff --git a/packages/devtools_test/lib/src/test_data/_performance_data_large.dart b/packages/devtools_test/lib/src/test_data/_performance_data_large.dart index a88a6f2..6ecd69a 100644 --- a/packages/devtools_test/lib/src/test_data/_performance_data_large.dart +++ b/packages/devtools_test/lib/src/test_data/_performance_data_large.dart
@@ -6,8 +6,6 @@ // ignore_for_file: prefer-trailing-comma // ignore_for_file: require_trailing_commas -import '_performance_raster_stats.dart'; - final samplePerformanceDataLarge = <String, Object?>{ "devToolsSnapshot": true, "devToolsVersion": "2.34.0-dev.0", @@ -1755757,7 +1755755,6 @@ } ], "displayRefreshRate": 60, - "rasterStats": rasterStatsFromDevToolsJson, "rebuildCountModel": null, } };
diff --git a/packages/devtools_test/lib/src/test_data/_performance_raster_stats.dart b/packages/devtools_test/lib/src/test_data/_performance_raster_stats.dart deleted file mode 100644 index 16717e1..0000000 --- a/packages/devtools_test/lib/src/test_data/_performance_raster_stats.dart +++ /dev/null
@@ -1,8965 +0,0 @@ -// Copyright 2022 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. - -const rasterStatsFromServiceJson = { - 'type': 'RenderFrameWithRasterStats', - ..._rasterStatsCommon, -}; - -const rasterStatsFromDevToolsJson = { - ..._rasterStatsCommon, - 'selectedId': 12734, -}; - -const rebuildCountModelJson = { - 'locations': { - 'file:///Users/jacobr/git/perf_diagnosis_demo/lib/main.dart': { - 'ids': [ - 1, - 2, - 3, - 4, - 6, - 8, - 9, - 10, - 13, - 14, - 15, - 16, - 18, - 19, - 20, - 152, - 185, - 245, - ], - 'lines': [ - 10, - 17, - 22, - 39, - 47, - 51, - 105, - 107, - 83, - 84, - 85, - 62, - 66, - 40, - 41, - 57, - 43, - 54, - ], - 'columns': [ - 14, - 16, - 17, - 16, - 11, - 17, - 12, - 14, - 9, - 9, - 18, - 11, - 15, - 19, - 20, - 53, - 15, - 60, - ], - 'names': [ - 'MyApp', - 'MaterialApp', - 'MyHomePage', - 'Scaffold', - 'Card', - 'SectionHeader', - 'Container', - 'Text', - 'Icon', - 'TextButton', - 'Text', - 'Card', - 'SectionHeader', - 'AppBar', - 'Text', - 'SpinningBoxDemo', - 'MyDrawer', - 'ClockDemo', - ], - }, - 'file:///Users/jacobr/git/perf_diagnosis_demo/lib/spinning_box_demo.dart': { - 'ids': [153, 154, 161, 166, 172, 173, 174, 175, 176, 177, 179], - 'lines': [8, 13, 9, 10, 19, 50, 54, 75, 82, 83, 88], - 'columns': [12, 20, 15, 16, 58, 12, 14, 12, 22, 33, 30], - 'names': [ - 'Scaffold', - 'GridView', - 'AppBar', - 'Text', - 'GridItem', - 'GestureDetector', - 'SpinningBox', - 'AnimatedBuilder', - 'Container', - 'GridView', - 'Container', - ], - }, - 'file:///Users/jacobr/git/perf_diagnosis_demo/lib/drawer.dart': { - 'ids': [186, 188, 189, 190, 191, 192, 194, 195, 232], - 'lines': [13, 20, 60, 61, 62, 33, 38, 29, 30], - 'columns': [12, 26, 9, 9, 18, 11, 26, 48, 56], - 'names': [ - 'Drawer', - 'Text', - 'Icon', - 'TextButton', - 'Text', - 'Divider', - 'Text', - 'ListFix', - 'SpinningBoxFix', - ], - }, - 'file:///Users/jacobr/git/perf_diagnosis_demo/lib/optimized/list_fix.dart': - { - 'ids': [ - 196, - 197, - 199, - 200, - 204, - 205, - 211, - 213, - 215, - 216, - 217, - 218, - 219, - 220, - 221, - 222, - 223, - 224, - 225, - 226, - 227, - 228, - 229, - 230, - 231, - ], - 'lines': [ - 6, - 10, - 7, - 8, - 13, - 15, - 18, - 16, - 17, - 22, - 24, - 27, - 25, - 26, - 31, - 33, - 37, - 34, - 35, - 41, - 43, - 45, - 46, - 47, - 48, - ], - 'columns': [ - 12, - 22, - 15, - 16, - 20, - 22, - 26, - 24, - 27, - 20, - 22, - 26, - 24, - 27, - 20, - 22, - 26, - 24, - 27, - 20, - 20, - 22, - 26, - 24, - 27, - ], - 'names': [ - 'Scaffold', - 'ListView', - 'AppBar', - 'Text', - 'Card', - 'ListTile', - 'Icon', - 'Text', - 'Text', - 'Card', - 'ListTile', - 'Icon', - 'Text', - 'Text', - 'Card', - 'ListTile', - 'Icon', - 'Text', - 'Text', - 'Divider', - 'InkWell', - 'ListTile', - 'Icon', - 'Text', - 'Text', - ], - }, - 'file:///Users/jacobr/git/perf_diagnosis_demo/lib/optimized/spinning_box_fix.dart': - { - 'ids': [233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244], - 'lines': [11, 16, 12, 13, 22, 53, 57, 78, 59, 95, 96, 101], - 'columns': [12, 20, 15, 16, 58, 12, 14, 12, 16, 12, 23, 18], - 'names': [ - 'Scaffold', - 'GridView', - 'AppBar', - 'Text', - 'GridItem', - 'GestureDetector', - 'SpinningBox', - 'AnimatedBuilder', - 'GridInGrid', - 'Container', - 'GridView', - 'Container', - ], - }, - 'file:///Users/jacobr/git/perf_diagnosis_demo/lib/clock_demo.dart': { - 'ids': [246, 247, 248, 249, 250, 251, 252], - 'lines': [33, 52, 53, 54, 55, 34, 35], - 'columns': [12, 12, 16, 14, 17, 15, 16], - 'names': [ - 'Scaffold', - 'ListTile', - 'Icon', - 'Text', - 'Text', - 'AppBar', - 'Text', - ], - }, - }, - 'frames': [ - { - 'frameNumber': 827, - 'events': [14, 1], - }, - {'frameNumber': 828, 'events': []}, - {'frameNumber': 829, 'events': []}, - { - 'frameNumber': 830, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - 14, - 1, - ], - }, - { - 'frameNumber': 831, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 832, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 833, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 834, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 835, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 836, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 837, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 838, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 839, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 840, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 841, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 842, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 843, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 844, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 845, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 846, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 847, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 848, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 849, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 850, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 851, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 852, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 853, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 854, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 855, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 856, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 857, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 858, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 859, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 860, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - { - 'frameNumber': 861, - 'events': [ - 245, - 1, - 246, - 1, - 247, - 6, - 248, - 6, - 249, - 6, - 250, - 6, - 251, - 1, - 252, - 1, - ], - }, - {'frameNumber': 862, 'events': []}, - ], -}; - -const _rasterStatsCommon = { - 'frame_width': 100, - 'frame_height': 200, - 'snapshots': [ - { - 'layer_unique_id': 12731, - 'duration_micros': 389, - 'width': 50, - 'height': 50, - 'left': 25, - 'top': 25, - 'snapshot': [ - 137, - 80, - 78, - 71, - 13, - 10, - 26, - 10, - 0, - 0, - 0, - 13, - 73, - 72, - 68, - 82, - 0, - 0, - 2, - 238, - 0, - 0, - 5, - 54, - 8, - 6, - 0, - 0, - 0, - 202, - 215, - 51, - 6, - 0, - 0, - 0, - 1, - 115, - 82, - 71, - 66, - 0, - 174, - 206, - 28, - 233, - 0, - 0, - 0, - 4, - 115, - 66, - 73, - 84, - 8, - 8, - 8, - 8, - 124, - 8, - 100, - 136, - 0, - 0, - 15, - 62, - 73, - 68, - 65, - 84, - 120, - 156, - 237, - 193, - 1, - 13, - 0, - 0, - 0, - 194, - 160, - 247, - 79, - 109, - 15, - 7, - 20, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 192, - 147, - 1, - 25, - 153, - 0, - 1, - 48, - 146, - 82, - 129, - 0, - 0, - 0, - 0, - 73, - 69, - 78, - 68, - 174, - 66, - 96, - 130, - ], - }, - { - 'layer_unique_id': 12734, - 'duration_micros': 105, - 'width': 20, - 'height': 40, - 'left': 35, - 'top': 30, - 'snapshot': [ - 137, - 80, - 78, - 71, - 13, - 10, - 26, - 10, - 0, - 0, - 0, - 13, - 73, - 72, - 68, - 82, - 0, - 0, - 2, - 238, - 0, - 0, - 5, - 54, - 8, - 6, - 0, - 0, - 0, - 202, - 215, - 51, - 6, - 0, - 0, - 0, - 1, - 115, - 82, - 71, - 66, - 0, - 174, - 206, - 28, - 233, - 0, - 0, - 0, - 4, - 115, - 66, - 73, - 84, - 8, - 8, - 8, - 8, - 124, - 8, - 100, - 136, - 0, - 0, - 15, - 62, - 73, - 68, - 65, - 84, - 120, - 156, - 237, - 193, - 1, - 13, - 0, - 0, - 0, - 194, - 160, - 247, - 79, - 109, - 15, - 7, - 20, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 192, - 147, - 1, - 25, - 153, - 0, - 1, - 48, - 146, - 82, - 129, - 0, - 0, - 0, - 0, - 73, - 69, - 78, - 68, - 174, - 66, - 96, - 130, - ], - }, - ], -};
diff --git a/packages/devtools_test/lib/test_data.dart b/packages/devtools_test/lib/test_data.dart index e09875b..8c9078c 100644 --- a/packages/devtools_test/lib/test_data.dart +++ b/packages/devtools_test/lib/test_data.dart
@@ -5,5 +5,4 @@ export 'src/test_data/_cpu_profiler_data.dart'; export 'src/test_data/_performance_data.dart'; export 'src/test_data/_performance_data_large.dart'; -export 'src/test_data/_performance_raster_stats.dart'; export 'src/test_data/sample_data.dart';