anchor.diff:        }
       }
       // remove existing items
  -    rows.forEach((key, row){
  +    _rows.forEach((key, row){
         row.block.remove();
         row.scope.$destroy();
       });
  -    rows = newRows;
  +    _rows = newRows;
       return newRowOrder;
     }
   
     _onCollectionChange(collection) {
  -    var previousNode = blockHole.elements[0],     // current position of the node
  +    var previousNode = _blockHole.elements[0],     // current position of the node
           nextNode,
           childScope,
           trackById,
  -        cursor = blockHole;
  +        cursor = _blockHole;
   
       if (collection is! List) {
         collection = [];
  
positive.code:     var length = newRowOrder.length = collection.length;
      for (var index = 0; index < length; index++) {
        var value = collection[index];
        trackById = trackByIdFn(index, value, index);
        if (rows.containsKey(trackById)) {
          var row = rows[trackById];
          rows.remove(trackById);
          newRows[trackById] = row;
          newRowOrder[index] = row;
        } else if (newRows.containsKey(trackById)) {
          // restore lastBlockMap
          newRowOrder.forEach((row) {
            if (row != null && row.startNode != null) {
              rows[row.id] = row;
            }
          });
          // This is a duplicate and we need to throw an error
  
negative.code:         previousNode = row.endNode;
        } else {
          // new item which we don't know about
          childScope = _scope.$new();
        }
  
        childScope[_valueIdentifier] = value;
        childScope[r'$index'] = index;
        childScope[r'$first'] = (index == 0);
        childScope[r'$last'] = (index == (collection.length - 1));
  