This commit is contained in:
2025-03-04 23:50:33 +08:00
parent ae4a1b79ee
commit 032f66378a
3 changed files with 458 additions and 361 deletions

1
.gitignore vendored
View File

@@ -5,6 +5,7 @@ build/
!**/src/test/**/build/
### IntelliJ IDEA ###
.idea/
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml

2
.idea/misc.xml generated
View File

@@ -4,7 +4,7 @@
<component name="FrameworkDetectionExcludesConfiguration">
<file type="web" url="file://$PROJECT_DIR$" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="azul-21" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="zulu-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@@ -1,63 +1,111 @@
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Clash(
// Port
val port: Int? = null,
val socksPort: Int? = null,
val mixedPort: Int? = null,
// LAN
/*------------------------------------------- *General configuration* -------------------------------------------*/
// Allow LAN
val allowLan: Boolean? = null,
val bindAddress: String? = null,
val authentication: List<String>? = null,
val skipAuthPrefixes: List<String>? = null,
val lanAllowedIps: List<String>? = null,
val lanDisallowedIps: List<String>? = null,
val findProcessMode: String? = null,
val authentication: List<String>? = null,
val skipAuthPrefixes: List<String>? = null,
// Operation Mode
val mode: String? = null,
// Geo
val geoxUrl: GeoXUrl? = null,
val geoAutoUpdate: Boolean? = null,
val geoUpdateInterval: Int? = null,
// Log Level
val logLevel: String? = null,
val ipv6: Boolean? = null,
val tls: TLS? = null,
// External Controller
// TCP Keep Alive Settings
val keepAliveInterval: Int? = null,
val keepAliveIdle: Int? = null,
val disableKeepAlive: Boolean? = null,
// Process Matching Mode
val findProcessMode: String? = null,
// External Control (API)
val externalController: String? = null,
val externalControllerTls: String? = null,
val externalControllerCors: ExternalControllerCors? = null,
val externalControllerUnix: String? = null,
val externalControllerPipe: String? = null,
val secret: String? = null,
val externalDohServer: String? = null,
// External User Interface
val externalUi: String? = null,
val externalUiName: String? = null,
val externalUiUrl: String? = null,
val externalDohServer: String? = null,
val interfaceName: String? = null,
val globalClientFingerprint: String? = null,
val experimental: Experimental? = null,
val unifiedDelay: Boolean? = null,
val hosts: List<String>? = null,
// Cache
val profile: Profile? = null,
val tun: Tun? = null,
val sniffer: Sniffer? = null,
val tunnels: List<Tunnel>? = null,
// Unified Delay
val unifiedDelay: Boolean? = null,
// TCP Concurrency
val tcpConcurrent: Boolean? = null,
// Outbound Interface
val interfaceName: String? = null,
// Routing Mark
val routingMark: Int? = null,
// TLS
val tls: TLS? = null,
// GEO Data Configuration
val geoxUrl: GeoXUrl? = null,
val geoAutoUpdate: Boolean? = null,
val geoUpdateInterval: Int? = null,
// Global Client Fingerprint
val globalClientFingerprint: String? = null,
// Custom Global UA
val globalUa: String? = null,
// ETag Support
val etagSupport: Boolean? = null,
/*------------------------------------------------ *DNS* ------------------------------------------------*/
val hosts: List<String>? = null,
// TODO:
val dns: DNS? = null,
val sniffer: Sniffer? = null,
/*------------------------------------------------ *Inbounds* ------------------------------------------------*/
// Proxy Port
val port: Int? = null,
val socksPort: Int? = null,
val mixedPort: Int? = null,
val redirPort: Int? = null,
val tproxyPort: Int? = null,
val tun: Tun? = null,
val listeners: List<Listener>? = null,
// 未在文档中提到的属性
val experimental: Experimental? = null,
val tunnels: List<Tunnel>? = null,
val proxies: List<Proxy>? = null,
val proxyGroups: List<ProxyGroup>? = null,
val proxyProviders: Map<String, ProxyProvider>? = null,
val ruleProviders: Map<String, RuleProvider>? = null,
val rules: List<String>? = null,
val subRules: Map<String, List<String>>? = null,
val listeners: List<Listener>? = null
)
@Serializable
data class GeoXUrl(
val geoip: String? = null,
val geosite: String? = null,
val mmdb: String? = null
val mmdb: String? = null,
val asn: String? = null
)
@Serializable
@@ -88,20 +136,23 @@ data class Profile(
data class Tun(
val enable: Boolean? = null,
val stack: String? = null,
val dnsHijack: List<String>? = null,
val autoDetectInterface: Boolean? = null,
val autoRoute: Boolean? = null,
val autoRedirect: Boolean? = null,
val autoDetectInterface: Boolean? = null,
val dnsHijack: List<String>? = null,
val device: String? = null,
val mtu: Int? = null,
val strictRoute: Boolean? = null,
val gso: Boolean? = null,
val gsoMaxSize: Int? = null,
val autoRedirect: Boolean? = null,
val strictRoute: Boolean? = null,
val udpTimeout: Int? = null,
val iproute2TableIndex: Int? = null,
val iproute2RuleIndex: Int? = null,
val endpointIndependentNat: Boolean? = null,
val routeAddressSet: List<String>? = null,
val routeExcludeAddressSet: List<String>? = null,
val routeAddress: List<String>? = null,
val inet4RouteAddress: List<String>? = null,
val inet6RouteAddress: List<String>? = null,
val endpointIndependentNat: Boolean? = null,
val routeExcludeAddress: List<String>? = null,
val includeInterface: List<String>? = null,
val excludeInterface: List<String>? = null,
val includeUid: List<Int>? = null,
@@ -110,20 +161,26 @@ data class Tun(
val excludeUidRange: List<Pair<Int, Int>>? = null,
val includeAndroidUser: List<Int>? = null,
val includePackage: List<String>? = null,
val excludePackage: List<String>? = null
val excludePackage: List<String>? = null,
@Deprecated("") val inet4RouteAddress: List<String>? = null,
@Deprecated("") val inet6RouteAddress: List<String>? = null,
@Deprecated("") val inet4RouteExcludeAddress: List<String>? = null,
@Deprecated("") val inet6RouteExcludeAddress: List<String>? = null
)
@Serializable
data class Sniffer(
val enable: Boolean? = null,
val forceDnsMapping: Boolean? = null,
val parsePureIp: Boolean? = null,
val overrideDestination: Boolean? = null,
val sniff: Sniff? = null,
val forceDomain: List<String>? = null,
val skipDomain: List<String>? = null,
val skipSrcAddress: List<String>? = null,
val skipDstAddress: List<String>? = null,
val skipDomain: List<String>? = null,
val sniffing: List<String>? = null,
val portWhitelist: List<String>? = null
@Deprecated("") val sniffing: List<String>? = null,
@Deprecated("") val portWhitelist: List<String>? = null
)
@Serializable
@@ -204,173 +261,173 @@ data class FallbackFilter(
@Serializable
sealed class Proxy {
// @Serializable
// data class Socks5Proxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val username: String? = null,
// val password: String? = null,
// val tls: Boolean? = null,
// val fingerprint: String? = null,
// val skipCertVerify: Boolean? = null,
// val udp: Boolean? = null,
// val ipVersion: String? = null
// ) : Proxy()
//
// @Serializable
// data class HttpProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val username: String? = null,
// val password: String? = null,
// val tls: Boolean? = null,
// val skipCertVerify: Boolean? = null,
// val sni: String? = null,
// val fingerprint: String? = null,
// val ipVersion: String? = null
// ) : Proxy()
//
// @Serializable
// data class SnellProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val psk: String? = null,
// val version: Int? = null,
// val obfsOpts: ObfsOpts? = null
// ) : Proxy() {
// @Serializable
// data class ObfsOpts(
// val mode: String? = null,
// val host: String? = null
// )
// }
//
// @Serializable
// data class ShadowsocksProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val cipher: String? = null,
// val password: String? = null,
// val udp: Boolean? = null,
// val ipVersion: String? = null,
// val plugin: String? = null,
// val pluginOpts: PluginOpts? = null
// ) : Proxy() {
// @Serializable
// data class PluginOpts(
// val mode: String? = null,
// val host: String? = null,
// val tls: Boolean? = null,
// val skipCertVerify: Boolean? = null,
// val fingerprint: String? = null,
// val path: String? = null,
// val headers: Map<String, String>? = null,
// val clientFingerprint: String? = null,
// val version: Int? = null,
// val password: String? = null,
// val restlsScript: String? = null
// )
// }
//
// @Serializable
// data class VmessProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val uuid: String? = null,
// val alterId: Int? = null,
// val cipher: String? = null,
// val udp: Boolean? = null,
// val tls: Boolean? = null,
// val fingerprint: String? = null,
// val skipCertVerify: Boolean? = null,
// val servername: String? = null,
// val network: String? = null,
// val wsOpts: WsOpts? = null,
// val h2Opts: H2Opts? = null,
// val grpcOpts: GrpcOpts? = null
// ) : Proxy() {
// @Serializable
// data class WsOpts(
// val path: String? = null,
// val headers: Map<String, String>? = null
// )
//
// @Serializable
// data class H2Opts(
// val host: List<String>? = null,
// val path: String? = null
// )
//
// @Serializable
// data class GrpcOpts(
// val grpcServiceName: String? = null
// )
// }
//
// @Serializable
// data class VlessProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val uuid: String? = null,
// val network: String? = null,
// val tls: Boolean? = null,
// val udp: Boolean? = null,
// val flow: String? = null,
// val clientFingerprint: String? = null,
// val servername: String? = null,
// val realityOpts: RealityOpts? = null,
// val grpcOpts: GrpcOpts? = null,
// val wsOpts: WsOpts? = null
// ) : Proxy() {
// @Serializable
// data class RealityOpts(
// val publicKey: String? = null,
// val shortId: String? = null
// )
//
// @Serializable
// data class GrpcOpts(
// val grpcServiceName: String? = null
// )
//
// @Serializable
// data class WsOpts(
// val path: String? = null,
// val headers: Map<String, String>? = null
// )
// }
//
// @Serializable
// data class TrojanProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val password: String? = null,
// val clientFingerprint: String? = null,
// val udp: Boolean? = null,
// val sni: String? = null,
// val skipCertVerify: Boolean? = null,
// val flow: String? = null,
// val grpcOpts: GrpcOpts? = null,
// val wsOpts: WsOpts? = null
// ) : Proxy() {
// @Serializable
// data class GrpcOpts(
// val grpcServiceName: String? = null
// )
//
// @Serializable
// data class WsOpts(
// val path: String? = null,
// val headers: Map<String, String>? = null
// )
// }
@Serializable
data class Socks5Proxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val username: String? = null,
val password: String? = null,
val tls: Boolean? = null,
val fingerprint: String? = null,
val skipCertVerify: Boolean? = null,
val udp: Boolean? = null,
val ipVersion: String? = null
) : Proxy()
@Serializable
data class HttpProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val username: String? = null,
val password: String? = null,
val tls: Boolean? = null,
val skipCertVerify: Boolean? = null,
val sni: String? = null,
val fingerprint: String? = null,
val ipVersion: String? = null
) : Proxy()
@Serializable
data class SnellProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val psk: String? = null,
val version: Int? = null,
val obfsOpts: ObfsOpts? = null
) : Proxy() {
@Serializable
data class ObfsOpts(
val mode: String? = null,
val host: String? = null
)
}
@Serializable
data class ShadowsocksProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val cipher: String? = null,
val password: String? = null,
val udp: Boolean? = null,
val ipVersion: String? = null,
val plugin: String? = null,
val pluginOpts: PluginOpts? = null
) : Proxy() {
@Serializable
data class PluginOpts(
val mode: String? = null,
val host: String? = null,
val tls: Boolean? = null,
val skipCertVerify: Boolean? = null,
val fingerprint: String? = null,
val path: String? = null,
val headers: Map<String, String>? = null,
val clientFingerprint: String? = null,
val version: Int? = null,
val password: String? = null,
val restlsScript: String? = null
)
}
@Serializable
data class VmessProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val uuid: String? = null,
val alterId: Int? = null,
val cipher: String? = null,
val udp: Boolean? = null,
val tls: Boolean? = null,
val fingerprint: String? = null,
val skipCertVerify: Boolean? = null,
val servername: String? = null,
val network: String? = null,
val wsOpts: WsOpts? = null,
val h2Opts: H2Opts? = null,
val grpcOpts: GrpcOpts? = null
) : Proxy() {
@Serializable
data class WsOpts(
val path: String? = null,
val headers: Map<String, String>? = null
)
@Serializable
data class H2Opts(
val host: List<String>? = null,
val path: String? = null
)
@Serializable
data class GrpcOpts(
val grpcServiceName: String? = null
)
}
@Serializable
data class VlessProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val uuid: String? = null,
val network: String? = null,
val tls: Boolean? = null,
val udp: Boolean? = null,
val flow: String? = null,
val clientFingerprint: String? = null,
val servername: String? = null,
val realityOpts: RealityOpts? = null,
val grpcOpts: GrpcOpts? = null,
val wsOpts: WsOpts? = null
) : Proxy() {
@Serializable
data class RealityOpts(
val publicKey: String? = null,
val shortId: String? = null
)
@Serializable
data class GrpcOpts(
val grpcServiceName: String? = null
)
@Serializable
data class WsOpts(
val path: String? = null,
val headers: Map<String, String>? = null
)
}
@Serializable
data class TrojanProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val password: String? = null,
val clientFingerprint: String? = null,
val udp: Boolean? = null,
val sni: String? = null,
val skipCertVerify: Boolean? = null,
val flow: String? = null,
val grpcOpts: GrpcOpts? = null,
val wsOpts: WsOpts? = null
) : Proxy() {
@Serializable
data class GrpcOpts(
val grpcServiceName: String? = null
)
@Serializable
data class WsOpts(
val path: String? = null,
val headers: Map<String, String>? = null
)
}
@Serializable
@SerialName("hysteria2")
@@ -388,80 +445,80 @@ sealed class Proxy {
val fingerprint: String? = null
) : Proxy()
// @Serializable
// data class WireguardProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val ip: String? = null,
// val ipv6: String? = null,
// val publicKey: String? = null,
// val privateKey: String? = null,
// val udp: Boolean? = null,
// val reserved: String? = null,
// val peers: List<Peer>? = null
// ) : Proxy() {
// @Serializable
// data class Peer(
// val server: String? = null,
// val port: Int? = null,
// val publicKey: String? = null,
// val allowedIps: List<String>? = null,
// val reserved: String? = null
// )
// }
//
// @Serializable
// data class TuicProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val token: String? = null,
// val uuid: String? = null,
// val password: String? = null,
// val udpRelayMode: String? = null,
// val congestionController: String? = null,
// val skipCertVerify: Boolean? = null,
// val sni: String? = null
// ) : Proxy()
//
// @Serializable
// data class ShadowsocksRProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val cipher: String? = null,
// val password: String? = null,
// val obfs: String? = null,
// val protocol: String? = null,
// val udp: Boolean? = null
// ) : Proxy()
//
// @Serializable
// data class SSHProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val username: String? = null,
// val password: String? = null,
// val privateKey: String? = null
// ) : Proxy()
//
// @Serializable
// data class MieruProxy(
// val name: String? = null,
// val server: String? = null,
// val port: Int? = null,
// val transport: String? = null,
// val username: String? = null,
// val password: String? = null,
// val multiplexing: String? = null
// ) : Proxy()
//
// @Serializable
// data class DNSProxy(
// val name: String? = null
// ) : Proxy()
@Serializable
data class WireguardProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val ip: String? = null,
val ipv6: String? = null,
val publicKey: String? = null,
val privateKey: String? = null,
val udp: Boolean? = null,
val reserved: String? = null,
val peers: List<Peer>? = null
) : Proxy() {
@Serializable
data class Peer(
val server: String? = null,
val port: Int? = null,
val publicKey: String? = null,
val allowedIps: List<String>? = null,
val reserved: String? = null
)
}
@Serializable
data class TuicProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val token: String? = null,
val uuid: String? = null,
val password: String? = null,
val udpRelayMode: String? = null,
val congestionController: String? = null,
val skipCertVerify: Boolean? = null,
val sni: String? = null
) : Proxy()
@Serializable
data class ShadowsocksRProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val cipher: String? = null,
val password: String? = null,
val obfs: String? = null,
val protocol: String? = null,
val udp: Boolean? = null
) : Proxy()
@Serializable
data class SSHProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val username: String? = null,
val password: String? = null,
val privateKey: String? = null
) : Proxy()
@Serializable
data class MieruProxy(
val name: String? = null,
val server: String? = null,
val port: Int? = null,
val transport: String? = null,
val username: String? = null,
val password: String? = null,
val multiplexing: String? = null
) : Proxy()
@Serializable
data class DNSProxy(
val name: String? = null
) : Proxy()
}
@Serializable
@@ -648,6 +705,20 @@ data class Payload(
@Serializable
sealed class Listener {
@Serializable
@SerialName("http")
data class HttpListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val users: List<User>? = null,
val certificate: String? = null,
val privateKey: String? = null
) : Listener()
@Serializable
@SerialName("socks")
data class SocksListener(
val name: String? = null,
val port: Int? = null,
@@ -655,20 +726,13 @@ sealed class Listener {
val rule: String? = null,
val proxy: String? = null,
val udp: Boolean? = null,
val users: List<User>? = null
) : Listener()
@Serializable
data class HttpListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val users: List<User>? = null
val users: List<User>? = null,
val certificate: String? = null,
val privateKey: String? = null
) : Listener()
@Serializable
@SerialName("mixed")
data class MixedListener(
val name: String? = null,
val port: Int? = null,
@@ -676,10 +740,13 @@ sealed class Listener {
val rule: String? = null,
val proxy: String? = null,
val udp: Boolean? = null,
val users: List<User>? = null
val users: List<User>? = null,
val certificate: String? = null,
val privateKey: String? = null
) : Listener()
@Serializable
@SerialName("redir")
data class RedirListener(
val name: String? = null,
val port: Int? = null,
@@ -689,84 +756,18 @@ sealed class Listener {
) : Listener()
@Serializable
@SerialName("tproxy")
data class TProxyListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val udp: Boolean? = null
) : Listener()
@Serializable
data class ShadowsocksListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val password: String? = null,
val cipher: String? = null
) : Listener()
@Serializable
data class VmessListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val users: List<VmessUser>? = null,
val wsPath: String? = null,
val certificate: String? = null,
val privateKey: String? = null,
val realityConfig: RealityConfig? = null
) : Listener()
@Serializable
data class TuicListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val token: List<String>? = null,
val users: Map<String, String>? = null,
val certificate: String? = null,
val privateKey: String? = null,
val congestionController: String? = null,
val maxIdleTime: Int? = null,
val authenticationTimeout: Int? = null,
val alpn: List<String>? = null,
val maxUdpRelayPacketSize: Int? = null
) : Listener()
@Serializable
data class TunnelListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val network: List<String>? = null,
val target: String? = null
) : Listener()
@Serializable
data class VlessListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val users: List<VlessUser>? = null,
val wsPath: String? = null,
val certificate: String? = null,
val privateKey: String? = null,
val realityConfig: RealityConfig? = null
val udp: Boolean? = null,
) : Listener()
@Serializable
@SerialName("tun")
data class TunListener(
val name: String? = null,
val stack: String? = null,
@@ -790,6 +791,101 @@ sealed class Listener {
val includePackage: List<String>? = null,
val excludePackage: List<String>? = null
) : Listener()
@Serializable
@SerialName("shadowsocks")
data class ShadowsocksListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val password: String? = null,
val cipher: String? = null,
val udp: Boolean? = null
) : Listener()
@Serializable
@SerialName("vmess")
data class VmessListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val users: List<VmessUser>? = null,
val privateKey: String? = null,
val certificate: String? = null,
// Follows are from mihomo config yaml
val wsPath: String? = null,
val realityConfig: RealityConfig? = null
) : Listener()
@Serializable
@SerialName("tuic")
data class TuicListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val token: List<String>? = null,
val users: Map<String, String>? = null,
val certificate: String? = null,
val privateKey: String? = null,
val congestionController: String? = null,
val maxIdleTime: Int? = null,
val authenticationTimeout: Int? = null,
val alpn: List<String>? = null,
val maxUdpRelayPacketSize: Int? = null
) : Listener()
@Serializable
@SerialName("hysteria2")
data class Hysteria2Listener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val users: Map<String, String>? = null,
val up: Int? = null,
val down: Int? = null,
val ignoreClientBandwidth: Boolean? = null,
val obfs: String? = null,
val obfsPassword: String? = null,
val masquerade: String? = null,
val alpn: List<String>? = null,
val certificate: String? = null,
val privateKey: String? = null,
) : Listener()
@Serializable
@SerialName("tunnel")
data class TunnelListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val network: List<String>? = null,
val target: String? = null
) : Listener()
@Serializable
@SerialName("vless")
data class VlessListener(
val name: String? = null,
val port: Int? = null,
val listen: String? = null,
val rule: String? = null,
val proxy: String? = null,
val users: List<VlessUser>? = null,
val wsPath: String? = null,
val certificate: String? = null,
val privateKey: String? = null,
val realityConfig: RealityConfig? = null
) : Listener()
}
@Serializable