TUN-2591: ReconnectTunnel now sends EventDigest

This commit is contained in:
Adam Chalmers 2019-11-25 11:57:06 -06:00
parent 43babbc2f9
commit 379cb16efe
4 changed files with 287 additions and 262 deletions

View File

@ -12,6 +12,10 @@ func (i TunnelServer_PogsImpl) ReconnectTunnel(p tunnelrpc.TunnelServer_reconnec
if err != nil {
return err
}
eventDigest, err := p.Params.EventDigest()
if err != nil {
return err
}
hostname, err := p.Params.Hostname()
if err != nil {
return err
@ -25,7 +29,7 @@ func (i TunnelServer_PogsImpl) ReconnectTunnel(p tunnelrpc.TunnelServer_reconnec
return err
}
server.Ack(p.Options)
registration, err := i.impl.ReconnectTunnel(p.Ctx, jwt, hostname, pogsOptions)
registration, err := i.impl.ReconnectTunnel(p.Ctx, jwt, eventDigest, hostname, pogsOptions)
if err != nil {
return err
}
@ -38,7 +42,8 @@ func (i TunnelServer_PogsImpl) ReconnectTunnel(p tunnelrpc.TunnelServer_reconnec
func (c TunnelServer_PogsClient) ReconnectTunnel(
ctx context.Context,
jwt []byte,
jwt,
eventDigest []byte,
hostname string,
options *RegistrationOptions,
) (*TunnelRegistration, error) {
@ -48,6 +53,10 @@ func (c TunnelServer_PogsClient) ReconnectTunnel(
if err != nil {
return err
}
err = p.SetEventDigest(eventDigest)
if err != nil {
return err
}
err = p.SetHostname(hostname)
if err != nil {
return err

View File

@ -433,7 +433,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)
ReconnectTunnel(ctx context.Context, jwt, eventDigest []byte, hostname string, options *RegistrationOptions) (*TunnelRegistration, error)
}
func TunnelServer_ServerToClient(s TunnelServer) tunnelrpc.TunnelServer {

View File

@ -293,7 +293,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);
reconnectTunnel @5 (jwt :Data, eventDigest :Data, hostname :Text, options :RegistrationOptions) -> (result :TunnelRegistration);
}
interface ClientService {

View File

@ -2890,7 +2890,7 @@ func (c TunnelServer) ReconnectTunnel(ctx context.Context, params func(TunnelSer
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 3}
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 4}
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))}
@ -3888,12 +3888,12 @@ type TunnelServer_reconnectTunnel_Params struct{ capnp.Struct }
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})
st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 4})
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})
st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 4})
return TunnelServer_reconnectTunnel_Params{st}, err
}
@ -3921,37 +3921,51 @@ func (s TunnelServer_reconnectTunnel_Params) SetJwt(v []byte) error {
return s.Struct.SetData(0, v)
}
func (s TunnelServer_reconnectTunnel_Params) Hostname() (string, error) {
func (s TunnelServer_reconnectTunnel_Params) EventDigest() ([]byte, error) {
p, err := s.Struct.Ptr(1)
return []byte(p.Data()), err
}
func (s TunnelServer_reconnectTunnel_Params) HasEventDigest() bool {
p, err := s.Struct.Ptr(1)
return p.IsValid() || err != nil
}
func (s TunnelServer_reconnectTunnel_Params) SetEventDigest(v []byte) error {
return s.Struct.SetData(1, v)
}
func (s TunnelServer_reconnectTunnel_Params) Hostname() (string, error) {
p, err := s.Struct.Ptr(2)
return p.Text(), err
}
func (s TunnelServer_reconnectTunnel_Params) HasHostname() bool {
p, err := s.Struct.Ptr(1)
p, err := s.Struct.Ptr(2)
return p.IsValid() || err != nil
}
func (s TunnelServer_reconnectTunnel_Params) HostnameBytes() ([]byte, error) {
p, err := s.Struct.Ptr(1)
p, err := s.Struct.Ptr(2)
return p.TextBytes(), err
}
func (s TunnelServer_reconnectTunnel_Params) SetHostname(v string) error {
return s.Struct.SetText(1, v)
return s.Struct.SetText(2, v)
}
func (s TunnelServer_reconnectTunnel_Params) Options() (RegistrationOptions, error) {
p, err := s.Struct.Ptr(2)
p, err := s.Struct.Ptr(3)
return RegistrationOptions{Struct: p.Struct()}, err
}
func (s TunnelServer_reconnectTunnel_Params) HasOptions() bool {
p, err := s.Struct.Ptr(2)
p, err := s.Struct.Ptr(3)
return p.IsValid() || err != nil
}
func (s TunnelServer_reconnectTunnel_Params) SetOptions(v RegistrationOptions) error {
return s.Struct.SetPtr(2, v.Struct.ToPtr())
return s.Struct.SetPtr(3, v.Struct.ToPtr())
}
// NewOptions sets the options field to a newly
@ -3961,7 +3975,7 @@ func (s TunnelServer_reconnectTunnel_Params) NewOptions() (RegistrationOptions,
if err != nil {
return RegistrationOptions{}, err
}
err = s.Struct.SetPtr(2, ss.Struct.ToPtr())
err = s.Struct.SetPtr(3, ss.Struct.ToPtr())
return ss, err
}
@ -3970,7 +3984,7 @@ 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)
l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 4}, sz)
return TunnelServer_reconnectTunnel_Params_List{l}, err
}
@ -3996,7 +4010,7 @@ func (p TunnelServer_reconnectTunnel_Params_Promise) Struct() (TunnelServer_reco
}
func (p TunnelServer_reconnectTunnel_Params_Promise) Options() RegistrationOptions_Promise {
return RegistrationOptions_Promise{Pipeline: p.Pipeline.GetPipeline(2)}
return RegistrationOptions_Promise{Pipeline: p.Pipeline.GetPipeline(3)}
}
type TunnelServer_reconnectTunnel_Results struct{ capnp.Struct }
@ -4316,251 +4330,253 @@ func (p ClientService_useConfiguration_Results_Promise) Result() UseConfiguratio
return UseConfigurationResult_Promise{Pipeline: p.Pipeline.GetPipeline(0)}
}
const schema_db8274f9144abc7e = "x\xda\xc4Z{\x90\x15ev?\xa7\xfb^\x9a\x81\x19" +
"\xeem{,f\x11\x18\x9d\xd2(\xac\x10\x15It\x12" +
"w^\xc0\xce\xb0<n\xcf\x1dPG6Es\xef7" +
"3=\xf4\xed\xbet\xf7\x05\x86\xe0\"\x14\xc6u\"+" +
"\xb8\x92\x12\x17\xb6\x045>\xc2f\xc1\x85\x8a\x1a\xb44" +
"\xd9\x8d\x98\xdd\xc4\xdd\x0d\xa4dc\xd5\xba\"\x95\xc2\x92" +
"2\xbe\xca\x98R;u\xbe~\xce\x9dq\x00\xb3U\xf9" +
"\x07n\x9d>\xdf\xe3\xbc~\xe7\xf1\xcdu\x83\x93Z\x85" +
"\xeb\xd3Wg\x00\xd4C\xe9\x09\x1e\x9b\xfd\xebM\x8f\\" +
"\xf5\x8f\xdb@\x9d\x86\xe8}\xe7\xd8\xe2\xfaO\xddm\xff" +
"\x01iQ\x02\x987$mBe\x87$\x01(\xf7J" +
"\xff\x09\xe8\xa5\xff\xe0\xe4\x9b\xe57\xa5\xed OK2" +
"\x0b\xc4\\\x9a\xb8\x18\x95\xad\x13\x89\xf9\xce\x89\x1b\x00\xbd" +
"?-\xbdv\xe0\x8fv\xff\x9c\x98\x85\x98\x19p\xde\x99" +
"\x89\x9bP\xf9\x94s~<q9\xa0\xf7\xe1\x83\x0d\x7f" +
"\xb3\xff_\x8f\xdf\x0d\xf2\xd5\x08\xc1\xd9u5\xbfA@" +
"\xe5\x8a\x9a\x1f\x03z\xffv\xdd\xe6\xb7W\x7f\xb8\xeb\xbb" +
"#\xcfM\x11\xdf\xcb5\xc3\xa8\x9c\xaa\x91@\xf4\xf6\xdd" +
"Q\xff\xcf\xf8\xc8'\xbb@\xbe\x86\xb6A\xfa|\xb4f" +
"\x92\x00\xa8\xfcKM\x0b\xa0\xf7\xda\xb5\xc7\x9e\xdf\xf9\x93" +
"{~\x00\xea\xd5\x88\xe0\xaf?W\xf3?t\x0eN\"" +
"\x86\xf7\x1f\xfbz\xeaG\xaf]\xf2C\xce\xe0=\xfe\xab" +
"[\x9f\xd9\xf9\x93\xcb\xdf\x81\x15\x82\x84)\x80y\xb3&" +
"\xd9\xc4;\x7f\x12\xe9\xe2\xc1\xd7_XV\xda\xf5\xf0\x01" +
"\xff\xd2|\xafK'\x0b\x02\xa4\xbc\xed]\x9f\x94V<" +
"\x9a\x7f4)N\xcd\xe4\x0fh\xe9\x8c\xc9$\xce\xfc\xdf" +
"\x9cY\xbe\xf4\x99\xbe'\x02\x06~\xd1\xe7&?C\x0c" +
"\xafN\xa6{\x1c\xdf\x90\xbd\xaf\xed\x8f\xef\x7f\xa2\xda*" +
"i~\xe3\xc9\xc3\xa8\xa4k\xe9'\xd6\xde\x8a\x80\xde\xf0" +
"\xcd/\xac\xfc\xf0/\x9c\xa7A\x9d\x83)\xef\xa7\xf7\x9e" +
"^?\xeb\xa9\xbeW\xf8\xb5E2c\xdd\xafi\xeb\x1d" +
"utv\xdd\xdf\xcf^v\xff\xdbK\x0e\xd3\xd6\x09\xb3" +
"\xf8\x97\x983\xa5\x19\x95[\xa6\x90en\x9eB\xdc\xbf" +
"\xbcv\xe5\x8b/\x1e\xea?\\}\x11n\xf1SS\x16" +
"\xa3r\x8es\x9f\xe5\xdc\x97v\xe1\x1b/]\x9f\xfa\xbb" +
"\xa4\xe0\xfb2\xef\xd0\xe1\x873\xc4p\xc7gG\xffa" +
"\xe1{'\x9eKZH\xcd\x0ad!\x96%\xc1{\x87" +
"\xb1\xf4Fs\xeb\x8b\xa0^\x83\xe8\x0d\xee\xde\xecv>" +
"\xb4\xc3\x83\x15(\xa1\x000oGv\x13m\xb6'K" +
"\xfe5\xe3\\{\x9d\xf9\xde\xb6\x97\xaa\x9c\x91\x9f\xfaq" +
"v1*52]--\xff\x18\xf0\x93\xa7\xef\xd9\xd9" +
"uz\xc1+\xea4LU\x0b\xbd_\xde\x84\xcaQ\xe2" +
"\x9dwXn$}F\x1a\xacb\xe7R\xff\xee\x92A" +
"T>\xbe\x84~\xbe\x7f\x09g_|\xc7\xf7\x1fH\x9f" +
"\xf9\xfe+\xd5*\xa5\xc0\x99\xf7\xb9b\xa3\"\xd7s\x97" +
"\xae\xff\xad\x00\xe8M;\xf4'\x7f\xdb^<\xf5\xf31" +
"\x82H\xb9e\xea\x07J\xd7T\xfa\xb5p*\xc9xz" +
"\xce\xe1??\xbb\xe3W'\x92\x9e\xb2\x7f*\xf7\xd8\xa3" +
"SIa\xf7|}h\xd3\xb2\xab\x86OV\x1b\x88s" +
"\x9e\x9c:\x8c\xca9\xbe\xddY\xbe\x9dpF\xfb\xda]" +
"\xff\xfe\x8d7\x12>{{\xc3[\x08)o\xd9\xca;" +
"\x06k\xee<}:y\xd0\xd2\x06n:\xad\x81\x0e:" +
"\"?\xa0\x1c\xdb\xff\xd7o\xd3AR\xb5\xba\xb76\xf4" +
"\xa2\xb2\xbb\x81~\xeejx\x82\x84\x8cbg,\xc7\xd9" +
"qY3*\xfb.\xa3{\xed\xb9\x8c\xee5\x7fu\x1b" +
"[u\xd3m\xef\x80<M\x1c\x01\x15\xa7\x88\xf3,q" +
"\xce;s\xd9=\xa8\x9c\x9b.\x01x\xdf\xeb\xef}\xf5" +
"\xfd\x8e\xfd\xffU\xbd9\x17\xe8\xe4\xf4fT\xceL\xe7" +
"\xa6\x9a\xce\xed3\xef\xfa\xbf<\xb7\xfb\xd1\x8e\xf7G\xed" +
">gf;*\xb7\xcc\xe4\xee>\xf3\x9b\x8a>\x93o" +
"\xfe\x9d\x05\xcbonz\xf9\x83\xa4&\xd4\x99<z\xd9" +
"L\xd2D\xdfM\xef~\xf3\xaa\xef\xfd\xd3\x07U\xf6\xe3" +
"\x8cw\xcf\x9c\x8d\xcan\xbe\xe3.b~o\xd1\x0fO" +
"L\xcbL\xfbh\xac8>:s\x10\x95W\x89w\xde" +
"\xcff\xdeO\x17\xbd\xed\xad\x877\xb4\xfc\xe0\xa3OH" +
".\xb1\x0a\xe7\x86.\xefEe\xc7\xe5\x1c\x8b/\xa7X" +
"Zr\xf0\xd47\x06v\x1f\xfftL\xe4\x9e\x7f\xc56" +
"T\xba\xae\xe0\x8et\x05\xa1\xd5_I{O\xdf\xf5\xdb" +
"?\xfb,)\xd5\x9c\xa6\xb7H\xaa\xb6&\x92j\xf3{" +
"{:\xef_u\xf0\x8b$\x83\xd6\xf4<1\xac\xe3\x0c" +
"Q0\x8e\xe5i\xbb\x9a\xdaQ\xd9\xdfD\xe7\xedkj" +
"\x819\x9e[1Mf\xd8\xe5T\xe1\x0f\xc3\x9f\x85\xb9" +
"\x05\xadl\x96\x9b\xdb*\xee\x003]\xbd\xa0\xb9\xac\x9b" +
"\xb58e\xcbtX\x0eQ\xcd\x8a)\x80\x14\x02\xc8\xda" +
" \x80\xbaZD\xd5\x10PF\xac'\xb4\x96u\"\x0e" +
"\x88\xa8\xba\x02\xca\x82PO\x88 \xafk\x02P\x0d\x11" +
"\xd5\x8d\x02\xa2XOx'W\x1e\x00P7\x8a\xa8n" +
"\x17\xd0+3\xbb\xa4\x99\xcc\x84\x8c\xbb\xd0\xb6\xb1\x16\x04" +
"\xac\x05\xf4l\xe6\xdaC\xda\x1a\x032,A\x96\x067" +
"\xb8X\x07\x02\xd6\x01z\x03V\xc5vV\x98.\xeaF" +
"7\xeb\xb3\x99\x83\x038\x01\x04\x9c\x008\x9ex\x1d\x96" +
"i\xb2\x82\x9b\xaf\x14\x0a\xccq\x00H\xb2\x89\x91d\xb3" +
"\x1e\x06P\xaf\x15Q\xbd)!\xd9|\x92\xecF\x11\xd5" +
"V\x01=\x87\xd9\xeb\x99\xbd\xc4\xc2\x82\xe6\xea\x96\xb9L" +
"\x13K,\xbav\xc1\xd0\x99\xe9vX\x901\xfb\xf4~" +
"\xcc\xc6\xa1\x00\x88\xd9\xf1/\xb6p\xa3\xee\xb8\xba\xd9\xdf" +
"\xc3\xe9-9\xcb\xd0\x0bCt\xbbZ\xae\xc9\x19\xcd\xb4" +
"\x87|i/\x00\x0a\xb2\xdc\x0e\xd0\xa2\xf7\x9b\x96\xcd\xbc" +
"\xa2\xee\x14H(\x10\x0b\xee\x965\x9a\xa1\x99\x05\x16\x1d" +
"4a\xf4A\xfe\x01y.\xc7\\-a\xed+s\x9a" +
"\xad\x89%G\xad\x8d\xf4\xb1\xb0\x17@] \xa2\x9aK" +
"\xe8c\xe9b\x00u\x89\x88\xeam\x09K\xafh\x07P" +
"s\"\xaa\xab\x04\xf4,[\xef\xd7\xcd\x0e\x06\xa2\x9d4" +
"\x98\xe3\x9aZ\x89\x01@\xa8\xb0-V\x99\x94\xe8`6" +
"F\xe9*M\xa5G\x0b\xd0\xc9\x0c\xc3\xba\xd5\xb2\x8d\xe2" +
"r\xff\x1c\x8b\xb4\xcdM\x19-\x93\xc6\xb0<7\x0e\xc9" +
"\xad\x17\xd8\xdc\x8a\xc3\xfcu\x15\x9b\x1b\xf2\xcan\xe6T" +
"\x0c\xd7\x01PS\x91\xf8u\xcd\x00\xeaD\x11\xd5z\x01" +
"[l\xce\x80\xd9\x18\xd4\xab\xaez>]WL\x9b\xf5" +
"\xeb\x8e\xcbl\x9f|e\x0b)\xbc\xe4$\x0f$\xff\xcb" +
"\x8a\xa8N\x17\xd0\xeb\xb7\xb5\x02\xcb1\x1bu\xab\xb8L" +
"3\xad\xbc\xc8\x0a\x98\x06\x01\xd3\xe3{\xd2\"M7X" +
"\xd1\x97nn\xa1\x91\xffO\xd1[\xeby~\xf8\xf6\xc6" +
"\xe1[\x87_xA\xfcn\x8a\xe3\xb7N\xf8\xdc\x1b\x1d" +
"\xc0u\xe2g^\x10\xc2\x14\x11\xae\x88\xea]\x14\x11\x95" +
"2\xe9\xd4\x01\xd1\xb21\x1b\xa3d\xa0\x1dV\xec'M" +
"\x9b\xd0\xc2\x0a\xa4h\xcc\x86\xd9\xdeg\x90\x8a\xd6\x00f" +
"\xe3R&Xf\xb3\xf5\xccvX\x0e2\xb6\xb5q\x08" +
"\xb3q\xd6\xaf\xd2\xfa\x94\x8b\xd5zh\xe8h\xd5\xf8\xeb" +
"mV\xf0!#X\x9ek\xf4\x8d\x96\x08\x12\xd2Q\xab" +
"\x88\xea\x92D\x90tQ\x90t\x8a\xa8\xf6$\x82Dm" +
"\x8f#\xa7\x0a\xcc~O\xb11\xe2\xea\xc1\xc5\xa3+'" +
"\xfc\x8c\\\xa0VD\xb5\x810\x98\xbe2\x97\xa2\x95N" +
"\x8b\xaa\xdb\xf3\x9f\xd6A\xff\x06\x88\x9a\x0bv\xb1\x03P" +
"m\x88\x0e\xdbC\x87=$\xa2\xfaXB?\xfbm\x00" +
"\xf5\x11\x11\xd5\x83\x02b\xa0\x9e\xa7\x0e\x00\xa8\x07ET" +
"\x9f\x15P\x16\x05\xdf\xd7\x8e\xce\xa6^HD\xf5\x17\x02" +
"\xca)\xb1\x9eJ}\xf9U\x8a\x93_\x88\xa8\xbe.\xa0" +
"\x9cN\xd5c\x1a@>\xb9\x06@=!\xa2\xfa\xe6\x97" +
"AP\xc1\xb0*\xc5>C\x83F\x9b\x15\xbb\x16Dt" +
"\xb3R\xca\xd9l\xbd\x8eV\xc5is]V\x92\xca\xae" +
"\x13f\x93\x8c\xab\xf5;8\x050'\"f\xe3\xfa\x10" +
"\x90\x88\xd1\x9eh\xb3\xe2Jf;\xbah\x99QB\xd0" +
"M\x97\x99\xee\x12\x0d\xa45\xcc\x88\xa8\xe3\x00Fw\xe0" +
"\xf6\xe4\xf4A\x04[1\xc8a?\xb9\xddt\xcf\x0b\x94" +
"\xb8pv\xecy3\xf0\x0b\"\x93\x1e\xbb\xbac\xdf\x9b" +
"!|Nd\xd2\xa4\xda\x1bCtf\xc0u\xcb\x98\x8d" +
"\xeb\xc6\xc0\xd8\x1b\xd8\x1a\xc7*\xace\x80\x84tQ\x11" +
"\x13|\x1d\x08\x90\x17D\xa3\x88\xd9\xb8\xef\xab\xf2\x14\xf1" +
"\xcb\xd2n\x0b%y\xcb\xe6Y-\x0e\x9f\x1bb!\xa2" +
"\xe8\xe9MFOk\x10=k\xe2\xfb7\x16\xb4\x8a\xc3" +
"F\xd6\x0bm}.\x88\xcc\x8e \xd2\x19\xb0*F\xb1" +
"\x9b\x81\xe4\xdaC\x88 \x8e\x0f\x9c\x0b\xac\xce\x84\xe2" +
"}7\x1e;\x17F\xa9\xb07\x99\x0a\x03\xf5\xaf \xf5" +
"\xf7\x88\xa8\x96\x05\xf4\x0c\x82\x1e\xb3\xd3\x02\xd1q\xa3\xeb" +
"\xfa\xc4\x9c\xc5\x9dS\x02\x01%@\xafRv\\\x9bi" +
"%\xc0\xc8\xdb\x88\x7f\xcaEd\x98*\xa4\xcbi\x99j" +
"\xa8\xfa\x7f\xcf\xe7\x17\x9f\x98\xfd$9\"-\x1fHd" +
"\xc9B\xb0\x1a\xf9\xf2\x0e\xcb\x94.\xba\xf4\x0a\x10\xccO" +
"\x0cs\x83DOUa\x981g\x11\xc2_)\xa2z" +
"]2c\xce!\x15]#\xa2z\xa3\x80\x12\xb3)\xf9" +
"E\xed\xbb\x7f\xe8\x16\xc7/31\x1b\xcff\xce\x7f\x9d" +
"D\x05\xae[\xe6(7\x1c3\xdb\xdc\x90\xb0kh\xc2" +
"\xa5k\x12\xd9f-\x1b\x0a\xad\xd4\xc8J\x9a\x1e\xa3Q" +
"`\xdc6\x90\xbe\x15\xf3\x8c[\xa9\x06\x19\xdd\xcf\xe7-" +
"\xbe\xb5\xe8\x92\xf5\xd1%\xef\x1c\x06P\xef\x12Q\xbd/" +
"q\xc9{\xa9\xf0\xbfOD\xf5\xa1\xc4%w\x93\x12w" +
"\x8a\xa8\xee%\xcc\x0fZ\x84=d\xe0\xbd\"\xaaO\x0a" +
"\x88)\x1f\xf2\x1f'\xc8\x7fRD\xf5\x88\xc0\x01\xbb\xb3" +
"\xad\xc321\xb8\x84\x03\x10\x15\xff\x03L\xb3\xdd5L" +
"C\xb7\xcbt\x99\xbd^C#\x84\x84-\xae^bV" +
"\xc5\x8d \xa2\xa4m\xe4\xd5\x12\x16;\xfdU\x92\xe6:" +
"X\x03\x02\xd6PD:\xcc\xee\xb0Y\x11\xc9\x1a\x9a\x91" +
"\xd3Dw\xe0B\x144\x12\xc43c\xa8\x87j\xad\xcd" +
"\"\xaa\xdf%(\xc1\xc4\x88H\xbe{\x10\x04\x8e$$" +
"\xf3\xba\xf6\xb8\xfa\xe2\x091]\xd5?\xf1\x848\x01@" +
"\xdeJ\xda\xd9.\xa2\xbaS\x08\xaf\xd6iA\x8b\x1f\xa1" +
"\xd5\xa6\x0e\xfa\x93-\x84\x9a:\x8b\xe5\x0d\xea\x05\x1d-" +
"\xb3\x87+\x0acM\x15\xacR\xd9&W\xd6-S\xad" +
"h\x86.\xbaC\xd1\xc2quA\x90\xe4\x87\xf2\xf2r" +
"#7\x16)\xe3\xc6P\x19\xca\xb7q1@~\x15\x8a" +
"\x98\x1f\xc0\xd8]\x14\x86\xed\x00\xf9\xd5D70\xf6\x18" +
"E\xc7i\x00\xf9\"\xd1\xcb\x18\xb5\x95J\x09\x9f\x06\xc8" +
"\x97\x89\xbc\x19\xe3RA\x19\xe2\xdbo$\xfav\x8c\xab" +
"\x05e+\xce\x06\xc8o&\xfaCD\x9f pM*" +
"\xbbq\x10 \xff \xd1\x1f!\xba\x94\xaeG\xde8\xa3" +
"\x0d\x90\xdfK\xf4'\x89>\xb1\xa1\x1e'\x02(\x8fs" +
"\xfacD?D\xf4\x9a\xaf\xd5c\x0d\x80\xf2#\xdc\x06" +
"\x90?H\xf4g\x89>\x09\xebq\x12\x80r\x14\x1f\x06" +
"\xc8?K\xf4\x9f\x12}\xf2\x84z\x9c\x0c\xa0\xbc\xcc\xef" +
"s\x8c\xe8\xc7\x89^\x9b\xaa\xc7Z\x00\xe5gx\x00 " +
"\x7f\x9c\xe8'0\xc2\xbb\xaeb\x12v\xc9\xdd\xf4\xb8\xec" +
"\x10-'29\x0b\xdaJ\xf4sB\xce\xcaP_\x89" +
"\x99x\xfe\x0b\x88\x19@\xaflY\xc6\xb2\x91p~\xbe" +
"\xca'p\x17\xc8XfW1\x8a?\xdf\xc9\x96X\xd0" +
"X\xd0\x8c\xaer\\\x0b9m\x15\xd7\xaa\x94\xa1\xb1\xa8" +
"\xb9\xac\x18%d\xbbb.\xb2\xadR\x0f2\xbb\xa4\x9b" +
"\x9a\x01\xd1\x97\xf1|.S\xa9\xe8\xc5h\xefq\x0b\xb8" +
"\xc8=\x85j\xf7l,7\xf7h\xfdU#\x80\xd91" +
"\xd6G\xd05\xe7\x86\x18\xea3\xc9\x90j\\\xaf\x19\x15" +
"v!\x95\xdd\xb8MEw\x8b\xdf\x94\x9c\xaf\xf7\x0c\x07" +
"V\xe7/\xcdWT\xa5Q?\xb9\x8d\x9aw\xb4\xc7\xc2" +
"F\xb2\xda\xc1\x0c\xa4S\x88\x13Xh\x92\xbe\xa0\xb7\x84" +
"F\xda;\xe1\x1c\xd1D1p\x8e\x0b\xd5D?s\xfd" +
"_]f\x9fE\xb9^\xd2J\xceW\\\xdd\xcd\x9c\xcc" +
"\x85h1\x9e\x11\x9e?\x19w\xf6\xf4\xe4\xe21\x83\xe8" +
"#\xf9u\x11x\xb5a7@\xbe\x95\xa2s\x09F:" +
"T\xba8\x88t\x12\xb9\x07\xe3\x12VQ9X\xe4\x88" +
"\xbe\x0a\xe3&G\xb9\x9d\x07y\x8c\x81\xa96\x1f\xbc\x18" +
"\xdf>\xc2:9\x8d>x\x95\xf8\xfe\x06\xd17&\xc1" +
"\xab\x82\xc3#\xc0N\x12}\xf0\xda\xcaAg;\xd1w" +
"r\xf0J\xf9\xe0\xb5\x03\x9f\x01\xc8\xef$\xfa^\x0e^" +
"i\x1f\xbc\xf6\xe0\xf3#\xc0n\xd2\x04\x1f\xbc\x1e\xe7\xfc" +
"O\x12\xfd\x08\x07\xafv\x1f\xbc\x0es\xb0;D\xf4c" +
"\x04R\x15\xdb\xc8\xbb\xb6n\x02\xf6\xc7\xb1Q(\x7f\x8b" +
"\xb1r\x1bd\x0c}=\x8b\x12KQ\xd7\x8c\x05\x15\xcd" +
"\x80\xc6\xbc\xab\x15\xd6\xc6u\xba\xe1tjf\xd1\xc1\x01" +
"m-\xa3t$%\x13\xb7k8+\x99\xad\xf7\x01\xc6" +
"\x95}T\xc8dr\x96U]\xdf\xf0\x02\x91\xd9>\xc2" +
"E\xdfJ\xda\xc6\xae\xa2\xc1:0,gD3N\x87" +
":}\xb1L\x13\xfd\x1a\xa3Go\x1cY<\x94\x83^" +
"!,BzZ\xaa\xaa\x0b\xb6\xb1\xcc\x0an\x87\x85\xa6" +
"\xab\x9b\x156j\x83\xc2@\xc5\\\xcb\x8a\x0b\xd1,X" +
"E\xdd\xec\x87QM\x8a\xf8e\xd3\x9dD\xd5\xc5\xa3\x19" +
"\x13\xafc\xf2\xacf\x108tQ\x0d!7\xc7\xad~" +
"K\x81\xafj\xb1\x99\xe6$\xba\xd4qN\x0b\xa6\x91~" +
"\x90\xf9m}\x1a zJ\xc2p\x1c/\x1f\xde\x04\x82" +
"\xfc\x94\x84\xf1+\x06\x86\x8f\x16\xf2>\x1b\x04y\xb7\x84" +
"B\xf4\xc4\x87\xe1\xf3\x9c|\xef0\x08\xf2\xdd\x12\x8a\xd1" +
"\xb3\x1b\x86\xb3ny\xa8\x1d\x04\xb9$a*z\x82\xc4" +
"pP.kT'\xdd.a:z\xcf\xc3\xf05F" +
"^\xba\x0d\x04y\xa1\xe4\x85\xed\x10\xb4\xf8b\xb4\xa2\x17" +
"\x02\x064r\xc8hE/\x9c\x0fa\xd86\x01\xb4\xe2" +
"\x96\x00\x9e[\xd1\x0b'\xa4\x90)h.k\xa5^\xd3" +
"\xff\x88\x01xC+&'\x8f\xe2\x9758c\x17\xca" +
"\xedq1\x17\x02\xf0\xd6\xe1\xb8\x96\x8b\x9a\xca\x1dO'" +
"\xeb\xe4`6\xb2g[0Y9\x92\x98\x8d\x1c\xa6\xe2" +
"\xf9\x88\x88\xea/\x85\xb82\x08}:\x1c\xd6\xa1e\x87" +
"]\xee83\xbb\xc0\xf3\x83\x1a\xb6zr\xe7\x15\xad\x01" +
"^\xe3\xa2\xbf\x95\x03q:H\x8e\xf3\xa6$\xc6y\x18" +
"\xf6\xd7\xd2\x88\xec\x91\x1c\xeeM9O\xb3\x96\xec\x16y" +
":Kq\x97\x0c\x1f/1|g\x96er\xad:\xc9" +
"\x0b;J\x0cs!T\x99\xec\"\xdb\xean\xd6\xf8\x7f" +
"I\xd6c8\x88\x7fN\x86<\xd2\x17(\xdaw01" +
"\xa73\xac\xa0#\xcc,K\x16\xf5\xe3\xe8\xca\xbfpX" +
"\x82gh1\xed?=\xda\xffhS0\\;\x96(" +
"v\x9ek\x0a\x1c\xe8\xa5D\x9f\xf6\xc2b\x00\xf5\x98?" +
"q\x0b_rN\x92\xa3\xbe.\xa2\xfav\xc2\xfd~G" +
"\x8co\x8a\xa8\xbe\x1b\xe7+\xf9,\xf5,\xef\x8a\xa8\xfe" +
"7%\xab\x94\xdf\xb3|L\xfd\xe9G\"vc\xd0?" +
"\x87\xcf<\x15;Fo\xc3\xea_\xa2\x9b\xcc\xa1\xb2\xb4" +
"j*\x12\xbe\x1d\xa1K\x98X\xb1\x09\xd8G\x02h\xd7" +
"\x82D5\x1b\x0d\x89\x90\xd9y\x8a\xe1\":\xd1\xf0\x85" +
"\xadg\xa6\xbb@\xef\x07\x899\xf1\x88c\x1c\xd5\xe6\x83" +
"@\xf2\xe3(\xa8\x0b\x12]\xfa\x81\xc4\x00+T\xac\xfa" +
"|0\x18Z\x9dP\xec\xb7I\x0b\xabDT\x07\x04\x0e" +
"6\xd6\x8arQC\x97-\xb2\xd9\xba\x0a\x93\xcc\xc2P" +
"\xdc\xadR\xbfVpV`\x99*\xe8E6kYW" +
"aI\x86\xf0\xc5\x00$\xdd*\x8ez*\x18\xa3J\xbc" +
"\x95\xad\xc9[\x85\xb5\xcc\x1d\xf1\x92R\xf5\xda\xd7\x1d?" +
"\x17D\x8f}\xdd\xc9\xc7\xbe\x00\xa2\xd6\x91\xb3\x96ET" +
"7' jh8nu\xc7.\x0b~?\x99\xfc+" +
"=xQQ,]H\xc1\x18\xfd\x1d\xceW\x9c\xc0_" +
"h}\x1f?\xe3^\xe4\xd4\x0a\"\xdc\xc0\xc4\x9fi\xd0" +
"!B\xb0\xf9\xff\x06\x00\x00\xff\xff\"\xcf\xdc\xc0"
const schema_db8274f9144abc7e = "x\xda\xccZ}\x90\x14ez\x7f\x9e\xeeY\x9a\x85]" +
"f:=\x96+\x02#[\x12\x85\x13\xa2\"\x89\xb7I" +
"n\xf6\x03\xb8]\x8e\x8f\xe9\x9d\x05\xbd\x95K\xd1;\xf3" +
"\xeen/=\xddCw\x0f\xb0\x1b8\x84\xc2xl\xe4" +
"\x04OR\xe2\xe1\x95\xa0\xc4\x8fp9\xf0\xa0\xa2\x06-" +
"M\xee\"\xe6\x8ex\\ %\x17\xadS\xd1J\x9d\xa5" +
"eP)c\xca\xb3SO\x7f\xef\xec\xba\x80I\xaa\xee" +
"\x1f\x98z\xfay?\x9e\xaf\xdf\xf3\xf1\xee\x8dC\x93\x9a" +
"\xb9\x9bj\xaeK\x02\xc8\x87k&8l\xce/\x87\x1e" +
"\x9e\xf5\x8f\xdb@\x9e\x8a\xe8|\xfb\xf8\x92\xf4\xa7\xf6\xb6" +
"\x7f\x87\x1a^\x00\x98?(\x0c\xa1\xb4S\x10\x00\xa4\x1d" +
"\xc2\x7f\x00:5\xbf\x7f\xe6\x8d\xf2\x1b\xc2v\x10\xa7\xc6" +
"\x999b.M\\\x82\xd2\xd6\x89\xc4\xbcy\xe2\x06@" +
"\xe7OJ\xaf\x1c\xf8\xc3=?#f.b\x06\x9c\xff" +
"\xce\xc4!\x94>u9/L\\\x01\xe8|t\x7f\xc3" +
"\xdf\xec\xff\x97\x13w\x81x\x1d\x82\x7fv}\xed\xaf\x10" +
"P\x9aY\xfb#@\xe7_o\xdc\xf4\xf6\x9a\x8fv\x7f" +
"g\xe4\xb9\x09\xe2{\xb1v\x18\xa5\xb3\xb5\x02\xf0\xceC" +
"w\xa4\xff\x19\x1f\xfed7\x88\xd7\xd36H\x9f\x8f\xd5" +
"N\xe2\x00\xa5\x93\xb5Y@\xe7\x95\x1b\x8e?\xbb\xeb\xc7" +
"w\x7f\x1f\xe4\xeb\x10\xc1[\xff~\xed\x7f\xd398\x89" +
"\x18\xce?\xfa\x95\xc4\x0f_\xf9\xbd\x1f\xb8\x0c\xce\xc1S" +
"\xb7=\xb5\xeb\xc7\xd7\xbc\x0b+9\x01\x13\x00\xf3gO" +
"2\x89w\xc1$\xd2\xc5\xfd\xaf>\xb7\xbc\xb4\xfb\xc1\x03" +
"\xde\xa5\xdd\xbd\xae\x98\xccq\x90p\xb6w|RZ\xf9" +
"H\xfe\x11_\x1c\xf7S\xed\xe4\x0fi\xe9\xf4\xc9\xb4t" +
"\xc1\xaf\xdeY\xb1\xec\xa9\xde\xc7|\x06\xf7\xa2\x9fN~" +
"\x8a\x18j\xeb\xe8\x1e'6\xa4\xeei\xf9\xa3{\x1f\xab" +
"\xb6J\x0dq\xce\xad\x1bFiQ\x1d\xfdl\xa9\xbb\x0d" +
"\x01\x9d\xe1\xaf>\xb7\xea\xa3\xbf\xb0\x9e\x04y.&\x9c" +
"\x9f\xec8\xb7~\xf6\x13\xbd/\xb9\xd7\xe6\x01\xe6?S" +
"\xffK\xda\xfad=\xa9\xb2\xfe\xef\xe7,\xbf\xf7\xed\xa5" +
"Gh\xeb\x98Y\xbcK\x94\xa64\xa1\xb4y\x0aYf" +
"p\x0aq\xff\xe2\x86U\xcf?\x7f\xb8\xefH\xf5E\\" +
"\x8b_\x95\\\x82\xd2\xdc$q\xcfN\x12\xf7\x15\x1d\xf8" +
"\xda\x0b7%\xfe.n\xc7\xd7\x93\xef\xd2\xe1\xe7]\x86" +
";>;\xf6\x0f\x8b>8\xfdL\xdcB\xbbS\x1cY" +
"\xe8`\x8a\x04\xef\x1e\xc6\xd2kM\xcd\xcf\x83|=\xa2" +
"3\xb0g\x93\xdd\xfe\xc0N\x07V\xa2\x80\x1c\xc0\xfc\x93" +
"\xa9!\xda\xecl\x8a\xfck\xfa\xfb\xad\xf5\xfa\x07\xdb^" +
"\xa8rF\xf7\xd4\x05\xe2\x12\x94:D\xba\xda\"\xf1G" +
"\x80\x9f<y\xf7\xae\x8es\x0b_\x92\xa7b\xa2Z\xe8" +
"7\xc5!\x94.\x10\xef\xfc\xf3b\x86\xf4\x19j\xb0\x8a" +
"\xdd\x95z\xa64\x80\xd2\x02\x89~\xde$\xb9\xecK\xee" +
"\xf8\xde}5\xef|\xef\xa5j\x95R\xe0\xcc\xff\xd3\xb4" +
"\x89\x92\x9c\xa6\x9f\xcb\xd2\xbf\xe6\x00\x9d\xa9\x87\xff\xf8o" +
"[\x8bg\x7f6F\x10I\x9b\xaf\xfcP\xdaq%\xfd" +
"\xba\xebJ\x92\xf1\xdc\xdc#\x7f\xfe\x9b\x9d\xa7N\xc7=" +
"\xe5\xcd+]\x8f\xbdp%)\xec\xee\xaf\x0c\x0e-\x9f" +
"5|\xa6\xda@.\xe7\x15\x0d\xc3(\xcdmp\x0d\xd4" +
"@\xdbq\xef(W\xdd\xf9o_{-\xe6\xb3{\x1b" +
"\xdeBH8\xcbW\xdd1P\xbb\xf9\xdc\xb9\xf8A;" +
"\x1b\\\xd3\xedo\xa0\x83\x8e\x8a\xf7I\xc7\xf7\xff\xf5\xdb" +
"t\x90P\xad\xee\x17\x1b\xbaQ:C\x07\xcd?\xd5\xf0" +
"\x18\x09\x19\xc6\xceX\x8es\xf2\xea&\x94^\xbf\x9a\xee" +
"u\xf6j\xba\xd7\x825-l\xf5\xad\xb7\xbf\x0b\xe2T" +
"~\x04T\\5\xad\x09\xa5\xd9\xd3h\xd1\xaciw\xa3" +
"4w\xba\x00\xe0|\xb7\xaf\xfb\xe5\xf3m\xfb\xff\xb3z" +
"s/\x08\xa77\xa14k\xbak\xaa\xe9\xae}\xe6\xdf" +
"\xf4\x97\xef\xefy\xa4\xed\xfc\xa8\xddK3ZQ\xda<" +
"\xc3u\xf7\x19_\x97\x9e\x98\xe1n\xfe\xed\x85+\xbe\xda" +
"\xf8\xe2\x87qM\xec\x9e\xe1F\xef\xc1\x19\xa4\x89\xde[" +
"\xdf\xfb\xfa\xac\xef\xfe\xd3\x87U\xf6s\x19\x7f:c\x0e" +
"Jg\xdc\x1dO\x11\xf3\x07\x8b\x7fpzjr\xea\xc7" +
"c\xc5\xf1\x85\x19\x03(\xd5f\xe8gM\xe6^\xba\xe8" +
"\xedo=\xb8!\xfb\xfd\x8f?!\xb9\xf8*\x9c{\xe6" +
"\x9an\x94N^C;\xbf|\x0d\xc5\xd2\xd2Cg\xbf" +
"\xd6\xbf\xe7\xc4\xa7c\"we\xe66\x94v\xcct\x1d" +
"i&A\xce_\x09\xfb\xce\xdd\xf9\xeb?\xfb,.U" +
"\xa9\xf1-\x92jk#I\xb5\xe9\x83\xbd\xed\xf7\xae>" +
"\xf4y\x9ca\x7f\xe3\xb3\xc4p\xc4e\x08\x83q,O" +
";\xd5\xd8\x8a\xd2\x9b\x8dt\xde\xeb\x8dY\x98\xeb\xd8\x15" +
"]g\x9aYN\x14\xfe \xf8Y\x98WP\xcaz\xb9" +
"\xa9\xa5b\xf73\xddV\x0b\x8a\xcd:Y\xd6*\x1b\xba" +
"\xc5r\x88r\x8aO\x00$\x10@T\x06\x00\xe45<" +
"\xca\x1a\x87\"b\x9a\xd0ZT\x89\xd8\xcf\xa3ls(" +
"r\\\x9a\x10A\\\xd7\x08 k<\xca\x1b9D>" +
"Mx'V\xee\x03\x907\xf2(o\xe7\xd0)3\xb3" +
"\xa4\xe8L\x87\xa4\xbd\xc84\xb1\x0e8\xac\x03tLf" +
"\x9b\x83J\x8f\x06I\x16#\x0b\x03\x1bl\xac\x07\x0e\xeb" +
"\x01\x9d~\xa3bZ+u\x1bU\xad\x93\xf5\x9a\xcc\xc2" +
"~\x9c\x00\x1cN\x00\x1cO\xbc6C\xd7Y\xc1\xceW" +
"\x0a\x05fY\x00$\xd9\xc4P\xb2\xd9\x0f\x02\xc87\xf0" +
"(\xdf\x1a\x93l\x01Iv\x0b\x8fr3\x87\x8e\xc5\xcc" +
"\xf5\xcc\\j`A\xb1UC_\xae\xf0%\x16^\xbb" +
"\xa0\xa9L\xb7\xdb\x0cH\xea\xbdj\x1f\xa6\xa2P\x00\xc4" +
"\xd4\xf8\x17[\xb4Q\xb5lU\xef\xebr\xe9\xd9\x9c\xa1" +
"\xa9\x85A\xba]\x9d\xab\xc9\xe9M\xb4\x87xE7\x00" +
"r\xa2\xd8\x0a\x90U\xfbt\xc3dNQ\xb5\x0a$\x14" +
"\xf0\x05{K\x8f\xa2)z\x81\x85\x07M\x18}\x90w" +
"@\xde\x95c\x9e\x12\xb3\xf6\xb59\xc5T\xf8\x92%\xd7" +
"\x85\xfaX\xd4\x0d /\xe4Q\xce\xc5\xf4\xb1l\x09\x80" +
"\xbc\x94G\xf9\xf6\x98\xa5W\xb6\x02\xc89\x1e\xe5\xd5\x1c" +
":\x86\xa9\xf6\xa9z\x1b\x03\xde\x8c\x1b\xcc\xb2u\xa5\xc4" +
"\x00 P\xd8\x16\xa3LJ\xb40\x15\xa1t\x95\xa6j" +
"F\x0b\xd0\xce4\xcd\xb8\xcd0\xb5\xe2\x0a\xef\x1c\x83\xb4" +
"\xed\x9a2\\&\x8cay\xd78$\xb7Z`\xf3*" +
"\x16\xf3\xd6UL\xd7\x90\xd7v2\xab\xa2\xd9\x16\x80\x9c" +
"\x08\xc5\xafo\x02\x90'\xf2(\xa79\xcc\x9a.\x03\xa6" +
"\"P\xaf\xba\xea\xc5t]\xd1M\xd6\xa7Z63=" +
"\xf2\xb5YRx\xc9\x8a\x1fH\xfe\x97\xe2Q\x9e\xc6\xa1" +
"\xd3g*\x05\x96c&\xaaFq\xb9\xa2\x1by\x9e\x15" +
"\xb0\x068\xac\x19\xdf\x93\x16+\xaa\xc6\x8a\x9et\xf3\x0a" +
"\x19\xf7\x7f\x8a\xde:\xc7\xf1\xc2\xb7;\x0a\xdfz\xfc\xdc" +
"\xf1\xe3w(\x8a\xdfz\xee\xb7\xce\xe8\x00\xae\xe7?s" +
"\xfc\x10\xa6\x88\xb0y\x94\xef\xa4\x88\xa8\x94I\xa7\x16\xf0" +
"\x86\x89\xa9\x08%}\xed\xb0b\x1fiZ\x87,+\x90" +
"\xa21\x15d{\x8fA(\x1a\xfd\x98\x8aJ\x19\x7f\x99" +
"\xc9\xd63\xd3b9H\x9a\xc6\xc6ALEY\xbfJ" +
"\xebS.W\xeb\x81\xa1\xc3U\xe3\xaf7Y\xc1\x83\x0c" +
"\x7fy.\xe3\x19-\x06\x87\xa4\xa3\xd5<\xca\xfd\xb1 " +
"a=\x00r\x91G\xb9\x1c\x0b\x92\xd2\x92H\x9b\"\x1f" +
"\xe0!EN\x99Gy\x137\x12\xe1\xd8z\xa6\xdb\x0b" +
"\xd5>\x10\x98\xf5\xff\x10F#\xa4\xf4e\x0c\xa5\x8b\xb9" +
"$yK\x1d\x8fr\x03\xc15}e6\x056\x9d\x16" +
"\x16\xc2\x17?\xad\x8d\xfe\xf5\xc17\xe7\xefb\xfa\xf8\xdb" +
"\x10\x1e\xb6\x97\x0e{\x80G\xf9\xd1\x98*\xf7\x9b\x00\xf2" +
"\xc3<\xca\x878D_\x93O\x1c\x00\x90\x0f\xf1(?" +
"M\x9a\xe4<M\x1e\x9bCm\x13\x8f\xf2\xcf9\x14\x13" +
"|\x9a\xba\x02\xf1e\x0a\xa9\x9f\xf3(\xbf\xca\xa1X\x93" +
"Hc\x0d\x80x\x86\xacs\x9aG\xf9\x8d/B\xab\x82" +
"fT\x8a\xbd\x9a\x02\x19\x93\x15;\x16\x86t\xbdR\xca" +
"\x99l\xbd\x8aF\xc5j\xb1mV\x12\xca\xb6\x15$\x9e" +
"\xa4\xad\xf4Y8\x050\xc7#\xa6\xa2R\x12\x90\x88\xe1" +
"\x9eh\xb2\xe2*fZ*o\xe8a\xeePu\x9b\xe9" +
"\xf6R\x05\x84\x1e\xa6\x85\xd4q\xb0\xa5\xd3\x8f\x10\x8a\x0f" +
"?\xd8\x8d\x08\x0f\xb1\x8f`|\x9a\xe3\xf8J\\D\xba" +
"i\xe6Q^\xca\xe1t\xfc\x9c\xc8\xa4\xc7\x8eN\x00\xb9" +
"\x9dG\xb9\x8b\xc3\xe9\xdco\x89L\x9a\x94\xbb#4O" +
"\xf6\xdbv\x19SQ\x89\xe9\x1b{\x03\xeb\xb1\x8c\xc2Z" +
"\x06H\xa0\x18\xd6;\xfe\xd7~\x1f\xa4\x81\xd7\x8a\x98\x8a" +
"Z\xc4*O\xe1\xbf(Cg\xa9\x1e0L7\x01F" +
"\xe9\xe8\xe6H\x88\xc0;:\xba#\x09D\xae\xd9\x13K" +
"\xee\x89\xee\x9f)(\x15\x8b\x8d,-Zzm\xe0\x99" +
"\x19\xa2\xa9\xd5oT\xb4b'\x03\xc16\x07\x11\x81C" +
"\x1c\x1fc\x17\x1a\xed1\xc5{n<v\xda\x0c\xb3f" +
"w<k\xfa\xea_I\xea\xef\xf2P\xc2\xd1\x08\xa5\xf4" +
"v\x03x\xcb\x0e\xaf\xeb\x11s\x86\xeb\x9c\x02p(\x00" +
":\x95\xb2e\x9bL)\x01\x86\xdeF\xfcS.#\x19" +
"U\x81bNI\xbaq\xff\xbb\x94\xfa/?\x87{\xf9" +
"tD\x06?\x10K\xa8\x05\x7f5\xba\xcb\xdb\x0c]\xb8" +
"\xec*\xcdG0/\x87\xcc\xf3k\x02* \x83\xe4:" +
"\x9b\x92\xc1\xb5<\xca7\xc6\x93\xeb\\R\xd1\xf5<\xca" +
"\xb7p(0\x93\xf2d\xd8\xe9{\x87n\xb1\xbc\x8a\x14" +
"S\xd1\x18\xe7\xe2\xd7\x89\x15\xeb\xaa\xa1\x8fr\xc3\xc6(" +
"\\B\x13v\xdc\x1c\xb3k`\xc2e=\x91]\x85\xb5" +
"l0\xb0R\x86\x95\x145B#\xdf\xb8- |#" +
"\xe2\x19\xb7\xa8\xf5\x93\xbf\x97\xfa\xb3\x9e\xb5\xe8\x92\xe9\xf0" +
"\x92\x9b\x87\x01\xe4;y\x94\xef\x89]r\x07\xf5\x08\xf7" +
"\xf0(?\x10\xbb\xe4\x1eR\xe2.\x1e\xe5}\xb1\xec\xb9" +
"\x97\x0c\xbc\x8fG\xf9q\x0e1\xe1A\xfeA\x82\xfc\xc7" +
"y\x94\x8fr.`\xb7\xb7\xb4\x19:\xfa\x97\xb0\x00\xc2" +
">\xa1\x9f)\xa6\xdd\xc3\x14\xb4;t\x9b\x99\xeb\x15\xd4" +
"\x02H\xd8b\xab%fT\xec\x10\"J\xcaF\xb7\xb0" +
"\xc2b\xbb\xb7JPl\x0bk\x81\xc3Z\x8aH\x8b\x99" +
"m&+\"YC\xd1r\x0ao\xf7_\x8a\x82F\x82" +
"xr\x0c\xf5PY\xb6\x89G\xf9;\x04%\x18\x9b&" +
"\x89w\x0d\x00\xe7\"\x09\xc9\xbc\xae5^Zp^\x9a" +
"\x8b\xb7ZnB\x9c\x00 n%\xedl\xe7Q\xde\xc5" +
"\x05Wk7 \xebEh\xb5\xa9\xfdVf\x0b\xa1\xa6" +
"\xca\"y\xfdzAEC\xefr\x15\x85\x91\xa6\x0aF" +
"\xa9l\x92+\xab\x86.W\x14M\xe5\xed\xc1p\xe1\xb8" +
"\xba H\xf2ByE9\xe3\x1a\x8b\x94qK\xa0\x0c" +
"\xe9[\xb8\x04 \xbf\x1ay\xcc\xf7c\xe4.\x12\xc3V" +
"\x80\xfc\x1a\xa2k\x18y\x8c\xa4\xe2T\x80|\x91\xe8e" +
"\x0c;P\xa9\x84O\x02\xe4\xcbD\xde\x84Q\xa9 \x0d" +
"\xba\xdbo$\xfav\x8c\xaa\x05i+\xce\x01\xc8o\"" +
"\xfa\x03D\x9f\xc0\xb9\x9a\x94\xf6\xe0\x00@\xfe~\xa2?" +
"Lt\xa1&M\xed\xb6\xf4\x10\x9a\x00\xf9}D\x7f\x9c" +
"\xe8\x13\x1b\xd28\x11@:\xe8\xd2\x1f%\xfaa\xa2\xd7" +
"^\x95\xc6Z\x00\xe9\x87\xb8\x0d \x7f\x88\xe8O\x13}" +
"\x12\xa6q\x12\x80t\x0c\x1f\x04\xc8?M\xf4\x9f\x10}" +
"\xf2\x844N\x06\x90^t\xefs\x9c\xe8'\x88^\x97" +
"Hc\x1d\x80\xf4S<\x00\x90?A\xf4\xd3\x18\xe2]" +
"G1\x0e\xbb\xe4njTv\xf0\x86\x15\x9a\x9c\xf9\x1d" +
"(z9!g$\xa9\x05\xc5d4*\x06\xc4$\xa0" +
"S6\x0cm\xf9H8\xbfX\xe5\xe3\xbb\x0b$\x0d\xbd" +
"\xa3\x18\xc6\x9f\xe7dK\x0d\xc8\x14\x14\xad\xa3\x1c\xd5B" +
"VK\xc56*e\xc8\x14\x15\x9b\x15\xc3\x84lV\xf4" +
"\xc5\xa6Q\xeaBf\x96T]\xd1 \xfc2\x9e\xcf%" +
"+\x15\xb5\x18\xee=n\x01\x17\xba'W\xed\x9e\x99r" +
"S\x97\xd2W5-\x98\x13a}\x08]so\x8e\xa0" +
">\x19\x0f\xa9\xcczE\xab\xb0K\xa9\xec\xc6\xed?:" +
"\xb3^\xffr\xb165\x98m]\xbc4_Y\x95F" +
"\xbd\xe46j4\xd2\x1a\x09\x1b\xcaj\xfa\xe3\x92v." +
"J`\x81Iz\xfd6\x142\xb4w\xcc9\xc2\xe1\xa3" +
"\xef\x1c\x97\xaa\x89>f{\xbf:\xf4^\x83r\xbd\xa0" +
"\x94\xac/\xb9\xba\x93Y\xc9K\xd1b4N\xbcx2" +
"n\xef\xea\xcaE\x13\x09\xdeC\xf2\x1bC\xf0j\xc1N" +
"\x80|3E\xe7R\x0cu(u\xb8 \xd2N\xe4." +
"\x8cJXIv\xc1\"G\xf4\xd5\x1859\xd27\xdd" +
" \x8f00\xd1\xe2\x81\x17s\xb7\x0f\xb1N\xacA\x0f" +
"\xbcJ\xee\xfe\x1a\xd17\xc6\xc1\xab\x82\xc3#\xc0N\xe0" +
"=\xf0\xda\xea\x82\xcev\xa2\xefr\xc1+\xe1\x81\xd7N" +
"|\x0a \xbf\x8b\xe8\xfb\\\xf0\xaa\xf1\xc0k/>;" +
"\x02\xec&M\xf0\xc0\xeb\xa0\xcb\xff8\xd1\x8f\xba\xe0\xd5" +
"\xea\x81\xd7\x11\x17\xec\x0e\x13\xfd8\x81T\xc5\xd4\xf2\xb6" +
"\xa9\xea\x80}Ql\x14\xca\xdf`\xac\xdc\x02IM]" +
"\xcf\xc2\xc4RT\x15maE\xd1 \x93\xb7\x95\xc2\xda" +
"\xa8N\xd7\xacvE/Z\xd8\xaf\xace\x94\x8e\x84x" +
"\xe2\xb65k\x153\xd5^\xc0\xa8\xb2\x0f\x0b\x99d\xce" +
"0\xaa\xeb\x1b\xb7@d\xa6\x87p\xe1\xb7\x92\xb2\xb1\xa3" +
"\xa8\xb16\x0c\xca\x19^\x8f\xd2\xa1J_\x0c]G\xaf" +
"\xc6\xe8R3#\x8b\x87\xb2\xdf+\x04EHW\xb6\xaa" +
"\xba`\x1b\xcb\xac`\xb7\x19\xa8\xdb\xaa^a\xa36(" +
"\xf4W\xf4\xb5\xac\xb8\x08\xf5\x82QT\xf5>\x18\xd5\xa4" +
"\xf0_4\x08\x8aU]n4c\xec!M\x9c\xdd\x04" +
"\x9c\x0b]TC\x88MQ\xab\x9f-\xb8\xab\xb2&S" +
"\xacX\x97:\xcei\xfe\xe0\xd2\x0b2\xaf\xad\xaf\x01\x08" +
"_\x9d0\x98\xdc\x8bG\x86\x80\x13\x9f\x100z\xf0\xc0" +
"\xe0}C|\xc8\x04N\xdc# \x17\xbe\x06b\xf0\x92" +
"'\xee\x18\x06N\xbcK@>|\xa1\xc3`,.\x0e" +
"\xb6\x02'\x96\x04L\x84\xaf\x95\x18\xcc\xd4E\x85\xea\xa4" +
"o\x0aX\x13>\xfda\xf0p#.\xdb\x06\x9c\xb8H" +
"p\x82v\x08\xb2\x9e\x18\xcd\xe8\x04\x80\x01\x19\x172\x9a" +
"\xd1\x09FI\x18\xb4M\x00\xcd\xb8\xc5\x87\xe7ft\x82" +
"a*$\x0b\x8a\xcd\x9a\xa9\xd7\xf4>\xa2\x0f\xde\xd0\x8c" +
"\xf1!%\xffE\x0d\xce\xd8\x85rkT\xcc\x05\x00\xbc" +
"u8\xaa\xe5\xc2\xa6r\xe7\x93\xf1:\xd9\x9f\x8d\xec\xdd" +
"\xe6OV\x8e\xc6f#G\xa8x>\xca\xa3\xfc\x0b." +
"\xaa\x0c\x02\x9f\x0e\xe6zh\x98A\x97;\xcex\xcf\xf7" +
"|\xbf\x86\xad\x1e\xf29E\xa3\xdf\xadq\xd1\xdb\xca\x82" +
"(\x1d\xc4'\x7fSb\x93?\x0c\xfakaD\xf6\x88" +
"\xcf\x01\xa7\\\xa4Y\x8bw\x8bn:K\xb8.\x19\xbc" +
"sb\xf0$-\x8a\xe4Z\xf5\x82\x13t\x94\x18\xe4B" +
"\xa82\xd9e\xb6\xd5\x9d,\xf3\xbfI\xd6c8\x88w" +
"N\x92<\xd2\x13(\xdcw 6\xa7\xd3\x0c\xbf#L" +
".\x8f\x17\xf5\xe3\xe8\xca\xbbpP\x82'i1\xed?" +
"-\xdc\xffX\xa3?\\;\x1e+v\x9ei\xf4\x1d\xe8" +
"\x85X\x9f\xf6\xdc\x12\x00\xf9\xb87q\x0b\x1e}\xce\x90" +
"\xa3\xbe\xca\xa3\xfcv\xcc\xfd\xde$\xc67x\x94\xdf\x8b" +
"\xf2\x95\xf8\x1b\xeaY\xde\xe3Q\xfe/JV\x09\xafg" +
"\xb9@\xfd\xe9\xc7<v\xa2\xdf?\x07/B\x153B" +
"o\xcd\xe8[\xaa\xea\xcc\xa2\xb2\xb4j*\x12<3\xa1" +
"M\x98X1\x09\xd8G\x02h\xc7\xc2X5\x1b\x0e\x89" +
"\x90\x99y\x8a\xe1\"Z\xe1\xf0e\xec\xb1\xec8\xaa\xcd" +
"\xfb\x81\xe4\xc5\x91_\x17\xc4\xba\xf4\x03\xb1\x01V\xa0X" +
"\xf9Y\x7f0\xb4&\xa6\xd8o\xf5D\x83f\x02\x1bc" +
"e\xb9\xa8\xa0\xcd\x16\x9bl]\x85\x09za0\xeaV" +
"\xa9_+X+\xb1L\x15\xf4b\x93e\xd7UX\x9c" +
"!x\\\x00A5\x8a\xa3^\x15\xc6\xa8\x12oc=" +
"y\xa3\xb0\x96\xd9#\x1e]\xaa\x1e\x06;\xa3\x97\x85\xf0" +
"]\xb03\xfe.\xe8C\xd4\xba\x81h\xe6\x1dB\xd4\xe0" +
"p\xd4\xea\x8e]\x16\xfc\xdfd\xf2/\xf56FE\xb1" +
"p)\x05c\xf8';_r\x02\x7f\xa9\xf5}\xf4\xe2" +
"{\x99S+\x08q\x03c\x7f\xd1A\x87p\xfe\xe6\xff" +
"\x13\x00\x00\xff\xff<\x08\xe4z"
func init() {
schemas.Register(schema_db8274f9144abc7e,