TUN-2551: TunnelRPC definitions for ReconnectTunnel flow

This commit is contained in:
Nick Vollmar 2019-11-18 13:56:04 -06:00
parent ca7fbf43da
commit 0676923d24
5 changed files with 620 additions and 239 deletions

View File

@ -0,0 +1,70 @@
package pogs
import (
"context"
"github.com/cloudflare/cloudflared/tunnelrpc"
"zombiezen.com/go/capnproto2/server"
)
func (i TunnelServer_PogsImpl) ReconnectTunnel(p tunnelrpc.TunnelServer_reconnectTunnel) error {
jwt, err := p.Params.Jwt()
if err != nil {
return err
}
hostname, err := p.Params.Hostname()
if err != nil {
return err
}
options, err := p.Params.Options()
if err != nil {
return err
}
pogsOptions, err := UnmarshalRegistrationOptions(options)
if err != nil {
return err
}
server.Ack(p.Options)
registration, err := i.impl.ReconnectTunnel(p.Ctx, jwt, hostname, pogsOptions)
if err != nil {
return err
}
result, err := p.Results.NewResult()
if err != nil {
return err
}
return MarshalTunnelRegistration(result, registration)
}
func (c TunnelServer_PogsClient) ReconnectTunnel(
ctx context.Context,
jwt []byte,
hostname string,
options *RegistrationOptions,
) (*TunnelRegistration, error) {
client := tunnelrpc.TunnelServer{Client: c.Client}
promise := client.ReconnectTunnel(ctx, func(p tunnelrpc.TunnelServer_reconnectTunnel_Params) error {
err := p.SetJwt(jwt)
if err != nil {
return err
}
err = p.SetHostname(hostname)
if err != nil {
return err
}
registrationOptions, err := p.NewOptions()
if err != nil {
return err
}
err = MarshalRegistrationOptions(registrationOptions, options)
if err != nil {
return err
}
return nil
})
retval, err := promise.Result().Struct()
if err != nil {
return nil, err
}
return UnmarshalTunnelRegistration(retval)
}

View File

@ -33,11 +33,12 @@ func UnmarshalAuthentication(s tunnelrpc.Authentication) (*Authentication, error
}
type TunnelRegistration struct {
Err string
Url string
LogLines []string
PermanentFailure bool
TunnelID string `capnp:"tunnelID"`
Err string
Url string
LogLines []string
PermanentFailure bool
TunnelID string `capnp:"tunnelID"`
RetryAfterSeconds uint16
}
func MarshalTunnelRegistration(s tunnelrpc.TunnelRegistration, p *TunnelRegistration) error {
@ -63,6 +64,7 @@ type RegistrationOptions struct {
RunFromTerminal bool `capnp:"runFromTerminal"`
CompressionQuality uint64 `capnp:"compressionQuality"`
UUID string `capnp:"uuid"`
NumPreviousAttempts uint8
}
func MarshalRegistrationOptions(s tunnelrpc.RegistrationOptions, p *RegistrationOptions) error {
@ -328,6 +330,7 @@ type TunnelServer interface {
UnregisterTunnel(ctx context.Context, gracePeriodNanoSec int64) error
Connect(ctx context.Context, parameters *ConnectParameters) (ConnectResult, error)
Authenticate(ctx context.Context, originCert []byte, hostname string, options *RegistrationOptions) (*AuthenticateResponse, error)
ReconnectTunnel(ctx context.Context, jwt []byte, hostname string, options *RegistrationOptions) (*TunnelRegistration, error)
}
func TunnelServer_ServerToClient(s TunnelServer) tunnelrpc.TunnelServer {

View File

@ -11,6 +11,36 @@ import (
capnp "zombiezen.com/go/capnproto2"
)
func TestTunnelRegistration(t *testing.T) {
testCases := []*TunnelRegistration{
&TunnelRegistration{
Err: "it broke",
Url: "asdf.cftunnel.com",
LogLines: []string{"it", "was", "broken"},
PermanentFailure: true,
TunnelID: "asdfghjkl;",
RetryAfterSeconds: 19,
},
}
for i, testCase := range testCases {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
capnpEntity, err := tunnelrpc.NewTunnelRegistration(seg)
if !assert.NoError(t, err) {
t.Fatal("Couldn't initialize a new message")
}
err = MarshalTunnelRegistration(capnpEntity, testCase)
if !assert.NoError(t, err, "testCase #%v failed to marshal", i) {
continue
}
result, err := UnmarshalTunnelRegistration(capnpEntity)
if !assert.NoError(t, err, "testCase #%v failed to unmarshal", i) {
continue
}
assert.Equal(t, testCase, result, "testCase index %v didn't preserve struct through marshalling and unmarshalling", i)
}
}
func TestConnectResult(t *testing.T) {
testCases := []ConnectResult{
&ConnectError{

View File

@ -19,6 +19,8 @@ struct TunnelRegistration {
permanentFailure @3 :Bool;
# Displayed to user
tunnelID @4 :Text;
# How long should this connection wait to retry in seconds, if the error wasn't permanent
retryAfterSeconds @5 :UInt16;
}
struct RegistrationOptions {
@ -44,6 +46,8 @@ struct RegistrationOptions {
# cross stream compression setting, 0 - off, 3 - high
compressionQuality @10 :UInt64;
uuid @11 :Text;
# number of previous attempts to send RegisterTunnel/ReconnectTunnel
numPreviousAttempts @12 :UInt8;
}
struct CapnpConnectParameters {
@ -287,6 +291,7 @@ interface TunnelServer {
unregisterTunnel @2 (gracePeriodNanoSec :Int64) -> ();
connect @3 (parameters :CapnpConnectParameters) -> (result :ConnectResult);
authenticate @4 (originCert :Data, hostname :Text, options :RegistrationOptions) -> (result :AuthenticateResponse);
reconnectTunnel @5 (jwt :Data, hostname :Text, options :RegistrationOptions) -> (result :TunnelRegistration);
}
interface ClientService {

View File

@ -234,6 +234,14 @@ func (s TunnelRegistration) SetTunnelID(v string) error {
return s.Struct.SetText(3, v)
}
func (s TunnelRegistration) RetryAfterSeconds() uint16 {
return s.Struct.Uint16(2)
}
func (s TunnelRegistration) SetRetryAfterSeconds(v uint16) {
s.Struct.SetUint16(2, v)
}
// TunnelRegistration_List is a list of TunnelRegistration.
type TunnelRegistration_List struct{ capnp.List }
@ -468,6 +476,14 @@ func (s RegistrationOptions) SetUuid(v string) error {
return s.Struct.SetText(6, v)
}
func (s RegistrationOptions) NumPreviousAttempts() uint8 {
return s.Struct.Uint8(4)
}
func (s RegistrationOptions) SetNumPreviousAttempts(v uint8) {
s.Struct.SetUint8(4, v)
}
// RegistrationOptions_List is a list of RegistrationOptions.
type RegistrationOptions_List struct{ capnp.List }
@ -2845,6 +2861,26 @@ func (c TunnelServer) Authenticate(ctx context.Context, params func(TunnelServer
}
return TunnelServer_authenticate_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}
func (c TunnelServer) ReconnectTunnel(ctx context.Context, params func(TunnelServer_reconnectTunnel_Params) error, opts ...capnp.CallOption) TunnelServer_reconnectTunnel_Results_Promise {
if c.Client == nil {
return TunnelServer_reconnectTunnel_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{
InterfaceID: 0xea58385c65416035,
MethodID: 5,
InterfaceName: "tunnelrpc/tunnelrpc.capnp:TunnelServer",
MethodName: "reconnectTunnel",
},
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 3}
call.ParamsFunc = func(s capnp.Struct) error { return params(TunnelServer_reconnectTunnel_Params{Struct: s}) }
}
return TunnelServer_reconnectTunnel_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}
type TunnelServer_Server interface {
RegisterTunnel(TunnelServer_registerTunnel) error
@ -2856,6 +2892,8 @@ type TunnelServer_Server interface {
Connect(TunnelServer_connect) error
Authenticate(TunnelServer_authenticate) error
ReconnectTunnel(TunnelServer_reconnectTunnel) error
}
func TunnelServer_ServerToClient(s TunnelServer_Server) TunnelServer {
@ -2865,7 +2903,7 @@ func TunnelServer_ServerToClient(s TunnelServer_Server) TunnelServer {
func TunnelServer_Methods(methods []server.Method, s TunnelServer_Server) []server.Method {
if cap(methods) == 0 {
methods = make([]server.Method, 0, 5)
methods = make([]server.Method, 0, 6)
}
methods = append(methods, server.Method{
@ -2938,6 +2976,20 @@ func TunnelServer_Methods(methods []server.Method, s TunnelServer_Server) []serv
ResultsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 1},
})
methods = append(methods, server.Method{
Method: capnp.Method{
InterfaceID: 0xea58385c65416035,
MethodID: 5,
InterfaceName: "tunnelrpc/tunnelrpc.capnp:TunnelServer",
MethodName: "reconnectTunnel",
},
Impl: func(c context.Context, opts capnp.CallOptions, p, r capnp.Struct) error {
call := TunnelServer_reconnectTunnel{c, opts, TunnelServer_reconnectTunnel_Params{Struct: p}, TunnelServer_reconnectTunnel_Results{Struct: r}}
return s.ReconnectTunnel(call)
},
ResultsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 1},
})
return methods
}
@ -2981,6 +3033,14 @@ type TunnelServer_authenticate struct {
Results TunnelServer_authenticate_Results
}
// TunnelServer_reconnectTunnel holds the arguments for a server call to TunnelServer.reconnectTunnel.
type TunnelServer_reconnectTunnel struct {
Ctx context.Context
Options capnp.CallOptions
Params TunnelServer_reconnectTunnel_Params
Results TunnelServer_reconnectTunnel_Results
}
type TunnelServer_registerTunnel_Params struct{ capnp.Struct }
// TunnelServer_registerTunnel_Params_TypeID is the unique identifier for the type TunnelServer_registerTunnel_Params.
@ -3808,6 +3868,207 @@ func (p TunnelServer_authenticate_Results_Promise) Result() AuthenticateResponse
return AuthenticateResponse_Promise{Pipeline: p.Pipeline.GetPipeline(0)}
}
type TunnelServer_reconnectTunnel_Params struct{ capnp.Struct }
// TunnelServer_reconnectTunnel_Params_TypeID is the unique identifier for the type TunnelServer_reconnectTunnel_Params.
const TunnelServer_reconnectTunnel_Params_TypeID = 0xa353a3556df74984
func NewTunnelServer_reconnectTunnel_Params(s *capnp.Segment) (TunnelServer_reconnectTunnel_Params, error) {
st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 3})
return TunnelServer_reconnectTunnel_Params{st}, err
}
func NewRootTunnelServer_reconnectTunnel_Params(s *capnp.Segment) (TunnelServer_reconnectTunnel_Params, error) {
st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 3})
return TunnelServer_reconnectTunnel_Params{st}, err
}
func ReadRootTunnelServer_reconnectTunnel_Params(msg *capnp.Message) (TunnelServer_reconnectTunnel_Params, error) {
root, err := msg.RootPtr()
return TunnelServer_reconnectTunnel_Params{root.Struct()}, err
}
func (s TunnelServer_reconnectTunnel_Params) String() string {
str, _ := text.Marshal(0xa353a3556df74984, s.Struct)
return str
}
func (s TunnelServer_reconnectTunnel_Params) Jwt() ([]byte, error) {
p, err := s.Struct.Ptr(0)
return []byte(p.Data()), err
}
func (s TunnelServer_reconnectTunnel_Params) HasJwt() bool {
p, err := s.Struct.Ptr(0)
return p.IsValid() || err != nil
}
func (s TunnelServer_reconnectTunnel_Params) SetJwt(v []byte) error {
return s.Struct.SetData(0, v)
}
func (s TunnelServer_reconnectTunnel_Params) Hostname() (string, error) {
p, err := s.Struct.Ptr(1)
return p.Text(), err
}
func (s TunnelServer_reconnectTunnel_Params) HasHostname() bool {
p, err := s.Struct.Ptr(1)
return p.IsValid() || err != nil
}
func (s TunnelServer_reconnectTunnel_Params) HostnameBytes() ([]byte, error) {
p, err := s.Struct.Ptr(1)
return p.TextBytes(), err
}
func (s TunnelServer_reconnectTunnel_Params) SetHostname(v string) error {
return s.Struct.SetText(1, v)
}
func (s TunnelServer_reconnectTunnel_Params) Options() (RegistrationOptions, error) {
p, err := s.Struct.Ptr(2)
return RegistrationOptions{Struct: p.Struct()}, err
}
func (s TunnelServer_reconnectTunnel_Params) HasOptions() bool {
p, err := s.Struct.Ptr(2)
return p.IsValid() || err != nil
}
func (s TunnelServer_reconnectTunnel_Params) SetOptions(v RegistrationOptions) error {
return s.Struct.SetPtr(2, v.Struct.ToPtr())
}
// NewOptions sets the options field to a newly
// allocated RegistrationOptions struct, preferring placement in s's segment.
func (s TunnelServer_reconnectTunnel_Params) NewOptions() (RegistrationOptions, error) {
ss, err := NewRegistrationOptions(s.Struct.Segment())
if err != nil {
return RegistrationOptions{}, err
}
err = s.Struct.SetPtr(2, ss.Struct.ToPtr())
return ss, err
}
// TunnelServer_reconnectTunnel_Params_List is a list of TunnelServer_reconnectTunnel_Params.
type TunnelServer_reconnectTunnel_Params_List struct{ capnp.List }
// NewTunnelServer_reconnectTunnel_Params creates a new list of TunnelServer_reconnectTunnel_Params.
func NewTunnelServer_reconnectTunnel_Params_List(s *capnp.Segment, sz int32) (TunnelServer_reconnectTunnel_Params_List, error) {
l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 3}, sz)
return TunnelServer_reconnectTunnel_Params_List{l}, err
}
func (s TunnelServer_reconnectTunnel_Params_List) At(i int) TunnelServer_reconnectTunnel_Params {
return TunnelServer_reconnectTunnel_Params{s.List.Struct(i)}
}
func (s TunnelServer_reconnectTunnel_Params_List) Set(i int, v TunnelServer_reconnectTunnel_Params) error {
return s.List.SetStruct(i, v.Struct)
}
func (s TunnelServer_reconnectTunnel_Params_List) String() string {
str, _ := text.MarshalList(0xa353a3556df74984, s.List)
return str
}
// TunnelServer_reconnectTunnel_Params_Promise is a wrapper for a TunnelServer_reconnectTunnel_Params promised by a client call.
type TunnelServer_reconnectTunnel_Params_Promise struct{ *capnp.Pipeline }
func (p TunnelServer_reconnectTunnel_Params_Promise) Struct() (TunnelServer_reconnectTunnel_Params, error) {
s, err := p.Pipeline.Struct()
return TunnelServer_reconnectTunnel_Params{s}, err
}
func (p TunnelServer_reconnectTunnel_Params_Promise) Options() RegistrationOptions_Promise {
return RegistrationOptions_Promise{Pipeline: p.Pipeline.GetPipeline(2)}
}
type TunnelServer_reconnectTunnel_Results struct{ capnp.Struct }
// TunnelServer_reconnectTunnel_Results_TypeID is the unique identifier for the type TunnelServer_reconnectTunnel_Results.
const TunnelServer_reconnectTunnel_Results_TypeID = 0xd4d18de97bb12de3
func NewTunnelServer_reconnectTunnel_Results(s *capnp.Segment) (TunnelServer_reconnectTunnel_Results, error) {
st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
return TunnelServer_reconnectTunnel_Results{st}, err
}
func NewRootTunnelServer_reconnectTunnel_Results(s *capnp.Segment) (TunnelServer_reconnectTunnel_Results, error) {
st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
return TunnelServer_reconnectTunnel_Results{st}, err
}
func ReadRootTunnelServer_reconnectTunnel_Results(msg *capnp.Message) (TunnelServer_reconnectTunnel_Results, error) {
root, err := msg.RootPtr()
return TunnelServer_reconnectTunnel_Results{root.Struct()}, err
}
func (s TunnelServer_reconnectTunnel_Results) String() string {
str, _ := text.Marshal(0xd4d18de97bb12de3, s.Struct)
return str
}
func (s TunnelServer_reconnectTunnel_Results) Result() (TunnelRegistration, error) {
p, err := s.Struct.Ptr(0)
return TunnelRegistration{Struct: p.Struct()}, err
}
func (s TunnelServer_reconnectTunnel_Results) HasResult() bool {
p, err := s.Struct.Ptr(0)
return p.IsValid() || err != nil
}
func (s TunnelServer_reconnectTunnel_Results) SetResult(v TunnelRegistration) error {
return s.Struct.SetPtr(0, v.Struct.ToPtr())
}
// NewResult sets the result field to a newly
// allocated TunnelRegistration struct, preferring placement in s's segment.
func (s TunnelServer_reconnectTunnel_Results) NewResult() (TunnelRegistration, error) {
ss, err := NewTunnelRegistration(s.Struct.Segment())
if err != nil {
return TunnelRegistration{}, err
}
err = s.Struct.SetPtr(0, ss.Struct.ToPtr())
return ss, err
}
// TunnelServer_reconnectTunnel_Results_List is a list of TunnelServer_reconnectTunnel_Results.
type TunnelServer_reconnectTunnel_Results_List struct{ capnp.List }
// NewTunnelServer_reconnectTunnel_Results creates a new list of TunnelServer_reconnectTunnel_Results.
func NewTunnelServer_reconnectTunnel_Results_List(s *capnp.Segment, sz int32) (TunnelServer_reconnectTunnel_Results_List, error) {
l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}, sz)
return TunnelServer_reconnectTunnel_Results_List{l}, err
}
func (s TunnelServer_reconnectTunnel_Results_List) At(i int) TunnelServer_reconnectTunnel_Results {
return TunnelServer_reconnectTunnel_Results{s.List.Struct(i)}
}
func (s TunnelServer_reconnectTunnel_Results_List) Set(i int, v TunnelServer_reconnectTunnel_Results) error {
return s.List.SetStruct(i, v.Struct)
}
func (s TunnelServer_reconnectTunnel_Results_List) String() string {
str, _ := text.MarshalList(0xd4d18de97bb12de3, s.List)
return str
}
// TunnelServer_reconnectTunnel_Results_Promise is a wrapper for a TunnelServer_reconnectTunnel_Results promised by a client call.
type TunnelServer_reconnectTunnel_Results_Promise struct{ *capnp.Pipeline }
func (p TunnelServer_reconnectTunnel_Results_Promise) Struct() (TunnelServer_reconnectTunnel_Results, error) {
s, err := p.Pipeline.Struct()
return TunnelServer_reconnectTunnel_Results{s}, err
}
func (p TunnelServer_reconnectTunnel_Results_Promise) Result() TunnelRegistration_Promise {
return TunnelRegistration_Promise{Pipeline: p.Pipeline.GetPipeline(0)}
}
type ClientService struct{ Client capnp.Client }
// ClientService_TypeID is the unique identifier for the type ClientService.
@ -4041,239 +4302,249 @@ func (p ClientService_useConfiguration_Results_Promise) Result() UseConfiguratio
return UseConfigurationResult_Promise{Pipeline: p.Pipeline.GetPipeline(0)}
}
const schema_db8274f9144abc7e = "x\xda\xccZ{p\x1d\xe5u?g\xf7\xca+)\x96" +
"\xef\xdd\xacl\xb0\xb0\xb8\xae\xc7n\xb0\x03.Fq\x0b" +
"j'W\x0f\xdbH\x8al\xdf\xd5\xc3\x80\xb0;^\xdd" +
"\xfbIZy\xef\xee\xf5>l\xc9c\xe2\xc7\xd8\x05T" +
"\x1cl\x82;\x98\x98\x8c\xed\xc6\xc5\xa6N\x83\x89\x996" +
"\x14\x98\xa4\xed\x14h\xd2\x12R\xe8\xc4)\x9d\x12\x8c\xa7" +
"\x13\xa6\x0c\x05\xd2a\xe8`\xb6s\xf6\xad+!\xd9\x99" +
"\xfe\xd1\x7f\xec\x9ds\xcf\xf78\xaf\xdfy|\xba\xf5\xe5" +
"\x9a\x16nU\xd5\xcey\x00\xf2\x99\xaa9.[\xf1\xb3" +
"]'\x96\xfd\xed~\x90\x1b\x10\xdd\xaf?\xdfU\xff\x89" +
"\xbd\xff_\xa1\x8a\x17\x00\x9a~K\xd8\x85\xd2jA\x00" +
"\x90V\x09\xff\x01\xe8V\xfd\xf6\x1bo\x95\xdf\x12\x0e\x80" +
"\xd8\x90d\xe6\x88y~u\x17J\xcb\xab\x89yY\xf5" +
"N@\xf7\x0fJ\xaf\x9e\xfa\xdd\xa3?&f.f\x06" +
"l:T\xbd\x0b\xa5\x93\x1e\xe7\x13\xd5\x1b\x01\xdd\x8f\x1e" +
"\xbd\xfe\xcfO\xfe\xd3\xcb\x07A\xfc\x12Bp\xf6\xb3\xd5" +
"\xbf@@\xe9\x95\xea\xef\x01\xba\xff|\xeb\xeew\xb6~" +
"t\xe4\x81\xc9\xe7\xa6\x88O\xad\x99@i_\x8d\x00\xbc" +
"\xfb\xc4\xbd\xf5\xff\x80'>>\x02\xe2M\xb4\x0d\xd2\xcf" +
"[jj9@\xc9\xa9\xc9\x01\xba\xaf\xde\xfc\xfcs\x87" +
"\xbf\x7f\xff\xb7@\xfe\x12\"\xf8\xeb\x8f\xd6\xfc\x0f\x9ds" +
"\xd6c\xf8\xe0;_N}\xf7\xd5/~\xdbcpO" +
"\xbfv\xd73\x87\xbf\xbf\xf8]\xe8\xe7\x04L\x014\xbd" +
"Vc\x12\xef\xbf\xd5\x90.\x1e\xfd\xf9\x0b\x1bJG\x1e" +
"?\xe5_\xda\xdb\xeb\x85Z\x8e\x83\x94\xbb\xfa\x17\x977" +
"\xae\x7ff\xe8\xc9@\x1c\xef\x1e\xe7k\x9f\xa1\xa5?\xaa" +
"\xa5c^\xde\x99y\xa8\xf5\xf7\x1e~\xb2R\xe9U\xc4" +
"y\xb9v\x02\xa5+\xb5\xf4\xf9I\xed]\x08\xe8N\xdc" +
"\xf1\xc2\xa6\x8f\xfe\xc8z\x0a\xe4[0\xe5\xfe\xdd\x83\x97" +
"v,?;\xf4\x92w+\x1e\xa0i\xfb\xdc\x9f\xd1\xd6" +
"\x07\xe7\x92\xa6\xea\xfez\xc5\x86\x87\xdf\xe9>O['" +
"\xb4\xee_bY]3J\xab\xeb<{\xd6\x11\xf7O" +
"o\xde\xf4\xe2\x8bO\x0f\x9f\xaf\xbc\x88g\xd0\xd7\xea\xba" +
"P\xba\xecq\xff\xd2\xe3\x9e\xdf\x89o\xfepU\xea/" +
"\x93f::\xef]O}\xf3\x88\xe1\xdeO\x9f\xfd\x9b" +
"\xb5\xef\xbf\xfe\x83\xa4\x01:\xd3\x1c\x19`K\x9a\x04\x1f" +
"\x98\xc0\xd2\x9b\xcd-/\x82|\x13\xa2;zt\xb7\xdd" +
"\xf1\xd8!\x17\xfaQ@\x0e\xa0\xe9`z\x17mv$" +
"M\xee\xd3\xf8^[\x9d\xfe\xfe\xfe\x1fV\xf8\x9aw\xea" +
"{\xe9.\x940CW\xbb\x92\xfe\x1e\xe0\xc7O\xdd\x7f" +
"\xb8\xf3\xd2\x9a\x97\xe4\x06LU\x0a},\xb3\x0b\xa5\xef" +
"\x12o\xd3\xd9L\x96\xf4\x19i\xb0\x82\xdd\x93\xfa\xa28" +
"\x8a\xd2{\"}\xfeJ\xf4\xd8\xbb\xee\xfd\xe6#U\x97" +
"\xbf\xf9R\xa5J).\x9a\xfe\xfb\x8b&J5\x12}" +
"VIOr\x80n\xc3\xd3\xbf\xff\x17m\xc5\x8b?\x9e" +
"&F\xa4\x0f\xe6\x7f(]\x99O_\x9f\xcc'\x19\xef" +
"\xff\xf2\xf8\xae\x0d\xcb&\xde\xa8\xd4\xbfw\xf1\xfe\x05\x13" +
"(\x95\x16\x10\xb7\xba\x80\xb8\xb9\xcb\xca\xc2\xbd\xff\xf2\xd5" +
"7\x13\x1ewq\xc1\xdb\x08)w\xc3\xa6{Gk\xee" +
"\xbbt)\xe9q\xff\xb8\xc0\xb3\xcc/\x17\x90\xe2/\x88" +
"\x8fH\xcf\x9f\xfc\xb3w\xe8 \xa1R\x9bx\xdd\x00J" +
"\xf3\xaf\xa3O\xf1:O\x86\xc8\xf3\xa7\xf3\x8b\xba\x86f" +
"\x94\x1a\x1b\xe8^\x0b\x1b\xe8^\xab\xb7\xb6\xb2\xcd\xb7\xdf" +
"\xfd.\x88\x0d\xfc\xa4@\xbf\x878U\xe2lb\x0dw" +
"\xa2\xd4z\x83\x00\xe0~cx\xe0\x95\x0f\xdaO\xfeW" +
"\xe5\xe6\x9e@\xcbohF\xe9\x0e\xe2kZ}\x83\xa7" +
"\xfe\xa6U\x7f\xfc\xde\xd1?m\xff`\xca\xee\xfb\x16\xb5" +
"\xa1td\x11\xdd\xe3\xd0\xa2;\xa5\x17\x16y\x9b\x7f}" +
"\xcd\xc6;\x96\xfc\xe8\xc3\xa4&N/\xfa\x904\xf1\x83" +
"E\xa4\x89\xa1\xdb\xff\xf3\xcee\xdf\xf8\xfb\x0f+\xcc\xe3" +
"1^\\\xb4\x02\xa5_y;^&\xe6\xf7\xd7}\xfb" +
"\xf5\x86t\xc3\xaf\xa7\xbbhM\xe3(J\x8d\x8d\xf4\xb9" +
"\xb0\xd1\xbb\xe8\xddo?\xbe3\xf7\xad_\x7fLr\xf1" +
"\x15(\xd5y\xe3\x00J[n\xa4\x9d\xef\xb9\x91B\xa5" +
"\xfb\xdc\xc5\xaf\x8e\x1c}\xf9\x93iq\xb7*\xbb\x1f\xa5" +
"\x85Y\xe2\x9e\x9f%\xac\xf9\x13\xe1\xf8\xa5\xbd\xff\xfe\x87" +
"\x9f&\xa5\xba\x92}\x9b\xa4\x12\x17\x93T\xbb\xdf?\xd6" +
"\xf1\xf0\xe6s\x9f%\x19V-~\x8e\x18Z=\x86(" +
"\xd6\xa6\xf34eq\x1bJ\xdb\x17\xd3y\xa5\xc59\xb8" +
"\xc5\xb5\x1d]g\x9aYN\x15~'\xfc,\xac,(" +
"e\xbd\xdc\xdc\xea\xd8#L\xb7\xd5\x82b\xb3\x1e\x96\xb3" +
"\xca\x86n\xb1<\xa2\x9c\xe1S\x00)\x04\x10\x95Q\x00" +
"y+\x8f\xb2\xc6\xa1\x88XOX+\xaaD\x1c\xe1Q" +
"\xb69\x149\xae\x9e\x02^\xdc\xbe\x04@\xd6x\x94\xc7" +
"8D\xbe\x9e\xe0Lt\x1e\x01\x90\xc7x\x94\x0fp\xe8" +
"\x96\x99YRt\xa6C\xda^k\x9a8\x178\x9c\x0b" +
"\xe8\x9a\xcc6\xc7\x95A\x0d\xd2,A\x16Fw\xdaX" +
"\x07\x1c\xd6\x01\xba#\x86cZ\xfd\xba\x8d\xaa\xd6\xc3\x86" +
"Lf\xe1\x08\xce\x01\x0e\xe7\x00\xce$^\xbb\xa1\xeb\xac" +
"`\xf7:\x85\x02\xb3,\x00\x92\xac:\x92l\xf9\xe3\x00" +
"\xf2\xcd<\xca\xb7'$[M\x92}\x85G\xb9\x85C" +
"\xd7b\xe6\x0efv\x1bXPl\xd5\xd07(|\x89" +
"E\xd7.h*\xd3\xedv\x03\xd2\xfa\x90:\x8c\x998" +
"\x14\x0013\xf3\xc5\xd6\x8e\xa9\x96\xad\xea\xc3}\x1e=" +
"\x9774\xb50N\xb7\x9b\xebi\xb2\xb1\x99\xf6\x10\xe7" +
"\x0f\x00 '\x8am\x009uX7L\xe6\x16U\xab" +
"@B\x01_\xb0\xf7\x0c*\x9a\xa2\x17Xt\xd0\x9c\xa9" +
"\x07\xf9\x07\xf4zr\xacT\x12\xd6^\x9aWL\x85/" +
"Y\xf2\xdcH\x1fk\x07\x00\xe45<\xca\xf9\x84>\xd6" +
"w\x01\xc8\xdd<\xcaw',\xdd\xdf\x06 \xe7y\x94" +
"7s\xe8\x1a\xa6:\xac\xea\xed\x0cx3i0\xcb\xd6" +
"\x95\x12\x03\x80Pa{\x8c2)\xd1\xc2L\x0c\xc2\x15" +
"\x9a\xaa\x9a*@\x07\xd34\xe3.\xc3\xd4\x8a\x1b\xfds" +
"\x0c\xd2\xb6g\xcah\x990\x8d\xe5=\xe3\x90\xdcj\x81" +
"\xadt,\xe6\xafsL\xcf\x90K{\x98\xe5h\xb6\x05" +
" \xa7\"\xf1\xeb\x9a\x01\xe4j\x1e\xe5z\x0es\xa6\xc7" +
"\x80\x99\x18\xd4+\xae:\x9b\xae\x1d\xddd\xc3\xaae3" +
"\xd3'/\xcd\x91\xc2KV\xf2@\xf2\xbf\x0c\x8f\xf2\"" +
"\x0e\xddaS)\xb0<3Q5\x8a\x1b\x14\xdd\xe8\xe5" +
"Y\x01\xab\x80\xc3\xaa\x99=i\x9d\xa2j\xac\xe8K\xb7" +
"\xb2\x90\xf5\xfe\xa7\xe8\x9d\xeb\xba~\xf8\x0e\xc4\xe1[\x87" +
"\x9f\xb9A\xfc\xee\x8a\xe3\xb7\x8e\xbb\xe2N\x0d\xe0:\xfe" +
"S7\x08a\x8a\x08\x9bGy/E\x84S&\x9dZ" +
"\xc0\x1b&fb\x94\x0c\xb4\xc3\x8a\xc3\xa4i\x1dr\xac" +
"@\x8a\xc6L\x98\xcc}\x06\xa1h\x8c`&\xaeT\x82" +
"e&\xdb\xc1L\x8b\xe5!m\x1ac\xe3\x98\x89\x93z" +
"\x85\xd6\xeb\xaeU\xeb\xa1\xa1\xa3U3\xaf/\xf8\x80\xb1" +
"4\x9f\x9db,\xd2\xe3\\\x1e\xe5\xeb\x09\xc8\xe8Wf" +
"\x93\xcb\x93;G\x15\xe0\xec\xee\xdcN\xff\x06\xb0\x94\x0f" +
"v1\x03d\xba>:\xec\x18\x1d\xf6\x18\x8f\xf2w\x12" +
"\x91x\xd2\x04\x90O\xf0(\x9f\xe3\x10\x83@<{\x0a" +
"@>\xc7\xa3\xfcW\x1c\x8a<\xe7\x1b\xec\xd9\x15\x00\xf2" +
"\xd3<\xca?\xe1PL\xf1\xf5T\xed\x8a\xaf\x90\xb3\xfd" +
"\x84G\xf9\xe7\x1c\x8aU\xa9z\xac\x02\x10\xdf\x18\x04\x90" +
"_\xe7Q~\xeb\xf3\xe2\xb8\xa0\x19NqHS k" +
"\xb2b\xe7\x9a\x88\xae;\xa5\xbc\xc9v\xa8h8V\xab" +
"m\xb3\x92P\xb6\xad\x10\x92\xd3\xb62l\xe1<\xc0<" +
"\x8f\x98\x89k(@\"F{\xa2\xc9\x8a\x9b\x98i\xa9" +
"\xbc\xa1G\xa8\xaa\xea6\xd3\xedn\x05\x84A\xa6E\xd4" +
"\x19\xa2\xae'\xf0\x1d\xf2\x9c \x0c\x8c\x18)p\x98\x00" +
"n\x91\xeb\x06J\\K\xbai\xe1Q\xee\xe6\xb0\x11?" +
"#2\xe9\xb1\xb3\x07@\xee\xe0Q\xee\xe3\xb0\x91\xbbB" +
"d\xd2\xa4<\x10\xe3\\z\xc4\xb6\xcb\x98\x89\x8b\xaf\xc0" +
"\xd8;\xd9\xa0e\x14\xb61@\x82\x8b\xa8\x12\x08~\x1d" +
"\x09\xe0\x0bx\xad\x88\x99\xb8\xf5\xa9\xf0\x14\xfe\xf3rW" +
"\x8e2\xa5az\xa9!\x06\xea\xdbb!B\xef\xe8\x1c" +
"\x88%\x10\xb9\x16_,y0\xbe\x7f\xb6\xa08\x16\x9b" +
"\x9ct[\x87l\xe0\x99\x19\xe1\x8c5b8Z\xb1\x87" +
"\x81`\x9b\xe3\x88\xc0!\xce\x8c>k\x8c\x8e\x84\xe2}" +
"7\x9e>\xa1D\xf9d \x99O\x02\xf5\xf7\x93\xfa\xfb" +
"x\x94\xcb\x1c\xba\x1a\xc5\xaf\xdea\x00o\xd9\xd1u}" +
"b\xde\xf0\x9cS\x00\x0e\x05@\xd7)[\xb6\xc9\x94\x12" +
"`\xe4m\xc4?\xef\x1a`\xba\x02.\xf2J\xda\x8b\xfb" +
"\xffOI\xf1\xda\xb3\x9b\x9fi&\xe5\xb6S\x89TS" +
"\x08V\xa3\xb7\xbc\xdd\xd0\x85k\xae_\x02\x04\xf3\xd1u" +
"e\x90-\xa9\xb4\x0a\xd3\xcerJ%Ky\x94oM" +
"\xa6\x9d[HE7\xf1(\x7f\x85C\x81\x99\x94A\xa2" +
"\x16\xd7?t\x8f\xe5\xd7j\x98\x89\xc7\x13\xb3_'Q" +
"\xc6\xaa\x86>\xc5\x0d\x97\xc4\xe1\x12\x99\xb0\xf3\xb6\x84]" +
"C\x13\xae\x1f\x8c\xed*lc\xe3\xa1\x95\xb2\xac\xa4\xa8" +
"1\x1a\x05\xc6m\x05\xe1k1\xcf\x8c\xe5^\x90\x16\xfd" +
"\xa4\x98\xf3\xadE\x97\xac\x8f.y\xdf\x04\x80\xbc\x97G" +
"\xf9\xa1\xc4%\x1f\xa4\xea\xf9!\x1e\xe5\xc7\x12\x97<J" +
"J<\xcc\xa3|\x9c0?\xa8\xb3\x8f\x91\x81\x8f\xf3(" +
"\x9f\xe1\x10S>\xe4\x9f&\xc8?\xc3\xa3|\x81\xf3\x00" +
"\xbb\xa3\xb5\xdd\xd01\xb8\x84\x05\x10U\xd0#L1\xed" +
"A\xa6\xa0\xdd\xa9\xdb\xcc\xdc\xa1\xa0\x16B\xc2\x1e[-" +
"1\xc3\xb1#\x88()c^\xc9\x81\xc5\x0e\x7f\x95\xa0" +
"\xd8\x16\xd6\x00\x875\x14\x91\x163\xdbMVD\xb2\x86" +
"\xa2\xe5\x15\xde\x1e\xb9\x1a\x05M\x06\xf1\xf44\xea\xa1\x82" +
"e7\x8f\xf2\x03\x04%\x98\x18\xa3\x88\x07G\x81\xf3\x90" +
"\x84d\xde\xde\x16\x970^B\xac\xaahB\xbc\x848" +
"\x07@\xdcG\xda9\xc0\xa3|\x98\x0b\xaf\xd6a@\xce" +
"\x8f\xd0JS\x07E\xfe\x1eBM\x95\xc5\xf2\x06\xf5\x82" +
"\x8a\x86\xde\xe7)\x0acM\x15\x8cR\xd9$WV\x0d" +
"]v\x14M\xe5\xed\xf1h\xe1\x8c\xba H\xf2Cy" +
"c9\xeb\x19\x8b\x94qk\xa8\x0c\xa9\x15\xbb\x00z[" +
"\x90\xc7\xden\x8c\xddE\xea\xc46\x80\xde5D\xcfc" +
"\xec1\xd2zl\x00\xe8\xed z\x1fF\xbd\x99$\xe3" +
"S\x00\xbd}D\xde\x8aq\xa9 m\xf1\xb6\xdfL\xf4" +
"\x11\x8c\xab\x05\x89\xe1\x0a\x80\xde\xadD\xdfM\xf49\x9c" +
"\xa7Ii\x1cG\x01z\xc7\x88~\x80\xe8BU=5" +
"\xa2\xd2>4\x01z\xf7\x12\xfd!\xa2W__\x8f\xd5" +
"\x00\xd2\x83\x1e\xfd\x01\xa2?J\xf4\x9a\x85\xf5X\x03 " +
"\x1d\xc1\xfd\x00\xbd\x87\x89~\x9c\xe8\xb5X\x8f\xb5\x00\xd2" +
"1|\x1c\xa0\xf78\xd1\xcf\x10\xfd\x0bs\xea\xf1\x0b\x00" +
"\xd2i\xef>'\x88~\x0e#\\\xeb,&\xe1\x95\xdc" +
"J\x8d\xcb\x0b\xde\xb0\"\xd3\xb2\xa0\x07C\x1f\xfb\xf3F" +
"\x9a\x9a0L\xc7\xa3N@L\x03\xbae\xc3\xd06L" +
"\x86\xed\xd9*\x9c\xc0- m\xe8\x9d\xc5(\xce|g" +
"\xea6 [P\xb4\xcer\\\xf3X\xad\x8em8e" +
"\xc8\x16\x15\x9b\x15\xa3\xc4k:\xfa:\xd3(\xf5!3" +
"K\xaa\xaeh\x10\xfd2\x93o\xa5\x1dG-N\x09:" +
"\xae\xd2\xd1\xb2\xe5\xe6>e\xb8\xa2#^\x11\xa3v\x04" +
"B\xb7\xdc\x16\x83v:\x19\x1c\xd9\x1d\x8a\xe6\xb0)'" +
"MS\xf5\xf6Wd(?oL\xe9\xc7\xdb\xe2\xd3\xa3" +
"\xc3\xcd\xa0G\xef\xe0\xe2\xdc\x10ja(\xe8} K" +
"{'\xec\x11M\xbc\x02{\\m50\xccl\xff\xab" +
"S\x1f2(\x8d\x0aJ\xc9\xfa\x0dW\xf70+M\xad" +
"\xc7\xac\x1df4\xc3\x9a=\xcfu\xf4\xf5\xe5\xe36\x98" +
"\xf7A2\x89\x0b=I\\\x88aa4\x19\xfeau" +
"(\xc9^\x1c\xe6\x89\xbe\x19\xe3\xfeA\xba\x07OM\x8a" +
"\xffT\xab\x8f\x0b\xcc\xdb\xbeH\xf4\xb2\x87\x0b\xe8\xe3B" +
"\xc9\xdb_#\xfaX\x12\x17\x1c\x9c\x98\x8c\x0b|\x88\x0b" +
"\x14\xcf\x07\x88~\xd8\xc3\x85\x94\x8f\x0b\x87\xf0\x99I\xf1" +
"_S\xe5\xe3\xc21|nR\xfc\xd7\xce\xf1q\xe1\xb4" +
"\xc7\x7f\x86\xe8\x17<\\h\xf3q\xe1\xbc\x87#O\x13" +
"\xfdy\xc2\x05\xc7\xd4zmS\xd5\x01\x87cg-\x94" +
"\xbf\xc6X\xb9\x15\xd2\x9a\xba\x83E\x98]T\x15m\x8d" +
"\xa3h\x90\xed\xb5\x95\xc2\xb6\xb8\x04\xd6\xac\x0eE/Z" +
"8\xa2lc\x84\xf4B2'\xda\x9a\xb5\x89\x99\xea\x10" +
"`\\4G5B:o\x18\x95\xa5\x83W{1\xd3" +
"\x07\x95\xe8\xb7\x922\xd6Y\xd4X;\x86\x95\x02\xaf\xc7" +
"\x99F\xa5_\x0c]G?}\xf7\xa9\xd9\xc9y\xb9\x1c" +
"\x94\xe1a~\xef\xcbU$n6Vf\x05\xbb\xdd@" +
"\xddVu\x87M\xd9\xa00\xe2\xe8\xdbXq-\xea\x05" +
"\xa3\xa8\xea\xc30\xa5\xfe\xe7?o\xfa\x90(h\xbch" +
"\xc6\xc4\xdb\x8b\xb8\xbc\x198\x0fK(=\x8b\xcdq\x17" +
"\x9d+x\xabr&S\xacD\x038\xc3i\xc1\xb4\xcc" +
"\x0f2\xbf>\xa8\x02\x88^20\x1c\x17\x8bGv\x01" +
"'>(`<e\xc7p\xa8.\xdeg\x02':\x02" +
"r\xd1\x03\x12\x86\x8f?\xa2:\x01\x9c\xc8\x04\xe4\xa3W" +
"\x1f\x0cg\xb1\xe2=m\xc0\x89\xeb\x05LE\x0f\\\x18" +
"\x0er\xc5V*A\xee\x10\xdc\xb0\x9b\x80\x9c\x7f\xd5\x16" +
"tCP\x80\xac\x07\x0b-\xe8\x863\x0a\x0c\xbb\x0e\x80" +
"\x16\xdc\x13\xa4\x8c\x16t\xc3)\x1d\xa4\x0b\x8a\xcdZ0" +
"9\xe9\xe2?\xaf\x17\x98\xbe\xa6l\x8b\xeb\x9e\x10P\xf7" +
"M\xc4eO\xd4\x7f\x1dz*YR\x06c\x84c\xfb" +
"\x83!\xc4\x85\xc4\x18\xe1<\xd5\x99\x17x\x94\x7f\xca\xc5" +
"\xc95\xf4\xd1p8\x84\x86\x196\x843\xcc\x88\x02O" +
"\x0e\xca\xbd\xcaI\x91[4F\xbcr\x10\xfd\xad,\x88" +
"\xe1=9>\x9a\x97\x18\x1fa\xd8\x8a\x0a\x93\xb2Ar" +
"\x984o\x96\xbe&\xd9Xy\xe9)\xe5\xb9X\xf8\x16" +
"\x86\xe1\xab\xa4(\x92\xab\xd4\x09n\xd8|a\x98\xdb\xc8" +
"\x9aI\x93]c\x07\xda\xc3\xb2\xd6\xd5\xa4\x8d\xf05c" +
"\xf6A\x82\x7fN\x9a\xbc\xcf\x17(\xdaw41\xd2\xd2" +
"\x8c\xa0yJoH\xd6\xbf3\xe8\xca\xbfpX\xad\xa6" +
"iq\x85\xfb-I\x94\xdd\x91\xff-\x89\x0b\xf9\xa8\xa5" +
"9\xd8\x158\xe5\x89\xf8\xe5\xe0\x89\x89x\xdc\x15\xb9\xdf" +
"\xd9\xae\xb8\xa5\xf1\x1a\xc8\xf0\xb1\xc01c\x8c\xd5\x8c\xe1" +
"nUg\x16\xd5k\x15c\x81\xf0\x05\x02mB.\xc7" +
"$\xf8\x9d\x0cs\x9dk\x12e\xdeL\xe2\xf7\x06\xce\xee" +
"\xfbz\x90\x8b\x13M\xe7\xa9\xc4<&\x14^~.\x98" +
"slM\x08\xbf\x85\x9a\xce\xcd<\xca#\x9c\x17\xfcF" +
"\x7f\xb9\xa8\xa0\xcd\xd6\x99l\xbb\xc3\x04\xbd0\x1e7_" +
"\xd4~\x14\xac~,S\xa1\xb8\xced\xb9\xed\x0eK2" +
"\x84Sd\x10T\xa38e|<Mev\x17\x1b\xec" +
"5\x0a\xdb\x98=i\xba^\xf1\x02\xd4\x13\x8f\x90\xa3\x07" +
"\xa0\x9e\xe4\x03P\x00#\xdb\xc9\xa1\xca<\xca\xbb\x130" +
"2>\x11\x1b|\xfaT\xfc\x7f\x93=\x7f\xa3G\x10*" +
"D\x85\xab)\xd2\xa2\xbf\xac\x98}\xc4;\xed@\xb9'" +
"\xc7\xae*\xac\xe3\xa7\xbdk\x1c\xc2@\x14\xdb\x98x\x99" +
"\xa7C\xb8`\xf3\xff\x0d\x00\x00\xff\xff\xdfs7\x9d"
const schema_db8274f9144abc7e = "x\xda\xc4Z}\x90\x14ez\x7f\x9e\xee\x19\x9a\x85]" +
"f\xda^\x8b=\x04\x16(\x8d\xc2\x09Q\xd1D7\xf1" +
"f?\x80\xdb\xe5\xf8\x98\xdeYPWL\xd1\xcc\xbc\xbb" +
"\xdb\xd0\xd3=t\xf7\x00K\xf0\x10\x0a\xe3\xb9\x91\x13<" +
"I\x89\x07W\x80\x1a?\xc2\xe5\xc0\x83\x8a\x1a\xce:\x13" +
"\x8d\x98\xbb\x8b\xde\x05R\xc7\xc5\xaa3\"\x95\xd2\x0ae" +
"\xd4\xb3,Sj\xa7\x9e\xb7?wv]\xc0\\U\xfe" +
"\x81\xa9\xa7\x9f\xf7\xe3\xf9\xfa=\x1f\xef^\xd7;\xa1U" +
"\xb8>}u\x06@=\x92\x1e\xe7\xb19\xbf\xda|\xe0" +
"\xaa\x7f\xdc\x0e\xea\x14D\xef\xdb'\x167~\xean\xff" +
"wH\x8b\x12\xc0\xfcAi3*;%\x09@\xb9_" +
"\xfaO@/\xfd\x07\xa7\xdf\xaa\xbc%\xed\x00yJ\x92" +
"Y \xe6\xf2\xf8\xc5\xa8l\x1bO\xccw\x8f\xdf\x08\xe8" +
"\xfdi\xf9\xf5C\x7f\xb4\xe7g\xc4,\xc4\xcc\x80\xf3\xcf" +
"\x8d\xdf\x8c\xca\xa7\x9c\xf3\xe3\xf1\xcb\x01\xbd\x8f\x1en\xfa" +
"\x9b\x83\xffr\xf2^\x90\xafF\x08\xcen\xa8\xfb\x0d\x02" +
"*3\xeb~\x04\xe8\xfd\xebu[\xdeY\xfd\xd1\xee\xef" +
"\x0c?7E|/\xd5\x0d\xa1r\xa6N\x02\xd1\xdb\x7f" +
"g\xe3?\xe3\x81Ov\x83|\x0dm\x83\xf4\xf9x\xdd" +
"\x04\x01P\xf9E]\x0e\xd0{\xfd\xda\x13/\xec\xfa\xf1" +
"}\xdf\x07\xf5jD\xf0\xd7\x9f\xaf\xfb\x1f:\x07'\x10" +
"\xc3\x07\x8f\x7f=\xf5\xc3\xd7/\xfb\x01g\xf0\x9e\xf8\xe5" +
"m\xcf\xee\xfa\xf1\x8c\xf7`\x85 a\x0a`\xfe\xec\x09" +
"6\xf1\xde4\x81t\xf1\xf0\xaf\x7f\xb2\xac\xbc\xfb\xd1C" +
"\xfe\xa5\xf9^\x97O\x14\x04Hy;\xba>)\xafx" +
"\xac\xf0XR\x9c\xba\x89\x1f\xd2\xd2i\x13I\x9c\x9b~" +
"sn\xf9\xd2g\xfb\x9e\x0c\x18\xf8E\x9f\x9f\xf8,1" +
"\xbc6\x91\xeeqrc\xf6\x81\xb6?~\xf0\xc9Z\xab" +
"\xa4\xf9\x8d'\x0e\xa1\x92\xae\xa7\x9fX\x7f\x1b\x02zC" +
"\xb7\xfcd\xe5G\x7f\xe1<\x03\xea\\Ly/\xdf\x7f" +
"v\xc3\xec\xa7\xfb^\xe5\xd7\x16\xc9\x8c\x0d\xbf\xa2\xadw" +
"6\xd0\xd9\x0d\x7f?g\xd9\x83\xef,9J['\xcc" +
"\xe2_b\xee\xa4\x16Tn\x9dD\x96\xb9e\x12q\xbf" +
"q\xed\xca\x17_<\xd2\x7f\xb4\xf6\"\xdc\xe2g&-" +
"F\xe5<\xe7~\x97s_\xde\x85o\xfe\xf4\xfa\xd4\xdf" +
"%\x05\xdf\x9fy\x8f\x0e?\x9a!\x86;?;\xfe\x0f" +
"\x0b\xdf?\xf5|\xd2BjV \x0b\xb1,\x09\xde;" +
"\x84\xe57[Z_\x04\xf5\x1aDo\xed\x9e-n\xe7" +
"#;=X\x81\x12\x0a\x00\xf3wf7\xd3f{\xb3" +
"\xe4_\xd3\xce\xb77\x98\xefo\xffi\x8d3\xf2S?" +
"\xce.F\xa5N\xa6\xab\xa5\xe5\x1f\x01~\xf2\xcc}\xbb" +
"\xba\xce.xU\x9d\x82\xa9Z\xa1\x0f\xca\x9bQ9N" +
"\xbc\xf3\x8f\xca\xcd\xa4\xcfH\x835\xec\\\xea\xff\xb8l" +
"-*\x1f_F??\xb8\x8c\xb3/\xbe\xf3{\x0f\xa5" +
"\xcf}\xef\xd5Z\x95R\xe0\xcc\xff\\\xb1Q\x91\x1b\xb9" +
"K7\xfeV\x00\xf4\xa6\x1c\xf9\x93\xbfm/\x9d\xf9\xd9" +
"(A\xa4\xdc:\xf9C\xa5k2\xfdZ8\x99d<" +
";\xf7\xe8\x9f\xbf\xbb\xf3\x97\xa7\x92\x9erp2\xf7\xd8" +
"\xe3\x93Ia\xf7}}p\xf3\xb2\xab\x86N\xd7\x1a\x88" +
"s\x9e\x9e<\x84\xcay\xbe\xdd\xbb|;\xe1\x9c\xf6\xb5" +
"{\xfe\xed\x1bo&|\xf6\x8e\xa6\xb7\x11R\xde\xb2\x95" +
"w\xae\xad\xbb\xfb\xec\xd9\xe4AK\x9b\xb8\xe9\xb4&:" +
"\xe8\x98\xfc\x90r\xe2\xe0_\xbfC\x07I\xb5\xea\xde\xd6" +
"\xd4\x8b\xca\x9e&\xfa\xb9\xbb\xe9I\x122\x8a\x9d\xd1\x1c" +
"g\xe7\x15-\xa8\xec\xbf\x82\xee\xb5\xf7\x0a\xba\xd7M\xab" +
"\xdb\xd8\xaa\x9bo\x7f\x0f\xe4)\xe20\xa88C\x9c\xef" +
"\x12\xe7\xfcsW\xdc\x87\xca\xf9\xa9\x12\x80\xf7\xdd\xfe\xde" +
"\xd7>\xe88\xf8\xdf\xb5\x9bs\x81NOmA\xe5\xdc" +
"Tn\xaa\xa9\xdc>\xf3\xaf\xff\xcb\xf3{\x1e\xeb\xf8`" +
"\xc4\xees\xa7\xb7\xa3r\xebt\xee\xee\xd3\xbf\xa9\xe8\xd3" +
"\xf9\xe6\xdf^\xb0\xfc\x96Y/}\x98\xd4\x84:\x9dG" +
"/\x9bN\x9a\xe8\xbb\xf9\xbf\xbey\xd5w\xff\xe9\xc3\x1a" +
"\xfbq\xc6{\xa7\xcfAe\x0f\xdfq71\xbf\xbf\xe8" +
"\x07\xa7\xa6d\xa6\xfcn\xb4\x8b\x1e\x9f\xbe\x16\x95\xd7\x88" +
"w\xfe+\xd3y\x1c\xdf\xfe\xf6\xa3\x1bs\xdf\xff\xdd'" +
"$\x97X\x83s\xb7\xcc\xe8Ee\xe9\x0c\xda\xb9k\x06" +
"\xc5\xd2\x92\xc3g\xbe1\xb0\xe7\xe4\xa7\xa3\"\xf7\xc73" +
"\xb6\xa3R7\x93\xfb\xffLB\xab\xbf\x92\xf6\x9d\xbd\xe7" +
"\xb7\x7f\xf6YR\xaa\xf33\xdf\xe6\xd07\x8b\xa4\xda\xf2" +
"\xfe\xde\xce\x07W\x1d\xfe\"\xc90s\xd6\x0b\xc4p=" +
"g\x88\x82q4OSg\xb5\xa3\xa2\xcd\xa2\xf3\xee\x9a" +
"\x95\x83\xb9\x9e[5Mf\xd8\x95T\xf1\x0f\xc3\x9f\xc5" +
"yE\xadbVZ\xda\xaa\xee\x003]\xbd\xa8\xb9\xac" +
"\x9b\xe5\x9c\x8ae:,\x8f\xa8f\xc5\x14@\x0a\x01d" +
"m-\x80\xbaZD\xd5\x10PFl$\xb4\x96u\"" +
"\x0e\x88\xa8\xba\x02\xca\x82\xd0H\x88 \xaf\x9f\x05\xa0\x1a" +
"\"\xaa\x9b\x04D\xb1\x91\xf0N\xae>\x04\xa0n\x12Q" +
"\xdd!\xa0WavY3\x99\x09\x19w\xa1mc=" +
"\x08X\x0f\xe8\xd9\xcc\xb5\x07\xb55\x06dX\x82,\xad" +
"\xdd\xe8b\x03\x08\xd8\x00\xe8\x0dXU\xdbYa\xba\xa8" +
"\x1b\xdd\xac\xcff\x0e\x0e\xe08\x10p\x1c\xe0X\xe2u" +
"X\xa6\xc9\x8an\xa1Z,2\xc7\x01 \xc9\xc6G\x92" +
"\xcd~\x14@\xbdVD\xf5\xe6\x84d7\x91d7\x8a" +
"\xa8\xb6\x0a\xe89\xcc\xde\xc0\xec%\x16\x165W\xb7\xcc" +
"e\x9aXf\xd1\xb5\x8b\x86\xceL\xb7\xc3\x82\x8c\xd9\xa7" +
"\xf7c6\x0e\x05@\xcc\x8e}\xb1\x85\x9bt\xc7\xd5\xcd" +
"\xfe\x1eN\xcf\xe5-C/\x0e\xd2\xed\xea\xb9&\xa7\xb5" +
"\xd0\x1e\xf2\xe5\xbd\x00(\xc8r;@N\xef7-\x9b" +
"y%\xdd)\x92P \x16\xdd\xadk4C3\x8b," +
":h\xdc\xc8\x83\xfc\x03\x0a\\\x8eyZ\xc2\xdaW\xe6" +
"5[\x13\xcb\x8eZ\x1f\xe9ca/\x80\xba@D5" +
"\x9f\xd0\xc7\xd2\xc5\x00\xea\x12\x11\xd5\xdb\x13\x96^\xd1\x0e" +
"\xa0\xe6ETW\x09\xe8Y\xb6\xde\xaf\x9b\x1d\x0cD;" +
"i0\xc75\xb52\x03\x80Pa[\xad\x0a)\xd1\xc1" +
"l\x8c\xd25\x9aJ\x8f\x14\xa0\x93\x19\x86u\x9be\x1b" +
"\xa5\xe5\xfe9\x16i\x9b\x9b2Z&\x8dbyn\x1c" +
"\x92[/\xb2yU\x87\xf9\xeb\xaa67\xe4\x95\xdd\xcc" +
"\xa9\x1a\xae\x03\xa0\xa6\"\xf1\x1bZ\x00\xd4\xf1\"\xaa\x8d" +
"\x02\xe6l\xce\x80\xd9\x18\xd4k\xaez!]WM\x9b" +
"\xf5\xeb\x8e\xcbl\x9f|e\x8e\x14^v\x92\x07\x92\xff" +
"eET\xa7\x0a\xe8\xf5\xdbZ\x91\xe5\x99\x8d\xbaUZ" +
"\xa6\x99VAdEL\x83\x80\xe9\xb1=i\x91\xa6\x1b" +
"\xac\xe4K7\xaf\xd8\xcc\xff\xa7\xe8\xad\xf7<?|{" +
"\xe3\xf0m\xc0/\xbc ~7\xc7\xf1\xdb |\xee\x8d" +
"\x0c\xe0\x06\xf13/\x08a\x8a\x08WD\xf5\x1e\x8a\x88" +
"j\x85t\xea\x80h\xd9\x98\x8dQ2\xd0\x0e+\xf5\x93" +
"\xa6M\xc8\xb1\")\x1a\xb3a\xb6\xf7\x19\xa4\x925\x80" +
"\xd9\xb8\x94\x09\x96\xd9l\x03\xb3\x1d\x96\x87\x8cmm\x1a" +
"\xc4l\x9c\xf5k\xb4>\xe9R\xb5\x1e\x1a:Z5\xf6" +
"z\x9b\x15}\xc8\x08\x96\xe7\x9b}\xa3%\x82\x84t\xd4" +
"*\xa2\xba$\x11$]\x14$\x9d\"\xaa=\x89 Q" +
"\xdb\xe3\xc8\xa9\x01\xb3\xdfSl\x0c\xbbzp\xf1\xe8\xca" +
"\x09?#\x17\xa8\x17Qm\"\x0c\xa6\xaf\xcc\xa5h\xa5" +
"\xd3\xa2\xea\xf6\xc2\xa7u\xd0\xbf\x01\xa2\xe6\x83]\xec\x00" +
"T\x9b\xa2\xc3\xf6\xd2a\x8f\x88\xa8>\x9e\xd0\xcfA\x1b" +
"@= \xa2zX@\x0c\xd4\xf3\xf4!\x00\xf5\xb0\x88" +
"\xeas\x02\xca\xa2\xe0\xfb\xda\xf19\xd4\x0b\x89\xa8\xfe\\" +
"@9%6R\xa9/\xbfFq\xf2s\x11\xd5_\x0b" +
"(\xa7S\x8d\x98\x06\x90O\xaf\x01PO\x89\xa8\xbe\xf5" +
"e\x10T4\xacj\xa9\xcf\xd0\xa0\xd9f\xa5\xae\x05\x11" +
"\xdd\xac\x96\xf36\xdb\xa0\xa3Uu\xda\\\x97\x95\xa5\x8a" +
"\xeb\x84\xd9$\xe3j\xfd\x0eN\x02\xcc\x8b\x88\xd9\xb8>" +
"\x04$b\xb4'\xda\xac\xb4\x92\xd9\x8e.Zf\x94\x10" +
"t\xd3e\xa6\xbbD\x03i\x0d3\"\xea\x18\x80\xd1\x1d" +
"\xb8=9}\x10\xc1V\x0cr\xd8On7\xd5\xf3\x02" +
"%.\x9c\x13{\xde4\xfc\x82\xc8\xa4\xc7\xae\xee\xd8\xf7" +
"\xa6\x09\x9f\x13\x994\xa9\xf6\xc6\x10\x9d\x19p\xdd\x0af" +
"\xe3\xba10\xf6F\xb6\xc6\xb1\x8a\xeb\x18 !]T" +
"\xc4\x04_\x07\x02\xe4\x05\xd1(a6\xee\xfbj<E" +
"\xfc\xb2\xb4\x9b\xa3$o\xd9<\xab\xc5\xe1sC,D" +
"\x14=\xbd\xc9\xe8i\x0d\xa2gM|\xff\xe6\xa2Vu" +
"\xd8\xf0z\xa1\xad\xcf\x05\x91\xd9\x11D:\x03V\xd5(" +
"u3\x90\\{\x10\x11\x04\xc4\xb1\x81s\x81\xd5\x99P" +
"\xbc\xef\xc6\xa3\xe7\xc2(\x15\xf6&Sa\xa0\xfe\x15\xa4" +
"\xfe\x1e\x11\xd5\x8a\x80\x9eA\xd0cvZ :nt" +
"]\x9f\x98\xb7\xb8sJ \xa0\x04\xe8U+\x8ek3" +
"\xad\x0c\x18y\x1b\xf1O\xba\x84\x0cS\x83ty-S" +
"\x0bU\xff\xef\xf9\xfc\xd2\x13\xb3\x9f$\x87\xa5\xe5C\x89" +
",Y\x0cV#_\xdea\x99\xd2%\x97^\x01\x82\xf9" +
"\x89a^\x90\xe8\xa9*\x0c3\xe6lB\xf8+ET" +
"\xafKf\xcc\xb9\xa4\xa2kDTo\x14Pb6%" +
"\xbf\xa8}\xf7\x0f\xdd\xea\xf8e&f\xe3\xd9\xcc\x85\xaf" +
"\x93\xa8\xc0u\xcb\x1c\xe1\x86\xa3f\x9b\x1b\x12v\x0dM" +
"\xb8tM\"\xdb\xacc\x83\xa1\x95\x9aYY\xd3c4" +
"\x0a\x8c\xdb\x06\xd2\xb7b\x9e1+\xd5 \xa3\xfb\xf9<" +
"\xe7[\x8b.\xd9\x18]\xf2\xee!\x00\xf5\x1e\x11\xd5\x07" +
"\x12\x97\xbc\x9f\x0a\xff\x07DT\x1fI\\r\x0f)q" +
"\x97\x88\xea>\xc2\xfc\xa0E\xd8K\x06\xde'\xa2\xfa\x94" +
"\x80\x98\xf2!\xff\x09\x82\xfc\xa7DT\x8f\x09\x1c\xb0;" +
"\xdb:,\x13\x83K8\x00Q\xf1?\xc04\xdb]\xc3" +
"4t\xbbL\x97\xd9\x1b44BH\xd8\xea\xeaef" +
"U\xdd\x08\"\xca\xda&^-a\xa9\xd3_%i\xae" +
"\x83u `\x1dE\xa4\xc3\xec\x0e\x9b\x95\x90\xac\xa1\x19" +
"yMt\x07.FA\xc3A<3\x8az\xa8\xd6\xda" +
"\"\xa2\xfa\x1d\x82\x12L\x8c\x88\xe4{\xd7\x82\xc0\x91\x84" +
"d^\xdf\x1eW_<!\xa6k\xfa'\x9e\x10\xc7\x01" +
"\xc8\xdbH;;DTw\x09\xe1\xd5:-\xc8\xf9\x11" +
"Zk\xea\xa0?\xd9J\xa8\xa9\xb3X\xde\xa0^\xd0\xd1" +
"2{\xb8\xa20\xd6T\xd1*Wlre\xdd2\xd5" +
"\xaaf\xe8\xa2;\x18-\x1cS\x17\x04I~(/\xaf" +
"4sc\x912n\x0c\x95\xa1\xdc\x85\x8b\x01\x0a\xabP" +
"\xc4\xc2\x00\xc6\xee\xa20l\x07(\xac&\xba\x81\xb1\xc7" +
"(:N\x01(\x94\x88^\xc1\xa8\xadT\xca\xf8\x0c@" +
"\xa1B\xe4-\x18\x97\x0a\xca \xdf~\x13\xd1w`\\" +
"-(\xdbp\x0e@a\x0b\xd1\x1f!\xfa8\x81kR" +
"\xd9\x83k\x01\x0a\x0f\x13\xfd\x00\xd1\xa5t#\xf5\xd0\xca" +
"~\xb4\x01\x0a\xfb\x88\xfe\x14\xd1\xc775\xe2x\x00\xe5" +
"\x09N\x7f\x9c\xe8G\x88^\xf7\xb5F\xac\x03P~\x88" +
"\xdb\x01\x0a\x87\x89\xfe\x1c\xd1'`#N\x00P\x8e\xe3" +
"\xa3\x00\x85\xe7\x88\xfe2\xd1'\x8ek\xc4\x89\x00\xcaK" +
"\xfc>'\x88~\x92\xe8\xf5\xa9F\xac\x07P^\xc1C" +
"\x00\x85\x93D?\x85\x11\xdeu\x95\x92\xb0K\xee\xa6\xc7" +
"e\x87h9\x91\xc9Y\xd0V\xa2\x9f\x13\xf2V\x86\xfa" +
"J\xcc\xc4\xf3_@\xcc\x00z\x15\xcb2\x96\x0d\x87\xf3" +
"\x0bU>\x81\xbb@\xc62\xbbJQ\xfc\xf9N\xb6\xc4" +
"\x82\xe6\xa2ftU\xe2Z\xc8i\xab\xbaV\xb5\x02\xcd" +
"%\xcde\xa5(!\xdbUs\x91m\x95{\x90\xd9e" +
"\xdd\xd4\x0c\x88\xbe\x8c\xe5s\x99jU/E{\x8fY" +
"\xc0E\xee)\xd4\xbags\xa5\xa5G\xeb\xaf\x19\x01\xcc" +
"\x89\xb1>\x82\xae\xb97\xc4P\x9fI\x86T\xf3\x06\xcd" +
"\xa8\xb2\x8b\xa9\xec\xc6l*\xbas~Sr\xa1\xde3" +
"\x1cX]\xb84_Q\x93F\xfd\xe46b\xde\xd1\x1e" +
"\x0b\x1b\xc9j\x073\x90N!N`\xa1I\xfa\x82\xde" +
"\x12\x9ai\xef\x84sD\x13\xc5\xc09.V\x13\xfd\xcc" +
"\xf5\x7fu\x99}\x16\xe5zI+;_qu7s" +
"2\x17\xa3\xc5xFx\xe1d\xdc\xd9\xd3\x93\x8f\xc7\x0c" +
"\xa2\x8f\xe4\xd7E\xe0\xd5\x86\xdd\x00\x85V\x8a\xce%\x18" +
"\xe9P\xe9\xe2 \xd2I\xe4\x1e\x8cKXE\xe5`\x91" +
"'\xfa*\x8c\x9b\x1c\xe5\x0e\x1e\xe41\x06\xa6\xda|\xf0" +
"b|\xfb\x08\xeb\xe44\xfa\xe0U\xe6\xfb\x1bD\xdf\x94" +
"\x04\xaf*\x0e\x0d\x03;I\xf4\xc1k\x1b\x07\x9d\x1dD" +
"\xdf\xc5\xc1+\xe5\x83\xd7N|\x16\xa0\xb0\x8b\xe8\xfb8" +
"x\xa5}\xf0\xda\x8b/\x0c\x03\xbb\x09\xe3|\xf0z\x82" +
"\xf3?E\xf4c\x1c\xbc\xda}\xf0:\xca\xc1\xee\x08\xd1" +
"O\x10HUm\xa3\xe0\xda\xba\x09\xd8\x1f\xc7F\xb1\xf2" +
"-\xc6*m\x901\xf4\x0d,J,%]3\x16T" +
"5\x03\x9a\x0b\xaeV\\\x17\xd7\xe9\x86\xd3\xa9\x99%\x07" +
"\x07\xb4u\x8c\xd2\x91\x94L\xdc\xae\xe1\xacd\xb6\xde\x07" +
"\x18W\xf6Q!\x93\xc9[Vm}\xc3\x0bDf\xfb" +
"\x08\x17}+k\x9b\xbaJ\x06\xeb\xc0\xb0\x9c\x11\xcd8" +
"\x1d\xea\xf4\xc52M\xf4k\x8c\x1e\xbdyx\xf1P\x09" +
"z\x85\xb0\x08\xe9\xc9\xd5T\x17lS\x85\x15\xdd\x0e\x0b" +
"MW7\xabl\xc4\x06\xc5\x81\xaa\xb9\x8e\x95\x16\xa2Y" +
"\xb4J\xba\xd9\x0f#\x9a\x14\xf1\xcb\xa6;\x89\xaa\x8bG" +
"3&^\xc7\xe4\xd9- p\xe8\xa2\x1aBn\x89[" +
"\xfd\\\x91\xaf\xca\xd9Ls\x12]\xea\x18\xa7\x05\xd3H" +
"?\xc8\xfc\xb6>\x0d\x10=%a8\x8e\x97\x8fn\x06" +
"A~Z\xc2\xf8\x15\x03\xc3G\x0by\xbf\x0d\x82\xbcG" +
"B!z\xe2\xc3\xf0yN\xbe\x7f\x08\x04\xf9^\x09\xc5" +
"\xe8\xd9\x0d\xc3Y\xb7<\xd8\x0e\x82\\\x960\x15=A" +
"b8(\x975\xaa\x93\xee\x900\x1d\xbd\xe7a\xf8\x1a" +
"#/\xdd\x0e\x82\xbcP\xf2\xc2v\x08r\xbe\x18\xad\xe8" +
"\x85\x80\x01\xcd\x1c2Z\xd1\x0b\xe7C\x18\xb6M\x00\xad" +
"\xb85\x80\xe7V\xf4\xc2\x09)d\x8a\x9a\xcbZ\xa9\xd7" +
"\xf4?b\x00\xde\xd0\x8a\xc9\xc9\xa3\xf8e\x0d\xce\xe8\x85" +
"r{\\\xcc\x85\x00\xbcm(\xae\xe5\xa2\xa6r\xe73" +
"\xc9:9\x98\x8d\xec\xdd\x1eLV\x8e%f#G\xa9" +
"x>&\xa2\xfa\x86\x10W\x06\xa1O\x87\xc3:\xb4\xec" +
"\xb0\xcb\x1dcf\x17x~P\xc3\xd6N\xee\xbc\x925" +
"\xc0k\\\xf4\xb7r N\x07\xc9q\xde\xa4\xc48\x0f" +
"\xc3\xfeZ\x1a\x96=\x92\xc3\xbdI\x17h\xd6\x92\xdd\"" +
"Og)\xee\x92\xe1\xe3%\x86\xef\xcc\xb2L\xae\xd5 " +
"yaG\x89a.\x84\x1a\x93]b[\xdd\xcd\x9a\xff" +
"/\xc9z\x14\x07\xf1\xcf\xc9\x90G\xfa\x02E\xfb\xaeM" +
"\xcc\xe9\x0c+\xe8\x083\xcb\x92E\xfd\x18\xba\xf2/\x1c" +
"\x96\xe0\x19Z\\3\x9a\xa3f\xf2a\x11\xd5\x03\x89b" +
"g\xff\xac\xc4\xbc.\xec\xd3\x0e.\x0e\xe6u'\xe2\x97" +
"\x9c\xe7\xc9QO\x88\xa8\x9eL\xb8\xdf+\xc4\xf8\xb2\xef" +
"~a\xbe\x92\x7fA=\xcb\x1b\"\xaao\x06\xadr\xf8" +
"\xa2S\xb5c\xa06\xac\xfe%\xba\xc9\x1c\xaa@k\x06" +
" \xe13\x11\xba\x04\x7fU\x9b0|8Vv-H" +
"\x14\xae\xd1<\x08\x99]\xa0p-\xa1\x13\xcdY\xc6\xd0" +
"W!\x88\x0e?8\x82d\x9fh\xbd\x0f%\xa6R\xa1" +
"\xb6\xd4\x17\x82i\xcf\xea\x84\xb6\xee\xa2\xd6{\x95\x88\xea" +
"\x80\xc0\x11\xc4ZQ)i\xe8\xb2E6[_e\x92" +
"Y\x1c\x8c[Pj\xc2\x8a\xce\x0a\xacPY\xbc\xc8f" +
"\xb9\xf5U\x96d\x08\x9f\x01@\xd2\xad\xd2\x88\xf9\xff(" +
"\xa5\xdfmlM\xc1*\xaec\xee\xb0\xe7\x91\x9a'\xbc" +
"\xee\xf8\x0d z\xc1\xebN\xbe\xe0\x05\xb8\xb3\x9e<\xb0" +
"\"\xa2\xba%\x81;\x83Cq\xff:z\xae\xff\xfd\xa4" +
"\xe7\xaf\xf4\x8aE\x95\xaet1U`\xf4\xc75_q" +
"\xac~\xb1E{\xfc6{\x89\xa3(\x88\xc0\x00\x13\x7f" +
"{A\x87\x08\xc1\xe6\xff\x1b\x00\x00\xff\xff\x99N\xd0U"
func init() {
schemas.Register(schema_db8274f9144abc7e,
@ -4286,6 +4557,7 @@ func init() {
0x9b87b390babc2ccf,
0x9e12cfad042ba4f1,
0xa29a916d4ebdd894,
0xa353a3556df74984,
0xa766b24d4fe5da35,
0xa78f37418c1077c8,
0xaa7386f356bd398a,
@ -4299,6 +4571,7 @@ func init() {
0xc766a92976e389c4,
0xc793e50592935b4a,
0xcbd96442ae3bb01a,
0xd4d18de97bb12de3,
0xd58a254e7a792b87,
0xdc3ed6801961e502,
0xe3e37d096a5b564e,