anchor.diff:  // TODO(mpcomplete): The curve must be linear if we want the drawer to track
   // the user's finger. Odeon remedies this by attaching spring forces to the
   // initial timeline when animating (so it doesn't look linear).
  +const Point _kOpenPosition = Point.origin;
  +const Point _kClosedPosition = const Point(-_kWidth, 0.0);
   const Curve _kAnimationCurve = linear;
   
   typedef void DrawerStatusChangeHandler (bool showing);
  
positive.code:   DrawerStatusChangedCallback onStatusChanged;
    Navigator navigator;
  
    AnimationPerformance _performance;
    AnimationBuilder _builder;
  
    void initState() {
      _builder = new AnimationBuilder()
        ..position = new AnimatedType<Point>(
            new Point(-_kWidth, 0.0), end: Point.origin, curve: _kAnimationCurve);
      _performance = _builder.createPerformance([_builder.position],
                                                  duration: _kBaseSettleDuration)
          ..addListener(_checkForStateChanged);
      watch(_performance);
      if (showing)
        _show();
    }
  
    void _show() {
  
negative.code:     _performance.play();
    }
  
    void _hide() {
      _performance.reverse();
    }
  
    Widget build() {
      var mask = new Listener(
        child: new Container(
          decoration: new BoxDecoration(backgroundColor: _maskColor.value)
        ),
        onGestureTap: handleMaskTap
      );
  
      Matrix4 transform = new Matrix4.identity();
      transform.translate(_position.value.x, _position.value.y);
      Widget content = new Transform(
        transform: transform,
        child: new Container(
          decoration: new BoxDecoration(
            backgroundColor: Theme.of(this).canvasColor,
            boxShadow: shadows[level]),
  