code: func ResolveScopeSpecifiers(ctx context.Context, scopeSpecs []string) []auth.Access {
  	requestedAccessSet := make(map[auth.Access]struct{}, 2*len(scopeSpecs))
  
  	for _, scopeSpecifier := range scopeSpecs {
  		// There should be 3 parts, separated by a `:` character.
  		parts := strings.SplitN(scopeSpecifier, ":", 3)
  
  		if len(parts) != 3 {
  			dcontext.GetLogger(ctx).Infof("ignoring unsupported scope format %s", scopeSpecifier)
  			continue
  		}
  
  		resourceType, resourceName, actions := parts[0], parts[1], parts[2]
  
  		resourceType, resourceClass := splitResourceClass(resourceType)
  		if resourceType == "" {
  			continue
  		}
  
  		// Actions should be a comma-separated list of actions.
  		for _, action := range strings.Split(actions, ",") {
  			requestedAccess := auth.Access{
  				Resource: auth.Resource{
  					Type:  resourceType,
  					Class: resourceClass,
  					Name:  resourceName,
  				},
  				Action: action,
  			}
  
  			// Add this access to the requested access set.
  			requestedAccessSet[requestedAccess] = struct{}{}
  		}
  	}
  
  	requestedAccessList := make([]auth.Access, 0, len(requestedAccessSet))
  	for requestedAccess := range requestedAccessSet {
  		requestedAccessList = append(requestedAccessList, requestedAccess)
  	}
  
  	return requestedAccessList
  }
docs: // ResolveScopeSpecifiers converts a list of scope specifiers from a token
  // request's `scope` query parameters into a list of standard access objects.