anchor.diff:    /// If [above] is non-null, the entries are inserted just above [above].
     /// Otherwise, the entries are inserted on top.
     void insertAll(Iterable<OverlayEntry> entries, { OverlayEntry above }) {
  -    assert(above == null || (above._state == this && _entries.contains(above)));
  +    assert(above == null || (above._overlay == this && _entries.contains(above)));
       for (OverlayEntry entry in entries) {
  -      assert(entry._state == null);
  -      entry._state = this;
  +      assert(entry._overlay == null);
  +      entry._overlay = this;
       }
       setState(() {
         int index = above == null ? _entries.length : _entries.indexOf(above) + 1;
  
positive.code:   bool get opaque => _opaque;
    bool _opaque;
    void set opaque (bool value) {
      if (_opaque == value)
        return;
      _opaque = value;
      markNeedsBuild();
    }
  
    OverlayState _state;
  
    /// Remove this entry from the overlay.
    void remove() {
      _state?._remove(this);
      _state = null;
    }
  
    /// Cause this entry to rebuild during the next pipeline flush.
    ///
    /// You need to call this function if the output of [builder] has changed.
    void markNeedsBuild() {
      // TODO(ianh): find a way to make this not rebuild the entire overlay
      _state?.setState(() {});
    }
  
    String toString() => '$runtimeType@$hashCode(opaque: $opaque)';
  }
  
  /// A [Stack] of entries that can be managed independently.
  
negative.code: 
      for (int i = _entries.length - 1; i >= 0; --i) {
        OverlayEntry entry = _entries[i];
        backwardsChildren.add(new _OverlayEntry(entry));
        if (entry.opaque)
          break;
      }
  