code: func UpdateCRLSet(c context.Context, cn string, shardCount int, crl *pkix.CertificateList) error {
  	// Split CRL into shards.
  	set := make(shards.Set, shardCount)
  	for _, cert := range crl.TBSCertList.RevokedCertificates {
  		sn, err := utils.SerializeSN(cert.SerialNumber)
  		if err != nil {
  			return err
  		}
  		set.Insert(sn)
  	}
  	// Update shards in parallel via a bunch of independent transactions.
  	wg := sync.WaitGroup{}
  	er := errors.NewLazyMultiError(len(set))
  	for idx, shard := range set {
  		wg.Add(1)
  		go func(idx int, shard shards.Shard) {
  			defer wg.Done()
  			er.Assign(idx, updateCRLShard(c, cn, shard, shardCount, idx))
  		}(idx, shard)
  	}
  	wg.Wait()
  	return er.Get()
  }
docs: // UpdateCRLSet splits a set of revoked certificate serial numbers into shards,
  // storing each shard in a separate entity (CRLShardBody).
  //
  // It effectively overwrites the entire set.