code: func ReadAndInterpolateRawManifest(pathToManifest string, pathsToVarsFiles []string, vars []template.VarKV) ([]byte, error) {
  	rawManifest, err := ioutil.ReadFile(pathToManifest)
  	if err != nil {
  		return nil, err
  	}
  
  	tpl := template.NewTemplate(rawManifest)
  	fileVars := template.StaticVariables{}
  
  	for _, path := range pathsToVarsFiles {
  		rawVarsFile, ioerr := ioutil.ReadFile(path)
  		if ioerr != nil {
  			return nil, ioerr
  		}
  
  		var sv template.StaticVariables
  
  		err = yaml.Unmarshal(rawVarsFile, &sv)
  		if err != nil {
  			return nil, InvalidYAMLError{Err: err}
  		}
  
  		for k, v := range sv {
  			fileVars[k] = v
  		}
  	}
  
  	for _, kv := range vars {
  		fileVars[kv.Name] = kv.Value
  	}
  
  	rawManifest, err = tpl.Evaluate(fileVars, nil, template.EvaluateOpts{ExpectAllKeys: true})
  	if err != nil {
  		return nil, InterpolationError{Err: err}
  	}
  	return rawManifest, nil
  }
docs: // ReadAndInterpolateRawManifest reads the manifest at the provided paths,
  // interpolates variables if a vars file is provided, and returns the
  // Unmarshalled result.