package quic

import (
	
	

	
	
)

// Clone clones a Config.
func ( *Config) () *Config {
	 := *
	return &
}

func ( *Config) () time.Duration {
	return 2 * .HandshakeIdleTimeout
}

func ( *Config) () time.Duration {
	return .handshakeTimeout()
}

func validateConfig( *Config) error {
	if  == nil {
		return nil
	}
	const  = 1 << 60
	if .MaxIncomingStreams >  {
		.MaxIncomingStreams = 
	}
	if .MaxIncomingUniStreams >  {
		.MaxIncomingUniStreams = 
	}
	if .MaxStreamReceiveWindow > quicvarint.Max {
		.MaxStreamReceiveWindow = quicvarint.Max
	}
	if .MaxConnectionReceiveWindow > quicvarint.Max {
		.MaxConnectionReceiveWindow = quicvarint.Max
	}
	if .InitialPacketSize > 0 && .InitialPacketSize < protocol.MinInitialPacketSize {
		.InitialPacketSize = protocol.MinInitialPacketSize
	}
	if .InitialPacketSize > protocol.MaxPacketBufferSize {
		.InitialPacketSize = protocol.MaxPacketBufferSize
	}
	// check that all QUIC versions are actually supported
	for ,  := range .Versions {
		if !protocol.IsValidVersion() {
			return fmt.Errorf("invalid QUIC version: %s", )
		}
	}
	return nil
}

// populateConfig populates fields in the quic.Config with their default values, if none are set
// it may be called with nil
func populateConfig( *Config) *Config {
	if  == nil {
		 = &Config{}
	}
	 := .Versions
	if len() == 0 {
		 = protocol.SupportedVersions
	}
	 := protocol.DefaultHandshakeIdleTimeout
	if .HandshakeIdleTimeout != 0 {
		 = .HandshakeIdleTimeout
	}
	 := protocol.DefaultIdleTimeout
	if .MaxIdleTimeout != 0 {
		 = .MaxIdleTimeout
	}
	 := .InitialStreamReceiveWindow
	if  == 0 {
		 = protocol.DefaultInitialMaxStreamData
	}
	 := .MaxStreamReceiveWindow
	if  == 0 {
		 = protocol.DefaultMaxReceiveStreamFlowControlWindow
	}
	 := .InitialConnectionReceiveWindow
	if  == 0 {
		 = protocol.DefaultInitialMaxData
	}
	 := .MaxConnectionReceiveWindow
	if  == 0 {
		 = protocol.DefaultMaxReceiveConnectionFlowControlWindow
	}
	 := .MaxIncomingStreams
	if  == 0 {
		 = protocol.DefaultMaxIncomingStreams
	} else if  < 0 {
		 = 0
	}
	 := .MaxIncomingUniStreams
	if  == 0 {
		 = protocol.DefaultMaxIncomingUniStreams
	} else if  < 0 {
		 = 0
	}
	 := .InitialPacketSize
	if  == 0 {
		 = protocol.InitialPacketSize
	}

	return &Config{
		GetConfigForClient:               .GetConfigForClient,
		Versions:                         ,
		HandshakeIdleTimeout:             ,
		MaxIdleTimeout:                   ,
		KeepAlivePeriod:                  .KeepAlivePeriod,
		InitialStreamReceiveWindow:       ,
		MaxStreamReceiveWindow:           ,
		InitialConnectionReceiveWindow:   ,
		MaxConnectionReceiveWindow:       ,
		AllowConnectionWindowIncrease:    .AllowConnectionWindowIncrease,
		MaxIncomingStreams:               ,
		MaxIncomingUniStreams:            ,
		TokenStore:                       .TokenStore,
		EnableDatagrams:                  .EnableDatagrams,
		InitialPacketSize:                ,
		DisablePathMTUDiscovery:          .DisablePathMTUDiscovery,
		EnableStreamResetPartialDelivery: .EnableStreamResetPartialDelivery,
		Allow0RTT:                        .Allow0RTT,
		Tracer:                           .Tracer,
	}
}