anchor.diff:  init(Opts) ->
       Opts1 = merge_with_environment(Opts),
       SSLOptions = maps:get(ssl_options, Opts1, undefined),
  -    Endpoints = endpoints(maps:get(endpoints, Opts1, ?DEFAULT_ENDPOINTS), SSLOptions),
       Headers = headers(maps:get(headers, Opts1, [])),
       Compression = maps:get(compression, Opts1, undefined),
       case maps:get(protocol, Opts1, http_protobuf) of
           grpc ->
  +            Endpoints = endpoints(maps:get(endpoints, Opts1, ?DEFAULT_GRPC_ENDPOINTS), SSLOptions),
               ChannelOpts = maps:get(channel_opts, Opts1, #{}),
               UpdatedChannelOpts = case Compression of
                                      undefined -> ChannelOpts;
  
positive.code:     AppOpts = otel_configuration:merge_list_with_environment(config_mapping(), AppEnv, Config),
  
      %% append the default path `/v1/traces` only to the path of otlp_endpoint
      Opts1 = update_opts(otlp_endpoint, endpoints, ?DEFAULT_ENDPOINTS, AppOpts, Opts, fun endpoints_append_path/1),
      Opts2 = update_opts(otlp_traces_endpoint, endpoints, ?DEFAULT_ENDPOINTS, AppOpts, Opts1, fun maybe_to_list/1),
  
      Opts3 = update_opts(otlp_headers, headers, [], AppOpts, Opts2),
      Opts4 = update_opts(otlp_traces_headers, headers, [], AppOpts, Opts3),
  
negative.code:              port => Port,
               path => [],
               ssl_options => update_ssl_opts(HostString, DefaultSSLOpts)}};
  parse_endpoint(Endpoint=#{host := Host, scheme := Scheme, path := Path}, DefaultSSLOpts) ->
      HostString = unicode:characters_to_list(Host),
      {true, maps:merge(#{host => unicode:characters_to_list(Host),
                          port => scheme_port(Scheme),
                          path => unicode:characters_to_list(Path),
                          ssl_options => update_ssl_opts(HostString, DefaultSSLOpts)}, Endpoint)};
  parse_endpoint(String, DefaultSSLOpts) when is_list(String) orelse is_binary(String) ->
  