diff --git a/connection/quic.go b/connection/quic.go index 190173f4..745a1593 100644 --- a/connection/quic.go +++ b/connection/quic.go @@ -38,7 +38,6 @@ type QUICConnection struct { logger *zerolog.Logger httpProxy OriginProxy sessionManager datagramsession.Manager - localIP net.IP } // NewQUICConnection returns a new instance of QUICConnection. @@ -75,17 +74,11 @@ func NewQUICConnection( sessionManager := datagramsession.NewManager(datagramMuxer, observer.log) - localIP, err := getLocalIP() - if err != nil { - return nil, err - } - return &QUICConnection{ session: session, httpProxy: httpProxy, logger: observer.log, sessionManager: sessionManager, - localIP: localIP, }, nil } @@ -197,7 +190,10 @@ func (q *QUICConnection) RegisterUdpSession(ctx context.Context, sessionID uuid. return nil } -// TODO: TUN-5422 Implement UnregisterUdpSession RPC +func (q *QUICConnection) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error { + q.sessionManager.UnregisterSession(ctx, sessionID) + return nil +} // streamReadWriteAcker is a light wrapper over QUIC streams with a callback to send response back to // the client. @@ -292,26 +288,3 @@ func isTransferEncodingChunked(req *http.Request) bool { // separated value as well. return strings.Contains(strings.ToLower(transferEncodingVal), "chunked") } - -// TODO: TUN-5303: Find the local IP once in ingress package -// TODO: TUN-5421 allow user to specify which IP to bind to -func getLocalIP() (net.IP, error) { - addrs, err := net.InterfaceAddrs() - if err != nil { - return nil, err - } - for _, addr := range addrs { - // Find the IP that is not loop back - var ip net.IP - switch v := addr.(type) { - case *net.IPNet: - ip = v.IP - case *net.IPAddr: - ip = v.IP - } - if !ip.IsLoopback() { - return ip, nil - } - } - return nil, fmt.Errorf("cannot determine IP to bind to") -} diff --git a/quic/quic_protocol.go b/quic/quic_protocol.go index b40cc6dc..78c3c33d 100644 --- a/quic/quic_protocol.go +++ b/quic/quic_protocol.go @@ -247,6 +247,10 @@ func (rcs *RPCClientStream) RegisterUdpSession(ctx context.Context, sessionID uu return resp.Err } +func (rcs *RPCClientStream) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error { + return rcs.client.UnregisterUdpSession(ctx, sessionID) +} + func (rcs *RPCClientStream) Close() { _ = rcs.client.Close() _ = rcs.transport.Close() diff --git a/quic/quic_protocol_test.go b/quic/quic_protocol_test.go index 89a19a77..93998d0b 100644 --- a/quic/quic_protocol_test.go +++ b/quic/quic_protocol_test.go @@ -131,12 +131,15 @@ func TestRegisterUdpSession(t *testing.T) { rpcClientStream, err := NewRPCClientStream(context.Background(), clientStream, &logger) assert.NoError(t, err) - err = rpcClientStream.RegisterUdpSession(context.Background(), rpcServer.sessionID, rpcServer.dstIP, rpcServer.dstPort) - assert.NoError(t, err) + assert.NoError(t, rpcClientStream.RegisterUdpSession(context.Background(), rpcServer.sessionID, rpcServer.dstIP, rpcServer.dstPort)) // Different sessionID, the RPC server should reject the registraion - err = rpcClientStream.RegisterUdpSession(context.Background(), uuid.New(), rpcServer.dstIP, rpcServer.dstPort) - assert.Error(t, err) + assert.Error(t, rpcClientStream.RegisterUdpSession(context.Background(), uuid.New(), rpcServer.dstIP, rpcServer.dstPort)) + + assert.NoError(t, rpcClientStream.UnregisterUdpSession(context.Background(), rpcServer.sessionID)) + + // Different sessionID, the RPC server should reject the unregistraion + assert.Error(t, rpcClientStream.UnregisterUdpSession(context.Background(), uuid.New())) rpcClientStream.Close() <-sessionRegisteredChan @@ -161,6 +164,13 @@ func (s mockRPCServer) RegisterUdpSession(ctx context.Context, sessionID uuid.UU return nil } +func (s mockRPCServer) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error { + if s.sessionID != sessionID { + return fmt.Errorf("expect session ID %s, got %s", s.sessionID, sessionID) + } + return nil +} + type mockRPCStream struct { io.ReadCloser io.WriteCloser diff --git a/tunnelrpc/pogs/sessionrpc.go b/tunnelrpc/pogs/sessionrpc.go index 4a04c671..ce8a06c0 100644 --- a/tunnelrpc/pogs/sessionrpc.go +++ b/tunnelrpc/pogs/sessionrpc.go @@ -14,6 +14,7 @@ import ( type SessionManager interface { RegisterUdpSession(ctx context.Context, sessionID uuid.UUID, dstIP net.IP, dstPort uint16) error + UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error } type SessionManager_PogsImpl struct { @@ -60,6 +61,21 @@ func (i SessionManager_PogsImpl) RegisterUdpSession(p tunnelrpc.SessionManager_r return resp.Marshal(result) } +func (i SessionManager_PogsImpl) UnregisterUdpSession(p tunnelrpc.SessionManager_unregisterUdpSession) error { + server.Ack(p.Options) + + sessionIDRaw, err := p.Params.SessionId() + if err != nil { + return err + } + sessionID, err := uuid.FromBytes(sessionIDRaw) + if err != nil { + return err + } + + return i.impl.UnregisterUdpSession(p.Ctx, sessionID) +} + type RegisterUdpSessionResponse struct { Err error } @@ -116,3 +132,15 @@ func (c SessionManager_PogsClient) RegisterUdpSession(ctx context.Context, sessi } return response, nil } + +func (c SessionManager_PogsClient) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error { + client := tunnelrpc.SessionManager{Client: c.Client} + promise := client.UnregisterUdpSession(ctx, func(p tunnelrpc.SessionManager_unregisterUdpSession_Params) error { + if err := p.SetSessionId(sessionID[:]); err != nil { + return err + } + return nil + }) + _, err := promise.Struct() + return err +} diff --git a/tunnelrpc/tunnelrpc.capnp b/tunnelrpc/tunnelrpc.capnp index 2f6c67d7..916a81b4 100644 --- a/tunnelrpc/tunnelrpc.capnp +++ b/tunnelrpc/tunnelrpc.capnp @@ -149,4 +149,5 @@ struct RegisterUdpSessionResponse { interface SessionManager { registerUdpSession @0 (sessionId :Data, dstIp :Data, dstPort: UInt16) -> (result :RegisterUdpSessionResponse); + unregisterUdpSession @1 (sessionId :Data) -> (); } \ No newline at end of file diff --git a/tunnelrpc/tunnelrpc.capnp.go b/tunnelrpc/tunnelrpc.capnp.go index e0f573e7..aea215a3 100644 --- a/tunnelrpc/tunnelrpc.capnp.go +++ b/tunnelrpc/tunnelrpc.capnp.go @@ -3470,9 +3470,31 @@ func (c SessionManager) RegisterUdpSession(ctx context.Context, params func(Sess } return SessionManager_registerUdpSession_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))} } +func (c SessionManager) UnregisterUdpSession(ctx context.Context, params func(SessionManager_unregisterUdpSession_Params) error, opts ...capnp.CallOption) SessionManager_unregisterUdpSession_Results_Promise { + if c.Client == nil { + return SessionManager_unregisterUdpSession_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))} + } + call := &capnp.Call{ + Ctx: ctx, + Method: capnp.Method{ + InterfaceID: 0x839445a59fb01686, + MethodID: 1, + InterfaceName: "tunnelrpc/tunnelrpc.capnp:SessionManager", + MethodName: "unregisterUdpSession", + }, + Options: capnp.NewCallOptions(opts), + } + if params != nil { + call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 1} + call.ParamsFunc = func(s capnp.Struct) error { return params(SessionManager_unregisterUdpSession_Params{Struct: s}) } + } + return SessionManager_unregisterUdpSession_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))} +} type SessionManager_Server interface { RegisterUdpSession(SessionManager_registerUdpSession) error + + UnregisterUdpSession(SessionManager_unregisterUdpSession) error } func SessionManager_ServerToClient(s SessionManager_Server) SessionManager { @@ -3482,7 +3504,7 @@ func SessionManager_ServerToClient(s SessionManager_Server) SessionManager { func SessionManager_Methods(methods []server.Method, s SessionManager_Server) []server.Method { if cap(methods) == 0 { - methods = make([]server.Method, 0, 1) + methods = make([]server.Method, 0, 2) } methods = append(methods, server.Method{ @@ -3499,6 +3521,20 @@ func SessionManager_Methods(methods []server.Method, s SessionManager_Server) [] ResultsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 1}, }) + methods = append(methods, server.Method{ + Method: capnp.Method{ + InterfaceID: 0x839445a59fb01686, + MethodID: 1, + InterfaceName: "tunnelrpc/tunnelrpc.capnp:SessionManager", + MethodName: "unregisterUdpSession", + }, + Impl: func(c context.Context, opts capnp.CallOptions, p, r capnp.Struct) error { + call := SessionManager_unregisterUdpSession{c, opts, SessionManager_unregisterUdpSession_Params{Struct: p}, SessionManager_unregisterUdpSession_Results{Struct: r}} + return s.UnregisterUdpSession(call) + }, + ResultsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 0}, + }) + return methods } @@ -3510,6 +3546,14 @@ type SessionManager_registerUdpSession struct { Results SessionManager_registerUdpSession_Results } +// SessionManager_unregisterUdpSession holds the arguments for a server call to SessionManager.unregisterUdpSession. +type SessionManager_unregisterUdpSession struct { + Ctx context.Context + Options capnp.CallOptions + Params SessionManager_unregisterUdpSession_Params + Results SessionManager_unregisterUdpSession_Results +} + type SessionManager_registerUdpSession_Params struct{ capnp.Struct } // SessionManager_registerUdpSession_Params_TypeID is the unique identifier for the type SessionManager_registerUdpSession_Params. @@ -3685,197 +3729,325 @@ func (p SessionManager_registerUdpSession_Results_Promise) Result() RegisterUdpS return RegisterUdpSessionResponse_Promise{Pipeline: p.Pipeline.GetPipeline(0)} } -const schema_db8274f9144abc7e = "x\xda\xccY{pT\xe5\x15?\xe7\xde\xdd\xdcM\xd8" + - "es{\x97\x98d\xa4)\x0c\x8c\x05\x0d\x0a)\x1d\xa4" + - "\xda$\x98\xa0\x89\xa8" + - "\"\xdd\xb6\x1f\xfe\xf5\x82\xdc];\xf7\x14\xads~\x1f" + - "7\x86\xe3 do\xec\xf8$\xd7\xfdP\xea\xa1\x92\xdd" + - "a\xc7\xac1'\x11\xb0i\xfc\x98\x06\x04\xb4g\xbeu" + - "l\xe1\xfc\x9f-\xfbq\xe0\xec\xc5\xd1Utv\xf3\xb2" + - "\x93\x07\xaa\x93\xb9G\xcb\xecq\\33\xba\x17\xa5\xf9" + - "Q\xb2\xa7#J*<\xfe\xd5++W\x1e\x9b\xbb\x0f" + - "\xc4FW\x8c\x1aM\x92\x98\xd0\xd5\xfc\x17\xca}\xbfy" + - "\xb2\x1c-\x8e_X\xb4\x07\xa5~\x92\xd3T\x88:\xfa" + - "\xdcz`\xe7\xf9\x91\x07?\xfa\xf9P^\xdc\x15\xebA" + - "i\x7f\x8cn}\xd7\xc4\xcf\xe1" + - "\x01\xed\xfa}\xdf\xfa\xc9\x9c\xcc\x9b/\x0e\xa1\xa9\xf4\xf9" + - "WNJ\x95\x12}\x85%R\xf4h\xe3\xfe\x1b\xde\xbf" + - "\xfd\xe0\xa1\x92\xa2\x8e\x0f\x15\xc9\x09aA\"\xffy\x08" + - "(\xf3\x92\xc3\xb9C\xeaC\xe9\x11G\xdc\xc3\x0e7w" + - "L\xa9[\xf7\xc7o\x1f\x09\x04\xed\x11\xe9]\x84\x90\xbd" + - "\xe0;K\xfa*\xd7\x1c=\x1a\xbch\x97\xe4xd\xbf" + - "s\xf4\x1f?:~\xe7\x89\\\xe6\xaf\x0e\xf0\\\x9f\x1d" + - "\x94f\x13\x8e\xdf\x97(\xab\xcei\x88\xb5O<\xdcu" + - "\xbc\x18\xca\xa2\x88g\x13s\x88\xe1\x9d\x04\x89\x98ym" + - "+[:\xeb\xaa\xe3\x832\xfa\xf3\xc4l\x94b\xe3\x1c" + - "\x90\x8d\xdb\x8c\xd2\x84\x9as\x00\xec;nl[x\xf1" + - "\xc4\x03'\x83*\x895\x84Air\x0d\xc9[6\xeb" + - "\xc4\xe5\x93\xefx\xee\xe4P@k\xaf\x99\x8aRw\x0d" + - "\x99.\x13\xf3\x87s\x7fp\xa8>^\x7f\xaa\xccM\x15" + - "\x0e\x82j\xfaP\xdaB\xbcM\x9bj\x9e'0\xdd\xfc" + - "\xf65+_\xbf\xe9\xa3\x8f\xcb#\xea\x88\xee\xafM\xa2" + - "t{-\x89\xdeRK\xf1\xbfw\xd1\xdf\xd7\x9e\xd8Q" + - "\xf3\xc9 \xbb\xa6\xd4\xf5\xa1ti\x1dq^\\\xb7Y" + - "\xba\x9f\xbe\xec\xd7\x84\x87\xa6\xb7\xad}\xf1\xd3\x00\xe2\xd7" + - "\xd7u\x12\xe2\xef\x11\x1e8\xba\xeeO\xd7|\x164x" + - "M\xdd\xbbd\xf0]ud\xf0\xea\x0f\xef\xbf\xe2\xce\xa5" + - "\x8f}\x11\x08\xdf\xfe\xba\x0dt\xd4*h\x1a\xcb\x1a\xf9" + - "P\xfaB\xf73=-\xad\xe4\xb5\xfc\xec\xd6\x82\xb5\x9c" + - "i\x96\x9aV,\x96d\xcdf^\xd7L\xd6\x85(W" + - "\xf3!\x80\x10\x02\x88J\x1f\x80|-\x8fr\x96C\x11" + - "1A\x01\x16U\".\xe7Q\xb68\x149.A\xf5" + - "E\xbcn\"\x80\x9c\xe5Q^\xc9!\xf2\x09\xe4\x01\xc4" + - "\xc26\x00y%\x8f\xf2F\x0e\xed<3r\x8a\xc64" + - "\x88[\xed\x86\x81Q\xe00\x0ah\x1b\xcc2\xfa\x95\x9e" + - ",\xc4Y\x80,\xf4]oa\x0c8\x8c\x01\xda\xcb\xf5" + - "\x82avk\x16\xaa\xd9$[f0\x13\x97c\x05p" + - "X\x018\x9cy)f\x9a\xaa\xae\xcdW4\xa5\x97\x19" + - "\x00dY\x88\x0f\x03x\x95\x17\xdd\x1a-\x8a;\x81\x13" + - "c\x82m\xb0^\xd5\xb4\x98\x81\xdd\x99\xbcs\x9e\xd7\xb5" + - "\x16\xecB\xff\"~\xf0E\x97eU\xa6Y\xf1\x0em" + - "\x99^\xe6\xbd\xce\xa1\xbc\xd7Y\xf2\xde\xc6\x80\xf7\xd6\xcf" + - "\x01\x90W\xf3(\xdf\xc2\xa1\xc8\x97\xdc\xb7i*\x80\xbc" + - "\x8eG\xf96\x0e\xed\xb4sIG\x06\x00<\xc7,c" + - "\x8aU0\x98I\xb4\xb1\x80]<:\xfe\x1b\x0b\xb8v" + - "\x053\xc8x\xd7\x9fq\xc5H/\xf7|>\x8c\xd3\xda" + - "W\xaa\xa6\xa5j\xbd\x8b\x1czs\x97\x9eU\xd3\xfdd" + - "U\xd4\xd1s\xfcl\x00Dq\xdcb\x00\xe4Dq\x0e" + - "@\xb3\xda\xab\xe9\x06\xb33\xaa\x99\xd65\x8d\x01\x9f\xb6" + - "\xd6\xf6(YEK3\xef\xa2\x8a\xc1\x17\x15/H1" + - "c\x053\xa6)\x01$N\xeaR\x0c\x85\xcf\x99r\xd4" + - "\xf3c\xfbb\x00\xb9\x8dG\xb9+\xe0\xc7\xf9\xe4\xc7y" + - "<\xcaW\x05\xfc\xd8M~\xec\xe2Q^\xca\xa1\xad\x1b" + - "j\xaf\xaa]\xc6\x807\x82`2-M\xc91\xf2Y" + - "\xc9\x1fk\xf5\xbc\xa5\xea\x9a\x89\xd5~\xc1\x06\xc4\xea\x80" + - "\xa7\x84\x91\xe05\xcdE\x8e\x0b\x1c]\x9b\x94dfA" + - "\xc8Z\xa6\x1c\xf2,\x89\xcd\x06\x90#<\xca\x09\x0e\x9b" + - "\x0df\x16\xb2\x16V\xfb}\xf1\x7fq\xeb\x10\xeeK\x0e" + - "\xe5\xbe\x19\x00\xf2\x15<\xca\x8b8\xc4\x92\xf7\xe49\xbe" + - "Km\xb3(\xaf\x030\xe3:\xaf!cZ\x1dy\xf7" + - "\xaf\xb5\x19\xd3\xea\xd2\x0d\x0b\x05\xe0P\x80aS\xa4\x18" + - "\xed8U\x1c\x02S\xc4\xd3m\x0a\x85\xf6\xeb<\xca\xdf" + - "\x08\xe86\x9d\x0a\xccE<\xca\x97ph+\xe9\xb4^" + - "\xd0\xacE\xc0+\xbde\x08N1\x88\xa7\x0d\xe6\x07\xd7" + - "\xbd6\xcaB;RF\x1447\xb4E\xf2" + - "\xa4f\x8akn\x00\x96v\x02\xc8\xd5<\xca\xe7rh" + - "\xf7\x1aJ\x9au1\x03U=\xb3@\xd1\xf4\x14\xcf\xd2" + - "\x18\x06\x0e\xc3\x81K\xc7\x9e\xe9\xa5I\x07\xa1&x\xa7" + - "\x86?o\xb0\x92\x13J\xc7\xbb\x1a\x8a:'<\x9d\xd7" + - "L\xf4;\x82\x17\xee\xf5=~\x9d\xf32y\x0b\x01\xe3" + - "\x16\x1e\xe5\xed\x81\x8ax\x17\xe5\xfcV\x1e\xe5\x078\x14" + - "C\xa1\x04\x86\x00\xc4\xfb\x09\xb5\xdby\x94ws\x03\xfb" + - "\x06[\xc14\xabM\xed\x05\x81\x99>\x95TlS{" + - "\x19\xf0\xe6\xd9V\x85\xc8\x08\xfe\xd0{L=\xcb,\xd6" + - "\xc6\xd2Y\xc5P,u\x05+\xfe^\x02\xa3\x1b\xd4\xe1" + - "p\x9b\x1c\x94\xe1\x84\xdf\xb8\xdb\xaa\x03p\x98\xe8\x97\x16" + - "\x81\x05:\xec0\xda\x16\x85\x93f\xba6\x08\x03~\xc6" + - "\x94p\x80\xe6p\x9d\xc3g_\x98\xb7TA\xd7L\xd2" + - "/\x10\xfa\xd9C\x85\xde\xf0C\xefV\xa1-\x1b\x82\x91" + - "\xc7R\xe4w\xfaA\x16C\\1\xf2\xbb\xf6\x00\xc8\xbb" + - "y\x94\x1f\xe3\xb0\xb9\xd8 \xb1\xda\x7f\xf0\x95\xa2Ul" + - "\x03\xf3thH+Y\xbf|\xd9\x06\xcbg\x954k" + - "\xc7R\xcb\x03D\xe0\x10\x1d\x88\xe4\xf2\x063MTu" + - "M.(Y\x95\xb7\xfa\xbd\x89C+\xe4\xba\x0c\xb6B" + - "E\xbd`\xb6Z\x16\xcb\x09y\xcb\x1c\xcd<\xe2;\x88" + - "\xea\x83\xa0f\xcd\xb2R8\xd5\xaf=\x9e\x83\x1a\xa9\x14" + - "^\xc0\xa3<\x8b\xc3x\xa1\xa0z\xb5\xd8\xce\xeai'" + - "n\x10_\xa0\xe4\xd8\xa0hW\x8c\x98\xab\x032\xbdK" + - "\x89;\xa9\xfa\xff\xd4t\x87\x1fY\xc9tg\xa6\x0b\xa8" + - "L)\xd0\xc2\xa3\xa2?I" + - "\xf4\x0a.\x81\x15\x00\xd2~\xec\x03H\xed#\xfa\xd3D" + - "\x17\xc2\x09z]HO\xa1\x01\x90\xfa%\xd1\x7fO\xf4" + - "Hm\x02#\x00\xd2\x01\x87\xfe\x0c\xd1_\"ze]" + - "\x02+\x01\xa4?\xe0\x06\x80\xd4\x0bD?D\xf4*L" + - "`\x15\xbd\x83q'@\xea\x10\xd1\xffL\xf41\x15\x09" + - "\x1c\x03 \xbd\xe3\xe8s\x98\xe8\xef\x11=\x1aJ`\x14" + - "@\xfa\x0b\xee\x01H\xbdG\xf4\x7f\x12=&$0\x06" + - " }\xe0\xd8u\x82\xe8\x11\xael\x1cv\x11U6\xf3" + - "\xf2\xba\xe9\x85\x8c\x95r\x1c\x8bp\xef\xd2\xe34\xd7b" + - "\xdc_\xf8\x00b\x1c\xd0\xce\xebzv\xc1@\xa4\xc6-" + - "\xa5\xd7t\xe7\xebj\xff\x91\x0eHD\xaf\xefC\\\xd7" + - ":2^!(\xaf:\xae&\xaa\xd9Z\xb0\xf4B\x1e" + - "\x1a2\x8a\xc52^\xcd1\x0a\xda\\C\xcf-Bf" + - "\xe4TM\xc9\x8eP\x8d*\x81\xc3J(\x95\x04W\xf6" + - "\xf0\xa5\xe9\xf4\xaf\x05\x0f\xd1\\9\xa2\x1b\xf2\xb3\x17)" + - "\xbd\xa3\xa9S3\xfc9.\xae\x05\x0aR\xc3\x0a%[" + - "\xf82\xe5i\xe0(\x91l.\x8e\"#\xcd\xd2\xeek" + - "~\xe4R2p \x1c\xd8P1\xb0N\xa3{\xb8\x92" + - "\xfcQ\xab\xdf\xcb\xac\xe2\x17=\x0ai$\x17\x82m\xfe" + - "\xccN'\x99\x19\x1f\x8d\xe9\xfe\xd6c\xe4g\xc4\x10\x8d" + - "\x7f\x88\xb6\xef\xce\x9c\x81\x17-\xc5~)\x8f\xf2\xf2@" + - "\xec\x195\x85\x0c\x8fr\xdeo\xe2\xb9\xa4\xbf\x0e\x10y" + - "\xae\xb4\x0f\xa0F\x91\xe7Q^\xcda\x9c\xde|X\xed" + - "\xef8\x07(=\xf0\x9dKP\xe8\xd02\x0cp\xa5\x8b" + - "\xe6@\xfb\xf0\xd6\x81#Og\xa33\xdb\x9dzGt" + - "\xb8\xb7b+\xbb\xf9\xb4\x0f\xa0\xe6\xe2\xa5\x84\xb3Zg" + - "\x13\xe1\xae\x1b\xd1]i\x89\xfbW\x01'>\"\xa0\xbf" + - "\x92Cw\x03'\xee2\x80\x13w\x08\xc8y\x0b\\t" + - "\x17\xb5\xe2\x96[\x81\x137\x09\xc8{\xfbWt\x97B" + - "\xd3\xfb\xab\x108q\x8d\x80!om\x8d\xeeJI\xbc" + - "\xae\x0f8Q\x150\xec\xadv\xd1\xdd-\x8aWo\x00" + - "N\xec\xf6\xd7\"\xd0\\\xb4\xa3\x05m\x17\xa3\xd0\xe0\xa0" + - "\xb4\x05mwrDw\xa8\x00hA\xdb\x9d\x81\xf9\xd3" + - "\x0d\xc1\x0e\x97\xbb\x00\x80xZ\xb1X\x0b\x0dg\xc5\xfc" + - "\xc7R\x01\x80\x16\x94C\x18\xd8\xa8\x01|\xd9Q'\xc9" + - "\x1a\xce\xa6\x94\xf0C=\xca\xe9\x1eo\x01\x14\x90K\xd3" + - "[\x94G\xb9\x96\x1bq`\x0b\x9d\xce\x0a\x17\xb4q:" + - "L\xf2\xbf\xe6\xc9?H\x03\xcfK<\xca\x87\x03\xe9\xf8" + - "\x06\x11_\xe3Q>\x12\x18x\xde\xa4\x1c=\xcc\xa3|" + - "\xca_\xcf\xfd\xebV\x00\xf9\x14\x8f\xc9\xc0\x00!~N" + - "\x8c\x9fQ\x9bu\xc6\x07,\x8e\x0fa\xdc\x06\x90\x8aP" + - "\xfbM8\xe3C\xa88>\x88\xd8\x03\x90\xaa&\xfa\xb9" + - "\xc1\xf1\xa1\x0e\x17\x03\xa4j\x89>\x09\x07\xbeG\x84\x82" + - "\xe1\x0fXY\xbdw\x9e\xaa\x0d\xd9\x93\xdc}!Zs" + - "\x155[0\x18\xf8-\xb1T$\xda\x02]\xba\xb8H" + - "l]F\xf0K\x11x2hz\x9b\x893x\x09\x8e" + - "\xaac\xb4\x1b\x86\x8eF\xd9\xf09\xc3\x1f>\xbd\xd9s" + - "\xb1\xbfd\x11\xb9\x96\xd2\x96\xa5\xc7\x1f\x97\x1b\xd2J\xc1" + - "d\x83l\x00\x9e\x19\xde\xeb\xdd\\\xae\x17\xb2\x99$\x03" + - "\xc12\xfa\xcb\\0\xe2\x10\x9abq\xb7\xe2D\x9c\x8a" + - "\xe3n\xeb\xd1]\xca\x8b\xd3w\x02'6R\xc5q\x17" + - "\xd0\xe8\xfe\xefE\x9c\xb0\x178q|`/\xea\xfa\xc0" + - "\xd9\x8b\x06S\xbe\xf8\x83\x83\xd1\x81\x0b\xd3\xb3xv\x16" + - "\xdb\xcf\x19d\xfa\x80=\xe2\xa8\xd7o\xde\x7f\x1f\xcb2" + - "\xbd\xf2l\x9f\xf7n#\xf9o\x00\x00\x00\xff\xff2s" + - "\xeb\xfe" +type SessionManager_unregisterUdpSession_Params struct{ capnp.Struct } + +// SessionManager_unregisterUdpSession_Params_TypeID is the unique identifier for the type SessionManager_unregisterUdpSession_Params. +const SessionManager_unregisterUdpSession_Params_TypeID = 0x96b74375ce9b0ef6 + +func NewSessionManager_unregisterUdpSession_Params(s *capnp.Segment) (SessionManager_unregisterUdpSession_Params, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}) + return SessionManager_unregisterUdpSession_Params{st}, err +} + +func NewRootSessionManager_unregisterUdpSession_Params(s *capnp.Segment) (SessionManager_unregisterUdpSession_Params, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}) + return SessionManager_unregisterUdpSession_Params{st}, err +} + +func ReadRootSessionManager_unregisterUdpSession_Params(msg *capnp.Message) (SessionManager_unregisterUdpSession_Params, error) { + root, err := msg.RootPtr() + return SessionManager_unregisterUdpSession_Params{root.Struct()}, err +} + +func (s SessionManager_unregisterUdpSession_Params) String() string { + str, _ := text.Marshal(0x96b74375ce9b0ef6, s.Struct) + return str +} + +func (s SessionManager_unregisterUdpSession_Params) SessionId() ([]byte, error) { + p, err := s.Struct.Ptr(0) + return []byte(p.Data()), err +} + +func (s SessionManager_unregisterUdpSession_Params) HasSessionId() bool { + p, err := s.Struct.Ptr(0) + return p.IsValid() || err != nil +} + +func (s SessionManager_unregisterUdpSession_Params) SetSessionId(v []byte) error { + return s.Struct.SetData(0, v) +} + +// SessionManager_unregisterUdpSession_Params_List is a list of SessionManager_unregisterUdpSession_Params. +type SessionManager_unregisterUdpSession_Params_List struct{ capnp.List } + +// NewSessionManager_unregisterUdpSession_Params creates a new list of SessionManager_unregisterUdpSession_Params. +func NewSessionManager_unregisterUdpSession_Params_List(s *capnp.Segment, sz int32) (SessionManager_unregisterUdpSession_Params_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}, sz) + return SessionManager_unregisterUdpSession_Params_List{l}, err +} + +func (s SessionManager_unregisterUdpSession_Params_List) At(i int) SessionManager_unregisterUdpSession_Params { + return SessionManager_unregisterUdpSession_Params{s.List.Struct(i)} +} + +func (s SessionManager_unregisterUdpSession_Params_List) Set(i int, v SessionManager_unregisterUdpSession_Params) error { + return s.List.SetStruct(i, v.Struct) +} + +func (s SessionManager_unregisterUdpSession_Params_List) String() string { + str, _ := text.MarshalList(0x96b74375ce9b0ef6, s.List) + return str +} + +// SessionManager_unregisterUdpSession_Params_Promise is a wrapper for a SessionManager_unregisterUdpSession_Params promised by a client call. +type SessionManager_unregisterUdpSession_Params_Promise struct{ *capnp.Pipeline } + +func (p SessionManager_unregisterUdpSession_Params_Promise) Struct() (SessionManager_unregisterUdpSession_Params, error) { + s, err := p.Pipeline.Struct() + return SessionManager_unregisterUdpSession_Params{s}, err +} + +type SessionManager_unregisterUdpSession_Results struct{ capnp.Struct } + +// SessionManager_unregisterUdpSession_Results_TypeID is the unique identifier for the type SessionManager_unregisterUdpSession_Results. +const SessionManager_unregisterUdpSession_Results_TypeID = 0xf24ec4ab5891b676 + +func NewSessionManager_unregisterUdpSession_Results(s *capnp.Segment) (SessionManager_unregisterUdpSession_Results, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 0}) + return SessionManager_unregisterUdpSession_Results{st}, err +} + +func NewRootSessionManager_unregisterUdpSession_Results(s *capnp.Segment) (SessionManager_unregisterUdpSession_Results, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 0}) + return SessionManager_unregisterUdpSession_Results{st}, err +} + +func ReadRootSessionManager_unregisterUdpSession_Results(msg *capnp.Message) (SessionManager_unregisterUdpSession_Results, error) { + root, err := msg.RootPtr() + return SessionManager_unregisterUdpSession_Results{root.Struct()}, err +} + +func (s SessionManager_unregisterUdpSession_Results) String() string { + str, _ := text.Marshal(0xf24ec4ab5891b676, s.Struct) + return str +} + +// SessionManager_unregisterUdpSession_Results_List is a list of SessionManager_unregisterUdpSession_Results. +type SessionManager_unregisterUdpSession_Results_List struct{ capnp.List } + +// NewSessionManager_unregisterUdpSession_Results creates a new list of SessionManager_unregisterUdpSession_Results. +func NewSessionManager_unregisterUdpSession_Results_List(s *capnp.Segment, sz int32) (SessionManager_unregisterUdpSession_Results_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 0}, sz) + return SessionManager_unregisterUdpSession_Results_List{l}, err +} + +func (s SessionManager_unregisterUdpSession_Results_List) At(i int) SessionManager_unregisterUdpSession_Results { + return SessionManager_unregisterUdpSession_Results{s.List.Struct(i)} +} + +func (s SessionManager_unregisterUdpSession_Results_List) Set(i int, v SessionManager_unregisterUdpSession_Results) error { + return s.List.SetStruct(i, v.Struct) +} + +func (s SessionManager_unregisterUdpSession_Results_List) String() string { + str, _ := text.MarshalList(0xf24ec4ab5891b676, s.List) + return str +} + +// SessionManager_unregisterUdpSession_Results_Promise is a wrapper for a SessionManager_unregisterUdpSession_Results promised by a client call. +type SessionManager_unregisterUdpSession_Results_Promise struct{ *capnp.Pipeline } + +func (p SessionManager_unregisterUdpSession_Results_Promise) Struct() (SessionManager_unregisterUdpSession_Results, error) { + s, err := p.Pipeline.Struct() + return SessionManager_unregisterUdpSession_Results{s}, err +} + +const schema_db8274f9144abc7e = "x\xda\xccY}p\x15\xe5\xd5?g\xf7\xdelB>" + + "nv\xf6BHF\xdf\xbc/\x03\xe3K\x14\x14(\x1d" + + "\xa0\xda\x04L\xa8\x89|d\xef\x85\x8e\x05t\xdc\xdc\xfb" + + "\x106\xbdw\xf7\xb2\xbb7\x12\x04\xf9\x10D\x1c\xbf@" + + "PD\xa9\x88\xd3vDm\xa1j\xad\x1d\x9dJ\xeb\xe7" + + "(*\x0etPqZD\xfa\xc1`\xad\x88uh\xd5" + + "\xed\x9c\xdd\xbb\x1f\xb9\x09I\x90\xfe\xd1\xff\x92\xb3\xcfs" + + "\x9es~\xe7\xf7\x9cs\x9es/\x9bY\xda\xc4M\x88" + + "\xd6T\x02\xc8\xdb\xa2%6kxg\xf9\xce1\xbf[" + + "\x0br\x1d\xa2}\xd3sm\xf13\xd6\xda\xf7!\xca\x0b" + + "\x00\x93\x96\x96,Gi}\x89\x00 \xad)\xf93\xa0" + + "}\xcb\x88=\x0f\xfd\xb8e\xcb\xcd \xd6\xf1\xc1b\xc0" + + "ILhC\xa9G\xa0\x95ya\x83t\x88\xfe\xb2\xaf" + + "\x16/]\x18\x7f\xfbMZ\x1dV\x1d!\xd5\xcf\x0b\x0d" + + "(\xedw6\xbc&\x90\xea\xcb\xb3o\xed\xfa\xf6\xd6\xd7" + + "\xd7\x81X\xc7\xf5R\xfdt\xe9r\x94^+\xa5\x95/" + + "\x95\xce\x05\xb4?\xdb2\xf2\xb1\x87\xdf|u=\x88\x17" + + "!\x14,\xfd\xa0\xf4=\x04\x94>-\xfd9\xa0\xbd\xff" + + "\xf3\x85\xa7\x9fzy\xf2- \x8e\xa5\x05H\x0b6\x95" + + "\x8d\xe2\x00\xa5G\xcb\x1a\x01\xed\x13'\xff\xb5\xe1\xc6\xb1" + + "s\xee\x06y,\xd2\x0a\x8eV\xbcVVG+\x8e\x96" + + "\x91\x8a\xc6\x99\xfb\x9f\xad\x9bt\xef\x96\"\xd3\x9d\x85+" + + "\x875\xa0t\xc702h\xe3\xb0\x1b\x00\xed\x7fT=" + + "\xf0f\xfe\xcag\xee\x0d\x9f\xf7\xf1\xb0\x06\xd2\x16-\xa7" + + "\xf3Fu\x8f\xb9\xfe\xb7/=y\x1f\xc8\xe3\x10\xed#" + + "\x1d\x17\x1f\xe2w\xec~\x1f\xe6\xa3\x80\x1c\xc0\xa4\xb1\xe5" + + "\xbb\xc8\xf8\xa9\xe5\xa4\xec\xadK\x9e\xfb\xf5\xddOnx" + + "\x00\xe4\x8b\xc86\x07\xac\x1d\xe5\xff\xa4\x05{\x1de[" + + "\x0e??'\xbbi\xfb.\xd7}\xe7\xfb\xbb\xe5\x1c\x07" + + "\x11{]\xeb\x17\xd9\xf9\x8f$\x1f)\x00\x13\xa5O\xfb" + + "\xcbO!\xe0\xa4\xa3\xe5\xf5\x08hO~\xef\xf8\xdc\xd9" + + "\xbfX\xfc\xd3\xd0\xde\xaf*\x96\xd3\xde\x0d\x8bO\xed\xab" + + "Nd\x1f+r\xd8\xf1\xe5L\xc5n\x94\xc4Jr\xb8" + + "\xb2\x92Lx\xe2\x7f\xae.[v|\xe6\x1e\x10\xc7y" + + "j\xc6U&HM\xe4Z\xfeke\xdbo\x9e*\xa6" + + "\x93\x03\xdc\xd8\xca\x0e\x94\xae =\x93\xa6V:\xf6\xdc" + + "\xb6o\xfb\xc5\xa5\x0f}\xf6t\x7f0+U\x1d(\xe5" + + "\xab\xe8\xd4\xa5U\x84\xcc\xf0V<\xf2\xc2\x84\xc83\xe1" + + "\xb8\x1f\xa8:A\xc8\x1c\xaf\xa2\xa0]\xf8\xf1\x8cJ\xed" + + "\x93\xb5/\x14is\x16\xae\x8f\xb5\xa1t\x7f\x8c\xb4m" + + "\x8d\xd1\xe2\xb6\x85\xf7l\x8e\x1e\xbf\xe7\x15\xb24D\xb8" + + "(\x11m\xd2\x84j\x03\xa5\x96j\xfaszu\x0d\x0f" + + "h\xd7\xed\xf9\xce\xcff\xa4\xdf}\xbd\x1fK\xa5}\xd2" + + ")i\xbf\xe4PY\"C\x8f\x8d\xdb{\xe3_\xef8" + + "p\xb0`\xa8\x83\xe1\x98\xb8\x13\xc2\xa9q\xc2\xcfg@" + + "\x11J\xce\xca\x1f\xc4\xbbP\xca\xc6I\x9d\xea\xac\xe6\x8e" + + "+\xb5\xab\x7f\xff\xdd#\xa1\xa0e\xe3\x1f\"D\xec9" + + "\xdf_\xd8U\xb6\xf2\xd8\xb1\xf0AJ\xdcA$\xefl" + + "\xfd\xdbON\xdcu2\x9b\xfe\x93C<\x0f\xb3\xad\xf1" + + "iD\xcd'\xe2t\xedj\xea+[F\x1dn?\xe1" + + "\x86\xd2U\xb1q\xf8\x0cZ\xf0\xf0pR1\xf9\xfa\xe9" + + "l\xd1\x94kN\xf4\xb9\xf2\xfb\x86OC\xe9\xc0p\x87" + + "d\xc37\xa0t|D\x0d\x80\xdd\xfd\xcbM\xd7<\xf6" + + "\xe2\x9cS\xee]p\x8c=4b\"Q\xe3\xce\x9b\x9a" + + "\xe7N\x1d\xb5\xefT\xd8\xd8\xfd#\x88\x9d\xd2\xd1\x11t" + + "\xd2\xe2)'\xbf7\xe6\xce\x97O\xf5GA\xaci@" + + "I\xacq(X\xd3\x08\xf8\xc9\xcc\x1f\x1d\xac\x8b\xd5\x9d" + + ".\x02\xb0\xc4\x09^M\x17J-5N\xf0j^!" + + "\x9a\xdd\xf2\xfeu\xcb\xde\xb9\xf9\xb3\xcf\x8bc\xed\xa8\x9e" + + "\\\x9b@\xa9\xb5\x96T\xb7\xd4\x123\xee\x9b\xf7\x97U" + + "'\xb7\x8e\xf8\xa2\x8f\xc7\xc7k\xbbP:\xe3\xac\xfc\xbc" + + "v\x834\xbf\x8e\x92\xdc\xdb\xc2#\x13\x9aW\xbd~&" + + "t\x17\xae\xa8k#\x87\xef\x15\x1e<\xb6\xfa\x0f\xd7}" + + "\x19vxj\xdd\x87\xe4\xf0\xec:rx\xc5'\xf7_" + + "u\xd7\xa2\xc7\xbf\x0e\x07\xb6n-m\xb5\xf2\x9a\xc62" + + "F.\x92\xba\xd4\xfb35>\xa5\xe4\xb4\xdc\xb4\xe9y" + + "k\x09\xd3,5\xa5X,\xc1\x1a\xcd\x9c\xae\x99\xac\x1d" + + "Q\xae\xe6#\x00\x11\x04\x10\x95.\x00\xf9z\x1e\xe5\x0c" + + "\x87\"b\x9cB/\xaa$\\\xc2\xa3lq(r\\" + + "\x9c2\x8f\xb8t\x14\x80\x9c\xe1Q^\xc6!\xf2q\xe4" + + "\x01\xc4\xfcf\x00y\x19\x8f\xf2:\x0e\xed\x1c3\xb2\x8a" + + "\xc64\x88Y-\x86\x81\x15\xc0a\x05\xa0m0\xcb\xe8" + + "Q:2\x10c!\xb1\xd0u\x83\x85\x95\xc0a%\xa0" + + "\xbdD\xcf\x1b\xe6|\xcdB5\x93`\x8b\x0df\xe2\x12" + + ",\x01\x0eK\x00\x07r/\xc9LS\xd5\xb5\xd9\x8a\xa6" + + "t2\x03\x80<+\xe5\xa3\x00~\xd2F/\xbd\x8b\x13" + + "\xb6\x03'\x8e\x130\xc8\xc0\xe8\xd1O\xfc\xbf\xdd\xc0\x89" + + "\x17\x0a\xb6\xc1:U\xd3b\x06\xceO\xe7\x1c\xdd\xbc\xae" + + "5\xa1\x9d\xd7\xdc\x0f\xc8\x0c\xf7C\x8cNm\xc2v\x0c" + + "\xac\xe3\xfbZweFe\x9a\x15k\xd5\x16\xebE\x90" + + "\xb7\xf5\x07y[\x01\xf2u!\xc8\xd7\xcc\x00\x90W\xf0" + + "(\xdf\xca\xa1\xc8\x170_\xdf\x00 \xaf\xe6Q\xbe\x9d" + + "C;\xe5\x1c\xd2\x9a\x06\x00\x1f\xcd\xc5L\xb1\xf2\x063" + + "IV\x05\xd8\xce\xa3\x03z\x15\xe0\xaanf\x90\xed^" + + "\x10b\x8a\x91Z\xe2\x07j\x00\xa4[\x96\xa9\xa6\xa5j" + + "\x9d\xf3\x1cyc\xbb\x9eQS=\xe4U\x85c\xe7\x85" + + "\xd3\x00\x10\xc5\xe1\x0b\x00\x90\x13\xc5\x19\x00\x8dj\xa7\xa6" + + "\x1b\xccN\xabfJ\xd74\x06|\xcaZ\xd5\xa1d\x14" + + "-\xc5\xfc\x83J\xfa\x1e\xe4\x1e\x90dF73\xc6+" + + "!\xfa\x8enW\x0c\x85\xcf\x9ar\x85\x8fc\xcb\x02\x00" + + "\xb9\x99G\xb9=\x84\xe3l\xc2q\x16\x8f\xf25!\x1c" + + "\xe7\x13\x8e\xed<\xca\x8b8\xb4uC\xedT\xb5+\x19" + + "\xf0F\x98\x81\xa6\xa5)YF\x98\x15\xf0X\xa5\xe7," + + "U\xd7L\xac\x0e\xf2? V\x87\x90\x12\x06\xe3\xe4x" + + "\x8fR\x1e\xa3tmt\x82\x99y!c\x99r\xc4\xf7" + + "\xa4r\x1a\x80\\\xca\xa3\x1c\xe7\xb0\xd1`f>ca" + + "uPf\xff\x13\xa7\xf6\x03_\xa2?\xf8&\x02\xc8W" + + "\xf1(\xcf\xe3\x10\x0b\xe8\xc93\x02Hm\xd3\xd5\xd7\x0a" + + "\x98\xf6\xc0\xabO\x9bVk\xce\xfboU\xda\xb4\xdau" + + "\xc3B\x018\x14`\xc0+\xe2F;Fi\xca\xbd\xbb" + + "\x9emc)\xb4\xff\xcf\xa3\xfc\xad\x90m\x13(+]" + + "\xc6\xa3|9\x87\xb6\x92J\xe9y\xcd\x9a\x07\xbc\xd2Y" + + "\xc4\xe0$\x83X\xca`Ap\x87\x0e\x9cw\xd5\x8b\xa0" + + "\x8b\x19J\xb6W\xbc\x08\xba\x0a\x1e\xe5\x91\xfd#\xe2\x9f" + + "\x18\xed'-\xd0uH\x11\xb3\x12\xccM\xc8\xe3\x0df" + + "\x0a\xf9\x8cE\xfeW\xd8\xb6\x0b\x00\xc5a4\x8f\xf2e" + + "\x1cV\xe2\xd7\xb6\x8b\xc0\xb8\xcd\x01\x02\xf5\xcc0t\x03" + + "\xab\x83\x82U\xa0I\xaap\x00\xeaZ3\xb3\x145\x83" + + "Da\xbf{*\"\xd3`w0@\xc4\x15\x8fn$" + + "&\xf5Fc;\x80\\\xcd\xa3|\x01\x87v\xa7\xa1\xa4" + + "X;3P\xd5\xd3s\x14MO\xf2,\x85Q\xe00" + + "\x1a:\xb4\xea\\\x0fM8w\xc2\x04\x7f\xd7\xc0\xfb\x0d" + + "V\x00\xa1\xb0\xbd\xbd\xde\xb59\xee\xdb\xbcrTP\xb8" + + "|\x82\xad\xe9\x082\xab\x9f;6\x12\x15o\xe5Q\xde" + + "\x12\xca\xc1\x9b(\xcb\xdc\xcd\xa3\xfc \x87b$\x12\xc7" + + "\x08\x80x?\xdd\x93-<\xca;\xb9\xde\xe5\x8du3" + + "\xcdjV;A`f %\x13\x9b\xd5N\x06\xbcy" + + "\xbey\xa8t\x10<\xf4\x0eS\xcf0\x8b5\xb3TF" + + "1\x14K\xedf\xee\xf7\x02\x19\xbd\xa0\x0e\xc4\xdbD\x9f" + + "\x8bA\xfc\x8dy\x1dE\x88\x0e\xa3\x82d&\xb0P#" + + "0\x80\xb5\xaer\xb2L\xd7\xfap \xb81\x05\x1e\xa0" + + "9P\xad\x0a\x96\xcf\xcdY\xaa\xa0k&\xd9\x17\x0a\xfd" + + "\xb4\xfeBo\x04\xa1\xf7\xf2\xde\xc6\xb5\xe1\xc8c!\xf2" + + "\xdb\x83 \x8b\x11\xce\x8d\xfc\x8e]\x00\xf2N\x1e\xe5\xc7" + + "9ltK2V\x07O\xdaB\xb4\xdc\xc23K\x87" + + "\xfa\x94\x92\x09\x12\xa6m\xb0\\FI\xb1\x16,\x14Y" + + "@\x04\x0e\xd1\xa1H6g0\xd3DU\xd7\xe4\xbc\x92" + + "Qy\xab\xc7o\x8c\xb4|\xb6\xdd`\xdd*\xeays" + + "\xbae\xb1\xac\x90\xb3\xcc\xa1\xb4M\x01@\x94\x1f\x045" + + "c\x16%\xdf\x86 \xf7\xf8\x00\x8d\xa3\xe4{\x09\x8f\xf2" + + "\x14\x0ec\xf9\xbc\x1a\xe4\xba\x8c\x9er\xe2\x06\xb19J" + + "\x96\xf5\x89v\xc9\xa0w\xb5\xd7M\xf7\x92\xed\x7fS\x99" + + "\x1f\xb8\xb3&\xd7\x9d\xd63d2]\x81&\x1e\xe5Y" + + "!\x93['\x86\xfc\xf0L\x9e\xdd\x11\xf8!\xfc\x90\xf5" + + "xV\xd5\xb3,en\x0f\xcc\x823\xd3A\xb8:X" + + "3\x90}\xe1\x0b57W\xefxH6N\xf1l\x94" + + "z\xb0\x0d \xb9\x0cyL\xae\xc3\xc0Li\x0d\xce\x00" + + "H\xae \xf9\xad\x18X*\xad\xc7:\x80\xe4j\x92\xdf" + + "\x8e\xfe\x0b@\xda\x88\xbb\x01\x92\xb7\x93x\x1b-\x8f\xf0" + + "\xce\x95\x90\xb6:\xea\xb7\x90|'\xc9\xa3\x918F\x01" + + "\xa4\x1d\xd8\x00\x90\xdcF\xf2\xa7H^\xc2\xc5\xb1\x04@" + + "\xda\x8b]\x00\xc9=$\x7f\x8e\xe4B4N\x8f \xe9" + + "Y4\x00\x92\xbf\"\xf9\x8b$/\x1d\x19\xc7RzG" + + ";\xf2\x17H\xfe\x06\xc9\xcbj\xe3XF\xafj\\\x0b" + + "\x90|\x95\xe4\x07I>\x0c\xe38\x0c@:\x80\xdb\x01" + + "\x92\x07I\xfeG\x92\x97\x97\xc4\xb1\x1c@\xfa\xc0\xb1\xe7" + + "0\xc9?\"yE$\x8e\x15\x00\xd2Q\xdc\x05\x90\xfc" + + "\x88\xe4\x7f'y\xa5\x10\xc7J\x00\xe9c\xc7\xaf\x93$" + + "/\xe5\x8a\x1ap\x8fQE]6\xaf\x9b~\xc8X\xe1" + + "\x8e\xa3K\xf7v=F\x9d4\xc6\x82\x91\x16 \xc6\x00" + + "\xed\x9c\xaeg\xe6\xf4fj\xccR:M\xaf\xa3\xaf\x0e" + + "\xa6\x0c\x80$\xf4\xeb>\xc4t\xad5\xed'\x82\xe2\xac" + + "\xe3Y\xa2\x9a\xd3\xf3\x96\x9e\xcfA}Z\xb1X\xda\xcf" + + "9F^\x9bi\xe8\xd9y\xc8\x8c\xac\xaa)\x99A\xb2" + + "Q\x19pX\x06\x85\x94\xe0\xe9\x1e85\x9d\xfd}\xe2" + + "3\x9a+ft}n\xda<\xa5s(yjb\xd0" + + "9\xc6\xb4PB\xaa\xefV2\xf9o\x92\x9ez\xb7\x12" + + "\x89F\xb7\x15\x19\xac{\xf7\x86\x0e\x83\xa7\x92\xde\x0da" + + "\xef\x82\x8a\xa1y \x9d\xc3\x15\xf4\x0f\xd9\xfcNf\xb9" + + "\x7f\xd13\x94\x1e\x01B\xb8\xcc\x9f\xdb\xee\x043cC" + + "q=\x18\xce\x0c\xfep\xe9\xa7\xf0\xf7S\xf6\xbd\x9e3" + + "\xf4\x86\xa6\xd8/\xe2Q^\x12\x8a=\xa3\xa2\x90\xe6Q" + + "\xce\x05E<\x9b\x08\xa6\x16\"\xcf\x15\xc6\x16T(r" + + "<\xca+8\x8c\xd1+\x13\xab\x83)n/\xa3{\xbf" + + "\xac\x89\x0a\xadZ\x9a\x01.\xf3\xd8\x1c*\x1f\xfe" + + "\xa3^\xf7\x83\xc3\xd1\xde\xa3\xde\xf3x\xbe\xbae,\x94" + + "1\xcei\x02:\xe4\xc1\xa1\xff;m\xd1M/;\xdf" + + "1\x81W\x90\xfe\x1d\x00\x00\xff\xff#\xafZ\xc1" func init() { schemas.Register(schema_db8274f9144abc7e, @@ -3887,6 +4059,7 @@ func init() { 0x8635c6b4f45bf5cd, 0x904e297b87fbecea, 0x9496331ab9cd463f, + 0x96b74375ce9b0ef6, 0x97b3c5c260257622, 0x9b87b390babc2ccf, 0xa29a916d4ebdd894, @@ -3907,6 +4080,7 @@ func init() { 0xe6646dec8feaa6ee, 0xea50d822450d1f17, 0xea58385c65416035, + 0xf24ec4ab5891b676, 0xf2c122394f447e8e, 0xf2c68e2547ec3866, 0xf41a0f001ad49e46,