anchor.diff:  
     @override
     Widget build(BuildContext context) {
  -    Widget header = new _TimePickerHeader(
  -      selectedTime: config.selectedTime,
  -      mode: _mode,
  -      onModeChanged: _handleModeChanged,
  -      onChanged: config.onChanged
  -    );
       return new Column(
  +      crossAxisAlignment: CrossAxisAlignment.stretch,
         children: <Widget>[
  -        header,
  -        new AspectRatio(
  -          aspectRatio: 1.0,
  +        new _TimePickerHeader(
  +          selectedTime: config.selectedTime,
  +          mode: _mode,
  +          onModeChanged: _handleModeChanged,
  +          onChanged: config.onChanged
  +        ),
  +        new Center(
             child: new Container(
  -            margin: const EdgeInsets.all(12.0),
  -            child: new _Dial(
  -              mode: _mode,
  -              selectedTime: config.selectedTime,
  -              onChanged: config.onChanged
  +            margin: const EdgeInsets.all(16.0),
  +            width: _kPreferredDialExtent,
  +            child: new AspectRatio(
  +              aspectRatio: 1.0,
  +              child: new _Dial(
  +                mode: _mode,
  +                selectedTime: config.selectedTime,
  +                onChanged: config.onChanged
  +              )
               )
             )
           )
  -      ],
  -      crossAxisAlignment: CrossAxisAlignment.stretch
  +      ]
       );
     }
   }
  
positive.code:         inactiveColor = Colors.white70;
          break;
      }
      TextStyle activeStyle = headerTheme.display3.copyWith(color: activeColor);
      TextStyle inactiveStyle = headerTheme.display3.copyWith(color: inactiveColor);
  
      TextStyle hourStyle = mode == _TimePickerMode.hour ? activeStyle : inactiveStyle;
      TextStyle minuteStyle = mode == _TimePickerMode.minute ? activeStyle : inactiveStyle;
  
      TextStyle amStyle = headerTheme.subhead.copyWith(
        color: selectedTime.period == DayPeriod.am ? activeColor: inactiveColor
      );
      TextStyle pmStyle = headerTheme.subhead.copyWith(
        color: selectedTime.period == DayPeriod.pm ? activeColor: inactiveColor
      );
  
      return new Container(
        padding: const EdgeInsets.fromLTRB(24.0, 24.0, 24.0, 20.0),
        decoration: new BoxDecoration(backgroundColor: theme.primaryColor),
        child: new Row(
          children: <Widget>[
            new GestureDetector(
              onTap: () => _handleChangeMode(_TimePickerMode.hour),
              child: new Text(selectedTime.hourOfPeriodLabel, style: hourStyle)
            ),
            new Text(':', style: inactiveStyle),
            new GestureDetector(
              onTap: () => _handleChangeMode(_TimePickerMode.minute),
              child: new Text(selectedTime.minuteLabel, style: minuteStyle)
            ),
            new GestureDetector(
              onTap: _handleChangeDayPeriod,
              behavior: HitTestBehavior.opaque,
              child: new Container(
                padding: const EdgeInsets.only(left: 16.0, right: 24.0),
                child: new Column(
                  children: <Widget>[
                    new Text('AM', style: amStyle),
                    new Container(
                      padding: const EdgeInsets.only(top: 4.0),
                      child: new Text('PM', style: pmStyle)
                    ),
                  ],
                  mainAxisAlignment: MainAxisAlignment.end
                )
              )
            )
          ],
          mainAxisAlignment: MainAxisAlignment.end
        )
      );
    }
  }
  
  List<TextPainter> _initPainters(List<String> labels) {
    TextStyle style = Typography.black.subhead.copyWith(height: 1.0);
    List<TextPainter> painters = new List<TextPainter>(labels.length);
    for (int i = 0; i < painters.length; ++i) {
      String label = labels[i];
  
negative.code:                                  -labelRadius * math.sin(theta));
      }
  
      void paintLabels(List<TextPainter> labels) {
        double labelThetaIncrement = -_kTwoPi / labels.length;
        double labelTheta = math.PI / 2.0;
  
        for (TextPainter label in labels) {
          Offset labelOffset = new Offset(-label.width / 2.0, -label.height / 2.0);
          label.paint(canvas, getOffsetForTheta(labelTheta) + labelOffset);
          labelTheta += labelThetaIncrement;
        }
      }
  
      paintLabels(primaryLabels);
  
      final Paint selectorPaint = new Paint()
        ..color = accentColor;
      final Point focusedPoint = getOffsetForTheta(theta).toPoint();
      final double focusedRadius = labelPadding - 4.0;
      canvas.drawCircle(centerPoint, 4.0, selectorPaint);
      canvas.drawCircle(focusedPoint, focusedRadius, selectorPaint);
      selectorPaint.strokeWidth = 2.0;
      canvas.drawLine(centerPoint, focusedPoint, selectorPaint);
  
      final Rect focusedRect = new Rect.fromCircle(
        center: focusedPoint, radius: focusedRadius
      );
      canvas
        ..saveLayer(focusedRect, new Paint())
        ..clipPath(new Path()..addOval(focusedRect));
      paintLabels(secondaryLabels);
      canvas.restore();
    }
  
    @override
    bool shouldRepaint(_DialPainter oldPainter) {
      return oldPainter.primaryLabels != primaryLabels
          || oldPainter.secondaryLabels != secondaryLabels
          || oldPainter.backgroundColor != backgroundColor
          || oldPainter.accentColor != accentColor
          || oldPainter.theta != theta;
    }
  }
  