add warp in warp & reserved & more more

This commit is contained in:
Hiddify
2024-05-31 13:08:55 +02:00
parent 0bbd581277
commit bc48ec07a8
19 changed files with 288 additions and 263 deletions

View File

@@ -10,7 +10,7 @@ go build -trimpath -tags with_gvisor,with_quic,with_wireguard,with_ech,with_utls
go get github.com/akavel/rsrc
go install github.com/akavel/rsrc
rsrc -ico .\assets\images\hiddify-cli.ico -o cli\bydll\cli.syso
rsrc -ico .\assets\hiddify-cli.ico -o cli\bydll\cli.syso
copy bin\libcore.dll .
set CGO_LDFLAGS="libcore.dll"

View File

@@ -14,19 +14,19 @@ import (
"github.com/spf13/cobra"
)
var defaultConfigs config.ConfigOptions
var commandBuildOutputPath string
var (
hiddifySettingPath string
configPath string
defaultConfigs config.ConfigOptions = *config.DefaultConfigOptions()
commandBuildOutputPath string
)
var commandBuild = &cobra.Command{
Use: "build",
Short: "Build configuration",
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
var optionsPath string
if len(args) > 1 {
optionsPath = args[1]
}
err := build(args[0], optionsPath)
err := build(configPath, hiddifySettingPath)
if err != nil {
log.Fatal(err)
}
@@ -36,9 +36,8 @@ var commandBuild = &cobra.Command{
var commandCheck = &cobra.Command{
Use: "check",
Short: "Check configuration",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
err := check(args[0])
err := check(configPath)
if err != nil {
log.Fatal(err)
}
@@ -139,11 +138,21 @@ func readConfigOptionsAt(path string) (*config.ConfigOptions, error) {
return nil, err
}
}
if options.Warp2.WireguardConfigStr != "" {
err := json.Unmarshal([]byte(options.Warp2.WireguardConfigStr), &options.Warp2.WireguardConfig)
if err != nil {
return nil, err
}
}
return &options, nil
}
func addHConfigFlags(commandRun *cobra.Command) {
commandRun.Flags().StringVarP(&configPath, "config", "c", "", "proxy config path or url")
commandRun.MarkFlagRequired("config")
commandRun.Flags().StringVarP(&hiddifySettingPath, "hiddify", "d", "", "Hiddify Setting JSON Path")
commandRun.Flags().BoolVar(&defaultConfigs.EnableFullConfig, "full-config", false, "allows including tags other than output")
commandRun.Flags().StringVar(&defaultConfigs.LogLevel, "log", "warn", "log level")
commandRun.Flags().BoolVar(&defaultConfigs.InboundOptions.EnableTun, "tun", false, "Enable Tun")
@@ -161,5 +170,6 @@ func addHConfigFlags(commandRun *cobra.Command) {
commandRun.Flags().StringVar(&defaultConfigs.RemoteDnsAddress, "dns-remote", "1.1.1.1", "RemoteDNS (1.1.1.1, https://1.1.1.1/dns-query)")
commandRun.Flags().StringVar(&defaultConfigs.DirectDnsAddress, "dns-direct", "1.1.1.1", "DirectDNS (1.1.1.1, https://1.1.1.1/dns-query)")
commandRun.Flags().StringVar(&defaultConfigs.ClashApiSecret, "web-secret", "", "Web Server Secret")
commandRun.Flags().Uint16Var(&defaultConfigs.ClashApiPort, "web-port", 6756, "Web Server Port")
}

View File

@@ -6,11 +6,6 @@ import (
"github.com/spf13/cobra"
)
var (
hiddifySettingPath string
configPath string
)
var commandRun = &cobra.Command{
Use: "run",
Short: "run",
@@ -19,11 +14,10 @@ var commandRun = &cobra.Command{
}
func init() {
commandRun.PersistentFlags().BoolP("help", "", false, "help for this command")
commandRun.Flags().StringVarP(&hiddifySettingPath, "hiddify", "h", "", "Hiddify Setting JSON Path")
commandRun.Flags().StringVarP(&configPath, "config", "c", "", "proxy config path or url")
// commandRun.PersistentFlags().BoolP("help", "", false, "help for this command")
// commandRun.Flags().StringVarP(&hiddifySettingPath, "hiddify", "d", "", "Hiddify Setting JSON Path")
addHConfigFlags(commandRun)
commandRun.MarkFlagRequired("config")
mainCommand.AddCommand(commandRun)
}

View File

@@ -4,7 +4,7 @@ import (
"bufio"
"encoding/json"
"fmt"
"net/netip"
"os"
"strings"
@@ -62,40 +62,6 @@ type SingboxConfig struct {
MTU int `json:"mtu"`
}
func wireGuardToSingbox(wgConfig WireGuardConfig, server string, port uint16) (*T.Outbound, error) {
// splt := strings.Split(wgConfig.Peer.Endpoint, ":")
// port, err := strconv.Atoi(splt[1])
// if err != nil {
// fmt.Printf("%v", err)
// return nil
// }
out := T.Outbound{
Type: "wireguard",
Tag: "WARP",
WireGuardOptions: T.WireGuardOutboundOptions{
ServerOptions: T.ServerOptions{
Server: server,
ServerPort: port,
},
PrivateKey: wgConfig.Interface.PrivateKey,
PeerPublicKey: wgConfig.Peer.PublicKey,
Reserved: []uint8{0, 0, 0},
MTU: 1280,
},
}
for _, addr := range wgConfig.Interface.Address {
prefix, err := netip.ParsePrefix(addr)
if err != nil {
return nil, err // Handle the error appropriately
}
out.WireGuardOptions.LocalAddress = append(out.WireGuardOptions.LocalAddress, prefix)
}
return &out, nil
}
func readWireGuardConfig(filePath string) (WireGuardConfig, error) {
file, err := os.Open(filePath)
if err != nil {

View File

@@ -219,8 +219,8 @@ func BuildConfig(opt ConfigOptions, input option.Options) (*option.Options, erro
Listen: option.NewListenAddress(netip.MustParseAddr(bind)),
ListenPort: opt.LocalDnsPort,
},
OverrideAddress: "1.1.1.1",
OverridePort: 53,
// OverrideAddress: "1.1.1.1",
// OverridePort: 53,
},
},
)
@@ -406,9 +406,24 @@ func BuildConfig(opt ConfigOptions, input option.Options) (*option.Options, erro
OutboundMainProxyTag = OutboundSelectTag
//inbound==warp over proxies
//outbound==proxies over warp
fmt.Printf("opt.Warp=%+v\n", opt.Warp)
if opt.Warp.EnableWarp {
for _, out := range input.Outbounds {
if out.Type == C.TypeCustom {
if warp, ok := out.CustomOptions["warp"].(map[string]interface{}); ok {
key, _ := warp["key"].(string)
if key == "p1" {
opt.Warp.EnableWarp = false
break
}
}
}
if out.Type == C.TypeWireGuard && (out.WireGuardOptions.PrivateKey == opt.Warp.WireguardConfig.PrivateKey || out.WireGuardOptions.PrivateKey == "p1") {
opt.Warp.EnableWarp = false
break
}
}
}
if opt.Warp.EnableWarp && (opt.Warp.Mode == "warp_over_proxy" || opt.Warp.Mode == "proxy_over_warp") {
out, err := GenerateWarpSingbox(opt.Warp.WireguardConfig, opt.Warp.CleanIP, opt.Warp.CleanPort, opt.Warp.FakePackets, opt.Warp.FakePacketSize, opt.Warp.FakePacketDelay)
if err != nil {
return nil, fmt.Errorf("failed to generate warp config: %v", err)
@@ -420,7 +435,7 @@ func BuildConfig(opt ConfigOptions, input option.Options) (*option.Options, erro
} else {
out.WireGuardOptions.Detour = OutboundDirectTag
}
patchWarp(out, &opt)
patchWarp(out, &opt, true)
outbounds = append(outbounds, *out)
// tags = append(tags, out.Tag)
}

View File

@@ -5,10 +5,8 @@ import (
"fmt"
"net"
"github.com/bepass-org/warp-plus/warp"
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/option"
T "github.com/sagernet/sing-box/option"
)
type outboundMap map[string]interface{}
@@ -124,7 +122,7 @@ func patchOutbound(base option.Outbound, configOpt ConfigOptions) (*option.Outbo
formatErr := func(err error) error {
return fmt.Errorf("error patching outbound[%s][%s]: %w", base.Tag, base.Type, err)
}
err := patchWarp(&base, &configOpt)
err := patchWarp(&base, &configOpt, true)
if err != nil {
return nil, "", formatErr(err)
}
@@ -167,60 +165,6 @@ func patchOutbound(base option.Outbound, configOpt ConfigOptions) (*option.Outbo
return &outbound, serverDomain, nil
}
func patchWarp(base *option.Outbound, configOpt *ConfigOptions) error {
if base.Type == C.TypeWireGuard {
host := base.WireGuardOptions.Server
if host == "default" || host == "random" || host == "auto" || isBlockedDomain(host) {
randomIpPort, _ := warp.RandomWarpEndpoint(true, false)
base.WireGuardOptions.Server = randomIpPort.Addr().String()
}
if base.WireGuardOptions.ServerPort == 0 {
port := warp.RandomWarpPort()
base.WireGuardOptions.ServerPort = port
}
// if base.WireGuardOptions.Detour == "" {
// base.WireGuardOptions.GSO = runtime.GOOS != "windows"
// }
}
if base.Type == C.TypeCustom {
if warp, ok := base.CustomOptions["warp"].(map[string]interface{}); ok {
key, _ := warp["key"].(string)
host, _ := warp["host"].(string)
port, _ := warp["port"].(float64)
detour, _ := warp["detour"].(string)
fakePackets, _ := warp["fake_packets"].(string)
fakePacketsSize, _ := warp["fake_packets_size"].(string)
fakePacketsDelay, _ := warp["fake_packets_delay"].(string)
var warpConfig *T.Outbound
var err error
if configOpt != nil && (key == "p1" || key == "p2") {
warpConfig = base
} else {
warpConfig, err = generateWarp(key, host, uint16(port), fakePackets, fakePacketsSize, fakePacketsDelay)
}
if err != nil {
fmt.Printf("Error generating warp config: %v", err)
return err
}
base.Type = C.TypeWireGuard
warpConfig.WireGuardOptions.Detour = detour
if detour != "" {
if warpConfig.WireGuardOptions.MTU > 1000 {
warpConfig.WireGuardOptions.MTU -= 50
}
warpConfig.WireGuardOptions.FakePackets = ""
}
base.WireGuardOptions = warpConfig.WireGuardOptions
}
}
return nil
}
// func (o outboundMap) transportType() string {
// if transport, ok := o["transport"].(map[string]interface{}); ok {
// if transportType, ok := transport["type"].(string); ok {

View File

@@ -95,7 +95,7 @@ func patchConfig(content []byte, name string, configOpt *ConfigOptions) ([]byte,
for _, base := range options.Outbounds {
out := base
b.Go(base.Tag, func() (*option.Outbound, error) {
err := patchWarp(&out, configOpt)
err := patchWarp(&out, configOpt, false)
if err != nil {
return nil, fmt.Errorf("[Warp] patch warp error: %w", err)
}

View File

@@ -7,10 +7,12 @@ import (
"os"
"github.com/bepass-org/warp-plus/warp"
C "github.com/sagernet/sing-box/constant"
// "github.com/bepass-org/wireguard-go/warp"
"log/slog"
"github.com/sagernet/sing-box/option"
T "github.com/sagernet/sing-box/option"
)
@@ -27,14 +29,10 @@ type SingboxConfig struct {
}
func wireGuardToSingbox(wgConfig WarpWireguardConfig, server string, port uint16) (*T.Outbound, error) {
// splt := strings.Split(wgConfig.Peer.Endpoint, ":")
// port, err := strconv.Atoi(splt[1])
// if err != nil {
// fmt.Printf("%v", err)
// return nil
// }
clientID, _ := base64.StdEncoding.DecodeString(wgConfig.ClientID)
if len(clientID) < 2 {
clientID = []byte{0, 0, 0}
}
out := T.Outbound{
Type: "wireguard",
Tag: "WARP",
@@ -47,11 +45,12 @@ func wireGuardToSingbox(wgConfig WarpWireguardConfig, server string, port uint16
PrivateKey: wgConfig.PrivateKey,
PeerPublicKey: wgConfig.PeerPublicKey,
Reserved: []uint8{clientID[0], clientID[1], clientID[2]},
MTU: 1330,
// Reserved: []uint8{0, 0, 0},
MTU: 1330,
},
}
ips := []string{wgConfig.LocalAddressIPv4 + "/24", wgConfig.LocalAddressIPv6 + "/128"}
for _, addr := range ips {
if addr == "" {
continue
@@ -83,7 +82,6 @@ func generateWarp(license string, host string, port uint16, fakePackets string,
if wgConfig == nil {
return nil, fmt.Errorf("invalid warp config")
}
fmt.Printf("%v", wgConfig)
return GenerateWarpSingbox(*wgConfig, host, port, fakePackets, fakePacketsSize, fakePacketsDelay)
}
@@ -144,3 +142,68 @@ func GenerateWarpInfo(license string, oldAccountId string, oldAccessToken string
return &identity, res, &warpcfg, err
}
func patchWarp(base *option.Outbound, configOpt *ConfigOptions, final bool) error {
if base.Type == C.TypeCustom {
if warp, ok := base.CustomOptions["warp"].(map[string]interface{}); ok {
key, _ := warp["key"].(string)
host, _ := warp["host"].(string)
port, _ := warp["port"].(uint16)
detour, _ := warp["detour"].(string)
fakePackets, _ := warp["fake_packets"].(string)
fakePacketsSize, _ := warp["fake_packets_size"].(string)
fakePacketsDelay, _ := warp["fake_packets_delay"].(string)
var warpConfig *T.Outbound
var err error
if configOpt == nil && (key == "p1" || key == "p2") {
warpConfig = base
return nil
} else if key == "p1" {
warpConfig, err = GenerateWarpSingbox(configOpt.Warp.WireguardConfig, host, port, fakePackets, fakePacketsSize, fakePacketsDelay)
} else if key == "p2" {
warpConfig, err = GenerateWarpSingbox(configOpt.Warp2.WireguardConfig, host, port, fakePackets, fakePacketsSize, fakePacketsDelay)
} else {
warpConfig, err = generateWarp(key, host, uint16(port), fakePackets, fakePacketsSize, fakePacketsDelay)
}
if err != nil {
fmt.Printf("Error generating warp config: %v", err)
return err
}
warpConfig.WireGuardOptions.Detour = detour
base.Type = C.TypeWireGuard
base.WireGuardOptions = warpConfig.WireGuardOptions
}
}
if final && base.Type == C.TypeWireGuard {
host := base.WireGuardOptions.Server
if host == "default" || host == "random" || host == "auto" || isBlockedDomain(host) {
randomIpPort, _ := warp.RandomWarpEndpoint(true, false)
base.WireGuardOptions.Server = randomIpPort.Addr().String()
}
if base.WireGuardOptions.ServerPort == 0 {
port := warp.RandomWarpPort()
base.WireGuardOptions.ServerPort = port
}
if base.WireGuardOptions.Detour != "" {
if base.WireGuardOptions.MTU > 1000 {
base.WireGuardOptions.MTU -= 50
}
base.WireGuardOptions.FakePackets = ""
base.WireGuardOptions.FakePacketsDelay = ""
base.WireGuardOptions.FakePacketsSize = ""
}
// if base.WireGuardOptions.Detour == "" {
// base.WireGuardOptions.GSO = runtime.GOOS != "windows"
// }
}
return nil
}

View File

@@ -2,7 +2,6 @@ package config
import (
"encoding/json"
)
type WarpAccount struct {
@@ -15,7 +14,7 @@ type WarpWireguardConfig struct {
LocalAddressIPv4 string `json:"local-address-ipv4"`
LocalAddressIPv6 string `json:"local-address-ipv6"`
PeerPublicKey string `json:"peer-public-key"`
ClientID string `json:"ClientID"`
ClientID string `json:"client-id"`
}
type WarpGenerationResponse struct {
@@ -39,6 +38,7 @@ func GenerateWarpAccount(licenseKey string, accountId string, accessToken string
LocalAddressIPv4: wg.LocalAddressIPv4,
LocalAddressIPv6: wg.LocalAddressIPv6,
PeerPublicKey: wg.PeerPublicKey,
ClientID: wg.ClientID,
}
response := WarpGenerationResponse{warpAccount, log, warpConfig}

View File

@@ -151,6 +151,7 @@ func generateWarpConfig(licenseKey *C.char, accountId *C.char, accessToken *C.ch
LocalAddressIPv4: res.Config.LocalAddressIpv4,
LocalAddressIPv6: res.Config.LocalAddressIpv6,
PeerPublicKey: res.Config.PeerPublicKey,
ClientID: res.Config.ClientId,
}
log := res.Log
response := &config.WarpGenerationResponse{

3
go.mod
View File

@@ -26,6 +26,7 @@ require (
require (
berty.tech/go-libtor v1.0.385 // indirect
github.com/ajg/form v1.5.1 // indirect
github.com/akavel/rsrc v0.10.2 // indirect
github.com/andybalholm/brotli v1.0.6 // indirect
github.com/caddyserver/certmagic v0.20.0 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
@@ -109,7 +110,7 @@ require (
lukechampine.com/blake3 v1.2.1 // indirect
)
replace github.com/sagernet/sing-box => github.com/hiddify/hiddify-sing-box v1.8.9-0.20240529100042-aa8d1d4a3fb1
replace github.com/sagernet/sing-box => github.com/hiddify/hiddify-sing-box v1.8.9-0.20240531082845-3d21ef6b62d1
replace github.com/sagernet/wireguard-go => github.com/hiddify/wireguard-go v0.0.0-20240302132803-629b7c39b487

6
go.sum
View File

@@ -2,6 +2,8 @@ berty.tech/go-libtor v1.0.385 h1:RWK94C3hZj6Z2GdvePpHJLnWYobFr3bY/OdUJ5aoEXw=
berty.tech/go-libtor v1.0.385/go.mod h1:9swOOQVb+kmvuAlsgWUK/4c52pm69AdbJsxLzk+fJEw=
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw=
github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/caddyserver/certmagic v0.20.0 h1:bTw7LcEZAh9ucYCRXyCpIrSAGplplI0vGYJ4BpCQ/Fc=
@@ -49,8 +51,8 @@ github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a h1:fEBsGL/sjAuJrgah5X
github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
github.com/hiddify/hiddify-sing-box v1.8.9-0.20240529100042-aa8d1d4a3fb1 h1:Z03mhdoyz66BNICoIOpdKiJ3r87/l34lOx2amcsvmYk=
github.com/hiddify/hiddify-sing-box v1.8.9-0.20240529100042-aa8d1d4a3fb1/go.mod h1:udjEmPgtJynwSqJ1aQFLqP1dRzS5oegGecxX6GGsElk=
github.com/hiddify/hiddify-sing-box v1.8.9-0.20240531082845-3d21ef6b62d1 h1:G4L1CN7UbqAjG2fhQccd6/fEppOJNn/l55zhAxOwxik=
github.com/hiddify/hiddify-sing-box v1.8.9-0.20240531082845-3d21ef6b62d1/go.mod h1:udjEmPgtJynwSqJ1aQFLqP1dRzS5oegGecxX6GGsElk=
github.com/hiddify/ray2sing v0.0.0-20240319101544-08daaf978197 h1:DeSFnFifp/bd83rvX4RYUwOOlCZkUGk+REuMTXBaBHk=
github.com/hiddify/ray2sing v0.0.0-20240319101544-08daaf978197/go.mod h1:UYYahiWAtp1PfWAnhZQv+GyYSLms5/foB63q3ACYryE=
github.com/hiddify/warp-plus v0.0.0-20240529120935-6c534fdb70b1 h1:QUaQZYHtWfrfoJxdT3MpQkNGbRM11pb4QsGTzJycVQ4=

View File

@@ -864,6 +864,7 @@ type WarpWireguardConfig struct {
LocalAddressIpv4 string `protobuf:"bytes,2,opt,name=local_address_ipv4,json=localAddressIpv4,proto3" json:"local_address_ipv4,omitempty"`
LocalAddressIpv6 string `protobuf:"bytes,3,opt,name=local_address_ipv6,json=localAddressIpv6,proto3" json:"local_address_ipv6,omitempty"`
PeerPublicKey string `protobuf:"bytes,4,opt,name=peer_public_key,json=peerPublicKey,proto3" json:"peer_public_key,omitempty"`
ClientId string `protobuf:"bytes,5,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -922,6 +923,13 @@ func (m *WarpWireguardConfig) GetPeerPublicKey() string {
return ""
}
func (m *WarpWireguardConfig) GetClientId() string {
if m != nil {
return m.ClientId
}
return ""
}
type WarpGenerationResponse struct {
Account *WarpAccount `protobuf:"bytes,1,opt,name=account,proto3" json:"account,omitempty"`
Log string `protobuf:"bytes,2,opt,name=log,proto3" json:"log,omitempty"`
@@ -1690,131 +1698,132 @@ func init() {
func init() { proto.RegisterFile("hiddifyrpc/hiddify.proto", fileDescriptor_b52c484803f63ee3) }
var fileDescriptor_b52c484803f63ee3 = []byte{
// 2014 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xdd, 0x6e, 0xe3, 0xc6,
0x15, 0x5e, 0xea, 0xc7, 0x92, 0x8e, 0x24, 0x2f, 0x3d, 0xf6, 0x7a, 0x65, 0x65, 0x37, 0xbb, 0x21,
0x9a, 0xc4, 0x75, 0x53, 0x6f, 0xea, 0x6c, 0xb3, 0xfd, 0x0b, 0x16, 0xb2, 0x44, 0x3b, 0xaa, 0x65,
0x49, 0xa0, 0xe8, 0x6e, 0xd3, 0x02, 0x25, 0x68, 0x72, 0xac, 0x65, 0x4d, 0x71, 0x58, 0x72, 0xe4,
0x8d, 0xd0, 0xa2, 0x17, 0x2d, 0xd0, 0xeb, 0x02, 0x05, 0x7a, 0xd9, 0x07, 0x29, 0x0a, 0xf4, 0x09,
0xfa, 0x12, 0x7d, 0x8d, 0xde, 0x14, 0xf3, 0x43, 0x89, 0x94, 0xa5, 0x75, 0x9a, 0xe6, 0x6e, 0xe6,
0xfc, 0xf1, 0xcc, 0x37, 0x67, 0xce, 0x7c, 0x43, 0x68, 0xbc, 0xf6, 0x5c, 0xd7, 0xbb, 0x9a, 0x45,
0xa1, 0xf3, 0x4c, 0x0e, 0x0f, 0xc3, 0x88, 0x50, 0x82, 0x60, 0xa1, 0xd1, 0xfe, 0xa6, 0x80, 0xda,
0x26, 0x11, 0xee, 0x06, 0x57, 0xc4, 0xc0, 0x71, 0x48, 0x82, 0x18, 0xa3, 0xe7, 0x00, 0x0e, 0x89,
0xb0, 0x15, 0x53, 0x9b, 0xe2, 0x86, 0xf2, 0x54, 0xd9, 0xdf, 0x3c, 0x7a, 0x70, 0xb8, 0xf0, 0x3a,
0x64, 0x1e, 0x23, 0xa6, 0x34, 0x2a, 0x4e, 0x32, 0x44, 0x3f, 0x82, 0xda, 0x04, 0xc7, 0xb1, 0x3d,
0xc6, 0x16, 0x9d, 0x85, 0xb8, 0x91, 0xe3, 0x7e, 0x0f, 0xd3, 0x7e, 0xe7, 0x42, 0x6f, 0xce, 0x42,
0x6c, 0x54, 0x27, 0x8b, 0x09, 0x6a, 0x40, 0x49, 0x4e, 0x1b, 0xf9, 0xa7, 0xca, 0x7e, 0xc5, 0x48,
0xa6, 0xda, 0x9f, 0x73, 0x50, 0x1b, 0x51, 0x3b, 0xa2, 0x06, 0xfe, 0xcd, 0x14, 0xc7, 0x14, 0x3d,
0x81, 0xaa, 0x43, 0x82, 0x2b, 0x6f, 0x6c, 0x85, 0x36, 0x7d, 0xcd, 0xb3, 0xab, 0x18, 0x20, 0x44,
0x43, 0x9b, 0xbe, 0x46, 0xef, 0xc3, 0xa6, 0x34, 0x70, 0x48, 0x40, 0x71, 0x40, 0x79, 0x26, 0x15,
0xa3, 0x2e, 0xa4, 0x6d, 0x21, 0x44, 0x1f, 0xc3, 0x8e, 0xeb, 0xc5, 0xf6, 0xa5, 0x8f, 0xad, 0x09,
0x9e, 0x90, 0x68, 0x66, 0xf9, 0xde, 0xc4, 0xa3, 0xfc, 0xfb, 0x65, 0x03, 0x49, 0xdd, 0x39, 0x57,
0xf5, 0x98, 0x86, 0x7d, 0xd9, 0xc5, 0xbe, 0x3d, 0x63, 0xb8, 0x44, 0xb4, 0x51, 0xe0, 0x86, 0xc0,
0x45, 0x3c, 0x43, 0xf4, 0x43, 0xd8, 0xc3, 0x01, 0x8f, 0x48, 0x7c, 0xd7, 0x72, 0xc8, 0x64, 0x62,
0x07, 0xae, 0x15, 0xe3, 0xe8, 0x06, 0x47, 0x8d, 0x22, 0x37, 0xdf, 0x15, 0x06, 0x03, 0xdf, 0x6d,
0x0b, 0xf5, 0x88, 0x6b, 0xd1, 0x01, 0x6c, 0x49, 0xd7, 0xc8, 0x7e, 0x63, 0x89, 0x4c, 0x1b, 0x1b,
0xdc, 0xe5, 0xbe, 0x50, 0x18, 0xf6, 0x9b, 0x36, 0x17, 0x6b, 0xd7, 0x50, 0x1b, 0x61, 0x3a, 0x0d,
0x13, 0x44, 0xde, 0x81, 0xca, 0xa5, 0x1d, 0xe3, 0x34, 0x1e, 0x65, 0x26, 0xe0, 0x68, 0xbc, 0x07,
0xb5, 0x37, 0x24, 0xba, 0xf6, 0x02, 0x89, 0x97, 0xc0, 0xa2, 0x2a, 0x65, 0xdc, 0xe4, 0x1d, 0xa8,
0x50, 0x3c, 0x09, 0x85, 0x5e, 0xc0, 0x5f, 0x66, 0x02, 0xa6, 0xd4, 0x1c, 0x28, 0xcf, 0xeb, 0xe2,
0x33, 0xa8, 0x47, 0x72, 0x6c, 0x39, 0xc4, 0x4d, 0x4a, 0xa3, 0x91, 0xde, 0xe2, 0xc4, 0xb8, 0x4d,
0x5c, 0x6c, 0xd4, 0xa2, 0xd4, 0x2c, 0xbd, 0xc9, 0xb9, 0xec, 0x26, 0x6b, 0x50, 0xfb, 0x1c, 0xfb,
0x3e, 0x49, 0x56, 0x84, 0xa0, 0x10, 0xd8, 0x13, 0x2c, 0x17, 0xc3, 0xc7, 0xda, 0xb7, 0xa1, 0x2e,
0x6d, 0x64, 0x36, 0xa9, 0x70, 0x4a, 0x36, 0x5c, 0x09, 0x8a, 0xfa, 0x24, 0xa4, 0x33, 0xed, 0x9f,
0x39, 0x80, 0xd1, 0x2c, 0xa6, 0x78, 0xc2, 0xea, 0x1b, 0xed, 0xc2, 0x86, 0xd8, 0x6a, 0xee, 0x90,
0x37, 0xe4, 0x0c, 0xbd, 0x0b, 0x30, 0x26, 0x11, 0x99, 0x52, 0x2f, 0xc0, 0x31, 0xcf, 0xad, 0x68,
0xa4, 0x24, 0xb2, 0xa2, 0x02, 0xec, 0x50, 0x8f, 0x04, 0xb1, 0xe5, 0x05, 0x1c, 0xa5, 0x22, 0xaf,
0xa8, 0x44, 0xda, 0x0d, 0xd0, 0x87, 0x70, 0x3f, 0x6d, 0x46, 0xa6, 0xa2, 0x46, 0x8a, 0x46, 0xda,
0x7b, 0x30, 0xa5, 0xe8, 0x3b, 0xb0, 0x45, 0x23, 0xfb, 0xea, 0xca, 0x73, 0x2c, 0xfb, 0xc6, 0xf6,
0x7c, 0xb6, 0xbd, 0xb2, 0x3e, 0x54, 0xa9, 0x68, 0x25, 0x72, 0x96, 0xf4, 0x34, 0xf4, 0xbd, 0xe0,
0x9a, 0x97, 0x43, 0xde, 0x90, 0x33, 0xd4, 0x84, 0xb2, 0x4b, 0xde, 0x04, 0x5c, 0x53, 0xe2, 0x9a,
0xf9, 0x9c, 0x6d, 0xba, 0xb0, 0xb2, 0x28, 0xa1, 0xb6, 0xdf, 0x28, 0x73, 0x7d, 0x55, 0xc8, 0x4c,
0x26, 0x62, 0x6b, 0x4a, 0xcc, 0xa5, 0x51, 0x85, 0x1b, 0xd5, 0x13, 0x29, 0x37, 0xd3, 0xfe, 0xa8,
0xc0, 0xd6, 0x60, 0x4a, 0x2f, 0xc9, 0x34, 0x70, 0x4f, 0x23, 0x32, 0x0d, 0xbb, 0x14, 0x4f, 0x90,
0x0a, 0x79, 0x6a, 0x8f, 0x25, 0xec, 0x6c, 0xc8, 0x76, 0x6c, 0x7e, 0xe8, 0x2b, 0x06, 0x1f, 0x23,
0x0d, 0xea, 0xd3, 0xc8, 0xb7, 0x28, 0x8e, 0xa9, 0x45, 0xbd, 0x89, 0x38, 0xda, 0x2c, 0x8d, 0xc8,
0x37, 0x71, 0x4c, 0x4d, 0x6f, 0x82, 0xd1, 0xb7, 0x60, 0x73, 0x6e, 0xc3, 0x4f, 0x92, 0x84, 0xac,
0x26, 0x8d, 0x3a, 0x4c, 0xa6, 0xfd, 0x49, 0x81, 0x7a, 0x26, 0x8b, 0xaf, 0x98, 0x41, 0x13, 0xca,
0x31, 0xf6, 0xb1, 0x43, 0xb1, 0x9b, 0x14, 0x76, 0x32, 0x47, 0x9f, 0x40, 0xd1, 0xa3, 0x78, 0x12,
0x37, 0x0a, 0x4f, 0xf3, 0xfb, 0xd5, 0xa3, 0xc7, 0xe9, 0x22, 0xbe, 0xb5, 0x62, 0x43, 0xd8, 0x6a,
0x9d, 0x25, 0x34, 0x7a, 0x5e, 0x4c, 0xd1, 0xb3, 0x24, 0x92, 0xc2, 0x23, 0xed, 0xad, 0x8d, 0x94,
0x44, 0x19, 0x40, 0xf5, 0x95, 0x1d, 0x85, 0x2d, 0xc7, 0x21, 0xd3, 0x80, 0xa2, 0xc7, 0x00, 0xb6,
0x18, 0x5a, 0x9e, 0x2b, 0x97, 0x54, 0x91, 0x92, 0xae, 0xcb, 0x36, 0xd3, 0x76, 0x1c, 0x1c, 0xc7,
0x16, 0x25, 0xd7, 0x38, 0x48, 0x4e, 0xb0, 0x90, 0x99, 0x4c, 0xa4, 0xfd, 0x5d, 0x81, 0x6d, 0x16,
0xf1, 0x95, 0x17, 0xe1, 0xf1, 0xd4, 0x8e, 0x5c, 0xd1, 0x29, 0x58, 0xc7, 0x0a, 0x23, 0xef, 0xc6,
0xa6, 0xd8, 0xba, 0xc6, 0xb3, 0xa4, 0x57, 0x4a, 0xd1, 0x19, 0x9e, 0xa1, 0x8f, 0x00, 0xf9, 0xc4,
0xb1, 0x7d, 0xcb, 0x76, 0xdd, 0x88, 0x7d, 0xc2, 0x0b, 0x6f, 0x9e, 0xcb, 0x2f, 0xa8, 0x5c, 0xd3,
0x12, 0x8a, 0x6e, 0x78, 0xf3, 0x7c, 0xa5, 0xf5, 0xa7, 0x12, 0xd8, 0x65, 0xeb, 0x4f, 0xd1, 0x07,
0x70, 0x3f, 0xc4, 0x38, 0xb2, 0xc2, 0xe9, 0xa5, 0xef, 0x39, 0x3c, 0x81, 0x82, 0x68, 0xc4, 0x4c,
0x3c, 0xe4, 0xd2, 0x33, 0x3c, 0xd3, 0xfe, 0xaa, 0xc0, 0x2e, 0x4b, 0xfe, 0x14, 0x07, 0x38, 0xb2,
0xd9, 0x21, 0x99, 0x1f, 0xf1, 0xef, 0x41, 0x49, 0xe2, 0xc0, 0x73, 0xaf, 0x66, 0x6f, 0x93, 0x14,
0x86, 0x46, 0x62, 0xc7, 0x0a, 0xc3, 0x27, 0x63, 0xb9, 0x04, 0x36, 0x44, 0x2f, 0x60, 0x43, 0xf6,
0xd3, 0x3c, 0x8f, 0xf1, 0x64, 0x39, 0xc6, 0x12, 0x6a, 0x86, 0x34, 0xd7, 0xce, 0x60, 0x4b, 0x34,
0x8f, 0x61, 0x44, 0xbe, 0x64, 0x2d, 0x9e, 0x4e, 0x63, 0xf4, 0x08, 0x2a, 0x8b, 0x33, 0xab, 0xf0,
0x33, 0xbb, 0x10, 0xb0, 0x9e, 0x24, 0xba, 0xb5, 0xcb, 0x33, 0x28, 0x1b, 0xc9, 0x54, 0xfb, 0x1d,
0xd4, 0x86, 0x76, 0x14, 0xe3, 0xa4, 0xc5, 0x35, 0xa0, 0x94, 0x5c, 0x4f, 0xb2, 0x7b, 0xc9, 0xe9,
0xf2, 0x05, 0x97, 0xbb, 0x75, 0xc1, 0xbd, 0xad, 0x5f, 0xa3, 0x1d, 0x28, 0xba, 0xf8, 0x72, 0x3a,
0x96, 0xd7, 0x93, 0x98, 0x68, 0x7f, 0x50, 0xa0, 0x2e, 0x3f, 0xff, 0x8d, 0xf5, 0xf2, 0xec, 0xed,
0x3a, 0x4f, 0x7f, 0xfd, 0x55, 0xde, 0x83, 0x66, 0xfb, 0xb5, 0x1d, 0x8c, 0xb1, 0xc0, 0x79, 0x10,
0xf2, 0x86, 0x98, 0x00, 0x72, 0x08, 0xdb, 0x72, 0xd9, 0x44, 0x28, 0xac, 0x5f, 0xc7, 0x24, 0x90,
0xe0, 0x6c, 0x39, 0x69, 0x97, 0x9f, 0xc6, 0x24, 0xd0, 0x7e, 0x05, 0x0f, 0x64, 0xc5, 0xc8, 0x78,
0xa9, 0xcb, 0x23, 0x75, 0x13, 0xf2, 0x71, 0x16, 0xb2, 0xdc, 0x3a, 0xc8, 0xf2, 0x69, 0xc8, 0x5e,
0xc2, 0xee, 0x72, 0x7c, 0x09, 0xdd, 0x6d, 0x82, 0xa1, 0xac, 0x20, 0x18, 0xda, 0x2b, 0x78, 0x30,
0xe2, 0xcd, 0x26, 0xe9, 0x01, 0xa9, 0xfb, 0x7a, 0xcc, 0xda, 0x81, 0xb5, 0xe8, 0x60, 0x65, 0x2e,
0x30, 0xed, 0x31, 0x3b, 0xed, 0x44, 0xda, 0x73, 0xbd, 0x3c, 0xed, 0x89, 0xcc, 0xb4, 0xc7, 0xda,
0x77, 0x61, 0xf3, 0x42, 0x74, 0xc7, 0xaf, 0x12, 0x51, 0xfb, 0x3d, 0xec, 0x25, 0x0b, 0x61, 0xd5,
0x9e, 0x05, 0xeb, 0x09, 0x54, 0x7d, 0xcf, 0xc1, 0xac, 0x0a, 0x52, 0x1d, 0x42, 0x8a, 0x58, 0x87,
0xc8, 0x36, 0xa7, 0xdc, 0x5d, 0xcd, 0x29, 0x7f, 0xbb, 0x39, 0x7d, 0x06, 0x8f, 0x46, 0x98, 0xa6,
0x4e, 0x92, 0x2e, 0x8e, 0x44, 0x92, 0xc2, 0x63, 0x00, 0x2f, 0xb6, 0x92, 0x63, 0x23, 0x8f, 0x94,
0x17, 0x4b, 0x2b, 0xed, 0xb7, 0x00, 0x3d, 0x32, 0x96, 0xcc, 0x11, 0x1d, 0x40, 0xd1, 0xc7, 0x37,
0xd8, 0x97, 0xe5, 0xba, 0x93, 0x2e, 0xd7, 0x1e, 0x19, 0xf7, 0x98, 0xce, 0x10, 0x26, 0xe8, 0xc3,
0xd4, 0x8d, 0xb0, 0x79, 0xb4, 0xbd, 0x64, 0xca, 0x49, 0xa8, 0xb8, 0x26, 0xd6, 0x97, 0x6c, 0x1d,
0xaa, 0x23, 0x4a, 0x12, 0xa6, 0xa5, 0xfd, 0x43, 0x01, 0x64, 0x4e, 0x83, 0x00, 0xfb, 0x19, 0x4a,
0x8a, 0xa0, 0xc0, 0x3b, 0xa1, 0xc8, 0x9d, 0x8f, 0x19, 0xb0, 0x82, 0xf8, 0x59, 0x21, 0x89, 0x68,
0x42, 0x2a, 0x84, 0x68, 0x48, 0x22, 0xca, 0x90, 0x8b, 0x69, 0xe4, 0x39, 0xd4, 0x62, 0x3c, 0x03,
0xcb, 0xe2, 0xab, 0x0a, 0x99, 0xc1, 0x44, 0xe8, 0x07, 0xd0, 0xc0, 0x81, 0x1b, 0x12, 0x8f, 0x81,
0x1f, 0xb8, 0x38, 0xc4, 0x81, 0x8b, 0x03, 0x6a, 0x05, 0x76, 0xc2, 0x3e, 0x77, 0x13, 0x7d, 0x77,
0xa1, 0xee, 0xdb, 0x94, 0x95, 0x74, 0x4c, 0x6d, 0xe7, 0x9a, 0xb3, 0x8a, 0x8a, 0x21, 0x26, 0xda,
0x01, 0x6c, 0x8a, 0xec, 0xef, 0xe6, 0x50, 0x07, 0x1a, 0xd4, 0xd2, 0xc7, 0x1f, 0x6d, 0x40, 0x6e,
0x70, 0xa6, 0xde, 0x43, 0x00, 0x1b, 0x27, 0xad, 0x6e, 0x4f, 0xef, 0xa8, 0xca, 0x41, 0x0b, 0x2a,
0xf3, 0x97, 0x00, 0xaa, 0x42, 0x69, 0x64, 0x0e, 0x86, 0x43, 0xbd, 0xa3, 0xde, 0x43, 0x35, 0x28,
0x8f, 0xcc, 0x96, 0x61, 0x76, 0xfb, 0xa7, 0xaa, 0x22, 0x54, 0x2d, 0xc3, 0xd4, 0x3b, 0x6a, 0x4e,
0xa8, 0x06, 0xc3, 0x21, 0x53, 0xe5, 0x0f, 0xfe, 0x95, 0x83, 0x6a, 0xea, 0x55, 0x80, 0x2a, 0x50,
0xd4, 0xcf, 0x87, 0xe6, 0x17, 0xea, 0x3d, 0xf4, 0x10, 0xb6, 0xf9, 0xd0, 0x6a, 0x0f, 0xfa, 0x27,
0xdd, 0xd3, 0x0b, 0xa3, 0x65, 0x76, 0x07, 0x7d, 0x55, 0x41, 0x0d, 0xd8, 0xe1, 0xe1, 0xac, 0xf6,
0xe0, 0xfc, 0xbc, 0xd5, 0xef, 0x58, 0x23, 0xdd, 0xf8, 0x99, 0x6e, 0xa8, 0x39, 0x84, 0x60, 0xb3,
0x6d, 0xe8, 0x2d, 0x53, 0xe7, 0xa2, 0x6e, 0x5b, 0x57, 0xf3, 0x68, 0x0b, 0xea, 0xc2, 0x3a, 0x11,
0x15, 0xd0, 0x0e, 0xa8, 0x17, 0x7d, 0xfd, 0xe7, 0x43, 0xbd, 0x6d, 0xea, 0x1d, 0x4b, 0x37, 0x8c,
0x81, 0xa1, 0x16, 0xd1, 0x36, 0xdc, 0x6f, 0xf5, 0x0c, 0xbd, 0xd5, 0xf9, 0xc2, 0x4a, 0xb2, 0xdd,
0xc8, 0x0a, 0xc5, 0xea, 0x4a, 0x68, 0x17, 0x50, 0xb7, 0x3f, 0x32, 0x5b, 0xfd, 0xb6, 0x6e, 0xf5,
0x07, 0xa6, 0x75, 0x32, 0xb8, 0xe8, 0x77, 0xd4, 0x32, 0x4b, 0x2c, 0x23, 0x4f, 0x3c, 0x2a, 0x2b,
0x34, 0xe2, 0x03, 0x80, 0xf6, 0xe0, 0x01, 0x4f, 0xc0, 0x3a, 0xbe, 0xe8, 0xf6, 0x3a, 0xdd, 0xfe,
0xa9, 0x5c, 0xae, 0x5a, 0x65, 0x4e, 0x42, 0x35, 0x6c, 0x19, 0xa3, 0x94, 0xa6, 0xb6, 0xd0, 0xb0,
0xcc, 0x52, 0x9a, 0xfa, 0xc1, 0x31, 0x94, 0x93, 0x63, 0xc0, 0xb0, 0xec, 0xe8, 0xc7, 0x17, 0xa7,
0xea, 0x3d, 0x54, 0x86, 0x42, 0xb7, 0x7f, 0x32, 0x10, 0x7b, 0xf1, 0xaa, 0x65, 0xf4, 0x19, 0xfa,
0x39, 0x8e, 0x36, 0x5f, 0x7d, 0x9e, 0x0d, 0x4f, 0x5a, 0x66, 0xab, 0xa7, 0x16, 0x0e, 0x3e, 0x82,
0x92, 0x3c, 0x1f, 0xcc, 0xaf, 0x3d, 0x30, 0x74, 0xf5, 0x1e, 0xdf, 0x43, 0x09, 0xa0, 0xc2, 0x8a,
0x40, 0x7e, 0x31, 0x77, 0xf4, 0x17, 0x05, 0x8a, 0x9c, 0x98, 0xa3, 0x97, 0x50, 0x1e, 0xd9, 0x33,
0x31, 0xce, 0xdc, 0x23, 0x69, 0x6e, 0xdf, 0xdc, 0x5b, 0xa1, 0x91, 0xd5, 0xd8, 0x85, 0xcd, 0x24,
0xc0, 0x88, 0x46, 0xd8, 0x9e, 0x7c, 0xad, 0x30, 0xfb, 0xca, 0xc7, 0xca, 0xd1, 0xbf, 0x2b, 0x50,
0x60, 0xb5, 0x89, 0x5e, 0x42, 0x51, 0x3c, 0xce, 0x32, 0xa1, 0xd2, 0xc7, 0xb7, 0xf9, 0x68, 0xf9,
0x69, 0x9b, 0x79, 0x0c, 0x9f, 0x2f, 0x1e, 0xc8, 0x8c, 0xed, 0xb1, 0x4e, 0x8a, 0x1e, 0x66, 0x63,
0xcd, 0x1b, 0xc4, 0xdb, 0x43, 0xb1, 0xc4, 0xd0, 0xd9, 0x82, 0xc9, 0xc6, 0xfc, 0x51, 0xb2, 0x36,
0xd6, 0x7a, 0x46, 0xca, 0xf2, 0xe0, 0xc1, 0x06, 0xb0, 0x75, 0x6e, 0x7b, 0xc1, 0x37, 0x17, 0xb0,
0x03, 0xf5, 0xd3, 0xa4, 0x57, 0xbf, 0x3d, 0xd8, 0x6e, 0x46, 0x31, 0x77, 0xe0, 0x51, 0x5e, 0x40,
0x91, 0x3f, 0x50, 0x97, 0x30, 0x4f, 0xbd, 0x59, 0x9b, 0x3b, 0xab, 0x78, 0x06, 0xfa, 0x09, 0x14,
0x39, 0x4b, 0xc9, 0x3a, 0xa6, 0x79, 0x53, 0x76, 0xdf, 0xb3, 0x94, 0xe6, 0x97, 0xb0, 0xbd, 0x82,
0x5f, 0xa0, 0x0f, 0x32, 0x7b, 0xb2, 0x96, 0x80, 0xdc, 0x51, 0x06, 0x27, 0xf2, 0x37, 0x04, 0x7b,
0xaf, 0x7b, 0x0e, 0xfe, 0xda, 0xe5, 0xf4, 0x02, 0x0a, 0x0c, 0x46, 0xb4, 0x95, 0xb6, 0xe2, 0xaf,
0xd5, 0x3b, 0x1c, 0x5b, 0x50, 0x32, 0x70, 0xfc, 0x7f, 0x95, 0x32, 0x3b, 0x5f, 0x19, 0x46, 0x82,
0xde, 0xcb, 0x6e, 0xd0, 0x0a, 0xb6, 0xb2, 0x66, 0xa7, 0x7e, 0x0c, 0x25, 0xc9, 0x41, 0x50, 0x33,
0x6d, 0x90, 0x25, 0x26, 0x6b, 0x9c, 0x2d, 0x40, 0xb7, 0x19, 0x09, 0x7a, 0x3f, 0x6d, 0xbb, 0x96,
0xb1, 0x34, 0xb5, 0x65, 0xfa, 0xbe, 0xe2, 0xdd, 0xf0, 0x39, 0xec, 0x9c, 0x66, 0x28, 0x87, 0x24,
0xef, 0x2b, 0x40, 0x7f, 0x7c, 0xbb, 0x8e, 0xd3, 0x1e, 0x9c, 0xc4, 0xad, 0x20, 0x2f, 0x68, 0x7f,
0xa9, 0xb4, 0xd7, 0xf2, 0x9b, 0x35, 0x18, 0x1c, 0x43, 0x95, 0x35, 0xea, 0x3b, 0x3b, 0xca, 0xee,
0x12, 0x6d, 0x91, 0x97, 0x25, 0x6f, 0x72, 0xff, 0x51, 0xa0, 0x2e, 0xe9, 0x88, 0xac, 0xca, 0x76,
0xd2, 0xed, 0xde, 0x4d, 0xbb, 0xdd, 0xa6, 0x2c, 0xcd, 0xe6, 0x6d, 0xfd, 0x3c, 0xb5, 0xef, 0xaf,
0x2f, 0xd1, 0xb7, 0xb9, 0xbd, 0x80, 0x8d, 0xf5, 0x30, 0xdf, 0xf1, 0x3d, 0xfd, 0x4b, 0x8f, 0xfe,
0x8f, 0x6e, 0xc7, 0x9b, 0xbf, 0xa8, 0x1d, 0x3e, 0x5b, 0xa8, 0x2f, 0x37, 0xf8, 0xdf, 0xcd, 0x4f,
0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x2e, 0xae, 0xf7, 0x33, 0xf9, 0x14, 0x00, 0x00,
// 2025 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0x5b, 0x6f, 0xe3, 0xc6,
0x15, 0x36, 0x75, 0xb1, 0xa4, 0x23, 0xc9, 0x4b, 0x8f, 0xbd, 0x8e, 0xac, 0xdd, 0xcd, 0x6e, 0x88,
0x26, 0x71, 0xdd, 0xd4, 0x9b, 0x3a, 0xdb, 0x6c, 0x6f, 0xc1, 0x42, 0x96, 0x68, 0x47, 0x5d, 0x59,
0x12, 0x28, 0xba, 0xdb, 0xb4, 0x40, 0x09, 0x9a, 0x1c, 0x6b, 0x59, 0x53, 0x1c, 0x96, 0x1c, 0x79,
0x23, 0xb4, 0xe8, 0x43, 0x0b, 0xf4, 0xb9, 0x40, 0x81, 0x3e, 0xf6, 0x97, 0x14, 0xe8, 0x2f, 0xe8,
0x73, 0xdf, 0xfb, 0x37, 0xfa, 0x52, 0xcc, 0x85, 0x12, 0x29, 0x4b, 0xeb, 0x34, 0xcd, 0xdb, 0xcc,
0xb9, 0xf1, 0xcc, 0x99, 0x33, 0xdf, 0x7c, 0x43, 0x68, 0xbc, 0xf6, 0x5c, 0xd7, 0xbb, 0x9a, 0x45,
0xa1, 0xf3, 0x54, 0x0e, 0x8f, 0xc2, 0x88, 0x50, 0x82, 0x60, 0xa1, 0xd1, 0xfe, 0xa6, 0x80, 0xda,
0x26, 0x11, 0xee, 0x06, 0x57, 0xc4, 0xc0, 0x71, 0x48, 0x82, 0x18, 0xa3, 0x67, 0x00, 0x0e, 0x89,
0xb0, 0x15, 0x53, 0x9b, 0xe2, 0x86, 0xf2, 0x44, 0x39, 0xd8, 0x3a, 0xbe, 0x7f, 0xb4, 0xf0, 0x3a,
0x62, 0x1e, 0x23, 0xa6, 0x34, 0x2a, 0x4e, 0x32, 0x44, 0x3f, 0x82, 0xda, 0x04, 0xc7, 0xb1, 0x3d,
0xc6, 0x16, 0x9d, 0x85, 0xb8, 0x91, 0xe3, 0x7e, 0xef, 0xa4, 0xfd, 0xce, 0x85, 0xde, 0x9c, 0x85,
0xd8, 0xa8, 0x4e, 0x16, 0x13, 0xd4, 0x80, 0x92, 0x9c, 0x36, 0xf2, 0x4f, 0x94, 0x83, 0x8a, 0x91,
0x4c, 0xb5, 0x3f, 0xe7, 0xa0, 0x36, 0xa2, 0x76, 0x44, 0x0d, 0xfc, 0x9b, 0x29, 0x8e, 0x29, 0x7a,
0x0c, 0x55, 0x87, 0x04, 0x57, 0xde, 0xd8, 0x0a, 0x6d, 0xfa, 0x9a, 0x67, 0x57, 0x31, 0x40, 0x88,
0x86, 0x36, 0x7d, 0x8d, 0xde, 0x87, 0x2d, 0x69, 0xe0, 0x90, 0x80, 0xe2, 0x80, 0xf2, 0x4c, 0x2a,
0x46, 0x5d, 0x48, 0xdb, 0x42, 0x88, 0x3e, 0x86, 0x5d, 0xd7, 0x8b, 0xed, 0x4b, 0x1f, 0x5b, 0x13,
0x3c, 0x21, 0xd1, 0xcc, 0xf2, 0xbd, 0x89, 0x47, 0xf9, 0xf7, 0xcb, 0x06, 0x92, 0xba, 0x73, 0xae,
0xea, 0x31, 0x0d, 0xfb, 0xb2, 0x8b, 0x7d, 0x7b, 0xc6, 0xea, 0x12, 0xd1, 0x46, 0x81, 0x1b, 0x02,
0x17, 0xf1, 0x0c, 0xd1, 0x0f, 0x61, 0x1f, 0x07, 0x3c, 0x22, 0xf1, 0x5d, 0xcb, 0x21, 0x93, 0x89,
0x1d, 0xb8, 0x56, 0x8c, 0xa3, 0x1b, 0x1c, 0x35, 0x8a, 0xdc, 0x7c, 0x4f, 0x18, 0x0c, 0x7c, 0xb7,
0x2d, 0xd4, 0x23, 0xae, 0x45, 0x87, 0xb0, 0x2d, 0x5d, 0x23, 0xfb, 0x8d, 0x25, 0x32, 0x6d, 0x6c,
0x72, 0x97, 0x7b, 0x42, 0x61, 0xd8, 0x6f, 0xda, 0x5c, 0xac, 0x5d, 0x43, 0x6d, 0x84, 0xe9, 0x34,
0x4c, 0x2a, 0xf2, 0x00, 0x2a, 0x97, 0x76, 0x8c, 0xd3, 0xf5, 0x28, 0x33, 0x01, 0xaf, 0xc6, 0x7b,
0x50, 0x7b, 0x43, 0xa2, 0x6b, 0x2f, 0x90, 0xf5, 0x12, 0xb5, 0xa8, 0x4a, 0x19, 0x37, 0x79, 0x00,
0x15, 0x8a, 0x27, 0xa1, 0xd0, 0x8b, 0xf2, 0x97, 0x99, 0x80, 0x29, 0x35, 0x07, 0xca, 0xf3, 0xbe,
0xf8, 0x0c, 0xea, 0x91, 0x1c, 0x5b, 0x0e, 0x71, 0x93, 0xd6, 0x68, 0xa4, 0xb7, 0x38, 0x31, 0x6e,
0x13, 0x17, 0x1b, 0xb5, 0x28, 0x35, 0x4b, 0x6f, 0x72, 0x2e, 0xbb, 0xc9, 0x1a, 0xd4, 0x3e, 0xc7,
0xbe, 0x4f, 0x92, 0x15, 0x21, 0x28, 0x04, 0xf6, 0x04, 0xcb, 0xc5, 0xf0, 0xb1, 0xf6, 0x6d, 0xa8,
0x4b, 0x1b, 0x99, 0x4d, 0x2a, 0x9c, 0x92, 0x0d, 0x57, 0x82, 0xa2, 0x3e, 0x09, 0xe9, 0x4c, 0xfb,
0x47, 0x0e, 0x60, 0x34, 0x8b, 0x29, 0x9e, 0xb0, 0xfe, 0x46, 0x7b, 0xb0, 0x29, 0xb6, 0x9a, 0x3b,
0xe4, 0x0d, 0x39, 0x43, 0xef, 0x02, 0x8c, 0x49, 0x44, 0xa6, 0xd4, 0x0b, 0x70, 0xcc, 0x73, 0x2b,
0x1a, 0x29, 0x89, 0xec, 0xa8, 0x00, 0x3b, 0xd4, 0x23, 0x41, 0x6c, 0x79, 0x01, 0xaf, 0x52, 0x91,
0x77, 0x54, 0x22, 0xed, 0x06, 0xe8, 0x43, 0xb8, 0x97, 0x36, 0x23, 0x53, 0xd1, 0x23, 0x45, 0x23,
0xed, 0x3d, 0x98, 0x52, 0xf4, 0x1d, 0xd8, 0xa6, 0x91, 0x7d, 0x75, 0xe5, 0x39, 0x96, 0x7d, 0x63,
0x7b, 0x3e, 0xdb, 0x5e, 0xd9, 0x1f, 0xaa, 0x54, 0xb4, 0x12, 0x39, 0x4b, 0x7a, 0x1a, 0xfa, 0x5e,
0x70, 0xcd, 0xdb, 0x21, 0x6f, 0xc8, 0x19, 0x6a, 0x42, 0xd9, 0x25, 0x6f, 0x02, 0xae, 0x29, 0x71,
0xcd, 0x7c, 0xce, 0x36, 0x5d, 0x58, 0x59, 0x94, 0x50, 0xdb, 0x6f, 0x94, 0xb9, 0xbe, 0x2a, 0x64,
0x26, 0x13, 0xb1, 0x35, 0x25, 0xe6, 0xd2, 0xa8, 0xc2, 0x8d, 0xea, 0x89, 0x94, 0x9b, 0x69, 0x7f,
0x54, 0x60, 0x7b, 0x30, 0xa5, 0x97, 0x64, 0x1a, 0xb8, 0x67, 0x11, 0x99, 0x86, 0x5d, 0x8a, 0x27,
0x48, 0x85, 0x3c, 0xb5, 0xc7, 0xb2, 0xec, 0x6c, 0xc8, 0x76, 0x6c, 0x7e, 0xe8, 0x2b, 0x06, 0x1f,
0x23, 0x0d, 0xea, 0xd3, 0xc8, 0xb7, 0x28, 0x8e, 0xa9, 0x45, 0xbd, 0x89, 0x38, 0xda, 0x2c, 0x8d,
0xc8, 0x37, 0x71, 0x4c, 0x4d, 0x6f, 0x82, 0xd1, 0xb7, 0x60, 0x6b, 0x6e, 0xc3, 0x4f, 0x92, 0x2c,
0x59, 0x4d, 0x1a, 0x75, 0x98, 0x4c, 0xfb, 0x93, 0x02, 0xf5, 0x4c, 0x16, 0x5f, 0x31, 0x83, 0x26,
0x94, 0x63, 0xec, 0x63, 0x87, 0x62, 0x37, 0x69, 0xec, 0x64, 0x8e, 0x3e, 0x81, 0xa2, 0x47, 0xf1,
0x24, 0x6e, 0x14, 0x9e, 0xe4, 0x0f, 0xaa, 0xc7, 0x8f, 0xd2, 0x4d, 0x7c, 0x6b, 0xc5, 0x86, 0xb0,
0xd5, 0x3a, 0x4b, 0xd5, 0xe8, 0x79, 0x31, 0x45, 0x4f, 0x93, 0x48, 0x0a, 0x8f, 0xb4, 0xbf, 0x36,
0x52, 0x12, 0x65, 0x00, 0xd5, 0x57, 0x76, 0x14, 0xb6, 0x1c, 0x87, 0x4c, 0x03, 0x8a, 0x1e, 0x01,
0xd8, 0x62, 0x68, 0x79, 0xae, 0x5c, 0x52, 0x45, 0x4a, 0xba, 0x2e, 0xdb, 0x4c, 0xdb, 0x71, 0x70,
0x1c, 0x5b, 0x94, 0x5c, 0xe3, 0x20, 0x39, 0xc1, 0x42, 0x66, 0x32, 0x91, 0xf6, 0x2f, 0x05, 0x76,
0x58, 0xc4, 0x57, 0x5e, 0x84, 0xc7, 0x53, 0x3b, 0x72, 0x05, 0x52, 0x30, 0xc4, 0x0a, 0x23, 0xef,
0xc6, 0xa6, 0xd8, 0xba, 0xc6, 0xb3, 0x04, 0x2b, 0xa5, 0xe8, 0x25, 0x9e, 0xa1, 0x8f, 0x00, 0xf9,
0xc4, 0xb1, 0x7d, 0xcb, 0x76, 0xdd, 0x88, 0x7d, 0xc2, 0x0b, 0x6f, 0x9e, 0xc9, 0x2f, 0xa8, 0x5c,
0xd3, 0x12, 0x8a, 0x6e, 0x78, 0xf3, 0x6c, 0xa5, 0xf5, 0xa7, 0xb2, 0xb0, 0xcb, 0xd6, 0x9f, 0xa2,
0x0f, 0xe0, 0x5e, 0x88, 0x71, 0x64, 0x85, 0xd3, 0x4b, 0xdf, 0x73, 0x78, 0x02, 0x05, 0x01, 0xc4,
0x4c, 0x3c, 0xe4, 0x52, 0x96, 0xc3, 0x03, 0xa8, 0x38, 0xbe, 0x87, 0xc5, 0xea, 0x8b, 0x62, 0x97,
0x84, 0xa0, 0xeb, 0x6a, 0x7f, 0x55, 0x60, 0x8f, 0xad, 0xec, 0x0c, 0x07, 0x38, 0xb2, 0xd9, 0x09,
0x9a, 0x9f, 0xff, 0xef, 0x41, 0x49, 0x16, 0x89, 0x2f, 0xac, 0x9a, 0xbd, 0x6a, 0x52, 0x05, 0x36,
0x12, 0x3b, 0xd6, 0x35, 0x3e, 0x19, 0xcb, 0xf5, 0xb1, 0x21, 0x7a, 0x0e, 0x9b, 0x12, 0x6c, 0xf3,
0x3c, 0xc6, 0xe3, 0xe5, 0x18, 0x4b, 0x25, 0x35, 0xa4, 0xb9, 0xf6, 0x12, 0xb6, 0x05, 0xb2, 0x0c,
0x23, 0xf2, 0x25, 0xc3, 0x7f, 0x3a, 0x8d, 0xd1, 0x43, 0xa8, 0x2c, 0x0e, 0xb4, 0xc2, 0x0f, 0xf4,
0x42, 0xc0, 0x00, 0x4b, 0x40, 0xb9, 0xcb, 0x33, 0x28, 0x1b, 0xc9, 0x54, 0xfb, 0x1d, 0xd4, 0x86,
0x76, 0x14, 0xe3, 0x04, 0xff, 0x1a, 0x50, 0x4a, 0xee, 0x2e, 0x09, 0x6d, 0x72, 0xba, 0x7c, 0xfb,
0xe5, 0x6e, 0xdd, 0x7e, 0x6f, 0x03, 0x73, 0xb4, 0x0b, 0x45, 0x17, 0x5f, 0x4e, 0xc7, 0xf2, 0xee,
0x12, 0x13, 0xed, 0x0f, 0x0a, 0xd4, 0xe5, 0xe7, 0xbf, 0x31, 0xa0, 0xcf, 0x5e, 0xbd, 0xf3, 0xf4,
0xd7, 0xdf, 0xf3, 0x3d, 0x68, 0xb6, 0x5f, 0xdb, 0xc1, 0x18, 0x8b, 0x3a, 0x0f, 0x42, 0x8e, 0x96,
0x49, 0x41, 0x8e, 0x60, 0x47, 0x2e, 0x9b, 0x08, 0x85, 0xf5, 0xeb, 0x98, 0x04, 0xb2, 0x38, 0xdb,
0x4e, 0xda, 0xe5, 0xa7, 0x31, 0x09, 0xb4, 0x5f, 0xc1, 0x7d, 0xd9, 0x31, 0x32, 0x5e, 0xea, 0x66,
0x49, 0x5d, 0x93, 0x7c, 0x9c, 0x2d, 0x59, 0x6e, 0x5d, 0xc9, 0xf2, 0xe9, 0x92, 0xbd, 0x80, 0xbd,
0xe5, 0xf8, 0xb2, 0x74, 0xb7, 0xd9, 0x87, 0xb2, 0x82, 0x7d, 0x68, 0xaf, 0xe0, 0xfe, 0x88, 0x23,
0x51, 0x02, 0x10, 0xa9, 0xcb, 0x7c, 0xcc, 0xb0, 0xc2, 0x5a, 0xc0, 0x5b, 0x99, 0x0b, 0x4c, 0x7b,
0xcc, 0xa0, 0x80, 0x48, 0x7b, 0xae, 0x97, 0x50, 0x90, 0xc8, 0x4c, 0x7b, 0xac, 0x7d, 0x17, 0xb6,
0x2e, 0x04, 0x74, 0x7e, 0x95, 0x88, 0xda, 0xef, 0x61, 0x3f, 0x59, 0x08, 0xeb, 0xf6, 0x6c, 0xb1,
0x1e, 0x43, 0xd5, 0xf7, 0x1c, 0xcc, 0xba, 0x20, 0x05, 0x1f, 0x52, 0xc4, 0x8e, 0x6e, 0x16, 0xb9,
0x72, 0x77, 0x21, 0x57, 0xfe, 0x36, 0x72, 0x7d, 0x06, 0x0f, 0x47, 0x98, 0xa6, 0x4e, 0x92, 0x2e,
0x8e, 0x44, 0x92, 0xc2, 0x23, 0x00, 0x2f, 0xb6, 0x92, 0x63, 0x23, 0x8f, 0x94, 0x17, 0x4b, 0x2b,
0xed, 0xb7, 0x00, 0x3d, 0x32, 0x96, 0xb4, 0x12, 0x1d, 0x42, 0xd1, 0xc7, 0x37, 0xd8, 0x97, 0xed,
0xba, 0x9b, 0x6e, 0xd7, 0x1e, 0x19, 0xf7, 0x98, 0xce, 0x10, 0x26, 0xe8, 0xc3, 0xd4, 0x75, 0xb1,
0x75, 0xbc, 0xb3, 0x64, 0xca, 0x19, 0xaa, 0xb8, 0x43, 0xd6, 0xb7, 0x6c, 0x1d, 0xaa, 0x23, 0x4a,
0x12, 0x1a, 0xa6, 0xfd, 0x5d, 0x01, 0x64, 0x4e, 0x83, 0x00, 0xfb, 0x19, 0xbe, 0x8a, 0xa0, 0xc0,
0x61, 0x52, 0xe4, 0xce, 0xc7, 0xac, 0xb0, 0x82, 0x15, 0x5a, 0x21, 0x89, 0x68, 0xc2, 0x38, 0x84,
0x68, 0x48, 0x22, 0xca, 0x2a, 0x17, 0xd3, 0xc8, 0x73, 0xa8, 0xc5, 0x48, 0x08, 0x96, 0xcd, 0x57,
0x15, 0x32, 0x83, 0x89, 0xd0, 0x0f, 0xa0, 0x81, 0x03, 0x37, 0x24, 0x1e, 0x2b, 0x7e, 0xe0, 0xe2,
0x10, 0x07, 0x2e, 0x03, 0xd1, 0xc0, 0x4e, 0xa8, 0xe9, 0x5e, 0xa2, 0xef, 0x2e, 0xd4, 0x7d, 0x9b,
0xb2, 0x96, 0x8e, 0xa9, 0xed, 0x5c, 0x4b, 0xb0, 0x15, 0x13, 0xed, 0x10, 0xb6, 0x44, 0xf6, 0x77,
0x13, 0xac, 0x43, 0x0d, 0x6a, 0xe9, 0xe3, 0x8f, 0x36, 0x21, 0x37, 0x78, 0xa9, 0x6e, 0x20, 0x80,
0xcd, 0xd3, 0x56, 0xb7, 0xa7, 0x77, 0x54, 0xe5, 0xb0, 0x05, 0x95, 0xf9, 0x33, 0x01, 0x55, 0xa1,
0x34, 0x32, 0x07, 0xc3, 0xa1, 0xde, 0x51, 0x37, 0x50, 0x0d, 0xca, 0x23, 0xb3, 0x65, 0x98, 0xdd,
0xfe, 0x99, 0xaa, 0x08, 0x55, 0xcb, 0x30, 0xf5, 0x8e, 0x9a, 0x13, 0xaa, 0xc1, 0x70, 0xc8, 0x54,
0xf9, 0xc3, 0x7f, 0xe6, 0xa0, 0x9a, 0x7a, 0x32, 0xa0, 0x0a, 0x14, 0xf5, 0xf3, 0xa1, 0xf9, 0x85,
0xba, 0x81, 0xde, 0x81, 0x1d, 0x3e, 0xb4, 0xda, 0x83, 0xfe, 0x69, 0xf7, 0xec, 0xc2, 0x68, 0x99,
0xdd, 0x41, 0x5f, 0x55, 0x50, 0x03, 0x76, 0x79, 0x38, 0xab, 0x3d, 0x38, 0x3f, 0x6f, 0xf5, 0x3b,
0xd6, 0x48, 0x37, 0x7e, 0xa6, 0x1b, 0x6a, 0x0e, 0x21, 0xd8, 0x6a, 0x1b, 0x7a, 0xcb, 0xd4, 0xb9,
0xa8, 0xdb, 0xd6, 0xd5, 0x3c, 0xda, 0x86, 0xba, 0xb0, 0x4e, 0x44, 0x05, 0xb4, 0x0b, 0xea, 0x45,
0x5f, 0xff, 0xf9, 0x50, 0x6f, 0x9b, 0x7a, 0xc7, 0xd2, 0x0d, 0x63, 0x60, 0xa8, 0x45, 0xb4, 0x03,
0xf7, 0x5a, 0x3d, 0x43, 0x6f, 0x75, 0xbe, 0xb0, 0x92, 0x6c, 0x37, 0xb3, 0x42, 0xb1, 0xba, 0x12,
0xda, 0x03, 0xd4, 0xed, 0x8f, 0xcc, 0x56, 0xbf, 0xad, 0x5b, 0xfd, 0x81, 0x69, 0x9d, 0x0e, 0x2e,
0xfa, 0x1d, 0xb5, 0xcc, 0x12, 0xcb, 0xc8, 0x13, 0x8f, 0xca, 0x0a, 0x8d, 0xf8, 0x00, 0xa0, 0x7d,
0xb8, 0xcf, 0x13, 0xb0, 0x4e, 0x2e, 0xba, 0xbd, 0x4e, 0xb7, 0x7f, 0x26, 0x97, 0xab, 0x56, 0x99,
0x93, 0x50, 0x0d, 0x5b, 0xc6, 0x28, 0xa5, 0xa9, 0x2d, 0x34, 0x2c, 0xb3, 0x94, 0xa6, 0x7e, 0x78,
0x02, 0xe5, 0xe4, 0x18, 0xb0, 0x5a, 0x76, 0xf4, 0x93, 0x8b, 0x33, 0x75, 0x03, 0x95, 0xa1, 0xd0,
0xed, 0x9f, 0x0e, 0xc4, 0x5e, 0xbc, 0x6a, 0x19, 0x7d, 0x56, 0xfd, 0x1c, 0xaf, 0x36, 0x5f, 0x7d,
0x9e, 0x0d, 0x4f, 0x5b, 0x66, 0xab, 0xa7, 0x16, 0x0e, 0x3f, 0x82, 0x92, 0x3c, 0x1f, 0xcc, 0xaf,
0x3d, 0x30, 0x74, 0x75, 0x83, 0xef, 0xa1, 0x2c, 0xa0, 0xc2, 0x9a, 0x40, 0x7e, 0x31, 0x77, 0xfc,
0x17, 0x05, 0x8a, 0x9c, 0xb5, 0xa3, 0x17, 0x50, 0x1e, 0xd9, 0x33, 0x31, 0xce, 0xdc, 0x23, 0x69,
0xe2, 0xdf, 0xdc, 0x5f, 0xa1, 0x91, 0xdd, 0xd8, 0x85, 0xad, 0x24, 0xc0, 0x88, 0x46, 0xd8, 0x9e,
0x7c, 0xad, 0x30, 0x07, 0xca, 0xc7, 0xca, 0xf1, 0xbf, 0x2b, 0x50, 0x60, 0xbd, 0x89, 0x5e, 0x40,
0x51, 0xbc, 0xdc, 0x32, 0xa1, 0xd2, 0xc7, 0xb7, 0xf9, 0x70, 0xf9, 0xdd, 0x9b, 0x79, 0x29, 0x9f,
0x2f, 0x5e, 0xcf, 0x8c, 0x0a, 0x32, 0x24, 0x45, 0xef, 0x64, 0x63, 0xcd, 0x01, 0xe2, 0xed, 0xa1,
0x58, 0x62, 0xe8, 0xe5, 0x82, 0xe6, 0xc6, 0xfc, 0xc5, 0xb2, 0x36, 0xd6, 0x7a, 0xba, 0xca, 0xf2,
0xe0, 0xc1, 0x06, 0xb0, 0x7d, 0x6e, 0x7b, 0xc1, 0x37, 0x17, 0xb0, 0x03, 0xf5, 0xb3, 0x04, 0xab,
0xdf, 0x1e, 0x6c, 0x2f, 0xa3, 0x98, 0x3b, 0xf0, 0x28, 0xcf, 0xa1, 0xc8, 0x5f, 0xaf, 0x4b, 0x35,
0x4f, 0x3d, 0x68, 0x9b, 0xbb, 0xab, 0x78, 0x06, 0xfa, 0x09, 0x14, 0x39, 0x4b, 0xc9, 0x3a, 0xa6,
0x79, 0x53, 0x76, 0xdf, 0xb3, 0x94, 0xe6, 0x97, 0xb0, 0xb3, 0x82, 0x5f, 0xa0, 0x0f, 0x32, 0x7b,
0xb2, 0x96, 0x80, 0xdc, 0xd1, 0x06, 0xa7, 0xf2, 0x1f, 0x05, 0x7b, 0xcc, 0x7b, 0x0e, 0xfe, 0xda,
0xed, 0xf4, 0x1c, 0x0a, 0xac, 0x8c, 0x68, 0x3b, 0x6d, 0xc5, 0x9f, 0xb2, 0x77, 0x38, 0xb6, 0xa0,
0x64, 0xe0, 0xf8, 0xff, 0x6a, 0x65, 0x76, 0xbe, 0x32, 0x8c, 0x04, 0xbd, 0x97, 0xdd, 0xa0, 0x15,
0x6c, 0x65, 0xcd, 0x4e, 0xfd, 0x18, 0x4a, 0x92, 0x83, 0xa0, 0x66, 0xda, 0x20, 0x4b, 0x4c, 0xd6,
0x38, 0x5b, 0x80, 0x6e, 0x33, 0x12, 0xf4, 0x7e, 0xda, 0x76, 0x2d, 0x63, 0x69, 0x6a, 0xcb, 0xf4,
0x7d, 0xc5, 0xbb, 0xe1, 0x73, 0xd8, 0x3d, 0xcb, 0x50, 0x0e, 0x49, 0xde, 0x57, 0x14, 0xfd, 0xd1,
0xed, 0x3e, 0x4e, 0x7b, 0x70, 0x12, 0xb7, 0x82, 0xbc, 0xa0, 0x83, 0xa5, 0xd6, 0x5e, 0xcb, 0x6f,
0xd6, 0xd4, 0xe0, 0x04, 0xaa, 0x0c, 0xa8, 0xef, 0x44, 0x94, 0xbd, 0x25, 0xda, 0x22, 0x2f, 0x4b,
0x0e, 0x72, 0xff, 0x51, 0xa0, 0x2e, 0xe9, 0x88, 0xec, 0xca, 0x76, 0x82, 0x76, 0xef, 0xa6, 0xdd,
0x6e, 0x53, 0x96, 0x66, 0xf3, 0xb6, 0x7e, 0x9e, 0xda, 0xf7, 0xd7, 0xb7, 0xe8, 0xdb, 0xdc, 0x9e,
0xc3, 0xe6, 0xfa, 0x32, 0xdf, 0xf1, 0x3d, 0xfd, 0x4b, 0x8f, 0xfe, 0x8f, 0x6e, 0x27, 0x5b, 0xbf,
0xa8, 0x1d, 0x3d, 0x5d, 0xa8, 0x2f, 0x37, 0xf9, 0xaf, 0xcf, 0x4f, 0xfe, 0x1b, 0x00, 0x00, 0xff,
0xff, 0xc8, 0xaf, 0x1d, 0x85, 0x16, 0x15, 0x00, 0x00,
}

View File

@@ -111,6 +111,7 @@ message WarpWireguardConfig {
string local_address_ipv4 = 2;
string local_address_ipv6 = 3;
string peer_public_key = 4;
string client_id=5;
}
message WarpGenerationResponse {

View File

@@ -46,6 +46,13 @@ func BuildConfig(path string, configOptionsJson string) (string, error) {
}
}
if configOptions.Warp2.WireguardConfigStr != "" {
err := json.Unmarshal([]byte(configOptions.Warp2.WireguardConfigStr), &configOptions.Warp2.WireguardConfig)
if err != nil {
return "", err
}
}
return config.BuildConfigJson(*configOptions, options)
}

View File

@@ -213,6 +213,12 @@ func ChangeConfigOptions(in *pb.ChangeConfigOptionsRequest) (*pb.CoreInfoRespons
return nil, err
}
}
if configOptions.Warp2.WireguardConfigStr != "" {
err := json.Unmarshal([]byte(configOptions.Warp2.WireguardConfigStr), &configOptions.Warp2.WireguardConfig)
if err != nil {
return nil, err
}
}
return &pb.CoreInfoResponse{}, nil
}
func (s *CoreService) GenerateConfig(ctx context.Context, in *pb.GenerateConfigRequest) (*pb.GenerateConfigResponse, error) {

View File

@@ -11,7 +11,7 @@ import (
func main() {
// defer C.free(unsafe.Pointer(port))
v2.StartGrpcServer("127.0.0.1:50051")
v2.StartGrpcServer("127.0.0.1:50051", "hello")
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
<-sigChan

View File

@@ -239,6 +239,11 @@ func readConfigOptionsAt(path string) (*config.ConfigOptions, error) {
return nil, err
}
}
if options.Warp2.WireguardConfigStr != "" {
err := json.Unmarshal([]byte(options.Warp2.WireguardConfigStr), &options.Warp2.WireguardConfig)
if err != nil {
return nil, err
}
}
return &options, nil
}

View File

@@ -25,6 +25,7 @@ func GenerateWarpConfig(in *pb.GenerateWarpConfigRequest) (*pb.WarpGenerationRes
LocalAddressIpv4: wg.LocalAddressIPv4,
LocalAddressIpv6: wg.LocalAddressIPv6,
PeerPublicKey: wg.PeerPublicKey,
ClientId: wg.ClientID,
},
Log: log,
}, nil