code: func (r *RS) Reconst(vects [][]byte, dpHas, needReconst []int) (err error) {
  	err = r.checkReconst(dpHas, needReconst)
  	if err != nil {
  		if err == ErrNoNeedReconst {
  			return nil
  		}
  		return
  	}
  	sort.Ints(dpHas)
  	// make sure we have right data vects for reconst parity
  	for i := 0; i < r.DataCnt; i++ {
  		if !isIn(i, dpHas) && !isIn(i, needReconst) {
  			needReconst = append(needReconst, i)
  		}
  	}
  	dNeedReconst, pNeedReconst := SplitNeedReconst(r.DataCnt, needReconst)
  	if len(dNeedReconst) != 0 {
  		err = r.reconstData(vects, dpHas, dNeedReconst)
  		if err != nil {
  			return
  		}
  	}
  	if len(pNeedReconst) != 0 {
  		err = r.reconstParity(vects, pNeedReconst)
  		if err != nil {
  			return
  		}
  	}
  	return
  }
docs: // Reconst repair missing vects, len(dpHas) == dataCnt
  // e.g:
  // in 3+2, the whole index: [0,1,2,3,4]
  // if vects[0,4] are lost & they need to be reconst
  // the "dpHas" will be [1,2,3] ,and you must be sure that vects[1] vects[2] vects[3] have correct data
  // results will be put into vects[0]&vects[4]
  // dataOnly: only reconst data or not