anchor.diff:     */
     void applyColumnWidths() {
       int x = 0, w;
  -    Map<String,CssStyleRule> rule;
  +    Map<String, CssStyleRule> rule;
       for (int i = 0; i < columns.length; i++) {
         w = columns[i].width;
   
  
positive.code:   Element $headerScrollerL;
    Element $headerScrollerR;
  
   Element $headerL;
   Element $headerR;
  
   Element $headerRowScrollerL;
   Element $headerRowScrollerR;
  
   Element $headerRowL;
   Element $headerRowR;
  
   Element $topPanelScrollerL;
   Element $topPanelScrollerR;
  
   Element $topPanelL;
   Element $topPanelR;
  
   Element $viewportTopL;
   Element $viewportTopR;
   Element $viewportBottomL;
   Element $viewportBottomR;
  
   // canvas,
   // very long and wide area that hold real row elements
   Element $canvasTopL;
   Element $canvasTopR;
   Element $canvasBottomL;
   Element $canvasBottomR;
  
   Element $viewportScrollContainerX;
   Element $viewportScrollContainerY;
   Element $headerScrollContainer;
   Element $headerRowScrollContainer;
  
   //  {}
   //   1~N => block
   //   N+1 ~ 2N => block
   //  2N+1 ~ 3N => block
   // sort => re calculat every row
   // insert => increase height of block and shift of each block
   //
  
  
    /////////////////////////////one line accesser
    int getDataLength()=> _data.length;
    int getColumnIndex(String id) =>columnsById[id];
    List getSortColumns() => sortColumns;
    List<Column> getColumns() => columns;
    handleSelectedRangesChanged(core.EventData e, List<core.Range> ranges) {
      selectedRows = [];
       Map<int,Map<String,String>>  hash = {};
      for (var i = 0; i < ranges.length; i++) {
        for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
          if (!hash.containsKey(j)) {  // prevent duplicates
            selectedRows.add(j);
            hash[j] = {};
          }
  
negative.code:   int topPanelH = 0;
    int headerRowH = 0;
  
    int tabbingDirection = 1;
    Element $activeCanvasNode;
    Element $activeViewportNode;
  