code: func decodeRowKey(v string) (*rowKey, error) {
  	keyParts := strings.SplitN(v, "~", 3)
  	if len(keyParts) != 3 {
  		return nil, errMalformedRowKey
  	}
  
  	hashEnc, idxEnc, countEnc := keyParts[0], keyParts[1], keyParts[2]
  	if base64.URLEncoding.DecodedLen(len(hashEnc)) < sha256.Size {
  		return nil, errMalformedRowKey
  	}
  
  	// Decode encoded project/path hash.
  	var err error
  	rk := rowKey{}
  	rk.pathHash, err = base64.URLEncoding.DecodeString(hashEnc)
  	if err != nil {
  		return nil, errMalformedRowKey
  	}
  
  	// Decode index.
  	rk.index, err = readHexInt64(idxEnc)
  	if err != nil {
  		return nil, err
  	}
  
  	// If a count is available, decode that as well.
  	rk.count, err = readHexInt64(countEnc)
  	if err != nil {
  		return nil, err
  	}
  
  	return &rk, nil
  }
docs: // decodeRowKey decodes an encoded row key into its structural components.