anchor.diff:          int index = (valueIndex + shift + cageShift) % _size;
           cell.text = rowValues[index].toString();
         }
  -      cageShift += _cageSize;
  +      cageShift = cageShifts[(rowIndex + 1) % _cageSize];
       }
     }
  -  
  +
     void hideCells(int count) {
       while (_hiddenCells.length < count) {
         int row_index = _random.nextInt(_size - 1);
  
positive.code:       rowValues[number - 1] = number;
      }
      rowValues.shuffle(_random);
      
      int shift = -1;
      int cageShift;
      for (int rowIndex = 0; rowIndex < _size; rowIndex++) {
        TableRowElement row = _table.addRow();
        row.id = "row-" + rowIndex.toString();
        if (rowIndex % _cageSize == 0) {
          shift++;
          cageShift = 0;
        }
        for (int valueIndex = 0; valueIndex < rowValues.length; valueIndex++) {
          TableCellElement cell = row.addCell();
  
negative.code: void main() {
    DivElement root = querySelector('#sudoku_container');
    Sudoku sudoku = new Sudoku(root);
    sudoku.hideCells(81);
  }
  
  class Sudoku {
  