From 6a88c3bd206b428b7df10b1275816eb97576870b Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Tue, 30 Jul 2024 11:47:00 +0100 Subject: [PATCH 01/12] Add protos for federation --- .../go/teleport/machineid/v1/federation.pb.go | 719 ++++++++++++++++++ .../machineid/v1/federation_service.pb.go | 510 +++++++++++++ .../v1/federation_service_grpc.pb.go | 263 +++++++ .../teleport/machineid/v1/federation.proto | 80 ++ .../machineid/v1/federation_service.proto | 70 ++ 5 files changed, 1642 insertions(+) create mode 100644 api/gen/proto/go/teleport/machineid/v1/federation.pb.go create mode 100644 api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go create mode 100644 api/gen/proto/go/teleport/machineid/v1/federation_service_grpc.pb.go create mode 100644 api/proto/teleport/machineid/v1/federation.proto create mode 100644 api/proto/teleport/machineid/v1/federation_service.proto diff --git a/api/gen/proto/go/teleport/machineid/v1/federation.pb.go b/api/gen/proto/go/teleport/machineid/v1/federation.pb.go new file mode 100644 index 0000000000000..2eaddca85fc61 --- /dev/null +++ b/api/gen/proto/go/teleport/machineid/v1/federation.pb.go @@ -0,0 +1,719 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc (unknown) +// source: teleport/machineid/v1/federation.proto + +package machineidv1 + +import ( + v1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// SPIFFEFederation is a resource that represents the configuration of a trust +// domain federation. +type SPIFFEFederation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The kind of resource represented. + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + // Differentiates variations of the same kind. All resources should + // contain one, even if it is never populated. + SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` + // The version of the resource being represented. + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + // Common metadata that all resources share. + // Importantly, the name MUST match the name of the trust domain you federate + // with. + Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + // The configured properties of the trust domain federation + Spec *SPIFFEFederationSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` + // Fields that are set by the server as results of operations. These should + // not be modified by users. + Status *SPIFFEFederationStatus `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *SPIFFEFederation) Reset() { + *x = SPIFFEFederation{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederation) ProtoMessage() {} + +func (x *SPIFFEFederation) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederation.ProtoReflect.Descriptor instead. +func (*SPIFFEFederation) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{0} +} + +func (x *SPIFFEFederation) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SPIFFEFederation) GetSubKind() string { + if x != nil { + return x.SubKind + } + return "" +} + +func (x *SPIFFEFederation) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *SPIFFEFederation) GetMetadata() *v1.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *SPIFFEFederation) GetSpec() *SPIFFEFederationSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *SPIFFEFederation) GetStatus() *SPIFFEFederationStatus { + if x != nil { + return x.Status + } + return nil +} + +// SPIFFEFederationBundleSourceStatic is a static bundle source. It should be an +// option of last resort, as it requires manual updates. +type SPIFFEFederationBundleSourceStatic struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The SPIFFE JWKS bundle. + Bundle string `protobuf:"bytes,1,opt,name=bundle,proto3" json:"bundle,omitempty"` +} + +func (x *SPIFFEFederationBundleSourceStatic) Reset() { + *x = SPIFFEFederationBundleSourceStatic{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationBundleSourceStatic) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationBundleSourceStatic) ProtoMessage() {} + +func (x *SPIFFEFederationBundleSourceStatic) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationBundleSourceStatic.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationBundleSourceStatic) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{1} +} + +func (x *SPIFFEFederationBundleSourceStatic) GetBundle() string { + if x != nil { + return x.Bundle + } + return "" +} + +// SPIFFEFederationBundleSourceHTTPSWeb is a bundle source that fetches the bundle +// from a HTTPS endpoint that is protected by a Web PKI certificate. +type SPIFFEFederationBundleSourceHTTPSWeb struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The URL of the SPIFFE Bundle Endpoint. + BundleEndpointUrl string `protobuf:"bytes,1,opt,name=bundle_endpoint_url,json=bundleEndpointUrl,proto3" json:"bundle_endpoint_url,omitempty"` +} + +func (x *SPIFFEFederationBundleSourceHTTPSWeb) Reset() { + *x = SPIFFEFederationBundleSourceHTTPSWeb{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationBundleSourceHTTPSWeb) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationBundleSourceHTTPSWeb) ProtoMessage() {} + +func (x *SPIFFEFederationBundleSourceHTTPSWeb) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationBundleSourceHTTPSWeb.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationBundleSourceHTTPSWeb) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{2} +} + +func (x *SPIFFEFederationBundleSourceHTTPSWeb) GetBundleEndpointUrl() string { + if x != nil { + return x.BundleEndpointUrl + } + return "" +} + +// SPIFFEFederationBundleSourceHTTPSSPIFFE is a bundle source that fetches the bundle +// from a HTTPS endpoint that is protected by a SPIFFE certificate that is +// "self-served" (i.e. the SPIFFE certificate is issued by the same trust domain +// that the bundle is for). +type SPIFFEFederationBundleSourceHTTPSSPIFFE struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The URL of the SPIFFE Bundle Endpoint. + BundleEndpointUrl string `protobuf:"bytes,1,opt,name=bundle_endpoint_url,json=bundleEndpointUrl,proto3" json:"bundle_endpoint_url,omitempty"` + // The initial SPIFFE bundle that is used to bootstrap the connection to the + // bundle endpoint. After the first sync, this field will no longer be used. + BundleBootstrap string `protobuf:"bytes,2,opt,name=bundle_bootstrap,json=bundleBootstrap,proto3" json:"bundle_bootstrap,omitempty"` +} + +func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) Reset() { + *x = SPIFFEFederationBundleSourceHTTPSSPIFFE{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationBundleSourceHTTPSSPIFFE) ProtoMessage() {} + +func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationBundleSourceHTTPSSPIFFE.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationBundleSourceHTTPSSPIFFE) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{3} +} + +func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) GetBundleEndpointUrl() string { + if x != nil { + return x.BundleEndpointUrl + } + return "" +} + +func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) GetBundleBootstrap() string { + if x != nil { + return x.BundleBootstrap + } + return "" +} + +// SPIFFEFederationBundleSource configures how the federation bundle is sourced. +// Only one field can be set. +type SPIFFEFederationBundleSource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Static *SPIFFEFederationBundleSourceStatic `protobuf:"bytes,1,opt,name=static,proto3" json:"static,omitempty"` + HttpsWeb *SPIFFEFederationBundleSourceHTTPSWeb `protobuf:"bytes,2,opt,name=https_web,json=httpsWeb,proto3" json:"https_web,omitempty"` + HttpsSpiffe *SPIFFEFederationBundleSourceHTTPSSPIFFE `protobuf:"bytes,3,opt,name=https_spiffe,json=httpsSpiffe,proto3" json:"https_spiffe,omitempty"` +} + +func (x *SPIFFEFederationBundleSource) Reset() { + *x = SPIFFEFederationBundleSource{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationBundleSource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationBundleSource) ProtoMessage() {} + +func (x *SPIFFEFederationBundleSource) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationBundleSource.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationBundleSource) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{4} +} + +func (x *SPIFFEFederationBundleSource) GetStatic() *SPIFFEFederationBundleSourceStatic { + if x != nil { + return x.Static + } + return nil +} + +func (x *SPIFFEFederationBundleSource) GetHttpsWeb() *SPIFFEFederationBundleSourceHTTPSWeb { + if x != nil { + return x.HttpsWeb + } + return nil +} + +func (x *SPIFFEFederationBundleSource) GetHttpsSpiffe() *SPIFFEFederationBundleSourceHTTPSSPIFFE { + if x != nil { + return x.HttpsSpiffe + } + return nil +} + +// SPIFFEFederationSpec is the configuration of a trust domain federation. +type SPIFFEFederationSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The source of the federation bundle. + BundleSource *SPIFFEFederationBundleSource `protobuf:"bytes,1,opt,name=bundle_source,json=bundleSource,proto3" json:"bundle_source,omitempty"` +} + +func (x *SPIFFEFederationSpec) Reset() { + *x = SPIFFEFederationSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationSpec) ProtoMessage() {} + +func (x *SPIFFEFederationSpec) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationSpec.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationSpec) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{5} +} + +func (x *SPIFFEFederationSpec) GetBundleSource() *SPIFFEFederationBundleSource { + if x != nil { + return x.BundleSource + } + return nil +} + +// FederationStatus is the status of a trust domain federation. +type SPIFFEFederationStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The most recently fetched bundle from the federated trust domain. + CurrentBundle string `protobuf:"bytes,1,opt,name=current_bundle,json=currentBundle,proto3" json:"current_bundle,omitempty"` + // The time that the most recently fetched bundle was obtained. + CurrentBundleSyncedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=current_bundle_synced_at,json=currentBundleSyncedAt,proto3" json:"current_bundle_synced_at,omitempty"` + // The duration that the current bundle suggests the next bundle should be + // refresh after. + CurrentBundleRefreshHint *durationpb.Duration `protobuf:"bytes,3,opt,name=current_bundle_refresh_hint,json=currentBundleRefreshHint,proto3" json:"current_bundle_refresh_hint,omitempty"` +} + +func (x *SPIFFEFederationStatus) Reset() { + *x = SPIFFEFederationStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationStatus) ProtoMessage() {} + +func (x *SPIFFEFederationStatus) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationStatus.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationStatus) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{6} +} + +func (x *SPIFFEFederationStatus) GetCurrentBundle() string { + if x != nil { + return x.CurrentBundle + } + return "" +} + +func (x *SPIFFEFederationStatus) GetCurrentBundleSyncedAt() *timestamppb.Timestamp { + if x != nil { + return x.CurrentBundleSyncedAt + } + return nil +} + +func (x *SPIFFEFederationStatus) GetCurrentBundleRefreshHint() *durationpb.Duration { + if x != nil { + return x.CurrentBundleRefreshHint + } + return nil +} + +var File_teleport_machineid_v1_federation_proto protoreflect.FileDescriptor + +var file_teleport_machineid_v1_federation_proto_rawDesc = []byte{ + 0x0a, 0x26, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x1a, + 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x9d, 0x02, 0x0a, 0x10, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x45, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x3c, 0x0a, 0x22, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x22, 0x56, 0x0a, 0x24, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x48, 0x54, 0x54, 0x50, 0x53, 0x57, 0x65, 0x62, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x27, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x54, 0x54, 0x50, 0x53, 0x53, + 0x50, 0x49, 0x46, 0x46, 0x45, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, + 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, + 0x22, 0xae, 0x02, 0x0a, 0x1c, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, + 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x12, 0x58, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x73, 0x5f, 0x77, 0x65, + 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x54, 0x54, 0x50, + 0x53, 0x57, 0x65, 0x62, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x73, 0x57, 0x65, 0x62, 0x12, 0x61, + 0x0a, 0x0c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x5f, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x54, 0x54, 0x50, 0x53, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x52, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x73, 0x53, 0x70, 0x69, 0x66, 0x66, + 0x65, 0x22, 0x70, 0x0a, 0x14, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x58, 0x0a, 0x0d, 0x62, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, + 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x22, 0xee, 0x01, 0x0a, 0x16, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x53, 0x0a, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x74, 0x12, 0x58, 0x0a, 0x1b, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x48, 0x69, 0x6e, 0x74, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, + 0x3b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_machineid_v1_federation_proto_rawDescOnce sync.Once + file_teleport_machineid_v1_federation_proto_rawDescData = file_teleport_machineid_v1_federation_proto_rawDesc +) + +func file_teleport_machineid_v1_federation_proto_rawDescGZIP() []byte { + file_teleport_machineid_v1_federation_proto_rawDescOnce.Do(func() { + file_teleport_machineid_v1_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_machineid_v1_federation_proto_rawDescData) + }) + return file_teleport_machineid_v1_federation_proto_rawDescData +} + +var file_teleport_machineid_v1_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_teleport_machineid_v1_federation_proto_goTypes = []any{ + (*SPIFFEFederation)(nil), // 0: teleport.machineid.v1.SPIFFEFederation + (*SPIFFEFederationBundleSourceStatic)(nil), // 1: teleport.machineid.v1.SPIFFEFederationBundleSourceStatic + (*SPIFFEFederationBundleSourceHTTPSWeb)(nil), // 2: teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSWeb + (*SPIFFEFederationBundleSourceHTTPSSPIFFE)(nil), // 3: teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSSPIFFE + (*SPIFFEFederationBundleSource)(nil), // 4: teleport.machineid.v1.SPIFFEFederationBundleSource + (*SPIFFEFederationSpec)(nil), // 5: teleport.machineid.v1.SPIFFEFederationSpec + (*SPIFFEFederationStatus)(nil), // 6: teleport.machineid.v1.SPIFFEFederationStatus + (*v1.Metadata)(nil), // 7: teleport.header.v1.Metadata + (*timestamppb.Timestamp)(nil), // 8: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 9: google.protobuf.Duration +} +var file_teleport_machineid_v1_federation_proto_depIdxs = []int32{ + 7, // 0: teleport.machineid.v1.SPIFFEFederation.metadata:type_name -> teleport.header.v1.Metadata + 5, // 1: teleport.machineid.v1.SPIFFEFederation.spec:type_name -> teleport.machineid.v1.SPIFFEFederationSpec + 6, // 2: teleport.machineid.v1.SPIFFEFederation.status:type_name -> teleport.machineid.v1.SPIFFEFederationStatus + 1, // 3: teleport.machineid.v1.SPIFFEFederationBundleSource.static:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSourceStatic + 2, // 4: teleport.machineid.v1.SPIFFEFederationBundleSource.https_web:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSWeb + 3, // 5: teleport.machineid.v1.SPIFFEFederationBundleSource.https_spiffe:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSSPIFFE + 4, // 6: teleport.machineid.v1.SPIFFEFederationSpec.bundle_source:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSource + 8, // 7: teleport.machineid.v1.SPIFFEFederationStatus.current_bundle_synced_at:type_name -> google.protobuf.Timestamp + 9, // 8: teleport.machineid.v1.SPIFFEFederationStatus.current_bundle_refresh_hint:type_name -> google.protobuf.Duration + 9, // [9:9] is the sub-list for method output_type + 9, // [9:9] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name +} + +func init() { file_teleport_machineid_v1_federation_proto_init() } +func file_teleport_machineid_v1_federation_proto_init() { + if File_teleport_machineid_v1_federation_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_teleport_machineid_v1_federation_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*SPIFFEFederation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*SPIFFEFederationBundleSourceStatic); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*SPIFFEFederationBundleSourceHTTPSWeb); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*SPIFFEFederationBundleSourceHTTPSSPIFFE); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*SPIFFEFederationBundleSource); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*SPIFFEFederationSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[6].Exporter = func(v any, i int) any { + switch v := v.(*SPIFFEFederationStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_machineid_v1_federation_proto_rawDesc, + NumEnums: 0, + NumMessages: 7, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_teleport_machineid_v1_federation_proto_goTypes, + DependencyIndexes: file_teleport_machineid_v1_federation_proto_depIdxs, + MessageInfos: file_teleport_machineid_v1_federation_proto_msgTypes, + }.Build() + File_teleport_machineid_v1_federation_proto = out.File + file_teleport_machineid_v1_federation_proto_rawDesc = nil + file_teleport_machineid_v1_federation_proto_goTypes = nil + file_teleport_machineid_v1_federation_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go b/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go new file mode 100644 index 0000000000000..84df89d5208c8 --- /dev/null +++ b/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go @@ -0,0 +1,510 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc (unknown) +// source: teleport/machineid/v1/federation_service.proto + +package machineidv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// GetSPIFFEFederationRequest +type GetSPIFFEFederationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *GetSPIFFEFederationRequest) Reset() { + *x = GetSPIFFEFederationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSPIFFEFederationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSPIFFEFederationRequest) ProtoMessage() {} + +func (x *GetSPIFFEFederationRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSPIFFEFederationRequest.ProtoReflect.Descriptor instead. +func (*GetSPIFFEFederationRequest) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{0} +} + +func (x *GetSPIFFEFederationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Request for ListSPIFFEFederations. +// +// Follows the pagination semantics of +// https://cloud.google.com/apis/design/standard_methods#list +type ListSPIFFEFederationsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The maximum number of items to return. + // The server may impose a different page size at its discretion. + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // The page_token value returned from a previous ListBotInstances request, if + // any. + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` +} + +func (x *ListSPIFFEFederationsRequest) Reset() { + *x = ListSPIFFEFederationsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSPIFFEFederationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSPIFFEFederationsRequest) ProtoMessage() {} + +func (x *ListSPIFFEFederationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListSPIFFEFederationsRequest.ProtoReflect.Descriptor instead. +func (*ListSPIFFEFederationsRequest) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{1} +} + +func (x *ListSPIFFEFederationsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListSPIFFEFederationsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// ListSPIFFEFederationsResponse +type ListSPIFFEFederationsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SpiffeFederations []*SPIFFEFederation `protobuf:"bytes,1,rep,name=spiffe_federations,json=spiffeFederations,proto3" json:"spiffe_federations,omitempty"` + // Token to retrieve the next page of results, or empty if there are no + // more results exist. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *ListSPIFFEFederationsResponse) Reset() { + *x = ListSPIFFEFederationsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSPIFFEFederationsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSPIFFEFederationsResponse) ProtoMessage() {} + +func (x *ListSPIFFEFederationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListSPIFFEFederationsResponse.ProtoReflect.Descriptor instead. +func (*ListSPIFFEFederationsResponse) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{2} +} + +func (x *ListSPIFFEFederationsResponse) GetSpiffeFederations() []*SPIFFEFederation { + if x != nil { + return x.SpiffeFederations + } + return nil +} + +func (x *ListSPIFFEFederationsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// DeleteSPIFFEFederationRequest +type DeleteSPIFFEFederationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *DeleteSPIFFEFederationRequest) Reset() { + *x = DeleteSPIFFEFederationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSPIFFEFederationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSPIFFEFederationRequest) ProtoMessage() {} + +func (x *DeleteSPIFFEFederationRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteSPIFFEFederationRequest.ProtoReflect.Descriptor instead. +func (*DeleteSPIFFEFederationRequest) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{3} +} + +func (x *DeleteSPIFFEFederationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// CreateSPIFFEFederationRequest +type CreateSPIFFEFederationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SpiffeFederation *SPIFFEFederation `protobuf:"bytes,1,opt,name=spiffe_federation,json=spiffeFederation,proto3" json:"spiffe_federation,omitempty"` +} + +func (x *CreateSPIFFEFederationRequest) Reset() { + *x = CreateSPIFFEFederationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSPIFFEFederationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSPIFFEFederationRequest) ProtoMessage() {} + +func (x *CreateSPIFFEFederationRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateSPIFFEFederationRequest.ProtoReflect.Descriptor instead. +func (*CreateSPIFFEFederationRequest) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{4} +} + +func (x *CreateSPIFFEFederationRequest) GetSpiffeFederation() *SPIFFEFederation { + if x != nil { + return x.SpiffeFederation + } + return nil +} + +var File_teleport_machineid_v1_federation_service_proto protoreflect.FileDescriptor + +var file_teleport_machineid_v1_federation_service_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x15, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x30, 0x0a, 0x1a, + 0x47, 0x65, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5a, + 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9f, 0x01, 0x0a, 0x1d, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x12, + 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x5f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x11, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, + 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x33, 0x0a, 0x1d, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x75, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x50, 0x49, 0x46, 0x46, + 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x54, 0x0a, 0x11, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x5f, 0x66, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xf2, 0x03, 0x0a, 0x17, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x71, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, + 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x82, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x16, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x77, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x56, 0x5a, + 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x69, 0x64, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_machineid_v1_federation_service_proto_rawDescOnce sync.Once + file_teleport_machineid_v1_federation_service_proto_rawDescData = file_teleport_machineid_v1_federation_service_proto_rawDesc +) + +func file_teleport_machineid_v1_federation_service_proto_rawDescGZIP() []byte { + file_teleport_machineid_v1_federation_service_proto_rawDescOnce.Do(func() { + file_teleport_machineid_v1_federation_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_machineid_v1_federation_service_proto_rawDescData) + }) + return file_teleport_machineid_v1_federation_service_proto_rawDescData +} + +var file_teleport_machineid_v1_federation_service_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_teleport_machineid_v1_federation_service_proto_goTypes = []any{ + (*GetSPIFFEFederationRequest)(nil), // 0: teleport.machineid.v1.GetSPIFFEFederationRequest + (*ListSPIFFEFederationsRequest)(nil), // 1: teleport.machineid.v1.ListSPIFFEFederationsRequest + (*ListSPIFFEFederationsResponse)(nil), // 2: teleport.machineid.v1.ListSPIFFEFederationsResponse + (*DeleteSPIFFEFederationRequest)(nil), // 3: teleport.machineid.v1.DeleteSPIFFEFederationRequest + (*CreateSPIFFEFederationRequest)(nil), // 4: teleport.machineid.v1.CreateSPIFFEFederationRequest + (*SPIFFEFederation)(nil), // 5: teleport.machineid.v1.SPIFFEFederation + (*emptypb.Empty)(nil), // 6: google.protobuf.Empty +} +var file_teleport_machineid_v1_federation_service_proto_depIdxs = []int32{ + 5, // 0: teleport.machineid.v1.ListSPIFFEFederationsResponse.spiffe_federations:type_name -> teleport.machineid.v1.SPIFFEFederation + 5, // 1: teleport.machineid.v1.CreateSPIFFEFederationRequest.spiffe_federation:type_name -> teleport.machineid.v1.SPIFFEFederation + 0, // 2: teleport.machineid.v1.SPIFFEFederationService.GetSPIFFEFederation:input_type -> teleport.machineid.v1.GetSPIFFEFederationRequest + 1, // 3: teleport.machineid.v1.SPIFFEFederationService.ListSPIFFEFederations:input_type -> teleport.machineid.v1.ListSPIFFEFederationsRequest + 3, // 4: teleport.machineid.v1.SPIFFEFederationService.DeleteSPIFFEFederation:input_type -> teleport.machineid.v1.DeleteSPIFFEFederationRequest + 4, // 5: teleport.machineid.v1.SPIFFEFederationService.CreateSPIFFEFederation:input_type -> teleport.machineid.v1.CreateSPIFFEFederationRequest + 5, // 6: teleport.machineid.v1.SPIFFEFederationService.GetSPIFFEFederation:output_type -> teleport.machineid.v1.SPIFFEFederation + 2, // 7: teleport.machineid.v1.SPIFFEFederationService.ListSPIFFEFederations:output_type -> teleport.machineid.v1.ListSPIFFEFederationsResponse + 6, // 8: teleport.machineid.v1.SPIFFEFederationService.DeleteSPIFFEFederation:output_type -> google.protobuf.Empty + 5, // 9: teleport.machineid.v1.SPIFFEFederationService.CreateSPIFFEFederation:output_type -> teleport.machineid.v1.SPIFFEFederation + 6, // [6:10] is the sub-list for method output_type + 2, // [2:6] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_teleport_machineid_v1_federation_service_proto_init() } +func file_teleport_machineid_v1_federation_service_proto_init() { + if File_teleport_machineid_v1_federation_service_proto != nil { + return + } + file_teleport_machineid_v1_federation_proto_init() + if !protoimpl.UnsafeEnabled { + file_teleport_machineid_v1_federation_service_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*GetSPIFFEFederationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_service_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*ListSPIFFEFederationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_service_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*ListSPIFFEFederationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_service_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*DeleteSPIFFEFederationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_service_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*CreateSPIFFEFederationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_machineid_v1_federation_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_teleport_machineid_v1_federation_service_proto_goTypes, + DependencyIndexes: file_teleport_machineid_v1_federation_service_proto_depIdxs, + MessageInfos: file_teleport_machineid_v1_federation_service_proto_msgTypes, + }.Build() + File_teleport_machineid_v1_federation_service_proto = out.File + file_teleport_machineid_v1_federation_service_proto_rawDesc = nil + file_teleport_machineid_v1_federation_service_proto_goTypes = nil + file_teleport_machineid_v1_federation_service_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/machineid/v1/federation_service_grpc.pb.go b/api/gen/proto/go/teleport/machineid/v1/federation_service_grpc.pb.go new file mode 100644 index 0000000000000..6c8e886d4034b --- /dev/null +++ b/api/gen/proto/go/teleport/machineid/v1/federation_service_grpc.pb.go @@ -0,0 +1,263 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.0 +// - protoc (unknown) +// source: teleport/machineid/v1/federation_service.proto + +package machineidv1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + SPIFFEFederationService_GetSPIFFEFederation_FullMethodName = "/teleport.machineid.v1.SPIFFEFederationService/GetSPIFFEFederation" + SPIFFEFederationService_ListSPIFFEFederations_FullMethodName = "/teleport.machineid.v1.SPIFFEFederationService/ListSPIFFEFederations" + SPIFFEFederationService_DeleteSPIFFEFederation_FullMethodName = "/teleport.machineid.v1.SPIFFEFederationService/DeleteSPIFFEFederation" + SPIFFEFederationService_CreateSPIFFEFederation_FullMethodName = "/teleport.machineid.v1.SPIFFEFederationService/CreateSPIFFEFederation" +) + +// SPIFFEFederationServiceClient is the client API for SPIFFEFederationService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// SPIFFEFederation +type SPIFFEFederationServiceClient interface { + // GetSPIFFEFederation + GetSPIFFEFederation(ctx context.Context, in *GetSPIFFEFederationRequest, opts ...grpc.CallOption) (*SPIFFEFederation, error) + // ListSPIFFEFederations + ListSPIFFEFederations(ctx context.Context, in *ListSPIFFEFederationsRequest, opts ...grpc.CallOption) (*ListSPIFFEFederationsResponse, error) + // DeleteSPIFFEFederation + DeleteSPIFFEFederation(ctx context.Context, in *DeleteSPIFFEFederationRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // CreateSPIFFEFederation + CreateSPIFFEFederation(ctx context.Context, in *CreateSPIFFEFederationRequest, opts ...grpc.CallOption) (*SPIFFEFederation, error) +} + +type sPIFFEFederationServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSPIFFEFederationServiceClient(cc grpc.ClientConnInterface) SPIFFEFederationServiceClient { + return &sPIFFEFederationServiceClient{cc} +} + +func (c *sPIFFEFederationServiceClient) GetSPIFFEFederation(ctx context.Context, in *GetSPIFFEFederationRequest, opts ...grpc.CallOption) (*SPIFFEFederation, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SPIFFEFederation) + err := c.cc.Invoke(ctx, SPIFFEFederationService_GetSPIFFEFederation_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sPIFFEFederationServiceClient) ListSPIFFEFederations(ctx context.Context, in *ListSPIFFEFederationsRequest, opts ...grpc.CallOption) (*ListSPIFFEFederationsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListSPIFFEFederationsResponse) + err := c.cc.Invoke(ctx, SPIFFEFederationService_ListSPIFFEFederations_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sPIFFEFederationServiceClient) DeleteSPIFFEFederation(ctx context.Context, in *DeleteSPIFFEFederationRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, SPIFFEFederationService_DeleteSPIFFEFederation_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sPIFFEFederationServiceClient) CreateSPIFFEFederation(ctx context.Context, in *CreateSPIFFEFederationRequest, opts ...grpc.CallOption) (*SPIFFEFederation, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SPIFFEFederation) + err := c.cc.Invoke(ctx, SPIFFEFederationService_CreateSPIFFEFederation_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SPIFFEFederationServiceServer is the server API for SPIFFEFederationService service. +// All implementations must embed UnimplementedSPIFFEFederationServiceServer +// for forward compatibility. +// +// SPIFFEFederation +type SPIFFEFederationServiceServer interface { + // GetSPIFFEFederation + GetSPIFFEFederation(context.Context, *GetSPIFFEFederationRequest) (*SPIFFEFederation, error) + // ListSPIFFEFederations + ListSPIFFEFederations(context.Context, *ListSPIFFEFederationsRequest) (*ListSPIFFEFederationsResponse, error) + // DeleteSPIFFEFederation + DeleteSPIFFEFederation(context.Context, *DeleteSPIFFEFederationRequest) (*emptypb.Empty, error) + // CreateSPIFFEFederation + CreateSPIFFEFederation(context.Context, *CreateSPIFFEFederationRequest) (*SPIFFEFederation, error) + mustEmbedUnimplementedSPIFFEFederationServiceServer() +} + +// UnimplementedSPIFFEFederationServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedSPIFFEFederationServiceServer struct{} + +func (UnimplementedSPIFFEFederationServiceServer) GetSPIFFEFederation(context.Context, *GetSPIFFEFederationRequest) (*SPIFFEFederation, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSPIFFEFederation not implemented") +} +func (UnimplementedSPIFFEFederationServiceServer) ListSPIFFEFederations(context.Context, *ListSPIFFEFederationsRequest) (*ListSPIFFEFederationsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListSPIFFEFederations not implemented") +} +func (UnimplementedSPIFFEFederationServiceServer) DeleteSPIFFEFederation(context.Context, *DeleteSPIFFEFederationRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteSPIFFEFederation not implemented") +} +func (UnimplementedSPIFFEFederationServiceServer) CreateSPIFFEFederation(context.Context, *CreateSPIFFEFederationRequest) (*SPIFFEFederation, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateSPIFFEFederation not implemented") +} +func (UnimplementedSPIFFEFederationServiceServer) mustEmbedUnimplementedSPIFFEFederationServiceServer() { +} +func (UnimplementedSPIFFEFederationServiceServer) testEmbeddedByValue() {} + +// UnsafeSPIFFEFederationServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SPIFFEFederationServiceServer will +// result in compilation errors. +type UnsafeSPIFFEFederationServiceServer interface { + mustEmbedUnimplementedSPIFFEFederationServiceServer() +} + +func RegisterSPIFFEFederationServiceServer(s grpc.ServiceRegistrar, srv SPIFFEFederationServiceServer) { + // If the following call pancis, it indicates UnimplementedSPIFFEFederationServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&SPIFFEFederationService_ServiceDesc, srv) +} + +func _SPIFFEFederationService_GetSPIFFEFederation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSPIFFEFederationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SPIFFEFederationServiceServer).GetSPIFFEFederation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SPIFFEFederationService_GetSPIFFEFederation_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SPIFFEFederationServiceServer).GetSPIFFEFederation(ctx, req.(*GetSPIFFEFederationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SPIFFEFederationService_ListSPIFFEFederations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListSPIFFEFederationsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SPIFFEFederationServiceServer).ListSPIFFEFederations(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SPIFFEFederationService_ListSPIFFEFederations_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SPIFFEFederationServiceServer).ListSPIFFEFederations(ctx, req.(*ListSPIFFEFederationsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SPIFFEFederationService_DeleteSPIFFEFederation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteSPIFFEFederationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SPIFFEFederationServiceServer).DeleteSPIFFEFederation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SPIFFEFederationService_DeleteSPIFFEFederation_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SPIFFEFederationServiceServer).DeleteSPIFFEFederation(ctx, req.(*DeleteSPIFFEFederationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SPIFFEFederationService_CreateSPIFFEFederation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateSPIFFEFederationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SPIFFEFederationServiceServer).CreateSPIFFEFederation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SPIFFEFederationService_CreateSPIFFEFederation_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SPIFFEFederationServiceServer).CreateSPIFFEFederation(ctx, req.(*CreateSPIFFEFederationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SPIFFEFederationService_ServiceDesc is the grpc.ServiceDesc for SPIFFEFederationService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SPIFFEFederationService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "teleport.machineid.v1.SPIFFEFederationService", + HandlerType: (*SPIFFEFederationServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSPIFFEFederation", + Handler: _SPIFFEFederationService_GetSPIFFEFederation_Handler, + }, + { + MethodName: "ListSPIFFEFederations", + Handler: _SPIFFEFederationService_ListSPIFFEFederations_Handler, + }, + { + MethodName: "DeleteSPIFFEFederation", + Handler: _SPIFFEFederationService_DeleteSPIFFEFederation_Handler, + }, + { + MethodName: "CreateSPIFFEFederation", + Handler: _SPIFFEFederationService_CreateSPIFFEFederation_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "teleport/machineid/v1/federation_service.proto", +} diff --git a/api/proto/teleport/machineid/v1/federation.proto b/api/proto/teleport/machineid/v1/federation.proto new file mode 100644 index 0000000000000..c8115c58b9811 --- /dev/null +++ b/api/proto/teleport/machineid/v1/federation.proto @@ -0,0 +1,80 @@ +syntax = "proto3"; +package teleport.machineid.v1; + +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "teleport/header/v1/metadata.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1;machineidv1"; + +// SPIFFEFederation is a resource that represents the configuration of a trust +// domain federation. +message SPIFFEFederation { + // The kind of resource represented. + string kind = 1; + // Differentiates variations of the same kind. All resources should + // contain one, even if it is never populated. + string sub_kind = 2; + // The version of the resource being represented. + string version = 3; + // Common metadata that all resources share. + // Importantly, the name MUST match the name of the trust domain you federate + // with. + teleport.header.v1.Metadata metadata = 4; + // The configured properties of the trust domain federation + SPIFFEFederationSpec spec = 5; + // Fields that are set by the server as results of operations. These should + // not be modified by users. + SPIFFEFederationStatus status = 6; +} + +// SPIFFEFederationBundleSourceStatic is a static bundle source. It should be an +// option of last resort, as it requires manual updates. +message SPIFFEFederationBundleSourceStatic { + // The SPIFFE JWKS bundle. + string bundle = 1; +} + +// SPIFFEFederationBundleSourceHTTPSWeb is a bundle source that fetches the bundle +// from a HTTPS endpoint that is protected by a Web PKI certificate. +message SPIFFEFederationBundleSourceHTTPSWeb { + // The URL of the SPIFFE Bundle Endpoint. + string bundle_endpoint_url = 1; +} + +// SPIFFEFederationBundleSourceHTTPSSPIFFE is a bundle source that fetches the bundle +// from a HTTPS endpoint that is protected by a SPIFFE certificate that is +// "self-served" (i.e. the SPIFFE certificate is issued by the same trust domain +// that the bundle is for). +message SPIFFEFederationBundleSourceHTTPSSPIFFE { + // The URL of the SPIFFE Bundle Endpoint. + string bundle_endpoint_url = 1; + // The initial SPIFFE bundle that is used to bootstrap the connection to the + // bundle endpoint. After the first sync, this field will no longer be used. + string bundle_bootstrap = 2; +} + +// SPIFFEFederationBundleSource configures how the federation bundle is sourced. +// Only one field can be set. +message SPIFFEFederationBundleSource { + SPIFFEFederationBundleSourceStatic static = 1; + SPIFFEFederationBundleSourceHTTPSWeb https_web = 2; + SPIFFEFederationBundleSourceHTTPSSPIFFE https_spiffe = 3; +} + +// SPIFFEFederationSpec is the configuration of a trust domain federation. +message SPIFFEFederationSpec { + // The source of the federation bundle. + SPIFFEFederationBundleSource bundle_source = 1; +} + +// FederationStatus is the status of a trust domain federation. +message SPIFFEFederationStatus { + // The most recently fetched bundle from the federated trust domain. + string current_bundle = 1; + // The time that the most recently fetched bundle was obtained. + google.protobuf.Timestamp current_bundle_synced_at = 2; + // The duration that the current bundle suggests the next bundle should be + // refresh after. + google.protobuf.Duration current_bundle_refresh_hint = 3; +} diff --git a/api/proto/teleport/machineid/v1/federation_service.proto b/api/proto/teleport/machineid/v1/federation_service.proto new file mode 100644 index 0000000000000..1526f6ae402be --- /dev/null +++ b/api/proto/teleport/machineid/v1/federation_service.proto @@ -0,0 +1,70 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package teleport.machineid.v1; + +import "google/protobuf/empty.proto"; +import "teleport/machineid/v1/federation.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1;machineidv1"; + +// GetSPIFFEFederationRequest +message GetSPIFFEFederationRequest { + string name = 1; +} + +// Request for ListSPIFFEFederations. +// +// Follows the pagination semantics of +// https://cloud.google.com/apis/design/standard_methods#list +message ListSPIFFEFederationsRequest { + // The maximum number of items to return. + // The server may impose a different page size at its discretion. + int32 page_size = 1; + // The page_token value returned from a previous ListBotInstances request, if + // any. + string page_token = 2; +} + +// ListSPIFFEFederationsResponse +message ListSPIFFEFederationsResponse { + repeated SPIFFEFederation spiffe_federations = 1; + // Token to retrieve the next page of results, or empty if there are no + // more results exist. + string next_page_token = 2; +} + +// DeleteSPIFFEFederationRequest +message DeleteSPIFFEFederationRequest { + string name = 1; +} + +// CreateSPIFFEFederationRequest +message CreateSPIFFEFederationRequest { + SPIFFEFederation spiffe_federation = 1; +} + +// SPIFFEFederation +service SPIFFEFederationService { + // GetSPIFFEFederation + rpc GetSPIFFEFederation(GetSPIFFEFederationRequest) returns (SPIFFEFederation); + // ListSPIFFEFederations + rpc ListSPIFFEFederations(ListSPIFFEFederationsRequest) returns (ListSPIFFEFederationsResponse); + // DeleteSPIFFEFederation + rpc DeleteSPIFFEFederation(DeleteSPIFFEFederationRequest) returns (google.protobuf.Empty); + // CreateSPIFFEFederation + rpc CreateSPIFFEFederation(CreateSPIFFEFederationRequest) returns (SPIFFEFederation); +} From 65c7340b3aeff0fe5511ff87e6cf4a2e8dc7e2fe Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Tue, 30 Jul 2024 11:55:20 +0100 Subject: [PATCH 02/12] Start wiring SPIFFE federation into a gRPC service --- api/types/constants.go | 3 +- .../machineidv1/spiffe_federation_service.go | 112 ++++++++++++++++++ lib/services/spiffe_federation.go | 38 ++++++ 3 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 lib/auth/machineid/machineidv1/spiffe_federation_service.go create mode 100644 lib/services/spiffe_federation.go diff --git a/api/types/constants.go b/api/types/constants.go index f598dcf32e760..da4e2ffa4e60e 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -66,7 +66,8 @@ const ( // KindBot is a Machine ID bot resource KindBot = "bot" // KindBotInstance is an instance of a Machine ID bot - KindBotInstance = "bot_instance" + KindBotInstance = "bot_instance" + KindSPIFFEFederation = "spiffe_federation" // KindHostCert is a host certificate KindHostCert = "host_cert" diff --git a/lib/auth/machineid/machineidv1/spiffe_federation_service.go b/lib/auth/machineid/machineidv1/spiffe_federation_service.go new file mode 100644 index 0000000000000..2a8e0918fdccd --- /dev/null +++ b/lib/auth/machineid/machineidv1/spiffe_federation_service.go @@ -0,0 +1,112 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package machineidv1 + +import ( + "context" + "log/slog" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "google.golang.org/protobuf/types/known/emptypb" + + machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/services" +) + +type SPIFFEFederationServiceConfig struct { + Authorizer authz.Authorizer + Backend services.SPIFFEFederation + Logger *slog.Logger + Clock clockwork.Clock +} + +func NewSPIFFEFederationService(config SPIFFEFederationServiceConfig) *SPIFFEFederationService { + return &SPIFFEFederationService{ + authorizer: config.Authorizer, + backend: config.Backend, + logger: config.Logger, + clock: config.Clock, + } +} + +type SPIFFEFederationService struct { + machineidv1.UnimplementedSPIFFEFederationServiceServer + + authorizer authz.Authorizer + backend services.SPIFFEFederation + logger *slog.Logger + clock clockwork.Clock +} + +func (s *SPIFFEFederationService) GetSPIFFEFederation( + ctx context.Context, request *machineidv1.GetSPIFFEFederationRequest, +) (*machineidv1.SPIFFEFederation, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + //TODO implement me + panic("implement me") +} + +func (s *SPIFFEFederationService) ListSPIFFEFederations( + ctx context.Context, request *machineidv1.ListSPIFFEFederationsRequest, +) (*machineidv1.ListSPIFFEFederationsResponse, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbRead, types.VerbList); err != nil { + return nil, trace.Wrap(err) + } + //TODO implement me + panic("implement me") +} + +func (s *SPIFFEFederationService) DeleteSPIFFEFederation( + ctx context.Context, request *machineidv1.DeleteSPIFFEFederationRequest, +) (*emptypb.Empty, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbDelete); err != nil { + return nil, trace.Wrap(err) + } + //TODO implement me + panic("implement me") +} + +func (s *SPIFFEFederationService) CreateSPIFFEFederation( + ctx context.Context, request *machineidv1.CreateSPIFFEFederationRequest, +) (*machineidv1.SPIFFEFederation, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + //TODO implement me + panic("implement me") +} diff --git a/lib/services/spiffe_federation.go b/lib/services/spiffe_federation.go new file mode 100644 index 0000000000000..92d571b7d0ed8 --- /dev/null +++ b/lib/services/spiffe_federation.go @@ -0,0 +1,38 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package services + +import ( + "context" + + machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" +) + +// SPIFFEFederation is an interface for the SPIFFEFederation service. +type SPIFFEFederation interface { + // CreateBotInstance + CreateSPIFFEFederation(ctx context.Context, botInstance *machineidv1.SPIFFEFederation) (*machineidv1.SPIFFEFederation, error) + + // GetBotInstance + GetSPIFFEFederation(ctx context.Context, name string) (*machineidv1.SPIFFEFederation, error) + + // ListBotInstances + ListSPIFFEFederations(ctx context.Context, pageSize int, lastToken string) ([]*machineidv1.SPIFFEFederation, string, error) + + // DeleteBotInstance + DeleteSPIFFEFederation(ctx context.Context, name string) error +} From a8fa620a80d64552d10f77fde77740e3dea73ee8 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Tue, 30 Jul 2024 13:20:08 +0100 Subject: [PATCH 03/12] Add rough grpc method handler implementations --- .../go/teleport/machineid/v1/federation.pb.go | 247 ++++++------------ .../teleport/machineid/v1/federation.proto | 13 - lib/auth/grpcserver.go | 11 + .../machineidv1/spiffe_federation_service.go | 108 ++++++-- lib/services/spiffe_federation.go | 2 +- 5 files changed, 176 insertions(+), 205 deletions(-) diff --git a/api/gen/proto/go/teleport/machineid/v1/federation.pb.go b/api/gen/proto/go/teleport/machineid/v1/federation.pb.go index 2eaddca85fc61..ae54d9eda14ed 100644 --- a/api/gen/proto/go/teleport/machineid/v1/federation.pb.go +++ b/api/gen/proto/go/teleport/machineid/v1/federation.pb.go @@ -222,68 +222,6 @@ func (x *SPIFFEFederationBundleSourceHTTPSWeb) GetBundleEndpointUrl() string { return "" } -// SPIFFEFederationBundleSourceHTTPSSPIFFE is a bundle source that fetches the bundle -// from a HTTPS endpoint that is protected by a SPIFFE certificate that is -// "self-served" (i.e. the SPIFFE certificate is issued by the same trust domain -// that the bundle is for). -type SPIFFEFederationBundleSourceHTTPSSPIFFE struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The URL of the SPIFFE Bundle Endpoint. - BundleEndpointUrl string `protobuf:"bytes,1,opt,name=bundle_endpoint_url,json=bundleEndpointUrl,proto3" json:"bundle_endpoint_url,omitempty"` - // The initial SPIFFE bundle that is used to bootstrap the connection to the - // bundle endpoint. After the first sync, this field will no longer be used. - BundleBootstrap string `protobuf:"bytes,2,opt,name=bundle_bootstrap,json=bundleBootstrap,proto3" json:"bundle_bootstrap,omitempty"` -} - -func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) Reset() { - *x = SPIFFEFederationBundleSourceHTTPSSPIFFE{} - if protoimpl.UnsafeEnabled { - mi := &file_teleport_machineid_v1_federation_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SPIFFEFederationBundleSourceHTTPSSPIFFE) ProtoMessage() {} - -func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) ProtoReflect() protoreflect.Message { - mi := &file_teleport_machineid_v1_federation_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SPIFFEFederationBundleSourceHTTPSSPIFFE.ProtoReflect.Descriptor instead. -func (*SPIFFEFederationBundleSourceHTTPSSPIFFE) Descriptor() ([]byte, []int) { - return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{3} -} - -func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) GetBundleEndpointUrl() string { - if x != nil { - return x.BundleEndpointUrl - } - return "" -} - -func (x *SPIFFEFederationBundleSourceHTTPSSPIFFE) GetBundleBootstrap() string { - if x != nil { - return x.BundleBootstrap - } - return "" -} - // SPIFFEFederationBundleSource configures how the federation bundle is sourced. // Only one field can be set. type SPIFFEFederationBundleSource struct { @@ -291,15 +229,14 @@ type SPIFFEFederationBundleSource struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Static *SPIFFEFederationBundleSourceStatic `protobuf:"bytes,1,opt,name=static,proto3" json:"static,omitempty"` - HttpsWeb *SPIFFEFederationBundleSourceHTTPSWeb `protobuf:"bytes,2,opt,name=https_web,json=httpsWeb,proto3" json:"https_web,omitempty"` - HttpsSpiffe *SPIFFEFederationBundleSourceHTTPSSPIFFE `protobuf:"bytes,3,opt,name=https_spiffe,json=httpsSpiffe,proto3" json:"https_spiffe,omitempty"` + Static *SPIFFEFederationBundleSourceStatic `protobuf:"bytes,1,opt,name=static,proto3" json:"static,omitempty"` + HttpsWeb *SPIFFEFederationBundleSourceHTTPSWeb `protobuf:"bytes,2,opt,name=https_web,json=httpsWeb,proto3" json:"https_web,omitempty"` } func (x *SPIFFEFederationBundleSource) Reset() { *x = SPIFFEFederationBundleSource{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_machineid_v1_federation_proto_msgTypes[4] + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -312,7 +249,7 @@ func (x *SPIFFEFederationBundleSource) String() string { func (*SPIFFEFederationBundleSource) ProtoMessage() {} func (x *SPIFFEFederationBundleSource) ProtoReflect() protoreflect.Message { - mi := &file_teleport_machineid_v1_federation_proto_msgTypes[4] + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -325,7 +262,7 @@ func (x *SPIFFEFederationBundleSource) ProtoReflect() protoreflect.Message { // Deprecated: Use SPIFFEFederationBundleSource.ProtoReflect.Descriptor instead. func (*SPIFFEFederationBundleSource) Descriptor() ([]byte, []int) { - return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{4} + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{3} } func (x *SPIFFEFederationBundleSource) GetStatic() *SPIFFEFederationBundleSourceStatic { @@ -342,13 +279,6 @@ func (x *SPIFFEFederationBundleSource) GetHttpsWeb() *SPIFFEFederationBundleSour return nil } -func (x *SPIFFEFederationBundleSource) GetHttpsSpiffe() *SPIFFEFederationBundleSourceHTTPSSPIFFE { - if x != nil { - return x.HttpsSpiffe - } - return nil -} - // SPIFFEFederationSpec is the configuration of a trust domain federation. type SPIFFEFederationSpec struct { state protoimpl.MessageState @@ -362,7 +292,7 @@ type SPIFFEFederationSpec struct { func (x *SPIFFEFederationSpec) Reset() { *x = SPIFFEFederationSpec{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_machineid_v1_federation_proto_msgTypes[5] + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -375,7 +305,7 @@ func (x *SPIFFEFederationSpec) String() string { func (*SPIFFEFederationSpec) ProtoMessage() {} func (x *SPIFFEFederationSpec) ProtoReflect() protoreflect.Message { - mi := &file_teleport_machineid_v1_federation_proto_msgTypes[5] + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -388,7 +318,7 @@ func (x *SPIFFEFederationSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use SPIFFEFederationSpec.ProtoReflect.Descriptor instead. func (*SPIFFEFederationSpec) Descriptor() ([]byte, []int) { - return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{5} + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{4} } func (x *SPIFFEFederationSpec) GetBundleSource() *SPIFFEFederationBundleSource { @@ -416,7 +346,7 @@ type SPIFFEFederationStatus struct { func (x *SPIFFEFederationStatus) Reset() { *x = SPIFFEFederationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_machineid_v1_federation_proto_msgTypes[6] + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -429,7 +359,7 @@ func (x *SPIFFEFederationStatus) String() string { func (*SPIFFEFederationStatus) ProtoMessage() {} func (x *SPIFFEFederationStatus) ProtoReflect() protoreflect.Message { - mi := &file_teleport_machineid_v1_federation_proto_msgTypes[6] + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -442,7 +372,7 @@ func (x *SPIFFEFederationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use SPIFFEFederationStatus.ProtoReflect.Descriptor instead. func (*SPIFFEFederationStatus) Descriptor() ([]byte, []int) { - return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{6} + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{5} } func (x *SPIFFEFederationStatus) GetCurrentBundle() string { @@ -506,63 +436,48 @@ var file_teleport_machineid_v1_federation_proto_rawDesc = []byte{ 0x65, 0x48, 0x54, 0x54, 0x50, 0x53, 0x57, 0x65, 0x62, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x27, 0x53, 0x50, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x22, 0xcb, 0x01, 0x0a, 0x1c, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x54, 0x54, 0x50, 0x53, 0x53, - 0x50, 0x49, 0x46, 0x46, 0x45, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, - 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, - 0x22, 0xae, 0x02, 0x0a, 0x1c, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, - 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x63, 0x12, 0x58, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x73, 0x5f, 0x77, 0x65, - 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x54, 0x54, 0x50, - 0x53, 0x57, 0x65, 0x62, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x73, 0x57, 0x65, 0x62, 0x12, 0x61, - 0x0a, 0x0c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x5f, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, - 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x54, 0x54, 0x50, 0x53, 0x53, 0x50, - 0x49, 0x46, 0x46, 0x45, 0x52, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x73, 0x53, 0x70, 0x69, 0x66, 0x66, - 0x65, 0x22, 0x70, 0x0a, 0x14, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x58, 0x0a, 0x0d, 0x62, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, + 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, 0x58, 0x0a, + 0x09, 0x68, 0x74, 0x74, 0x70, 0x73, 0x5f, 0x77, 0x65, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x22, 0xee, 0x01, 0x0a, 0x16, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, - 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, - 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x53, 0x0a, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x74, 0x12, 0x58, 0x0a, 0x1b, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x48, 0x69, 0x6e, 0x74, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, - 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, - 0x3b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x54, 0x54, 0x50, 0x53, 0x57, 0x65, 0x62, 0x52, 0x08, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x57, 0x65, 0x62, 0x22, 0x70, 0x0a, 0x14, 0x53, 0x50, 0x49, 0x46, 0x46, + 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x58, 0x0a, 0x0d, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xee, 0x01, 0x0a, 0x16, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x53, 0x0a, 0x18, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x73, 0x79, + 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x58, 0x0a, 0x1b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x48, 0x69, 0x6e, 0x74, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, + 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, + 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -577,34 +492,32 @@ func file_teleport_machineid_v1_federation_proto_rawDescGZIP() []byte { return file_teleport_machineid_v1_federation_proto_rawDescData } -var file_teleport_machineid_v1_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_teleport_machineid_v1_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_teleport_machineid_v1_federation_proto_goTypes = []any{ - (*SPIFFEFederation)(nil), // 0: teleport.machineid.v1.SPIFFEFederation - (*SPIFFEFederationBundleSourceStatic)(nil), // 1: teleport.machineid.v1.SPIFFEFederationBundleSourceStatic - (*SPIFFEFederationBundleSourceHTTPSWeb)(nil), // 2: teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSWeb - (*SPIFFEFederationBundleSourceHTTPSSPIFFE)(nil), // 3: teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSSPIFFE - (*SPIFFEFederationBundleSource)(nil), // 4: teleport.machineid.v1.SPIFFEFederationBundleSource - (*SPIFFEFederationSpec)(nil), // 5: teleport.machineid.v1.SPIFFEFederationSpec - (*SPIFFEFederationStatus)(nil), // 6: teleport.machineid.v1.SPIFFEFederationStatus - (*v1.Metadata)(nil), // 7: teleport.header.v1.Metadata - (*timestamppb.Timestamp)(nil), // 8: google.protobuf.Timestamp - (*durationpb.Duration)(nil), // 9: google.protobuf.Duration + (*SPIFFEFederation)(nil), // 0: teleport.machineid.v1.SPIFFEFederation + (*SPIFFEFederationBundleSourceStatic)(nil), // 1: teleport.machineid.v1.SPIFFEFederationBundleSourceStatic + (*SPIFFEFederationBundleSourceHTTPSWeb)(nil), // 2: teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSWeb + (*SPIFFEFederationBundleSource)(nil), // 3: teleport.machineid.v1.SPIFFEFederationBundleSource + (*SPIFFEFederationSpec)(nil), // 4: teleport.machineid.v1.SPIFFEFederationSpec + (*SPIFFEFederationStatus)(nil), // 5: teleport.machineid.v1.SPIFFEFederationStatus + (*v1.Metadata)(nil), // 6: teleport.header.v1.Metadata + (*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 8: google.protobuf.Duration } var file_teleport_machineid_v1_federation_proto_depIdxs = []int32{ - 7, // 0: teleport.machineid.v1.SPIFFEFederation.metadata:type_name -> teleport.header.v1.Metadata - 5, // 1: teleport.machineid.v1.SPIFFEFederation.spec:type_name -> teleport.machineid.v1.SPIFFEFederationSpec - 6, // 2: teleport.machineid.v1.SPIFFEFederation.status:type_name -> teleport.machineid.v1.SPIFFEFederationStatus + 6, // 0: teleport.machineid.v1.SPIFFEFederation.metadata:type_name -> teleport.header.v1.Metadata + 4, // 1: teleport.machineid.v1.SPIFFEFederation.spec:type_name -> teleport.machineid.v1.SPIFFEFederationSpec + 5, // 2: teleport.machineid.v1.SPIFFEFederation.status:type_name -> teleport.machineid.v1.SPIFFEFederationStatus 1, // 3: teleport.machineid.v1.SPIFFEFederationBundleSource.static:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSourceStatic 2, // 4: teleport.machineid.v1.SPIFFEFederationBundleSource.https_web:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSWeb - 3, // 5: teleport.machineid.v1.SPIFFEFederationBundleSource.https_spiffe:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSSPIFFE - 4, // 6: teleport.machineid.v1.SPIFFEFederationSpec.bundle_source:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSource - 8, // 7: teleport.machineid.v1.SPIFFEFederationStatus.current_bundle_synced_at:type_name -> google.protobuf.Timestamp - 9, // 8: teleport.machineid.v1.SPIFFEFederationStatus.current_bundle_refresh_hint:type_name -> google.protobuf.Duration - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 3, // 5: teleport.machineid.v1.SPIFFEFederationSpec.bundle_source:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSource + 7, // 6: teleport.machineid.v1.SPIFFEFederationStatus.current_bundle_synced_at:type_name -> google.protobuf.Timestamp + 8, // 7: teleport.machineid.v1.SPIFFEFederationStatus.current_bundle_refresh_hint:type_name -> google.protobuf.Duration + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_teleport_machineid_v1_federation_proto_init() } @@ -650,18 +563,6 @@ func file_teleport_machineid_v1_federation_proto_init() { } } file_teleport_machineid_v1_federation_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*SPIFFEFederationBundleSourceHTTPSSPIFFE); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_teleport_machineid_v1_federation_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*SPIFFEFederationBundleSource); i { case 0: return &v.state @@ -673,7 +574,7 @@ func file_teleport_machineid_v1_federation_proto_init() { return nil } } - file_teleport_machineid_v1_federation_proto_msgTypes[5].Exporter = func(v any, i int) any { + file_teleport_machineid_v1_federation_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*SPIFFEFederationSpec); i { case 0: return &v.state @@ -685,7 +586,7 @@ func file_teleport_machineid_v1_federation_proto_init() { return nil } } - file_teleport_machineid_v1_federation_proto_msgTypes[6].Exporter = func(v any, i int) any { + file_teleport_machineid_v1_federation_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*SPIFFEFederationStatus); i { case 0: return &v.state @@ -704,7 +605,7 @@ func file_teleport_machineid_v1_federation_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_machineid_v1_federation_proto_rawDesc, NumEnums: 0, - NumMessages: 7, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, diff --git a/api/proto/teleport/machineid/v1/federation.proto b/api/proto/teleport/machineid/v1/federation.proto index c8115c58b9811..343b8e0f8efa6 100644 --- a/api/proto/teleport/machineid/v1/federation.proto +++ b/api/proto/teleport/machineid/v1/federation.proto @@ -42,24 +42,11 @@ message SPIFFEFederationBundleSourceHTTPSWeb { string bundle_endpoint_url = 1; } -// SPIFFEFederationBundleSourceHTTPSSPIFFE is a bundle source that fetches the bundle -// from a HTTPS endpoint that is protected by a SPIFFE certificate that is -// "self-served" (i.e. the SPIFFE certificate is issued by the same trust domain -// that the bundle is for). -message SPIFFEFederationBundleSourceHTTPSSPIFFE { - // The URL of the SPIFFE Bundle Endpoint. - string bundle_endpoint_url = 1; - // The initial SPIFFE bundle that is used to bootstrap the connection to the - // bundle endpoint. After the first sync, this field will no longer be used. - string bundle_bootstrap = 2; -} - // SPIFFEFederationBundleSource configures how the federation bundle is sourced. // Only one field can be set. message SPIFFEFederationBundleSource { SPIFFEFederationBundleSourceStatic static = 1; SPIFFEFederationBundleSourceHTTPSWeb https_web = 2; - SPIFFEFederationBundleSourceHTTPSSPIFFE https_spiffe = 3; } // SPIFFEFederationSpec is the configuration of a trust domain federation. diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 368bf60215f85..620bd3642a545 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -5192,6 +5192,17 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { } machineidv1pb.RegisterWorkloadIdentityServiceServer(server, workloadIdentityService) + spiffeFederationService, err := machineidv1.NewSPIFFEFederationService(machineidv1.SPIFFEFederationServiceConfig{ + Authorizer: cfg.Authorizer, + Backend: nil, // TODO + Clock: cfg.AuthServer.GetClock(), + Emitter: cfg.Emitter, + }) + if err != nil { + return nil, trace.Wrap(err, "creating SPIFFE federation service") + } + machineidv1pb.RegisterSPIFFEFederationServiceServer(server, spiffeFederationService) + dbObjectImportRuleService, err := dbobjectimportrulev1.NewDatabaseObjectImportRuleService(dbobjectimportrulev1.DatabaseObjectImportRuleServiceConfig{ Authorizer: cfg.Authorizer, Backend: cfg.AuthServer.Services, diff --git a/lib/auth/machineid/machineidv1/spiffe_federation_service.go b/lib/auth/machineid/machineidv1/spiffe_federation_service.go index 2a8e0918fdccd..a58f3b7350dc2 100644 --- a/lib/auth/machineid/machineidv1/spiffe_federation_service.go +++ b/lib/auth/machineid/machineidv1/spiffe_federation_service.go @@ -24,28 +24,54 @@ import ( "github.com/jonboulle/clockwork" "google.golang.org/protobuf/types/known/emptypb" + "github.com/gravitational/teleport" machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/services" ) +// SPIFFEFederationServiceConfig holds configuration options for +// NewSPIFFEFederationService type SPIFFEFederationServiceConfig struct { Authorizer authz.Authorizer Backend services.SPIFFEFederation Logger *slog.Logger Clock clockwork.Clock + Emitter apievents.Emitter } -func NewSPIFFEFederationService(config SPIFFEFederationServiceConfig) *SPIFFEFederationService { - return &SPIFFEFederationService{ - authorizer: config.Authorizer, - backend: config.Backend, - logger: config.Logger, - clock: config.Clock, +// NewSPIFFEFederationService returns a new instance of the SPIFFEFederationService. +func NewSPIFFEFederationService( + cfg SPIFFEFederationServiceConfig, +) (*SPIFFEFederationService, error) { + switch { + case cfg.Backend == nil: + return nil, trace.BadParameter("backend service is required") + case cfg.Authorizer == nil: + return nil, trace.BadParameter("authorizer is required") + case cfg.Emitter == nil: + return nil, trace.BadParameter("emitter is required") + } + + if cfg.Logger == nil { + cfg.Logger = slog.With(teleport.ComponentKey, "bot_instance.service") + } + if cfg.Clock == nil { + cfg.Clock = clockwork.NewRealClock() } + + return &SPIFFEFederationService{ + authorizer: cfg.Authorizer, + backend: cfg.Backend, + logger: cfg.Logger, + clock: cfg.Clock, + }, nil } +// SPIFFEFederationService is an implementation of +// teleport.machineid.v1.SPIFFEFederationService type SPIFFEFederationService struct { machineidv1.UnimplementedSPIFFEFederationServiceServer @@ -53,10 +79,13 @@ type SPIFFEFederationService struct { backend services.SPIFFEFederation logger *slog.Logger clock clockwork.Clock + emitter apievents.Emitter } +// GetSPIFFEFederation returns a SPIFFE Federation by name. +// Implements teleport.machineid.v1.SPIFFEFederationService/GetSPIFFEFederation func (s *SPIFFEFederationService) GetSPIFFEFederation( - ctx context.Context, request *machineidv1.GetSPIFFEFederationRequest, + ctx context.Context, req *machineidv1.GetSPIFFEFederationRequest, ) (*machineidv1.SPIFFEFederation, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { @@ -65,12 +94,25 @@ func (s *SPIFFEFederationService) GetSPIFFEFederation( if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbRead); err != nil { return nil, trace.Wrap(err) } - //TODO implement me - panic("implement me") + + if req.Name == "" { + return nil, trace.BadParameter("name: must be non-empty") + } + + // TODO(noah): Use cache... + federation, err := s.backend.GetSPIFFEFederation(ctx, req.Name) + if err != nil { + return nil, trace.Wrap(err) + } + + return federation, nil } +// ListSPIFFEFederations returns a list of SPIFFE Federations. It follows the +// Google API design guidelines for list pagination. +// Implements teleport.machineid.v1.SPIFFEFederationService/ListSPIFFEFederations func (s *SPIFFEFederationService) ListSPIFFEFederations( - ctx context.Context, request *machineidv1.ListSPIFFEFederationsRequest, + ctx context.Context, req *machineidv1.ListSPIFFEFederationsRequest, ) (*machineidv1.ListSPIFFEFederationsResponse, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { @@ -79,12 +121,27 @@ func (s *SPIFFEFederationService) ListSPIFFEFederations( if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbRead, types.VerbList); err != nil { return nil, trace.Wrap(err) } - //TODO implement me - panic("implement me") + + // TODO: Use cache... + federations, nextToken, err := s.backend.ListSPIFFEFederations( + ctx, + int(req.PageSize), + req.PageToken, + ) + if err != nil { + return nil, trace.Wrap(err) + } + + return &machineidv1.ListSPIFFEFederationsResponse{ + SpiffeFederations: federations, + NextPageToken: nextToken, + }, nil } +// DeleteSPIFFEFederation deletes a SPIFFE Federation by name. +// Implements teleport.machineid.v1.SPIFFEFederationService/DeleteSPIFFEFederation func (s *SPIFFEFederationService) DeleteSPIFFEFederation( - ctx context.Context, request *machineidv1.DeleteSPIFFEFederationRequest, + ctx context.Context, req *machineidv1.DeleteSPIFFEFederationRequest, ) (*emptypb.Empty, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { @@ -93,12 +150,22 @@ func (s *SPIFFEFederationService) DeleteSPIFFEFederation( if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbDelete); err != nil { return nil, trace.Wrap(err) } - //TODO implement me - panic("implement me") + + if req.Name == "" { + return nil, trace.BadParameter("name: must be non-empty") + } + + if err := s.backend.DeleteSPIFFEFederation(ctx, req.Name); err != nil { + return nil, trace.Wrap(err) + } + // TODO: audit log + return &emptypb.Empty{}, nil } +// CreateSPIFFEFederation creates a new SPIFFE Federation. +// Implements teleport.machineid.v1.SPIFFEFederationService/CreateSPIFFEFederation func (s *SPIFFEFederationService) CreateSPIFFEFederation( - ctx context.Context, request *machineidv1.CreateSPIFFEFederationRequest, + ctx context.Context, req *machineidv1.CreateSPIFFEFederationRequest, ) (*machineidv1.SPIFFEFederation, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { @@ -107,6 +174,11 @@ func (s *SPIFFEFederationService) CreateSPIFFEFederation( if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } - //TODO implement me - panic("implement me") + + created, err := s.backend.CreateSPIFFEFederation(ctx, req.SpiffeFederation) + if err != nil { + return nil, trace.Wrap(err) + } + // TODO: audit log + return created, nil } diff --git a/lib/services/spiffe_federation.go b/lib/services/spiffe_federation.go index 92d571b7d0ed8..cb61d5de94789 100644 --- a/lib/services/spiffe_federation.go +++ b/lib/services/spiffe_federation.go @@ -25,7 +25,7 @@ import ( // SPIFFEFederation is an interface for the SPIFFEFederation service. type SPIFFEFederation interface { // CreateBotInstance - CreateSPIFFEFederation(ctx context.Context, botInstance *machineidv1.SPIFFEFederation) (*machineidv1.SPIFFEFederation, error) + CreateSPIFFEFederation(ctx context.Context, spiffeFederation *machineidv1.SPIFFEFederation) (*machineidv1.SPIFFEFederation, error) // GetBotInstance GetSPIFFEFederation(ctx context.Context, name string) (*machineidv1.SPIFFEFederation, error) From 0722de6200eea8e8473ac3fd6704ef79586ef4a0 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Tue, 30 Jul 2024 15:12:52 +0100 Subject: [PATCH 04/12] Refactor backend service to reference SPIFFEFederation --- .../machineidv1/spiffe_federation_service.go | 8 +- lib/services/local/spiffe_federation.go | 92 +++++++++++++++++++ lib/services/spiffe_federation.go | 14 +++ 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 lib/services/local/spiffe_federation.go diff --git a/lib/auth/machineid/machineidv1/spiffe_federation_service.go b/lib/auth/machineid/machineidv1/spiffe_federation_service.go index a58f3b7350dc2..fe0b1ada122f9 100644 --- a/lib/auth/machineid/machineidv1/spiffe_federation_service.go +++ b/lib/auth/machineid/machineidv1/spiffe_federation_service.go @@ -56,7 +56,7 @@ func NewSPIFFEFederationService( } if cfg.Logger == nil { - cfg.Logger = slog.With(teleport.ComponentKey, "bot_instance.service") + cfg.Logger = slog.With(teleport.ComponentKey, "spiffe_federation.service") } if cfg.Clock == nil { cfg.Clock = clockwork.NewRealClock() @@ -150,6 +150,9 @@ func (s *SPIFFEFederationService) DeleteSPIFFEFederation( if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbDelete); err != nil { return nil, trace.Wrap(err) } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } if req.Name == "" { return nil, trace.BadParameter("name: must be non-empty") @@ -174,6 +177,9 @@ func (s *SPIFFEFederationService) CreateSPIFFEFederation( if err := authCtx.CheckAccessToKind(types.KindSPIFFEFederation, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } created, err := s.backend.CreateSPIFFEFederation(ctx, req.SpiffeFederation) if err != nil { diff --git a/lib/services/local/spiffe_federation.go b/lib/services/local/spiffe_federation.go new file mode 100644 index 0000000000000..877c56a138f91 --- /dev/null +++ b/lib/services/local/spiffe_federation.go @@ -0,0 +1,92 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package local + +import ( + "context" + + "github.com/gravitational/trace" + + machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local/generic" +) + +const ( + spiffeFederationPrefix = "spiffe_federation" +) + +// SPIFFEFederationService exposes backend functionality for storing +// SPIFFEFederation +type SPIFFEFederationService struct { + service *generic.ServiceWrapper[*machineidv1.SPIFFEFederation] +} + +// NewSPIFFEFederationService creates a new SPIFFEFederationService. +func NewSPIFFEFederationService( + backend backend.Backend, +) (*SPIFFEFederationService, error) { + service, err := generic.NewServiceWrapper(backend, + types.KindSPIFFEFederation, + spiffeFederationPrefix, + services.MarshalSPIFFEFederation, + services.UnmarshalSPIFFEFederation, + ) + if err != nil { + return nil, trace.Wrap(err) + } + return &SPIFFEFederationService{ + service: service, + }, nil +} + +// CreateSPIFFEFederation inserts a new SPIFFEFederation into the backend. +func (b *SPIFFEFederationService) CreateSPIFFEFederation( + ctx context.Context, federation *machineidv1.SPIFFEFederation, +) (*machineidv1.SPIFFEFederation, error) { + if err := services.ValidateSPIFFEFederation(federation); err != nil { + return nil, trace.Wrap(err) + } + created, err := b.service.CreateResource(ctx, federation) + return created, trace.Wrap(err) +} + +// GetSPIFFEFederation retrieves a specific SPIFFEFederation given a name +func (b *SPIFFEFederationService) GetSPIFFEFederation( + ctx context.Context, name string, +) (*machineidv1.SPIFFEFederation, error) { + federation, err := b.service.GetResource(ctx, name) + return federation, trace.Wrap(err) +} + +// ListSPIFFEFederations lists all SPIFFEFederations using a given page size +// and last key. +func (b *SPIFFEFederationService) ListSPIFFEFederations( + ctx context.Context, pageSize int, currentToken string, +) ([]*machineidv1.SPIFFEFederation, string, error) { + r, nextToken, err := b.service.ListResources(ctx, pageSize, currentToken) + return r, nextToken, trace.Wrap(err) +} + +// DeleteSPIFFEFederation deletes a specific SPIFFEFederation. +func (b *SPIFFEFederationService) DeleteSPIFFEFederation( + ctx context.Context, name string, +) error { + return trace.Wrap(b.service.DeleteResource(ctx, name)) +} diff --git a/lib/services/spiffe_federation.go b/lib/services/spiffe_federation.go index cb61d5de94789..d7f6275ffc2f3 100644 --- a/lib/services/spiffe_federation.go +++ b/lib/services/spiffe_federation.go @@ -36,3 +36,17 @@ type SPIFFEFederation interface { // DeleteBotInstance DeleteSPIFFEFederation(ctx context.Context, name string) error } + +// MarshalSPIFFEFederation marshals the SPIFFEFederation object into a JSON byte array. +func MarshalSPIFFEFederation(object *machineidv1.SPIFFEFederation, opts ...MarshalOption) ([]byte, error) { + return MarshalProtoResource(object, opts...) +} + +// UnmarshalSPIFFEFederation unmarshals the CrownJewel object from a JSON byte array. +func UnmarshalSPIFFEFederation(data []byte, opts ...MarshalOption) (*machineidv1.SPIFFEFederation, error) { + return UnmarshalProtoResource[*machineidv1.SPIFFEFederation](data, opts...) +} + +func ValidateSPIFFEFederation(object *machineidv1.SPIFFEFederation) error { + +} From 7f1a96ccf9a455d88da4b7f5d53bb544d6181b7f Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Wed, 31 Jul 2024 11:28:17 +0100 Subject: [PATCH 05/12] Add rough validation --- lib/services/spiffe_federation.go | 71 ++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 6 deletions(-) diff --git a/lib/services/spiffe_federation.go b/lib/services/spiffe_federation.go index d7f6275ffc2f3..584bd954edecf 100644 --- a/lib/services/spiffe_federation.go +++ b/lib/services/spiffe_federation.go @@ -18,35 +18,94 @@ package services import ( "context" + "net/url" + "strings" + + "github.com/gravitational/trace" + "github.com/spiffe/go-spiffe/v2/bundle/spiffebundle" + "github.com/spiffe/go-spiffe/v2/spiffeid" machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + "github.com/gravitational/teleport/api/types" ) // SPIFFEFederation is an interface for the SPIFFEFederation service. type SPIFFEFederation interface { - // CreateBotInstance + // CreateSPIFFEFederation creates a new SPIFFE Federation. CreateSPIFFEFederation(ctx context.Context, spiffeFederation *machineidv1.SPIFFEFederation) (*machineidv1.SPIFFEFederation, error) - // GetBotInstance + // GetSPIFFEFederation gets a SPIFFE Federation by name. GetSPIFFEFederation(ctx context.Context, name string) (*machineidv1.SPIFFEFederation, error) - // ListBotInstances + // ListSPIFFEFederations lists all SPIFFE Federations using Google style + // pagination. ListSPIFFEFederations(ctx context.Context, pageSize int, lastToken string) ([]*machineidv1.SPIFFEFederation, string, error) - // DeleteBotInstance + // DeleteSPIFFEFederation deletes a SPIFFE Federation by name. DeleteSPIFFEFederation(ctx context.Context, name string) error } // MarshalSPIFFEFederation marshals the SPIFFEFederation object into a JSON byte array. func MarshalSPIFFEFederation(object *machineidv1.SPIFFEFederation, opts ...MarshalOption) ([]byte, error) { + object.Version = types.V1 + object.Kind = types.KindSPIFFEFederation return MarshalProtoResource(object, opts...) } -// UnmarshalSPIFFEFederation unmarshals the CrownJewel object from a JSON byte array. +// UnmarshalSPIFFEFederation unmarshals the SPIFFEFederation object from a JSON byte array. func UnmarshalSPIFFEFederation(data []byte, opts ...MarshalOption) (*machineidv1.SPIFFEFederation, error) { return UnmarshalProtoResource[*machineidv1.SPIFFEFederation](data, opts...) } -func ValidateSPIFFEFederation(object *machineidv1.SPIFFEFederation) error { +// ValidateSPIFFEFederation validates the SPIFFEFederation object. +func ValidateSPIFFEFederation(s *machineidv1.SPIFFEFederation) error { + switch { + case s.Metadata.Name == "": + return trace.BadParameter("metadata.name: is required") + case s.Spec == nil: + return trace.BadParameter("spec: is required") + case s.Spec.BundleSource == nil: + return trace.BadParameter("spec.bundle_source: is required") + case s.Spec.BundleSource.HttpsWeb != nil && s.Spec.BundleSource.Static != nil: + return trace.BadParameter("spec.bundle_source: at most one of https_web or static can be set") + case s.Spec.BundleSource.HttpsWeb == nil && s.Spec.BundleSource.Static == nil: + return trace.BadParameter("spec.bundle_source: at least one of https_web or static must be set") + } + + // Validate name is valid SPIFFE Trust Domain name without the "spiffe://" + name := s.Metadata.Name + if strings.HasPrefix(name, "spiffe://") { + return trace.BadParameter("metadata.name: must not include the spiffe:// prefix") + } + td, err := spiffeid.TrustDomainFromString(name) + if err != nil { + return trace.Wrap(err, "validating metadata.name") + } + + // Validate Static + if s.Spec.BundleSource.Static != nil { + if s.Spec.BundleSource.Static.Bundle == "" { + return trace.BadParameter("spec.bundle_source.static.bundle: is required") + } + // Validate contents + // TODO(noah): Is this a bit intense to run on every validation? + // This could easily be moved into reconciliation... + _, err := spiffebundle.Parse(td, []byte(s.Spec.BundleSource.Static.Bundle)) + if err != nil { + return trace.Wrap(err, "validating spec.bundle_source.static.bundle") + } + } + + // Validate HTTPSWeb + if s.Spec.BundleSource.HttpsWeb != nil { + if s.Spec.BundleSource.HttpsWeb.BundleEndpointUrl == "" { + return trace.BadParameter("spec.bundle_source.https_web.bundle_endpoint_url: is required") + } + _, err := url.Parse(s.Spec.BundleSource.HttpsWeb.BundleEndpointUrl) + if err != nil { + return trace.Wrap(err, "validating spec.bundle_source.https_web.bundle_endpoint_url") + } + } + return nil } From d770479f0005763eed7fcd4b1b5131942b4267b7 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Wed, 31 Jul 2024 11:28:32 +0100 Subject: [PATCH 06/12] Add TODO --- lib/services/spiffe_federation.go | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/services/spiffe_federation.go b/lib/services/spiffe_federation.go index 584bd954edecf..f09ce94fd8c84 100644 --- a/lib/services/spiffe_federation.go +++ b/lib/services/spiffe_federation.go @@ -105,6 +105,7 @@ func ValidateSPIFFEFederation(s *machineidv1.SPIFFEFederation) error { if err != nil { return trace.Wrap(err, "validating spec.bundle_source.https_web.bundle_endpoint_url") } + // TODO: Enforce HTTPS?? } return nil From 5e743fff95aa48f7fa5c136d81ab6c2eaf4f81a6 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 1 Aug 2024 13:23:08 +0100 Subject: [PATCH 07/12] Add event protos --- .../teleport/legacy/types/events/events.proto | 64 + api/types/events/events.pb.go | 2799 +++++++++++------ 2 files changed, 1867 insertions(+), 996 deletions(-) diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index c4a4bb1c6ad15..fa4f1221220fd 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -4454,6 +4454,8 @@ message OneOf { events.IntegrationCreate IntegrationCreate = 165; events.IntegrationUpdate IntegrationUpdate = 166; events.IntegrationDelete IntegrationDelete = 167; + events.SPIFFEFederationCreate SPIFFEFederationCreate = 168; + events.SPIFFEFederationDelete SPIFFEFederationDelete = 169; } } @@ -6664,3 +6666,65 @@ message AccessGraphSettingsUpdate { (gogoproto.jsontag) = "" ]; } + +// SPIFFEFederationCreate is emitted when a SPIFFE federation is created. +message SPIFFEFederationCreate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// SPIFFEFederationDelete is emitted when a SPIFFE federation is deleted. +message SPIFFEFederationDelete { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index dc74c9474cc7a..9fdd549ad7b36 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -7513,6 +7513,8 @@ type OneOf struct { // *OneOf_IntegrationCreate // *OneOf_IntegrationUpdate // *OneOf_IntegrationDelete + // *OneOf_SPIFFEFederationCreate + // *OneOf_SPIFFEFederationDelete Event isOneOf_Event `protobuf_oneof:"Event"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -8056,6 +8058,12 @@ type OneOf_IntegrationUpdate struct { type OneOf_IntegrationDelete struct { IntegrationDelete *IntegrationDelete `protobuf:"bytes,167,opt,name=IntegrationDelete,proto3,oneof" json:"IntegrationDelete,omitempty"` } +type OneOf_SPIFFEFederationCreate struct { + SPIFFEFederationCreate *SPIFFEFederationCreate `protobuf:"bytes,168,opt,name=SPIFFEFederationCreate,proto3,oneof" json:"SPIFFEFederationCreate,omitempty"` +} +type OneOf_SPIFFEFederationDelete struct { + SPIFFEFederationDelete *SPIFFEFederationDelete `protobuf:"bytes,169,opt,name=SPIFFEFederationDelete,proto3,oneof" json:"SPIFFEFederationDelete,omitempty"` +} func (*OneOf_UserLogin) isOneOf_Event() {} func (*OneOf_UserCreate) isOneOf_Event() {} @@ -8223,6 +8231,8 @@ func (*OneOf_AccessGraphSettingsUpdate) isOneOf_Event() {} func (*OneOf_IntegrationCreate) isOneOf_Event() {} func (*OneOf_IntegrationUpdate) isOneOf_Event() {} func (*OneOf_IntegrationDelete) isOneOf_Event() {} +func (*OneOf_SPIFFEFederationCreate) isOneOf_Event() {} +func (*OneOf_SPIFFEFederationDelete) isOneOf_Event() {} func (m *OneOf) GetEvent() isOneOf_Event { if m != nil { @@ -9393,6 +9403,20 @@ func (m *OneOf) GetIntegrationDelete() *IntegrationDelete { return nil } +func (m *OneOf) GetSPIFFEFederationCreate() *SPIFFEFederationCreate { + if x, ok := m.GetEvent().(*OneOf_SPIFFEFederationCreate); ok { + return x.SPIFFEFederationCreate + } + return nil +} + +func (m *OneOf) GetSPIFFEFederationDelete() *SPIFFEFederationDelete { + if x, ok := m.GetEvent().(*OneOf_SPIFFEFederationDelete); ok { + return x.SPIFFEFederationDelete + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*OneOf) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -9562,6 +9586,8 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_IntegrationCreate)(nil), (*OneOf_IntegrationUpdate)(nil), (*OneOf_IntegrationDelete)(nil), + (*OneOf_SPIFFEFederationCreate)(nil), + (*OneOf_SPIFFEFederationDelete)(nil), } } @@ -13386,6 +13412,102 @@ func (m *AccessGraphSettingsUpdate) XXX_DiscardUnknown() { var xxx_messageInfo_AccessGraphSettingsUpdate proto.InternalMessageInfo +// SPIFFEFederationCreate is emitted when a SPIFFE federation is created. +type SPIFFEFederationCreate struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SPIFFEFederationCreate) Reset() { *m = SPIFFEFederationCreate{} } +func (m *SPIFFEFederationCreate) String() string { return proto.CompactTextString(m) } +func (*SPIFFEFederationCreate) ProtoMessage() {} +func (*SPIFFEFederationCreate) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{209} +} +func (m *SPIFFEFederationCreate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SPIFFEFederationCreate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SPIFFEFederationCreate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SPIFFEFederationCreate) XXX_Merge(src proto.Message) { + xxx_messageInfo_SPIFFEFederationCreate.Merge(m, src) +} +func (m *SPIFFEFederationCreate) XXX_Size() int { + return m.Size() +} +func (m *SPIFFEFederationCreate) XXX_DiscardUnknown() { + xxx_messageInfo_SPIFFEFederationCreate.DiscardUnknown(m) +} + +var xxx_messageInfo_SPIFFEFederationCreate proto.InternalMessageInfo + +// SPIFFEFederationDelete is emitted when a SPIFFE federation is deleted. +type SPIFFEFederationDelete struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SPIFFEFederationDelete) Reset() { *m = SPIFFEFederationDelete{} } +func (m *SPIFFEFederationDelete) String() string { return proto.CompactTextString(m) } +func (*SPIFFEFederationDelete) ProtoMessage() {} +func (*SPIFFEFederationDelete) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{210} +} +func (m *SPIFFEFederationDelete) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SPIFFEFederationDelete) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SPIFFEFederationDelete.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SPIFFEFederationDelete) XXX_Merge(src proto.Message) { + xxx_messageInfo_SPIFFEFederationDelete.Merge(m, src) +} +func (m *SPIFFEFederationDelete) XXX_Size() int { + return m.Size() +} +func (m *SPIFFEFederationDelete) XXX_DiscardUnknown() { + xxx_messageInfo_SPIFFEFederationDelete.DiscardUnknown(m) +} + +var xxx_messageInfo_SPIFFEFederationDelete proto.InternalMessageInfo + func init() { proto.RegisterEnum("events.UserKind", UserKind_name, UserKind_value) proto.RegisterEnum("events.EventAction", EventAction_name, EventAction_value) @@ -13619,6 +13741,8 @@ func init() { proto.RegisterType((*AccessPathChanged)(nil), "events.AccessPathChanged") proto.RegisterType((*SpannerRPC)(nil), "events.SpannerRPC") proto.RegisterType((*AccessGraphSettingsUpdate)(nil), "events.AccessGraphSettingsUpdate") + proto.RegisterType((*SPIFFEFederationCreate)(nil), "events.SPIFFEFederationCreate") + proto.RegisterType((*SPIFFEFederationDelete)(nil), "events.SPIFFEFederationDelete") } func init() { @@ -13626,987 +13750,990 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 15665 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x5b, 0x74, 0x24, 0xc7, - 0x75, 0x20, 0x88, 0x7a, 0xa0, 0x00, 0x5c, 0x3c, 0x1a, 0x88, 0x7e, 0x25, 0x9b, 0xdd, 0x5d, 0x64, - 0x52, 0x6c, 0x75, 0x53, 0x64, 0xb7, 0xd8, 0x6c, 0x92, 0xe2, 0x4b, 0x64, 0x01, 0x05, 0x34, 0x8a, - 0x8d, 0x17, 0xb3, 0xd0, 0xdd, 0xa2, 0x5e, 0xe5, 0x44, 0x65, 0x00, 0x48, 0xa2, 0x2a, 0xb3, 0x94, - 0x99, 0xd5, 0x68, 0x70, 0x5f, 0x96, 0xd7, 0x0f, 0xc9, 0x2b, 0xc9, 0x5a, 0x79, 0x6d, 0xd9, 0x6b, - 0xef, 0x5a, 0x7e, 0xed, 0x7a, 0x7d, 0xbc, 0xf6, 0x7a, 0xd7, 0xc7, 0xb6, 0xec, 0xd5, 0x59, 0x7b, - 0xb5, 0x0f, 0x7a, 0x75, 0xbc, 0xc7, 0xf6, 0xee, 0xf8, 0xf8, 0xcc, 0x78, 0x20, 0x8f, 0x66, 0x3c, - 0x1f, 0x38, 0x33, 0xe7, 0x78, 0x66, 0x74, 0xc6, 0x1a, 0x8f, 0x67, 0xce, 0x9c, 0xb8, 0x11, 0x99, - 0x19, 0xf9, 0xa8, 0xc2, 0x93, 0x06, 0xa1, 0xc6, 0x4f, 0x37, 0xea, 0xde, 0x1b, 0x37, 0x22, 0x6f, - 0xdc, 0x88, 0xb8, 0x11, 0x71, 0xe3, 0x5e, 0xb8, 0xe2, 0xd1, 0x06, 0x6d, 0xd9, 0x8e, 0x77, 0xad, - 0x41, 0x57, 0xf4, 0xfa, 0xc6, 0x35, 0x6f, 0xa3, 0x45, 0xdd, 0x6b, 0xf4, 0x1e, 0xb5, 0x3c, 0xff, - 0xbf, 0xab, 0x2d, 0xc7, 0xf6, 0x6c, 0x52, 0xe0, 0xbf, 0xce, 0x9d, 0x5a, 0xb1, 0x57, 0x6c, 0x04, - 0x5d, 0x63, 0x7f, 0x71, 0xec, 0xb9, 0xf3, 0x2b, 0xb6, 0xbd, 0xd2, 0xa0, 0xd7, 0xf0, 0xd7, 0x52, - 0x7b, 0xf9, 0x9a, 0xeb, 0x39, 0xed, 0xba, 0x27, 0xb0, 0xc5, 0x38, 0xd6, 0x33, 0x9b, 0xd4, 0xf5, - 0xf4, 0x66, 0x4b, 0x10, 0x5c, 0x8c, 0x13, 0xac, 0x3b, 0x7a, 0xab, 0x45, 0x1d, 0x51, 0xf9, 0xb9, - 0x47, 0xd3, 0xdb, 0x89, 0xff, 0x0a, 0x92, 0xa7, 0xd2, 0x49, 0x7c, 0x46, 0x31, 0x8e, 0xea, 0x97, - 0xb2, 0xd0, 0x3f, 0x4b, 0x3d, 0xdd, 0xd0, 0x3d, 0x9d, 0x9c, 0x87, 0xde, 0x8a, 0x65, 0xd0, 0xfb, - 0x4a, 0xe6, 0x91, 0xcc, 0xe5, 0xdc, 0x78, 0x61, 0x6b, 0xb3, 0x98, 0xa5, 0xa6, 0xc6, 0x81, 0xe4, - 0x02, 0xe4, 0x17, 0x37, 0x5a, 0x54, 0xc9, 0x3e, 0x92, 0xb9, 0x3c, 0x30, 0x3e, 0xb0, 0xb5, 0x59, - 0xec, 0x45, 0x59, 0x68, 0x08, 0x26, 0x8f, 0x42, 0xb6, 0x52, 0x56, 0x72, 0x88, 0x1c, 0xdb, 0xda, - 0x2c, 0x0e, 0xb7, 0x4d, 0xe3, 0x49, 0xbb, 0x69, 0x7a, 0xb4, 0xd9, 0xf2, 0x36, 0xb4, 0x6c, 0xa5, - 0x4c, 0x2e, 0x41, 0x7e, 0xc2, 0x36, 0xa8, 0x92, 0x47, 0x22, 0xb2, 0xb5, 0x59, 0x1c, 0xa9, 0xdb, - 0x06, 0x95, 0xa8, 0x10, 0x4f, 0x5e, 0x83, 0xfc, 0xa2, 0xd9, 0xa4, 0x4a, 0xef, 0x23, 0x99, 0xcb, - 0x83, 0xd7, 0xcf, 0x5d, 0xe5, 0x52, 0xb9, 0xea, 0x4b, 0xe5, 0xea, 0xa2, 0x2f, 0xb6, 0xf1, 0xd1, - 0x77, 0x36, 0x8b, 0x3d, 0x5b, 0x9b, 0xc5, 0x3c, 0x93, 0xe4, 0x17, 0xbf, 0x59, 0xcc, 0x68, 0x58, - 0x92, 0xbc, 0x0c, 0x83, 0x13, 0x8d, 0xb6, 0xeb, 0x51, 0x67, 0x4e, 0x6f, 0x52, 0xa5, 0x80, 0x15, - 0x9e, 0xdb, 0xda, 0x2c, 0x9e, 0xa9, 0x73, 0x70, 0xcd, 0xd2, 0x9b, 0x72, 0xc5, 0x32, 0xb9, 0xfa, - 0xdb, 0x19, 0x38, 0x51, 0xa5, 0xae, 0x6b, 0xda, 0x56, 0x20, 0x9b, 0xc7, 0x61, 0x40, 0x80, 0x2a, - 0x65, 0x94, 0xcf, 0xc0, 0x78, 0xdf, 0xd6, 0x66, 0x31, 0xe7, 0x9a, 0x86, 0x16, 0x62, 0xc8, 0x07, - 0xa1, 0xef, 0xae, 0xe9, 0xad, 0xce, 0x4e, 0x95, 0x84, 0x9c, 0xce, 0x6c, 0x6d, 0x16, 0xc9, 0xba, - 0xe9, 0xad, 0xd6, 0x9a, 0xcb, 0xba, 0x54, 0xa1, 0x4f, 0x46, 0x66, 0x60, 0x74, 0xc1, 0x31, 0xef, - 0xe9, 0x1e, 0xbd, 0x45, 0x37, 0x16, 0xec, 0x86, 0x59, 0xdf, 0x10, 0x52, 0x7c, 0x64, 0x6b, 0xb3, - 0x78, 0xbe, 0xc5, 0x71, 0xb5, 0x35, 0xba, 0x51, 0x6b, 0x21, 0x56, 0x62, 0x92, 0x28, 0xa9, 0xfe, - 0x4e, 0x01, 0x86, 0x6e, 0xbb, 0xd4, 0x09, 0xda, 0x7d, 0x09, 0xf2, 0xec, 0xb7, 0x68, 0x32, 0xca, - 0xbc, 0xed, 0x52, 0x47, 0x96, 0x39, 0xc3, 0x93, 0x2b, 0xd0, 0x3b, 0x63, 0xaf, 0x98, 0x96, 0x68, - 0xf6, 0xc9, 0xad, 0xcd, 0xe2, 0x89, 0x06, 0x03, 0x48, 0x94, 0x9c, 0x82, 0x7c, 0x18, 0x86, 0x2a, - 0x4d, 0xa6, 0x43, 0xb6, 0xa5, 0x7b, 0xb6, 0x23, 0x5a, 0x8b, 0xd2, 0x35, 0x25, 0xb8, 0x54, 0x30, - 0x42, 0x4f, 0x5e, 0x04, 0x28, 0xdd, 0xad, 0x6a, 0x76, 0x83, 0x96, 0xb4, 0x39, 0xa1, 0x0c, 0x58, - 0x5a, 0x5f, 0x77, 0x6b, 0x8e, 0xdd, 0xa0, 0x35, 0xdd, 0x91, 0xab, 0x95, 0xa8, 0xc9, 0x24, 0x8c, - 0x94, 0xea, 0x75, 0xea, 0xba, 0x1a, 0xfd, 0x54, 0x9b, 0xba, 0x9e, 0xab, 0xf4, 0x3e, 0x92, 0xbb, - 0x3c, 0x30, 0x7e, 0x61, 0x6b, 0xb3, 0xf8, 0x90, 0x8e, 0x98, 0x9a, 0x23, 0x50, 0x12, 0x8b, 0x58, - 0x21, 0x32, 0x0e, 0xc3, 0xa5, 0xb7, 0xdb, 0x0e, 0xad, 0x18, 0xd4, 0xf2, 0x4c, 0x6f, 0x43, 0x68, - 0xc8, 0xf9, 0xad, 0xcd, 0xa2, 0xa2, 0x33, 0x44, 0xcd, 0x14, 0x18, 0x89, 0x49, 0xb4, 0x08, 0x99, - 0x87, 0xb1, 0x9b, 0x13, 0x0b, 0x55, 0xea, 0xdc, 0x33, 0xeb, 0xb4, 0x54, 0xaf, 0xdb, 0x6d, 0xcb, - 0x53, 0xfa, 0x90, 0xcf, 0xa3, 0x5b, 0x9b, 0xc5, 0x0b, 0x2b, 0xf5, 0x56, 0xcd, 0xe5, 0xd8, 0x9a, - 0xce, 0xd1, 0x12, 0xb3, 0x64, 0x59, 0xf2, 0x51, 0x18, 0x5e, 0x74, 0x98, 0x16, 0x1a, 0x65, 0xca, - 0xe0, 0x4a, 0x3f, 0xea, 0xff, 0x99, 0xab, 0x62, 0x02, 0xe2, 0x50, 0xbf, 0x67, 0x79, 0x63, 0x3d, - 0x5e, 0xa0, 0x66, 0x20, 0x4e, 0x6e, 0x6c, 0x84, 0x15, 0xa1, 0xa0, 0xb0, 0x8f, 0x37, 0x1d, 0x6a, - 0x24, 0xb4, 0x6d, 0x00, 0xdb, 0x7c, 0x65, 0x6b, 0xb3, 0xf8, 0xb8, 0x23, 0x68, 0x6a, 0x5d, 0xd5, - 0xae, 0x23, 0x2b, 0x32, 0x09, 0xfd, 0x4c, 0x9b, 0x6e, 0x99, 0x96, 0xa1, 0xc0, 0x23, 0x99, 0xcb, - 0x23, 0xd7, 0x47, 0xfd, 0xd6, 0xfb, 0xf0, 0xf1, 0xb3, 0x5b, 0x9b, 0xc5, 0x93, 0x4c, 0x07, 0x6b, - 0x6b, 0xa6, 0x25, 0x4f, 0x11, 0x41, 0x51, 0x36, 0x8a, 0xc6, 0x6d, 0x0f, 0x87, 0xee, 0x60, 0x38, - 0x8a, 0x96, 0x6c, 0x2f, 0x3e, 0x6c, 0x7d, 0x32, 0x32, 0x01, 0xc3, 0xe3, 0xb6, 0x57, 0xb1, 0x5c, - 0x4f, 0xb7, 0xea, 0xb4, 0x52, 0x56, 0x86, 0xb0, 0x1c, 0xaa, 0x05, 0x2b, 0x67, 0x0a, 0x4c, 0x2d, - 0x32, 0x29, 0x45, 0xcb, 0xa8, 0x7f, 0x9d, 0x87, 0x11, 0xd6, 0x27, 0xd2, 0xf0, 0x29, 0xb1, 0x99, - 0x80, 0x41, 0x58, 0x2d, 0x6e, 0x4b, 0xaf, 0x53, 0x31, 0x92, 0xf0, 0x2b, 0x2c, 0x1f, 0x28, 0xf1, - 0x8c, 0xd3, 0x93, 0x2b, 0xd0, 0xcf, 0x41, 0x95, 0xb2, 0x18, 0x5c, 0xc3, 0x5b, 0x9b, 0xc5, 0x01, - 0x17, 0x61, 0x35, 0xd3, 0xd0, 0x02, 0x34, 0xd3, 0x6e, 0xfe, 0xf7, 0xb4, 0xed, 0x7a, 0x8c, 0xb9, - 0x18, 0x5b, 0xf8, 0x19, 0xa2, 0xc0, 0xaa, 0x40, 0xc9, 0xda, 0x1d, 0x2d, 0x44, 0x5e, 0x00, 0xe0, - 0x90, 0x92, 0x61, 0x38, 0x62, 0x80, 0x3d, 0xb4, 0xb5, 0x59, 0x3c, 0x2d, 0x58, 0xe8, 0x86, 0x21, - 0x8f, 0x4e, 0x89, 0x98, 0x34, 0x61, 0x88, 0xff, 0x9a, 0xd1, 0x97, 0x68, 0x83, 0x8f, 0xae, 0xc1, - 0xeb, 0x97, 0xfd, 0x4e, 0x8c, 0x4a, 0xe7, 0xaa, 0x4c, 0x3a, 0x69, 0x79, 0xce, 0xc6, 0x78, 0x51, - 0x4c, 0xc8, 0x67, 0x45, 0x55, 0x0d, 0xc4, 0xc9, 0x53, 0x81, 0x5c, 0x86, 0xcd, 0xd3, 0x53, 0xb6, - 0xb3, 0xae, 0x3b, 0x06, 0x35, 0xc6, 0x37, 0xe4, 0x79, 0x7a, 0xd9, 0x07, 0xd7, 0x96, 0x64, 0xd5, - 0x93, 0xc9, 0x59, 0xa7, 0x73, 0x6e, 0xd5, 0xf6, 0x12, 0xaa, 0x5c, 0x5f, 0x42, 0x5a, 0x6e, 0x7b, - 0x29, 0xae, 0x66, 0xd1, 0x32, 0x6c, 0x2a, 0xe0, 0x80, 0x3b, 0xd4, 0x61, 0x93, 0x38, 0x8e, 0x3a, - 0x31, 0x15, 0x08, 0x26, 0xf7, 0x38, 0x26, 0xc9, 0x43, 0x14, 0x39, 0xf7, 0x2a, 0x8c, 0x25, 0x44, - 0x41, 0x46, 0x21, 0xb7, 0x46, 0x37, 0xb8, 0xba, 0x68, 0xec, 0x4f, 0x72, 0x0a, 0x7a, 0xef, 0xe9, - 0x8d, 0xb6, 0x58, 0x42, 0x35, 0xfe, 0xe3, 0xc5, 0xec, 0x87, 0x32, 0x6c, 0xc5, 0x21, 0x13, 0xb6, - 0x65, 0xd1, 0xba, 0x27, 0x2f, 0x3a, 0xcf, 0xc1, 0xc0, 0x8c, 0x5d, 0xd7, 0x1b, 0xd8, 0x8f, 0x5c, - 0xef, 0x94, 0xad, 0xcd, 0xe2, 0x29, 0xd6, 0x81, 0x57, 0x1b, 0x0c, 0x23, 0xb5, 0x29, 0x24, 0x65, - 0x0a, 0xa0, 0xd1, 0xa6, 0xed, 0x51, 0x2c, 0x98, 0x0d, 0x15, 0x00, 0x0b, 0x3a, 0x88, 0x92, 0x15, - 0x20, 0x24, 0x26, 0xd7, 0xa0, 0x7f, 0x81, 0xad, 0xb3, 0x75, 0xbb, 0x21, 0x94, 0x0f, 0x97, 0x02, - 0x5c, 0x7b, 0xe5, 0xb1, 0xea, 0x13, 0xa9, 0xd3, 0x30, 0x32, 0xd1, 0x30, 0xa9, 0xe5, 0xc9, 0xad, - 0x66, 0x23, 0xb9, 0xb4, 0x42, 0x2d, 0x4f, 0x6e, 0x35, 0x8e, 0x79, 0x9d, 0x41, 0xe5, 0x56, 0x07, - 0xa4, 0xea, 0xff, 0x9b, 0x83, 0x87, 0x6e, 0xb5, 0x97, 0xa8, 0x63, 0x51, 0x8f, 0xba, 0x62, 0x41, - 0x0e, 0xb8, 0xce, 0xc1, 0x58, 0x02, 0x29, 0xb8, 0xe3, 0x42, 0xb9, 0x16, 0x20, 0x6b, 0x62, 0x8d, - 0x97, 0x67, 0xdb, 0x44, 0x51, 0x32, 0x0d, 0x27, 0x42, 0x20, 0x6b, 0x84, 0xab, 0x64, 0x71, 0x29, - 0xb9, 0xb8, 0xb5, 0x59, 0x3c, 0x27, 0x71, 0x63, 0xcd, 0x96, 0x35, 0x38, 0x5e, 0x8c, 0xdc, 0x82, - 0xd1, 0x10, 0x74, 0xd3, 0xb1, 0xdb, 0x2d, 0x57, 0xc9, 0x21, 0xab, 0xe2, 0xd6, 0x66, 0xf1, 0x61, - 0x89, 0xd5, 0x0a, 0x22, 0xe5, 0x05, 0x3c, 0x5e, 0x90, 0x7c, 0x7f, 0x46, 0xe6, 0x26, 0x46, 0x61, - 0x1e, 0x47, 0xe1, 0xf3, 0xfe, 0x28, 0xec, 0x28, 0xa4, 0xab, 0xf1, 0x92, 0x62, 0x50, 0xc6, 0x9a, - 0x91, 0x18, 0x94, 0x89, 0x1a, 0xcf, 0x4d, 0xc0, 0xe9, 0x54, 0x5e, 0xbb, 0xd2, 0xea, 0xbf, 0xcc, - 0xc9, 0x5c, 0x16, 0x6c, 0x23, 0xe8, 0xcc, 0x79, 0xb9, 0x33, 0x17, 0x6c, 0x03, 0xa7, 0xfa, 0x4c, - 0xb8, 0x76, 0x4a, 0x8d, 0x6d, 0xd9, 0x46, 0x7c, 0xd6, 0x4f, 0x96, 0x25, 0x9f, 0x84, 0x33, 0x09, - 0x20, 0x9f, 0xae, 0xb9, 0xf6, 0x5f, 0xda, 0xda, 0x2c, 0xaa, 0x29, 0x5c, 0xe3, 0xb3, 0x77, 0x07, - 0x2e, 0x44, 0x87, 0xb3, 0x92, 0xd4, 0x6d, 0xcb, 0xd3, 0x4d, 0x4b, 0x18, 0x97, 0x7c, 0x94, 0xbc, - 0x7f, 0x6b, 0xb3, 0xf8, 0x98, 0xac, 0x83, 0x3e, 0x4d, 0xbc, 0xf1, 0x9d, 0xf8, 0x10, 0x03, 0x94, - 0x14, 0x54, 0xa5, 0xa9, 0xaf, 0xf8, 0x16, 0xf3, 0xe5, 0xad, 0xcd, 0xe2, 0xfb, 0x52, 0xeb, 0x30, - 0x19, 0x95, 0xbc, 0x42, 0x77, 0xe2, 0x44, 0x34, 0x20, 0x21, 0x6e, 0xce, 0x36, 0x28, 0x7e, 0x43, - 0x2f, 0xf2, 0x57, 0xb7, 0x36, 0x8b, 0x17, 0x25, 0xfe, 0x96, 0x6d, 0xd0, 0x78, 0xf3, 0x53, 0x4a, - 0xab, 0xbf, 0x9d, 0x83, 0x8b, 0xd5, 0xd2, 0xec, 0x4c, 0xc5, 0xf0, 0x4d, 0x9a, 0x05, 0xc7, 0xbe, - 0x67, 0x1a, 0xd2, 0xe8, 0x5d, 0x82, 0xb3, 0x31, 0xd4, 0x24, 0x5a, 0x51, 0x81, 0x31, 0x8d, 0xdf, - 0xe6, 0x9b, 0x4b, 0x2d, 0x41, 0x53, 0xe3, 0xa6, 0x56, 0x74, 0xd1, 0xee, 0xc4, 0x88, 0xf5, 0x51, - 0x0c, 0x55, 0x5d, 0xb5, 0x1d, 0xaf, 0xde, 0xf6, 0x84, 0x12, 0x60, 0x1f, 0x25, 0xea, 0x70, 0x05, - 0x51, 0x97, 0x2a, 0x7c, 0x3e, 0xe4, 0xb3, 0x19, 0x18, 0x2d, 0x79, 0x9e, 0x63, 0x2e, 0xb5, 0x3d, - 0x3a, 0xab, 0xb7, 0x5a, 0xa6, 0xb5, 0x82, 0x63, 0x7d, 0xf0, 0xfa, 0xcb, 0xc1, 0x1a, 0xd9, 0x55, - 0x12, 0x57, 0xe3, 0xc5, 0xa5, 0x21, 0xaa, 0xfb, 0xa8, 0x5a, 0x93, 0xe3, 0xe4, 0x21, 0x1a, 0x2f, - 0xc7, 0x86, 0x68, 0x2a, 0xaf, 0x5d, 0x0d, 0xd1, 0x2f, 0xe5, 0xe0, 0xfc, 0xfc, 0x9a, 0xa7, 0x6b, - 0xd4, 0xb5, 0xdb, 0x4e, 0x9d, 0xba, 0xb7, 0x5b, 0x86, 0xee, 0xd1, 0x70, 0xa4, 0x16, 0xa1, 0xb7, - 0x64, 0x18, 0xd4, 0x40, 0x76, 0xbd, 0x7c, 0xdb, 0xa7, 0x33, 0x80, 0xc6, 0xe1, 0xe4, 0x71, 0xe8, - 0x13, 0x65, 0x90, 0x7b, 0xef, 0xf8, 0xe0, 0xd6, 0x66, 0xb1, 0xaf, 0xcd, 0x41, 0x9a, 0x8f, 0x63, - 0x64, 0x65, 0xda, 0xa0, 0x8c, 0x2c, 0x17, 0x92, 0x19, 0x1c, 0xa4, 0xf9, 0x38, 0xf2, 0x06, 0x8c, - 0x20, 0xdb, 0xa0, 0x3d, 0x62, 0xee, 0x3b, 0xe5, 0x4b, 0x57, 0x6e, 0x2c, 0x5f, 0x9a, 0xb0, 0x35, - 0x35, 0xc7, 0x2f, 0xa0, 0xc5, 0x18, 0x90, 0xbb, 0x30, 0x2a, 0x1a, 0x11, 0x32, 0xed, 0xed, 0xc2, - 0xf4, 0xf4, 0xd6, 0x66, 0x71, 0x4c, 0xb4, 0x5f, 0x62, 0x9b, 0x60, 0xc2, 0x18, 0x8b, 0x66, 0x87, - 0x8c, 0x0b, 0xdb, 0x31, 0x16, 0x5f, 0x2c, 0x33, 0x8e, 0x33, 0x51, 0xdf, 0x84, 0x21, 0xb9, 0x20, - 0x39, 0x83, 0x5b, 0x6b, 0x3e, 0x4e, 0x70, 0x53, 0x6e, 0x1a, 0xb8, 0x9f, 0x7e, 0x1a, 0x06, 0xcb, - 0xd4, 0xad, 0x3b, 0x66, 0x8b, 0x59, 0x0d, 0x42, 0xc9, 0x4f, 0x6c, 0x6d, 0x16, 0x07, 0x8d, 0x10, - 0xac, 0xc9, 0x34, 0xea, 0xbf, 0xce, 0xc0, 0x19, 0xc6, 0xbb, 0xe4, 0xba, 0xe6, 0x8a, 0xd5, 0x94, - 0x97, 0xed, 0x27, 0xa1, 0x50, 0xc5, 0xfa, 0x44, 0x4d, 0xa7, 0xb6, 0x36, 0x8b, 0xa3, 0xbc, 0x05, - 0x92, 0x1e, 0x0a, 0x9a, 0x60, 0x5f, 0x99, 0xdd, 0x66, 0x5f, 0xc9, 0x4c, 0x5a, 0x4f, 0x77, 0x3c, - 0xd3, 0x5a, 0xa9, 0x7a, 0xba, 0xd7, 0x76, 0x23, 0x26, 0xad, 0xc0, 0xd4, 0x5c, 0x44, 0x45, 0x4c, - 0xda, 0x48, 0x21, 0xf2, 0x2a, 0x0c, 0x4d, 0x5a, 0x46, 0xc8, 0x84, 0x4f, 0x88, 0x0f, 0x33, 0x4b, - 0x93, 0x22, 0x3c, 0xc9, 0x22, 0x52, 0x40, 0xfd, 0x1f, 0x33, 0xa0, 0xf0, 0x4d, 0xe0, 0x8c, 0xe9, - 0x7a, 0xb3, 0xb4, 0xb9, 0x24, 0xcd, 0x4e, 0x53, 0xfe, 0xae, 0x92, 0xe1, 0xa4, 0xb5, 0x08, 0x4d, - 0x01, 0xb1, 0xab, 0x6c, 0x98, 0x6e, 0x62, 0xfb, 0x11, 0x2b, 0x45, 0x2a, 0xd0, 0xc7, 0x39, 0x73, - 0x5b, 0x62, 0xf0, 0xba, 0xe2, 0x2b, 0x42, 0xbc, 0x6a, 0xae, 0x0c, 0x4d, 0x4e, 0x2c, 0x6f, 0x68, - 0x44, 0x79, 0xf5, 0x7f, 0xca, 0xc2, 0x68, 0xbc, 0x10, 0xb9, 0x0b, 0xfd, 0xaf, 0xdb, 0xa6, 0x45, - 0x8d, 0x79, 0x0b, 0x5b, 0xd8, 0xfd, 0x70, 0xc4, 0xb7, 0xc5, 0x4f, 0xbe, 0x85, 0x65, 0x6a, 0xb2, - 0x05, 0x8b, 0x67, 0x25, 0x01, 0x33, 0xf2, 0x51, 0x18, 0x60, 0x36, 0xe0, 0x3d, 0xe4, 0x9c, 0xdd, - 0x96, 0xf3, 0x23, 0x82, 0xf3, 0x29, 0x87, 0x17, 0x4a, 0xb2, 0x0e, 0xd9, 0x31, 0xbd, 0xd2, 0xa8, - 0xee, 0xda, 0x96, 0xe8, 0x79, 0xd4, 0x2b, 0x07, 0x21, 0xb2, 0x5e, 0x71, 0x1a, 0x66, 0xba, 0xf2, - 0x8f, 0xc5, 0x6e, 0x90, 0xf6, 0x2e, 0x5c, 0x56, 0xf1, 0x1e, 0x90, 0x88, 0xd5, 0x1f, 0xcc, 0xc2, - 0x53, 0xa1, 0xc8, 0x34, 0x7a, 0xcf, 0xa4, 0xeb, 0x42, 0x9c, 0xab, 0x66, 0x4b, 0xec, 0x59, 0x99, - 0xca, 0xbb, 0x13, 0xab, 0xba, 0xb5, 0x42, 0x0d, 0x72, 0x05, 0x7a, 0x35, 0xbb, 0x41, 0x5d, 0x25, - 0x83, 0xe6, 0x1a, 0x4e, 0x27, 0x0e, 0x03, 0xc8, 0x87, 0x1e, 0x48, 0x41, 0x6c, 0x28, 0x2c, 0x3a, - 0xba, 0xe9, 0xf9, 0x3d, 0x5b, 0x4a, 0xf6, 0xec, 0x0e, 0x6a, 0xbc, 0xca, 0x79, 0xf0, 0x39, 0x1f, - 0x05, 0xe1, 0x21, 0x40, 0x16, 0x04, 0x27, 0x39, 0xf7, 0x02, 0x0c, 0x4a, 0xc4, 0xbb, 0x9a, 0xd4, - 0xbf, 0x9a, 0x97, 0x75, 0xdd, 0x6f, 0x96, 0xd0, 0xf5, 0x6b, 0x4c, 0x47, 0x5d, 0x97, 0x59, 0x15, - 0x5c, 0xc9, 0x85, 0x26, 0x22, 0x28, 0xaa, 0x89, 0x08, 0x22, 0xcf, 0x40, 0x3f, 0x67, 0x11, 0xec, - 0x5f, 0x71, 0xef, 0xeb, 0x20, 0x2c, 0xba, 0x34, 0x07, 0x84, 0xe4, 0x97, 0x33, 0x70, 0xa1, 0xab, - 0x24, 0x50, 0x19, 0x06, 0xaf, 0x3f, 0xbb, 0x27, 0x31, 0x8e, 0x3f, 0xb5, 0xb5, 0x59, 0xbc, 0xd2, - 0x0c, 0x48, 0x6a, 0x8e, 0x44, 0x53, 0xab, 0x73, 0x22, 0xa9, 0x5d, 0xdd, 0x9b, 0xc2, 0x8c, 0x47, - 0x5e, 0xe9, 0x14, 0x1e, 0x1d, 0x59, 0xf5, 0x0d, 0xbf, 0x91, 0xf9, 0xd0, 0x78, 0x14, 0xdf, 0xbb, - 0xec, 0x93, 0xa4, 0x54, 0xd3, 0x81, 0x0b, 0xa9, 0xc3, 0x59, 0x8e, 0x29, 0xeb, 0x1b, 0xf3, 0xcb, - 0xb3, 0xb6, 0xe5, 0xad, 0xfa, 0x15, 0xf4, 0xca, 0x67, 0x2f, 0x58, 0x81, 0xa1, 0x6f, 0xd4, 0xec, - 0xe5, 0x5a, 0x93, 0x51, 0xa5, 0xd4, 0xd1, 0x89, 0x13, 0x9b, 0x68, 0xc5, 0x98, 0xf3, 0xa7, 0xa0, - 0x42, 0x78, 0x32, 0xe6, 0x8f, 0xd3, 0xe4, 0x84, 0x13, 0x2b, 0xa4, 0x56, 0x60, 0x68, 0xc6, 0xae, - 0xaf, 0x05, 0xea, 0xf2, 0x02, 0x14, 0x16, 0x75, 0x67, 0x85, 0x7a, 0x28, 0x8b, 0xc1, 0xeb, 0x63, - 0x57, 0xf9, 0x69, 0x33, 0x23, 0xe2, 0x88, 0xf1, 0x11, 0x31, 0x1b, 0x14, 0x3c, 0xfc, 0xad, 0x89, - 0x02, 0xea, 0x37, 0x7b, 0x61, 0x48, 0x9c, 0x8c, 0xe2, 0x6c, 0x4e, 0x5e, 0x0c, 0xcf, 0x9a, 0xc5, - 0xf4, 0x15, 0x9c, 0x0e, 0x05, 0xa7, 0x5a, 0x43, 0x8c, 0xd9, 0x1f, 0x6d, 0x16, 0x33, 0x5b, 0x9b, - 0xc5, 0x1e, 0xad, 0x5f, 0xda, 0x54, 0x86, 0xeb, 0x8d, 0xb4, 0xc0, 0xca, 0x67, 0x9d, 0xb1, 0xb2, - 0x7c, 0xfd, 0x79, 0x15, 0xfa, 0x44, 0x1b, 0x84, 0xc6, 0x9d, 0x0d, 0xcf, 0x32, 0x22, 0x27, 0xbc, - 0xb1, 0xd2, 0x7e, 0x29, 0xf2, 0x32, 0x14, 0xf8, 0xde, 0x5e, 0x08, 0xe0, 0x4c, 0xfa, 0x59, 0x48, - 0xac, 0xb8, 0x28, 0x43, 0xa6, 0x01, 0xc2, 0x7d, 0x7d, 0x70, 0xa0, 0x2d, 0x38, 0x24, 0x77, 0xfc, - 0x31, 0x2e, 0x52, 0x59, 0xf2, 0x1c, 0x0c, 0x2d, 0x52, 0xa7, 0x69, 0x5a, 0x7a, 0xa3, 0x6a, 0xbe, - 0xed, 0x9f, 0x69, 0xe3, 0xc2, 0xeb, 0x9a, 0x6f, 0xcb, 0x23, 0x37, 0x42, 0x47, 0x3e, 0x91, 0xb6, - 0x6f, 0xee, 0xc3, 0x86, 0x3c, 0xba, 0xed, 0x86, 0x32, 0xd6, 0x9e, 0x94, 0x6d, 0xf4, 0x1b, 0x30, - 0x1c, 0xd9, 0x32, 0x89, 0x43, 0xcb, 0x0b, 0x49, 0xd6, 0xd2, 0xfe, 0x2f, 0xc6, 0x36, 0xca, 0x81, - 0x69, 0x72, 0xc5, 0x32, 0x3d, 0x53, 0x6f, 0x4c, 0xd8, 0xcd, 0xa6, 0x6e, 0x19, 0xca, 0x40, 0xa8, - 0xc9, 0x26, 0xc7, 0xd4, 0xea, 0x1c, 0x25, 0x6b, 0x72, 0xb4, 0x10, 0xdb, 0x96, 0x8b, 0x3e, 0xd4, - 0x68, 0xdd, 0x76, 0x98, 0x2d, 0x80, 0x67, 0x92, 0x62, 0x5b, 0xee, 0x72, 0x5c, 0xcd, 0xf1, 0x91, - 0xb2, 0xb1, 0x1d, 0x2f, 0xf8, 0x7a, 0xbe, 0x7f, 0x70, 0x74, 0x28, 0x7e, 0x8c, 0xac, 0xfe, 0x0f, - 0x39, 0x18, 0x14, 0xa4, 0x6c, 0x29, 0x3d, 0x56, 0xf0, 0xfd, 0x28, 0x78, 0xaa, 0xa2, 0x16, 0x0e, - 0x4a, 0x51, 0xd5, 0xcf, 0x65, 0x83, 0xd9, 0x68, 0xc1, 0x31, 0xad, 0xfd, 0xcd, 0x46, 0x97, 0x00, - 0x26, 0x56, 0xdb, 0xd6, 0x1a, 0xbf, 0x2e, 0xcb, 0x86, 0xd7, 0x65, 0x75, 0x53, 0x93, 0x30, 0xe4, - 0x02, 0xe4, 0xcb, 0x8c, 0x3f, 0xeb, 0x99, 0xa1, 0xf1, 0x81, 0x77, 0x38, 0xa7, 0xcc, 0x53, 0x1a, - 0x82, 0xd9, 0xe6, 0x6a, 0x7c, 0xc3, 0xa3, 0xdc, 0x9c, 0xcd, 0xf1, 0xcd, 0xd5, 0x12, 0x03, 0x68, - 0x1c, 0x4e, 0x6e, 0xc0, 0x58, 0x99, 0x36, 0xf4, 0x8d, 0x59, 0xb3, 0xd1, 0x30, 0x5d, 0x5a, 0xb7, - 0x2d, 0xc3, 0x45, 0x21, 0x8b, 0xea, 0x9a, 0xae, 0x96, 0x24, 0x20, 0x2a, 0x14, 0xe6, 0x97, 0x97, - 0x5d, 0xea, 0xa1, 0xf8, 0x72, 0xe3, 0xc0, 0x26, 0x67, 0x1b, 0x21, 0x9a, 0xc0, 0xa8, 0xbf, 0x96, - 0x61, 0xbb, 0x17, 0x77, 0xcd, 0xb3, 0x5b, 0x81, 0x96, 0xef, 0x4b, 0x24, 0x57, 0x42, 0xbb, 0x22, - 0x8b, 0x5f, 0x7b, 0x42, 0x7c, 0x6d, 0x9f, 0xb0, 0x2d, 0x42, 0x8b, 0x22, 0xf5, 0xab, 0x72, 0xdb, - 0x7c, 0x95, 0xfa, 0x57, 0x59, 0x38, 0x2b, 0x5a, 0x3c, 0xd1, 0x30, 0x5b, 0x4b, 0xb6, 0xee, 0x18, - 0x1a, 0xad, 0x53, 0xf3, 0x1e, 0x3d, 0x9a, 0x03, 0x2f, 0x3a, 0x74, 0xf2, 0xfb, 0x18, 0x3a, 0xd7, - 0x71, 0x23, 0xc8, 0x24, 0x83, 0x07, 0xbe, 0xdc, 0xa8, 0x18, 0xdd, 0xda, 0x2c, 0x0e, 0x19, 0x1c, - 0x8c, 0x47, 0xfe, 0x9a, 0x4c, 0xc4, 0x94, 0x64, 0x86, 0x5a, 0x2b, 0xde, 0x2a, 0x2a, 0x49, 0x2f, - 0x57, 0x92, 0x06, 0x42, 0x34, 0x81, 0x51, 0xff, 0x79, 0x16, 0x4e, 0xc5, 0x45, 0x5e, 0xa5, 0x96, - 0x71, 0x2c, 0xef, 0x77, 0x47, 0xde, 0xdf, 0xce, 0xc1, 0xc3, 0xa2, 0x4c, 0x75, 0x55, 0x77, 0xa8, - 0x51, 0x36, 0x1d, 0x5a, 0xf7, 0x6c, 0x67, 0xe3, 0x08, 0x1b, 0x50, 0x07, 0x27, 0xf6, 0x1b, 0x50, - 0x10, 0xdb, 0x7f, 0xbe, 0xce, 0x8c, 0x04, 0x2d, 0x41, 0x68, 0x62, 0x85, 0xe2, 0x47, 0x07, 0xb1, - 0xce, 0x2a, 0xec, 0xa4, 0xb3, 0x3e, 0x04, 0xc3, 0x81, 0xe8, 0x71, 0x23, 0xda, 0x17, 0x5a, 0x5b, - 0x86, 0x8f, 0xc0, 0xbd, 0xa8, 0x16, 0x25, 0xc4, 0xda, 0x7c, 0x40, 0xa5, 0x8c, 0xd6, 0xd0, 0xb0, - 0xa8, 0x2d, 0x28, 0x67, 0x1a, 0x9a, 0x4c, 0xa4, 0x6e, 0xe6, 0xe1, 0x5c, 0x7a, 0xb7, 0x6b, 0x54, - 0x37, 0x8e, 0x7b, 0xfd, 0xbb, 0xb2, 0xd7, 0xc9, 0xa3, 0x90, 0x5f, 0xd0, 0xbd, 0x55, 0x71, 0xfd, - 0x8e, 0x77, 0xc2, 0xcb, 0x66, 0x83, 0xd6, 0x5a, 0xba, 0xb7, 0xaa, 0x21, 0x4a, 0x9a, 0x33, 0x00, - 0x39, 0xa6, 0xcc, 0x19, 0xd2, 0x62, 0x3f, 0xf8, 0x48, 0xe6, 0x72, 0x3e, 0x75, 0xb1, 0xff, 0x66, - 0xbe, 0xd3, 0xbc, 0x72, 0xd7, 0x31, 0x3d, 0x7a, 0xac, 0x61, 0xc7, 0x1a, 0xb6, 0x4f, 0x0d, 0xfb, - 0x93, 0x2c, 0x0c, 0x07, 0x9b, 0xa6, 0xb7, 0x68, 0xfd, 0x70, 0xd6, 0xaa, 0x70, 0x2b, 0x93, 0xdb, - 0xf7, 0x56, 0x66, 0x3f, 0x0a, 0xa5, 0x06, 0x47, 0x9e, 0xdc, 0x34, 0x40, 0x89, 0xf1, 0x23, 0xcf, - 0xe0, 0xa0, 0xf3, 0x51, 0xe8, 0x9b, 0xd5, 0xef, 0x9b, 0xcd, 0x76, 0x53, 0x58, 0xe9, 0xe8, 0x4e, - 0xd6, 0xd4, 0xef, 0x6b, 0x3e, 0x5c, 0xfd, 0xff, 0x33, 0x30, 0x22, 0x84, 0x2a, 0x98, 0xef, 0x4b, - 0xaa, 0xa1, 0x74, 0xb2, 0xfb, 0x96, 0x4e, 0x6e, 0xef, 0xd2, 0x51, 0x7f, 0x3a, 0x07, 0xca, 0x94, - 0xd9, 0xa0, 0x8b, 0x8e, 0x6e, 0xb9, 0xcb, 0xd4, 0x11, 0xdb, 0xe9, 0x49, 0xc6, 0x6a, 0x5f, 0x1f, - 0x28, 0x4d, 0x29, 0xd9, 0x3d, 0x4d, 0x29, 0x1f, 0x80, 0x01, 0xd1, 0x98, 0xc0, 0x95, 0x11, 0x47, - 0x8d, 0xe3, 0x03, 0xb5, 0x10, 0xcf, 0x88, 0x4b, 0xad, 0x96, 0x63, 0xdf, 0xa3, 0x0e, 0xbf, 0xa5, - 0x12, 0xc4, 0xba, 0x0f, 0xd4, 0x42, 0xbc, 0xc4, 0x99, 0xfa, 0xf6, 0xa2, 0xcc, 0x99, 0x3a, 0x5a, - 0x88, 0x27, 0x97, 0xa1, 0x7f, 0xc6, 0xae, 0xeb, 0x28, 0x68, 0x3e, 0xad, 0x0c, 0x6d, 0x6d, 0x16, - 0xfb, 0x1b, 0x02, 0xa6, 0x05, 0x58, 0x46, 0x59, 0xb6, 0xd7, 0xad, 0x86, 0xad, 0x73, 0xe7, 0x97, - 0x7e, 0x4e, 0x69, 0x08, 0x98, 0x16, 0x60, 0x19, 0x25, 0x93, 0x39, 0x3a, 0x15, 0xf5, 0x87, 0x3c, - 0x97, 0x05, 0x4c, 0x0b, 0xb0, 0xea, 0xaf, 0xe5, 0x99, 0xf6, 0xba, 0xe6, 0xdb, 0x0f, 0xfc, 0xba, - 0x10, 0x0e, 0x98, 0xde, 0x3d, 0x0c, 0x98, 0x07, 0xe6, 0xc0, 0x4e, 0xfd, 0xeb, 0x3e, 0x00, 0x21, - 0xfd, 0xc9, 0xe3, 0xcd, 0xe1, 0xfe, 0xb4, 0xa6, 0x0c, 0x63, 0x93, 0xd6, 0xaa, 0x6e, 0xd5, 0xa9, - 0x11, 0x1e, 0x5b, 0x16, 0x70, 0x68, 0xa3, 0x13, 0x24, 0x15, 0xc8, 0xf0, 0xdc, 0x52, 0x4b, 0x16, - 0x20, 0x4f, 0xc3, 0x60, 0xc5, 0xf2, 0xa8, 0xa3, 0xd7, 0x3d, 0xf3, 0x1e, 0x15, 0x53, 0x03, 0xde, - 0x0c, 0x9b, 0x21, 0x58, 0x93, 0x69, 0xc8, 0x0d, 0x18, 0x5a, 0xd0, 0x1d, 0xcf, 0xac, 0x9b, 0x2d, - 0xdd, 0xf2, 0x5c, 0xa5, 0x1f, 0x67, 0x34, 0xb4, 0x30, 0x5a, 0x12, 0x5c, 0x8b, 0x50, 0x91, 0x4f, - 0xc0, 0x00, 0x6e, 0x4d, 0xd1, 0x5f, 0x7b, 0x60, 0xdb, 0x8b, 0xc3, 0xc7, 0x42, 0xf7, 0x40, 0x7e, - 0xfa, 0x8a, 0x37, 0xc0, 0xf1, 0xbb, 0xc3, 0x80, 0x23, 0xf9, 0x08, 0xf4, 0x4d, 0x5a, 0x06, 0x32, - 0x87, 0x6d, 0x99, 0xab, 0x82, 0xf9, 0x99, 0x90, 0xb9, 0xdd, 0x8a, 0xf1, 0xf6, 0xd9, 0xa5, 0x8f, - 0xb2, 0xc1, 0x77, 0x6f, 0x94, 0x0d, 0xbd, 0x0b, 0xc7, 0xe2, 0xc3, 0x07, 0x75, 0x2c, 0x3e, 0xb2, - 0xc7, 0x63, 0x71, 0xf5, 0x6d, 0x18, 0x1c, 0x5f, 0x98, 0x0a, 0x46, 0xef, 0x43, 0x90, 0x5b, 0x10, - 0x9e, 0x0a, 0x79, 0x6e, 0xcf, 0xb4, 0x4c, 0x43, 0x63, 0x30, 0x72, 0x05, 0xfa, 0x27, 0xd0, 0xfd, - 0x4d, 0xdc, 0x22, 0xe6, 0xf9, 0xfa, 0x57, 0x47, 0x18, 0x7a, 0xc1, 0xfa, 0x68, 0xf2, 0x38, 0xf4, - 0x2d, 0x38, 0xf6, 0x8a, 0xa3, 0x37, 0xc5, 0x1a, 0x8c, 0xae, 0x22, 0x2d, 0x0e, 0xd2, 0x7c, 0x9c, - 0xfa, 0xa3, 0x19, 0xdf, 0x6c, 0x67, 0x25, 0xaa, 0x6d, 0x3c, 0x9a, 0xc7, 0xba, 0xfb, 0x79, 0x09, - 0x97, 0x83, 0x34, 0x1f, 0x47, 0xae, 0x40, 0xef, 0xa4, 0xe3, 0xd8, 0x8e, 0xec, 0xe3, 0x4e, 0x19, - 0x40, 0xbe, 0xee, 0x45, 0x0a, 0xf2, 0x3c, 0x0c, 0xf2, 0x39, 0x87, 0x9f, 0x68, 0xe6, 0xba, 0xdd, - 0x94, 0xca, 0x94, 0xea, 0xd7, 0x73, 0x92, 0xcd, 0xc6, 0x25, 0xfe, 0x00, 0xde, 0x0a, 0x3c, 0x03, - 0xb9, 0xf1, 0x85, 0x29, 0x31, 0x01, 0x9e, 0xf4, 0x8b, 0x4a, 0xaa, 0x12, 0x2b, 0xc7, 0xa8, 0xc9, - 0x79, 0xc8, 0x2f, 0x30, 0xf5, 0x29, 0xa0, 0x7a, 0xf4, 0x6f, 0x6d, 0x16, 0xf3, 0x2d, 0xa6, 0x3f, - 0x08, 0x45, 0x2c, 0xdb, 0xcc, 0xf0, 0x1d, 0x13, 0xc7, 0x86, 0xfb, 0x98, 0xf3, 0x90, 0x2f, 0x39, - 0x2b, 0xf7, 0xc4, 0xac, 0x85, 0x58, 0xdd, 0x59, 0xb9, 0xa7, 0x21, 0x94, 0x5c, 0x03, 0xd0, 0xa8, - 0xd7, 0x76, 0x2c, 0x7c, 0x7e, 0x32, 0x80, 0xe7, 0x6f, 0x38, 0x1b, 0x3a, 0x08, 0xad, 0xd5, 0x6d, - 0x83, 0x6a, 0x12, 0x89, 0xfa, 0x8b, 0xe1, 0xc5, 0x4e, 0xd9, 0x74, 0xd7, 0x8e, 0xbb, 0x70, 0x17, - 0x5d, 0xa8, 0x8b, 0x23, 0xce, 0x64, 0x27, 0x15, 0xa1, 0x77, 0xaa, 0xa1, 0xaf, 0xb8, 0xd8, 0x87, - 0xc2, 0x97, 0x6c, 0x99, 0x01, 0x34, 0x0e, 0x8f, 0xf5, 0x53, 0xff, 0xf6, 0xfd, 0xf4, 0xe5, 0xde, - 0x60, 0xb4, 0xcd, 0x51, 0x6f, 0xdd, 0x76, 0x8e, 0xbb, 0x6a, 0xa7, 0x5d, 0x75, 0x09, 0xfa, 0xaa, - 0x4e, 0x5d, 0x3a, 0xba, 0xc0, 0xfd, 0x80, 0xeb, 0xd4, 0xf9, 0xb1, 0x85, 0x8f, 0x64, 0x74, 0x65, - 0xd7, 0x43, 0xba, 0xbe, 0x90, 0xce, 0x70, 0x3d, 0x41, 0x27, 0x90, 0x82, 0x6e, 0xc1, 0x76, 0x3c, - 0xd1, 0x71, 0x01, 0x5d, 0xcb, 0x76, 0x3c, 0xcd, 0x47, 0x92, 0x0f, 0x00, 0x2c, 0x4e, 0x2c, 0xf8, - 0xce, 0xf6, 0x03, 0xa1, 0x2f, 0xa0, 0xf0, 0xb2, 0xd7, 0x24, 0x34, 0x59, 0x84, 0x81, 0xf9, 0x16, - 0x75, 0xf8, 0x56, 0x88, 0x3f, 0x28, 0x79, 0x7f, 0x4c, 0xb4, 0xa2, 0xdf, 0xaf, 0x8a, 0xff, 0x03, - 0x72, 0xbe, 0xbe, 0xd8, 0xfe, 0x4f, 0x2d, 0x64, 0x44, 0x9e, 0x87, 0x42, 0x89, 0xdb, 0x79, 0x83, - 0xc8, 0x32, 0x10, 0x19, 0x6e, 0x41, 0x39, 0x8a, 0xef, 0xd9, 0x75, 0xfc, 0x5b, 0x13, 0xe4, 0xea, - 0x15, 0x18, 0x8d, 0x57, 0x43, 0x06, 0xa1, 0x6f, 0x62, 0x7e, 0x6e, 0x6e, 0x72, 0x62, 0x71, 0xb4, - 0x87, 0xf4, 0x43, 0xbe, 0x3a, 0x39, 0x57, 0x1e, 0xcd, 0xa8, 0xbf, 0x22, 0xcd, 0x20, 0x4c, 0xb5, - 0x8e, 0xaf, 0x86, 0xf7, 0x75, 0xdf, 0x32, 0x8a, 0xf7, 0xa1, 0x78, 0x62, 0xd0, 0x34, 0x3d, 0x8f, - 0x1a, 0x62, 0x95, 0xc0, 0xfb, 0x42, 0xef, 0xbe, 0x96, 0xc0, 0x93, 0x27, 0x61, 0x18, 0x61, 0xe2, - 0x8a, 0x90, 0xef, 0x8f, 0x45, 0x01, 0xe7, 0xbe, 0x16, 0x45, 0xaa, 0xdf, 0x08, 0x6f, 0x87, 0x67, - 0xa8, 0x7e, 0x54, 0x6f, 0x14, 0xdf, 0x23, 0xfd, 0xa5, 0xfe, 0x6d, 0x9e, 0x3f, 0x01, 0xe1, 0xef, - 0x05, 0x0f, 0x43, 0x94, 0xe1, 0x91, 0x6e, 0x6e, 0x17, 0x47, 0xba, 0x4f, 0x42, 0x61, 0x96, 0x7a, - 0xab, 0xb6, 0xef, 0xf8, 0x85, 0x1e, 0x7a, 0x4d, 0x84, 0xc8, 0x1e, 0x7a, 0x9c, 0x86, 0xac, 0x01, - 0xf1, 0x1f, 0x03, 0x06, 0x8e, 0xd8, 0xfe, 0x11, 0xf2, 0xd9, 0xc4, 0x3e, 0xa5, 0x8a, 0x2f, 0x81, - 0xd1, 0xc7, 0xfe, 0x54, 0xe0, 0xe8, 0x2d, 0x79, 0x62, 0xfd, 0xcd, 0x66, 0xb1, 0xc0, 0x69, 0xb4, - 0x14, 0xb6, 0xe4, 0x0d, 0x18, 0x98, 0x9d, 0x2a, 0x89, 0x87, 0x81, 0xdc, 0x2b, 0xe2, 0xa1, 0x40, - 0x8a, 0x3e, 0x22, 0x10, 0x09, 0xbe, 0xb7, 0x69, 0x2e, 0xeb, 0xc9, 0x77, 0x81, 0x21, 0x17, 0xa6, - 0x2d, 0xfc, 0xe5, 0x8e, 0x38, 0x5d, 0x08, 0xb4, 0x25, 0xfa, 0x9e, 0x27, 0x2e, 0x2b, 0x8e, 0x8d, - 0x69, 0x4b, 0xff, 0x3e, 0x46, 0xf7, 0x3c, 0x8c, 0x95, 0x5a, 0xad, 0x86, 0x49, 0x0d, 0xd4, 0x17, - 0xad, 0xdd, 0xa0, 0xae, 0x70, 0xf9, 0xc1, 0xc7, 0x20, 0x3a, 0x47, 0xd6, 0xf0, 0x39, 0x6a, 0xcd, - 0x69, 0x47, 0xfd, 0x33, 0x93, 0x65, 0xd5, 0x1f, 0xcf, 0xc2, 0x99, 0x09, 0x87, 0xea, 0x1e, 0x9d, - 0x9d, 0x2a, 0x95, 0xda, 0xe8, 0x23, 0xd7, 0x68, 0x50, 0x6b, 0xe5, 0x70, 0x86, 0xf5, 0x4b, 0x30, - 0x12, 0x34, 0xa0, 0x5a, 0xb7, 0x5b, 0x54, 0x7e, 0x58, 0x55, 0xf7, 0x31, 0x35, 0x97, 0xa1, 0xb4, - 0x18, 0x29, 0xb9, 0x05, 0x27, 0x03, 0x48, 0xa9, 0xd1, 0xb0, 0xd7, 0x35, 0xda, 0x76, 0xb9, 0x63, - 0x6c, 0x3f, 0x77, 0x8c, 0x0d, 0x39, 0xe8, 0x0c, 0x5f, 0x73, 0x18, 0x81, 0x96, 0x56, 0x4a, 0xfd, - 0x4a, 0x0e, 0xce, 0xde, 0xd1, 0x1b, 0xa6, 0x11, 0x8a, 0x46, 0xa3, 0x6e, 0xcb, 0xb6, 0x5c, 0x7a, - 0x84, 0x46, 0x69, 0x64, 0x28, 0xe4, 0x0f, 0x64, 0x28, 0x24, 0xbb, 0xa8, 0x77, 0xdf, 0x5d, 0x54, - 0xd8, 0x53, 0x17, 0xfd, 0xb3, 0x0c, 0x8c, 0xfa, 0x8e, 0xff, 0xf2, 0x23, 0x6e, 0xc9, 0x2b, 0x1d, - 0x8f, 0x10, 0x63, 0x7e, 0xd0, 0x88, 0x27, 0x55, 0xe8, 0x9b, 0xbc, 0xdf, 0x32, 0x1d, 0xea, 0xee, - 0xc0, 0x89, 0xfb, 0x82, 0x38, 0x2e, 0x19, 0xa3, 0xbc, 0x48, 0xe2, 0xa4, 0x84, 0x83, 0xf1, 0x39, - 0x1f, 0x7f, 0xfa, 0x30, 0xee, 0xbf, 0x4c, 0xe7, 0xcf, 0xf9, 0xc4, 0x13, 0x89, 0xc8, 0xfb, 0xcc, - 0x90, 0x94, 0x3c, 0x06, 0xb9, 0xc5, 0xc5, 0x19, 0x31, 0x93, 0x62, 0x44, 0x00, 0xcf, 0x93, 0xdf, - 0x2b, 0x32, 0xac, 0xfa, 0xe7, 0x59, 0x00, 0xa6, 0x0a, 0x7c, 0xb8, 0x1e, 0x8a, 0x12, 0x8e, 0x43, - 0xbf, 0x2f, 0x70, 0xa1, 0x86, 0x81, 0xd7, 0x7e, 0xbc, 0x23, 0xe2, 0x75, 0x07, 0x2f, 0x34, 0x8a, - 0xbe, 0x23, 0x39, 0xbf, 0x07, 0xc0, 0x9d, 0x0d, 0x3a, 0x92, 0xfb, 0xee, 0xe3, 0x1f, 0x80, 0x01, - 0x31, 0xe3, 0xd9, 0x91, 0xf3, 0xff, 0xba, 0x0f, 0xd4, 0x42, 0x7c, 0x6c, 0x6a, 0x2d, 0xec, 0x63, - 0x21, 0xf6, 0xc5, 0xcb, 0x7b, 0xe5, 0x58, 0xbc, 0x07, 0x2c, 0xde, 0x2f, 0x08, 0xf1, 0xf2, 0x17, - 0x3c, 0x47, 0x56, 0xbc, 0x07, 0x76, 0xf6, 0xad, 0xfe, 0x49, 0x06, 0x08, 0x6b, 0xd6, 0x82, 0xee, - 0xba, 0xeb, 0xb6, 0x63, 0x70, 0xe7, 0xf4, 0x43, 0x11, 0xcc, 0xc1, 0xdd, 0x57, 0x7e, 0xbd, 0x1f, - 0x4e, 0x46, 0x1c, 0x7f, 0x8f, 0xf8, 0x64, 0x75, 0x25, 0x3a, 0x9a, 0xba, 0xbd, 0x7a, 0x79, 0x9f, - 0x7c, 0x21, 0xda, 0x1b, 0x79, 0x80, 0x26, 0xdd, 0x84, 0x3e, 0x05, 0x43, 0xe2, 0x07, 0x5b, 0xa1, - 0xfd, 0x9b, 0x2e, 0x1c, 0xa5, 0x2e, 0x03, 0x68, 0x11, 0x34, 0x79, 0x16, 0x06, 0xd8, 0x80, 0x59, - 0xc1, 0xe0, 0x21, 0x7d, 0xe1, 0x8b, 0x12, 0xc3, 0x07, 0xca, 0xeb, 0x49, 0x40, 0x29, 0xbd, 0x23, - 0xea, 0xdf, 0xc1, 0x3b, 0xa2, 0x4f, 0xc2, 0x60, 0xc9, 0xb2, 0x6c, 0x0f, 0x37, 0xe9, 0xae, 0xb8, - 0x9a, 0xe8, 0x68, 0x95, 0x3f, 0x86, 0x8f, 0xe3, 0x43, 0xfa, 0x54, 0xb3, 0x5c, 0x66, 0x48, 0xae, - 0xfb, 0xaf, 0x62, 0xa8, 0x23, 0xbc, 0xca, 0xf1, 0x7a, 0xc6, 0x11, 0xb0, 0xe4, 0xa3, 0x18, 0xec, - 0xbc, 0xe1, 0x05, 0xc7, 0x6e, 0xd9, 0x2e, 0x35, 0xb8, 0xa0, 0x06, 0xc3, 0x50, 0x03, 0x2d, 0x81, - 0xc0, 0x77, 0x6c, 0x91, 0x40, 0x1e, 0x91, 0x22, 0x64, 0x19, 0x4e, 0xf9, 0x17, 0xc5, 0xc1, 0x8b, - 0xc1, 0x4a, 0xd9, 0x55, 0x86, 0xf0, 0x55, 0x12, 0x89, 0x2b, 0x43, 0xa5, 0x3c, 0x7e, 0xd1, 0xbf, - 0x16, 0xf1, 0x9f, 0x1c, 0xd6, 0x4c, 0x43, 0xee, 0xea, 0x54, 0x7e, 0xe4, 0x7b, 0x60, 0x70, 0x56, - 0xbf, 0x5f, 0x6e, 0x8b, 0xb3, 0x97, 0xe1, 0x9d, 0xdf, 0xbe, 0x34, 0xf5, 0xfb, 0x35, 0x43, 0x94, - 0x8b, 0xd9, 0x14, 0x32, 0x4b, 0x52, 0x83, 0x33, 0x0b, 0x8e, 0xdd, 0xb4, 0x3d, 0x6a, 0xc4, 0x1e, - 0xdf, 0x9d, 0x08, 0x5f, 0xeb, 0xb6, 0x04, 0x45, 0xad, 0xcb, 0x2b, 0xbc, 0x0e, 0x6c, 0x48, 0x13, - 0x4e, 0x94, 0x5c, 0xb7, 0xdd, 0xa4, 0xe1, 0x0d, 0xd5, 0xe8, 0xb6, 0x9f, 0xf1, 0x7e, 0xe1, 0xb5, - 0xfc, 0xb0, 0x8e, 0x45, 0xf9, 0x05, 0x55, 0xcd, 0x33, 0xe5, 0x1a, 0xf1, 0x5b, 0xe2, 0xbc, 0x5f, - 0xcf, 0xf7, 0x8f, 0x8c, 0x9e, 0xd0, 0xce, 0x26, 0x1b, 0xb3, 0x68, 0x7a, 0x0d, 0xaa, 0x7e, 0x2d, - 0x03, 0x10, 0x0a, 0x98, 0x3c, 0x15, 0x8d, 0x50, 0x94, 0x09, 0x2f, 0x3a, 0x44, 0xf4, 0x82, 0x48, - 0x48, 0x22, 0x72, 0x1e, 0xf2, 0x18, 0xe1, 0x22, 0x1b, 0x1e, 0xac, 0xae, 0x99, 0x96, 0xa1, 0x21, - 0x94, 0x61, 0xa5, 0xa7, 0xe8, 0x88, 0xc5, 0x4b, 0x7d, 0x6e, 0x15, 0x96, 0xe1, 0x44, 0xb5, 0xbd, - 0xe4, 0xd7, 0x2d, 0xbd, 0xab, 0xc3, 0x40, 0x1b, 0x6e, 0x7b, 0x29, 0x78, 0x8c, 0x1a, 0x09, 0x63, - 0x12, 0x2d, 0xa2, 0xfe, 0x5a, 0x26, 0x36, 0x0b, 0x1e, 0xe2, 0xa2, 0xf7, 0xbe, 0xa4, 0x9f, 0x46, - 0x72, 0x5a, 0x52, 0x7f, 0x26, 0x0b, 0x83, 0x0b, 0xb6, 0xe3, 0x89, 0x90, 0x21, 0x47, 0x7b, 0x15, - 0x92, 0xf6, 0x4a, 0xf9, 0x5d, 0xec, 0x95, 0xce, 0x43, 0x5e, 0x72, 0x51, 0xe6, 0xf7, 0x22, 0x86, - 0xe1, 0x68, 0x08, 0x55, 0xbf, 0x37, 0x0b, 0xf0, 0x91, 0xa7, 0x9f, 0x7e, 0x80, 0x05, 0xa4, 0xfe, - 0x54, 0x06, 0x4e, 0x88, 0x8b, 0x3a, 0x29, 0xd6, 0x57, 0x9f, 0x7f, 0xc5, 0x2a, 0x8f, 0x4b, 0x0e, - 0xd2, 0x7c, 0x1c, 0x5b, 0x02, 0x26, 0xef, 0x9b, 0x1e, 0xde, 0x55, 0x48, 0xc1, 0xbe, 0xa8, 0x80, - 0xc9, 0x4b, 0x80, 0x4f, 0x47, 0x9e, 0xf2, 0xaf, 0x20, 0x73, 0xe1, 0xba, 0xc7, 0x0a, 0x4c, 0xa6, - 0x5e, 0x43, 0xaa, 0xbf, 0x99, 0x87, 0xfc, 0xe4, 0x7d, 0x5a, 0x3f, 0xe2, 0x5d, 0x23, 0x1d, 0x6c, - 0xe6, 0xf7, 0x79, 0xb0, 0xb9, 0x17, 0x9f, 0x8a, 0x57, 0xc3, 0xfe, 0x2c, 0x44, 0xab, 0x8f, 0xf5, - 0x7c, 0xbc, 0x7a, 0xbf, 0xa7, 0x8f, 0x9e, 0x4b, 0xce, 0xff, 0x99, 0x83, 0x5c, 0x75, 0x62, 0xe1, - 0x58, 0x6f, 0x0e, 0x55, 0x6f, 0xba, 0xdf, 0x59, 0xab, 0xc1, 0x35, 0x54, 0x7f, 0xe8, 0x25, 0x1a, - 0xbb, 0x71, 0xfa, 0x76, 0x0e, 0x46, 0xaa, 0x53, 0x8b, 0x0b, 0xd2, 0x49, 0xf0, 0x2d, 0xee, 0xc9, - 0x87, 0x3e, 0x65, 0xbc, 0x4b, 0xcf, 0x27, 0xec, 0x99, 0xdb, 0x15, 0xcb, 0x7b, 0xee, 0xc6, 0x1d, - 0xbd, 0xd1, 0xa6, 0x78, 0xf4, 0xc2, 0xfd, 0x7e, 0x5d, 0xf3, 0x6d, 0xfa, 0x15, 0x7c, 0xf8, 0xef, - 0x33, 0x20, 0x2f, 0x41, 0xee, 0xb6, 0xf0, 0xc8, 0xe8, 0xc4, 0xe7, 0x99, 0xeb, 0x9c, 0x0f, 0x9b, - 0x04, 0x73, 0x6d, 0xd3, 0x40, 0x0e, 0xac, 0x14, 0x2b, 0x7c, 0x53, 0x2c, 0xc0, 0x3b, 0x2a, 0xbc, - 0xe2, 0x17, 0xbe, 0x59, 0x29, 0x93, 0x2a, 0x0c, 0x2e, 0x50, 0xa7, 0x69, 0x62, 0x47, 0xf9, 0x73, - 0x76, 0x77, 0x26, 0x6c, 0xa7, 0x32, 0xd8, 0x0a, 0x0b, 0x21, 0x33, 0x99, 0x0b, 0x79, 0x13, 0x80, - 0xdb, 0x28, 0x3b, 0x8c, 0x1f, 0x79, 0x01, 0xed, 0x7e, 0x6e, 0x5a, 0xa6, 0xd8, 0x78, 0x12, 0x33, - 0xb2, 0x06, 0xa3, 0xb3, 0xb6, 0x61, 0x2e, 0x9b, 0xdc, 0xf5, 0x12, 0x2b, 0x28, 0x6c, 0xef, 0xf0, - 0xc4, 0x4c, 0xc9, 0xa6, 0x54, 0x2e, 0xad, 0x9a, 0x04, 0x63, 0xf5, 0x7f, 0xeb, 0x85, 0x3c, 0xeb, - 0xf6, 0xe3, 0xf1, 0xbb, 0x9f, 0xf1, 0x5b, 0x82, 0xd1, 0xbb, 0xb6, 0xb3, 0x66, 0x5a, 0x2b, 0x81, - 0x57, 0xbc, 0xd8, 0x9b, 0xa2, 0x27, 0xcf, 0x3a, 0xc7, 0xd5, 0x02, 0x07, 0x7a, 0x2d, 0x41, 0xbe, - 0xcd, 0x08, 0x7e, 0x01, 0x80, 0xbf, 0x75, 0x47, 0x9a, 0xfe, 0x30, 0x58, 0x05, 0x7f, 0x09, 0x8f, - 0x8e, 0xf6, 0x72, 0xb0, 0x8a, 0x90, 0x98, 0x6d, 0xc2, 0xb9, 0x2f, 0xc4, 0x00, 0xfa, 0xdd, 0xe3, - 0x26, 0x1c, 0x7d, 0x21, 0x64, 0x23, 0x80, 0x7b, 0x45, 0x2c, 0x00, 0x48, 0xf7, 0x4b, 0x10, 0x13, - 0x44, 0x64, 0x72, 0x10, 0xe1, 0xe1, 0x52, 0xae, 0x97, 0x34, 0x89, 0x07, 0x79, 0x2e, 0x76, 0x01, - 0x4e, 0x22, 0xdc, 0x3a, 0xde, 0x7f, 0x87, 0x0e, 0x54, 0x43, 0xdb, 0x39, 0x50, 0xa9, 0x9f, 0xcb, - 0xc2, 0x40, 0xb5, 0xbd, 0xe4, 0x6e, 0xb8, 0x1e, 0x6d, 0x1e, 0x71, 0x35, 0xf6, 0xb7, 0x57, 0xf9, - 0xd4, 0xed, 0xd5, 0x63, 0xbe, 0x50, 0xa4, 0x73, 0xc7, 0xc0, 0xa4, 0xf3, 0xc5, 0xf1, 0x3f, 0x67, - 0x61, 0x94, 0x5f, 0x9c, 0x95, 0x4d, 0xb7, 0x7e, 0x00, 0xce, 0xfc, 0x87, 0x2f, 0x95, 0xfd, 0x5d, - 0x36, 0xef, 0xe0, 0x89, 0x84, 0xfa, 0xe9, 0x2c, 0x0c, 0x96, 0xda, 0xde, 0x6a, 0xc9, 0x43, 0xdd, - 0x7a, 0x20, 0xf7, 0x27, 0x7f, 0x90, 0x81, 0x13, 0xac, 0x21, 0x8b, 0xf6, 0x1a, 0xb5, 0x0e, 0xe0, - 0xe0, 0x51, 0x3e, 0x40, 0xcc, 0xee, 0xf1, 0x00, 0xd1, 0x97, 0x65, 0x6e, 0x77, 0xb2, 0xc4, 0xe3, - 0x72, 0xcd, 0x6e, 0xd0, 0xa3, 0xfd, 0x19, 0x07, 0x78, 0x5c, 0xee, 0x0b, 0xe4, 0x00, 0xae, 0x67, - 0xbe, 0xbb, 0x04, 0x72, 0x00, 0x67, 0x4b, 0xdf, 0x1d, 0x02, 0xf9, 0x7a, 0x06, 0x06, 0xc6, 0x6d, - 0xef, 0x88, 0x0f, 0x7c, 0xf1, 0x15, 0x47, 0x5b, 0xcd, 0xfd, 0xaf, 0x38, 0xda, 0xba, 0xa9, 0xfe, - 0x44, 0x16, 0x4e, 0x89, 0xd8, 0xe0, 0xe2, 0xfc, 0xe1, 0x78, 0x3a, 0x16, 0x83, 0x2d, 0x29, 0x9a, - 0xe3, 0x79, 0x48, 0x88, 0xe6, 0x97, 0x72, 0x70, 0x0a, 0x43, 0x99, 0xb2, 0x6d, 0xd9, 0x77, 0x81, - 0x2d, 0x42, 0xea, 0xd1, 0x4b, 0xd0, 0xd9, 0x94, 0x4b, 0xd0, 0xbf, 0xd9, 0x2c, 0x3e, 0xb7, 0x62, - 0x7a, 0xab, 0xed, 0xa5, 0xab, 0x75, 0xbb, 0x79, 0x6d, 0xc5, 0xd1, 0xef, 0x99, 0xfc, 0xfa, 0x4f, - 0x6f, 0x5c, 0x0b, 0xd2, 0x6c, 0xe8, 0x2d, 0x53, 0x24, 0xe0, 0xa8, 0xe2, 0x5e, 0x87, 0x71, 0xf5, - 0xaf, 0x4f, 0x5d, 0x80, 0xd7, 0x6d, 0xd3, 0x12, 0x3e, 0x85, 0xdc, 0xd0, 0xad, 0xb2, 0xfd, 0xe1, - 0x5b, 0xb6, 0x69, 0xd5, 0xe2, 0x8e, 0x85, 0xbb, 0xad, 0x2f, 0x64, 0xad, 0x49, 0xd5, 0xa8, 0xff, - 0x5f, 0x06, 0x1e, 0x8a, 0x6a, 0xf1, 0x77, 0x83, 0xed, 0xf8, 0x93, 0x59, 0x38, 0x7d, 0x13, 0x85, - 0x13, 0x38, 0x72, 0x1c, 0xcf, 0x5b, 0x62, 0x70, 0xa6, 0xc8, 0xe6, 0xd8, 0xa2, 0xec, 0x2c, 0x9b, - 0xe3, 0x49, 0x5d, 0xc8, 0xe6, 0x0f, 0x33, 0x70, 0x72, 0xbe, 0x52, 0x9e, 0xf8, 0x2e, 0x19, 0x51, - 0xc9, 0xef, 0x39, 0xe2, 0x06, 0x67, 0xe2, 0x7b, 0x8e, 0xb8, 0xe9, 0xf9, 0xa5, 0x2c, 0x9c, 0xac, - 0x96, 0x66, 0x67, 0xbe, 0x5b, 0x66, 0xf0, 0x09, 0xd9, 0xeb, 0xd0, 0x3f, 0x04, 0x13, 0xb6, 0x80, - 0xfc, 0x99, 0x77, 0xae, 0x77, 0xf6, 0x46, 0x4c, 0x0a, 0xe5, 0x88, 0x4f, 0xdd, 0x07, 0x22, 0x14, - 0xa6, 0xf9, 0x11, 0xea, 0x23, 0xae, 0xf9, 0xff, 0x47, 0x01, 0x06, 0x6f, 0xb5, 0x97, 0xa8, 0x70, - 0x4e, 0x79, 0xa0, 0x4f, 0x7e, 0xaf, 0xc3, 0xa0, 0x10, 0x03, 0xde, 0x9a, 0x48, 0xc1, 0xf3, 0x44, - 0x30, 0x14, 0x1e, 0x9f, 0x48, 0x26, 0x22, 0xe7, 0x21, 0x7f, 0x87, 0x3a, 0x4b, 0xf2, 0xbb, 0xd2, - 0x7b, 0xd4, 0x59, 0xd2, 0x10, 0x4a, 0x66, 0x42, 0x97, 0xf9, 0xd2, 0x42, 0x05, 0x13, 0xa9, 0x88, - 0x0b, 0x1b, 0xcc, 0x0c, 0x13, 0xf8, 0xbd, 0xe9, 0x2d, 0x93, 0xa7, 0x60, 0x91, 0xdf, 0xb4, 0xc7, - 0x4b, 0x92, 0x39, 0x18, 0x93, 0x1d, 0x9f, 0x78, 0x16, 0x91, 0xfe, 0x14, 0x76, 0x69, 0xf9, 0x43, - 0x92, 0x45, 0xc9, 0xab, 0x30, 0xe4, 0x03, 0xd1, 0x85, 0x6b, 0x20, 0x0c, 0x5d, 0x1f, 0xb0, 0x8a, - 0xa5, 0x28, 0x8a, 0x14, 0x90, 0x19, 0xe0, 0x35, 0x04, 0xa4, 0x30, 0x88, 0xb9, 0xc4, 0x45, 0x0a, - 0x90, 0x67, 0x91, 0x01, 0x3e, 0xf3, 0x40, 0x67, 0x95, 0x41, 0x7c, 0x74, 0x89, 0x2e, 0xf9, 0x8e, - 0x80, 0xf3, 0xa7, 0xb5, 0x11, 0x32, 0x32, 0x0f, 0x10, 0x3a, 0x15, 0x88, 0x00, 0x06, 0xbb, 0x76, - 0x77, 0x90, 0x58, 0xc8, 0xd7, 0x81, 0xc3, 0x7b, 0xb9, 0x0e, 0x54, 0xff, 0x38, 0x0b, 0x83, 0xa5, - 0x56, 0x2b, 0x18, 0x0a, 0x4f, 0x41, 0xa1, 0xd4, 0x6a, 0xdd, 0xd6, 0x2a, 0x72, 0x28, 0x73, 0xbd, - 0xd5, 0xaa, 0xb5, 0x1d, 0x53, 0xf6, 0x09, 0xe5, 0x44, 0x64, 0x02, 0x86, 0x4b, 0xad, 0xd6, 0x42, - 0x7b, 0xa9, 0x61, 0xd6, 0xa5, 0xcc, 0x48, 0x3c, 0x77, 0x5c, 0xab, 0x55, 0x6b, 0x21, 0x26, 0x9e, - 0x1e, 0x2b, 0x5a, 0x86, 0x7c, 0x12, 0xc3, 0xfe, 0x88, 0xc4, 0x3c, 0x3c, 0xf5, 0x87, 0x1a, 0x04, - 0x31, 0x0f, 0xdb, 0x76, 0x35, 0x20, 0xe2, 0xc1, 0xde, 0xcf, 0xfb, 0x21, 0xf3, 0x59, 0x45, 0x89, - 0x04, 0x3c, 0x21, 0x4b, 0xf2, 0x41, 0xe8, 0x2b, 0xb5, 0x5a, 0xd2, 0x7d, 0x13, 0x3a, 0x15, 0xb1, - 0x52, 0xf1, 0xdc, 0x67, 0x82, 0xec, 0xdc, 0xcb, 0x30, 0x12, 0xad, 0x6c, 0x57, 0xc1, 0xe2, 0xbf, - 0x93, 0xc1, 0x0f, 0x3a, 0xe2, 0x3e, 0xcd, 0xcf, 0x40, 0xae, 0xd4, 0x6a, 0x89, 0xf9, 0xe8, 0x64, - 0x4a, 0x7f, 0xc4, 0x9f, 0x40, 0x97, 0x5a, 0x2d, 0xff, 0xd3, 0x8f, 0xf8, 0xe3, 0x88, 0x3d, 0x7d, - 0xfa, 0xd7, 0xf9, 0xa7, 0x1f, 0xed, 0x87, 0x0b, 0xea, 0x6f, 0xe6, 0xe0, 0x44, 0xa9, 0xd5, 0x3a, - 0x0e, 0x32, 0x7f, 0x50, 0x0f, 0xad, 0x9f, 0x06, 0x90, 0xa6, 0xc7, 0xbe, 0xe0, 0xe9, 0xd6, 0xa0, - 0x34, 0x35, 0x2a, 0x19, 0x4d, 0x22, 0xf2, 0xd5, 0xaf, 0x7f, 0x57, 0xea, 0xf7, 0xe9, 0x1c, 0x4e, - 0xc5, 0x47, 0x3d, 0x68, 0xd4, 0x7b, 0xa5, 0xdb, 0x44, 0x1f, 0x14, 0x76, 0xd5, 0x07, 0xbf, 0x1f, - 0x19, 0x3c, 0x18, 0xb4, 0xfc, 0xb8, 0x17, 0x7a, 0xf7, 0x65, 0x16, 0x8f, 0xc8, 0xc2, 0x14, 0x91, - 0x6c, 0xfc, 0x44, 0x4a, 0x22, 0xae, 0x52, 0x9d, 0xa1, 0x6a, 0xa6, 0xa1, 0xc5, 0x68, 0xfd, 0x3e, - 0xec, 0xdb, 0x55, 0x1f, 0x6e, 0x66, 0xf1, 0xed, 0x74, 0x10, 0x97, 0x69, 0xff, 0xbb, 0x8b, 0x6b, - 0x00, 0xdc, 0xf3, 0x20, 0x70, 0x6b, 0x1e, 0xe6, 0x21, 0x58, 0x78, 0x7e, 0x25, 0x11, 0x82, 0x25, - 0x24, 0x09, 0x3c, 0xa4, 0x72, 0xa9, 0x1e, 0x52, 0x57, 0xa0, 0x5f, 0xd3, 0xd7, 0xdf, 0x68, 0x53, - 0x67, 0x43, 0x98, 0x33, 0x3c, 0xec, 0xa1, 0xbe, 0x5e, 0xfb, 0x14, 0x03, 0x6a, 0x01, 0x9a, 0xa8, - 0xc1, 0xe3, 0x7b, 0xc9, 0x23, 0x84, 0x9f, 0x91, 0x07, 0x4f, 0xee, 0xf7, 0xa2, 0xe8, 0xe4, 0x45, - 0xc8, 0x95, 0xee, 0x56, 0x85, 0x64, 0x83, 0xae, 0x2d, 0xdd, 0xad, 0x0a, 0x79, 0x75, 0x2c, 0x7b, - 0xb7, 0xaa, 0x7e, 0x3a, 0x0b, 0x24, 0x49, 0x49, 0x9e, 0x83, 0x01, 0x84, 0xae, 0x30, 0x9d, 0x91, - 0x13, 0x73, 0xae, 0xbb, 0x35, 0x07, 0xa1, 0x11, 0xe3, 0xce, 0x27, 0x25, 0x2f, 0x60, 0xea, 0x63, - 0x91, 0x1a, 0x2e, 0x92, 0x98, 0x73, 0xdd, 0xf5, 0x93, 0x05, 0xc7, 0x32, 0x1f, 0x0b, 0x62, 0xb4, - 0x0b, 0xef, 0x56, 0xa7, 0x6d, 0xd7, 0x13, 0xa2, 0xe6, 0x76, 0xe1, 0xba, 0x8b, 0x19, 0x61, 0x23, - 0x76, 0x21, 0x27, 0xc3, 0xac, 0x56, 0x77, 0xab, 0xfc, 0x99, 0x8a, 0xa1, 0xd9, 0x0d, 0xdf, 0xa0, - 0xe4, 0x59, 0xad, 0xd6, 0xdd, 0x1a, 0x7f, 0xe2, 0x62, 0x60, 0xce, 0xe5, 0x48, 0x56, 0xab, 0x48, - 0x29, 0xf5, 0xf3, 0xfd, 0x30, 0x5a, 0xd6, 0x3d, 0x7d, 0x49, 0x77, 0xa9, 0xb4, 0x9b, 0x3e, 0xe1, - 0xc3, 0xfc, 0xcf, 0x91, 0xe4, 0x60, 0x2c, 0xa5, 0x7c, 0x4d, 0xbc, 0x00, 0x79, 0x29, 0xe4, 0x1b, - 0xe4, 0x1c, 0x95, 0x93, 0x98, 0x2d, 0xd5, 0x5a, 0x02, 0xac, 0x25, 0x08, 0xc9, 0x93, 0x30, 0xe8, - 0xc3, 0xd8, 0x06, 0x20, 0x17, 0xea, 0x8c, 0xb1, 0xc4, 0xec, 0x7f, 0x4d, 0x46, 0x93, 0x17, 0x60, - 0xc8, 0xff, 0x29, 0x99, 0xd6, 0x3c, 0x23, 0xdb, 0x52, 0x62, 0xf7, 0x24, 0x93, 0xca, 0x45, 0x71, - 0x7e, 0xeb, 0x8d, 0x14, 0x8d, 0x25, 0x3d, 0x8b, 0x90, 0x92, 0x4f, 0xc1, 0x88, 0xff, 0x5b, 0x6c, - 0x18, 0x78, 0x7e, 0xb8, 0x27, 0x83, 0x94, 0xce, 0x31, 0xb1, 0x5e, 0x8d, 0x92, 0xf3, 0xad, 0xc3, - 0xc3, 0x7e, 0x1e, 0x2f, 0x63, 0x29, 0xb9, 0x73, 0x88, 0x55, 0x40, 0x2a, 0x30, 0xe6, 0x43, 0x42, - 0x0d, 0xed, 0x0b, 0x77, 0x8c, 0xc6, 0x52, 0x2d, 0x55, 0x49, 0x93, 0xa5, 0x48, 0x03, 0xce, 0x47, - 0x80, 0x86, 0xbb, 0x6a, 0x2e, 0x7b, 0x62, 0xbb, 0x27, 0x62, 0x10, 0x8b, 0xc4, 0x8d, 0x01, 0x57, - 0x4e, 0xe3, 0x67, 0x60, 0x8d, 0x66, 0x87, 0xea, 0xca, 0x8d, 0x54, 0xe1, 0x94, 0x8f, 0xbf, 0x39, - 0xb1, 0xb0, 0xe0, 0xd8, 0x6f, 0xd1, 0xba, 0x57, 0x29, 0x8b, 0xed, 0x32, 0xc6, 0xa6, 0x33, 0x96, - 0x6a, 0x2b, 0xf5, 0x16, 0x53, 0x0a, 0x86, 0x8b, 0x32, 0x4f, 0x2d, 0x4c, 0xee, 0xc0, 0x69, 0x09, - 0x2e, 0xa5, 0x87, 0x86, 0x70, 0x3f, 0x2f, 0xb8, 0xa6, 0x67, 0x88, 0x4e, 0x2f, 0x4e, 0x5e, 0x86, - 0x61, 0x1f, 0xc1, 0x6f, 0x11, 0x07, 0xf1, 0x16, 0x11, 0x87, 0xa4, 0xb1, 0x54, 0x8b, 0xbf, 0xa6, - 0x8c, 0x12, 0xcb, 0x1a, 0x85, 0x19, 0xf5, 0x87, 0x22, 0x1a, 0xe5, 0x6d, 0xb4, 0x52, 0x95, 0x11, - 0xb3, 0xec, 0xbf, 0x1a, 0x6a, 0xd4, 0xbc, 0x63, 0xae, 0x98, 0x7c, 0x27, 0xed, 0x3f, 0xa0, 0x5c, - 0xaa, 0xd9, 0x08, 0x4c, 0xd3, 0x0f, 0x4e, 0x7e, 0xae, 0x04, 0x27, 0x53, 0x74, 0x6c, 0x57, 0x3b, - 0xc6, 0xcf, 0x65, 0xc3, 0x46, 0x1c, 0xf1, 0x6d, 0xe3, 0x38, 0xf4, 0xfb, 0x5f, 0x22, 0x8c, 0x07, - 0xa5, 0xd3, 0xd0, 0x8c, 0xf3, 0xf0, 0xf1, 0x11, 0x71, 0x1c, 0xf1, 0xad, 0xe4, 0x41, 0x88, 0xe3, - 0x9d, 0x4c, 0x28, 0x8e, 0x23, 0xbe, 0xbd, 0xfc, 0xc3, 0x5c, 0x38, 0x27, 0x1d, 0xef, 0x31, 0x0f, - 0xca, 0x4c, 0x0e, 0xfd, 0x60, 0x0b, 0xbb, 0x78, 0xc8, 0x28, 0xab, 0x66, 0xdf, 0x1e, 0x55, 0xf3, - 0x4f, 0x93, 0xfd, 0xc9, 0x4d, 0xcf, 0x23, 0xd9, 0x9f, 0x07, 0x30, 0x58, 0xc9, 0xf5, 0x70, 0x1d, - 0xe3, 0x36, 0x7a, 0xaf, 0x14, 0xe2, 0x6f, 0x49, 0x98, 0xe8, 0x51, 0x12, 0xf2, 0x31, 0x38, 0x1b, - 0x01, 0x2c, 0xe8, 0x8e, 0xde, 0xa4, 0x5e, 0x98, 0x71, 0x10, 0x83, 0x36, 0xf9, 0xa5, 0x6b, 0xad, - 0x00, 0x2d, 0x67, 0x31, 0xec, 0xc0, 0x41, 0x52, 0x8e, 0xbe, 0x5d, 0x38, 0x49, 0x7f, 0x39, 0x17, - 0x9a, 0x2a, 0xd1, 0xe0, 0xab, 0x1a, 0x75, 0xdb, 0x0d, 0xef, 0xc1, 0xed, 0xe0, 0xbd, 0xa5, 0xb6, - 0x98, 0x86, 0x13, 0xa5, 0xe5, 0x65, 0x5a, 0xf7, 0xfc, 0x98, 0xd2, 0xae, 0x08, 0xb7, 0xc7, 0xb7, - 0x0e, 0x02, 0x25, 0x62, 0x04, 0x47, 0x72, 0xe3, 0xc7, 0x8a, 0xa9, 0x7f, 0x96, 0x07, 0x25, 0x30, - 0xdd, 0x83, 0x87, 0x5a, 0x87, 0xb8, 0x4c, 0xbe, 0x27, 0x7a, 0xc5, 0x84, 0xb1, 0x50, 0x18, 0xd5, - 0x76, 0xb3, 0xa9, 0xe3, 0xd0, 0x63, 0x5b, 0x83, 0x62, 0x9c, 0x59, 0x48, 0xc8, 0x77, 0x03, 0xe7, - 0xc4, 0x6e, 0x80, 0x84, 0x0f, 0xe1, 0x6a, 0x2e, 0x67, 0xa1, 0x25, 0xb9, 0x92, 0x2f, 0x64, 0xe0, - 0x94, 0xdf, 0x29, 0xf3, 0x4b, 0xcc, 0x2c, 0x9e, 0xb0, 0xdb, 0x96, 0xe7, 0xef, 0x44, 0x5e, 0xec, - 0x5c, 0x1d, 0xef, 0xa4, 0xab, 0x69, 0x85, 0x79, 0x4b, 0x82, 0xc0, 0x12, 0x81, 0x42, 0xd8, 0x48, - 0x53, 0xab, 0x23, 0x91, 0x96, 0x5a, 0xef, 0xb9, 0x9b, 0xf0, 0x50, 0x47, 0x96, 0xdb, 0x99, 0xa1, - 0xbd, 0xb2, 0x19, 0xfa, 0xf7, 0x32, 0xe1, 0x44, 0x14, 0x13, 0x12, 0xb9, 0x0a, 0x10, 0x82, 0xc4, - 0xc6, 0x74, 0x64, 0x6b, 0xb3, 0x08, 0xa1, 0xd0, 0x34, 0x89, 0x82, 0xcc, 0x43, 0x41, 0x88, 0x85, - 0x67, 0xf7, 0xfd, 0xc0, 0x36, 0xbd, 0x70, 0x55, 0x96, 0x03, 0x6e, 0x3a, 0xc5, 0x37, 0x0b, 0x36, - 0xe7, 0x5e, 0x80, 0xc1, 0xbd, 0x7e, 0xd7, 0x17, 0x72, 0x40, 0xe4, 0x5d, 0xe4, 0x21, 0x9a, 0xd8, - 0x47, 0x78, 0x0a, 0xbb, 0x0c, 0xfd, 0xec, 0x13, 0x30, 0xdf, 0x85, 0x14, 0xdf, 0xb6, 0x2d, 0x60, - 0x5a, 0x80, 0x0d, 0x83, 0x4b, 0xf5, 0xa5, 0x07, 0x97, 0x52, 0x7f, 0x2c, 0x07, 0x67, 0xe4, 0x0e, - 0x29, 0x53, 0x0c, 0x99, 0x7f, 0xdc, 0x29, 0xef, 0x62, 0xa7, 0xa8, 0x50, 0xe0, 0x9b, 0x07, 0x91, - 0xbb, 0x80, 0x1f, 0xec, 0x20, 0x44, 0x13, 0x18, 0xf5, 0x1f, 0x67, 0x61, 0x78, 0xc1, 0x76, 0xbd, - 0x15, 0x87, 0xba, 0x0b, 0xba, 0xe3, 0x3e, 0xc0, 0xdd, 0xf1, 0x21, 0x18, 0xc6, 0xf0, 0x40, 0x4d, - 0x6a, 0xf1, 0x10, 0x3a, 0xbd, 0x52, 0xb2, 0x11, 0x1f, 0x21, 0xf2, 0x4a, 0x45, 0x08, 0x99, 0xf6, - 0x73, 0xcb, 0x4f, 0x0a, 0xda, 0xc4, 0xcd, 0x3e, 0x0e, 0x57, 0x7f, 0x2e, 0x07, 0x43, 0xbe, 0x94, - 0xc7, 0xcd, 0xa3, 0x7a, 0x53, 0x73, 0xb8, 0x42, 0xbe, 0x06, 0xb0, 0x60, 0x3b, 0x9e, 0xde, 0x98, - 0x0b, 0x35, 0x1f, 0x8f, 0x38, 0x5b, 0x08, 0xe5, 0x65, 0x24, 0x12, 0x5c, 0xbf, 0x42, 0xb3, 0x9a, - 0x4f, 0x4c, 0x7c, 0xfd, 0x0a, 0xa0, 0x9a, 0x44, 0xa1, 0xfe, 0x6e, 0x16, 0x4e, 0xf8, 0x9d, 0x34, - 0x79, 0x9f, 0xd6, 0xdb, 0x0f, 0xf2, 0xdc, 0x14, 0x95, 0x76, 0xef, 0xb6, 0xd2, 0x56, 0xff, 0x95, - 0x34, 0x91, 0x4c, 0x34, 0xec, 0xe3, 0x89, 0xe4, 0xef, 0x42, 0xc7, 0xd5, 0xef, 0xcf, 0xc1, 0x29, - 0x5f, 0xea, 0x53, 0x6d, 0x0b, 0x0f, 0x07, 0x26, 0xf4, 0x46, 0xe3, 0x41, 0xde, 0x8d, 0x0f, 0xfa, - 0x82, 0x98, 0x17, 0xf1, 0xf6, 0x44, 0x8e, 0xbf, 0x65, 0x01, 0xae, 0xd9, 0xa6, 0xa1, 0xc9, 0x44, - 0xe4, 0x55, 0x18, 0xf2, 0x7f, 0x96, 0x9c, 0x15, 0x7f, 0x0b, 0x8e, 0x47, 0xfd, 0x41, 0x21, 0xdd, - 0x89, 0x84, 0x15, 0x88, 0x14, 0x50, 0xff, 0x69, 0x01, 0xce, 0xdd, 0x35, 0x2d, 0xc3, 0x5e, 0x77, - 0xfd, 0x14, 0x91, 0x47, 0xfe, 0xa8, 0xeb, 0xb0, 0x53, 0x43, 0xbe, 0x01, 0xa7, 0xe3, 0x22, 0x75, - 0x82, 0xc0, 0xdd, 0xa2, 0x77, 0xd6, 0x39, 0x41, 0xcd, 0x4f, 0x16, 0x29, 0xee, 0xcb, 0xb4, 0xf4, - 0x92, 0xf1, 0x6c, 0x93, 0x7d, 0x3b, 0xc9, 0x36, 0xf9, 0x04, 0x14, 0xca, 0x76, 0x53, 0x37, 0xfd, - 0x00, 0x33, 0x38, 0x8a, 0x83, 0x7a, 0x11, 0xa3, 0x09, 0x0a, 0xc6, 0x5f, 0x54, 0x8c, 0x5d, 0x36, - 0x10, 0xf2, 0xf7, 0x0b, 0x30, 0x2b, 0x4d, 0x93, 0x89, 0x88, 0x0d, 0xc3, 0xa2, 0x3a, 0x71, 0xbb, - 0x05, 0xb8, 0x79, 0x7a, 0xd6, 0x97, 0x51, 0x67, 0xb5, 0xba, 0x1a, 0x29, 0xc7, 0xb7, 0x51, 0x3c, - 0x09, 0xa6, 0xf8, 0x18, 0x7e, 0xcf, 0xa5, 0x45, 0xf9, 0x4b, 0x42, 0xc0, 0x49, 0x66, 0x30, 0x29, - 0x04, 0x9c, 0x65, 0x64, 0x22, 0x32, 0x09, 0x63, 0x18, 0x5e, 0x39, 0xd8, 0x4a, 0x31, 0x95, 0x18, - 0x42, 0xa3, 0x12, 0x2f, 0x4d, 0x78, 0x44, 0x66, 0xf6, 0x71, 0xb5, 0xba, 0x40, 0x6b, 0xc9, 0x12, - 0xe7, 0x5e, 0x03, 0x92, 0x6c, 0xf3, 0xae, 0xae, 0x4d, 0xfe, 0x2f, 0x69, 0x5f, 0x77, 0xd4, 0x1d, - 0x5f, 0x0e, 0x62, 0xb6, 0x8b, 0xa4, 0x0e, 0xeb, 0x7d, 0x37, 0x53, 0x87, 0x15, 0x0e, 0x34, 0x75, - 0x98, 0xfa, 0xab, 0x19, 0x18, 0x4b, 0xc4, 0x19, 0x27, 0xcf, 0x00, 0x70, 0x88, 0x14, 0xcf, 0x11, - 0x03, 0xa4, 0x84, 0xb1, 0xc7, 0xc5, 0x1a, 0x18, 0x92, 0x91, 0x6b, 0xd0, 0xcf, 0x7f, 0x89, 0x18, - 0x4c, 0xc9, 0x22, 0xed, 0xb6, 0x69, 0x68, 0x01, 0x51, 0x58, 0x0b, 0x5e, 0x1c, 0xe6, 0x52, 0x8b, - 0x78, 0x1b, 0xad, 0xa0, 0x16, 0x46, 0xa6, 0x7e, 0x3e, 0x0b, 0x43, 0x41, 0x83, 0x4b, 0xc6, 0x61, - 0xe9, 0x5c, 0x41, 0x84, 0x6c, 0xcf, 0x6d, 0x17, 0xb2, 0x3d, 0x36, 0xa9, 0x8a, 0x18, 0xed, 0x07, - 0xf7, 0xee, 0xe9, 0x8b, 0x59, 0x38, 0x11, 0xd4, 0x7a, 0x88, 0x77, 0x54, 0xef, 0x21, 0x91, 0x7c, - 0x21, 0x03, 0xca, 0xb8, 0xd9, 0x68, 0x98, 0xd6, 0x4a, 0xc5, 0x5a, 0xb6, 0x9d, 0x26, 0xce, 0x7a, - 0x87, 0x77, 0x4e, 0xab, 0xfe, 0x50, 0x06, 0xc6, 0x44, 0x83, 0x26, 0x74, 0xc7, 0x38, 0xbc, 0x43, - 0xb0, 0x78, 0x4b, 0x0e, 0x4f, 0x5f, 0xd4, 0xaf, 0x66, 0x01, 0x66, 0xec, 0xfa, 0xda, 0x11, 0x7f, - 0x36, 0xf5, 0x12, 0x14, 0x78, 0x20, 0x2c, 0xa1, 0xb1, 0x63, 0xe2, 0x79, 0x10, 0xfb, 0x34, 0x8e, - 0x18, 0x1f, 0x15, 0xf3, 0x71, 0x81, 0x07, 0xd2, 0x52, 0x32, 0x9a, 0x28, 0xc2, 0x2a, 0x65, 0x74, - 0x62, 0xc1, 0x08, 0x2a, 0x65, 0xb0, 0x68, 0xa5, 0x5b, 0x9b, 0xc5, 0x7c, 0xc3, 0xae, 0xaf, 0x69, - 0x48, 0xaf, 0xfe, 0x6d, 0x86, 0xcb, 0xee, 0x88, 0x3f, 0xfe, 0xf4, 0x3f, 0x3f, 0xbf, 0xcb, 0xcf, - 0xff, 0xe1, 0x0c, 0x9c, 0xd2, 0x68, 0xdd, 0xbe, 0x47, 0x9d, 0x8d, 0x09, 0xdb, 0xa0, 0x37, 0xa9, - 0x45, 0x9d, 0xc3, 0x1a, 0x51, 0xff, 0x2b, 0xe6, 0xb8, 0x08, 0x1b, 0x73, 0xdb, 0xa5, 0xc6, 0xd1, - 0xc9, 0x3f, 0xa2, 0xfe, 0x46, 0x1f, 0x28, 0xa9, 0xa6, 0xed, 0x91, 0x35, 0xe7, 0x3a, 0xee, 0x57, - 0xf2, 0x07, 0xb5, 0x5f, 0xe9, 0xdd, 0xdd, 0x7e, 0xa5, 0xb0, 0xdb, 0xfd, 0x4a, 0xdf, 0x4e, 0xf6, - 0x2b, 0xcd, 0xf8, 0x7e, 0xa5, 0x1f, 0xf7, 0x2b, 0xcf, 0x74, 0xdd, 0xaf, 0x4c, 0x5a, 0xc6, 0x1e, - 0x77, 0x2b, 0x47, 0x36, 0x37, 0xee, 0x5e, 0xb6, 0x59, 0x97, 0xd9, 0xa4, 0x58, 0xb7, 0x1d, 0x83, - 0x1a, 0x62, 0x77, 0x85, 0x47, 0xfb, 0x8e, 0x80, 0x69, 0x01, 0x36, 0x91, 0x68, 0x78, 0x78, 0x27, - 0x89, 0x86, 0x0f, 0x60, 0xff, 0xf5, 0xb9, 0x2c, 0x8c, 0x4d, 0x50, 0xc7, 0xe3, 0x91, 0x36, 0x0f, - 0xc2, 0x73, 0xad, 0x04, 0x27, 0x24, 0x86, 0x68, 0x91, 0x67, 0x43, 0x6f, 0xbc, 0x3a, 0x75, 0xbc, - 0xb8, 0x33, 0x5f, 0x9c, 0x9e, 0x55, 0xef, 0x27, 0xfb, 0x12, 0x63, 0x37, 0xa8, 0xde, 0x87, 0x73, - 0x41, 0x9a, 0xe2, 0x97, 0x16, 0xd0, 0x4b, 0xf9, 0xbb, 0xf2, 0xbb, 0xcf, 0xdf, 0xa5, 0xfe, 0x4a, - 0x06, 0x2e, 0x69, 0xd4, 0xa2, 0xeb, 0xfa, 0x52, 0x83, 0x4a, 0xcd, 0x12, 0x2b, 0x03, 0x9b, 0x35, - 0x4c, 0xb7, 0xa9, 0x7b, 0xf5, 0xd5, 0x7d, 0xc9, 0x68, 0x0a, 0x86, 0xe4, 0xf9, 0x6b, 0x17, 0x73, - 0x5b, 0xa4, 0x9c, 0xfa, 0x1b, 0x79, 0xe8, 0x1b, 0xb7, 0xbd, 0xd7, 0xed, 0x7d, 0x26, 0x94, 0x0b, - 0xa7, 0xfc, 0xec, 0x2e, 0x0e, 0x74, 0x3e, 0x88, 0x95, 0x4b, 0x31, 0xf6, 0xd1, 0xd3, 0x73, 0xc9, - 0x4e, 0xe4, 0x22, 0xf0, 0xc9, 0x76, 0x99, 0x4a, 0xee, 0x39, 0x18, 0xc0, 0x20, 0x2d, 0xd2, 0x91, - 0x2b, 0xfa, 0x51, 0x7b, 0x0c, 0x18, 0xaf, 0x23, 0x24, 0x25, 0x1f, 0x8b, 0x84, 0x06, 0x2d, 0xec, - 0x3f, 0xf5, 0x9c, 0x1c, 0x25, 0xf4, 0x19, 0x7e, 0x5b, 0x87, 0x6d, 0x92, 0xd2, 0x74, 0xe0, 0x51, - 0x49, 0xac, 0x49, 0x01, 0xe1, 0x01, 0xa6, 0x85, 0x9b, 0x80, 0xe1, 0x71, 0xdb, 0x93, 0x7c, 0x76, - 0x07, 0xc2, 0xd7, 0x9a, 0x4c, 0xf2, 0xe9, 0x0e, 0xbb, 0xd1, 0x32, 0xea, 0xb7, 0xf3, 0x30, 0xe4, - 0xff, 0x3c, 0x24, 0xdd, 0x79, 0x0a, 0x0a, 0xd3, 0xb6, 0x94, 0xa9, 0x00, 0xfd, 0x7c, 0x57, 0x6d, - 0x37, 0xe6, 0xc0, 0x2c, 0x88, 0x98, 0xd4, 0xe7, 0x6c, 0x43, 0xf6, 0x52, 0x47, 0xa9, 0x5b, 0xb6, - 0x91, 0x78, 0xe5, 0x1b, 0x10, 0x92, 0x4b, 0x90, 0x47, 0x07, 0x7f, 0xe9, 0xb4, 0x3e, 0xe6, 0xd4, - 0x8f, 0x78, 0x49, 0x2b, 0x0b, 0xbb, 0xd5, 0xca, 0xbe, 0xbd, 0x6a, 0x65, 0xff, 0xc1, 0x6a, 0xe5, - 0x9b, 0x30, 0x84, 0x35, 0xf9, 0x89, 0xce, 0xb6, 0x5f, 0x58, 0x1f, 0x12, 0x6b, 0xdf, 0x30, 0x6f, - 0xb7, 0x48, 0x77, 0x86, 0x4b, 0x5e, 0x84, 0x55, 0x4c, 0x77, 0x61, 0x1f, 0xdb, 0xe9, 0x3f, 0xcd, - 0x40, 0xdf, 0x6d, 0x6b, 0xcd, 0xb2, 0xd7, 0xf7, 0xa7, 0x71, 0xcf, 0xc0, 0xa0, 0x60, 0x23, 0xad, - 0x2e, 0xf8, 0x70, 0xbb, 0xcd, 0xc1, 0x35, 0xe4, 0xa4, 0xc9, 0x54, 0xe4, 0xe5, 0xa0, 0x10, 0xbe, - 0xe1, 0xc9, 0x85, 0xb9, 0x3e, 0xfc, 0x42, 0xf5, 0x68, 0x7a, 0x02, 0x99, 0x9c, 0x9c, 0x87, 0x7c, - 0x99, 0x35, 0x55, 0x0a, 0x76, 0xcb, 0x9a, 0xa2, 0x21, 0x54, 0xfd, 0x5c, 0x1e, 0x46, 0x62, 0x07, - 0x5f, 0x4f, 0xc0, 0x80, 0x38, 0x78, 0x32, 0xfd, 0x7c, 0x09, 0xf8, 0xc6, 0x27, 0x00, 0x6a, 0xfd, - 0xfc, 0xcf, 0x8a, 0x41, 0x3e, 0x0c, 0x7d, 0xb6, 0x8b, 0x8b, 0x22, 0x7e, 0xcb, 0x48, 0x38, 0x84, - 0xe6, 0xab, 0xac, 0xed, 0x7c, 0x70, 0x08, 0x12, 0x59, 0x23, 0x6d, 0x17, 0x3f, 0xed, 0x06, 0x0c, - 0xe8, 0xae, 0x4b, 0xbd, 0x9a, 0xa7, 0xaf, 0xc8, 0x29, 0x14, 0x02, 0xa0, 0x3c, 0x3a, 0x10, 0xb8, - 0xa8, 0xaf, 0x90, 0xd7, 0x60, 0xb8, 0xee, 0x50, 0x5c, 0x36, 0xf5, 0x06, 0x6b, 0xa5, 0x64, 0xd6, - 0x46, 0x10, 0xf2, 0x25, 0x49, 0x88, 0xa8, 0x18, 0xe4, 0x0e, 0x0c, 0x8b, 0xcf, 0xe1, 0x0e, 0xf6, - 0x38, 0xd0, 0x46, 0xc2, 0x65, 0x8c, 0x8b, 0x84, 0xbb, 0xd8, 0x8b, 0x77, 0x16, 0x32, 0xb9, 0xcc, - 0xd7, 0x90, 0x48, 0xc9, 0x3c, 0x90, 0x75, 0xba, 0x54, 0xd3, 0xdb, 0xde, 0x2a, 0xab, 0x8b, 0x47, - 0x00, 0x17, 0x99, 0x03, 0xf1, 0x71, 0x42, 0x12, 0x2b, 0xbf, 0xd9, 0x58, 0xa7, 0x4b, 0xa5, 0x08, - 0x92, 0xdc, 0x85, 0xd3, 0xc9, 0x22, 0xec, 0x93, 0xf9, 0x0d, 0xc0, 0x63, 0x5b, 0x9b, 0xc5, 0x62, - 0x2a, 0x81, 0xc4, 0xf6, 0x64, 0x82, 0x6d, 0xc5, 0x78, 0x3d, 0xdf, 0xdf, 0x37, 0xda, 0xaf, 0x8d, - 0xb0, 0xb2, 0xbe, 0x09, 0x69, 0x1a, 0xea, 0x37, 0x32, 0xcc, 0x54, 0x64, 0x1f, 0x84, 0xa9, 0x93, - 0x99, 0xae, 0x37, 0x77, 0xa9, 0xeb, 0xcd, 0x30, 0xc9, 0x61, 0xc1, 0xed, 0x32, 0xbb, 0x6a, 0x02, - 0x4b, 0xae, 0x42, 0xc1, 0x90, 0x4f, 0xcd, 0xce, 0x44, 0x3b, 0xc1, 0xaf, 0x47, 0x13, 0x54, 0xe4, - 0x32, 0xe4, 0xd9, 0x92, 0x15, 0xdf, 0x32, 0xcb, 0xd6, 0x85, 0x86, 0x14, 0xea, 0xf7, 0x66, 0x61, - 0x48, 0xfa, 0x9a, 0xeb, 0xfb, 0xfa, 0x9c, 0x17, 0x77, 0xd6, 0x4c, 0xdf, 0xb3, 0x05, 0xf7, 0x52, - 0x7e, 0x93, 0x6f, 0x04, 0xa2, 0xd8, 0xd1, 0xad, 0x93, 0x10, 0xcc, 0x73, 0xe2, 0x43, 0x0b, 0x3b, - 0xdf, 0x3e, 0x32, 0xfa, 0xd7, 0xf3, 0xfd, 0xd9, 0xd1, 0xdc, 0xeb, 0xf9, 0xfe, 0xfc, 0x68, 0x2f, - 0x86, 0xcb, 0xc2, 0x08, 0xd5, 0x7c, 0x6f, 0x6e, 0x2d, 0x9b, 0x2b, 0x47, 0xfc, 0x89, 0xc7, 0xc1, - 0x86, 0x12, 0x8b, 0xc9, 0xe6, 0x88, 0xbf, 0xf7, 0x78, 0x57, 0x65, 0x73, 0x9c, 0x14, 0x51, 0xc8, - 0xe6, 0xcf, 0x32, 0xa0, 0xa4, 0xca, 0xa6, 0x74, 0x48, 0xce, 0x0e, 0x07, 0x97, 0x1a, 0xf1, 0x5b, - 0x59, 0x18, 0xab, 0x58, 0x1e, 0x5d, 0xe1, 0x3b, 0xc6, 0x23, 0x3e, 0x55, 0xdc, 0x82, 0x41, 0xe9, - 0x63, 0x44, 0x9f, 0x3f, 0x1c, 0xec, 0xc7, 0x43, 0x54, 0x07, 0x4e, 0x72, 0xe9, 0x03, 0xcc, 0xa6, - 0x1e, 0x13, 0xf2, 0x11, 0x9f, 0x73, 0x8e, 0x86, 0x90, 0x8f, 0xf8, 0xe4, 0xf5, 0x1e, 0x15, 0xf2, - 0xbf, 0xc8, 0xc0, 0xc9, 0x94, 0xca, 0xc9, 0x25, 0xe8, 0xab, 0xb6, 0x97, 0x30, 0x3a, 0x56, 0x26, - 0x74, 0x0b, 0x76, 0xdb, 0x4b, 0x18, 0x18, 0x4b, 0xf3, 0x91, 0x64, 0x11, 0xdf, 0xc0, 0xcf, 0x57, - 0xca, 0x13, 0x42, 0xaa, 0xaa, 0xf4, 0x9a, 0x9f, 0x81, 0xd3, 0xbe, 0x2c, 0x78, 0x27, 0x6f, 0x9b, - 0x46, 0x3d, 0xf6, 0x4e, 0x9e, 0x95, 0x21, 0x1f, 0x87, 0x81, 0xd2, 0xdb, 0x6d, 0x87, 0x22, 0x5f, - 0x2e, 0xf1, 0xf7, 0x05, 0x7c, 0x7d, 0x44, 0x1a, 0x67, 0xfe, 0xe4, 0x9f, 0x51, 0xc4, 0x79, 0x87, - 0x0c, 0xd5, 0xcf, 0x67, 0xe0, 0x5c, 0xe7, 0xd6, 0x91, 0x0f, 0x42, 0x1f, 0xdb, 0x99, 0x97, 0xb4, - 0x39, 0xf1, 0xe9, 0x3c, 0x8d, 0xa8, 0xdd, 0xa0, 0x35, 0xdd, 0x91, 0x8d, 0x7d, 0x9f, 0x8c, 0xbc, - 0x02, 0x83, 0x15, 0xd7, 0x6d, 0x53, 0xa7, 0xfa, 0xcc, 0x6d, 0xad, 0x22, 0xf6, 0x84, 0xb8, 0xe7, - 0x30, 0x11, 0x5c, 0x73, 0x9f, 0x89, 0xc5, 0xbf, 0x92, 0xe9, 0xd5, 0xcf, 0x64, 0xe0, 0x7c, 0xb7, - 0xaf, 0x22, 0xcf, 0x40, 0xff, 0x22, 0xb5, 0x74, 0xcb, 0xab, 0x94, 0x45, 0x93, 0x70, 0x8b, 0xe5, - 0x21, 0x2c, 0xba, 0x53, 0x08, 0x08, 0x59, 0x21, 0x7e, 0xae, 0x18, 0x38, 0x32, 0xf0, 0x33, 0x50, - 0x84, 0xc5, 0x0a, 0xf9, 0x84, 0xea, 0x2f, 0x2c, 0x41, 0xef, 0xbc, 0x45, 0xe7, 0x97, 0xc9, 0xd3, - 0x30, 0xc0, 0x74, 0x1f, 0x73, 0xf8, 0x8b, 0x81, 0x36, 0x26, 0x0f, 0x18, 0x44, 0x4c, 0xf7, 0x68, - 0x21, 0x15, 0xb9, 0x21, 0x27, 0x0e, 0x17, 0xea, 0x40, 0xe4, 0x32, 0x1c, 0x33, 0xdd, 0xa3, 0xc9, - 0x09, 0xc6, 0x6f, 0xc8, 0x09, 0x9b, 0x45, 0x67, 0x47, 0x4a, 0x71, 0x8c, 0x5f, 0x4a, 0x4c, 0x03, - 0x33, 0x69, 0x59, 0x8d, 0xe3, 0x36, 0x41, 0x92, 0x62, 0xba, 0x47, 0x4b, 0xcf, 0x86, 0x3c, 0x24, - 0xfb, 0x42, 0xc5, 0xaf, 0x32, 0x65, 0xdc, 0x74, 0x8f, 0x16, 0xa1, 0x25, 0xcf, 0xc3, 0xa0, 0xf8, - 0xfd, 0xba, 0x6d, 0x5a, 0xf1, 0x40, 0x18, 0x12, 0x6a, 0xba, 0x47, 0x93, 0x29, 0xa5, 0x4a, 0x17, - 0x1c, 0xd3, 0xf2, 0xc4, 0xf3, 0xba, 0x78, 0xa5, 0x88, 0x93, 0x2a, 0xc5, 0xdf, 0xe4, 0x15, 0x18, - 0x0e, 0x22, 0x8c, 0xbc, 0x45, 0xeb, 0x9e, 0x38, 0xd2, 0x39, 0x1d, 0x2b, 0xcc, 0x91, 0xd3, 0x3d, - 0x5a, 0x94, 0x9a, 0x5c, 0x86, 0x82, 0x46, 0x5d, 0xf3, 0x6d, 0xff, 0x12, 0x64, 0x44, 0x9a, 0xce, - 0xcc, 0xb7, 0x99, 0x94, 0x04, 0x9e, 0xf5, 0x4e, 0x78, 0xeb, 0x22, 0x0e, 0x60, 0x48, 0xac, 0x96, - 0x49, 0xcb, 0x60, 0xbd, 0x23, 0x5d, 0xb9, 0xbd, 0x16, 0xc6, 0x5d, 0x11, 0xd9, 0xda, 0x06, 0xe3, - 0x0f, 0x5c, 0x65, 0xec, 0x74, 0x8f, 0x16, 0xa3, 0x97, 0xa4, 0x5a, 0x36, 0xdd, 0x35, 0x11, 0xea, - 0x2e, 0x2e, 0x55, 0x86, 0x92, 0xa4, 0xca, 0x7e, 0x4a, 0x55, 0xcf, 0x51, 0x6f, 0xdd, 0x76, 0xd6, - 0x44, 0x60, 0xbb, 0x78, 0xd5, 0x02, 0x2b, 0x55, 0x2d, 0x20, 0x72, 0xd5, 0x6c, 0x91, 0x19, 0x49, - 0xaf, 0x5a, 0xf7, 0x74, 0xb9, 0x6a, 0xbe, 0xbf, 0xf4, 0x3b, 0x69, 0x86, 0xea, 0xf7, 0x78, 0xd2, - 0xdc, 0x64, 0x87, 0x22, 0x4e, 0xea, 0x50, 0xfc, 0xcd, 0x2a, 0x95, 0x12, 0xa3, 0x8a, 0xac, 0xb8, - 0x41, 0xa5, 0x12, 0x8a, 0x55, 0x2a, 0xa7, 0x50, 0xbd, 0x21, 0xe7, 0x0b, 0x55, 0xc6, 0xa2, 0x1d, - 0x14, 0x62, 0x58, 0x07, 0x49, 0x79, 0x45, 0x8b, 0x98, 0x8b, 0x50, 0x21, 0x48, 0x3e, 0x18, 0xb4, - 0x70, 0x62, 0x61, 0xba, 0x47, 0xc3, 0x2c, 0x85, 0x2a, 0xcf, 0x72, 0xa9, 0x9c, 0x44, 0x8a, 0x21, - 0x9f, 0x82, 0xc1, 0xa6, 0x7b, 0x34, 0x9e, 0x01, 0xf3, 0x69, 0x29, 0x9f, 0x94, 0x72, 0x2a, 0x3a, - 0x45, 0x04, 0x08, 0x36, 0x45, 0x84, 0x59, 0xa7, 0xa6, 0x92, 0x39, 0x97, 0x94, 0xd3, 0xd1, 0x15, - 0x35, 0x8e, 0x9f, 0xee, 0xd1, 0x92, 0x79, 0x9a, 0x9e, 0x8f, 0xa4, 0x21, 0x52, 0xce, 0xc4, 0xa2, - 0xcf, 0x84, 0x28, 0x26, 0x2e, 0x39, 0x61, 0xd1, 0x7c, 0x6a, 0xe2, 0x70, 0xe5, 0x6c, 0x74, 0x39, - 0x4e, 0x21, 0x99, 0xee, 0xd1, 0x52, 0x53, 0x8e, 0x4f, 0x24, 0x92, 0x01, 0x29, 0x4a, 0xf4, 0xc6, - 0x37, 0x86, 0x9e, 0xee, 0xd1, 0x12, 0xe9, 0x83, 0x6e, 0xc8, 0x59, 0x78, 0x94, 0x87, 0xa2, 0x9d, - 0x18, 0x62, 0x58, 0x27, 0x4a, 0xd9, 0x7a, 0x6e, 0xc8, 0x99, 0x59, 0x94, 0x73, 0xc9, 0x52, 0xe1, - 0xcc, 0x29, 0x65, 0x70, 0xd1, 0xd2, 0x93, 0x4d, 0x28, 0x0f, 0x8b, 0x74, 0x7f, 0xa2, 0x7c, 0x1a, - 0xcd, 0x74, 0x8f, 0x96, 0x9e, 0xa8, 0x42, 0x4b, 0xcf, 0xd2, 0xa0, 0x9c, 0xef, 0xc6, 0x33, 0x68, - 0x5d, 0x7a, 0x86, 0x07, 0xbd, 0x4b, 0xcc, 0x7c, 0xe5, 0x42, 0x34, 0xf4, 0x65, 0x47, 0xc2, 0xe9, - 0x1e, 0xad, 0x4b, 0xe4, 0xfd, 0xdb, 0x1d, 0x02, 0xd8, 0x2b, 0x17, 0xa3, 0xd9, 0x3e, 0x53, 0x89, - 0xa6, 0x7b, 0xb4, 0x0e, 0xe1, 0xef, 0x6f, 0x77, 0x88, 0x6f, 0xae, 0x14, 0xbb, 0xb2, 0x0d, 0xe4, - 0xd1, 0x21, 0x3a, 0xfa, 0x7c, 0x6a, 0x68, 0x70, 0xe5, 0x91, 0xa8, 0xea, 0xa6, 0x90, 0x30, 0xd5, - 0x4d, 0x0b, 0x2a, 0x3e, 0x9f, 0x1a, 0xcb, 0x5a, 0x79, 0xb4, 0x0b, 0xc3, 0xa0, 0x8d, 0xa9, 0x51, - 0xb0, 0xe7, 0x53, 0x83, 0x49, 0x2b, 0x6a, 0x94, 0x61, 0x0a, 0x09, 0x63, 0x98, 0x16, 0x86, 0x7a, - 0x3e, 0x35, 0xe6, 0xb0, 0xf2, 0x58, 0x17, 0x86, 0x61, 0x0b, 0xd3, 0xa2, 0x15, 0x3f, 0x1f, 0x09, - 0xfa, 0xab, 0xbc, 0x2f, 0x3a, 0x6f, 0x48, 0x28, 0x36, 0x6f, 0xc8, 0xe1, 0x81, 0x27, 0x12, 0x61, - 0x0d, 0x95, 0xc7, 0xa3, 0xc3, 0x3c, 0x86, 0x66, 0xc3, 0x3c, 0x1e, 0x08, 0x71, 0x22, 0x11, 0xde, - 0x4d, 0xb9, 0xd4, 0x89, 0x09, 0xa2, 0xa3, 0x4c, 0x78, 0x40, 0xb8, 0x4a, 0x4a, 0x7c, 0x31, 0xe5, - 0xfd, 0x51, 0x6f, 0xc5, 0x04, 0xc1, 0x74, 0x8f, 0x96, 0x12, 0x95, 0x4c, 0x4b, 0x0f, 0xa6, 0xa1, - 0x5c, 0x8e, 0x0e, 0xdb, 0x34, 0x1a, 0x36, 0x6c, 0x53, 0x03, 0x71, 0xcc, 0xa4, 0xb9, 0x54, 0x2b, - 0x57, 0xa2, 0x86, 0x59, 0x92, 0x82, 0x19, 0x66, 0x29, 0xae, 0xd8, 0x5a, 0x7a, 0x78, 0x08, 0xe5, - 0x89, 0xae, 0x2d, 0x44, 0x9a, 0x94, 0x16, 0xf2, 0x68, 0x09, 0xa1, 0xed, 0x74, 0xbb, 0xd5, 0xb0, - 0x75, 0x43, 0xf9, 0x40, 0xaa, 0xed, 0xc4, 0x91, 0x92, 0xed, 0xc4, 0x01, 0x6c, 0x95, 0x97, 0x3d, - 0x77, 0x95, 0x27, 0xa3, 0xab, 0xbc, 0x8c, 0x63, 0xab, 0x7c, 0xc4, 0xcb, 0x77, 0x22, 0xe1, 0xe5, - 0xaa, 0x3c, 0x15, 0x55, 0x80, 0x18, 0x9a, 0x29, 0x40, 0xdc, 0x2f, 0xf6, 0x93, 0x9d, 0xfd, 0x42, - 0x95, 0xab, 0xc8, 0xed, 0x11, 0x9f, 0x5b, 0x27, 0xba, 0xe9, 0x1e, 0xad, 0xb3, 0x6f, 0x69, 0x25, - 0xc5, 0xcd, 0x53, 0xb9, 0x16, 0x55, 0xb0, 0x04, 0x01, 0x53, 0xb0, 0xa4, 0x73, 0x68, 0x25, 0xc5, - 0x4f, 0x53, 0xf9, 0x60, 0x47, 0x56, 0xc1, 0x37, 0xa7, 0x78, 0x77, 0xde, 0x90, 0x1d, 0x2d, 0x95, - 0xa7, 0xa3, 0x8b, 0x5d, 0x88, 0x61, 0x8b, 0x9d, 0xe4, 0x90, 0x79, 0x43, 0x76, 0x31, 0x54, 0xae, - 0x27, 0x4b, 0x85, 0x4b, 0xa4, 0xe4, 0x8a, 0xa8, 0xa5, 0x7b, 0xe6, 0x29, 0xcf, 0x44, 0xb5, 0x2e, - 0x8d, 0x86, 0x69, 0x5d, 0xaa, 0x57, 0xdf, 0x54, 0xd2, 0xc1, 0x4e, 0xb9, 0x11, 0x3f, 0x4b, 0x88, - 0xe2, 0x99, 0xe5, 0x93, 0x70, 0xca, 0x7b, 0x2d, 0x1e, 0xe9, 0x49, 0x79, 0x36, 0x76, 0x99, 0x11, - 0xc1, 0x32, 0xfb, 0x36, 0x16, 0x19, 0xea, 0xb5, 0x78, 0x70, 0x24, 0xe5, 0xb9, 0x74, 0x0e, 0x81, - 0xae, 0xc4, 0x83, 0x29, 0xbd, 0x16, 0x8f, 0x27, 0xa4, 0x3c, 0x9f, 0xce, 0x21, 0x90, 0x6e, 0x3c, - 0xfe, 0xd0, 0xd3, 0x52, 0x84, 0x63, 0xe5, 0x43, 0x51, 0xd3, 0x31, 0x40, 0x30, 0xd3, 0x31, 0x8c, - 0x83, 0xfc, 0xb4, 0x14, 0x19, 0x58, 0x79, 0x21, 0x51, 0x24, 0x68, 0xac, 0x14, 0x3f, 0xf8, 0x69, - 0x29, 0xa2, 0xae, 0xf2, 0x62, 0xa2, 0x48, 0xd0, 0x3a, 0x29, 0xee, 0xae, 0xd1, 0xed, 0xe9, 0x95, - 0xf2, 0x52, 0xf4, 0x88, 0xa3, 0x33, 0xe5, 0x74, 0x8f, 0xd6, 0xed, 0x09, 0xd7, 0x27, 0x3b, 0xbb, - 0x2b, 0x2a, 0x2f, 0x47, 0x87, 0x70, 0x27, 0x3a, 0x36, 0x84, 0x3b, 0xba, 0x3c, 0xbe, 0x12, 0x7b, - 0x86, 0xad, 0xbc, 0x12, 0x9d, 0xe2, 0x22, 0x48, 0x36, 0xc5, 0xc5, 0x1f, 0x6d, 0x47, 0xde, 0x17, - 0x2b, 0x1f, 0x8e, 0x4e, 0x71, 0x32, 0x8e, 0x4d, 0x71, 0x91, 0xb7, 0xc8, 0x13, 0x89, 0x67, 0xaf, - 0xca, 0xab, 0xd1, 0x29, 0x2e, 0x86, 0x66, 0x53, 0x5c, 0xfc, 0xa1, 0xec, 0x2b, 0xb1, 0xd7, 0x9f, - 0xca, 0x6b, 0xe9, 0xed, 0x47, 0xa4, 0xdc, 0x7e, 0xfe, 0x56, 0x54, 0x4b, 0x7f, 0xc6, 0xa8, 0x94, - 0xa2, 0xe3, 0x37, 0x8d, 0x86, 0x8d, 0xdf, 0xd4, 0x27, 0x90, 0xf1, 0x8d, 0x83, 0xd0, 0xaa, 0xf1, - 0x2e, 0x1b, 0x87, 0xd0, 0x14, 0x49, 0x01, 0x47, 0xf6, 0xc8, 0x7c, 0x23, 0x34, 0xd1, 0x61, 0x8f, - 0xec, 0x6f, 0x83, 0x62, 0xf4, 0x6c, 0x76, 0x4d, 0x78, 0xcf, 0x29, 0xe5, 0xe8, 0xec, 0x9a, 0x20, - 0x60, 0xb3, 0x6b, 0xd2, 0xe7, 0x6e, 0x0a, 0x46, 0x85, 0x16, 0x71, 0xa7, 0x40, 0xd3, 0x5a, 0x51, - 0x26, 0x63, 0xaf, 0x88, 0x62, 0x78, 0x36, 0x3b, 0xc5, 0x61, 0xb8, 0x5e, 0x73, 0xd8, 0x44, 0xc3, - 0x6c, 0x2d, 0xd9, 0xba, 0x63, 0x54, 0xa9, 0x65, 0x28, 0x53, 0xb1, 0xf5, 0x3a, 0x85, 0x06, 0xd7, - 0xeb, 0x14, 0x38, 0x46, 0x37, 0x8a, 0xc1, 0x35, 0x5a, 0xa7, 0xe6, 0x3d, 0xaa, 0xdc, 0x44, 0xb6, - 0xc5, 0x4e, 0x6c, 0x05, 0xd9, 0x74, 0x8f, 0xd6, 0x89, 0x03, 0xb3, 0xd5, 0x67, 0x37, 0xaa, 0x6f, - 0xcc, 0x04, 0x2f, 0x67, 0x17, 0x1c, 0xda, 0xd2, 0x1d, 0xaa, 0x4c, 0x47, 0x6d, 0xf5, 0x54, 0x22, - 0x66, 0xab, 0xa7, 0x22, 0x92, 0x6c, 0xfd, 0xb1, 0x50, 0xe9, 0xc6, 0x36, 0x1c, 0x11, 0xe9, 0xa5, - 0xd9, 0xec, 0x14, 0x45, 0x30, 0x01, 0xcd, 0xd8, 0xd6, 0x0a, 0x9e, 0x54, 0xbc, 0x1e, 0x9d, 0x9d, - 0x3a, 0x53, 0xb2, 0xd9, 0xa9, 0x33, 0x96, 0xa9, 0x7a, 0x14, 0xcb, 0xc7, 0xe0, 0xad, 0xa8, 0xaa, - 0xa7, 0x90, 0x30, 0x55, 0x4f, 0x01, 0x27, 0x19, 0x6a, 0xd4, 0xa5, 0x9e, 0x32, 0xd3, 0x8d, 0x21, - 0x92, 0x24, 0x19, 0x22, 0x38, 0xc9, 0x70, 0x8a, 0x7a, 0xf5, 0x55, 0x65, 0xb6, 0x1b, 0x43, 0x24, - 0x49, 0x32, 0x44, 0x30, 0xdb, 0x6c, 0x46, 0xc1, 0xe3, 0xed, 0xc6, 0x9a, 0xdf, 0x67, 0x73, 0xd1, - 0xcd, 0x66, 0x47, 0x42, 0xb6, 0xd9, 0xec, 0x88, 0x24, 0x9f, 0xd9, 0xb1, 0x77, 0xa7, 0x32, 0x8f, - 0x15, 0x5e, 0x0d, 0xed, 0x82, 0x9d, 0x94, 0x9a, 0xee, 0xd1, 0x76, 0xea, 0x3d, 0xfa, 0x81, 0xc0, - 0x15, 0x4a, 0x59, 0xc0, 0xaa, 0x4e, 0x04, 0x67, 0x15, 0x1c, 0x3c, 0xdd, 0xa3, 0x05, 0xce, 0x52, - 0xcf, 0xc3, 0x20, 0x7e, 0x54, 0xc5, 0x32, 0xbd, 0xf2, 0xb8, 0xf2, 0x46, 0x74, 0xcb, 0x24, 0xa1, - 0xd8, 0x96, 0x49, 0xfa, 0xc9, 0x26, 0x71, 0xfc, 0xc9, 0xa7, 0x98, 0xf2, 0xb8, 0xa2, 0x45, 0x27, - 0xf1, 0x08, 0x92, 0x4d, 0xe2, 0x11, 0x40, 0x50, 0x6f, 0xd9, 0xb1, 0x5b, 0xe5, 0x71, 0xa5, 0x9a, - 0x52, 0x2f, 0x47, 0x05, 0xf5, 0xf2, 0x9f, 0x41, 0xbd, 0xd5, 0xd5, 0xb6, 0x57, 0x66, 0xdf, 0xb8, - 0x98, 0x52, 0xaf, 0x8f, 0x0c, 0xea, 0xf5, 0x01, 0x6c, 0x2a, 0x44, 0xc0, 0x82, 0x63, 0xb3, 0x49, - 0xfb, 0x96, 0xd9, 0x68, 0x28, 0xb7, 0xa3, 0x53, 0x61, 0x1c, 0xcf, 0xa6, 0xc2, 0x38, 0x8c, 0x99, - 0x9e, 0xbc, 0x55, 0x74, 0xa9, 0xbd, 0xa2, 0xdc, 0x89, 0x9a, 0x9e, 0x21, 0x86, 0x99, 0x9e, 0xe1, - 0x2f, 0xdc, 0x5d, 0xb0, 0x5f, 0x1a, 0x5d, 0x76, 0xa8, 0xbb, 0xaa, 0xdc, 0x8d, 0xed, 0x2e, 0x24, - 0x1c, 0xee, 0x2e, 0xa4, 0xdf, 0x64, 0x05, 0x1e, 0x8e, 0x2c, 0x34, 0xfe, 0xdd, 0x53, 0x95, 0xea, - 0x4e, 0x7d, 0x55, 0xf9, 0x08, 0xb2, 0x7a, 0x2c, 0x75, 0xa9, 0x8a, 0x92, 0x4e, 0xf7, 0x68, 0xdd, - 0x38, 0xe1, 0xb6, 0xfc, 0x8d, 0x19, 0x1e, 0x86, 0x50, 0x5b, 0x98, 0xf0, 0x37, 0xa1, 0x6f, 0xc6, - 0xb6, 0xe5, 0x49, 0x12, 0xdc, 0x96, 0x27, 0xc1, 0xa4, 0x05, 0x17, 0x63, 0x5b, 0xb5, 0x59, 0xbd, - 0xc1, 0xf6, 0x25, 0xd4, 0x58, 0xd0, 0xeb, 0x6b, 0xd4, 0x53, 0x3e, 0x8a, 0xbc, 0x2f, 0x75, 0xd8, - 0xf0, 0xc5, 0xa8, 0xa7, 0x7b, 0xb4, 0x6d, 0xf8, 0x11, 0x15, 0xf2, 0xd5, 0xa9, 0xc5, 0x05, 0xe5, - 0x63, 0xd1, 0xf3, 0x4d, 0x06, 0x9b, 0xee, 0xd1, 0x10, 0xc7, 0xac, 0xb4, 0xdb, 0xad, 0x15, 0x47, - 0x37, 0x28, 0x37, 0xb4, 0xd0, 0x76, 0x13, 0x06, 0xe8, 0xc7, 0xa3, 0x56, 0x5a, 0x27, 0x3a, 0x66, - 0xa5, 0x75, 0xc2, 0x31, 0x45, 0x8d, 0x44, 0xdc, 0x57, 0x3e, 0x11, 0x55, 0xd4, 0x08, 0x92, 0x29, - 0x6a, 0x34, 0x3e, 0xff, 0x47, 0xe0, 0x4c, 0xb0, 0x9f, 0x17, 0xeb, 0x2f, 0xef, 0x34, 0xe5, 0x93, - 0xc8, 0xe7, 0x62, 0xe2, 0x32, 0x20, 0x42, 0x35, 0xdd, 0xa3, 0x75, 0x28, 0xcf, 0x56, 0xdc, 0x44, - 0x32, 0x19, 0x61, 0x5e, 0x7c, 0x4f, 0x74, 0xc5, 0xed, 0x40, 0xc6, 0x56, 0xdc, 0x0e, 0xa8, 0x54, - 0xe6, 0x42, 0xa8, 0xfa, 0x36, 0xcc, 0x03, 0x99, 0x76, 0xe2, 0x90, 0xca, 0x5c, 0x58, 0x6a, 0x4b, - 0xdb, 0x30, 0x0f, 0xac, 0xb5, 0x4e, 0x1c, 0xc8, 0x65, 0x28, 0x54, 0xab, 0xb3, 0x5a, 0xdb, 0x52, - 0xea, 0x31, 0x1f, 0x30, 0x84, 0x4e, 0xf7, 0x68, 0x02, 0xcf, 0xcc, 0xa0, 0xc9, 0x86, 0xee, 0x7a, - 0x66, 0xdd, 0xc5, 0x11, 0xe3, 0x8f, 0x10, 0x23, 0x6a, 0x06, 0xa5, 0xd1, 0x30, 0x33, 0x28, 0x0d, - 0xce, 0xec, 0xc5, 0x09, 0xdd, 0x75, 0x75, 0xcb, 0x70, 0xf4, 0x71, 0x5c, 0x26, 0x68, 0xec, 0x8d, - 0x41, 0x04, 0xcb, 0xec, 0xc5, 0x28, 0x04, 0x0f, 0xdf, 0x7d, 0x88, 0x6f, 0xe6, 0x2c, 0xc7, 0x0e, - 0xdf, 0x63, 0x78, 0x3c, 0x7c, 0x8f, 0xc1, 0xd0, 0xee, 0xf4, 0x61, 0x1a, 0x5d, 0x31, 0x99, 0x88, - 0x94, 0x95, 0x98, 0xdd, 0x19, 0x27, 0x40, 0xbb, 0x33, 0x0e, 0x8c, 0x34, 0xc9, 0x5f, 0x6e, 0x57, - 0x3b, 0x34, 0x29, 0x5c, 0x65, 0x13, 0x65, 0xd8, 0xfa, 0x1d, 0x0e, 0x8e, 0xf2, 0x86, 0xa5, 0x37, - 0xed, 0xf2, 0xb8, 0x2f, 0x75, 0x33, 0xba, 0x7e, 0x77, 0x24, 0x64, 0xeb, 0x77, 0x47, 0x24, 0x9b, - 0x5d, 0xfd, 0x8d, 0xd6, 0xaa, 0xee, 0x50, 0xa3, 0x6c, 0x3a, 0x78, 0xb2, 0xb8, 0xc1, 0xb7, 0x86, - 0x6f, 0x45, 0x67, 0xd7, 0x2e, 0xa4, 0x6c, 0x76, 0xed, 0x82, 0x66, 0x46, 0x5e, 0x3a, 0x5a, 0xa3, - 0xba, 0xa1, 0xac, 0x45, 0x8d, 0xbc, 0xce, 0x94, 0xcc, 0xc8, 0xeb, 0x8c, 0xed, 0xfc, 0x39, 0x77, - 0x1d, 0xd3, 0xa3, 0x4a, 0x63, 0x27, 0x9f, 0x83, 0xa4, 0x9d, 0x3f, 0x07, 0xd1, 0x6c, 0x43, 0x18, - 0xef, 0x90, 0x66, 0x74, 0x43, 0x98, 0xec, 0x86, 0x78, 0x09, 0x66, 0xb1, 0x88, 0xa7, 0x26, 0x8a, - 0x15, 0xb5, 0x58, 0x04, 0x98, 0x59, 0x2c, 0xe1, 0x63, 0x94, 0xc8, 0x03, 0x03, 0xc5, 0x8e, 0xae, - 0xa1, 0x32, 0x8e, 0xad, 0xa1, 0x91, 0xc7, 0x08, 0xcf, 0x47, 0xbc, 0x67, 0x95, 0x56, 0xd4, 0xea, - 0x90, 0x50, 0xcc, 0xea, 0x90, 0xfd, 0x6c, 0x27, 0xe0, 0x04, 0xde, 0x82, 0x6b, 0xed, 0xe0, 0x1e, - 0xe7, 0x53, 0xd1, 0xcf, 0x8c, 0xa1, 0xd9, 0x67, 0xc6, 0x40, 0x11, 0x26, 0x62, 0xda, 0x72, 0x3a, - 0x30, 0x09, 0xcf, 0x07, 0x63, 0x20, 0x32, 0x03, 0xa4, 0x5a, 0x9a, 0x9d, 0xa9, 0x18, 0x0b, 0xf2, - 0x15, 0x99, 0x1b, 0x3d, 0x81, 0x4d, 0x52, 0x4c, 0xf7, 0x68, 0x29, 0xe5, 0xc8, 0x5b, 0x70, 0x5e, - 0x40, 0xc5, 0x3b, 0x42, 0xcc, 0x39, 0x6d, 0x04, 0x0b, 0x82, 0x17, 0xf5, 0xce, 0xe8, 0x46, 0x3b, - 0xdd, 0xa3, 0x75, 0xe5, 0xd5, 0xb9, 0x2e, 0xb1, 0x3e, 0xb4, 0x77, 0x52, 0x57, 0xb0, 0x48, 0x74, - 0xe5, 0xd5, 0xb9, 0x2e, 0x21, 0xf7, 0x7b, 0x3b, 0xa9, 0x2b, 0xe8, 0x84, 0xae, 0xbc, 0x88, 0x0b, - 0xc5, 0x6e, 0xf8, 0x52, 0xa3, 0xa1, 0xac, 0x63, 0x75, 0xef, 0xdf, 0x49, 0x75, 0x25, 0x34, 0x38, - 0xb7, 0xe3, 0xc8, 0x66, 0xe9, 0xf9, 0x16, 0xb5, 0xaa, 0x91, 0x05, 0xe8, 0x7e, 0x74, 0x96, 0x4e, - 0x10, 0xb0, 0x59, 0x3a, 0x01, 0x64, 0x03, 0x4a, 0x76, 0xc2, 0x56, 0x36, 0xa2, 0x03, 0x4a, 0xc6, - 0xb1, 0x01, 0x15, 0x71, 0xd8, 0x9e, 0x87, 0x93, 0xf3, 0x6b, 0x9e, 0xee, 0x5b, 0x90, 0xae, 0xe8, - 0xca, 0xb7, 0x63, 0x97, 0x4c, 0x49, 0x12, 0xbc, 0x64, 0x4a, 0x82, 0xd9, 0x18, 0x61, 0xe0, 0xea, - 0x86, 0x55, 0x9f, 0xd2, 0xcd, 0x46, 0xdb, 0xa1, 0xca, 0x7f, 0x14, 0x1d, 0x23, 0x31, 0x34, 0x1b, - 0x23, 0x31, 0x10, 0x5b, 0xa0, 0x19, 0xa8, 0xe4, 0xba, 0xe6, 0x8a, 0x25, 0xf6, 0x95, 0xed, 0x86, - 0xa7, 0xfc, 0xc7, 0xd1, 0x05, 0x3a, 0x8d, 0x86, 0x2d, 0xd0, 0x69, 0x70, 0x3c, 0x75, 0x4a, 0xc9, - 0xc7, 0xae, 0xfc, 0x27, 0xb1, 0x53, 0xa7, 0x14, 0x1a, 0x3c, 0x75, 0x4a, 0xcb, 0xe5, 0x3e, 0x05, - 0xa3, 0xdc, 0x26, 0x9b, 0x31, 0x83, 0xbb, 0xea, 0xff, 0x34, 0xba, 0x3e, 0xc6, 0xf1, 0x6c, 0x7d, - 0x8c, 0xc3, 0xa2, 0x7c, 0x44, 0x17, 0xfc, 0x67, 0x9d, 0xf8, 0x04, 0xf2, 0x4f, 0x94, 0x21, 0x37, - 0x65, 0x3e, 0x62, 0xa4, 0x7c, 0x6f, 0xa6, 0x13, 0xa3, 0x60, 0x78, 0x24, 0x0a, 0x45, 0x19, 0x69, - 0xf4, 0x9e, 0x49, 0xd7, 0x95, 0x4f, 0x77, 0x64, 0xc4, 0x09, 0xa2, 0x8c, 0x38, 0x8c, 0xbc, 0x09, - 0x67, 0x42, 0xd8, 0x2c, 0x6d, 0x2e, 0x05, 0x33, 0xd3, 0xf7, 0x65, 0xa2, 0x66, 0x70, 0x3a, 0x19, - 0x33, 0x83, 0xd3, 0x31, 0x69, 0xac, 0x85, 0xe8, 0xfe, 0xf3, 0x6d, 0x58, 0x07, 0x12, 0xec, 0xc0, - 0x20, 0x8d, 0xb5, 0x90, 0xe6, 0xf7, 0x6f, 0xc3, 0x3a, 0x90, 0x69, 0x07, 0x06, 0xe4, 0xb3, 0x19, - 0xb8, 0x94, 0x8e, 0x2a, 0x35, 0x1a, 0x53, 0xb6, 0x13, 0xe2, 0x94, 0x1f, 0xc8, 0x44, 0x0f, 0x1a, - 0x76, 0x56, 0x6c, 0xba, 0x47, 0xdb, 0x61, 0x05, 0xe4, 0xc3, 0x30, 0x5c, 0x6a, 0x1b, 0xa6, 0x87, - 0x17, 0x6f, 0xcc, 0x70, 0xfe, 0xc1, 0x4c, 0x6c, 0x8b, 0x23, 0x63, 0x71, 0x8b, 0x23, 0x03, 0xc8, - 0xeb, 0x30, 0x56, 0xa5, 0xf5, 0xb6, 0x63, 0x7a, 0x1b, 0x1a, 0xe6, 0xda, 0x67, 0x3c, 0x7e, 0x28, - 0x13, 0x9d, 0xc4, 0x12, 0x14, 0x6c, 0x12, 0x4b, 0x00, 0xc9, 0x9d, 0x0e, 0x19, 0xd9, 0x95, 0xcf, - 0x64, 0xba, 0x5e, 0xcb, 0x07, 0x7d, 0xd9, 0x21, 0xa1, 0xfb, 0x42, 0x6a, 0x86, 0x6b, 0xe5, 0xb3, - 0x99, 0x2e, 0xd7, 0xe8, 0xd2, 0x0c, 0x97, 0x92, 0x1c, 0x7b, 0x21, 0x35, 0xfd, 0xb0, 0xf2, 0xc3, - 0x99, 0x2e, 0xd7, 0xde, 0x21, 0xc7, 0xb4, 0xcc, 0xc5, 0xcf, 0x72, 0x4f, 0x11, 0xc1, 0xe8, 0xbf, - 0xc8, 0x24, 0x5d, 0x45, 0x82, 0xf2, 0x12, 0x21, 0x2b, 0x76, 0xdb, 0x0d, 0x94, 0xfe, 0x73, 0x99, - 0xa4, 0x6f, 0x5e, 0x58, 0x2c, 0xfc, 0x45, 0x28, 0x9c, 0x9b, 0xbc, 0xef, 0x51, 0xc7, 0xd2, 0x1b, - 0xd8, 0x9d, 0x55, 0xcf, 0x76, 0xf4, 0x15, 0x3a, 0x69, 0xe9, 0x4b, 0x0d, 0xaa, 0x7c, 0x3e, 0x13, - 0xb5, 0x60, 0x3b, 0x93, 0x32, 0x0b, 0xb6, 0x33, 0x96, 0xac, 0xc2, 0xc3, 0x69, 0xd8, 0xb2, 0xe9, - 0x62, 0x3d, 0x5f, 0xc8, 0x44, 0x4d, 0xd8, 0x2e, 0xb4, 0xcc, 0x84, 0xed, 0x82, 0x26, 0xd7, 0x61, - 0x60, 0xdc, 0xf6, 0xa7, 0xdf, 0x1f, 0x89, 0x39, 0x43, 0x06, 0x98, 0xe9, 0x1e, 0x2d, 0x24, 0x13, - 0x65, 0xc4, 0xa0, 0xfe, 0x62, 0xb2, 0x4c, 0x78, 0xf9, 0x14, 0xfc, 0x10, 0x65, 0x84, 0xb8, 0xff, - 0xcb, 0x64, 0x99, 0xf0, 0x8e, 0x2b, 0xf8, 0xc1, 0x66, 0x12, 0x5e, 0xe3, 0xec, 0x54, 0x89, 0xd9, - 0x6d, 0x13, 0xab, 0x7a, 0xa3, 0x41, 0xad, 0x15, 0xaa, 0x7c, 0x29, 0x36, 0x93, 0xa4, 0x93, 0xb1, - 0x99, 0x24, 0x1d, 0x43, 0x3e, 0x0e, 0x67, 0xef, 0xe8, 0x0d, 0xd3, 0x08, 0x71, 0x7e, 0x32, 0x5a, - 0xe5, 0x47, 0x33, 0xd1, 0xdd, 0x74, 0x07, 0x3a, 0xb6, 0x9b, 0xee, 0x80, 0x22, 0xb3, 0x40, 0x70, - 0x19, 0x0d, 0x66, 0x0b, 0xb6, 0x3e, 0x2b, 0xff, 0x55, 0x26, 0x6a, 0xa7, 0x26, 0x49, 0x98, 0x9d, - 0x9a, 0x84, 0x92, 0x5a, 0xe7, 0xa8, 0xf6, 0xca, 0x8f, 0x65, 0xa2, 0xa7, 0x35, 0x9d, 0x08, 0xa7, - 0x7b, 0xb4, 0xce, 0xa1, 0xf1, 0x6f, 0xc2, 0x68, 0x75, 0xa1, 0x32, 0x35, 0x35, 0x59, 0xbd, 0x53, - 0x29, 0xa3, 0xfb, 0xae, 0xa1, 0xfc, 0x78, 0x6c, 0xc5, 0x8a, 0x13, 0xb0, 0x15, 0x2b, 0x0e, 0x23, - 0x2f, 0xc1, 0x10, 0x6b, 0x3f, 0x1b, 0x30, 0xf8, 0xc9, 0x5f, 0xce, 0x44, 0xcd, 0x29, 0x19, 0xc9, - 0xcc, 0x29, 0xf9, 0x37, 0xa9, 0xc2, 0x29, 0x26, 0xc5, 0x05, 0x87, 0x2e, 0x53, 0x87, 0x5a, 0x75, - 0x7f, 0x4c, 0xff, 0x44, 0x26, 0x6a, 0x65, 0xa4, 0x11, 0x31, 0x2b, 0x23, 0x0d, 0x4e, 0xd6, 0xe0, - 0x7c, 0xfc, 0x24, 0x48, 0x7e, 0x4c, 0xa5, 0xfc, 0x64, 0x26, 0x66, 0x0c, 0x77, 0x21, 0x46, 0x63, - 0xb8, 0x0b, 0x9e, 0x58, 0x70, 0x41, 0x1c, 0xab, 0x08, 0x87, 0xcb, 0x78, 0x6d, 0xff, 0x35, 0xaf, - 0xed, 0xf1, 0xd0, 0x21, 0xb0, 0x0b, 0xf5, 0x74, 0x8f, 0xd6, 0x9d, 0x1d, 0xd3, 0xb3, 0x64, 0xec, - 0x76, 0xe5, 0xa7, 0x32, 0xe9, 0x1e, 0x29, 0x11, 0x37, 0xe5, 0xb4, 0xa0, 0xef, 0x6f, 0x76, 0x8a, - 0x3c, 0xae, 0xfc, 0x74, 0x6c, 0xbc, 0xa5, 0x93, 0xb1, 0xf1, 0xd6, 0x21, 0x74, 0xf9, 0xeb, 0x30, - 0xc6, 0x95, 0x7a, 0x41, 0xc7, 0x61, 0x68, 0xad, 0x50, 0x43, 0xf9, 0x6f, 0x62, 0xab, 0x5d, 0x82, - 0x02, 0x5d, 0x7b, 0xe2, 0x40, 0x36, 0x75, 0x57, 0x5b, 0xba, 0x65, 0xe1, 0x31, 0xab, 0xf2, 0xdf, - 0xc6, 0xa6, 0xee, 0x10, 0x85, 0x8e, 0xbb, 0xc1, 0x2f, 0xa6, 0x09, 0xdd, 0xb2, 0x76, 0x28, 0x3f, - 0x13, 0xd3, 0x84, 0x6e, 0xc4, 0x4c, 0x13, 0xba, 0xa6, 0x00, 0xb9, 0xd3, 0xe1, 0x61, 0xa3, 0xf2, - 0x95, 0xd8, 0x8a, 0x9c, 0x4a, 0xc5, 0x56, 0xe4, 0xf4, 0x77, 0x91, 0x77, 0x3a, 0x3c, 0x0a, 0x54, - 0x7e, 0xb6, 0x3b, 0xdf, 0x70, 0xa5, 0x4f, 0x7f, 0x53, 0x78, 0xa7, 0xc3, 0x83, 0x3a, 0xe5, 0xe7, - 0xba, 0xf3, 0x0d, 0x1d, 0xfb, 0xd2, 0xdf, 0xe3, 0xd5, 0x3a, 0x3f, 0x46, 0x53, 0x7e, 0x3e, 0x3e, - 0x75, 0x75, 0x20, 0xc4, 0xa9, 0xab, 0xd3, 0x8b, 0xb6, 0x25, 0x78, 0x88, 0x6b, 0xc8, 0x4d, 0x47, - 0x6f, 0xad, 0x56, 0xa9, 0xe7, 0x99, 0xd6, 0x8a, 0xbf, 0x13, 0xfb, 0x85, 0x4c, 0xec, 0x78, 0xac, - 0x13, 0x25, 0x1e, 0x8f, 0x75, 0x42, 0x32, 0xe5, 0x4d, 0x3c, 0x3b, 0x53, 0x7e, 0x31, 0xa6, 0xbc, - 0x09, 0x0a, 0xa6, 0xbc, 0xc9, 0xd7, 0x6a, 0xaf, 0xa7, 0xbc, 0xae, 0x52, 0xfe, 0xbb, 0xce, 0xbc, - 0x82, 0xf6, 0xa5, 0x3c, 0xca, 0x7a, 0x3d, 0xe5, 0x11, 0x91, 0xf2, 0xdf, 0x77, 0xe6, 0x15, 0xfa, - 0x20, 0x25, 0x80, 0xe3, 0x7d, 0xd0, 0x8b, 0xbb, 0x5a, 0xf5, 0x2b, 0x19, 0x18, 0xaa, 0x7a, 0x0e, - 0xd5, 0x9b, 0x22, 0xa2, 0xc4, 0x39, 0xe8, 0xe7, 0xee, 0x61, 0xfe, 0x0b, 0x0d, 0x2d, 0xf8, 0x4d, - 0x2e, 0xc1, 0xc8, 0x8c, 0xee, 0x7a, 0x58, 0xb2, 0x62, 0x19, 0xf4, 0x3e, 0x3e, 0x8d, 0xc8, 0x69, - 0x31, 0x28, 0x99, 0xe1, 0x74, 0xbc, 0x1c, 0x06, 0x11, 0xca, 0x6d, 0x1b, 0x48, 0xa1, 0xff, 0x9d, - 0xcd, 0x62, 0x0f, 0xc6, 0x4d, 0x88, 0x95, 0x55, 0xbf, 0x91, 0x81, 0x84, 0xe3, 0xda, 0xde, 0x5f, - 0x4e, 0xcd, 0xc3, 0x89, 0x58, 0xe0, 0x2a, 0xf1, 0xbe, 0x63, 0x87, 0x71, 0xad, 0xe2, 0xa5, 0xc9, - 0xfb, 0x83, 0x77, 0x05, 0xb7, 0xb5, 0x19, 0x11, 0x24, 0xa3, 0x6f, 0x6b, 0xb3, 0x98, 0x6b, 0x3b, - 0x0d, 0x4d, 0x42, 0x89, 0x47, 0xd0, 0xdf, 0x19, 0x0d, 0xa3, 0xf2, 0x90, 0x4b, 0xe2, 0x19, 0x57, - 0x26, 0x0c, 0xad, 0x11, 0xcb, 0xf9, 0xc8, 0x9f, 0x6d, 0x7d, 0x18, 0x86, 0x2a, 0xcd, 0x16, 0x75, - 0x5c, 0xdb, 0xd2, 0x3d, 0xdb, 0xcf, 0x2d, 0x8f, 0x61, 0x17, 0x4c, 0x09, 0x2e, 0x87, 0x02, 0x90, - 0xe9, 0xc9, 0x15, 0x3f, 0x0d, 0x45, 0x0e, 0xe3, 0x21, 0x61, 0x50, 0xcf, 0x78, 0x1e, 0x41, 0x4e, - 0xc1, 0x48, 0x6f, 0xbb, 0x3a, 0xbe, 0x40, 0x09, 0x48, 0xdb, 0x0c, 0x20, 0x93, 0x22, 0x05, 0x79, - 0x12, 0x0a, 0x78, 0x62, 0xe7, 0x62, 0x7a, 0x19, 0x11, 0xf0, 0xa3, 0x81, 0x10, 0x39, 0xbc, 0x02, - 0xa7, 0x21, 0xb7, 0x60, 0x34, 0xbc, 0x8e, 0xb8, 0xe9, 0xd8, 0xed, 0x96, 0x1f, 0x50, 0x1a, 0xf3, - 0x2f, 0xae, 0x05, 0xb8, 0xda, 0x0a, 0x22, 0x25, 0x16, 0x89, 0x82, 0x64, 0x1a, 0x4e, 0x84, 0x30, - 0x26, 0x22, 0x3f, 0x90, 0x3d, 0x26, 0x11, 0x92, 0x78, 0x31, 0x71, 0x46, 0x92, 0x08, 0xc5, 0x8a, - 0x91, 0x0a, 0xf4, 0xf9, 0xd1, 0x3e, 0xfa, 0xb7, 0x55, 0xd2, 0x93, 0x22, 0xda, 0x47, 0x9f, 0x1c, - 0xe7, 0xc3, 0x2f, 0x4f, 0xa6, 0x60, 0x44, 0xb3, 0xdb, 0x1e, 0x5d, 0xb4, 0xc5, 0x3a, 0x2e, 0xa2, - 0xca, 0x60, 0x9b, 0x1c, 0x86, 0xa9, 0x79, 0xb6, 0x9f, 0xbe, 0x52, 0x4e, 0xa3, 0x18, 0x2d, 0x45, - 0xe6, 0x60, 0x2c, 0x71, 0x71, 0x23, 0x27, 0x95, 0x94, 0x3e, 0x2f, 0xc9, 0x2c, 0x59, 0x94, 0xfc, - 0x60, 0x06, 0x0a, 0x8b, 0x8e, 0x6e, 0x7a, 0xae, 0x78, 0xbc, 0x72, 0xfa, 0xea, 0xba, 0xa3, 0xb7, - 0x98, 0x7e, 0x5c, 0xc5, 0x80, 0x57, 0x77, 0xf4, 0x46, 0x9b, 0xba, 0xe3, 0x77, 0xd9, 0xd7, 0xfd, - 0xfd, 0xcd, 0xe2, 0x4b, 0x2b, 0xb8, 0x3d, 0xbc, 0x5a, 0xb7, 0x9b, 0xd7, 0x56, 0x1c, 0xfd, 0x9e, - 0xe9, 0xe1, 0xd4, 0xa1, 0x37, 0xae, 0x79, 0xb4, 0x81, 0xbb, 0xd0, 0x6b, 0x7a, 0xcb, 0xbc, 0x86, - 0x81, 0x15, 0xaf, 0x05, 0x9c, 0x78, 0x0d, 0x4c, 0x05, 0x3c, 0xfc, 0x4b, 0x56, 0x01, 0x8e, 0x23, - 0x73, 0x6c, 0xf3, 0x86, 0x9f, 0x5a, 0x6a, 0xb5, 0xc4, 0x4b, 0x18, 0x69, 0xef, 0xe6, 0x63, 0xb8, - 0x62, 0x07, 0x02, 0xd3, 0x5b, 0x2d, 0x39, 0x6d, 0x6d, 0x48, 0xc7, 0xb4, 0x60, 0x51, 0xb4, 0xc8, - 0x17, 0xd3, 0x70, 0x28, 0x71, 0xbf, 0xb1, 0x29, 0x42, 0x8a, 0x17, 0x23, 0x4b, 0x70, 0x42, 0xf0, - 0x0d, 0x42, 0x0f, 0x8f, 0x44, 0x67, 0x85, 0x18, 0x9a, 0x2b, 0x6d, 0xd0, 0x46, 0x43, 0x80, 0xe5, - 0x3a, 0x62, 0x25, 0xc8, 0x78, 0x98, 0x0f, 0x6d, 0x4e, 0x6f, 0x52, 0x57, 0x39, 0x81, 0x1a, 0x7b, - 0x7e, 0x6b, 0xb3, 0xa8, 0xf8, 0xe5, 0x31, 0xf0, 0x4d, 0x6a, 0x76, 0x4f, 0x2c, 0x22, 0xf3, 0xe0, - 0x5a, 0x3f, 0x9a, 0xc2, 0x23, 0xae, 0xf3, 0xd1, 0x22, 0x64, 0x02, 0x86, 0x03, 0x47, 0xdc, 0xdb, - 0xb7, 0x2b, 0x65, 0x7c, 0x6a, 0x23, 0x62, 0x1f, 0xc5, 0x82, 0x03, 0xcb, 0x4c, 0x22, 0x65, 0xa4, - 0x37, 0x79, 0xfc, 0xed, 0x4d, 0xec, 0x4d, 0x5e, 0x2b, 0xe5, 0x4d, 0xde, 0x02, 0x79, 0x05, 0x06, - 0x4b, 0x77, 0xab, 0xe2, 0xad, 0xa1, 0xab, 0x9c, 0x0c, 0xc3, 0xc9, 0x63, 0x82, 0x57, 0xf1, 0x2e, - 0x51, 0x6e, 0xba, 0x4c, 0x4f, 0x26, 0x61, 0x24, 0x72, 0x97, 0xef, 0x2a, 0xa7, 0x90, 0x03, 0xb6, - 0x5c, 0x47, 0x4c, 0xcd, 0x11, 0xa8, 0x48, 0xca, 0xe1, 0x48, 0x21, 0xa6, 0x35, 0x6c, 0x3b, 0xdc, - 0x68, 0xd8, 0xeb, 0x1a, 0xc5, 0x67, 0x8d, 0xf8, 0x70, 0xa7, 0x9f, 0x6b, 0x8d, 0x21, 0x50, 0x35, - 0x87, 0xe3, 0x22, 0x39, 0x86, 0xa3, 0xc5, 0xc8, 0x5b, 0x40, 0x30, 0x98, 0x37, 0x35, 0xfc, 0xa3, - 0xdd, 0x4a, 0xd9, 0x55, 0xce, 0x60, 0xe0, 0x3f, 0x12, 0x7f, 0x57, 0x5b, 0x29, 0x8f, 0x5f, 0x12, - 0xd3, 0xc7, 0x45, 0x9d, 0x97, 0xaa, 0x39, 0x02, 0x57, 0x33, 0x23, 0x99, 0xce, 0x52, 0xb8, 0x92, - 0x75, 0x38, 0xbb, 0xe0, 0xd0, 0x7b, 0xa6, 0xdd, 0x76, 0xfd, 0xe5, 0xc3, 0x9f, 0xb7, 0xce, 0x6e, - 0x3b, 0x6f, 0x3d, 0x2a, 0x2a, 0x3e, 0xdd, 0x72, 0xe8, 0xbd, 0x9a, 0x1f, 0xee, 0x2d, 0x12, 0xad, - 0xa8, 0x13, 0x77, 0xcc, 0xd7, 0xf6, 0x76, 0xdb, 0xa1, 0x02, 0x6e, 0x52, 0x57, 0x51, 0xc2, 0xa9, - 0x96, 0xbf, 0x50, 0x35, 0x03, 0x5c, 0x24, 0x5f, 0x5b, 0xb4, 0x18, 0xd1, 0x80, 0xdc, 0x9c, 0xf0, - 0x8f, 0xf9, 0x4b, 0x75, 0x9e, 0xd5, 0x4a, 0x79, 0x08, 0x99, 0xa9, 0x4c, 0x2c, 0x2b, 0xf5, 0x20, - 0xf4, 0x63, 0x4d, 0x17, 0x78, 0x59, 0x2c, 0xc9, 0xd2, 0x64, 0x06, 0x46, 0x17, 0x1c, 0xdc, 0x74, - 0xdc, 0xa2, 0x1b, 0x0b, 0x76, 0xc3, 0xac, 0x6f, 0xe0, 0xfb, 0x21, 0x31, 0x55, 0xb6, 0x38, 0xae, - 0xb6, 0x46, 0x37, 0x6a, 0x2d, 0xc4, 0xca, 0xcb, 0x4a, 0xbc, 0xa4, 0x1c, 0x8a, 0xed, 0xe1, 0x9d, - 0x85, 0x62, 0xa3, 0x30, 0x2a, 0x2e, 0x09, 0xee, 0x7b, 0xd4, 0x62, 0x4b, 0xbd, 0x2b, 0xde, 0x0a, - 0x29, 0xb1, 0x4b, 0x85, 0x00, 0x2f, 0xf2, 0x0d, 0xf3, 0x51, 0x46, 0x03, 0xb0, 0xdc, 0xb0, 0x78, - 0x91, 0x64, 0xbc, 0xb2, 0x0b, 0x7b, 0x88, 0x57, 0xf6, 0xbf, 0xe4, 0xe4, 0xf9, 0x97, 0x9c, 0x87, - 0xbc, 0x14, 0x4e, 0x1c, 0x83, 0x31, 0x61, 0xe8, 0xc5, 0xbc, 0x88, 0x31, 0x37, 0x20, 0x6c, 0x97, - 0xe0, 0xd5, 0x2d, 0x26, 0x89, 0x09, 0x03, 0xf4, 0x68, 0x21, 0x01, 0x26, 0xe8, 0x68, 0x2f, 0x35, - 0xcc, 0x3a, 0x06, 0xe4, 0xcc, 0x49, 0x09, 0x3a, 0x10, 0xca, 0xe3, 0x71, 0x4a, 0x24, 0xe4, 0x3a, - 0x0c, 0xfa, 0x9b, 0xdd, 0x30, 0x18, 0x19, 0xc6, 0x69, 0xf4, 0xd3, 0x3b, 0xf3, 0x30, 0x90, 0x12, - 0x11, 0x79, 0x11, 0x13, 0x9c, 0xfb, 0x2f, 0x9a, 0x7b, 0x43, 0x1b, 0x48, 0x9e, 0x3d, 0x62, 0x19, - 0xce, 0xfd, 0x87, 0xcd, 0xe3, 0x30, 0x2c, 0xab, 0xa3, 0x9f, 0x92, 0x08, 0x27, 0xce, 0x88, 0x0e, - 0xcb, 0x0a, 0x12, 0x2d, 0x42, 0xe6, 0x61, 0x2c, 0xa1, 0x81, 0x22, 0x74, 0x19, 0xa6, 0xa5, 0x4c, - 0x51, 0x5f, 0x79, 0x61, 0x4e, 0x94, 0x25, 0x8f, 0x41, 0xee, 0xb6, 0x56, 0x11, 0xe1, 0x93, 0x78, - 0xe4, 0xad, 0xc8, 0xdb, 0x6a, 0x86, 0x55, 0xbf, 0x2f, 0x9b, 0x58, 0x9b, 0x98, 0xf4, 0x04, 0x2b, - 0xa9, 0x07, 0x51, 0x7a, 0x7e, 0xfd, 0x5c, 0x7a, 0x12, 0x11, 0xb9, 0x0c, 0xfd, 0xb1, 0x44, 0xe8, - 0xf8, 0x10, 0x3e, 0xc8, 0x82, 0x1e, 0x60, 0xc9, 0x75, 0x29, 0x93, 0x96, 0x14, 0x91, 0xd0, 0xcf, - 0xa4, 0x15, 0x0f, 0xcd, 0x87, 0x39, 0xb5, 0xae, 0xc7, 0x82, 0xf6, 0xfb, 0xf9, 0xaa, 0x93, 0xeb, - 0x62, 0x18, 0xa4, 0x3f, 0xb0, 0x4a, 0x7b, 0xb7, 0xb3, 0x4a, 0xd5, 0xdf, 0xcb, 0x24, 0xc7, 0x19, - 0xb9, 0x91, 0x0c, 0x0e, 0xc6, 0x53, 0x55, 0xfb, 0x40, 0xb9, 0xd6, 0x20, 0x4c, 0x58, 0x24, 0xcc, - 0x57, 0x76, 0xcf, 0x61, 0xbe, 0x72, 0xbb, 0x0c, 0xf3, 0xa5, 0xfe, 0xdb, 0x7c, 0x57, 0xa7, 0xb6, - 0x43, 0x09, 0x07, 0xf1, 0x02, 0xdb, 0x59, 0xb1, 0xda, 0x4b, 0x6e, 0x62, 0x7f, 0xc0, 0x7d, 0x76, - 0x6a, 0x3a, 0x1f, 0x5a, 0xae, 0x16, 0xa5, 0x24, 0xaf, 0xc2, 0x90, 0xff, 0x01, 0x18, 0x3e, 0x4e, - 0x0a, 0x7b, 0x16, 0xac, 0x6a, 0xf1, 0x6c, 0xe3, 0x72, 0x01, 0xf2, 0x2c, 0x0c, 0xa0, 0x4d, 0xd3, - 0xd2, 0xeb, 0x7e, 0x6c, 0x41, 0x1e, 0x8c, 0xd0, 0x07, 0xca, 0x21, 0x0f, 0x02, 0x4a, 0xf2, 0x09, - 0x28, 0x44, 0xd2, 0xdd, 0x5f, 0xdb, 0x81, 0x17, 0xe0, 0x55, 0x39, 0xb8, 0x2e, 0xdf, 0xa5, 0xc4, - 0x53, 0xdd, 0x0b, 0xa6, 0x64, 0x11, 0x4e, 0x2e, 0x38, 0xd4, 0x40, 0x7f, 0xd3, 0xc9, 0xfb, 0x2d, - 0x47, 0x84, 0x3e, 0xe6, 0xa3, 0x1c, 0x17, 0xa9, 0x96, 0x8f, 0x66, 0xcb, 0xa7, 0xc0, 0xcb, 0x01, - 0xce, 0x52, 0x8a, 0x33, 0xcb, 0x85, 0xb7, 0xe4, 0x16, 0xdd, 0x58, 0xc7, 0x94, 0xa7, 0xfd, 0xa1, - 0xe5, 0x22, 0x04, 0xbd, 0x26, 0x50, 0xb2, 0xe5, 0x12, 0x2d, 0x74, 0xee, 0x05, 0x18, 0xdc, 0x6b, - 0x80, 0xda, 0x5f, 0xcf, 0x76, 0x70, 0x0f, 0x7f, 0x70, 0x73, 0x84, 0x04, 0xd9, 0xe9, 0x7a, 0x3b, - 0x64, 0xa7, 0xfb, 0x76, 0xb6, 0x83, 0xef, 0xfb, 0x03, 0x9d, 0x45, 0x2a, 0x10, 0x46, 0x34, 0x8b, - 0x54, 0x98, 0xc0, 0xcb, 0x34, 0x34, 0x99, 0x28, 0x96, 0x6f, 0xae, 0xb0, 0x6d, 0xbe, 0xb9, 0x5f, - 0xca, 0x75, 0x7b, 0x1b, 0x70, 0x2c, 0xfb, 0xdd, 0xc8, 0xfe, 0x3a, 0x0c, 0x06, 0x92, 0xad, 0x94, - 0xd1, 0xe8, 0x19, 0x0e, 0xc2, 0x61, 0x73, 0x30, 0x96, 0x91, 0x88, 0xc8, 0x15, 0xde, 0xd6, 0xaa, - 0xf9, 0x36, 0x0f, 0xcc, 0x3a, 0x2c, 0x42, 0x6e, 0xea, 0x9e, 0x5e, 0x73, 0xcd, 0xb7, 0xa9, 0x16, - 0xa0, 0xd5, 0xff, 0x3d, 0x9b, 0xfa, 0xc0, 0xe2, 0xb8, 0x8f, 0x76, 0xd1, 0x47, 0x29, 0x42, 0xe4, - 0x4f, 0x43, 0x8e, 0x85, 0xb8, 0x0b, 0x21, 0xfe, 0x55, 0x36, 0xf5, 0x21, 0xcd, 0xb1, 0x10, 0x77, - 0x33, 0x5b, 0x3c, 0x09, 0x03, 0x9a, 0xbd, 0xee, 0x62, 0x72, 0x69, 0x31, 0x57, 0xe0, 0x44, 0xed, - 0xd8, 0xeb, 0x2e, 0x4f, 0xbc, 0xad, 0x85, 0x04, 0xea, 0x77, 0xb2, 0x5d, 0x9e, 0x1a, 0x1d, 0x0b, - 0xfe, 0xdd, 0x5c, 0x22, 0x7f, 0x2b, 0x1b, 0x79, 0xca, 0xf4, 0x40, 0xa7, 0x63, 0xad, 0xd6, 0x57, - 0x69, 0x53, 0x8f, 0xa7, 0x63, 0x75, 0x11, 0x2a, 0x92, 0xa2, 0x85, 0x24, 0xea, 0x57, 0xb3, 0xb1, - 0xb7, 0x5c, 0xc7, 0xb2, 0xdb, 0xb1, 0xec, 0x02, 0xad, 0x13, 0xcf, 0xd3, 0x8e, 0x25, 0xb7, 0x53, - 0xc9, 0x7d, 0x26, 0x1b, 0x7b, 0xc9, 0xf7, 0xc0, 0xca, 0x8e, 0x0d, 0xc0, 0xe4, 0x0b, 0xc3, 0x07, - 0x56, 0x93, 0x9e, 0x84, 0x01, 0x21, 0x87, 0x60, 0xa9, 0xe0, 0xf3, 0x3e, 0x07, 0xe2, 0x29, 0x6b, - 0x40, 0xa0, 0xfe, 0x40, 0x16, 0xa2, 0x2f, 0x2c, 0x1f, 0x50, 0x1d, 0xfa, 0xad, 0x6c, 0xf4, 0x6d, - 0xe9, 0x83, 0xab, 0x3f, 0x57, 0x01, 0xaa, 0xed, 0xa5, 0xba, 0x08, 0x4d, 0xd8, 0x2b, 0x1d, 0xd3, - 0x07, 0x50, 0x4d, 0xa2, 0x50, 0xff, 0x5d, 0x36, 0xf5, 0xc1, 0xeb, 0x83, 0x2b, 0xc0, 0x67, 0xf0, - 0x54, 0xbc, 0x6e, 0x85, 0x13, 0x39, 0x1e, 0x42, 0xb2, 0xf1, 0x97, 0xc8, 0x88, 0xe2, 0x13, 0x92, - 0x0f, 0xa5, 0x98, 0x6b, 0x18, 0xaf, 0x35, 0x34, 0xd7, 0xe4, 0x6b, 0x08, 0xc9, 0x70, 0xfb, 0x7f, - 0xb2, 0xdb, 0xbd, 0x0f, 0x7e, 0x90, 0x57, 0xd5, 0xbe, 0x05, 0x7d, 0x03, 0xe3, 0x58, 0xb1, 0x9e, - 0x18, 0xe2, 0xf9, 0x3a, 0x5a, 0x1c, 0x24, 0xdf, 0xbd, 0x09, 0x2a, 0xf5, 0x2f, 0x7b, 0xd3, 0x1f, - 0xa7, 0x3e, 0xb8, 0x22, 0x3c, 0x0f, 0xf9, 0x05, 0xdd, 0x5b, 0x15, 0x9a, 0x8c, 0x57, 0x7a, 0x2d, - 0xdd, 0x5b, 0xd5, 0x10, 0x4a, 0xae, 0x40, 0xbf, 0xa6, 0xaf, 0xf3, 0x33, 0xcf, 0x42, 0x98, 0x4b, - 0xc5, 0xd1, 0xd7, 0x6b, 0xfc, 0xdc, 0x33, 0x40, 0x13, 0x35, 0xc8, 0xe5, 0xc3, 0x4f, 0xbe, 0x31, - 0x91, 0x04, 0xcf, 0xe5, 0x13, 0x64, 0xf0, 0x39, 0x0f, 0xf9, 0x71, 0xdb, 0xd8, 0xc0, 0xeb, 0xab, - 0x21, 0x5e, 0xd9, 0x92, 0x6d, 0x6c, 0x68, 0x08, 0x25, 0x9f, 0xcd, 0x40, 0xdf, 0x34, 0xd5, 0x0d, - 0x36, 0x42, 0x06, 0xba, 0x79, 0x9d, 0x7c, 0xe4, 0x60, 0xbc, 0x4e, 0xc6, 0x56, 0x79, 0x65, 0xb2, - 0xa2, 0x88, 0xfa, 0xc9, 0x4d, 0xe8, 0x9f, 0xd0, 0x3d, 0xba, 0x62, 0x3b, 0x1b, 0xe8, 0x47, 0x33, - 0x12, 0x3a, 0x38, 0x46, 0xf4, 0xc7, 0x27, 0xe2, 0x37, 0x63, 0x75, 0xf1, 0x4b, 0x0b, 0x0a, 0x33, - 0xb1, 0x88, 0xec, 0xa2, 0x83, 0xa1, 0x58, 0x78, 0x1a, 0xd1, 0x20, 0x89, 0x68, 0x70, 0xac, 0x3c, - 0x94, 0x7e, 0xac, 0x8c, 0xd6, 0x23, 0xfa, 0xda, 0x61, 0x06, 0x9d, 0x61, 0x5c, 0xf4, 0xb9, 0xf5, - 0x88, 0x50, 0x4c, 0xa0, 0xa3, 0x49, 0x24, 0xea, 0x37, 0x7b, 0x21, 0xf5, 0x29, 0xdb, 0xb1, 0x92, - 0x1f, 0x2b, 0x79, 0xa8, 0xe4, 0xe5, 0x84, 0x92, 0x9f, 0x4b, 0x3e, 0x8e, 0x7c, 0x8f, 0x6a, 0xf8, - 0x97, 0xf3, 0x89, 0xa7, 0xd5, 0x0f, 0xf6, 0xee, 0x32, 0x94, 0x5e, 0xef, 0xb6, 0xd2, 0x0b, 0x06, - 0x44, 0x61, 0xdb, 0x01, 0xd1, 0xb7, 0xd3, 0x01, 0xd1, 0xdf, 0x71, 0x40, 0x84, 0x0a, 0x32, 0xd0, - 0x51, 0x41, 0x2a, 0x62, 0xd0, 0x40, 0xf7, 0xec, 0x6c, 0xe7, 0xb7, 0x36, 0x8b, 0x23, 0x6c, 0x34, - 0xa5, 0xe6, 0x65, 0x43, 0x16, 0xea, 0x37, 0xf2, 0x5d, 0xe2, 0x21, 0x1c, 0x8a, 0x8e, 0x3c, 0x03, - 0xb9, 0x52, 0xab, 0x25, 0xf4, 0xe3, 0xa4, 0x14, 0x8a, 0xa1, 0x43, 0x29, 0x46, 0x4d, 0x5e, 0x84, - 0x5c, 0xe9, 0x6e, 0x35, 0x1e, 0xd5, 0xbd, 0x74, 0xb7, 0x2a, 0xbe, 0xa4, 0x63, 0xd9, 0xbb, 0x55, - 0xf2, 0x72, 0x18, 0x5e, 0x6d, 0xb5, 0x6d, 0xad, 0x89, 0x8d, 0xa2, 0x70, 0xb7, 0xf5, 0xdd, 0x71, - 0xea, 0x0c, 0xc5, 0xb6, 0x8b, 0x31, 0xda, 0x98, 0x36, 0x15, 0x76, 0xae, 0x4d, 0x7d, 0xdb, 0x6a, - 0x53, 0xff, 0x4e, 0xb5, 0x69, 0x60, 0x07, 0xda, 0x04, 0xdb, 0x6a, 0xd3, 0xe0, 0xfe, 0xb5, 0xa9, - 0x05, 0xe7, 0x92, 0x31, 0x6c, 0x02, 0x8d, 0xd0, 0x80, 0x24, 0xb1, 0xc2, 0xb1, 0x04, 0xaf, 0xfe, - 0xdb, 0x1c, 0x5b, 0xe3, 0x59, 0x80, 0xe3, 0x39, 0x74, 0xb5, 0x94, 0xd2, 0xea, 0xaf, 0x67, 0x3b, - 0x87, 0xde, 0x39, 0x9a, 0x53, 0xdc, 0xf7, 0xa4, 0x4a, 0x29, 0x1f, 0x7d, 0x0a, 0xd9, 0x59, 0xca, - 0x31, 0xb6, 0x69, 0x32, 0xfb, 0x7a, 0xa6, 0x53, 0x3c, 0xa0, 0x7d, 0x49, 0xec, 0xf1, 0xa4, 0x47, - 0x1b, 0xfa, 0xe9, 0xbb, 0x51, 0x57, 0xb6, 0x78, 0x52, 0xd9, 0xdc, 0x1e, 0x93, 0xca, 0xfe, 0x5e, - 0x06, 0x4e, 0xde, 0x6a, 0x2f, 0x51, 0xe1, 0xc1, 0x16, 0x34, 0xe3, 0x2d, 0x00, 0x06, 0x16, 0x4e, - 0x2c, 0x19, 0x74, 0x62, 0xf9, 0x80, 0x1c, 0xcb, 0x27, 0x56, 0xe0, 0x6a, 0x48, 0xcd, 0x1d, 0x58, - 0x2e, 0xf8, 0xce, 0x9c, 0x6b, 0xed, 0x25, 0x5a, 0x4b, 0x78, 0xb2, 0x48, 0xdc, 0xcf, 0xbd, 0xc2, - 0xdd, 0xe4, 0xf7, 0xea, 0x34, 0xf2, 0xab, 0xd9, 0x8e, 0xe1, 0x93, 0x8e, 0x6c, 0xf6, 0x9a, 0x8f, - 0xa5, 0xf6, 0x4a, 0x3c, 0x8b, 0x4d, 0x0a, 0x49, 0x8c, 0x63, 0x1a, 0x97, 0x74, 0x81, 0x1d, 0xf1, - 0x9c, 0x4a, 0xef, 0xaa, 0xc0, 0xfe, 0x38, 0xd3, 0x31, 0xcc, 0xd5, 0x51, 0x15, 0x98, 0xfa, 0x4f, - 0x72, 0x7e, 0x74, 0xad, 0x7d, 0x7d, 0xc2, 0x93, 0x30, 0x20, 0x1e, 0x19, 0x46, 0x1d, 0x70, 0xc5, - 0x51, 0x1e, 0x1e, 0x0d, 0x07, 0x04, 0x6c, 0x99, 0x97, 0xbc, 0x83, 0x25, 0x07, 0x5c, 0xc9, 0x33, - 0x58, 0x93, 0x48, 0xd8, 0x42, 0x3e, 0x79, 0xdf, 0xf4, 0xd0, 0x2a, 0x60, 0x7d, 0x99, 0xe3, 0x0b, - 0x39, 0xbd, 0x6f, 0x7a, 0xdc, 0x26, 0x08, 0xd0, 0x6c, 0x91, 0xae, 0x86, 0x19, 0x23, 0xc5, 0x22, - 0xed, 0x8a, 0xc4, 0x99, 0xe2, 0xd9, 0xd8, 0x93, 0x30, 0x20, 0xbc, 0x5a, 0x85, 0x9b, 0x89, 0x68, - 0xad, 0xf0, 0x83, 0xc5, 0xd6, 0x06, 0x04, 0x8c, 0xa3, 0x46, 0x57, 0x42, 0xc7, 0x3a, 0xe4, 0xe8, - 0x20, 0x44, 0x13, 0x18, 0x72, 0x1d, 0x46, 0xaa, 0x9e, 0x6e, 0x19, 0xba, 0x63, 0xcc, 0xb7, 0xbd, - 0x56, 0xdb, 0x93, 0x8d, 0x52, 0xd7, 0x33, 0xec, 0xb6, 0xa7, 0xc5, 0x28, 0xc8, 0x07, 0x61, 0xd8, - 0x87, 0x4c, 0x3a, 0x8e, 0xed, 0xc8, 0x96, 0x87, 0xeb, 0x19, 0xd4, 0x71, 0xb4, 0x28, 0x01, 0xf9, - 0x10, 0x0c, 0x57, 0xac, 0x7b, 0x36, 0x4f, 0x45, 0x7a, 0x5b, 0x9b, 0x11, 0x76, 0x08, 0x3e, 0xc5, - 0x32, 0x03, 0x44, 0xad, 0xed, 0x34, 0xb4, 0x28, 0xa1, 0xba, 0x95, 0x4d, 0x06, 0x21, 0x7b, 0x70, - 0x37, 0x2d, 0x57, 0xa2, 0xce, 0x74, 0xe8, 0x41, 0x8a, 0x06, 0xa1, 0xec, 0xcb, 0xcb, 0xed, 0xc2, - 0xeb, 0xd0, 0x7f, 0x8b, 0x6e, 0x70, 0xbf, 0xcf, 0x42, 0xe8, 0x2a, 0xbc, 0x26, 0x60, 0xf2, 0x89, - 0xab, 0x4f, 0xa7, 0x7e, 0x2d, 0x9b, 0x0c, 0xaf, 0xf6, 0xe0, 0x0a, 0xfb, 0x83, 0xd0, 0x87, 0xa2, - 0xac, 0xf8, 0x47, 0xfe, 0x28, 0x40, 0x14, 0x77, 0xd4, 0x03, 0xd9, 0x27, 0x53, 0x7f, 0xb6, 0x10, - 0x8f, 0xb9, 0xf7, 0xe0, 0x4a, 0xef, 0x25, 0x18, 0x9c, 0xb0, 0x2d, 0xd7, 0x74, 0x3d, 0x6a, 0xd5, - 0x7d, 0x85, 0x7d, 0x88, 0x19, 0x54, 0xf5, 0x10, 0x2c, 0xbf, 0x41, 0x92, 0xa8, 0xf7, 0xa2, 0xbc, - 0xe4, 0x39, 0x18, 0x40, 0x91, 0xa3, 0x9f, 0xb4, 0x94, 0xea, 0x7c, 0x89, 0x01, 0xe3, 0x4e, 0xd2, - 0x21, 0x29, 0xb9, 0x0d, 0xfd, 0x13, 0xab, 0x66, 0xc3, 0x70, 0xa8, 0x85, 0xfe, 0xc2, 0xd2, 0xd3, - 0xe6, 0x68, 0x5f, 0x5e, 0xc5, 0x7f, 0x91, 0x96, 0x37, 0xa7, 0x2e, 0x8a, 0x45, 0x5e, 0x61, 0x09, - 0xd8, 0xb9, 0x1f, 0xcb, 0x02, 0x84, 0x05, 0xc8, 0x23, 0x90, 0x0d, 0x92, 0xb1, 0xa1, 0x9b, 0x4a, - 0x44, 0x83, 0xb2, 0xb8, 0x54, 0x88, 0xb1, 0x9d, 0xdd, 0x76, 0x6c, 0xdf, 0x86, 0x02, 0x3f, 0xf1, - 0x42, 0x4f, 0x72, 0x29, 0x0c, 0x58, 0xc7, 0x06, 0x5f, 0x45, 0x7a, 0xbe, 0x99, 0x45, 0xcb, 0x33, - 0xe2, 0x95, 0xcd, 0x99, 0x9d, 0xab, 0x43, 0x2f, 0xfe, 0x45, 0x2e, 0x41, 0x1e, 0xa5, 0x98, 0xc1, - 0x7d, 0x2c, 0xce, 0xd2, 0x31, 0xf9, 0x21, 0x9e, 0x75, 0xd3, 0x84, 0x6d, 0x79, 0xac, 0x6a, 0x6c, - 0xf5, 0x90, 0x90, 0x8b, 0x80, 0x45, 0xe4, 0x22, 0x60, 0xea, 0xff, 0x9d, 0x4d, 0x89, 0x06, 0xf9, - 0xe0, 0x0e, 0x93, 0x17, 0x00, 0xf0, 0x49, 0x37, 0x93, 0xa7, 0xff, 0x44, 0x03, 0x47, 0x09, 0x32, - 0x42, 0xb5, 0x8d, 0x6c, 0x3b, 0x42, 0x62, 0xf5, 0x0f, 0x32, 0x89, 0x10, 0x82, 0xfb, 0x92, 0xa3, - 0x6c, 0x95, 0x65, 0xf7, 0x68, 0xc6, 0xfa, 0x7d, 0x91, 0xdb, 0x5d, 0x5f, 0x44, 0xbf, 0xe5, 0x00, - 0x2c, 0xd3, 0xc3, 0xfc, 0x96, 0x6f, 0x66, 0xd3, 0x02, 0x2a, 0x1e, 0x4d, 0x15, 0xbf, 0x11, 0x18, - 0xa5, 0xf9, 0x9d, 0xa4, 0x31, 0x17, 0x66, 0xea, 0x27, 0xe1, 0x44, 0x2c, 0xcc, 0xa0, 0xc8, 0x90, - 0x78, 0xa9, 0x7b, 0xbc, 0xc2, 0xce, 0xc1, 0x00, 0x22, 0x64, 0xea, 0xbf, 0xcf, 0x74, 0x0f, 0x32, - 0x79, 0xe8, 0xaa, 0x93, 0x22, 0x80, 0xdc, 0xdf, 0x8d, 0x00, 0x0e, 0x60, 0x1b, 0x7c, 0xb4, 0x05, - 0xf0, 0x1e, 0x99, 0x3c, 0xde, 0x6d, 0x01, 0xfc, 0x6c, 0x66, 0xdb, 0x18, 0xa1, 0x87, 0x2d, 0x03, - 0xf5, 0x1f, 0x66, 0x52, 0x63, 0x79, 0xee, 0xab, 0x5d, 0x2f, 0x43, 0x81, 0xbb, 0xd5, 0x88, 0x56, - 0x49, 0xd9, 0x4f, 0x18, 0xb4, 0x43, 0x79, 0x51, 0x86, 0xcc, 0x40, 0x1f, 0x6f, 0x83, 0x11, 0xcf, - 0x12, 0x9c, 0xd2, 0x4e, 0xa3, 0xd3, 0xe4, 0x28, 0xd0, 0xea, 0xef, 0x67, 0x12, 0xa1, 0x45, 0x0f, - 0xf1, 0xdb, 0xc2, 0xa9, 0x3a, 0xb7, 0xf3, 0xa9, 0x5a, 0xfd, 0x8b, 0x6c, 0x7a, 0x64, 0xd3, 0x43, - 0xfc, 0x90, 0x83, 0x38, 0x4e, 0xdb, 0xdb, 0xba, 0xb5, 0x08, 0x23, 0x51, 0x59, 0x88, 0x65, 0xeb, - 0x62, 0x7a, 0x7c, 0xd7, 0x0e, 0xad, 0x88, 0xf1, 0x50, 0xdf, 0xc9, 0x24, 0x83, 0xb2, 0x1e, 0xfa, - 0xfc, 0xb4, 0x37, 0x6d, 0x89, 0x7e, 0xca, 0x7b, 0x64, 0xad, 0x39, 0x88, 0x4f, 0x79, 0x8f, 0xac, - 0x1a, 0x7b, 0xfb, 0x94, 0x5f, 0xce, 0x76, 0x8a, 0x69, 0x7b, 0xe8, 0x1f, 0xf4, 0x51, 0x59, 0xc8, - 0xbc, 0x65, 0xe2, 0xd3, 0x1e, 0xe9, 0x14, 0x44, 0xb6, 0x03, 0xcf, 0x04, 0x9f, 0xbd, 0x8d, 0xf1, - 0x54, 0x61, 0xbd, 0x47, 0x14, 0xf9, 0x68, 0x08, 0xeb, 0x3d, 0x32, 0x54, 0xde, 0x7b, 0xc2, 0xfa, - 0x9d, 0xec, 0x4e, 0x03, 0x29, 0x1f, 0x0b, 0x2f, 0x21, 0xbc, 0x2f, 0x66, 0x93, 0x01, 0xbe, 0x0f, - 0x5d, 0x4c, 0x53, 0x50, 0x10, 0xa1, 0xc6, 0x3b, 0x0a, 0x87, 0xe3, 0x3b, 0x59, 0x34, 0xe2, 0x3b, - 0x6e, 0x80, 0xb8, 0xc8, 0xd9, 0x99, 0x48, 0x38, 0xad, 0xfa, 0x9d, 0x4c, 0x2c, 0x1a, 0xf6, 0xa1, - 0x1c, 0x21, 0xec, 0x69, 0x49, 0x22, 0xaf, 0xf8, 0x87, 0x99, 0xf9, 0x58, 0x34, 0xd2, 0xe0, 0x7b, - 0xca, 0xd4, 0xd3, 0xcd, 0x46, 0xbc, 0xbc, 0x88, 0x09, 0xf0, 0xb5, 0x2c, 0x8c, 0x25, 0x48, 0xc9, - 0xa5, 0x48, 0x28, 0x1d, 0x3c, 0x96, 0x8c, 0x39, 0x8f, 0xf3, 0xa0, 0x3a, 0xbb, 0x38, 0x49, 0xbd, - 0x04, 0xf9, 0xb2, 0xbe, 0xc1, 0xbf, 0xad, 0x97, 0xb3, 0x34, 0xf4, 0x0d, 0xf9, 0xc4, 0x0d, 0xf1, - 0x64, 0x09, 0x4e, 0xf3, 0xfb, 0x10, 0xd3, 0xb6, 0x16, 0xcd, 0x26, 0xad, 0x58, 0xb3, 0x66, 0xa3, - 0x61, 0xba, 0xe2, 0x52, 0xef, 0xc9, 0xad, 0xcd, 0xe2, 0x65, 0xcf, 0xf6, 0xf4, 0x46, 0x8d, 0xfa, - 0x64, 0x35, 0xcf, 0x6c, 0xd2, 0x9a, 0x69, 0xd5, 0x9a, 0x48, 0x29, 0xb1, 0x4c, 0x67, 0x45, 0x2a, - 0x3c, 0xf0, 0x6c, 0xb5, 0xae, 0x5b, 0x16, 0x35, 0x2a, 0xd6, 0xf8, 0x86, 0x47, 0xf9, 0x65, 0x60, - 0x8e, 0x1f, 0x09, 0xf2, 0xb7, 0xe1, 0x1c, 0xcd, 0x18, 0x2f, 0x31, 0x02, 0x2d, 0xa5, 0x90, 0xfa, - 0xbb, 0xf9, 0x94, 0x40, 0xe8, 0x47, 0x48, 0x7d, 0xfc, 0x9e, 0xce, 0x6f, 0xd3, 0xd3, 0xd7, 0xa0, - 0xef, 0x0e, 0x75, 0xf0, 0x7c, 0x8b, 0x5f, 0x30, 0xa0, 0x33, 0xfb, 0x3d, 0x0e, 0x92, 0x6f, 0x68, - 0x04, 0x15, 0x69, 0xc0, 0xb9, 0x45, 0xd6, 0x4d, 0xe9, 0x9d, 0x59, 0xd8, 0x43, 0x67, 0x76, 0xe1, - 0x47, 0xde, 0x84, 0xb3, 0x88, 0x4d, 0xe9, 0xd6, 0x3e, 0xac, 0x0a, 0x63, 0x54, 0xf1, 0xaa, 0xd2, - 0x3b, 0xb7, 0x53, 0x79, 0xf2, 0x51, 0x18, 0x0a, 0x06, 0x88, 0x49, 0x5d, 0x71, 0x73, 0xd1, 0x65, - 0x9c, 0xf1, 0x00, 0x70, 0x0c, 0x8c, 0x2e, 0x64, 0xd1, 0x20, 0x62, 0x11, 0x5e, 0xea, 0x3f, 0xc8, - 0x74, 0x0b, 0xc8, 0x7e, 0xe8, 0xb3, 0xf2, 0x2b, 0xd0, 0x67, 0xf0, 0x8f, 0x12, 0x3a, 0xd5, 0x3d, - 0x64, 0x3b, 0x27, 0xd5, 0xfc, 0x32, 0xea, 0x9f, 0x67, 0xba, 0xc6, 0x81, 0x3f, 0xea, 0x9f, 0xf7, - 0xc5, 0x5c, 0x87, 0xcf, 0x13, 0x93, 0xe8, 0x15, 0x18, 0x35, 0xc3, 0x40, 0xb5, 0xb5, 0x30, 0xfc, - 0x94, 0x76, 0x42, 0x82, 0xe3, 0xe8, 0xba, 0x01, 0x67, 0x7c, 0xc7, 0x47, 0xc7, 0xf7, 0x10, 0x73, - 0x6b, 0x6d, 0xc7, 0xe4, 0xe3, 0x52, 0x3b, 0xe5, 0xc6, 0xdc, 0xc7, 0xdc, 0xdb, 0x8e, 0xc9, 0x2a, - 0xd0, 0xbd, 0x55, 0x6a, 0xe9, 0xb5, 0x75, 0xdb, 0x59, 0xc3, 0x28, 0xa3, 0x7c, 0x70, 0x6a, 0x27, - 0x38, 0xfc, 0xae, 0x0f, 0x26, 0x8f, 0xc1, 0xf0, 0x4a, 0xa3, 0x4d, 0x83, 0xb8, 0x8e, 0xfc, 0xae, - 0x4f, 0x1b, 0x62, 0xc0, 0xe0, 0x86, 0xe4, 0x02, 0x00, 0x12, 0x79, 0x18, 0xa5, 0x1f, 0x2f, 0xf6, - 0xb4, 0x01, 0x06, 0x59, 0x14, 0xdd, 0x75, 0x8e, 0x6b, 0x35, 0x17, 0x52, 0xad, 0x61, 0x5b, 0x2b, - 0x35, 0x8f, 0x3a, 0x4d, 0x6c, 0x28, 0x3a, 0x33, 0x68, 0x67, 0x90, 0x02, 0xaf, 0x4e, 0xdc, 0x19, - 0xdb, 0x5a, 0x59, 0xa4, 0x4e, 0x93, 0x35, 0xf5, 0x49, 0x20, 0xa2, 0xa9, 0x0e, 0x1e, 0x7a, 0xf0, - 0x8f, 0x43, 0x6f, 0x06, 0x4d, 0x7c, 0x04, 0x3f, 0x0d, 0xc1, 0x0f, 0x2b, 0xc2, 0x20, 0x0f, 0x6e, - 0xc7, 0x85, 0x86, 0x2e, 0x0c, 0x1a, 0x70, 0x10, 0xca, 0xeb, 0x0c, 0x08, 0xef, 0x0a, 0xee, 0xd5, - 0xad, 0x89, 0x5f, 0xea, 0xe7, 0x72, 0x69, 0xa1, 0xeb, 0xf7, 0xa5, 0x68, 0xe1, 0xb4, 0x9a, 0xdd, - 0xd5, 0xb4, 0x7a, 0xc2, 0x6a, 0x37, 0x6b, 0x7a, 0xab, 0x55, 0x5b, 0x36, 0x1b, 0xf8, 0xac, 0x0a, - 0x17, 0x3e, 0x6d, 0xd8, 0x6a, 0x37, 0x4b, 0xad, 0xd6, 0x14, 0x07, 0x92, 0x27, 0x60, 0x8c, 0xd1, - 0x61, 0x27, 0x05, 0x94, 0x79, 0xa4, 0x64, 0x0c, 0x30, 0x3a, 0xac, 0x4f, 0xfb, 0x10, 0xf4, 0x0b, - 0x9e, 0x7c, 0xad, 0xea, 0xd5, 0xfa, 0x38, 0x33, 0x97, 0xf5, 0x5c, 0xc0, 0x86, 0x4f, 0xae, 0xbd, - 0xda, 0x80, 0x5f, 0x1e, 0x63, 0x20, 0x5b, 0xed, 0x26, 0x8f, 0x88, 0xd5, 0x87, 0xc8, 0xe0, 0x37, - 0xb9, 0x04, 0x23, 0x8c, 0x4b, 0x20, 0x30, 0x1e, 0x36, 0xb6, 0x57, 0x8b, 0x41, 0xc9, 0x75, 0x38, - 0x15, 0x81, 0x70, 0x1b, 0x94, 0x3f, 0x13, 0xe8, 0xd5, 0x52, 0x71, 0xea, 0x57, 0x73, 0xd1, 0x80, - 0xfa, 0x87, 0xd0, 0x11, 0x67, 0xa1, 0xcf, 0x76, 0x56, 0x6a, 0x6d, 0xa7, 0x21, 0xc6, 0x5e, 0xc1, - 0x76, 0x56, 0x6e, 0x3b, 0x0d, 0x72, 0x1a, 0x0a, 0xac, 0x77, 0x4c, 0x43, 0x0c, 0xb1, 0x5e, 0xbd, - 0xd5, 0xaa, 0x18, 0xa4, 0xc4, 0x3b, 0x04, 0x43, 0x8e, 0xd6, 0xea, 0xb8, 0xb5, 0xe7, 0x4e, 0x09, - 0xbd, 0x7c, 0xc5, 0x4b, 0x20, 0xb1, 0x9f, 0x30, 0x10, 0x29, 0x3f, 0x08, 0x88, 0xb1, 0x30, 0x70, - 0x5b, 0x62, 0xf0, 0x3e, 0x89, 0xb3, 0x10, 0xc8, 0x90, 0x05, 0xdf, 0xc4, 0x18, 0xa4, 0x0c, 0x24, - 0xa4, 0x6a, 0xda, 0x86, 0xb9, 0x6c, 0x52, 0xfe, 0xaa, 0xa3, 0x97, 0x5f, 0xfc, 0x26, 0xb1, 0xda, - 0xa8, 0xcf, 0x64, 0x56, 0x40, 0xc8, 0x4b, 0x5c, 0x09, 0x39, 0x1d, 0xae, 0x7d, 0xbc, 0x6f, 0xb9, - 0x9d, 0x16, 0x43, 0xa1, 0x66, 0x62, 0x79, 0x5c, 0x08, 0xd5, 0x77, 0x72, 0xc9, 0xac, 0x0a, 0x87, - 0x62, 0xd7, 0x4c, 0x03, 0x88, 0xa4, 0x29, 0xe1, 0xe5, 0x5a, 0xe0, 0x71, 0x1e, 0x62, 0x3a, 0xf0, - 0x90, 0xca, 0x92, 0x2b, 0xd0, 0xcf, 0xbf, 0xa8, 0x52, 0x16, 0xf6, 0x0e, 0xba, 0x88, 0xb9, 0x2d, - 0x73, 0x79, 0x19, 0xfd, 0xc9, 0x02, 0x34, 0xb9, 0x04, 0x7d, 0xe5, 0xb9, 0x6a, 0xb5, 0x34, 0xe7, - 0xdf, 0x14, 0xe3, 0xfb, 0x12, 0xc3, 0x72, 0x6b, 0xae, 0x6e, 0xb9, 0x9a, 0x8f, 0x24, 0x8f, 0x41, - 0xa1, 0xb2, 0x80, 0x64, 0xfc, 0xd5, 0xe4, 0xe0, 0xd6, 0x66, 0xb1, 0xcf, 0x6c, 0x71, 0x2a, 0x81, - 0xc2, 0x7a, 0xef, 0x54, 0xca, 0x92, 0xbb, 0x04, 0xaf, 0xf7, 0x9e, 0x69, 0xe0, 0xb5, 0xb3, 0x16, - 0xa0, 0xc9, 0xb3, 0x30, 0x54, 0xa5, 0x8e, 0xa9, 0x37, 0xe6, 0xda, 0xb8, 0x55, 0x94, 0x42, 0x29, - 0xba, 0x08, 0xaf, 0x59, 0x88, 0xd0, 0x22, 0x64, 0xe4, 0x3c, 0xe4, 0xa7, 0x4d, 0xcb, 0x7f, 0xc2, - 0x80, 0x3e, 0xee, 0xab, 0xa6, 0xe5, 0x69, 0x08, 0x55, 0xff, 0x65, 0x36, 0x3d, 0x35, 0xc5, 0x21, - 0x0c, 0xc7, 0x3d, 0xde, 0xf4, 0xc6, 0x94, 0x20, 0xbf, 0x0f, 0x25, 0x58, 0x86, 0x13, 0x25, 0xa3, - 0x69, 0x5a, 0x25, 0xfc, 0xe9, 0xce, 0x4e, 0x95, 0x70, 0x78, 0x4b, 0x4f, 0xe8, 0x62, 0x68, 0xf1, - 0x3d, 0x3c, 0x28, 0x2f, 0x43, 0xd5, 0x74, 0x8e, 0xab, 0x35, 0x97, 0xf5, 0x5a, 0x9d, 0x67, 0x75, - 0xd0, 0xe2, 0x4c, 0xd5, 0x1f, 0xcd, 0x6e, 0x93, 0x4d, 0xe3, 0x41, 0x94, 0xbe, 0xfa, 0xa5, 0x6c, - 0xf7, 0x84, 0x26, 0x0f, 0xa4, 0x50, 0xfe, 0x2a, 0x9b, 0x92, 0x5e, 0x64, 0x5f, 0x92, 0xb8, 0x02, - 0xfd, 0x9c, 0x4d, 0xe0, 0x6a, 0x8b, 0x33, 0x0e, 0x57, 0x56, 0x9c, 0xe9, 0x7c, 0x34, 0x99, 0x83, - 0x53, 0xa5, 0xe5, 0x65, 0x5a, 0xf7, 0xc2, 0xf0, 0xcc, 0x73, 0x61, 0xa0, 0x54, 0x1e, 0x8e, 0x56, - 0xe0, 0xc3, 0xf0, 0xce, 0x18, 0x10, 0x24, 0xb5, 0x1c, 0x59, 0x84, 0x33, 0x71, 0x78, 0x95, 0x9b, - 0xe9, 0x79, 0x29, 0x42, 0x6d, 0x82, 0x23, 0xff, 0x4f, 0xeb, 0x50, 0x36, 0xad, 0x95, 0x38, 0x9d, - 0xf6, 0x76, 0x6b, 0x25, 0xce, 0xad, 0xa9, 0xe5, 0xd4, 0xaf, 0xe5, 0xe4, 0x2c, 0x2c, 0x0f, 0xae, - 0x53, 0xd4, 0x8d, 0x88, 0x2b, 0xf4, 0x4e, 0x87, 0xcc, 0xb3, 0x22, 0xca, 0x87, 0xd1, 0x76, 0x7c, - 0xaf, 0xc1, 0x20, 0xca, 0x00, 0x02, 0x65, 0xff, 0xbf, 0x80, 0x92, 0x54, 0x20, 0x5f, 0x72, 0x56, - 0xb8, 0x09, 0xba, 0xdd, 0xc3, 0x27, 0xdd, 0x59, 0x71, 0xd3, 0x1f, 0x3e, 0x31, 0x16, 0xea, 0x8f, - 0x64, 0xbb, 0x24, 0x4e, 0x79, 0x10, 0x27, 0x91, 0x27, 0x66, 0x79, 0x90, 0xe3, 0x5b, 0xa6, 0x65, - 0x90, 0x87, 0xe0, 0xf4, 0xed, 0xea, 0xa4, 0x56, 0xbb, 0x55, 0x99, 0x2b, 0xd7, 0x6e, 0xcf, 0x55, - 0x17, 0x26, 0x27, 0x2a, 0x53, 0x95, 0xc9, 0xf2, 0x68, 0x0f, 0x39, 0x09, 0x27, 0x42, 0xd4, 0xf4, - 0xed, 0xd9, 0xd2, 0xdc, 0x68, 0x86, 0x8c, 0xc1, 0x70, 0x08, 0x1c, 0x9f, 0x5f, 0x1c, 0xcd, 0x3e, - 0xf1, 0x7e, 0x18, 0xc4, 0x5d, 0x1c, 0x5f, 0xd1, 0xc8, 0x10, 0xf4, 0xcf, 0x8f, 0x57, 0x27, 0xb5, - 0x3b, 0xc8, 0x04, 0xa0, 0x50, 0x9e, 0x9c, 0x63, 0x0c, 0x33, 0x4f, 0xfc, 0x9b, 0x0c, 0x40, 0x75, - 0x6a, 0x71, 0x41, 0x10, 0x0e, 0x42, 0x5f, 0x65, 0xee, 0x4e, 0x69, 0xa6, 0xc2, 0xe8, 0xfa, 0x21, - 0x3f, 0xbf, 0x30, 0xc9, 0x6a, 0x18, 0x80, 0xde, 0x89, 0x99, 0xf9, 0xea, 0xe4, 0x68, 0x96, 0x01, - 0xb5, 0xc9, 0x52, 0x79, 0x34, 0xc7, 0x80, 0x77, 0xb5, 0xca, 0xe2, 0xe4, 0x68, 0x9e, 0xfd, 0x39, - 0x53, 0x5d, 0x2c, 0x2d, 0x8e, 0xf6, 0xb2, 0x3f, 0xa7, 0xf0, 0xcf, 0x02, 0x63, 0x56, 0x9d, 0x5c, - 0xc4, 0x1f, 0x7d, 0xac, 0x09, 0x53, 0xfe, 0xaf, 0x7e, 0x86, 0x62, 0xac, 0xcb, 0x15, 0x6d, 0x74, - 0x80, 0xfd, 0x60, 0x2c, 0xd9, 0x0f, 0x60, 0x8d, 0xd3, 0x26, 0x67, 0xe7, 0xef, 0x4c, 0x8e, 0x0e, - 0x32, 0x5e, 0xb3, 0xb7, 0x18, 0x78, 0x88, 0xfd, 0xa9, 0xcd, 0xb2, 0x3f, 0x87, 0x19, 0x27, 0x6d, - 0xb2, 0x34, 0xb3, 0x50, 0x5a, 0x9c, 0x1e, 0x1d, 0x61, 0xed, 0x41, 0x9e, 0x27, 0x78, 0xc9, 0xb9, - 0xd2, 0xec, 0xe4, 0xe8, 0xa8, 0xa0, 0x29, 0xcf, 0x54, 0xe6, 0x6e, 0x8d, 0x8e, 0x61, 0x43, 0xde, - 0x9c, 0xc5, 0x1f, 0x84, 0x15, 0xc0, 0xbf, 0x4e, 0x3e, 0xf1, 0x71, 0x28, 0xcc, 0x57, 0xd1, 0x6e, - 0x3b, 0x0b, 0x27, 0xe7, 0xab, 0xb5, 0xc5, 0x37, 0x17, 0x26, 0x63, 0xf2, 0x1e, 0x83, 0x61, 0x1f, - 0x31, 0x53, 0x99, 0xbb, 0xfd, 0x11, 0x2e, 0x6d, 0x1f, 0x34, 0x5b, 0x9a, 0x98, 0xaf, 0x8e, 0x66, - 0x59, 0xaf, 0xf8, 0xa0, 0xbb, 0x95, 0xb9, 0xf2, 0xfc, 0xdd, 0xea, 0x68, 0xee, 0x89, 0x7b, 0x7e, - 0x6e, 0xd7, 0x79, 0xc7, 0x5c, 0x31, 0x2d, 0x72, 0x01, 0x1e, 0x2a, 0x4f, 0xde, 0xa9, 0x4c, 0x4c, - 0xd6, 0xe6, 0xb5, 0xca, 0xcd, 0xca, 0x5c, 0xac, 0xa6, 0xd3, 0x30, 0x16, 0x45, 0x97, 0x16, 0x2a, - 0xa3, 0x19, 0x72, 0x06, 0x48, 0x14, 0xfc, 0x7a, 0x69, 0x76, 0x6a, 0x34, 0x4b, 0x14, 0x38, 0x15, - 0x85, 0x57, 0xe6, 0x16, 0x6f, 0xcf, 0x4d, 0x8e, 0xe6, 0x9e, 0xf8, 0xf9, 0x0c, 0x9c, 0x4e, 0x0d, - 0x23, 0x40, 0x54, 0xb8, 0x38, 0x39, 0x53, 0xaa, 0x2e, 0x56, 0x26, 0xaa, 0x93, 0x25, 0x6d, 0x62, - 0xba, 0x36, 0x51, 0x5a, 0x9c, 0xbc, 0x39, 0xaf, 0xbd, 0x59, 0xbb, 0x39, 0x39, 0x37, 0xa9, 0x95, - 0x66, 0x46, 0x7b, 0xc8, 0x63, 0x50, 0xec, 0x40, 0x53, 0x9d, 0x9c, 0xb8, 0xad, 0x55, 0x16, 0xdf, - 0x1c, 0xcd, 0x90, 0x47, 0xe1, 0x42, 0x47, 0x22, 0xf6, 0x7b, 0x34, 0x4b, 0x2e, 0xc2, 0xb9, 0x4e, - 0x24, 0x6f, 0xcc, 0x8c, 0xe6, 0x9e, 0xf8, 0x89, 0x0c, 0x90, 0xe4, 0x3b, 0x70, 0xf2, 0x08, 0x9c, - 0x67, 0x7a, 0x51, 0xeb, 0xdc, 0xc0, 0x47, 0xe1, 0x42, 0x2a, 0x85, 0xd4, 0xbc, 0x22, 0x3c, 0xdc, - 0x81, 0x44, 0x34, 0xee, 0x3c, 0x28, 0xe9, 0x04, 0xd8, 0xb4, 0xdf, 0xcc, 0xc0, 0xe9, 0x54, 0x23, - 0x92, 0x5c, 0x86, 0xf7, 0x95, 0xca, 0xb3, 0xac, 0x6f, 0x26, 0x16, 0x2b, 0xf3, 0x73, 0xd5, 0xda, - 0xec, 0x54, 0xa9, 0xc6, 0xb4, 0xef, 0x76, 0x35, 0xd6, 0x9b, 0x97, 0x40, 0xed, 0x42, 0x39, 0x31, - 0x5d, 0x9a, 0xbb, 0xc9, 0x86, 0x1f, 0x79, 0x1f, 0x3c, 0xd2, 0x91, 0x6e, 0x72, 0xae, 0x34, 0x3e, - 0x33, 0x59, 0x1e, 0xcd, 0x92, 0xc7, 0xe1, 0xd1, 0x8e, 0x54, 0xe5, 0x4a, 0x95, 0x93, 0xe5, 0xc6, - 0xcb, 0xef, 0xfc, 0xa3, 0x8b, 0x3d, 0xef, 0x7c, 0xeb, 0x62, 0xe6, 0x8f, 0xbe, 0x75, 0x31, 0xf3, - 0x17, 0xdf, 0xba, 0x98, 0xf9, 0xe8, 0xf5, 0xdd, 0xbc, 0xef, 0xe7, 0xd3, 0xd6, 0x52, 0x01, 0x27, - 0xf4, 0x67, 0xfe, 0x43, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x6b, 0x6a, 0x5a, 0x29, 0x58, 0x01, - 0x00, + // 15715 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x74, 0x24, 0xc7, + 0x75, 0x18, 0x8c, 0x79, 0x60, 0x00, 0x5c, 0x3c, 0x16, 0xa8, 0x7d, 0x35, 0x97, 0xbb, 0x3b, 0x64, + 0x53, 0x5c, 0xed, 0x52, 0xe4, 0xae, 0xb8, 0x5c, 0x92, 0xe2, 0x4b, 0xe4, 0x00, 0x03, 0x2c, 0x86, + 0x8b, 0x17, 0x7b, 0xb0, 0xbb, 0xa2, 0x5e, 0xe3, 0xc6, 0x74, 0x01, 0x68, 0xee, 0x4c, 0xf7, 0xa8, + 0xbb, 0x67, 0xb1, 0xe0, 0xf7, 0x25, 0xb1, 0x1c, 0x3f, 0x24, 0x47, 0x92, 0x15, 0x39, 0xb6, 0xfc, + 0x4a, 0x2c, 0xdb, 0x71, 0x62, 0xfb, 0x38, 0x76, 0x9c, 0xf8, 0xd8, 0x96, 0x1d, 0x9d, 0xd8, 0x51, + 0x1e, 0x74, 0x74, 0x9c, 0x63, 0x3b, 0x89, 0x8f, 0x8f, 0xe3, 0x40, 0x8e, 0x12, 0xe7, 0x07, 0x4e, + 0x72, 0x8e, 0x93, 0xe8, 0xc4, 0x8a, 0xe3, 0xe4, 0xe4, 0xd4, 0xad, 0xea, 0xee, 0xea, 0xc7, 0x0c, + 0x9e, 0x34, 0x08, 0x2d, 0xfe, 0xec, 0x62, 0xee, 0xbd, 0x75, 0xab, 0xfa, 0xd6, 0xad, 0xaa, 0x5b, + 0x55, 0xb7, 0xee, 0x85, 0x4b, 0x1e, 0x6d, 0xd0, 0x96, 0xed, 0x78, 0x57, 0x1a, 0x74, 0x45, 0xaf, + 0xaf, 0x5f, 0xf1, 0xd6, 0x5b, 0xd4, 0xbd, 0x42, 0xef, 0x52, 0xcb, 0xf3, 0xff, 0xbb, 0xdc, 0x72, + 0x6c, 0xcf, 0x26, 0x05, 0xfe, 0xeb, 0xcc, 0x89, 0x15, 0x7b, 0xc5, 0x46, 0xd0, 0x15, 0xf6, 0x17, + 0xc7, 0x9e, 0x39, 0xbb, 0x62, 0xdb, 0x2b, 0x0d, 0x7a, 0x05, 0x7f, 0x2d, 0xb5, 0x97, 0xaf, 0xb8, + 0x9e, 0xd3, 0xae, 0x7b, 0x02, 0x5b, 0x8c, 0x63, 0x3d, 0xb3, 0x49, 0x5d, 0x4f, 0x6f, 0xb6, 0x04, + 0xc1, 0xf9, 0x38, 0xc1, 0x9a, 0xa3, 0xb7, 0x5a, 0xd4, 0x11, 0x95, 0x9f, 0x79, 0x38, 0xbd, 0x9d, + 0xf8, 0xaf, 0x20, 0x79, 0x22, 0x9d, 0xc4, 0x67, 0x14, 0xe3, 0xa8, 0x7e, 0x2e, 0x0b, 0xfd, 0xb3, + 0xd4, 0xd3, 0x0d, 0xdd, 0xd3, 0xc9, 0x59, 0xe8, 0xad, 0x58, 0x06, 0xbd, 0xa7, 0x64, 0x1e, 0xca, + 0x5c, 0xcc, 0x8d, 0x17, 0x36, 0x37, 0x8a, 0x59, 0x6a, 0x6a, 0x1c, 0x48, 0xce, 0x41, 0x7e, 0x71, + 0xbd, 0x45, 0x95, 0xec, 0x43, 0x99, 0x8b, 0x03, 0xe3, 0x03, 0x9b, 0x1b, 0xc5, 0x5e, 0x94, 0x85, + 0x86, 0x60, 0xf2, 0x30, 0x64, 0x2b, 0x65, 0x25, 0x87, 0xc8, 0xb1, 0xcd, 0x8d, 0xe2, 0x70, 0xdb, + 0x34, 0x1e, 0xb7, 0x9b, 0xa6, 0x47, 0x9b, 0x2d, 0x6f, 0x5d, 0xcb, 0x56, 0xca, 0xe4, 0x02, 0xe4, + 0x27, 0x6c, 0x83, 0x2a, 0x79, 0x24, 0x22, 0x9b, 0x1b, 0xc5, 0x91, 0xba, 0x6d, 0x50, 0x89, 0x0a, + 0xf1, 0xe4, 0x15, 0xc8, 0x2f, 0x9a, 0x4d, 0xaa, 0xf4, 0x3e, 0x94, 0xb9, 0x38, 0x78, 0xf5, 0xcc, + 0x65, 0x2e, 0x95, 0xcb, 0xbe, 0x54, 0x2e, 0x2f, 0xfa, 0x62, 0x1b, 0x1f, 0x7d, 0x6b, 0xa3, 0xd8, + 0xb3, 0xb9, 0x51, 0xcc, 0x33, 0x49, 0x7e, 0xf6, 0xab, 0xc5, 0x8c, 0x86, 0x25, 0xc9, 0x8b, 0x30, + 0x38, 0xd1, 0x68, 0xbb, 0x1e, 0x75, 0xe6, 0xf4, 0x26, 0x55, 0x0a, 0x58, 0xe1, 0x99, 0xcd, 0x8d, + 0xe2, 0xa9, 0x3a, 0x07, 0xd7, 0x2c, 0xbd, 0x29, 0x57, 0x2c, 0x93, 0xab, 0xbf, 0x92, 0x81, 0x63, + 0x55, 0xea, 0xba, 0xa6, 0x6d, 0x05, 0xb2, 0x79, 0x14, 0x06, 0x04, 0xa8, 0x52, 0x46, 0xf9, 0x0c, + 0x8c, 0xf7, 0x6d, 0x6e, 0x14, 0x73, 0xae, 0x69, 0x68, 0x21, 0x86, 0xbc, 0x17, 0xfa, 0x6e, 0x9b, + 0xde, 0xea, 0xec, 0x54, 0x49, 0xc8, 0xe9, 0xd4, 0xe6, 0x46, 0x91, 0xac, 0x99, 0xde, 0x6a, 0xad, + 0xb9, 0xac, 0x4b, 0x15, 0xfa, 0x64, 0x64, 0x06, 0x46, 0x17, 0x1c, 0xf3, 0xae, 0xee, 0xd1, 0x1b, + 0x74, 0x7d, 0xc1, 0x6e, 0x98, 0xf5, 0x75, 0x21, 0xc5, 0x87, 0x36, 0x37, 0x8a, 0x67, 0x5b, 0x1c, + 0x57, 0xbb, 0x43, 0xd7, 0x6b, 0x2d, 0xc4, 0x4a, 0x4c, 0x12, 0x25, 0xd5, 0x5f, 0x2d, 0xc0, 0xd0, + 0x4d, 0x97, 0x3a, 0x41, 0xbb, 0x2f, 0x40, 0x9e, 0xfd, 0x16, 0x4d, 0x46, 0x99, 0xb7, 0x5d, 0xea, + 0xc8, 0x32, 0x67, 0x78, 0x72, 0x09, 0x7a, 0x67, 0xec, 0x15, 0xd3, 0x12, 0xcd, 0x3e, 0xbe, 0xb9, + 0x51, 0x3c, 0xd6, 0x60, 0x00, 0x89, 0x92, 0x53, 0x90, 0xf7, 0xc3, 0x50, 0xa5, 0xc9, 0x74, 0xc8, + 0xb6, 0x74, 0xcf, 0x76, 0x44, 0x6b, 0x51, 0xba, 0xa6, 0x04, 0x97, 0x0a, 0x46, 0xe8, 0xc9, 0xf3, + 0x00, 0xa5, 0xdb, 0x55, 0xcd, 0x6e, 0xd0, 0x92, 0x36, 0x27, 0x94, 0x01, 0x4b, 0xeb, 0x6b, 0x6e, + 0xcd, 0xb1, 0x1b, 0xb4, 0xa6, 0x3b, 0x72, 0xb5, 0x12, 0x35, 0x99, 0x84, 0x91, 0x52, 0xbd, 0x4e, + 0x5d, 0x57, 0xa3, 0x1f, 0x6b, 0x53, 0xd7, 0x73, 0x95, 0xde, 0x87, 0x72, 0x17, 0x07, 0xc6, 0xcf, + 0x6d, 0x6e, 0x14, 0x1f, 0xd0, 0x11, 0x53, 0x73, 0x04, 0x4a, 0x62, 0x11, 0x2b, 0x44, 0xc6, 0x61, + 0xb8, 0xf4, 0x66, 0xdb, 0xa1, 0x15, 0x83, 0x5a, 0x9e, 0xe9, 0xad, 0x0b, 0x0d, 0x39, 0xbb, 0xb9, + 0x51, 0x54, 0x74, 0x86, 0xa8, 0x99, 0x02, 0x23, 0x31, 0x89, 0x16, 0x21, 0xf3, 0x30, 0x76, 0x7d, + 0x62, 0xa1, 0x4a, 0x9d, 0xbb, 0x66, 0x9d, 0x96, 0xea, 0x75, 0xbb, 0x6d, 0x79, 0x4a, 0x1f, 0xf2, + 0x79, 0x78, 0x73, 0xa3, 0x78, 0x6e, 0xa5, 0xde, 0xaa, 0xb9, 0x1c, 0x5b, 0xd3, 0x39, 0x5a, 0x62, + 0x96, 0x2c, 0x4b, 0x3e, 0x08, 0xc3, 0x8b, 0x0e, 0xd3, 0x42, 0xa3, 0x4c, 0x19, 0x5c, 0xe9, 0x47, + 0xfd, 0x3f, 0x75, 0x59, 0x4c, 0x40, 0x1c, 0xea, 0xf7, 0x2c, 0x6f, 0xac, 0xc7, 0x0b, 0xd4, 0x0c, + 0xc4, 0xc9, 0x8d, 0x8d, 0xb0, 0x22, 0x14, 0x14, 0xf6, 0xf1, 0xa6, 0x43, 0x8d, 0x84, 0xb6, 0x0d, + 0x60, 0x9b, 0x2f, 0x6d, 0x6e, 0x14, 0x1f, 0x75, 0x04, 0x4d, 0xad, 0xab, 0xda, 0x75, 0x64, 0x45, + 0x26, 0xa1, 0x9f, 0x69, 0xd3, 0x0d, 0xd3, 0x32, 0x14, 0x78, 0x28, 0x73, 0x71, 0xe4, 0xea, 0xa8, + 0xdf, 0x7a, 0x1f, 0x3e, 0x7e, 0x7a, 0x73, 0xa3, 0x78, 0x9c, 0xe9, 0x60, 0xed, 0x8e, 0x69, 0xc9, + 0x53, 0x44, 0x50, 0x94, 0x8d, 0xa2, 0x71, 0xdb, 0xc3, 0xa1, 0x3b, 0x18, 0x8e, 0xa2, 0x25, 0xdb, + 0x8b, 0x0f, 0x5b, 0x9f, 0x8c, 0x4c, 0xc0, 0xf0, 0xb8, 0xed, 0x55, 0x2c, 0xd7, 0xd3, 0xad, 0x3a, + 0xad, 0x94, 0x95, 0x21, 0x2c, 0x87, 0x6a, 0xc1, 0xca, 0x99, 0x02, 0x53, 0x8b, 0x4c, 0x4a, 0xd1, + 0x32, 0xea, 0x9f, 0xe6, 0x61, 0x84, 0xf5, 0x89, 0x34, 0x7c, 0x4a, 0x6c, 0x26, 0x60, 0x10, 0x56, + 0x8b, 0xdb, 0xd2, 0xeb, 0x54, 0x8c, 0x24, 0xfc, 0x0a, 0xcb, 0x07, 0x4a, 0x3c, 0xe3, 0xf4, 0xe4, + 0x12, 0xf4, 0x73, 0x50, 0xa5, 0x2c, 0x06, 0xd7, 0xf0, 0xe6, 0x46, 0x71, 0xc0, 0x45, 0x58, 0xcd, + 0x34, 0xb4, 0x00, 0xcd, 0xb4, 0x9b, 0xff, 0x3d, 0x6d, 0xbb, 0x1e, 0x63, 0x2e, 0xc6, 0x16, 0x7e, + 0x86, 0x28, 0xb0, 0x2a, 0x50, 0xb2, 0x76, 0x47, 0x0b, 0x91, 0xe7, 0x00, 0x38, 0xa4, 0x64, 0x18, + 0x8e, 0x18, 0x60, 0x0f, 0x6c, 0x6e, 0x14, 0x4f, 0x0a, 0x16, 0xba, 0x61, 0xc8, 0xa3, 0x53, 0x22, + 0x26, 0x4d, 0x18, 0xe2, 0xbf, 0x66, 0xf4, 0x25, 0xda, 0xe0, 0xa3, 0x6b, 0xf0, 0xea, 0x45, 0xbf, + 0x13, 0xa3, 0xd2, 0xb9, 0x2c, 0x93, 0x4e, 0x5a, 0x9e, 0xb3, 0x3e, 0x5e, 0x14, 0x13, 0xf2, 0x69, + 0x51, 0x55, 0x03, 0x71, 0xf2, 0x54, 0x20, 0x97, 0x61, 0xf3, 0xf4, 0x94, 0xed, 0xac, 0xe9, 0x8e, + 0x41, 0x8d, 0xf1, 0x75, 0x79, 0x9e, 0x5e, 0xf6, 0xc1, 0xb5, 0x25, 0x59, 0xf5, 0x64, 0x72, 0xd6, + 0xe9, 0x9c, 0x5b, 0xb5, 0xbd, 0x84, 0x2a, 0xd7, 0x97, 0x90, 0x96, 0xdb, 0x5e, 0x8a, 0xab, 0x59, + 0xb4, 0x0c, 0x9b, 0x0a, 0x38, 0xe0, 0x16, 0x75, 0xd8, 0x24, 0x8e, 0xa3, 0x4e, 0x4c, 0x05, 0x82, + 0xc9, 0x5d, 0x8e, 0x49, 0xf2, 0x10, 0x45, 0xce, 0xbc, 0x0c, 0x63, 0x09, 0x51, 0x90, 0x51, 0xc8, + 0xdd, 0xa1, 0xeb, 0x5c, 0x5d, 0x34, 0xf6, 0x27, 0x39, 0x01, 0xbd, 0x77, 0xf5, 0x46, 0x5b, 0x2c, + 0xa1, 0x1a, 0xff, 0xf1, 0x7c, 0xf6, 0x7d, 0x19, 0xb6, 0xe2, 0x90, 0x09, 0xdb, 0xb2, 0x68, 0xdd, + 0x93, 0x17, 0x9d, 0x67, 0x60, 0x60, 0xc6, 0xae, 0xeb, 0x0d, 0xec, 0x47, 0xae, 0x77, 0xca, 0xe6, + 0x46, 0xf1, 0x04, 0xeb, 0xc0, 0xcb, 0x0d, 0x86, 0x91, 0xda, 0x14, 0x92, 0x32, 0x05, 0xd0, 0x68, + 0xd3, 0xf6, 0x28, 0x16, 0xcc, 0x86, 0x0a, 0x80, 0x05, 0x1d, 0x44, 0xc9, 0x0a, 0x10, 0x12, 0x93, + 0x2b, 0xd0, 0xbf, 0xc0, 0xd6, 0xd9, 0xba, 0xdd, 0x10, 0xca, 0x87, 0x4b, 0x01, 0xae, 0xbd, 0xf2, + 0x58, 0xf5, 0x89, 0xd4, 0x69, 0x18, 0x99, 0x68, 0x98, 0xd4, 0xf2, 0xe4, 0x56, 0xb3, 0x91, 0x5c, + 0x5a, 0xa1, 0x96, 0x27, 0xb7, 0x1a, 0xc7, 0xbc, 0xce, 0xa0, 0x72, 0xab, 0x03, 0x52, 0xf5, 0x5f, + 0xe5, 0xe0, 0x81, 0x1b, 0xed, 0x25, 0xea, 0x58, 0xd4, 0xa3, 0xae, 0x58, 0x90, 0x03, 0xae, 0x73, + 0x30, 0x96, 0x40, 0x0a, 0xee, 0xb8, 0x50, 0xde, 0x09, 0x90, 0x35, 0xb1, 0xc6, 0xcb, 0xb3, 0x6d, + 0xa2, 0x28, 0x99, 0x86, 0x63, 0x21, 0x90, 0x35, 0xc2, 0x55, 0xb2, 0xb8, 0x94, 0x9c, 0xdf, 0xdc, + 0x28, 0x9e, 0x91, 0xb8, 0xb1, 0x66, 0xcb, 0x1a, 0x1c, 0x2f, 0x46, 0x6e, 0xc0, 0x68, 0x08, 0xba, + 0xee, 0xd8, 0xed, 0x96, 0xab, 0xe4, 0x90, 0x55, 0x71, 0x73, 0xa3, 0xf8, 0xa0, 0xc4, 0x6a, 0x05, + 0x91, 0xf2, 0x02, 0x1e, 0x2f, 0x48, 0xbe, 0x3d, 0x23, 0x73, 0x13, 0xa3, 0x30, 0x8f, 0xa3, 0xf0, + 0x59, 0x7f, 0x14, 0x76, 0x14, 0xd2, 0xe5, 0x78, 0x49, 0x31, 0x28, 0x63, 0xcd, 0x48, 0x0c, 0xca, + 0x44, 0x8d, 0x67, 0x26, 0xe0, 0x64, 0x2a, 0xaf, 0x1d, 0x69, 0xf5, 0x1f, 0xe7, 0x64, 0x2e, 0x0b, + 0xb6, 0x11, 0x74, 0xe6, 0xbc, 0xdc, 0x99, 0x0b, 0xb6, 0x81, 0x53, 0x7d, 0x26, 0x5c, 0x3b, 0xa5, + 0xc6, 0xb6, 0x6c, 0x23, 0x3e, 0xeb, 0x27, 0xcb, 0x92, 0x8f, 0xc2, 0xa9, 0x04, 0x90, 0x4f, 0xd7, + 0x5c, 0xfb, 0x2f, 0x6c, 0x6e, 0x14, 0xd5, 0x14, 0xae, 0xf1, 0xd9, 0xbb, 0x03, 0x17, 0xa2, 0xc3, + 0x69, 0x49, 0xea, 0xb6, 0xe5, 0xe9, 0xa6, 0x25, 0x8c, 0x4b, 0x3e, 0x4a, 0xde, 0xbd, 0xb9, 0x51, + 0x7c, 0x44, 0xd6, 0x41, 0x9f, 0x26, 0xde, 0xf8, 0x4e, 0x7c, 0x88, 0x01, 0x4a, 0x0a, 0xaa, 0xd2, + 0xd4, 0x57, 0x7c, 0x8b, 0xf9, 0xe2, 0xe6, 0x46, 0xf1, 0x5d, 0xa9, 0x75, 0x98, 0x8c, 0x4a, 0x5e, + 0xa1, 0x3b, 0x71, 0x22, 0x1a, 0x90, 0x10, 0x37, 0x67, 0x1b, 0x14, 0xbf, 0xa1, 0x17, 0xf9, 0xab, + 0x9b, 0x1b, 0xc5, 0xf3, 0x12, 0x7f, 0xcb, 0x36, 0x68, 0xbc, 0xf9, 0x29, 0xa5, 0xd5, 0x5f, 0xc9, + 0xc1, 0xf9, 0x6a, 0x69, 0x76, 0xa6, 0x62, 0xf8, 0x26, 0xcd, 0x82, 0x63, 0xdf, 0x35, 0x0d, 0x69, + 0xf4, 0x2e, 0xc1, 0xe9, 0x18, 0x6a, 0x12, 0xad, 0xa8, 0xc0, 0x98, 0xc6, 0x6f, 0xf3, 0xcd, 0xa5, + 0x96, 0xa0, 0xa9, 0x71, 0x53, 0x2b, 0xba, 0x68, 0x77, 0x62, 0xc4, 0xfa, 0x28, 0x86, 0xaa, 0xae, + 0xda, 0x8e, 0x57, 0x6f, 0x7b, 0x42, 0x09, 0xb0, 0x8f, 0x12, 0x75, 0xb8, 0x82, 0xa8, 0x4b, 0x15, + 0x3e, 0x1f, 0xf2, 0xc9, 0x0c, 0x8c, 0x96, 0x3c, 0xcf, 0x31, 0x97, 0xda, 0x1e, 0x9d, 0xd5, 0x5b, + 0x2d, 0xd3, 0x5a, 0xc1, 0xb1, 0x3e, 0x78, 0xf5, 0xc5, 0x60, 0x8d, 0xec, 0x2a, 0x89, 0xcb, 0xf1, + 0xe2, 0xd2, 0x10, 0xd5, 0x7d, 0x54, 0xad, 0xc9, 0x71, 0xf2, 0x10, 0x8d, 0x97, 0x63, 0x43, 0x34, + 0x95, 0xd7, 0x8e, 0x86, 0xe8, 0xe7, 0x72, 0x70, 0x76, 0xfe, 0x8e, 0xa7, 0x6b, 0xd4, 0xb5, 0xdb, + 0x4e, 0x9d, 0xba, 0x37, 0x5b, 0x86, 0xee, 0xd1, 0x70, 0xa4, 0x16, 0xa1, 0xb7, 0x64, 0x18, 0xd4, + 0x40, 0x76, 0xbd, 0x7c, 0xdb, 0xa7, 0x33, 0x80, 0xc6, 0xe1, 0xe4, 0x51, 0xe8, 0x13, 0x65, 0x90, + 0x7b, 0xef, 0xf8, 0xe0, 0xe6, 0x46, 0xb1, 0xaf, 0xcd, 0x41, 0x9a, 0x8f, 0x63, 0x64, 0x65, 0xda, + 0xa0, 0x8c, 0x2c, 0x17, 0x92, 0x19, 0x1c, 0xa4, 0xf9, 0x38, 0xf2, 0x1a, 0x8c, 0x20, 0xdb, 0xa0, + 0x3d, 0x62, 0xee, 0x3b, 0xe1, 0x4b, 0x57, 0x6e, 0x2c, 0x5f, 0x9a, 0xb0, 0x35, 0x35, 0xc7, 0x2f, + 0xa0, 0xc5, 0x18, 0x90, 0xdb, 0x30, 0x2a, 0x1a, 0x11, 0x32, 0xed, 0xed, 0xc2, 0xf4, 0xe4, 0xe6, + 0x46, 0x71, 0x4c, 0xb4, 0x5f, 0x62, 0x9b, 0x60, 0xc2, 0x18, 0x8b, 0x66, 0x87, 0x8c, 0x0b, 0x5b, + 0x31, 0x16, 0x5f, 0x2c, 0x33, 0x8e, 0x33, 0x51, 0x5f, 0x87, 0x21, 0xb9, 0x20, 0x39, 0x85, 0x5b, + 0x6b, 0x3e, 0x4e, 0x70, 0x53, 0x6e, 0x1a, 0xb8, 0x9f, 0x7e, 0x12, 0x06, 0xcb, 0xd4, 0xad, 0x3b, + 0x66, 0x8b, 0x59, 0x0d, 0x42, 0xc9, 0x8f, 0x6d, 0x6e, 0x14, 0x07, 0x8d, 0x10, 0xac, 0xc9, 0x34, + 0xea, 0xff, 0xcc, 0xc0, 0x29, 0xc6, 0xbb, 0xe4, 0xba, 0xe6, 0x8a, 0xd5, 0x94, 0x97, 0xed, 0xc7, + 0xa1, 0x50, 0xc5, 0xfa, 0x44, 0x4d, 0x27, 0x36, 0x37, 0x8a, 0xa3, 0xbc, 0x05, 0x92, 0x1e, 0x0a, + 0x9a, 0x60, 0x5f, 0x99, 0xdd, 0x62, 0x5f, 0xc9, 0x4c, 0x5a, 0x4f, 0x77, 0x3c, 0xd3, 0x5a, 0xa9, + 0x7a, 0xba, 0xd7, 0x76, 0x23, 0x26, 0xad, 0xc0, 0xd4, 0x5c, 0x44, 0x45, 0x4c, 0xda, 0x48, 0x21, + 0xf2, 0x32, 0x0c, 0x4d, 0x5a, 0x46, 0xc8, 0x84, 0x4f, 0x88, 0x0f, 0x32, 0x4b, 0x93, 0x22, 0x3c, + 0xc9, 0x22, 0x52, 0x40, 0xfd, 0x7b, 0x19, 0x50, 0xf8, 0x26, 0x70, 0xc6, 0x74, 0xbd, 0x59, 0xda, + 0x5c, 0x92, 0x66, 0xa7, 0x29, 0x7f, 0x57, 0xc9, 0x70, 0xd2, 0x5a, 0x84, 0xa6, 0x80, 0xd8, 0x55, + 0x36, 0x4c, 0x37, 0xb1, 0xfd, 0x88, 0x95, 0x22, 0x15, 0xe8, 0xe3, 0x9c, 0xb9, 0x2d, 0x31, 0x78, + 0x55, 0xf1, 0x15, 0x21, 0x5e, 0x35, 0x57, 0x86, 0x26, 0x27, 0x96, 0x37, 0x34, 0xa2, 0xbc, 0xfa, + 0xf7, 0xb3, 0x30, 0x1a, 0x2f, 0x44, 0x6e, 0x43, 0xff, 0xab, 0xb6, 0x69, 0x51, 0x63, 0xde, 0xc2, + 0x16, 0x76, 0x3f, 0x1c, 0xf1, 0x6d, 0xf1, 0xe3, 0x6f, 0x60, 0x99, 0x9a, 0x6c, 0xc1, 0xe2, 0x59, + 0x49, 0xc0, 0x8c, 0x7c, 0x10, 0x06, 0x98, 0x0d, 0x78, 0x17, 0x39, 0x67, 0xb7, 0xe4, 0xfc, 0x90, + 0xe0, 0x7c, 0xc2, 0xe1, 0x85, 0x92, 0xac, 0x43, 0x76, 0x4c, 0xaf, 0x34, 0xaa, 0xbb, 0xb6, 0x25, + 0x7a, 0x1e, 0xf5, 0xca, 0x41, 0x88, 0xac, 0x57, 0x9c, 0x86, 0x99, 0xae, 0xfc, 0x63, 0xb1, 0x1b, + 0xa4, 0xbd, 0x0b, 0x97, 0x55, 0xbc, 0x07, 0x24, 0x62, 0xf5, 0x3b, 0xb3, 0xf0, 0x44, 0x28, 0x32, + 0x8d, 0xde, 0x35, 0xe9, 0x9a, 0x10, 0xe7, 0xaa, 0xd9, 0x12, 0x7b, 0x56, 0xa6, 0xf2, 0xee, 0xc4, + 0xaa, 0x6e, 0xad, 0x50, 0x83, 0x5c, 0x82, 0x5e, 0xcd, 0x6e, 0x50, 0x57, 0xc9, 0xa0, 0xb9, 0x86, + 0xd3, 0x89, 0xc3, 0x00, 0xf2, 0xa1, 0x07, 0x52, 0x10, 0x1b, 0x0a, 0x8b, 0x8e, 0x6e, 0x7a, 0x7e, + 0xcf, 0x96, 0x92, 0x3d, 0xbb, 0x8d, 0x1a, 0x2f, 0x73, 0x1e, 0x7c, 0xce, 0x47, 0x41, 0x78, 0x08, + 0x90, 0x05, 0xc1, 0x49, 0xce, 0x3c, 0x07, 0x83, 0x12, 0xf1, 0x8e, 0x26, 0xf5, 0x2f, 0xe6, 0x65, + 0x5d, 0xf7, 0x9b, 0x25, 0x74, 0xfd, 0x0a, 0xd3, 0x51, 0xd7, 0x65, 0x56, 0x05, 0x57, 0x72, 0xa1, + 0x89, 0x08, 0x8a, 0x6a, 0x22, 0x82, 0xc8, 0x53, 0xd0, 0xcf, 0x59, 0x04, 0xfb, 0x57, 0xdc, 0xfb, + 0x3a, 0x08, 0x8b, 0x2e, 0xcd, 0x01, 0x21, 0xf9, 0x99, 0x0c, 0x9c, 0xeb, 0x2a, 0x09, 0x54, 0x86, + 0xc1, 0xab, 0x4f, 0xef, 0x4a, 0x8c, 0xe3, 0x4f, 0x6c, 0x6e, 0x14, 0x2f, 0x35, 0x03, 0x92, 0x9a, + 0x23, 0xd1, 0xd4, 0xea, 0x9c, 0x48, 0x6a, 0x57, 0xf7, 0xa6, 0x30, 0xe3, 0x91, 0x57, 0x3a, 0x85, + 0x47, 0x47, 0x56, 0x7d, 0xdd, 0x6f, 0x64, 0x3e, 0x34, 0x1e, 0xc5, 0xf7, 0x2e, 0xfb, 0x24, 0x29, + 0xd5, 0x74, 0xe0, 0x42, 0xea, 0x70, 0x9a, 0x63, 0xca, 0xfa, 0xfa, 0xfc, 0xf2, 0xac, 0x6d, 0x79, + 0xab, 0x7e, 0x05, 0xbd, 0xf2, 0xd9, 0x0b, 0x56, 0x60, 0xe8, 0xeb, 0x35, 0x7b, 0xb9, 0xd6, 0x64, + 0x54, 0x29, 0x75, 0x74, 0xe2, 0xc4, 0x26, 0x5a, 0x31, 0xe6, 0xfc, 0x29, 0xa8, 0x10, 0x9e, 0x8c, + 0xf9, 0xe3, 0x34, 0x39, 0xe1, 0xc4, 0x0a, 0xa9, 0x15, 0x18, 0x9a, 0xb1, 0xeb, 0x77, 0x02, 0x75, + 0x79, 0x0e, 0x0a, 0x8b, 0xba, 0xb3, 0x42, 0x3d, 0x94, 0xc5, 0xe0, 0xd5, 0xb1, 0xcb, 0xfc, 0xb4, + 0x99, 0x11, 0x71, 0xc4, 0xf8, 0x88, 0x98, 0x0d, 0x0a, 0x1e, 0xfe, 0xd6, 0x44, 0x01, 0xf5, 0xab, + 0xbd, 0x30, 0x24, 0x4e, 0x46, 0x71, 0x36, 0x27, 0xcf, 0x87, 0x67, 0xcd, 0x62, 0xfa, 0x0a, 0x4e, + 0x87, 0x82, 0x53, 0xad, 0x21, 0xc6, 0xec, 0xb7, 0x37, 0x8a, 0x99, 0xcd, 0x8d, 0x62, 0x8f, 0xd6, + 0x2f, 0x6d, 0x2a, 0xc3, 0xf5, 0x46, 0x5a, 0x60, 0xe5, 0xb3, 0xce, 0x58, 0x59, 0xbe, 0xfe, 0xbc, + 0x0c, 0x7d, 0xa2, 0x0d, 0x42, 0xe3, 0x4e, 0x87, 0x67, 0x19, 0x91, 0x13, 0xde, 0x58, 0x69, 0xbf, + 0x14, 0x79, 0x11, 0x0a, 0x7c, 0x6f, 0x2f, 0x04, 0x70, 0x2a, 0xfd, 0x2c, 0x24, 0x56, 0x5c, 0x94, + 0x21, 0xd3, 0x00, 0xe1, 0xbe, 0x3e, 0x38, 0xd0, 0x16, 0x1c, 0x92, 0x3b, 0xfe, 0x18, 0x17, 0xa9, + 0x2c, 0x79, 0x06, 0x86, 0x16, 0xa9, 0xd3, 0x34, 0x2d, 0xbd, 0x51, 0x35, 0xdf, 0xf4, 0xcf, 0xb4, + 0x71, 0xe1, 0x75, 0xcd, 0x37, 0xe5, 0x91, 0x1b, 0xa1, 0x23, 0x1f, 0x49, 0xdb, 0x37, 0xf7, 0x61, + 0x43, 0x1e, 0xde, 0x72, 0x43, 0x19, 0x6b, 0x4f, 0xca, 0x36, 0xfa, 0x35, 0x18, 0x8e, 0x6c, 0x99, + 0xc4, 0xa1, 0xe5, 0xb9, 0x24, 0x6b, 0x69, 0xff, 0x17, 0x63, 0x1b, 0xe5, 0xc0, 0x34, 0xb9, 0x62, + 0x99, 0x9e, 0xa9, 0x37, 0x26, 0xec, 0x66, 0x53, 0xb7, 0x0c, 0x65, 0x20, 0xd4, 0x64, 0x93, 0x63, + 0x6a, 0x75, 0x8e, 0x92, 0x35, 0x39, 0x5a, 0x88, 0x6d, 0xcb, 0x45, 0x1f, 0x6a, 0xb4, 0x6e, 0x3b, + 0xcc, 0x16, 0xc0, 0x33, 0x49, 0xb1, 0x2d, 0x77, 0x39, 0xae, 0xe6, 0xf8, 0x48, 0xd9, 0xd8, 0x8e, + 0x17, 0x7c, 0x35, 0xdf, 0x3f, 0x38, 0x3a, 0x14, 0x3f, 0x46, 0x56, 0x7f, 0x3a, 0x07, 0x83, 0x82, + 0x94, 0x2d, 0xa5, 0x47, 0x0a, 0xbe, 0x17, 0x05, 0x4f, 0x55, 0xd4, 0xc2, 0x7e, 0x29, 0xaa, 0xfa, + 0xa9, 0x6c, 0x30, 0x1b, 0x2d, 0x38, 0xa6, 0xb5, 0xb7, 0xd9, 0xe8, 0x02, 0xc0, 0xc4, 0x6a, 0xdb, + 0xba, 0xc3, 0xaf, 0xcb, 0xb2, 0xe1, 0x75, 0x59, 0xdd, 0xd4, 0x24, 0x0c, 0x39, 0x07, 0xf9, 0x32, + 0xe3, 0xcf, 0x7a, 0x66, 0x68, 0x7c, 0xe0, 0x2d, 0xce, 0x29, 0xf3, 0x84, 0x86, 0x60, 0xb6, 0xb9, + 0x1a, 0x5f, 0xf7, 0x28, 0x37, 0x67, 0x73, 0x7c, 0x73, 0xb5, 0xc4, 0x00, 0x1a, 0x87, 0x93, 0x6b, + 0x30, 0x56, 0xa6, 0x0d, 0x7d, 0x7d, 0xd6, 0x6c, 0x34, 0x4c, 0x97, 0xd6, 0x6d, 0xcb, 0x70, 0x51, + 0xc8, 0xa2, 0xba, 0xa6, 0xab, 0x25, 0x09, 0x88, 0x0a, 0x85, 0xf9, 0xe5, 0x65, 0x97, 0x7a, 0x28, + 0xbe, 0xdc, 0x38, 0xb0, 0xc9, 0xd9, 0x46, 0x88, 0x26, 0x30, 0xea, 0xcf, 0x67, 0xd8, 0xee, 0xc5, + 0xbd, 0xe3, 0xd9, 0xad, 0x40, 0xcb, 0xf7, 0x24, 0x92, 0x4b, 0xa1, 0x5d, 0x91, 0xc5, 0xaf, 0x3d, + 0x26, 0xbe, 0xb6, 0x4f, 0xd8, 0x16, 0xa1, 0x45, 0x91, 0xfa, 0x55, 0xb9, 0x2d, 0xbe, 0x4a, 0xfd, + 0x93, 0x2c, 0x9c, 0x16, 0x2d, 0x9e, 0x68, 0x98, 0xad, 0x25, 0x5b, 0x77, 0x0c, 0x8d, 0xd6, 0xa9, + 0x79, 0x97, 0x1e, 0xce, 0x81, 0x17, 0x1d, 0x3a, 0xf9, 0x3d, 0x0c, 0x9d, 0xab, 0xb8, 0x11, 0x64, + 0x92, 0xc1, 0x03, 0x5f, 0x6e, 0x54, 0x8c, 0x6e, 0x6e, 0x14, 0x87, 0x0c, 0x0e, 0xc6, 0x23, 0x7f, + 0x4d, 0x26, 0x62, 0x4a, 0x32, 0x43, 0xad, 0x15, 0x6f, 0x15, 0x95, 0xa4, 0x97, 0x2b, 0x49, 0x03, + 0x21, 0x9a, 0xc0, 0xa8, 0xff, 0x35, 0x0b, 0x27, 0xe2, 0x22, 0xaf, 0x52, 0xcb, 0x38, 0x92, 0xf7, + 0xdb, 0x23, 0xef, 0xaf, 0xe7, 0xe0, 0x41, 0x51, 0xa6, 0xba, 0xaa, 0x3b, 0xd4, 0x28, 0x9b, 0x0e, + 0xad, 0x7b, 0xb6, 0xb3, 0x7e, 0x88, 0x0d, 0xa8, 0xfd, 0x13, 0xfb, 0x35, 0x28, 0x88, 0xed, 0x3f, + 0x5f, 0x67, 0x46, 0x82, 0x96, 0x20, 0x34, 0xb1, 0x42, 0xf1, 0xa3, 0x83, 0x58, 0x67, 0x15, 0xb6, + 0xd3, 0x59, 0xef, 0x83, 0xe1, 0x40, 0xf4, 0xb8, 0x11, 0xed, 0x0b, 0xad, 0x2d, 0xc3, 0x47, 0xe0, + 0x5e, 0x54, 0x8b, 0x12, 0x62, 0x6d, 0x3e, 0xa0, 0x52, 0x46, 0x6b, 0x68, 0x58, 0xd4, 0x16, 0x94, + 0x33, 0x0d, 0x4d, 0x26, 0x52, 0x37, 0xf2, 0x70, 0x26, 0xbd, 0xdb, 0x35, 0xaa, 0x1b, 0x47, 0xbd, + 0xfe, 0x4d, 0xd9, 0xeb, 0xe4, 0x61, 0xc8, 0x2f, 0xe8, 0xde, 0xaa, 0xb8, 0x7e, 0xc7, 0x3b, 0xe1, + 0x65, 0xb3, 0x41, 0x6b, 0x2d, 0xdd, 0x5b, 0xd5, 0x10, 0x25, 0xcd, 0x19, 0x80, 0x1c, 0x53, 0xe6, + 0x0c, 0x69, 0xb1, 0x1f, 0x7c, 0x28, 0x73, 0x31, 0x9f, 0xba, 0xd8, 0x7f, 0x35, 0xdf, 0x69, 0x5e, + 0xb9, 0xed, 0x98, 0x1e, 0x3d, 0xd2, 0xb0, 0x23, 0x0d, 0xdb, 0xa3, 0x86, 0xfd, 0x6e, 0x16, 0x86, + 0x83, 0x4d, 0xd3, 0x1b, 0xb4, 0x7e, 0x30, 0x6b, 0x55, 0xb8, 0x95, 0xc9, 0xed, 0x79, 0x2b, 0xb3, + 0x17, 0x85, 0x52, 0x83, 0x23, 0x4f, 0x6e, 0x1a, 0xa0, 0xc4, 0xf8, 0x91, 0x67, 0x70, 0xd0, 0xf9, + 0x30, 0xf4, 0xcd, 0xea, 0xf7, 0xcc, 0x66, 0xbb, 0x29, 0xac, 0x74, 0x74, 0x27, 0x6b, 0xea, 0xf7, + 0x34, 0x1f, 0xae, 0xfe, 0x9b, 0x0c, 0x8c, 0x08, 0xa1, 0x0a, 0xe6, 0x7b, 0x92, 0x6a, 0x28, 0x9d, + 0xec, 0x9e, 0xa5, 0x93, 0xdb, 0xbd, 0x74, 0xd4, 0x1f, 0xc9, 0x81, 0x32, 0x65, 0x36, 0xe8, 0xa2, + 0xa3, 0x5b, 0xee, 0x32, 0x75, 0xc4, 0x76, 0x7a, 0x92, 0xb1, 0xda, 0xd3, 0x07, 0x4a, 0x53, 0x4a, + 0x76, 0x57, 0x53, 0xca, 0x7b, 0x60, 0x40, 0x34, 0x26, 0x70, 0x65, 0xc4, 0x51, 0xe3, 0xf8, 0x40, + 0x2d, 0xc4, 0x33, 0xe2, 0x52, 0xab, 0xe5, 0xd8, 0x77, 0xa9, 0xc3, 0x6f, 0xa9, 0x04, 0xb1, 0xee, + 0x03, 0xb5, 0x10, 0x2f, 0x71, 0xa6, 0xbe, 0xbd, 0x28, 0x73, 0xa6, 0x8e, 0x16, 0xe2, 0xc9, 0x45, + 0xe8, 0x9f, 0xb1, 0xeb, 0x3a, 0x0a, 0x9a, 0x4f, 0x2b, 0x43, 0x9b, 0x1b, 0xc5, 0xfe, 0x86, 0x80, + 0x69, 0x01, 0x96, 0x51, 0x96, 0xed, 0x35, 0xab, 0x61, 0xeb, 0xdc, 0xf9, 0xa5, 0x9f, 0x53, 0x1a, + 0x02, 0xa6, 0x05, 0x58, 0x46, 0xc9, 0x64, 0x8e, 0x4e, 0x45, 0xfd, 0x21, 0xcf, 0x65, 0x01, 0xd3, + 0x02, 0xac, 0xfa, 0xf3, 0x79, 0xa6, 0xbd, 0xae, 0xf9, 0xe6, 0x7d, 0xbf, 0x2e, 0x84, 0x03, 0xa6, + 0x77, 0x17, 0x03, 0xe6, 0xbe, 0x39, 0xb0, 0x53, 0xff, 0xb4, 0x0f, 0x40, 0x48, 0x7f, 0xf2, 0x68, + 0x73, 0xb8, 0x37, 0xad, 0x29, 0xc3, 0xd8, 0xa4, 0xb5, 0xaa, 0x5b, 0x75, 0x6a, 0x84, 0xc7, 0x96, + 0x05, 0x1c, 0xda, 0xe8, 0x04, 0x49, 0x05, 0x32, 0x3c, 0xb7, 0xd4, 0x92, 0x05, 0xc8, 0x93, 0x30, + 0x58, 0xb1, 0x3c, 0xea, 0xe8, 0x75, 0xcf, 0xbc, 0x4b, 0xc5, 0xd4, 0x80, 0x37, 0xc3, 0x66, 0x08, + 0xd6, 0x64, 0x1a, 0x72, 0x0d, 0x86, 0x16, 0x74, 0xc7, 0x33, 0xeb, 0x66, 0x4b, 0xb7, 0x3c, 0x57, + 0xe9, 0xc7, 0x19, 0x0d, 0x2d, 0x8c, 0x96, 0x04, 0xd7, 0x22, 0x54, 0xe4, 0x23, 0x30, 0x80, 0x5b, + 0x53, 0xf4, 0xd7, 0x1e, 0xd8, 0xf2, 0xe2, 0xf0, 0x91, 0xd0, 0x3d, 0x90, 0x9f, 0xbe, 0xe2, 0x0d, + 0x70, 0xfc, 0xee, 0x30, 0xe0, 0x48, 0x3e, 0x00, 0x7d, 0x93, 0x96, 0x81, 0xcc, 0x61, 0x4b, 0xe6, + 0xaa, 0x60, 0x7e, 0x2a, 0x64, 0x6e, 0xb7, 0x62, 0xbc, 0x7d, 0x76, 0xe9, 0xa3, 0x6c, 0xf0, 0xed, + 0x1b, 0x65, 0x43, 0x6f, 0xc3, 0xb1, 0xf8, 0xf0, 0x7e, 0x1d, 0x8b, 0x8f, 0xec, 0xf2, 0x58, 0x5c, + 0x7d, 0x13, 0x06, 0xc7, 0x17, 0xa6, 0x82, 0xd1, 0xfb, 0x00, 0xe4, 0x16, 0x84, 0xa7, 0x42, 0x9e, + 0xdb, 0x33, 0x2d, 0xd3, 0xd0, 0x18, 0x8c, 0x5c, 0x82, 0xfe, 0x09, 0x74, 0x7f, 0x13, 0xb7, 0x88, + 0x79, 0xbe, 0xfe, 0xd5, 0x11, 0x86, 0x5e, 0xb0, 0x3e, 0x9a, 0x3c, 0x0a, 0x7d, 0x0b, 0x8e, 0xbd, + 0xe2, 0xe8, 0x4d, 0xb1, 0x06, 0xa3, 0xab, 0x48, 0x8b, 0x83, 0x34, 0x1f, 0xa7, 0x7e, 0x6f, 0xc6, + 0x37, 0xdb, 0x59, 0x89, 0x6a, 0x1b, 0x8f, 0xe6, 0xb1, 0xee, 0x7e, 0x5e, 0xc2, 0xe5, 0x20, 0xcd, + 0xc7, 0x91, 0x4b, 0xd0, 0x3b, 0xe9, 0x38, 0xb6, 0x23, 0xfb, 0xb8, 0x53, 0x06, 0x90, 0xaf, 0x7b, + 0x91, 0x82, 0x3c, 0x0b, 0x83, 0x7c, 0xce, 0xe1, 0x27, 0x9a, 0xb9, 0x6e, 0x37, 0xa5, 0x32, 0xa5, + 0xfa, 0xe5, 0x9c, 0x64, 0xb3, 0x71, 0x89, 0xdf, 0x87, 0xb7, 0x02, 0x4f, 0x41, 0x6e, 0x7c, 0x61, + 0x4a, 0x4c, 0x80, 0xc7, 0xfd, 0xa2, 0x92, 0xaa, 0xc4, 0xca, 0x31, 0x6a, 0x72, 0x16, 0xf2, 0x0b, + 0x4c, 0x7d, 0x0a, 0xa8, 0x1e, 0xfd, 0x9b, 0x1b, 0xc5, 0x7c, 0x8b, 0xe9, 0x0f, 0x42, 0x11, 0xcb, + 0x36, 0x33, 0x7c, 0xc7, 0xc4, 0xb1, 0xe1, 0x3e, 0xe6, 0x2c, 0xe4, 0x4b, 0xce, 0xca, 0x5d, 0x31, + 0x6b, 0x21, 0x56, 0x77, 0x56, 0xee, 0x6a, 0x08, 0x25, 0x57, 0x00, 0x34, 0xea, 0xb5, 0x1d, 0x0b, + 0x9f, 0x9f, 0x0c, 0xe0, 0xf9, 0x1b, 0xce, 0x86, 0x0e, 0x42, 0x6b, 0x75, 0xdb, 0xa0, 0x9a, 0x44, + 0xa2, 0xfe, 0x64, 0x78, 0xb1, 0x53, 0x36, 0xdd, 0x3b, 0x47, 0x5d, 0xb8, 0x83, 0x2e, 0xd4, 0xc5, + 0x11, 0x67, 0xb2, 0x93, 0x8a, 0xd0, 0x3b, 0xd5, 0xd0, 0x57, 0x5c, 0xec, 0x43, 0xe1, 0x4b, 0xb6, + 0xcc, 0x00, 0x1a, 0x87, 0xc7, 0xfa, 0xa9, 0x7f, 0xeb, 0x7e, 0xfa, 0x7c, 0x6f, 0x30, 0xda, 0xe6, + 0xa8, 0xb7, 0x66, 0x3b, 0x47, 0x5d, 0xb5, 0xdd, 0xae, 0xba, 0x00, 0x7d, 0x55, 0xa7, 0x2e, 0x1d, + 0x5d, 0xe0, 0x7e, 0xc0, 0x75, 0xea, 0xfc, 0xd8, 0xc2, 0x47, 0x32, 0xba, 0xb2, 0xeb, 0x21, 0x5d, + 0x5f, 0x48, 0x67, 0xb8, 0x9e, 0xa0, 0x13, 0x48, 0x41, 0xb7, 0x60, 0x3b, 0x9e, 0xe8, 0xb8, 0x80, + 0xae, 0x65, 0x3b, 0x9e, 0xe6, 0x23, 0xc9, 0x7b, 0x00, 0x16, 0x27, 0x16, 0x7c, 0x67, 0xfb, 0x81, + 0xd0, 0x17, 0x50, 0x78, 0xd9, 0x6b, 0x12, 0x9a, 0x2c, 0xc2, 0xc0, 0x7c, 0x8b, 0x3a, 0x7c, 0x2b, + 0xc4, 0x1f, 0x94, 0xbc, 0x3b, 0x26, 0x5a, 0xd1, 0xef, 0x97, 0xc5, 0xff, 0x01, 0x39, 0x5f, 0x5f, + 0x6c, 0xff, 0xa7, 0x16, 0x32, 0x22, 0xcf, 0x42, 0xa1, 0xc4, 0xed, 0xbc, 0x41, 0x64, 0x19, 0x88, + 0x0c, 0xb7, 0xa0, 0x1c, 0xc5, 0xf7, 0xec, 0x3a, 0xfe, 0xad, 0x09, 0x72, 0xf5, 0x12, 0x8c, 0xc6, + 0xab, 0x21, 0x83, 0xd0, 0x37, 0x31, 0x3f, 0x37, 0x37, 0x39, 0xb1, 0x38, 0xda, 0x43, 0xfa, 0x21, + 0x5f, 0x9d, 0x9c, 0x2b, 0x8f, 0x66, 0xd4, 0x9f, 0x95, 0x66, 0x10, 0xa6, 0x5a, 0x47, 0x57, 0xc3, + 0x7b, 0xba, 0x6f, 0x19, 0xc5, 0xfb, 0x50, 0x3c, 0x31, 0x68, 0x9a, 0x9e, 0x47, 0x0d, 0xb1, 0x4a, + 0xe0, 0x7d, 0xa1, 0x77, 0x4f, 0x4b, 0xe0, 0xc9, 0xe3, 0x30, 0x8c, 0x30, 0x71, 0x45, 0xc8, 0xf7, + 0xc7, 0xa2, 0x80, 0x73, 0x4f, 0x8b, 0x22, 0xd5, 0xaf, 0x84, 0xb7, 0xc3, 0x33, 0x54, 0x3f, 0xac, + 0x37, 0x8a, 0xef, 0x90, 0xfe, 0x52, 0xff, 0x3c, 0xcf, 0x9f, 0x80, 0xf0, 0xf7, 0x82, 0x07, 0x21, + 0xca, 0xf0, 0x48, 0x37, 0xb7, 0x83, 0x23, 0xdd, 0xc7, 0xa1, 0x30, 0x4b, 0xbd, 0x55, 0xdb, 0x77, + 0xfc, 0x42, 0x0f, 0xbd, 0x26, 0x42, 0x64, 0x0f, 0x3d, 0x4e, 0x43, 0xee, 0x00, 0xf1, 0x1f, 0x03, + 0x06, 0x8e, 0xd8, 0xfe, 0x11, 0xf2, 0xe9, 0xc4, 0x3e, 0xa5, 0x8a, 0x2f, 0x81, 0xd1, 0xc7, 0xfe, + 0x44, 0xe0, 0xe8, 0x2d, 0x79, 0x62, 0xfd, 0xd9, 0x46, 0xb1, 0xc0, 0x69, 0xb4, 0x14, 0xb6, 0xe4, + 0x35, 0x18, 0x98, 0x9d, 0x2a, 0x89, 0x87, 0x81, 0xdc, 0x2b, 0xe2, 0x81, 0x40, 0x8a, 0x3e, 0x22, + 0x10, 0x09, 0xbe, 0xb7, 0x69, 0x2e, 0xeb, 0xc9, 0x77, 0x81, 0x21, 0x17, 0xa6, 0x2d, 0xfc, 0xe5, + 0x8e, 0x38, 0x5d, 0x08, 0xb4, 0x25, 0xfa, 0x9e, 0x27, 0x2e, 0x2b, 0x8e, 0x8d, 0x69, 0x4b, 0xff, + 0x1e, 0x46, 0xf7, 0x3c, 0x8c, 0x95, 0x5a, 0xad, 0x86, 0x49, 0x0d, 0xd4, 0x17, 0xad, 0xdd, 0xa0, + 0xae, 0x70, 0xf9, 0xc1, 0xc7, 0x20, 0x3a, 0x47, 0xd6, 0xf0, 0x39, 0x6a, 0xcd, 0x69, 0x47, 0xfd, + 0x33, 0x93, 0x65, 0xd5, 0xef, 0xcf, 0xc2, 0xa9, 0x09, 0x87, 0xea, 0x1e, 0x9d, 0x9d, 0x2a, 0x95, + 0xda, 0xe8, 0x23, 0xd7, 0x68, 0x50, 0x6b, 0xe5, 0x60, 0x86, 0xf5, 0x0b, 0x30, 0x12, 0x34, 0xa0, + 0x5a, 0xb7, 0x5b, 0x54, 0x7e, 0x58, 0x55, 0xf7, 0x31, 0x35, 0x97, 0xa1, 0xb4, 0x18, 0x29, 0xb9, + 0x01, 0xc7, 0x03, 0x48, 0xa9, 0xd1, 0xb0, 0xd7, 0x34, 0xda, 0x76, 0xb9, 0x63, 0x6c, 0x3f, 0x77, + 0x8c, 0x0d, 0x39, 0xe8, 0x0c, 0x5f, 0x73, 0x18, 0x81, 0x96, 0x56, 0x4a, 0xfd, 0x42, 0x0e, 0x4e, + 0xdf, 0xd2, 0x1b, 0xa6, 0x11, 0x8a, 0x46, 0xa3, 0x6e, 0xcb, 0xb6, 0x5c, 0x7a, 0x88, 0x46, 0x69, + 0x64, 0x28, 0xe4, 0xf7, 0x65, 0x28, 0x24, 0xbb, 0xa8, 0x77, 0xcf, 0x5d, 0x54, 0xd8, 0x55, 0x17, + 0xfd, 0x97, 0x0c, 0x8c, 0xfa, 0x8e, 0xff, 0xf2, 0x23, 0x6e, 0xc9, 0x2b, 0x1d, 0x8f, 0x10, 0x63, + 0x7e, 0xd0, 0x88, 0x27, 0x55, 0xe8, 0x9b, 0xbc, 0xd7, 0x32, 0x1d, 0xea, 0x6e, 0xc3, 0x89, 0xfb, + 0x9c, 0x38, 0x2e, 0x19, 0xa3, 0xbc, 0x48, 0xe2, 0xa4, 0x84, 0x83, 0xf1, 0x39, 0x1f, 0x7f, 0xfa, + 0x30, 0xee, 0xbf, 0x4c, 0xe7, 0xcf, 0xf9, 0xc4, 0x13, 0x89, 0xc8, 0xfb, 0xcc, 0x90, 0x94, 0x3c, + 0x02, 0xb9, 0xc5, 0xc5, 0x19, 0x31, 0x93, 0x62, 0x44, 0x00, 0xcf, 0x93, 0xdf, 0x2b, 0x32, 0xac, + 0xfa, 0x87, 0x59, 0x00, 0xa6, 0x0a, 0x7c, 0xb8, 0x1e, 0x88, 0x12, 0x8e, 0x43, 0xbf, 0x2f, 0x70, + 0xa1, 0x86, 0x81, 0xd7, 0x7e, 0xbc, 0x23, 0xe2, 0x75, 0x07, 0x2f, 0x34, 0x8a, 0xbe, 0x23, 0x39, + 0xbf, 0x07, 0xc0, 0x9d, 0x0d, 0x3a, 0x92, 0xfb, 0xee, 0xe3, 0xef, 0x81, 0x01, 0x31, 0xe3, 0xd9, + 0x91, 0xf3, 0xff, 0xba, 0x0f, 0xd4, 0x42, 0x7c, 0x6c, 0x6a, 0x2d, 0xec, 0x61, 0x21, 0xf6, 0xc5, + 0xcb, 0x7b, 0xe5, 0x48, 0xbc, 0xfb, 0x2c, 0xde, 0xcf, 0x08, 0xf1, 0xf2, 0x17, 0x3c, 0x87, 0x56, + 0xbc, 0xfb, 0x76, 0xf6, 0xad, 0xfe, 0x6e, 0x06, 0x08, 0x6b, 0xd6, 0x82, 0xee, 0xba, 0x6b, 0xb6, + 0x63, 0x70, 0xe7, 0xf4, 0x03, 0x11, 0xcc, 0xfe, 0xdd, 0x57, 0x7e, 0xb9, 0x1f, 0x8e, 0x47, 0x1c, + 0x7f, 0x0f, 0xf9, 0x64, 0x75, 0x29, 0x3a, 0x9a, 0xba, 0xbd, 0x7a, 0x79, 0x97, 0x7c, 0x21, 0xda, + 0x1b, 0x79, 0x80, 0x26, 0xdd, 0x84, 0x3e, 0x01, 0x43, 0xe2, 0x07, 0x5b, 0xa1, 0xfd, 0x9b, 0x2e, + 0x1c, 0xa5, 0x2e, 0x03, 0x68, 0x11, 0x34, 0x79, 0x1a, 0x06, 0xd8, 0x80, 0x59, 0xc1, 0xe0, 0x21, + 0x7d, 0xe1, 0x8b, 0x12, 0xc3, 0x07, 0xca, 0xeb, 0x49, 0x40, 0x29, 0xbd, 0x23, 0xea, 0xdf, 0xc6, + 0x3b, 0xa2, 0x8f, 0xc2, 0x60, 0xc9, 0xb2, 0x6c, 0x0f, 0x37, 0xe9, 0xae, 0xb8, 0x9a, 0xe8, 0x68, + 0x95, 0x3f, 0x82, 0x8f, 0xe3, 0x43, 0xfa, 0x54, 0xb3, 0x5c, 0x66, 0x48, 0xae, 0xfa, 0xaf, 0x62, + 0xa8, 0x23, 0xbc, 0xca, 0xf1, 0x7a, 0xc6, 0x11, 0xb0, 0xe4, 0xa3, 0x18, 0xec, 0xbc, 0xe1, 0x05, + 0xc7, 0x6e, 0xd9, 0x2e, 0x35, 0xb8, 0xa0, 0x06, 0xc3, 0x50, 0x03, 0x2d, 0x81, 0xc0, 0x77, 0x6c, + 0x91, 0x40, 0x1e, 0x91, 0x22, 0x64, 0x19, 0x4e, 0xf8, 0x17, 0xc5, 0xc1, 0x8b, 0xc1, 0x4a, 0xd9, + 0x55, 0x86, 0xf0, 0x55, 0x12, 0x89, 0x2b, 0x43, 0xa5, 0x3c, 0x7e, 0xde, 0xbf, 0x16, 0xf1, 0x9f, + 0x1c, 0xd6, 0x4c, 0x43, 0xee, 0xea, 0x54, 0x7e, 0xe4, 0x5b, 0x60, 0x70, 0x56, 0xbf, 0x57, 0x6e, + 0x8b, 0xb3, 0x97, 0xe1, 0xed, 0xdf, 0xbe, 0x34, 0xf5, 0x7b, 0x35, 0x43, 0x94, 0x8b, 0xd9, 0x14, + 0x32, 0x4b, 0x52, 0x83, 0x53, 0x0b, 0x8e, 0xdd, 0xb4, 0x3d, 0x6a, 0xc4, 0x1e, 0xdf, 0x1d, 0x0b, + 0x5f, 0xeb, 0xb6, 0x04, 0x45, 0xad, 0xcb, 0x2b, 0xbc, 0x0e, 0x6c, 0x48, 0x13, 0x8e, 0x95, 0x5c, + 0xb7, 0xdd, 0xa4, 0xe1, 0x0d, 0xd5, 0xe8, 0x96, 0x9f, 0xf1, 0x6e, 0xe1, 0xb5, 0xfc, 0xa0, 0x8e, + 0x45, 0xf9, 0x05, 0x55, 0xcd, 0x33, 0xe5, 0x1a, 0xf1, 0x5b, 0xe2, 0xbc, 0x5f, 0xcd, 0xf7, 0x8f, + 0x8c, 0x1e, 0xd3, 0x4e, 0x27, 0x1b, 0xb3, 0x68, 0x7a, 0x0d, 0xaa, 0x7e, 0x29, 0x03, 0x10, 0x0a, + 0x98, 0x3c, 0x11, 0x8d, 0x50, 0x94, 0x09, 0x2f, 0x3a, 0x44, 0xf4, 0x82, 0x48, 0x48, 0x22, 0x72, + 0x16, 0xf2, 0x18, 0xe1, 0x22, 0x1b, 0x1e, 0xac, 0xde, 0x31, 0x2d, 0x43, 0x43, 0x28, 0xc3, 0x4a, + 0x4f, 0xd1, 0x11, 0x8b, 0x97, 0xfa, 0xdc, 0x2a, 0x2c, 0xc3, 0xb1, 0x6a, 0x7b, 0xc9, 0xaf, 0x5b, + 0x7a, 0x57, 0x87, 0x81, 0x36, 0xdc, 0xf6, 0x52, 0xf0, 0x18, 0x35, 0x12, 0xc6, 0x24, 0x5a, 0x44, + 0xfd, 0xf9, 0x4c, 0x6c, 0x16, 0x3c, 0xc0, 0x45, 0xef, 0x5d, 0x49, 0x3f, 0x8d, 0xe4, 0xb4, 0xa4, + 0xfe, 0x68, 0x16, 0x06, 0x17, 0x6c, 0xc7, 0x13, 0x21, 0x43, 0x0e, 0xf7, 0x2a, 0x24, 0xed, 0x95, + 0xf2, 0x3b, 0xd8, 0x2b, 0x9d, 0x85, 0xbc, 0xe4, 0xa2, 0xcc, 0xef, 0x45, 0x0c, 0xc3, 0xd1, 0x10, + 0xaa, 0x7e, 0x6b, 0x16, 0xe0, 0x03, 0x4f, 0x3e, 0x79, 0x1f, 0x0b, 0x48, 0xfd, 0xe1, 0x0c, 0x1c, + 0x13, 0x17, 0x75, 0x52, 0xac, 0xaf, 0x3e, 0xff, 0x8a, 0x55, 0x1e, 0x97, 0x1c, 0xa4, 0xf9, 0x38, + 0xb6, 0x04, 0x4c, 0xde, 0x33, 0x3d, 0xbc, 0xab, 0x90, 0x82, 0x7d, 0x51, 0x01, 0x93, 0x97, 0x00, + 0x9f, 0x8e, 0x3c, 0xe1, 0x5f, 0x41, 0xe6, 0xc2, 0x75, 0x8f, 0x15, 0x98, 0x4c, 0xbd, 0x86, 0x54, + 0x7f, 0x29, 0x0f, 0xf9, 0xc9, 0x7b, 0xb4, 0x7e, 0xc8, 0xbb, 0x46, 0x3a, 0xd8, 0xcc, 0xef, 0xf1, + 0x60, 0x73, 0x37, 0x3e, 0x15, 0x2f, 0x87, 0xfd, 0x59, 0x88, 0x56, 0x1f, 0xeb, 0xf9, 0x78, 0xf5, + 0x7e, 0x4f, 0x1f, 0x3e, 0x97, 0x9c, 0x7f, 0x96, 0x83, 0x5c, 0x75, 0x62, 0xe1, 0x48, 0x6f, 0x0e, + 0x54, 0x6f, 0xba, 0xdf, 0x59, 0xab, 0xc1, 0x35, 0x54, 0x7f, 0xe8, 0x25, 0x1a, 0xbb, 0x71, 0xfa, + 0x7a, 0x0e, 0x46, 0xaa, 0x53, 0x8b, 0x0b, 0xd2, 0x49, 0xf0, 0x0d, 0xee, 0xc9, 0x87, 0x3e, 0x65, + 0xbc, 0x4b, 0xcf, 0x26, 0xec, 0x99, 0x9b, 0x15, 0xcb, 0x7b, 0xe6, 0xda, 0x2d, 0xbd, 0xd1, 0xa6, + 0x78, 0xf4, 0xc2, 0xfd, 0x7e, 0x5d, 0xf3, 0x4d, 0xfa, 0x05, 0x7c, 0xf8, 0xef, 0x33, 0x20, 0x2f, + 0x40, 0xee, 0xa6, 0xf0, 0xc8, 0xe8, 0xc4, 0xe7, 0xa9, 0xab, 0x9c, 0x0f, 0x9b, 0x04, 0x73, 0x6d, + 0xd3, 0x40, 0x0e, 0xac, 0x14, 0x2b, 0x7c, 0x5d, 0x2c, 0xc0, 0xdb, 0x2a, 0xbc, 0xe2, 0x17, 0xbe, + 0x5e, 0x29, 0x93, 0x2a, 0x0c, 0x2e, 0x50, 0xa7, 0x69, 0x62, 0x47, 0xf9, 0x73, 0x76, 0x77, 0x26, + 0x6c, 0xa7, 0x32, 0xd8, 0x0a, 0x0b, 0x21, 0x33, 0x99, 0x0b, 0x79, 0x1d, 0x80, 0xdb, 0x28, 0xdb, + 0x8c, 0x1f, 0x79, 0x0e, 0xed, 0x7e, 0x6e, 0x5a, 0xa6, 0xd8, 0x78, 0x12, 0x33, 0x72, 0x07, 0x46, + 0x67, 0x6d, 0xc3, 0x5c, 0x36, 0xb9, 0xeb, 0x25, 0x56, 0x50, 0xd8, 0xda, 0xe1, 0x89, 0x99, 0x92, + 0x4d, 0xa9, 0x5c, 0x5a, 0x35, 0x09, 0xc6, 0xea, 0x3f, 0xee, 0x85, 0x3c, 0xeb, 0xf6, 0xa3, 0xf1, + 0xbb, 0x97, 0xf1, 0x5b, 0x82, 0xd1, 0xdb, 0xb6, 0x73, 0xc7, 0xb4, 0x56, 0x02, 0xaf, 0x78, 0xb1, + 0x37, 0x45, 0x4f, 0x9e, 0x35, 0x8e, 0xab, 0x05, 0x0e, 0xf4, 0x5a, 0x82, 0x7c, 0x8b, 0x11, 0xfc, + 0x1c, 0x00, 0x7f, 0xeb, 0x8e, 0x34, 0xfd, 0x61, 0xb0, 0x0a, 0xfe, 0x12, 0x1e, 0x1d, 0xed, 0xe5, + 0x60, 0x15, 0x21, 0x31, 0xdb, 0x84, 0x73, 0x5f, 0x88, 0x01, 0xf4, 0xbb, 0xc7, 0x4d, 0x38, 0xfa, + 0x42, 0xc8, 0x46, 0x00, 0xf7, 0x8a, 0x58, 0x00, 0x90, 0xee, 0x97, 0x20, 0x26, 0x88, 0xc8, 0xe4, + 0x20, 0xc2, 0xc3, 0xa5, 0x5c, 0x2f, 0x69, 0x12, 0x0f, 0xf2, 0x4c, 0xec, 0x02, 0x9c, 0x44, 0xb8, + 0x75, 0xbc, 0xff, 0x0e, 0x1d, 0xa8, 0x86, 0xb6, 0x72, 0xa0, 0x52, 0x3f, 0x95, 0x85, 0x81, 0x6a, + 0x7b, 0xc9, 0x5d, 0x77, 0x3d, 0xda, 0x3c, 0xe4, 0x6a, 0xec, 0x6f, 0xaf, 0xf2, 0xa9, 0xdb, 0xab, + 0x47, 0x7c, 0xa1, 0x48, 0xe7, 0x8e, 0x81, 0x49, 0xe7, 0x8b, 0xe3, 0x1f, 0x64, 0x61, 0x94, 0x5f, + 0x9c, 0x95, 0x4d, 0xb7, 0xbe, 0x0f, 0xce, 0xfc, 0x07, 0x2f, 0x95, 0xbd, 0x5d, 0x36, 0x6f, 0xe3, + 0x89, 0x84, 0xfa, 0xf1, 0x2c, 0x0c, 0x96, 0xda, 0xde, 0x6a, 0xc9, 0x43, 0xdd, 0xba, 0x2f, 0xf7, + 0x27, 0xbf, 0x99, 0x81, 0x63, 0xac, 0x21, 0x8b, 0xf6, 0x1d, 0x6a, 0xed, 0xc3, 0xc1, 0xa3, 0x7c, + 0x80, 0x98, 0xdd, 0xe5, 0x01, 0xa2, 0x2f, 0xcb, 0xdc, 0xce, 0x64, 0x89, 0xc7, 0xe5, 0x9a, 0xdd, + 0xa0, 0x87, 0xfb, 0x33, 0xf6, 0xf1, 0xb8, 0xdc, 0x17, 0xc8, 0x3e, 0x5c, 0xcf, 0x7c, 0x73, 0x09, + 0x64, 0x1f, 0xce, 0x96, 0xbe, 0x39, 0x04, 0xf2, 0xe5, 0x0c, 0x0c, 0x8c, 0xdb, 0xde, 0x21, 0x1f, + 0xf8, 0xe2, 0x2b, 0x0e, 0xb7, 0x9a, 0xfb, 0x5f, 0x71, 0xb8, 0x75, 0x53, 0xfd, 0x81, 0x2c, 0x9c, + 0x10, 0xb1, 0xc1, 0xc5, 0xf9, 0xc3, 0xd1, 0x74, 0x2c, 0x06, 0x5b, 0x52, 0x34, 0x47, 0xf3, 0x90, + 0x10, 0xcd, 0x4f, 0xe5, 0xe0, 0x04, 0x86, 0x32, 0x65, 0xdb, 0xb2, 0x6f, 0x02, 0x5b, 0x84, 0xd4, + 0xa3, 0x97, 0xa0, 0xb3, 0x29, 0x97, 0xa0, 0x7f, 0xb6, 0x51, 0x7c, 0x66, 0xc5, 0xf4, 0x56, 0xdb, + 0x4b, 0x97, 0xeb, 0x76, 0xf3, 0xca, 0x8a, 0xa3, 0xdf, 0x35, 0xf9, 0xf5, 0x9f, 0xde, 0xb8, 0x12, + 0xa4, 0xd9, 0xd0, 0x5b, 0xa6, 0x48, 0xc0, 0x51, 0xc5, 0xbd, 0x0e, 0xe3, 0xea, 0x5f, 0x9f, 0xba, + 0x00, 0xaf, 0xda, 0xa6, 0x25, 0x7c, 0x0a, 0xb9, 0xa1, 0x5b, 0x65, 0xfb, 0xc3, 0x37, 0x6c, 0xd3, + 0xaa, 0xc5, 0x1d, 0x0b, 0x77, 0x5a, 0x5f, 0xc8, 0x5a, 0x93, 0xaa, 0x51, 0xff, 0x75, 0x06, 0x1e, + 0x88, 0x6a, 0xf1, 0x37, 0x83, 0xed, 0xf8, 0x83, 0x59, 0x38, 0x79, 0x1d, 0x85, 0x13, 0x38, 0x72, + 0x1c, 0xcd, 0x5b, 0x62, 0x70, 0xa6, 0xc8, 0xe6, 0xc8, 0xa2, 0xec, 0x2c, 0x9b, 0xa3, 0x49, 0x5d, + 0xc8, 0xe6, 0xb7, 0x32, 0x70, 0x7c, 0xbe, 0x52, 0x9e, 0xf8, 0x26, 0x19, 0x51, 0xc9, 0xef, 0x39, + 0xe4, 0x06, 0x67, 0xe2, 0x7b, 0x0e, 0xb9, 0xe9, 0xf9, 0xb9, 0x2c, 0x1c, 0xaf, 0x96, 0x66, 0x67, + 0xbe, 0x59, 0x66, 0xf0, 0x09, 0xd9, 0xeb, 0xd0, 0x3f, 0x04, 0x13, 0xb6, 0x80, 0xfc, 0x99, 0xb7, + 0xae, 0x76, 0xf6, 0x46, 0x4c, 0x0a, 0xe5, 0x90, 0x4f, 0xdd, 0xfb, 0x22, 0x14, 0xa6, 0xf9, 0x11, + 0xea, 0x43, 0xae, 0xf9, 0xff, 0xb4, 0x00, 0x83, 0x37, 0xda, 0x4b, 0x54, 0x38, 0xa7, 0xdc, 0xd7, + 0x27, 0xbf, 0x57, 0x61, 0x50, 0x88, 0x01, 0x6f, 0x4d, 0xa4, 0xe0, 0x79, 0x22, 0x18, 0x0a, 0x8f, + 0x4f, 0x24, 0x13, 0x91, 0xb3, 0x90, 0xbf, 0x45, 0x9d, 0x25, 0xf9, 0x5d, 0xe9, 0x5d, 0xea, 0x2c, + 0x69, 0x08, 0x25, 0x33, 0xa1, 0xcb, 0x7c, 0x69, 0xa1, 0x82, 0x89, 0x54, 0xc4, 0x85, 0x0d, 0x66, + 0x86, 0x09, 0xfc, 0xde, 0xf4, 0x96, 0xc9, 0x53, 0xb0, 0xc8, 0x6f, 0xda, 0xe3, 0x25, 0xc9, 0x1c, + 0x8c, 0xc9, 0x8e, 0x4f, 0x3c, 0x8b, 0x48, 0x7f, 0x0a, 0xbb, 0xb4, 0xfc, 0x21, 0xc9, 0xa2, 0xe4, + 0x65, 0x18, 0xf2, 0x81, 0xe8, 0xc2, 0x35, 0x10, 0x86, 0xae, 0x0f, 0x58, 0xc5, 0x52, 0x14, 0x45, + 0x0a, 0xc8, 0x0c, 0xf0, 0x1a, 0x02, 0x52, 0x18, 0xc4, 0x5c, 0xe2, 0x22, 0x05, 0xc8, 0xd3, 0xc8, + 0x00, 0x9f, 0x79, 0xa0, 0xb3, 0xca, 0x20, 0x3e, 0xba, 0x44, 0x97, 0x7c, 0x47, 0xc0, 0xf9, 0xd3, + 0xda, 0x08, 0x19, 0x99, 0x07, 0x08, 0x9d, 0x0a, 0x44, 0x00, 0x83, 0x1d, 0xbb, 0x3b, 0x48, 0x2c, + 0xe4, 0xeb, 0xc0, 0xe1, 0xdd, 0x5c, 0x07, 0xaa, 0xbf, 0x93, 0x85, 0xc1, 0x52, 0xab, 0x15, 0x0c, + 0x85, 0x27, 0xa0, 0x50, 0x6a, 0xb5, 0x6e, 0x6a, 0x15, 0x39, 0x94, 0xb9, 0xde, 0x6a, 0xd5, 0xda, + 0x8e, 0x29, 0xfb, 0x84, 0x72, 0x22, 0x32, 0x01, 0xc3, 0xa5, 0x56, 0x6b, 0xa1, 0xbd, 0xd4, 0x30, + 0xeb, 0x52, 0x66, 0x24, 0x9e, 0x3b, 0xae, 0xd5, 0xaa, 0xb5, 0x10, 0x13, 0x4f, 0x8f, 0x15, 0x2d, + 0x43, 0x3e, 0x8a, 0x61, 0x7f, 0x44, 0x62, 0x1e, 0x9e, 0xfa, 0x43, 0x0d, 0x82, 0x98, 0x87, 0x6d, + 0xbb, 0x1c, 0x10, 0xf1, 0x60, 0xef, 0x67, 0xfd, 0x90, 0xf9, 0xac, 0xa2, 0x44, 0x02, 0x9e, 0x90, + 0x25, 0x79, 0x2f, 0xf4, 0x95, 0x5a, 0x2d, 0xe9, 0xbe, 0x09, 0x9d, 0x8a, 0x58, 0xa9, 0x78, 0xee, + 0x33, 0x41, 0x76, 0xe6, 0x45, 0x18, 0x89, 0x56, 0xb6, 0xa3, 0x60, 0xf1, 0xdf, 0xc8, 0xe0, 0x07, + 0x1d, 0x72, 0x9f, 0xe6, 0xa7, 0x20, 0x57, 0x6a, 0xb5, 0xc4, 0x7c, 0x74, 0x3c, 0xa5, 0x3f, 0xe2, + 0x4f, 0xa0, 0x4b, 0xad, 0x96, 0xff, 0xe9, 0x87, 0xfc, 0x71, 0xc4, 0xae, 0x3e, 0xfd, 0xcb, 0xfc, + 0xd3, 0x0f, 0xf7, 0xc3, 0x05, 0xf5, 0x97, 0x72, 0x70, 0xac, 0xd4, 0x6a, 0x1d, 0x05, 0x99, 0xdf, + 0xaf, 0x87, 0xd6, 0x4f, 0x02, 0x48, 0xd3, 0x63, 0x5f, 0xf0, 0x74, 0x6b, 0x50, 0x9a, 0x1a, 0x95, + 0x8c, 0x26, 0x11, 0xf9, 0xea, 0xd7, 0xbf, 0x23, 0xf5, 0xfb, 0x78, 0x0e, 0xa7, 0xe2, 0xc3, 0x1e, + 0x34, 0xea, 0x9d, 0xd2, 0x6d, 0xa2, 0x0f, 0x0a, 0x3b, 0xea, 0x83, 0xdf, 0x88, 0x0c, 0x1e, 0x0c, + 0x5a, 0x7e, 0xd4, 0x0b, 0xbd, 0x7b, 0x32, 0x8b, 0x47, 0x64, 0x61, 0x8a, 0x48, 0x36, 0x7e, 0x22, + 0x25, 0x11, 0x57, 0xa9, 0xce, 0x50, 0x35, 0xd3, 0xd0, 0x62, 0xb4, 0x7e, 0x1f, 0xf6, 0xed, 0xa8, + 0x0f, 0x37, 0xb2, 0xf8, 0x76, 0x3a, 0x88, 0xcb, 0xb4, 0xf7, 0xdd, 0xc5, 0x15, 0x00, 0xee, 0x79, + 0x10, 0xb8, 0x35, 0x0f, 0xf3, 0x10, 0x2c, 0x3c, 0xbf, 0x92, 0x08, 0xc1, 0x12, 0x92, 0x04, 0x1e, + 0x52, 0xb9, 0x54, 0x0f, 0xa9, 0x4b, 0xd0, 0xaf, 0xe9, 0x6b, 0xaf, 0xb5, 0xa9, 0xb3, 0x2e, 0xcc, + 0x19, 0x1e, 0xf6, 0x50, 0x5f, 0xab, 0x7d, 0x8c, 0x01, 0xb5, 0x00, 0x4d, 0xd4, 0xe0, 0xf1, 0xbd, + 0xe4, 0x11, 0xc2, 0xcf, 0xc8, 0x83, 0x27, 0xf7, 0xbb, 0x51, 0x74, 0xf2, 0x3c, 0xe4, 0x4a, 0xb7, + 0xab, 0x42, 0xb2, 0x41, 0xd7, 0x96, 0x6e, 0x57, 0x85, 0xbc, 0x3a, 0x96, 0xbd, 0x5d, 0x55, 0x3f, + 0x9e, 0x05, 0x92, 0xa4, 0x24, 0xcf, 0xc0, 0x00, 0x42, 0x57, 0x98, 0xce, 0xc8, 0x89, 0x39, 0xd7, + 0xdc, 0x9a, 0x83, 0xd0, 0x88, 0x71, 0xe7, 0x93, 0x92, 0xe7, 0x30, 0xf5, 0xb1, 0x48, 0x0d, 0x17, + 0x49, 0xcc, 0xb9, 0xe6, 0xfa, 0xc9, 0x82, 0x63, 0x99, 0x8f, 0x05, 0x31, 0xda, 0x85, 0xb7, 0xab, + 0xd3, 0xb6, 0xeb, 0x09, 0x51, 0x73, 0xbb, 0x70, 0xcd, 0xc5, 0x8c, 0xb0, 0x11, 0xbb, 0x90, 0x93, + 0x61, 0x56, 0xab, 0xdb, 0x55, 0xfe, 0x4c, 0xc5, 0xd0, 0xec, 0x86, 0x6f, 0x50, 0xf2, 0xac, 0x56, + 0x6b, 0x6e, 0x8d, 0x3f, 0x71, 0x31, 0x30, 0xe7, 0x72, 0x24, 0xab, 0x55, 0xa4, 0x94, 0xfa, 0xe9, + 0x7e, 0x18, 0x2d, 0xeb, 0x9e, 0xbe, 0xa4, 0xbb, 0x54, 0xda, 0x4d, 0x1f, 0xf3, 0x61, 0xfe, 0xe7, + 0x48, 0x72, 0x30, 0x96, 0x52, 0xbe, 0x26, 0x5e, 0x80, 0xbc, 0x10, 0xf2, 0x0d, 0x72, 0x8e, 0xca, + 0x49, 0xcc, 0x96, 0x6a, 0x2d, 0x01, 0xd6, 0x12, 0x84, 0xe4, 0x71, 0x18, 0xf4, 0x61, 0x6c, 0x03, + 0x90, 0x0b, 0x75, 0xc6, 0x58, 0x62, 0xf6, 0xbf, 0x26, 0xa3, 0xc9, 0x73, 0x30, 0xe4, 0xff, 0x94, + 0x4c, 0x6b, 0x9e, 0x91, 0x6d, 0x29, 0xb1, 0x7b, 0x92, 0x49, 0xe5, 0xa2, 0x38, 0xbf, 0xf5, 0x46, + 0x8a, 0xc6, 0x92, 0x9e, 0x45, 0x48, 0xc9, 0xc7, 0x60, 0xc4, 0xff, 0x2d, 0x36, 0x0c, 0x3c, 0x3f, + 0xdc, 0xe3, 0x41, 0x4a, 0xe7, 0x98, 0x58, 0x2f, 0x47, 0xc9, 0xf9, 0xd6, 0xe1, 0x41, 0x3f, 0x8f, + 0x97, 0xb1, 0x94, 0xdc, 0x39, 0xc4, 0x2a, 0x20, 0x15, 0x18, 0xf3, 0x21, 0xa1, 0x86, 0xf6, 0x85, + 0x3b, 0x46, 0x63, 0xa9, 0x96, 0xaa, 0xa4, 0xc9, 0x52, 0xa4, 0x01, 0x67, 0x23, 0x40, 0xc3, 0x5d, + 0x35, 0x97, 0x3d, 0xb1, 0xdd, 0x13, 0x31, 0x88, 0x45, 0xe2, 0xc6, 0x80, 0x2b, 0xa7, 0xf1, 0x33, + 0xb0, 0x46, 0xb3, 0x43, 0x75, 0xe5, 0x46, 0xaa, 0x70, 0xc2, 0xc7, 0x5f, 0x9f, 0x58, 0x58, 0x70, + 0xec, 0x37, 0x68, 0xdd, 0xab, 0x94, 0xc5, 0x76, 0x19, 0x63, 0xd3, 0x19, 0x4b, 0xb5, 0x95, 0x7a, + 0x8b, 0x29, 0x05, 0xc3, 0x45, 0x99, 0xa7, 0x16, 0x26, 0xb7, 0xe0, 0xa4, 0x04, 0x97, 0xd2, 0x43, + 0x43, 0xb8, 0x9f, 0x17, 0x5c, 0xd3, 0x33, 0x44, 0xa7, 0x17, 0x27, 0x2f, 0xc2, 0xb0, 0x8f, 0xe0, + 0xb7, 0x88, 0x83, 0x78, 0x8b, 0x88, 0x43, 0xd2, 0x58, 0xaa, 0xc5, 0x5f, 0x53, 0x46, 0x89, 0x65, + 0x8d, 0xc2, 0x8c, 0xfa, 0x43, 0x11, 0x8d, 0xf2, 0xd6, 0x5b, 0xa9, 0xca, 0x88, 0x59, 0xf6, 0x5f, + 0x0e, 0x35, 0x6a, 0xde, 0x31, 0x57, 0x4c, 0xbe, 0x93, 0xf6, 0x1f, 0x50, 0x2e, 0xd5, 0x6c, 0x04, + 0xa6, 0xe9, 0x07, 0x27, 0x3f, 0x53, 0x82, 0xe3, 0x29, 0x3a, 0xb6, 0xa3, 0x1d, 0xe3, 0xa7, 0xb2, + 0x61, 0x23, 0x0e, 0xf9, 0xb6, 0x71, 0x1c, 0xfa, 0xfd, 0x2f, 0x11, 0xc6, 0x83, 0xd2, 0x69, 0x68, + 0xc6, 0x79, 0xf8, 0xf8, 0x88, 0x38, 0x0e, 0xf9, 0x56, 0x72, 0x3f, 0xc4, 0xf1, 0x56, 0x26, 0x14, + 0xc7, 0x21, 0xdf, 0x5e, 0xfe, 0x56, 0x2e, 0x9c, 0x93, 0x8e, 0xf6, 0x98, 0xfb, 0x65, 0x26, 0x87, + 0x7e, 0xb0, 0x85, 0x1d, 0x3c, 0x64, 0x94, 0x55, 0xb3, 0x6f, 0x97, 0xaa, 0xf9, 0x7b, 0xc9, 0xfe, + 0xe4, 0xa6, 0xe7, 0xa1, 0xec, 0xcf, 0x7d, 0x18, 0xac, 0xe4, 0x6a, 0xb8, 0x8e, 0x71, 0x1b, 0xbd, + 0x57, 0x0a, 0xf1, 0xb7, 0x24, 0x4c, 0xf4, 0x28, 0x09, 0xf9, 0x10, 0x9c, 0x8e, 0x00, 0x16, 0x74, + 0x47, 0x6f, 0x52, 0x2f, 0xcc, 0x38, 0x88, 0x41, 0x9b, 0xfc, 0xd2, 0xb5, 0x56, 0x80, 0x96, 0xb3, + 0x18, 0x76, 0xe0, 0x20, 0x29, 0x47, 0xdf, 0x0e, 0x9c, 0xa4, 0x3f, 0x9f, 0x0b, 0x4d, 0x95, 0x68, + 0xf0, 0x55, 0x8d, 0xba, 0xed, 0x86, 0x77, 0xff, 0x76, 0xf0, 0xee, 0x52, 0x5b, 0x4c, 0xc3, 0xb1, + 0xd2, 0xf2, 0x32, 0xad, 0x7b, 0x7e, 0x4c, 0x69, 0x57, 0x84, 0xdb, 0xe3, 0x5b, 0x07, 0x81, 0x12, + 0x31, 0x82, 0x23, 0xb9, 0xf1, 0x63, 0xc5, 0xd4, 0xdf, 0xcf, 0x83, 0x12, 0x98, 0xee, 0xc1, 0x43, + 0xad, 0x03, 0x5c, 0x26, 0xdf, 0x11, 0xbd, 0x62, 0xc2, 0x58, 0x28, 0x8c, 0x6a, 0xbb, 0xd9, 0xd4, + 0x71, 0xe8, 0xb1, 0xad, 0x41, 0x31, 0xce, 0x2c, 0x24, 0xe4, 0xbb, 0x81, 0x33, 0x62, 0x37, 0x40, + 0xc2, 0x87, 0x70, 0x35, 0x97, 0xb3, 0xd0, 0x92, 0x5c, 0xc9, 0x67, 0x32, 0x70, 0xc2, 0xef, 0x94, + 0xf9, 0x25, 0x66, 0x16, 0x4f, 0xd8, 0x6d, 0xcb, 0xf3, 0x77, 0x22, 0xcf, 0x77, 0xae, 0x8e, 0x77, + 0xd2, 0xe5, 0xb4, 0xc2, 0xbc, 0x25, 0x41, 0x60, 0x89, 0x40, 0x21, 0x6c, 0xa4, 0xa9, 0xd5, 0x91, + 0x48, 0x4b, 0xad, 0xf7, 0xcc, 0x75, 0x78, 0xa0, 0x23, 0xcb, 0xad, 0xcc, 0xd0, 0x5e, 0xd9, 0x0c, + 0xfd, 0xb7, 0x99, 0x70, 0x22, 0x8a, 0x09, 0x89, 0x5c, 0x06, 0x08, 0x41, 0x62, 0x63, 0x3a, 0xb2, + 0xb9, 0x51, 0x84, 0x50, 0x68, 0x9a, 0x44, 0x41, 0xe6, 0xa1, 0x20, 0xc4, 0xc2, 0xb3, 0xfb, 0xbe, + 0x67, 0x8b, 0x5e, 0xb8, 0x2c, 0xcb, 0x01, 0x37, 0x9d, 0xe2, 0x9b, 0x05, 0x9b, 0x33, 0xcf, 0xc1, + 0xe0, 0x6e, 0xbf, 0xeb, 0x33, 0x39, 0x20, 0xf2, 0x2e, 0xf2, 0x00, 0x4d, 0xec, 0x43, 0x3c, 0x85, + 0x5d, 0x84, 0x7e, 0xf6, 0x09, 0x98, 0xef, 0x42, 0x8a, 0x6f, 0xdb, 0x16, 0x30, 0x2d, 0xc0, 0x86, + 0xc1, 0xa5, 0xfa, 0xd2, 0x83, 0x4b, 0xa9, 0xdf, 0x97, 0x83, 0x53, 0x72, 0x87, 0x94, 0x29, 0x86, + 0xcc, 0x3f, 0xea, 0x94, 0xb7, 0xb1, 0x53, 0x54, 0x28, 0xf0, 0xcd, 0x83, 0xc8, 0x5d, 0xc0, 0x0f, + 0x76, 0x10, 0xa2, 0x09, 0x8c, 0xfa, 0x1f, 0xb3, 0x30, 0xbc, 0x60, 0xbb, 0xde, 0x8a, 0x43, 0xdd, + 0x05, 0xdd, 0x71, 0xef, 0xe3, 0xee, 0x78, 0x1f, 0x0c, 0x63, 0x78, 0xa0, 0x26, 0xb5, 0x78, 0x08, + 0x9d, 0x5e, 0x29, 0xd9, 0x88, 0x8f, 0x10, 0x79, 0xa5, 0x22, 0x84, 0x4c, 0xfb, 0xb9, 0xe5, 0x27, + 0x05, 0x6d, 0xe2, 0x66, 0x1f, 0x87, 0xab, 0x3f, 0x9e, 0x83, 0x21, 0x5f, 0xca, 0xe3, 0xe6, 0x61, + 0xbd, 0xa9, 0x39, 0x58, 0x21, 0x5f, 0x01, 0x58, 0xb0, 0x1d, 0x4f, 0x6f, 0xcc, 0x85, 0x9a, 0x8f, + 0x47, 0x9c, 0x2d, 0x84, 0xf2, 0x32, 0x12, 0x09, 0xae, 0x5f, 0xa1, 0x59, 0xcd, 0x27, 0x26, 0xbe, + 0x7e, 0x05, 0x50, 0x4d, 0xa2, 0x50, 0x7f, 0x2d, 0x0b, 0xc7, 0xfc, 0x4e, 0x9a, 0xbc, 0x47, 0xeb, + 0xed, 0xfb, 0x79, 0x6e, 0x8a, 0x4a, 0xbb, 0x77, 0x4b, 0x69, 0xab, 0xff, 0x43, 0x9a, 0x48, 0x26, + 0x1a, 0xf6, 0xd1, 0x44, 0xf2, 0x17, 0xa1, 0xe3, 0xea, 0xb7, 0xe7, 0xe0, 0x84, 0x2f, 0xf5, 0xa9, + 0xb6, 0x85, 0x87, 0x03, 0x13, 0x7a, 0xa3, 0x71, 0x3f, 0xef, 0xc6, 0x07, 0x7d, 0x41, 0xcc, 0x8b, + 0x78, 0x7b, 0x22, 0xc7, 0xdf, 0xb2, 0x00, 0xd7, 0x6c, 0xd3, 0xd0, 0x64, 0x22, 0xf2, 0x32, 0x0c, + 0xf9, 0x3f, 0x4b, 0xce, 0x8a, 0xbf, 0x05, 0xc7, 0xa3, 0xfe, 0xa0, 0x90, 0xee, 0x44, 0xc2, 0x0a, + 0x44, 0x0a, 0xa8, 0xff, 0xb9, 0x00, 0x67, 0x6e, 0x9b, 0x96, 0x61, 0xaf, 0xb9, 0x7e, 0x8a, 0xc8, + 0x43, 0x7f, 0xd4, 0x75, 0xd0, 0xa9, 0x21, 0x5f, 0x83, 0x93, 0x71, 0x91, 0x3a, 0x41, 0xe0, 0x6e, + 0xd1, 0x3b, 0x6b, 0x9c, 0xa0, 0xe6, 0x27, 0x8b, 0x14, 0xf7, 0x65, 0x5a, 0x7a, 0xc9, 0x78, 0xb6, + 0xc9, 0xbe, 0xed, 0x64, 0x9b, 0x7c, 0x0c, 0x0a, 0x65, 0xbb, 0xa9, 0x9b, 0x7e, 0x80, 0x19, 0x1c, + 0xc5, 0x41, 0xbd, 0x88, 0xd1, 0x04, 0x05, 0xe3, 0x2f, 0x2a, 0xc6, 0x2e, 0x1b, 0x08, 0xf9, 0xfb, + 0x05, 0x98, 0x95, 0xa6, 0xc9, 0x44, 0xc4, 0x86, 0x61, 0x51, 0x9d, 0xb8, 0xdd, 0x02, 0xdc, 0x3c, + 0x3d, 0xed, 0xcb, 0xa8, 0xb3, 0x5a, 0x5d, 0x8e, 0x94, 0xe3, 0xdb, 0x28, 0x9e, 0x04, 0x53, 0x7c, + 0x0c, 0xbf, 0xe7, 0xd2, 0xa2, 0xfc, 0x25, 0x21, 0xe0, 0x24, 0x33, 0x98, 0x14, 0x02, 0xce, 0x32, + 0x32, 0x11, 0x99, 0x84, 0x31, 0x0c, 0xaf, 0x1c, 0x6c, 0xa5, 0x98, 0x4a, 0x0c, 0xa1, 0x51, 0x89, + 0x97, 0x26, 0x3c, 0x22, 0x33, 0xfb, 0xb8, 0x5a, 0x5d, 0xa0, 0xb5, 0x64, 0x89, 0x33, 0xaf, 0x00, + 0x49, 0xb6, 0x79, 0x47, 0xd7, 0x26, 0xff, 0x5c, 0xda, 0xd7, 0x1d, 0x76, 0xc7, 0x97, 0xfd, 0x98, + 0xed, 0x22, 0xa9, 0xc3, 0x7a, 0xdf, 0xce, 0xd4, 0x61, 0x85, 0x7d, 0x4d, 0x1d, 0xa6, 0xfe, 0x5c, + 0x06, 0xc6, 0x12, 0x71, 0xc6, 0xc9, 0x53, 0x00, 0x1c, 0x22, 0xc5, 0x73, 0xc4, 0x00, 0x29, 0x61, + 0xec, 0x71, 0xb1, 0x06, 0x86, 0x64, 0xe4, 0x0a, 0xf4, 0xf3, 0x5f, 0x22, 0x06, 0x53, 0xb2, 0x48, + 0xbb, 0x6d, 0x1a, 0x5a, 0x40, 0x14, 0xd6, 0x82, 0x17, 0x87, 0xb9, 0xd4, 0x22, 0xde, 0x7a, 0x2b, + 0xa8, 0x85, 0x91, 0xa9, 0x9f, 0xce, 0xc2, 0x50, 0xd0, 0xe0, 0x92, 0x71, 0x50, 0x3a, 0x57, 0x10, + 0x21, 0xdb, 0x73, 0x5b, 0x85, 0x6c, 0x8f, 0x4d, 0xaa, 0x22, 0x46, 0xfb, 0xfe, 0xbd, 0x7b, 0xfa, + 0x6c, 0x16, 0x8e, 0x05, 0xb5, 0x1e, 0xe0, 0x1d, 0xd5, 0x3b, 0x48, 0x24, 0x9f, 0xc9, 0x80, 0x32, + 0x6e, 0x36, 0x1a, 0xa6, 0xb5, 0x52, 0xb1, 0x96, 0x6d, 0xa7, 0x89, 0xb3, 0xde, 0xc1, 0x9d, 0xd3, + 0xaa, 0xdf, 0x95, 0x81, 0x31, 0xd1, 0xa0, 0x09, 0xdd, 0x31, 0x0e, 0xee, 0x10, 0x2c, 0xde, 0x92, + 0x83, 0xd3, 0x17, 0xf5, 0x8b, 0x59, 0x80, 0x19, 0xbb, 0x7e, 0xe7, 0x90, 0x3f, 0x9b, 0x7a, 0x01, + 0x0a, 0x3c, 0x10, 0x96, 0xd0, 0xd8, 0x31, 0xf1, 0x3c, 0x88, 0x7d, 0x1a, 0x47, 0x8c, 0x8f, 0x8a, + 0xf9, 0xb8, 0xc0, 0x03, 0x69, 0x29, 0x19, 0x4d, 0x14, 0x61, 0x95, 0x32, 0x3a, 0xb1, 0x60, 0x04, + 0x95, 0x32, 0x58, 0xb4, 0xd2, 0xcd, 0x8d, 0x62, 0xbe, 0x61, 0xd7, 0xef, 0x68, 0x48, 0xaf, 0xfe, + 0x79, 0x86, 0xcb, 0xee, 0x90, 0x3f, 0xfe, 0xf4, 0x3f, 0x3f, 0xbf, 0xc3, 0xcf, 0xff, 0xee, 0x0c, + 0x9c, 0xd0, 0x68, 0xdd, 0xbe, 0x4b, 0x9d, 0xf5, 0x09, 0xdb, 0xa0, 0xd7, 0xa9, 0x45, 0x9d, 0x83, + 0x1a, 0x51, 0xff, 0x08, 0x73, 0x5c, 0x84, 0x8d, 0xb9, 0xe9, 0x52, 0xe3, 0xf0, 0xe4, 0x1f, 0x51, + 0x7f, 0xb1, 0x0f, 0x94, 0x54, 0xd3, 0xf6, 0xd0, 0x9a, 0x73, 0x1d, 0xf7, 0x2b, 0xf9, 0xfd, 0xda, + 0xaf, 0xf4, 0xee, 0x6c, 0xbf, 0x52, 0xd8, 0xe9, 0x7e, 0xa5, 0x6f, 0x3b, 0xfb, 0x95, 0x66, 0x7c, + 0xbf, 0xd2, 0x8f, 0xfb, 0x95, 0xa7, 0xba, 0xee, 0x57, 0x26, 0x2d, 0x63, 0x97, 0xbb, 0x95, 0x43, + 0x9b, 0x1b, 0x77, 0x37, 0xdb, 0xac, 0x8b, 0x6c, 0x52, 0xac, 0xdb, 0x8e, 0x41, 0x0d, 0xb1, 0xbb, + 0xc2, 0xa3, 0x7d, 0x47, 0xc0, 0xb4, 0x00, 0x9b, 0x48, 0x34, 0x3c, 0xbc, 0x9d, 0x44, 0xc3, 0xfb, + 0xb0, 0xff, 0xfa, 0x54, 0x16, 0xc6, 0x26, 0xa8, 0xe3, 0xf1, 0x48, 0x9b, 0xfb, 0xe1, 0xb9, 0x56, + 0x82, 0x63, 0x12, 0x43, 0xb4, 0xc8, 0xb3, 0xa1, 0x37, 0x5e, 0x9d, 0x3a, 0x5e, 0xdc, 0x99, 0x2f, + 0x4e, 0xcf, 0xaa, 0xf7, 0x93, 0x7d, 0x89, 0xb1, 0x1b, 0x54, 0xef, 0xc3, 0xb9, 0x20, 0x4d, 0xf1, + 0x4b, 0x0b, 0xe8, 0xa5, 0xfc, 0x5d, 0xf9, 0x9d, 0xe7, 0xef, 0x52, 0x7f, 0x36, 0x03, 0x17, 0x34, + 0x6a, 0xd1, 0x35, 0x7d, 0xa9, 0x41, 0xa5, 0x66, 0x89, 0x95, 0x81, 0xcd, 0x1a, 0xa6, 0xdb, 0xd4, + 0xbd, 0xfa, 0xea, 0x9e, 0x64, 0x34, 0x05, 0x43, 0xf2, 0xfc, 0xb5, 0x83, 0xb9, 0x2d, 0x52, 0x4e, + 0xfd, 0xc5, 0x3c, 0xf4, 0x8d, 0xdb, 0xde, 0xab, 0xf6, 0x1e, 0x13, 0xca, 0x85, 0x53, 0x7e, 0x76, + 0x07, 0x07, 0x3a, 0xef, 0xc5, 0xca, 0xa5, 0x18, 0xfb, 0xe8, 0xe9, 0xb9, 0x64, 0x27, 0x72, 0x11, + 0xf8, 0x64, 0x3b, 0x4c, 0x25, 0xf7, 0x0c, 0x0c, 0x60, 0x90, 0x16, 0xe9, 0xc8, 0x15, 0xfd, 0xa8, + 0x3d, 0x06, 0x8c, 0xd7, 0x11, 0x92, 0x92, 0x0f, 0x45, 0x42, 0x83, 0x16, 0xf6, 0x9e, 0x7a, 0x4e, + 0x8e, 0x12, 0xfa, 0x14, 0xbf, 0xad, 0xc3, 0x36, 0x49, 0x69, 0x3a, 0xf0, 0xa8, 0x24, 0xd6, 0xa4, + 0x80, 0x70, 0x1f, 0xd3, 0xc2, 0x4d, 0xc0, 0xf0, 0xb8, 0xed, 0x49, 0x3e, 0xbb, 0x03, 0xe1, 0x6b, + 0x4d, 0x26, 0xf9, 0x74, 0x87, 0xdd, 0x68, 0x19, 0xf5, 0xeb, 0x79, 0x18, 0xf2, 0x7f, 0x1e, 0x90, + 0xee, 0x3c, 0x01, 0x85, 0x69, 0x5b, 0xca, 0x54, 0x80, 0x7e, 0xbe, 0xab, 0xb6, 0x1b, 0x73, 0x60, + 0x16, 0x44, 0x4c, 0xea, 0x73, 0xb6, 0x21, 0x7b, 0xa9, 0xa3, 0xd4, 0x2d, 0xdb, 0x48, 0xbc, 0xf2, + 0x0d, 0x08, 0xc9, 0x05, 0xc8, 0xa3, 0x83, 0xbf, 0x74, 0x5a, 0x1f, 0x73, 0xea, 0x47, 0xbc, 0xa4, + 0x95, 0x85, 0x9d, 0x6a, 0x65, 0xdf, 0x6e, 0xb5, 0xb2, 0x7f, 0x7f, 0xb5, 0xf2, 0x75, 0x18, 0xc2, + 0x9a, 0xfc, 0x44, 0x67, 0x5b, 0x2f, 0xac, 0x0f, 0x88, 0xb5, 0x6f, 0x98, 0xb7, 0x5b, 0xa4, 0x3b, + 0xc3, 0x25, 0x2f, 0xc2, 0x2a, 0xa6, 0xbb, 0xb0, 0x87, 0xed, 0xf4, 0xef, 0x65, 0xa0, 0xef, 0xa6, + 0x75, 0xc7, 0xb2, 0xd7, 0xf6, 0xa6, 0x71, 0x4f, 0xc1, 0xa0, 0x60, 0x23, 0xad, 0x2e, 0xf8, 0x70, + 0xbb, 0xcd, 0xc1, 0x35, 0xe4, 0xa4, 0xc9, 0x54, 0xe4, 0xc5, 0xa0, 0x10, 0xbe, 0xe1, 0xc9, 0x85, + 0xb9, 0x3e, 0xfc, 0x42, 0xf5, 0x68, 0x7a, 0x02, 0x99, 0x9c, 0x9c, 0x85, 0x7c, 0x99, 0x35, 0x55, + 0x0a, 0x76, 0xcb, 0x9a, 0xa2, 0x21, 0x54, 0xfd, 0x54, 0x1e, 0x46, 0x62, 0x07, 0x5f, 0x8f, 0xc1, + 0x80, 0x38, 0x78, 0x32, 0xfd, 0x7c, 0x09, 0xf8, 0xc6, 0x27, 0x00, 0x6a, 0xfd, 0xfc, 0xcf, 0x8a, + 0x41, 0xde, 0x0f, 0x7d, 0xb6, 0x8b, 0x8b, 0x22, 0x7e, 0xcb, 0x48, 0x38, 0x84, 0xe6, 0xab, 0xac, + 0xed, 0x7c, 0x70, 0x08, 0x12, 0x59, 0x23, 0x6d, 0x17, 0x3f, 0xed, 0x1a, 0x0c, 0xe8, 0xae, 0x4b, + 0xbd, 0x9a, 0xa7, 0xaf, 0xc8, 0x29, 0x14, 0x02, 0xa0, 0x3c, 0x3a, 0x10, 0xb8, 0xa8, 0xaf, 0x90, + 0x57, 0x60, 0xb8, 0xee, 0x50, 0x5c, 0x36, 0xf5, 0x06, 0x6b, 0xa5, 0x64, 0xd6, 0x46, 0x10, 0xf2, + 0x25, 0x49, 0x88, 0xa8, 0x18, 0xe4, 0x16, 0x0c, 0x8b, 0xcf, 0xe1, 0x0e, 0xf6, 0x38, 0xd0, 0x46, + 0xc2, 0x65, 0x8c, 0x8b, 0x84, 0xbb, 0xd8, 0x8b, 0x77, 0x16, 0x32, 0xb9, 0xcc, 0xd7, 0x90, 0x48, + 0xc9, 0x3c, 0x90, 0x35, 0xba, 0x54, 0xd3, 0xdb, 0xde, 0x2a, 0xab, 0x8b, 0x47, 0x00, 0x17, 0x99, + 0x03, 0xf1, 0x71, 0x42, 0x12, 0x2b, 0xbf, 0xd9, 0x58, 0xa3, 0x4b, 0xa5, 0x08, 0x92, 0xdc, 0x86, + 0x93, 0xc9, 0x22, 0xec, 0x93, 0xf9, 0x0d, 0xc0, 0x23, 0x9b, 0x1b, 0xc5, 0x62, 0x2a, 0x81, 0xc4, + 0xf6, 0x78, 0x82, 0x6d, 0xc5, 0x78, 0x35, 0xdf, 0xdf, 0x37, 0xda, 0xaf, 0x8d, 0xb0, 0xb2, 0xbe, + 0x09, 0x69, 0x1a, 0xea, 0x57, 0x32, 0xcc, 0x54, 0x64, 0x1f, 0x84, 0xa9, 0x93, 0x99, 0xae, 0x37, + 0x77, 0xa8, 0xeb, 0xcd, 0x30, 0xc9, 0x61, 0xc1, 0xed, 0x32, 0xbb, 0x6a, 0x02, 0x4b, 0x2e, 0x43, + 0xc1, 0x90, 0x4f, 0xcd, 0x4e, 0x45, 0x3b, 0xc1, 0xaf, 0x47, 0x13, 0x54, 0xe4, 0x22, 0xe4, 0xd9, + 0x92, 0x15, 0xdf, 0x32, 0xcb, 0xd6, 0x85, 0x86, 0x14, 0xea, 0xb7, 0x66, 0x61, 0x48, 0xfa, 0x9a, + 0xab, 0x7b, 0xfa, 0x9c, 0xe7, 0xb7, 0xd7, 0x4c, 0xdf, 0xb3, 0x05, 0xf7, 0x52, 0x7e, 0x93, 0xaf, + 0x05, 0xa2, 0xd8, 0xd6, 0xad, 0x93, 0x10, 0xcc, 0x33, 0xe2, 0x43, 0x0b, 0xdb, 0xdf, 0x3e, 0x32, + 0xfa, 0x57, 0xf3, 0xfd, 0xd9, 0xd1, 0xdc, 0xab, 0xf9, 0xfe, 0xfc, 0x68, 0x2f, 0x86, 0xcb, 0xc2, + 0x08, 0xd5, 0x7c, 0x6f, 0x6e, 0x2d, 0x9b, 0x2b, 0x87, 0xfc, 0x89, 0xc7, 0xfe, 0x86, 0x12, 0x8b, + 0xc9, 0xe6, 0x90, 0xbf, 0xf7, 0x78, 0x5b, 0x65, 0x73, 0x94, 0x14, 0x51, 0xc8, 0xe6, 0xf7, 0x33, + 0xa0, 0xa4, 0xca, 0xa6, 0x74, 0x40, 0xce, 0x0e, 0xfb, 0x97, 0x1a, 0xf1, 0x6b, 0x59, 0x18, 0xab, + 0x58, 0x1e, 0x5d, 0xe1, 0x3b, 0xc6, 0x43, 0x3e, 0x55, 0xdc, 0x80, 0x41, 0xe9, 0x63, 0x44, 0x9f, + 0x3f, 0x18, 0xec, 0xc7, 0x43, 0x54, 0x07, 0x4e, 0x72, 0xe9, 0x7d, 0xcc, 0xa6, 0x1e, 0x13, 0xf2, + 0x21, 0x9f, 0x73, 0x0e, 0x87, 0x90, 0x0f, 0xf9, 0xe4, 0xf5, 0x0e, 0x15, 0xf2, 0x7f, 0xcb, 0xc0, + 0xf1, 0x94, 0xca, 0xc9, 0x05, 0xe8, 0xab, 0xb6, 0x97, 0x30, 0x3a, 0x56, 0x26, 0x74, 0x0b, 0x76, + 0xdb, 0x4b, 0x18, 0x18, 0x4b, 0xf3, 0x91, 0x64, 0x11, 0xdf, 0xc0, 0xcf, 0x57, 0xca, 0x13, 0x42, + 0xaa, 0xaa, 0xf4, 0x9a, 0x9f, 0x81, 0xd3, 0xbe, 0x2c, 0x78, 0x27, 0x6f, 0x9b, 0x46, 0x3d, 0xf6, + 0x4e, 0x9e, 0x95, 0x21, 0x1f, 0x86, 0x81, 0xd2, 0x9b, 0x6d, 0x87, 0x22, 0x5f, 0x2e, 0xf1, 0x77, + 0x05, 0x7c, 0x7d, 0x44, 0x1a, 0x67, 0xfe, 0xe4, 0x9f, 0x51, 0xc4, 0x79, 0x87, 0x0c, 0xd5, 0x4f, + 0x67, 0xe0, 0x4c, 0xe7, 0xd6, 0x91, 0xf7, 0x42, 0x1f, 0xdb, 0x99, 0x97, 0xb4, 0x39, 0xf1, 0xe9, + 0x3c, 0x8d, 0xa8, 0xdd, 0xa0, 0x35, 0xdd, 0x91, 0x8d, 0x7d, 0x9f, 0x8c, 0xbc, 0x04, 0x83, 0x15, + 0xd7, 0x6d, 0x53, 0xa7, 0xfa, 0xd4, 0x4d, 0xad, 0x22, 0xf6, 0x84, 0xb8, 0xe7, 0x30, 0x11, 0x5c, + 0x73, 0x9f, 0x8a, 0xc5, 0xbf, 0x92, 0xe9, 0xd5, 0x4f, 0x64, 0xe0, 0x6c, 0xb7, 0xaf, 0x22, 0x4f, + 0x41, 0xff, 0x22, 0xb5, 0x74, 0xcb, 0xab, 0x94, 0x45, 0x93, 0x70, 0x8b, 0xe5, 0x21, 0x2c, 0xba, + 0x53, 0x08, 0x08, 0x59, 0x21, 0x7e, 0xae, 0x18, 0x38, 0x32, 0xf0, 0x33, 0x50, 0x84, 0xc5, 0x0a, + 0xf9, 0x84, 0xea, 0x1f, 0xd4, 0xa1, 0x77, 0xde, 0xa2, 0xf3, 0xcb, 0xe4, 0x49, 0x18, 0x60, 0xba, + 0x8f, 0x39, 0xfc, 0xc5, 0x40, 0x1b, 0x93, 0x07, 0x0c, 0x22, 0xa6, 0x7b, 0xb4, 0x90, 0x8a, 0x5c, + 0x93, 0x13, 0x87, 0x0b, 0x75, 0x20, 0x72, 0x19, 0x8e, 0x99, 0xee, 0xd1, 0xe4, 0x04, 0xe3, 0xd7, + 0xe4, 0x84, 0xcd, 0xa2, 0xb3, 0x23, 0xa5, 0x38, 0xc6, 0x2f, 0x25, 0xa6, 0x81, 0x99, 0xb4, 0xac, + 0xc6, 0x71, 0x9b, 0x20, 0x49, 0x31, 0xdd, 0xa3, 0xa5, 0x67, 0x43, 0x1e, 0x92, 0x7d, 0xa1, 0xe2, + 0x57, 0x99, 0x32, 0x6e, 0xba, 0x47, 0x8b, 0xd0, 0x92, 0x67, 0x61, 0x50, 0xfc, 0x7e, 0xd5, 0x36, + 0xad, 0x78, 0x20, 0x0c, 0x09, 0x35, 0xdd, 0xa3, 0xc9, 0x94, 0x52, 0xa5, 0x0b, 0x8e, 0x69, 0x79, + 0xe2, 0x79, 0x5d, 0xbc, 0x52, 0xc4, 0x49, 0x95, 0xe2, 0x6f, 0xf2, 0x12, 0x0c, 0x07, 0x11, 0x46, + 0xde, 0xa0, 0x75, 0x4f, 0x1c, 0xe9, 0x9c, 0x8c, 0x15, 0xe6, 0xc8, 0xe9, 0x1e, 0x2d, 0x4a, 0x4d, + 0x2e, 0x42, 0x41, 0xa3, 0xae, 0xf9, 0xa6, 0x7f, 0x09, 0x32, 0x22, 0x4d, 0x67, 0xe6, 0x9b, 0x4c, + 0x4a, 0x02, 0xcf, 0x7a, 0x27, 0xbc, 0x75, 0x11, 0x07, 0x30, 0x24, 0x56, 0xcb, 0xa4, 0x65, 0xb0, + 0xde, 0x91, 0xae, 0xdc, 0x5e, 0x09, 0xe3, 0xae, 0x88, 0x6c, 0x6d, 0x83, 0xf1, 0x07, 0xae, 0x32, + 0x76, 0xba, 0x47, 0x8b, 0xd1, 0x4b, 0x52, 0x2d, 0x9b, 0xee, 0x1d, 0x11, 0xea, 0x2e, 0x2e, 0x55, + 0x86, 0x92, 0xa4, 0xca, 0x7e, 0x4a, 0x55, 0xcf, 0x51, 0x6f, 0xcd, 0x76, 0xee, 0x88, 0xc0, 0x76, + 0xf1, 0xaa, 0x05, 0x56, 0xaa, 0x5a, 0x40, 0xe4, 0xaa, 0xd9, 0x22, 0x33, 0x92, 0x5e, 0xb5, 0xee, + 0xe9, 0x72, 0xd5, 0x7c, 0x7f, 0xe9, 0x77, 0xd2, 0x0c, 0xd5, 0xef, 0xf2, 0xa4, 0xb9, 0xc9, 0x0e, + 0x45, 0x9c, 0xd4, 0xa1, 0xf8, 0x9b, 0x55, 0x2a, 0x25, 0x46, 0x15, 0x59, 0x71, 0x83, 0x4a, 0x25, + 0x14, 0xab, 0x54, 0x4e, 0xa1, 0x7a, 0x4d, 0xce, 0x17, 0xaa, 0x8c, 0x45, 0x3b, 0x28, 0xc4, 0xb0, + 0x0e, 0x92, 0xf2, 0x8a, 0x16, 0x31, 0x17, 0xa1, 0x42, 0x90, 0x7c, 0x30, 0x68, 0xe1, 0xc4, 0xc2, + 0x74, 0x8f, 0x86, 0x59, 0x0a, 0x55, 0x9e, 0xe5, 0x52, 0x39, 0x8e, 0x14, 0x43, 0x3e, 0x05, 0x83, + 0x4d, 0xf7, 0x68, 0x3c, 0x03, 0xe6, 0x93, 0x52, 0x3e, 0x29, 0xe5, 0x44, 0x74, 0x8a, 0x08, 0x10, + 0x6c, 0x8a, 0x08, 0xb3, 0x4e, 0x4d, 0x25, 0x73, 0x2e, 0x29, 0x27, 0xa3, 0x2b, 0x6a, 0x1c, 0x3f, + 0xdd, 0xa3, 0x25, 0xf3, 0x34, 0x3d, 0x1b, 0x49, 0x43, 0xa4, 0x9c, 0x8a, 0x45, 0x9f, 0x09, 0x51, + 0x4c, 0x5c, 0x72, 0xc2, 0xa2, 0xf9, 0xd4, 0xc4, 0xe1, 0xca, 0xe9, 0xe8, 0x72, 0x9c, 0x42, 0x32, + 0xdd, 0xa3, 0xa5, 0xa6, 0x1c, 0x9f, 0x48, 0x24, 0x03, 0x52, 0x94, 0xe8, 0x8d, 0x6f, 0x0c, 0x3d, + 0xdd, 0xa3, 0x25, 0xd2, 0x07, 0x5d, 0x93, 0xb3, 0xf0, 0x28, 0x0f, 0x44, 0x3b, 0x31, 0xc4, 0xb0, + 0x4e, 0x94, 0xb2, 0xf5, 0x5c, 0x93, 0x33, 0xb3, 0x28, 0x67, 0x92, 0xa5, 0xc2, 0x99, 0x53, 0xca, + 0xe0, 0xa2, 0xa5, 0x27, 0x9b, 0x50, 0x1e, 0x14, 0xe9, 0xfe, 0x44, 0xf9, 0x34, 0x9a, 0xe9, 0x1e, + 0x2d, 0x3d, 0x51, 0x85, 0x96, 0x9e, 0xa5, 0x41, 0x39, 0xdb, 0x8d, 0x67, 0xd0, 0xba, 0xf4, 0x0c, + 0x0f, 0x7a, 0x97, 0x98, 0xf9, 0xca, 0xb9, 0x68, 0xe8, 0xcb, 0x8e, 0x84, 0xd3, 0x3d, 0x5a, 0x97, + 0xc8, 0xfb, 0x37, 0x3b, 0x04, 0xb0, 0x57, 0xce, 0x47, 0xb3, 0x7d, 0xa6, 0x12, 0x4d, 0xf7, 0x68, + 0x1d, 0xc2, 0xdf, 0xdf, 0xec, 0x10, 0xdf, 0x5c, 0x29, 0x76, 0x65, 0x1b, 0xc8, 0xa3, 0x43, 0x74, + 0xf4, 0xf9, 0xd4, 0xd0, 0xe0, 0xca, 0x43, 0x51, 0xd5, 0x4d, 0x21, 0x61, 0xaa, 0x9b, 0x16, 0x54, + 0x7c, 0x3e, 0x35, 0x96, 0xb5, 0xf2, 0x70, 0x17, 0x86, 0x41, 0x1b, 0x53, 0xa3, 0x60, 0xcf, 0xa7, + 0x06, 0x93, 0x56, 0xd4, 0x28, 0xc3, 0x14, 0x12, 0xc6, 0x30, 0x2d, 0x0c, 0xf5, 0x7c, 0x6a, 0xcc, + 0x61, 0xe5, 0x91, 0x2e, 0x0c, 0xc3, 0x16, 0xa6, 0x45, 0x2b, 0x7e, 0x36, 0x12, 0xf4, 0x57, 0x79, + 0x57, 0x74, 0xde, 0x90, 0x50, 0x6c, 0xde, 0x90, 0xc3, 0x03, 0x4f, 0x24, 0xc2, 0x1a, 0x2a, 0x8f, + 0x46, 0x87, 0x79, 0x0c, 0xcd, 0x86, 0x79, 0x3c, 0x10, 0xe2, 0x44, 0x22, 0xbc, 0x9b, 0x72, 0xa1, + 0x13, 0x13, 0x44, 0x47, 0x99, 0xf0, 0x80, 0x70, 0x95, 0x94, 0xf8, 0x62, 0xca, 0xbb, 0xa3, 0xde, + 0x8a, 0x09, 0x82, 0xe9, 0x1e, 0x2d, 0x25, 0x2a, 0x99, 0x96, 0x1e, 0x4c, 0x43, 0xb9, 0x18, 0x1d, + 0xb6, 0x69, 0x34, 0x6c, 0xd8, 0xa6, 0x06, 0xe2, 0x98, 0x49, 0x73, 0xa9, 0x56, 0x2e, 0x45, 0x0d, + 0xb3, 0x24, 0x05, 0x33, 0xcc, 0x52, 0x5c, 0xb1, 0xb5, 0xf4, 0xf0, 0x10, 0xca, 0x63, 0x5d, 0x5b, + 0x88, 0x34, 0x29, 0x2d, 0xe4, 0xd1, 0x12, 0x42, 0xdb, 0xe9, 0x66, 0xab, 0x61, 0xeb, 0x86, 0xf2, + 0x9e, 0x54, 0xdb, 0x89, 0x23, 0x25, 0xdb, 0x89, 0x03, 0xd8, 0x2a, 0x2f, 0x7b, 0xee, 0x2a, 0x8f, + 0x47, 0x57, 0x79, 0x19, 0xc7, 0x56, 0xf9, 0x88, 0x97, 0xef, 0x44, 0xc2, 0xcb, 0x55, 0x79, 0x22, + 0xaa, 0x00, 0x31, 0x34, 0x53, 0x80, 0xb8, 0x5f, 0xec, 0x47, 0x3b, 0xfb, 0x85, 0x2a, 0x97, 0x91, + 0xdb, 0x43, 0x3e, 0xb7, 0x4e, 0x74, 0xd3, 0x3d, 0x5a, 0x67, 0xdf, 0xd2, 0x4a, 0x8a, 0x9b, 0xa7, + 0x72, 0x25, 0xaa, 0x60, 0x09, 0x02, 0xa6, 0x60, 0x49, 0xe7, 0xd0, 0x4a, 0x8a, 0x9f, 0xa6, 0xf2, + 0xde, 0x8e, 0xac, 0x82, 0x6f, 0x4e, 0xf1, 0xee, 0xbc, 0x26, 0x3b, 0x5a, 0x2a, 0x4f, 0x46, 0x17, + 0xbb, 0x10, 0xc3, 0x16, 0x3b, 0xc9, 0x21, 0xf3, 0x9a, 0xec, 0x62, 0xa8, 0x5c, 0x4d, 0x96, 0x0a, + 0x97, 0x48, 0xc9, 0x15, 0x51, 0x4b, 0xf7, 0xcc, 0x53, 0x9e, 0x8a, 0x6a, 0x5d, 0x1a, 0x0d, 0xd3, + 0xba, 0x54, 0xaf, 0xbe, 0xa9, 0xa4, 0x83, 0x9d, 0x72, 0x2d, 0x7e, 0x96, 0x10, 0xc5, 0x33, 0xcb, + 0x27, 0xe1, 0x94, 0xf7, 0x4a, 0x3c, 0xd2, 0x93, 0xf2, 0x74, 0xec, 0x32, 0x23, 0x82, 0x65, 0xf6, + 0x6d, 0x2c, 0x32, 0xd4, 0x2b, 0xf1, 0xe0, 0x48, 0xca, 0x33, 0xe9, 0x1c, 0x02, 0x5d, 0x89, 0x07, + 0x53, 0x7a, 0x25, 0x1e, 0x4f, 0x48, 0x79, 0x36, 0x9d, 0x43, 0x20, 0xdd, 0x78, 0xfc, 0xa1, 0x27, + 0xa5, 0x08, 0xc7, 0xca, 0xfb, 0xa2, 0xa6, 0x63, 0x80, 0x60, 0xa6, 0x63, 0x18, 0x07, 0xf9, 0x49, + 0x29, 0x32, 0xb0, 0xf2, 0x5c, 0xa2, 0x48, 0xd0, 0x58, 0x29, 0x7e, 0xf0, 0x93, 0x52, 0x44, 0x5d, + 0xe5, 0xf9, 0x44, 0x91, 0xa0, 0x75, 0x52, 0xdc, 0x5d, 0xa3, 0xdb, 0xd3, 0x2b, 0xe5, 0x85, 0xe8, + 0x11, 0x47, 0x67, 0xca, 0xe9, 0x1e, 0xad, 0xdb, 0x13, 0xae, 0x8f, 0x76, 0x76, 0x57, 0x54, 0x5e, + 0x8c, 0x0e, 0xe1, 0x4e, 0x74, 0x6c, 0x08, 0x77, 0x74, 0x79, 0x7c, 0x29, 0xf6, 0x0c, 0x5b, 0x79, + 0x29, 0x3a, 0xc5, 0x45, 0x90, 0x6c, 0x8a, 0x8b, 0x3f, 0xda, 0x8e, 0xbc, 0x2f, 0x56, 0xde, 0x1f, + 0x9d, 0xe2, 0x64, 0x1c, 0x9b, 0xe2, 0x22, 0x6f, 0x91, 0x27, 0x12, 0xcf, 0x5e, 0x95, 0x97, 0xa3, + 0x53, 0x5c, 0x0c, 0xcd, 0xa6, 0xb8, 0xf8, 0x43, 0xd9, 0x97, 0x62, 0xaf, 0x3f, 0x95, 0x57, 0xd2, + 0xdb, 0x8f, 0x48, 0xb9, 0xfd, 0xfc, 0xad, 0xa8, 0x96, 0xfe, 0x8c, 0x51, 0x29, 0x45, 0xc7, 0x6f, + 0x1a, 0x0d, 0x1b, 0xbf, 0xa9, 0x4f, 0x20, 0xe3, 0x1b, 0x07, 0xa1, 0x55, 0xe3, 0x5d, 0x36, 0x0e, + 0xa1, 0x29, 0x92, 0x02, 0x8e, 0xec, 0x91, 0xf9, 0x46, 0x68, 0xa2, 0xc3, 0x1e, 0xd9, 0xdf, 0x06, + 0xc5, 0xe8, 0xd9, 0xec, 0x9a, 0xf0, 0x9e, 0x53, 0xca, 0xd1, 0xd9, 0x35, 0x41, 0xc0, 0x66, 0xd7, + 0xa4, 0xcf, 0xdd, 0x14, 0x8c, 0x0a, 0x2d, 0xe2, 0x4e, 0x81, 0xa6, 0xb5, 0xa2, 0x4c, 0xc6, 0x5e, + 0x11, 0xc5, 0xf0, 0x6c, 0x76, 0x8a, 0xc3, 0x70, 0xbd, 0xe6, 0xb0, 0x89, 0x86, 0xd9, 0x5a, 0xb2, + 0x75, 0xc7, 0xa8, 0x52, 0xcb, 0x50, 0xa6, 0x62, 0xeb, 0x75, 0x0a, 0x0d, 0xae, 0xd7, 0x29, 0x70, + 0x8c, 0x6e, 0x14, 0x83, 0x6b, 0xb4, 0x4e, 0xcd, 0xbb, 0x54, 0xb9, 0x8e, 0x6c, 0x8b, 0x9d, 0xd8, + 0x0a, 0xb2, 0xe9, 0x1e, 0xad, 0x13, 0x07, 0x66, 0xab, 0xcf, 0xae, 0x57, 0x5f, 0x9b, 0x09, 0x5e, + 0xce, 0x2e, 0x38, 0xb4, 0xa5, 0x3b, 0x54, 0x99, 0x8e, 0xda, 0xea, 0xa9, 0x44, 0xcc, 0x56, 0x4f, + 0x45, 0x24, 0xd9, 0xfa, 0x63, 0xa1, 0xd2, 0x8d, 0x6d, 0x38, 0x22, 0xd2, 0x4b, 0xb3, 0xd9, 0x29, + 0x8a, 0x60, 0x02, 0x9a, 0xb1, 0xad, 0x15, 0x3c, 0xa9, 0x78, 0x35, 0x3a, 0x3b, 0x75, 0xa6, 0x64, + 0xb3, 0x53, 0x67, 0x2c, 0x53, 0xf5, 0x28, 0x96, 0x8f, 0xc1, 0x1b, 0x51, 0x55, 0x4f, 0x21, 0x61, + 0xaa, 0x9e, 0x02, 0x4e, 0x32, 0xd4, 0xa8, 0x4b, 0x3d, 0x65, 0xa6, 0x1b, 0x43, 0x24, 0x49, 0x32, + 0x44, 0x70, 0x92, 0xe1, 0x14, 0xf5, 0xea, 0xab, 0xca, 0x6c, 0x37, 0x86, 0x48, 0x92, 0x64, 0x88, + 0x60, 0xb6, 0xd9, 0x8c, 0x82, 0xc7, 0xdb, 0x8d, 0x3b, 0x7e, 0x9f, 0xcd, 0x45, 0x37, 0x9b, 0x1d, + 0x09, 0xd9, 0x66, 0xb3, 0x23, 0x92, 0x7c, 0x62, 0xdb, 0xde, 0x9d, 0xca, 0x3c, 0x56, 0x78, 0x39, + 0xb4, 0x0b, 0xb6, 0x53, 0x6a, 0xba, 0x47, 0xdb, 0xae, 0xf7, 0xe8, 0x7b, 0x02, 0x57, 0x28, 0x65, + 0x01, 0xab, 0x3a, 0x16, 0x9c, 0x55, 0x70, 0xf0, 0x74, 0x8f, 0x16, 0x38, 0x4b, 0x3d, 0x0b, 0x83, + 0xf8, 0x51, 0x15, 0xcb, 0xf4, 0xca, 0xe3, 0xca, 0x6b, 0xd1, 0x2d, 0x93, 0x84, 0x62, 0x5b, 0x26, + 0xe9, 0x27, 0x9b, 0xc4, 0xf1, 0x27, 0x9f, 0x62, 0xca, 0xe3, 0x8a, 0x16, 0x9d, 0xc4, 0x23, 0x48, + 0x36, 0x89, 0x47, 0x00, 0x41, 0xbd, 0x65, 0xc7, 0x6e, 0x95, 0xc7, 0x95, 0x6a, 0x4a, 0xbd, 0x1c, + 0x15, 0xd4, 0xcb, 0x7f, 0x06, 0xf5, 0x56, 0x57, 0xdb, 0x5e, 0x99, 0x7d, 0xe3, 0x62, 0x4a, 0xbd, + 0x3e, 0x32, 0xa8, 0xd7, 0x07, 0xb0, 0xa9, 0x10, 0x01, 0x0b, 0x8e, 0xcd, 0x26, 0xed, 0x1b, 0x66, + 0xa3, 0xa1, 0xdc, 0x8c, 0x4e, 0x85, 0x71, 0x3c, 0x9b, 0x0a, 0xe3, 0x30, 0x66, 0x7a, 0xf2, 0x56, + 0xd1, 0xa5, 0xf6, 0x8a, 0x72, 0x2b, 0x6a, 0x7a, 0x86, 0x18, 0x66, 0x7a, 0x86, 0xbf, 0x70, 0x77, + 0xc1, 0x7e, 0x69, 0x74, 0xd9, 0xa1, 0xee, 0xaa, 0x72, 0x3b, 0xb6, 0xbb, 0x90, 0x70, 0xb8, 0xbb, + 0x90, 0x7e, 0x93, 0x15, 0x78, 0x30, 0xb2, 0xd0, 0xf8, 0x77, 0x4f, 0x55, 0xaa, 0x3b, 0xf5, 0x55, + 0xe5, 0x03, 0xc8, 0xea, 0x91, 0xd4, 0xa5, 0x2a, 0x4a, 0x3a, 0xdd, 0xa3, 0x75, 0xe3, 0x84, 0xdb, + 0xf2, 0xd7, 0x66, 0x78, 0x18, 0x42, 0x6d, 0x61, 0xc2, 0xdf, 0x84, 0xbe, 0x1e, 0xdb, 0x96, 0x27, + 0x49, 0x70, 0x5b, 0x9e, 0x04, 0x93, 0x16, 0x9c, 0x8f, 0x6d, 0xd5, 0x66, 0xf5, 0x06, 0xdb, 0x97, + 0x50, 0x63, 0x41, 0xaf, 0xdf, 0xa1, 0x9e, 0xf2, 0x41, 0xe4, 0x7d, 0xa1, 0xc3, 0x86, 0x2f, 0x46, + 0x3d, 0xdd, 0xa3, 0x6d, 0xc1, 0x8f, 0xa8, 0x90, 0xaf, 0x4e, 0x2d, 0x2e, 0x28, 0x1f, 0x8a, 0x9e, + 0x6f, 0x32, 0xd8, 0x74, 0x8f, 0x86, 0x38, 0x66, 0xa5, 0xdd, 0x6c, 0xad, 0x38, 0xba, 0x41, 0xb9, + 0xa1, 0x85, 0xb6, 0x9b, 0x30, 0x40, 0x3f, 0x1c, 0xb5, 0xd2, 0x3a, 0xd1, 0x31, 0x2b, 0xad, 0x13, + 0x8e, 0x29, 0x6a, 0x24, 0xe2, 0xbe, 0xf2, 0x91, 0xa8, 0xa2, 0x46, 0x90, 0x4c, 0x51, 0xa3, 0xf1, + 0xf9, 0x3f, 0x00, 0xa7, 0x82, 0xfd, 0xbc, 0x58, 0x7f, 0x79, 0xa7, 0x29, 0x1f, 0x45, 0x3e, 0xe7, + 0x13, 0x97, 0x01, 0x11, 0xaa, 0xe9, 0x1e, 0xad, 0x43, 0x79, 0xb6, 0xe2, 0x26, 0x92, 0xc9, 0x08, + 0xf3, 0xe2, 0x5b, 0xa2, 0x2b, 0x6e, 0x07, 0x32, 0xb6, 0xe2, 0x76, 0x40, 0xa5, 0x32, 0x17, 0x42, + 0xd5, 0xb7, 0x60, 0x1e, 0xc8, 0xb4, 0x13, 0x87, 0x54, 0xe6, 0xc2, 0x52, 0x5b, 0xda, 0x82, 0x79, + 0x60, 0xad, 0x75, 0xe2, 0x40, 0x2e, 0x42, 0xa1, 0x5a, 0x9d, 0xd5, 0xda, 0x96, 0x52, 0x8f, 0xf9, + 0x80, 0x21, 0x74, 0xba, 0x47, 0x13, 0x78, 0x66, 0x06, 0x4d, 0x36, 0x74, 0xd7, 0x33, 0xeb, 0x2e, + 0x8e, 0x18, 0x7f, 0x84, 0x18, 0x51, 0x33, 0x28, 0x8d, 0x86, 0x99, 0x41, 0x69, 0x70, 0x66, 0x2f, + 0x4e, 0xe8, 0xae, 0xab, 0x5b, 0x86, 0xa3, 0x8f, 0xe3, 0x32, 0x41, 0x63, 0x6f, 0x0c, 0x22, 0x58, + 0x66, 0x2f, 0x46, 0x21, 0x78, 0xf8, 0xee, 0x43, 0x7c, 0x33, 0x67, 0x39, 0x76, 0xf8, 0x1e, 0xc3, + 0xe3, 0xe1, 0x7b, 0x0c, 0x86, 0x76, 0xa7, 0x0f, 0xd3, 0xe8, 0x8a, 0xc9, 0x44, 0xa4, 0xac, 0xc4, + 0xec, 0xce, 0x38, 0x01, 0xda, 0x9d, 0x71, 0x60, 0xa4, 0x49, 0xfe, 0x72, 0xbb, 0xda, 0xa1, 0x49, + 0xe1, 0x2a, 0x9b, 0x28, 0xc3, 0xd6, 0xef, 0x70, 0x70, 0x94, 0xd7, 0x2d, 0xbd, 0x69, 0x97, 0xc7, + 0x7d, 0xa9, 0x9b, 0xd1, 0xf5, 0xbb, 0x23, 0x21, 0x5b, 0xbf, 0x3b, 0x22, 0xd9, 0xec, 0xea, 0x6f, + 0xb4, 0x56, 0x75, 0x87, 0x1a, 0x65, 0xd3, 0xc1, 0x93, 0xc5, 0x75, 0xbe, 0x35, 0x7c, 0x23, 0x3a, + 0xbb, 0x76, 0x21, 0x65, 0xb3, 0x6b, 0x17, 0x34, 0x33, 0xf2, 0xd2, 0xd1, 0x1a, 0xd5, 0x0d, 0xe5, + 0x4e, 0xd4, 0xc8, 0xeb, 0x4c, 0xc9, 0x8c, 0xbc, 0xce, 0xd8, 0xce, 0x9f, 0x73, 0xdb, 0x31, 0x3d, + 0xaa, 0x34, 0xb6, 0xf3, 0x39, 0x48, 0xda, 0xf9, 0x73, 0x10, 0xcd, 0x36, 0x84, 0xf1, 0x0e, 0x69, + 0x46, 0x37, 0x84, 0xc9, 0x6e, 0x88, 0x97, 0x60, 0x16, 0x8b, 0x78, 0x6a, 0xa2, 0x58, 0x51, 0x8b, + 0x45, 0x80, 0x99, 0xc5, 0x12, 0x3e, 0x46, 0x89, 0x3c, 0x30, 0x50, 0xec, 0xe8, 0x1a, 0x2a, 0xe3, + 0xd8, 0x1a, 0x1a, 0x79, 0x8c, 0xf0, 0x6c, 0xc4, 0x7b, 0x56, 0x69, 0x45, 0xad, 0x0e, 0x09, 0xc5, + 0xac, 0x0e, 0xd9, 0xcf, 0x76, 0x02, 0x8e, 0xe1, 0x2d, 0xb8, 0xd6, 0x0e, 0xee, 0x71, 0x3e, 0x16, + 0xfd, 0xcc, 0x18, 0x9a, 0x7d, 0x66, 0x0c, 0x14, 0x61, 0x22, 0xa6, 0x2d, 0xa7, 0x03, 0x93, 0xf0, + 0x7c, 0x30, 0x06, 0x22, 0x33, 0x40, 0xaa, 0xa5, 0xd9, 0x99, 0x8a, 0xb1, 0x20, 0x5f, 0x91, 0xb9, + 0xd1, 0x13, 0xd8, 0x24, 0xc5, 0x74, 0x8f, 0x96, 0x52, 0x8e, 0xbc, 0x01, 0x67, 0x05, 0x54, 0xbc, + 0x23, 0xc4, 0x9c, 0xd3, 0x46, 0xb0, 0x20, 0x78, 0x51, 0xef, 0x8c, 0x6e, 0xb4, 0xd3, 0x3d, 0x5a, + 0x57, 0x5e, 0x9d, 0xeb, 0x12, 0xeb, 0x43, 0x7b, 0x3b, 0x75, 0x05, 0x8b, 0x44, 0x57, 0x5e, 0x9d, + 0xeb, 0x12, 0x72, 0xbf, 0xbb, 0x9d, 0xba, 0x82, 0x4e, 0xe8, 0xca, 0x8b, 0xb8, 0x50, 0xec, 0x86, + 0x2f, 0x35, 0x1a, 0xca, 0x1a, 0x56, 0xf7, 0xee, 0xed, 0x54, 0x57, 0x42, 0x83, 0x73, 0x2b, 0x8e, + 0x6c, 0x96, 0x9e, 0x6f, 0x51, 0xab, 0x1a, 0x59, 0x80, 0xee, 0x45, 0x67, 0xe9, 0x04, 0x01, 0x9b, + 0xa5, 0x13, 0x40, 0x36, 0xa0, 0x64, 0x27, 0x6c, 0x65, 0x3d, 0x3a, 0xa0, 0x64, 0x1c, 0x1b, 0x50, + 0x11, 0x87, 0xed, 0x79, 0x38, 0x3e, 0x7f, 0xc7, 0xd3, 0x7d, 0x0b, 0xd2, 0x15, 0x5d, 0xf9, 0x66, + 0xec, 0x92, 0x29, 0x49, 0x82, 0x97, 0x4c, 0x49, 0x30, 0x1b, 0x23, 0x0c, 0x5c, 0x5d, 0xb7, 0xea, + 0x53, 0xba, 0xd9, 0x68, 0x3b, 0x54, 0xf9, 0xff, 0xa2, 0x63, 0x24, 0x86, 0x66, 0x63, 0x24, 0x06, + 0x62, 0x0b, 0x34, 0x03, 0x95, 0x5c, 0xd7, 0x5c, 0xb1, 0xc4, 0xbe, 0xb2, 0xdd, 0xf0, 0x94, 0xff, + 0x3f, 0xba, 0x40, 0xa7, 0xd1, 0xb0, 0x05, 0x3a, 0x0d, 0x8e, 0xa7, 0x4e, 0x29, 0xf9, 0xd8, 0x95, + 0xbf, 0x14, 0x3b, 0x75, 0x4a, 0xa1, 0xc1, 0x53, 0xa7, 0xb4, 0x5c, 0xee, 0x53, 0x30, 0xca, 0x6d, + 0xb2, 0x19, 0x33, 0xb8, 0xab, 0xfe, 0xcb, 0xd1, 0xf5, 0x31, 0x8e, 0x67, 0xeb, 0x63, 0x1c, 0x16, + 0xe5, 0x23, 0xba, 0xe0, 0xaf, 0x74, 0xe2, 0x13, 0xc8, 0x3f, 0x51, 0x86, 0x5c, 0x97, 0xf9, 0x88, + 0x91, 0xf2, 0xad, 0x99, 0x4e, 0x8c, 0x82, 0xe1, 0x91, 0x28, 0x14, 0x65, 0xa4, 0xd1, 0xbb, 0x26, + 0x5d, 0x53, 0x3e, 0xde, 0x91, 0x11, 0x27, 0x88, 0x32, 0xe2, 0x30, 0xf2, 0x3a, 0x9c, 0x0a, 0x61, + 0xb3, 0xb4, 0xb9, 0x14, 0xcc, 0x4c, 0xdf, 0x96, 0x89, 0x9a, 0xc1, 0xe9, 0x64, 0xcc, 0x0c, 0x4e, + 0xc7, 0xa4, 0xb1, 0x16, 0xa2, 0xfb, 0xab, 0x5b, 0xb0, 0x0e, 0x24, 0xd8, 0x81, 0x41, 0x1a, 0x6b, + 0x21, 0xcd, 0x6f, 0xdf, 0x82, 0x75, 0x20, 0xd3, 0x0e, 0x0c, 0xc8, 0x27, 0x33, 0x70, 0x21, 0x1d, + 0x55, 0x6a, 0x34, 0xa6, 0x6c, 0x27, 0xc4, 0x29, 0xdf, 0x91, 0x89, 0x1e, 0x34, 0x6c, 0xaf, 0xd8, + 0x74, 0x8f, 0xb6, 0xcd, 0x0a, 0xc8, 0xfb, 0x61, 0xb8, 0xd4, 0x36, 0x4c, 0x0f, 0x2f, 0xde, 0x98, + 0xe1, 0xfc, 0x9d, 0x99, 0xd8, 0x16, 0x47, 0xc6, 0xe2, 0x16, 0x47, 0x06, 0x90, 0x57, 0x61, 0xac, + 0x4a, 0xeb, 0x6d, 0xc7, 0xf4, 0xd6, 0x35, 0xcc, 0xb5, 0xcf, 0x78, 0x7c, 0x57, 0x26, 0x3a, 0x89, + 0x25, 0x28, 0xd8, 0x24, 0x96, 0x00, 0x92, 0x5b, 0x1d, 0x32, 0xb2, 0x2b, 0x9f, 0xc8, 0x74, 0xbd, + 0x96, 0x0f, 0xfa, 0xb2, 0x43, 0x42, 0xf7, 0x85, 0xd4, 0x0c, 0xd7, 0xca, 0x27, 0x33, 0x5d, 0xae, + 0xd1, 0xa5, 0x19, 0x2e, 0x25, 0x39, 0xf6, 0x42, 0x6a, 0xfa, 0x61, 0xe5, 0xbb, 0x33, 0x5d, 0xae, + 0xbd, 0x43, 0x8e, 0x69, 0x99, 0x8b, 0x9f, 0xe6, 0x9e, 0x22, 0x82, 0xd1, 0x5f, 0xcb, 0x24, 0x5d, + 0x45, 0x82, 0xf2, 0x12, 0x21, 0x2b, 0x76, 0xd3, 0x0d, 0x94, 0xfe, 0x53, 0x99, 0xa4, 0x6f, 0x5e, + 0x58, 0x2c, 0xfc, 0x45, 0x28, 0x9c, 0x99, 0xbc, 0xe7, 0x51, 0xc7, 0xd2, 0x1b, 0xd8, 0x9d, 0x55, + 0xcf, 0x76, 0xf4, 0x15, 0x3a, 0x69, 0xe9, 0x4b, 0x0d, 0xaa, 0x7c, 0x3a, 0x13, 0xb5, 0x60, 0x3b, + 0x93, 0x32, 0x0b, 0xb6, 0x33, 0x96, 0xac, 0xc2, 0x83, 0x69, 0xd8, 0xb2, 0xe9, 0x62, 0x3d, 0x9f, + 0xc9, 0x44, 0x4d, 0xd8, 0x2e, 0xb4, 0xcc, 0x84, 0xed, 0x82, 0x26, 0x57, 0x61, 0x60, 0xdc, 0xf6, + 0xa7, 0xdf, 0xef, 0x89, 0x39, 0x43, 0x06, 0x98, 0xe9, 0x1e, 0x2d, 0x24, 0x13, 0x65, 0xc4, 0xa0, + 0xfe, 0x6c, 0xb2, 0x4c, 0x78, 0xf9, 0x14, 0xfc, 0x10, 0x65, 0x84, 0xb8, 0xff, 0x7a, 0xb2, 0x4c, + 0x78, 0xc7, 0x15, 0xfc, 0x60, 0x33, 0x09, 0xaf, 0x71, 0x76, 0xaa, 0xc4, 0xec, 0xb6, 0x89, 0x55, + 0xbd, 0xd1, 0xa0, 0xd6, 0x0a, 0x55, 0x3e, 0x17, 0x9b, 0x49, 0xd2, 0xc9, 0xd8, 0x4c, 0x92, 0x8e, + 0x21, 0x1f, 0x86, 0xd3, 0xb7, 0xf4, 0x86, 0x69, 0x84, 0x38, 0x3f, 0x19, 0xad, 0xf2, 0xbd, 0x99, + 0xe8, 0x6e, 0xba, 0x03, 0x1d, 0xdb, 0x4d, 0x77, 0x40, 0x91, 0x59, 0x20, 0xb8, 0x8c, 0x06, 0xb3, + 0x05, 0x5b, 0x9f, 0x95, 0xbf, 0x91, 0x89, 0xda, 0xa9, 0x49, 0x12, 0x66, 0xa7, 0x26, 0xa1, 0xa4, + 0xd6, 0x39, 0xaa, 0xbd, 0xf2, 0x7d, 0x99, 0xe8, 0x69, 0x4d, 0x27, 0xc2, 0xe9, 0x1e, 0xad, 0x73, + 0x68, 0xfc, 0xeb, 0x30, 0x5a, 0x5d, 0xa8, 0x4c, 0x4d, 0x4d, 0x56, 0x6f, 0x55, 0xca, 0xe8, 0xbe, + 0x6b, 0x28, 0xdf, 0x1f, 0x5b, 0xb1, 0xe2, 0x04, 0x6c, 0xc5, 0x8a, 0xc3, 0xc8, 0x0b, 0x30, 0xc4, + 0xda, 0xcf, 0x06, 0x0c, 0x7e, 0xf2, 0xe7, 0x33, 0x51, 0x73, 0x4a, 0x46, 0x32, 0x73, 0x4a, 0xfe, + 0x4d, 0xaa, 0x70, 0x82, 0x49, 0x71, 0xc1, 0xa1, 0xcb, 0xd4, 0xa1, 0x56, 0xdd, 0x1f, 0xd3, 0x3f, + 0x90, 0x89, 0x5a, 0x19, 0x69, 0x44, 0xcc, 0xca, 0x48, 0x83, 0x93, 0x3b, 0x70, 0x36, 0x7e, 0x12, + 0x24, 0x3f, 0xa6, 0x52, 0x7e, 0x30, 0x13, 0x33, 0x86, 0xbb, 0x10, 0xa3, 0x31, 0xdc, 0x05, 0x4f, + 0x2c, 0x38, 0x27, 0x8e, 0x55, 0x84, 0xc3, 0x65, 0xbc, 0xb6, 0x1f, 0xe2, 0xb5, 0x3d, 0x1a, 0x3a, + 0x04, 0x76, 0xa1, 0x9e, 0xee, 0xd1, 0xba, 0xb3, 0x63, 0x7a, 0x96, 0x8c, 0xdd, 0xae, 0xfc, 0x70, + 0x26, 0xdd, 0x23, 0x25, 0xe2, 0xa6, 0x9c, 0x16, 0xf4, 0xfd, 0xf5, 0x4e, 0x91, 0xc7, 0x95, 0x1f, + 0x89, 0x8d, 0xb7, 0x74, 0x32, 0x36, 0xde, 0x3a, 0x84, 0x2e, 0x7f, 0x15, 0xc6, 0xb8, 0x52, 0x2f, + 0xe8, 0x38, 0x0c, 0xad, 0x15, 0x6a, 0x28, 0x7f, 0x33, 0xb6, 0xda, 0x25, 0x28, 0xd0, 0xb5, 0x27, + 0x0e, 0x64, 0x53, 0x77, 0xb5, 0xa5, 0x5b, 0x16, 0x1e, 0xb3, 0x2a, 0x7f, 0x2b, 0x36, 0x75, 0x87, + 0x28, 0x74, 0xdc, 0x0d, 0x7e, 0x31, 0x4d, 0xe8, 0x96, 0xb5, 0x43, 0xf9, 0xd1, 0x98, 0x26, 0x74, + 0x23, 0x66, 0x9a, 0xd0, 0x35, 0x05, 0xc8, 0xad, 0x0e, 0x0f, 0x1b, 0x95, 0x2f, 0xc4, 0x56, 0xe4, + 0x54, 0x2a, 0xb6, 0x22, 0xa7, 0xbf, 0x8b, 0xbc, 0xd5, 0xe1, 0x51, 0xa0, 0xf2, 0x63, 0xdd, 0xf9, + 0x86, 0x2b, 0x7d, 0xfa, 0x9b, 0xc2, 0x5b, 0x1d, 0x1e, 0xd4, 0x29, 0x3f, 0xde, 0x9d, 0x6f, 0xe8, + 0xd8, 0x97, 0xfe, 0x1e, 0xaf, 0xd6, 0xf9, 0x31, 0x9a, 0xf2, 0x13, 0xf1, 0xa9, 0xab, 0x03, 0x21, + 0x4e, 0x5d, 0x9d, 0x5e, 0xb4, 0x2d, 0xc1, 0x03, 0x5c, 0x43, 0xae, 0x3b, 0x7a, 0x6b, 0xb5, 0x4a, + 0x3d, 0xcf, 0xb4, 0x56, 0xfc, 0x9d, 0xd8, 0xdf, 0xce, 0xc4, 0x8e, 0xc7, 0x3a, 0x51, 0xe2, 0xf1, + 0x58, 0x27, 0x24, 0x53, 0xde, 0xc4, 0xb3, 0x33, 0xe5, 0x27, 0x63, 0xca, 0x9b, 0xa0, 0x60, 0xca, + 0x9b, 0x7c, 0xad, 0xf6, 0x6a, 0xca, 0xeb, 0x2a, 0xe5, 0xef, 0x74, 0xe6, 0x15, 0xb4, 0x2f, 0xe5, + 0x51, 0xd6, 0xab, 0x29, 0x8f, 0x88, 0x94, 0xbf, 0xdb, 0x99, 0x57, 0xe8, 0x83, 0x94, 0x7c, 0x7b, + 0xf4, 0x3a, 0x9c, 0xe2, 0xb3, 0xf9, 0x14, 0x35, 0x68, 0xe4, 0x43, 0x7f, 0x2a, 0x36, 0xf6, 0xd3, + 0xc9, 0xf0, 0xc8, 0x3d, 0x15, 0x93, 0xc6, 0x5a, 0xb4, 0xf5, 0xa7, 0xb7, 0x60, 0x1d, 0x6e, 0x08, + 0xd2, 0x31, 0xe3, 0x7d, 0xd0, 0x8b, 0x7b, 0x71, 0xf5, 0x0b, 0x19, 0x18, 0xaa, 0x7a, 0x0e, 0xd5, + 0x9b, 0x22, 0x0e, 0xc6, 0x19, 0xe8, 0xe7, 0x4e, 0x6d, 0xfe, 0xbb, 0x12, 0x2d, 0xf8, 0x4d, 0x2e, + 0xc0, 0xc8, 0x8c, 0xee, 0x7a, 0x58, 0xb2, 0x62, 0x19, 0xf4, 0x1e, 0x3e, 0xe8, 0xc8, 0x69, 0x31, + 0x28, 0x99, 0xe1, 0x74, 0xbc, 0x1c, 0x86, 0x3e, 0xca, 0x6d, 0x19, 0xfe, 0xa1, 0xff, 0xad, 0x8d, + 0x62, 0x0f, 0x46, 0x7b, 0x88, 0x95, 0x55, 0xbf, 0x92, 0x81, 0x84, 0xbb, 0xdd, 0xee, 0xdf, 0x7b, + 0xcd, 0xc3, 0xb1, 0x58, 0xb8, 0x2d, 0xf1, 0x2a, 0x65, 0x9b, 0xd1, 0xb8, 0xe2, 0xa5, 0xc9, 0xbb, + 0x83, 0xd7, 0x10, 0x37, 0xb5, 0x19, 0x11, 0xda, 0xa3, 0x6f, 0x73, 0xa3, 0x98, 0x6b, 0x3b, 0x0d, + 0x4d, 0x42, 0x89, 0xa7, 0xdb, 0xdf, 0x18, 0x0d, 0x63, 0x09, 0x91, 0x0b, 0xe2, 0xf1, 0x59, 0x26, + 0x0c, 0x08, 0x12, 0xcb, 0x54, 0xc9, 0x1f, 0x9b, 0xbd, 0x1f, 0x86, 0x2a, 0xcd, 0x16, 0x75, 0x5c, + 0xdb, 0xd2, 0x3d, 0xdb, 0xcf, 0x88, 0x8f, 0xc1, 0x22, 0x4c, 0x09, 0x2e, 0x07, 0x30, 0x90, 0xe9, + 0xc9, 0x25, 0x3f, 0x79, 0x46, 0x0e, 0xa3, 0x38, 0x61, 0x28, 0xd2, 0x78, 0xf6, 0x43, 0x4e, 0xc1, + 0x48, 0x6f, 0xba, 0x3a, 0xbe, 0x9b, 0x09, 0x48, 0xdb, 0x0c, 0x20, 0x93, 0x22, 0x05, 0x79, 0x1c, + 0x0a, 0x78, 0xce, 0xe8, 0x62, 0x52, 0x1c, 0x11, 0xa6, 0xa4, 0x81, 0x10, 0x39, 0x28, 0x04, 0xa7, + 0x21, 0x37, 0x60, 0x34, 0xbc, 0x44, 0xb9, 0xee, 0xd8, 0xed, 0x96, 0x1f, 0x06, 0x1b, 0xb3, 0x46, + 0xde, 0x09, 0x70, 0xb5, 0x15, 0x44, 0x4a, 0x2c, 0x12, 0x05, 0xc9, 0x34, 0x1c, 0x0b, 0x61, 0x4c, + 0x44, 0x7e, 0xf8, 0x7d, 0x4c, 0x7d, 0x24, 0xf1, 0x62, 0xe2, 0x8c, 0xa4, 0x3e, 0x8a, 0x15, 0x23, + 0x15, 0xe8, 0xf3, 0x63, 0x94, 0xf4, 0x6f, 0xa9, 0xa4, 0xc7, 0x45, 0x8c, 0x92, 0x3e, 0x39, 0x3a, + 0x89, 0x5f, 0x9e, 0x4c, 0xc1, 0x88, 0x66, 0xb7, 0x3d, 0xba, 0x68, 0x0b, 0xeb, 0x43, 0xc4, 0xc2, + 0xc1, 0x36, 0x39, 0x0c, 0x53, 0xf3, 0x6c, 0x3f, 0xe9, 0xa6, 0x9c, 0xfc, 0x31, 0x5a, 0x8a, 0xcc, + 0xc1, 0x58, 0xe2, 0xba, 0x49, 0x4e, 0x85, 0x29, 0x7d, 0x5e, 0x92, 0x59, 0xb2, 0x28, 0xf9, 0xce, + 0x0c, 0x14, 0x16, 0x1d, 0xdd, 0xf4, 0x5c, 0xf1, 0xe4, 0xe6, 0xe4, 0xe5, 0x35, 0x47, 0x6f, 0x31, + 0xfd, 0xb8, 0x8c, 0x61, 0xba, 0x6e, 0xe9, 0x8d, 0x36, 0x75, 0xc7, 0x6f, 0xb3, 0xaf, 0xfb, 0x83, + 0x8d, 0xe2, 0x0b, 0x2b, 0xb8, 0xa9, 0xbd, 0x5c, 0xb7, 0x9b, 0x57, 0x56, 0x1c, 0xfd, 0xae, 0xe9, + 0xe1, 0xd4, 0xa1, 0x37, 0xae, 0x78, 0xb4, 0x81, 0x7b, 0xe7, 0x2b, 0x7a, 0xcb, 0xbc, 0x82, 0xe1, + 0x20, 0xaf, 0x04, 0x9c, 0x78, 0x0d, 0x4c, 0x05, 0x3c, 0xfc, 0x4b, 0x56, 0x01, 0x8e, 0x23, 0x73, + 0x6c, 0xcb, 0x89, 0x9f, 0x5a, 0x6a, 0xb5, 0xc4, 0xfb, 0x1d, 0x69, 0xc7, 0xe9, 0x63, 0xb8, 0x62, + 0x07, 0x02, 0xd3, 0x5b, 0x2d, 0x39, 0xd9, 0x6e, 0x48, 0xc7, 0xb4, 0x60, 0x51, 0xb4, 0xc8, 0x17, + 0xd3, 0x70, 0x28, 0x71, 0xbf, 0xb1, 0x29, 0x42, 0x8a, 0x17, 0x23, 0x4b, 0x70, 0x4c, 0xf0, 0x0d, + 0x02, 0x26, 0x8f, 0x44, 0x67, 0x85, 0x18, 0x9a, 0x2b, 0x6d, 0xd0, 0x46, 0x43, 0x80, 0xe5, 0x3a, + 0x62, 0x25, 0xc8, 0x78, 0x98, 0xc5, 0x6d, 0x4e, 0x6f, 0x52, 0x57, 0x39, 0x86, 0x1a, 0x7b, 0x76, + 0x73, 0xa3, 0xa8, 0xf8, 0xe5, 0x31, 0x5c, 0x4f, 0x6a, 0x4e, 0x52, 0x2c, 0x22, 0xf3, 0xe0, 0x5a, + 0x3f, 0x9a, 0xc2, 0x23, 0xae, 0xf3, 0xd1, 0x22, 0x64, 0x02, 0x86, 0x03, 0xf7, 0xe1, 0x9b, 0x37, + 0x2b, 0x65, 0x7c, 0x20, 0x24, 0x22, 0x36, 0xc5, 0x42, 0x1a, 0xcb, 0x4c, 0x22, 0x65, 0xa4, 0x97, + 0x84, 0xfc, 0xc5, 0x50, 0xec, 0x25, 0x61, 0x2b, 0xe5, 0x25, 0xe1, 0x02, 0x79, 0x09, 0x06, 0x4b, + 0xb7, 0xab, 0xe2, 0x85, 0xa4, 0xab, 0x1c, 0x0f, 0x83, 0xe0, 0x63, 0x5a, 0x5a, 0xf1, 0x9a, 0x52, + 0x6e, 0xba, 0x4c, 0x4f, 0x26, 0x61, 0x24, 0xe2, 0x81, 0xe0, 0x2a, 0x27, 0x90, 0x03, 0xb6, 0x5c, + 0x47, 0x4c, 0xcd, 0x11, 0xa8, 0x48, 0xa2, 0xe4, 0x48, 0x21, 0xa6, 0x35, 0x6c, 0x13, 0xdf, 0x68, + 0xd8, 0x6b, 0x1a, 0xc5, 0xc7, 0x98, 0xf8, 0xdc, 0xa8, 0x9f, 0x6b, 0x8d, 0x21, 0x50, 0x35, 0x87, + 0xe3, 0x22, 0x99, 0x91, 0xa3, 0xc5, 0xc8, 0x1b, 0x40, 0x30, 0x04, 0x39, 0x35, 0xfc, 0x03, 0xe9, + 0x4a, 0xd9, 0x55, 0x4e, 0x61, 0xb8, 0x42, 0x12, 0x7f, 0x0d, 0x5c, 0x29, 0x8f, 0x5f, 0x10, 0xd3, + 0xc7, 0x79, 0x9d, 0x97, 0xaa, 0x39, 0x02, 0x57, 0x33, 0x23, 0xf9, 0xd9, 0x52, 0xb8, 0x92, 0x35, + 0x38, 0xbd, 0xe0, 0xd0, 0xbb, 0xa6, 0xdd, 0x76, 0xfd, 0xe5, 0xc3, 0x9f, 0xb7, 0x4e, 0x6f, 0x39, + 0x6f, 0x3d, 0x2c, 0x2a, 0x3e, 0xd9, 0x72, 0xe8, 0xdd, 0x9a, 0x1f, 0xa4, 0x2e, 0x12, 0x63, 0xa9, + 0x13, 0x77, 0xcc, 0x32, 0xf7, 0x66, 0xdb, 0xa1, 0x02, 0x6e, 0x52, 0x57, 0x51, 0xc2, 0xa9, 0x96, + 0xbf, 0xab, 0x35, 0x03, 0x5c, 0x24, 0xcb, 0x5c, 0xb4, 0x18, 0xd1, 0x80, 0x5c, 0x9f, 0xf0, 0x2f, + 0x27, 0x4a, 0x75, 0x9e, 0x8b, 0x4b, 0x79, 0x00, 0x99, 0xa9, 0x4c, 0x2c, 0x2b, 0xf5, 0x20, 0x60, + 0x65, 0x4d, 0x17, 0x78, 0x59, 0x2c, 0xc9, 0xd2, 0x64, 0x06, 0x46, 0x17, 0x1c, 0xdc, 0x2a, 0xdd, + 0xa0, 0xeb, 0x0b, 0x76, 0xc3, 0xac, 0xaf, 0xe3, 0xab, 0x27, 0x31, 0x55, 0xb6, 0x38, 0xae, 0x76, + 0x87, 0xae, 0xd7, 0x5a, 0x88, 0x95, 0x97, 0x95, 0x78, 0x49, 0x39, 0x80, 0xdc, 0x83, 0xdb, 0x0b, + 0x20, 0x47, 0x61, 0x54, 0x5c, 0x6d, 0xdc, 0xf3, 0xa8, 0xc5, 0x96, 0x7a, 0x57, 0xbc, 0x70, 0x52, + 0x62, 0x57, 0x21, 0x01, 0x5e, 0x64, 0x49, 0xe6, 0xa3, 0x8c, 0x06, 0x60, 0xb9, 0x61, 0xf1, 0x22, + 0xc9, 0x28, 0x6b, 0xe7, 0x76, 0x11, 0x65, 0xed, 0x1f, 0xe6, 0xe4, 0xf9, 0x97, 0x9c, 0x85, 0xbc, + 0x14, 0x04, 0x1d, 0x43, 0x48, 0x61, 0xc0, 0xc8, 0xbc, 0x88, 0x8c, 0x37, 0x20, 0x6c, 0x97, 0xe0, + 0xad, 0x30, 0xa6, 0xb6, 0x09, 0xc3, 0x0a, 0x69, 0x21, 0x01, 0xa6, 0x15, 0x69, 0x2f, 0x35, 0xcc, + 0x3a, 0x86, 0x11, 0xcd, 0x49, 0x69, 0x45, 0x10, 0xca, 0xa3, 0x88, 0x4a, 0x24, 0xe4, 0x2a, 0x0c, + 0xfa, 0x5b, 0xf4, 0x30, 0x84, 0x1a, 0x46, 0x97, 0xf4, 0x93, 0x52, 0xf3, 0xe0, 0x95, 0x12, 0x11, + 0x79, 0x1e, 0xd3, 0xb2, 0xfb, 0xef, 0xb0, 0x7b, 0x43, 0x1b, 0x48, 0x9e, 0x3d, 0x62, 0x79, 0xd9, + 0xfd, 0xe7, 0xd8, 0xe3, 0x30, 0x2c, 0xab, 0xa3, 0x9f, 0x48, 0x09, 0x27, 0xce, 0x88, 0x0e, 0xcb, + 0x0a, 0x12, 0x2d, 0x42, 0xe6, 0x61, 0x2c, 0xa1, 0x81, 0x22, 0xe0, 0x1a, 0x26, 0xd3, 0x4c, 0x51, + 0x5f, 0x79, 0x61, 0x4e, 0x94, 0x25, 0x8f, 0x40, 0xee, 0xa6, 0x56, 0x11, 0x41, 0x9f, 0x78, 0xbc, + 0xb0, 0xc8, 0x8b, 0x70, 0x86, 0x55, 0xbf, 0x2d, 0x9b, 0x58, 0x9b, 0x98, 0xf4, 0x04, 0x2b, 0xa9, + 0x07, 0x51, 0x7a, 0x7e, 0xfd, 0x5c, 0x7a, 0x12, 0x11, 0xb9, 0x08, 0xfd, 0xb1, 0xf4, 0xed, 0xf8, + 0x7c, 0x3f, 0xc8, 0xdd, 0x1e, 0x60, 0xc9, 0x55, 0x29, 0xff, 0x97, 0x14, 0x47, 0xd1, 0xcf, 0xff, + 0x15, 0x0f, 0x28, 0x88, 0x99, 0xc0, 0xae, 0xc6, 0x52, 0x0d, 0xf8, 0x59, 0xb6, 0x93, 0xeb, 0x62, + 0x98, 0x5a, 0x20, 0xb0, 0x4a, 0x7b, 0xb7, 0xb2, 0x4a, 0xd5, 0x5f, 0xcf, 0x24, 0xc7, 0x19, 0xb9, + 0x96, 0x0c, 0x69, 0xc6, 0x13, 0x6c, 0xfb, 0x40, 0xb9, 0xd6, 0x20, 0xb8, 0x59, 0x24, 0x38, 0x59, + 0x76, 0xd7, 0xc1, 0xc9, 0x72, 0x3b, 0x0c, 0x4e, 0xa6, 0xfe, 0xef, 0x7c, 0x57, 0x57, 0xbc, 0x03, + 0x09, 0x62, 0xf1, 0x1c, 0xdb, 0x59, 0xb1, 0xda, 0x4b, 0x6e, 0x62, 0x7f, 0xc0, 0x3d, 0x8d, 0x6a, + 0x3a, 0x1f, 0x5a, 0xae, 0x16, 0xa5, 0x24, 0x2f, 0xc3, 0x90, 0xff, 0x01, 0x18, 0xf4, 0x4e, 0x0a, + 0xd6, 0x16, 0xac, 0x6a, 0xf1, 0x1c, 0xe9, 0x72, 0x01, 0xf2, 0x34, 0x0c, 0xa0, 0x4d, 0xd3, 0xd2, + 0xeb, 0x7e, 0x44, 0x44, 0x1e, 0x42, 0xd1, 0x07, 0xca, 0x81, 0x1a, 0x02, 0x4a, 0xf2, 0x11, 0x28, + 0x44, 0x92, 0xf4, 0x5f, 0xd9, 0x86, 0xef, 0xe2, 0x65, 0x39, 0x24, 0x30, 0xdf, 0xa5, 0xc4, 0x13, + 0xf4, 0x0b, 0xa6, 0x64, 0x11, 0x8e, 0x2f, 0x38, 0xd4, 0x40, 0x2f, 0xd9, 0xc9, 0x7b, 0x2d, 0x47, + 0x04, 0x6c, 0xe6, 0xa3, 0x1c, 0x17, 0xa9, 0x96, 0x8f, 0x66, 0xcb, 0xa7, 0xc0, 0xcb, 0x61, 0xd9, + 0x52, 0x8a, 0x33, 0xcb, 0x85, 0xb7, 0xe4, 0x06, 0x5d, 0x5f, 0xc3, 0x44, 0xad, 0xfd, 0xa1, 0xe5, + 0x22, 0x04, 0x7d, 0x47, 0xa0, 0x64, 0xcb, 0x25, 0x5a, 0xe8, 0xcc, 0x73, 0x30, 0xb8, 0xdb, 0xb0, + 0xba, 0xbf, 0x90, 0xed, 0xe0, 0xd4, 0x7e, 0xff, 0x66, 0x36, 0x09, 0x72, 0xea, 0xf5, 0x76, 0xc8, + 0xa9, 0xf7, 0xf5, 0x6c, 0x07, 0x8f, 0xfd, 0xfb, 0x3a, 0xf7, 0x55, 0x20, 0x8c, 0x68, 0xee, 0xab, + 0x30, 0xed, 0x98, 0x69, 0x68, 0x32, 0x51, 0x2c, 0x4b, 0x5e, 0x61, 0xcb, 0x2c, 0x79, 0x3f, 0x95, + 0xeb, 0xf6, 0xa2, 0xe1, 0x48, 0xf6, 0x3b, 0x91, 0xfd, 0x55, 0x18, 0x0c, 0x24, 0x5b, 0x29, 0xa3, + 0xd1, 0x33, 0x1c, 0x04, 0xf1, 0xe6, 0x60, 0x2c, 0x23, 0x11, 0x91, 0x4b, 0xbc, 0xad, 0x55, 0xf3, + 0x4d, 0x1e, 0x4e, 0x76, 0x58, 0x04, 0x0a, 0xd5, 0x3d, 0xbd, 0xe6, 0x9a, 0x6f, 0x52, 0x2d, 0x40, + 0xab, 0xff, 0x24, 0x9b, 0xfa, 0x2c, 0xe4, 0xa8, 0x8f, 0x76, 0xd0, 0x47, 0x29, 0x42, 0xe4, 0x0f, + 0x5a, 0x8e, 0x84, 0xb8, 0x03, 0x21, 0xfe, 0x49, 0x36, 0xf5, 0xf9, 0xcf, 0x91, 0x10, 0x77, 0x32, + 0x5b, 0x3c, 0x0e, 0x03, 0x9a, 0xbd, 0xe6, 0x62, 0x4a, 0x6c, 0x31, 0x57, 0xe0, 0x44, 0xed, 0xd8, + 0x6b, 0x2e, 0x4f, 0x17, 0xae, 0x85, 0x04, 0xea, 0x37, 0xb2, 0x5d, 0x1e, 0x48, 0x1d, 0x09, 0xfe, + 0xed, 0x5c, 0x22, 0x7f, 0x39, 0x1b, 0x79, 0x80, 0x75, 0x5f, 0x27, 0x91, 0xad, 0xd6, 0x57, 0x69, + 0x53, 0x8f, 0x27, 0x91, 0x75, 0x11, 0x2a, 0x52, 0xb9, 0x85, 0x24, 0xea, 0x17, 0xb3, 0xb1, 0x17, + 0x68, 0x47, 0xb2, 0xdb, 0xb6, 0xec, 0x02, 0xad, 0x13, 0x8f, 0xea, 0x8e, 0x24, 0xb7, 0x5d, 0xc9, + 0x7d, 0x22, 0x1b, 0x7b, 0x7f, 0x78, 0xdf, 0xca, 0x8e, 0x0d, 0xc0, 0xe4, 0xbb, 0xc8, 0xfb, 0x56, + 0x93, 0x1e, 0x87, 0x01, 0x21, 0x87, 0x60, 0xa9, 0xe0, 0xf3, 0x3e, 0x07, 0xe2, 0x29, 0x6b, 0x40, + 0xa0, 0x7e, 0x47, 0x16, 0xa2, 0xef, 0x42, 0xef, 0x53, 0x1d, 0xfa, 0xe5, 0x6c, 0xf4, 0x45, 0xec, + 0xfd, 0xab, 0x3f, 0x97, 0x01, 0xaa, 0xed, 0xa5, 0xba, 0x08, 0xa8, 0xd8, 0x2b, 0x1d, 0xd3, 0x07, + 0x50, 0x4d, 0xa2, 0x50, 0xff, 0x4f, 0x36, 0xf5, 0x99, 0xee, 0xfd, 0x2b, 0xc0, 0xa7, 0xf0, 0x54, + 0xbc, 0x6e, 0x85, 0x13, 0x39, 0x1e, 0x42, 0xb2, 0xf1, 0x97, 0xc8, 0xe3, 0xe2, 0x13, 0x92, 0xf7, + 0xa5, 0x98, 0x6b, 0x18, 0x65, 0x36, 0x34, 0xd7, 0xe4, 0x6b, 0x08, 0xc9, 0x70, 0xfb, 0x97, 0xd9, + 0xad, 0x5e, 0x35, 0xdf, 0xcf, 0xab, 0x6a, 0xdf, 0x82, 0xbe, 0x8e, 0xd1, 0xb7, 0x58, 0x4f, 0x0c, + 0xf1, 0x2c, 0x23, 0x2d, 0x0e, 0x92, 0xef, 0xde, 0x04, 0x95, 0xfa, 0xc7, 0xbd, 0xe9, 0x4f, 0x6a, + 0xef, 0x5f, 0x11, 0x9e, 0x85, 0xfc, 0x82, 0xee, 0xad, 0x0a, 0x4d, 0xc6, 0x2b, 0xbd, 0x96, 0xee, + 0xad, 0x6a, 0x08, 0x25, 0x97, 0xa0, 0x5f, 0xd3, 0xd7, 0xf8, 0x99, 0x67, 0x21, 0xcc, 0x00, 0xe3, + 0xe8, 0x6b, 0x35, 0x7e, 0xee, 0x19, 0xa0, 0x89, 0x1a, 0x64, 0x20, 0xe2, 0x27, 0xdf, 0x98, 0xfe, + 0x82, 0x67, 0x20, 0x0a, 0xf2, 0x0e, 0x9d, 0x85, 0xfc, 0xb8, 0x6d, 0xac, 0xe3, 0xf5, 0xd5, 0x10, + 0xaf, 0x6c, 0xc9, 0x36, 0xd6, 0x35, 0x84, 0x92, 0x4f, 0x66, 0xa0, 0x6f, 0x9a, 0xea, 0x06, 0x1b, + 0x21, 0x03, 0xdd, 0xbc, 0x4e, 0x3e, 0xb0, 0x3f, 0x5e, 0x27, 0x63, 0xab, 0xbc, 0x32, 0x59, 0x51, + 0x44, 0xfd, 0xe4, 0x3a, 0xf4, 0x4f, 0xe8, 0x1e, 0x5d, 0xb1, 0x9d, 0x75, 0xf4, 0xa3, 0x19, 0x09, + 0xdd, 0x32, 0x23, 0xfa, 0xe3, 0x13, 0xf1, 0x9b, 0xb1, 0xba, 0xf8, 0xa5, 0x05, 0x85, 0x99, 0x58, + 0x44, 0x4e, 0xd4, 0xc1, 0x50, 0x2c, 0x3c, 0xf9, 0x69, 0x90, 0xfa, 0x34, 0x38, 0x56, 0x1e, 0x4a, + 0x3f, 0x56, 0x46, 0xeb, 0x11, 0x7d, 0xed, 0x30, 0xef, 0xcf, 0x30, 0x2e, 0xfa, 0xdc, 0x7a, 0x44, + 0x28, 0xa6, 0xfd, 0xd1, 0x24, 0x12, 0xf5, 0xab, 0xbd, 0x90, 0xfa, 0x00, 0xef, 0x48, 0xc9, 0x8f, + 0x94, 0x3c, 0x54, 0xf2, 0x72, 0x42, 0xc9, 0xcf, 0x24, 0x9f, 0x74, 0xbe, 0x43, 0x35, 0xfc, 0xf3, + 0xf9, 0xc4, 0x83, 0xf0, 0xfb, 0x7b, 0x77, 0x19, 0x4a, 0xaf, 0x77, 0x4b, 0xe9, 0x05, 0x03, 0xa2, + 0xb0, 0xe5, 0x80, 0xe8, 0xdb, 0xee, 0x80, 0xe8, 0xef, 0x38, 0x20, 0x42, 0x05, 0x19, 0xe8, 0xa8, + 0x20, 0x15, 0x31, 0x68, 0xa0, 0x7b, 0x4e, 0xb9, 0xb3, 0x9b, 0x1b, 0xc5, 0x11, 0x36, 0x9a, 0x52, + 0xb3, 0xc9, 0x21, 0x0b, 0xf5, 0x2b, 0xf9, 0x2e, 0x51, 0x1c, 0x0e, 0x44, 0x47, 0x9e, 0x82, 0x5c, + 0xa9, 0xd5, 0x12, 0xfa, 0x71, 0x5c, 0x0a, 0x20, 0xd1, 0xa1, 0x14, 0xa3, 0x26, 0xcf, 0x43, 0xae, + 0x74, 0xbb, 0x1a, 0x8f, 0x45, 0x5f, 0xba, 0x5d, 0x15, 0x5f, 0xd2, 0xb1, 0xec, 0xed, 0x2a, 0x79, + 0x31, 0x0c, 0x0a, 0xb7, 0xda, 0xb6, 0xee, 0x88, 0x8d, 0xa2, 0x70, 0xb7, 0xf5, 0xdd, 0x71, 0xea, + 0x0c, 0xc5, 0xb6, 0x8b, 0x31, 0xda, 0x98, 0x36, 0x15, 0xb6, 0xaf, 0x4d, 0x7d, 0x5b, 0x6a, 0x53, + 0xff, 0x76, 0xb5, 0x69, 0x60, 0x1b, 0xda, 0x04, 0x5b, 0x6a, 0xd3, 0xe0, 0xde, 0xb5, 0xa9, 0x05, + 0x67, 0x92, 0x91, 0x77, 0x02, 0x8d, 0xd0, 0x80, 0x24, 0xb1, 0xc2, 0xb1, 0x04, 0xaf, 0xfe, 0xdb, + 0x1c, 0x5b, 0xe3, 0xb9, 0x8b, 0xe3, 0x99, 0x7f, 0xb5, 0x94, 0xd2, 0xea, 0x2f, 0x64, 0x3b, 0x07, + 0x0c, 0x3a, 0x9c, 0x53, 0xdc, 0xb7, 0xa4, 0x4a, 0x29, 0x1f, 0x7d, 0xc0, 0xd9, 0x59, 0xca, 0x31, + 0xb6, 0x69, 0x32, 0xfb, 0x72, 0xa6, 0x53, 0x14, 0xa3, 0x3d, 0x49, 0xec, 0xd1, 0xa4, 0x47, 0x1b, + 0xfa, 0xe9, 0xbb, 0x51, 0x57, 0xb6, 0x78, 0x2a, 0xdc, 0xdc, 0x2e, 0x53, 0xe1, 0xfe, 0x7a, 0x06, + 0x8e, 0xdf, 0x68, 0x2f, 0x51, 0xe1, 0xc1, 0x16, 0x34, 0xe3, 0x0d, 0x00, 0x06, 0x16, 0x4e, 0x2c, + 0x19, 0x74, 0x62, 0x79, 0x8f, 0x1c, 0x81, 0x28, 0x56, 0xe0, 0x72, 0x48, 0xcd, 0x1d, 0x58, 0xce, + 0xf9, 0xce, 0x9c, 0x77, 0xda, 0x4b, 0xb4, 0x96, 0xf0, 0x64, 0x91, 0xb8, 0x9f, 0x79, 0x89, 0xbb, + 0xc9, 0xef, 0xd6, 0x69, 0xe4, 0xe7, 0xb2, 0x1d, 0x83, 0x3e, 0x1d, 0xda, 0x9c, 0x3b, 0x1f, 0x4a, + 0xed, 0x95, 0x78, 0xee, 0x9d, 0x14, 0x92, 0x18, 0xc7, 0x34, 0x2e, 0xe9, 0x02, 0x3b, 0xe4, 0x99, + 0xa0, 0xde, 0x56, 0x81, 0xfd, 0x4e, 0xa6, 0x63, 0x70, 0xae, 0xc3, 0x2a, 0x30, 0xf5, 0x3f, 0xe5, + 0xfc, 0x98, 0x60, 0x7b, 0xfa, 0x84, 0xc7, 0x61, 0x40, 0x3c, 0x8d, 0x8c, 0x3a, 0xe0, 0x8a, 0xa3, + 0x3c, 0x3c, 0x1a, 0x0e, 0x08, 0xd8, 0x32, 0x2f, 0x79, 0x07, 0x4b, 0x0e, 0xb8, 0x92, 0x67, 0xb0, + 0x26, 0x91, 0xb0, 0x85, 0x7c, 0xf2, 0x9e, 0xe9, 0xa1, 0x55, 0xc0, 0xfa, 0x32, 0xc7, 0x17, 0x72, + 0x7a, 0xcf, 0xf4, 0xb8, 0x4d, 0x10, 0xa0, 0xd9, 0x22, 0x5d, 0x0d, 0xf3, 0x5c, 0x8a, 0x45, 0xda, + 0x15, 0xe9, 0x3e, 0xc5, 0xb3, 0xb1, 0xc7, 0x61, 0x40, 0x78, 0xb5, 0x0a, 0x37, 0x13, 0xd1, 0x5a, + 0xe1, 0x07, 0x8b, 0xad, 0x0d, 0x08, 0x18, 0x47, 0x8d, 0xae, 0x84, 0x8e, 0x75, 0xc8, 0xd1, 0x41, + 0x88, 0x26, 0x30, 0xe4, 0x2a, 0x8c, 0x54, 0x3d, 0xdd, 0x32, 0x74, 0xc7, 0x98, 0x6f, 0x7b, 0xad, + 0xb6, 0x27, 0x1b, 0xa5, 0xae, 0x67, 0xd8, 0x6d, 0x4f, 0x8b, 0x51, 0x90, 0xf7, 0xc2, 0xb0, 0x0f, + 0x99, 0x74, 0x1c, 0xdb, 0x91, 0x2d, 0x0f, 0xd7, 0x33, 0xa8, 0xe3, 0x68, 0x51, 0x02, 0xf2, 0x3e, + 0x18, 0xae, 0x58, 0x77, 0x6d, 0x9e, 0x40, 0xf5, 0xa6, 0x36, 0x23, 0xec, 0x10, 0x7c, 0x8a, 0x65, + 0x06, 0x88, 0x5a, 0xdb, 0x69, 0x68, 0x51, 0x42, 0x75, 0x33, 0x9b, 0x0c, 0x9d, 0x76, 0xff, 0x6e, + 0x5a, 0x2e, 0x45, 0x9d, 0xe9, 0xd0, 0x83, 0x14, 0x0d, 0x42, 0xd9, 0x97, 0x97, 0xdb, 0x85, 0x57, + 0xa1, 0xff, 0x06, 0x5d, 0xe7, 0x7e, 0x9f, 0x85, 0xd0, 0x55, 0xf8, 0x8e, 0x80, 0xc9, 0x27, 0xae, + 0x3e, 0x9d, 0xfa, 0xa5, 0x6c, 0x32, 0x28, 0xdc, 0xfd, 0x2b, 0xec, 0xf7, 0x42, 0x1f, 0x8a, 0xb2, + 0xe2, 0x1f, 0xf9, 0xa3, 0x00, 0x51, 0xdc, 0x51, 0x0f, 0x64, 0x9f, 0x4c, 0xfd, 0xb1, 0x42, 0x3c, + 0x52, 0xe0, 0xfd, 0x2b, 0xbd, 0x17, 0x60, 0x70, 0xc2, 0xb6, 0x5c, 0xd3, 0xf5, 0xa8, 0x55, 0xf7, + 0x15, 0xf6, 0x01, 0x66, 0x50, 0xd5, 0x43, 0xb0, 0xfc, 0x06, 0x49, 0xa2, 0xde, 0x8d, 0xf2, 0x92, + 0x67, 0x60, 0x00, 0x45, 0x8e, 0x7e, 0xd2, 0x52, 0x82, 0xf6, 0x25, 0x06, 0x8c, 0x3b, 0x49, 0x87, + 0xa4, 0xe4, 0x26, 0xf4, 0x4f, 0xac, 0x9a, 0x0d, 0xc3, 0xa1, 0x16, 0xfa, 0x0b, 0x4b, 0x0f, 0xb2, + 0xa3, 0x7d, 0x79, 0x19, 0xff, 0x45, 0x5a, 0xde, 0x9c, 0xba, 0x28, 0x16, 0x79, 0x85, 0x25, 0x60, + 0x67, 0xbe, 0x2f, 0x0b, 0x10, 0x16, 0x20, 0x0f, 0x41, 0x36, 0x48, 0x21, 0x87, 0x6e, 0x2a, 0x11, + 0x0d, 0xca, 0xe2, 0x52, 0x21, 0xc6, 0x76, 0x76, 0xcb, 0xb1, 0x7d, 0x13, 0x0a, 0xfc, 0xc4, 0x0b, + 0x3d, 0xc9, 0xa5, 0xe0, 0x65, 0x1d, 0x1b, 0x7c, 0x19, 0xe9, 0xf9, 0x66, 0x16, 0x2d, 0xcf, 0x88, + 0x57, 0x36, 0x67, 0x76, 0xa6, 0x0e, 0xbd, 0xf8, 0x17, 0xb9, 0x00, 0x79, 0x94, 0x62, 0x06, 0xf7, + 0xb1, 0x38, 0x4b, 0xc7, 0xe4, 0x87, 0x78, 0xd6, 0x4d, 0x13, 0xb6, 0xe5, 0xb1, 0xaa, 0xb1, 0xd5, + 0x43, 0x42, 0x2e, 0x02, 0x16, 0x91, 0x8b, 0x80, 0xa9, 0xff, 0x22, 0x9b, 0x12, 0xc3, 0xf2, 0xfe, + 0x1d, 0x26, 0xcf, 0x01, 0xe0, 0x93, 0x6e, 0x26, 0x4f, 0xff, 0x89, 0x06, 0x8e, 0x12, 0x64, 0x84, + 0x6a, 0x1b, 0xd9, 0x76, 0x84, 0xc4, 0xea, 0x6f, 0x66, 0x12, 0x81, 0x0f, 0xf7, 0x24, 0x47, 0xd9, + 0x2a, 0xcb, 0xee, 0xd2, 0x8c, 0xf5, 0xfb, 0x22, 0xb7, 0xb3, 0xbe, 0x88, 0x7e, 0xcb, 0x3e, 0x58, + 0xa6, 0x07, 0xf9, 0x2d, 0x5f, 0xcd, 0xa6, 0x85, 0x81, 0x3c, 0x9c, 0x2a, 0x7e, 0x2d, 0x30, 0x4a, + 0xf3, 0xdb, 0x49, 0xbe, 0x2e, 0xcc, 0xd4, 0x8f, 0xc2, 0xb1, 0x58, 0x70, 0x44, 0x91, 0xd7, 0xf1, + 0x42, 0xf7, 0x28, 0x8b, 0x9d, 0x83, 0x01, 0x44, 0xc8, 0xd4, 0xff, 0x9b, 0xe9, 0x1e, 0x1a, 0xf3, + 0xc0, 0x55, 0x27, 0x45, 0x00, 0xb9, 0xbf, 0x18, 0x01, 0xec, 0xc3, 0x36, 0xf8, 0x70, 0x0b, 0xe0, + 0x1d, 0x32, 0x79, 0xbc, 0xdd, 0x02, 0xf8, 0xb1, 0xcc, 0x96, 0x91, 0x4d, 0x0f, 0x5a, 0x06, 0xea, + 0xbf, 0xcf, 0xa4, 0x46, 0x20, 0xdd, 0x53, 0xbb, 0x5e, 0x84, 0x02, 0x77, 0xab, 0x11, 0xad, 0x92, + 0x72, 0xb6, 0x30, 0x68, 0x87, 0xf2, 0xa2, 0x0c, 0x99, 0x81, 0x3e, 0xde, 0x06, 0x23, 0x9e, 0xdb, + 0x38, 0xa5, 0x9d, 0x46, 0xa7, 0xc9, 0x51, 0xa0, 0xd5, 0xdf, 0xc8, 0x24, 0x02, 0xa2, 0x1e, 0xe0, + 0xb7, 0x85, 0x53, 0x75, 0x6e, 0xfb, 0x53, 0xb5, 0xfa, 0x47, 0xd9, 0xf4, 0x78, 0xac, 0x07, 0xf8, + 0x21, 0xfb, 0x71, 0x9c, 0xb6, 0xbb, 0x75, 0x6b, 0x11, 0x46, 0xa2, 0xb2, 0x10, 0xcb, 0xd6, 0xf9, + 0xf4, 0xa8, 0xb4, 0x1d, 0x5a, 0x11, 0xe3, 0xa1, 0xbe, 0x95, 0x49, 0x86, 0x92, 0x3d, 0xf0, 0xf9, + 0x69, 0x77, 0xda, 0x12, 0xfd, 0x94, 0x77, 0xc8, 0x5a, 0xb3, 0x1f, 0x9f, 0xf2, 0x0e, 0x59, 0x35, + 0x76, 0xf7, 0x29, 0x3f, 0x93, 0xed, 0x14, 0x89, 0xf7, 0xc0, 0x3f, 0xe8, 0x83, 0xb2, 0x90, 0x79, + 0xcb, 0xc4, 0xa7, 0x3d, 0xd4, 0x29, 0xf4, 0x6d, 0x07, 0x9e, 0x09, 0x3e, 0xbb, 0x1b, 0xe3, 0xa9, + 0xc2, 0x7a, 0x87, 0x28, 0xf2, 0xe1, 0x10, 0xd6, 0x3b, 0x64, 0xa8, 0xbc, 0xf3, 0x84, 0xf5, 0xab, + 0xd9, 0xed, 0x86, 0x7f, 0x3e, 0x12, 0x5e, 0x42, 0x78, 0x9f, 0xcd, 0x26, 0xc3, 0x92, 0x1f, 0xb8, + 0x98, 0xa6, 0xa0, 0x20, 0x02, 0xa4, 0x77, 0x14, 0x0e, 0xc7, 0x77, 0xb2, 0x68, 0xc4, 0x77, 0x5c, + 0x03, 0x71, 0x91, 0xb3, 0x3d, 0x91, 0x70, 0x5a, 0xf5, 0x1b, 0x99, 0x58, 0x0c, 0xef, 0x03, 0x39, + 0x42, 0xd8, 0xd5, 0x92, 0x44, 0x5e, 0xf2, 0x0f, 0x33, 0xf3, 0xb1, 0x18, 0xaa, 0xc1, 0xf7, 0x94, + 0xa9, 0xa7, 0x9b, 0x8d, 0x78, 0x79, 0x11, 0x13, 0xe0, 0x4b, 0x59, 0x18, 0x4b, 0x90, 0x92, 0x0b, + 0x91, 0x50, 0x3a, 0x78, 0x2c, 0x19, 0x73, 0x1e, 0xe7, 0x41, 0x75, 0x76, 0x70, 0x92, 0x7a, 0x01, + 0xf2, 0x65, 0x7d, 0x9d, 0x7f, 0x5b, 0x2f, 0x67, 0x69, 0xe8, 0xeb, 0xf2, 0x89, 0x1b, 0xe2, 0xc9, + 0x12, 0x9c, 0xe4, 0xf7, 0x21, 0xa6, 0x6d, 0x2d, 0x9a, 0x4d, 0x5a, 0xb1, 0x66, 0xcd, 0x46, 0xc3, + 0x74, 0xc5, 0xa5, 0xde, 0xe3, 0x9b, 0x1b, 0xc5, 0x8b, 0x9e, 0xed, 0xe9, 0x8d, 0x1a, 0xf5, 0xc9, + 0x6a, 0x9e, 0xd9, 0xa4, 0x35, 0xd3, 0xaa, 0x35, 0x91, 0x52, 0x62, 0x99, 0xce, 0x8a, 0x54, 0x78, + 0xb8, 0xdc, 0x6a, 0x5d, 0xb7, 0x2c, 0x6a, 0x54, 0xac, 0xf1, 0x75, 0x8f, 0xf2, 0xcb, 0xc0, 0x1c, + 0x3f, 0x12, 0xe4, 0x6f, 0xc3, 0x39, 0x9a, 0x31, 0x5e, 0x62, 0x04, 0x5a, 0x4a, 0x21, 0xf5, 0xd7, + 0xf2, 0x29, 0xe1, 0xdb, 0x0f, 0x91, 0xfa, 0xf8, 0x3d, 0x9d, 0xdf, 0xa2, 0xa7, 0xaf, 0x40, 0xdf, + 0x2d, 0xea, 0xe0, 0xf9, 0x16, 0xbf, 0x60, 0x40, 0x67, 0xf6, 0xbb, 0x1c, 0x24, 0xdf, 0xd0, 0x08, + 0x2a, 0xd2, 0x80, 0x33, 0x8b, 0xac, 0x9b, 0xd2, 0x3b, 0xb3, 0xb0, 0x8b, 0xce, 0xec, 0xc2, 0x8f, + 0xbc, 0x0e, 0xa7, 0x11, 0x9b, 0xd2, 0xad, 0x7d, 0x58, 0x15, 0xc6, 0xa8, 0xe2, 0x55, 0xa5, 0x77, + 0x6e, 0xa7, 0xf2, 0xe4, 0x83, 0x30, 0x14, 0x0c, 0x10, 0x93, 0xba, 0xe2, 0xe6, 0xa2, 0xcb, 0x38, + 0xe3, 0x01, 0xe0, 0x18, 0x18, 0x5d, 0xc8, 0xa2, 0x41, 0xc4, 0x22, 0xbc, 0xd4, 0x7f, 0x97, 0xe9, + 0x16, 0x46, 0xfe, 0xc0, 0x67, 0xe5, 0x97, 0xa0, 0xcf, 0xe0, 0x1f, 0x25, 0x74, 0xaa, 0x7b, 0xa0, + 0x79, 0x4e, 0xaa, 0xf9, 0x65, 0xd4, 0x3f, 0xcc, 0x74, 0x8d, 0x5e, 0x7f, 0xd8, 0x3f, 0xef, 0xb3, + 0xb9, 0x0e, 0x9f, 0x27, 0x26, 0xd1, 0x4b, 0x30, 0x6a, 0x86, 0xe1, 0x75, 0x6b, 0x61, 0xf8, 0x29, + 0xed, 0x98, 0x04, 0xc7, 0xd1, 0x75, 0x0d, 0x4e, 0xf9, 0x8e, 0x8f, 0x8e, 0xef, 0x21, 0xe6, 0xd6, + 0xda, 0x8e, 0xc9, 0xc7, 0xa5, 0x76, 0xc2, 0x8d, 0xb9, 0x8f, 0xb9, 0x37, 0x1d, 0x93, 0x55, 0xa0, + 0x7b, 0xab, 0xd4, 0xd2, 0x6b, 0x6b, 0xb6, 0x73, 0x07, 0xa3, 0x8c, 0xf2, 0xc1, 0xa9, 0x1d, 0xe3, + 0xf0, 0xdb, 0x3e, 0x98, 0x3c, 0x02, 0xc3, 0x2b, 0x8d, 0x36, 0x0d, 0xe2, 0x3a, 0xf2, 0xbb, 0x3e, + 0x6d, 0x88, 0x01, 0x83, 0x1b, 0x92, 0x73, 0x00, 0x48, 0xe4, 0x61, 0x6e, 0x01, 0xbc, 0xd8, 0xd3, + 0x06, 0x18, 0x64, 0x51, 0x74, 0xd7, 0x19, 0xae, 0xd5, 0x5c, 0x48, 0xb5, 0x86, 0x6d, 0xad, 0xd4, + 0x3c, 0xea, 0x34, 0xb1, 0xa1, 0xe8, 0xcc, 0xa0, 0x9d, 0x42, 0x0a, 0xbc, 0x3a, 0x71, 0x67, 0x6c, + 0x6b, 0x65, 0x91, 0x3a, 0x4d, 0xd6, 0xd4, 0xc7, 0x81, 0x88, 0xa6, 0x3a, 0x78, 0xe8, 0xc1, 0x3f, + 0x0e, 0xbd, 0x19, 0x34, 0xf1, 0x11, 0xfc, 0x34, 0x04, 0x3f, 0xac, 0x08, 0x83, 0x3c, 0xb8, 0x1d, + 0x17, 0x1a, 0xba, 0x30, 0x68, 0xc0, 0x41, 0x28, 0xaf, 0x53, 0x20, 0xbc, 0x2b, 0xb8, 0x57, 0xb7, + 0x26, 0x7e, 0xa9, 0x9f, 0xca, 0xa5, 0x05, 0xdc, 0xdf, 0x93, 0xa2, 0x85, 0xd3, 0x6a, 0x76, 0x47, + 0xd3, 0xea, 0x31, 0xab, 0xdd, 0xac, 0xe9, 0xad, 0x56, 0x6d, 0xd9, 0x6c, 0xe0, 0xb3, 0x2a, 0x5c, + 0xf8, 0xb4, 0x61, 0xab, 0xdd, 0x2c, 0xb5, 0x5a, 0x53, 0x1c, 0x48, 0x1e, 0x83, 0x31, 0x46, 0x87, + 0x9d, 0x14, 0x50, 0xe6, 0x91, 0x92, 0x31, 0xc0, 0xe8, 0xb0, 0x3e, 0xed, 0x03, 0xd0, 0x2f, 0x78, + 0xf2, 0xb5, 0xaa, 0x57, 0xeb, 0xe3, 0xcc, 0x5c, 0xd6, 0x73, 0x01, 0x1b, 0x3e, 0xb9, 0xf6, 0x6a, + 0x03, 0x7e, 0x79, 0x8c, 0x81, 0x6c, 0xb5, 0x9b, 0x3c, 0x22, 0x56, 0x1f, 0x22, 0x83, 0xdf, 0xe4, + 0x02, 0x8c, 0x30, 0x2e, 0x81, 0xc0, 0x78, 0xd8, 0xd8, 0x5e, 0x2d, 0x06, 0x25, 0x57, 0xe1, 0x44, + 0x04, 0xc2, 0x6d, 0x50, 0xfe, 0x4c, 0xa0, 0x57, 0x4b, 0xc5, 0xa9, 0x5f, 0xcc, 0x45, 0xd3, 0x00, + 0x1c, 0x40, 0x47, 0x9c, 0x86, 0x3e, 0xdb, 0x59, 0xa9, 0xb5, 0x9d, 0x86, 0x18, 0x7b, 0x05, 0xdb, + 0x59, 0xb9, 0xe9, 0x34, 0xc8, 0x49, 0x28, 0xb0, 0xde, 0x31, 0x0d, 0x31, 0xc4, 0x7a, 0xf5, 0x56, + 0xab, 0x62, 0x90, 0x12, 0xef, 0x10, 0x0c, 0x39, 0x5a, 0xab, 0xe3, 0xd6, 0x9e, 0x3b, 0x25, 0xf4, + 0xf2, 0x15, 0x2f, 0x81, 0xc4, 0x7e, 0xc2, 0x40, 0xa4, 0xfc, 0x20, 0x20, 0xc6, 0xc2, 0xc0, 0x6d, + 0x89, 0xc1, 0xfb, 0x24, 0xce, 0x42, 0x20, 0x43, 0x16, 0x7c, 0x13, 0x63, 0x90, 0x32, 0x90, 0x90, + 0xaa, 0x69, 0x1b, 0xe6, 0xb2, 0x49, 0xf9, 0xab, 0x8e, 0x5e, 0x7e, 0xf1, 0x9b, 0xc4, 0x6a, 0xa3, + 0x3e, 0x93, 0x59, 0x01, 0x21, 0x2f, 0x70, 0x25, 0xe4, 0x74, 0xb8, 0xf6, 0xf1, 0xbe, 0xe5, 0x76, + 0x5a, 0x0c, 0x85, 0x9a, 0x89, 0xe5, 0x71, 0x21, 0x54, 0xdf, 0xca, 0x25, 0x73, 0x41, 0x1c, 0x88, + 0x5d, 0x33, 0x0d, 0x20, 0x52, 0xbd, 0x84, 0x97, 0x6b, 0x81, 0xc7, 0x79, 0x88, 0xe9, 0xc0, 0x43, + 0x2a, 0x4b, 0x2e, 0x41, 0x3f, 0xff, 0xa2, 0x4a, 0x59, 0xd8, 0x3b, 0xe8, 0x22, 0xe6, 0xb6, 0xcc, + 0xe5, 0x65, 0xf4, 0x27, 0x0b, 0xd0, 0xe4, 0x02, 0xf4, 0x95, 0xe7, 0xaa, 0xd5, 0xd2, 0x9c, 0x7f, + 0x53, 0x8c, 0xef, 0x4b, 0x0c, 0xcb, 0xad, 0xb9, 0xba, 0xe5, 0x6a, 0x3e, 0x92, 0x3c, 0x02, 0x85, + 0xca, 0x02, 0x92, 0xf1, 0x57, 0x93, 0x83, 0x9b, 0x1b, 0xc5, 0x3e, 0xb3, 0xc5, 0xa9, 0x04, 0x0a, + 0xeb, 0xbd, 0x55, 0x29, 0x4b, 0xee, 0x12, 0xbc, 0xde, 0xbb, 0xa6, 0x81, 0xd7, 0xce, 0x5a, 0x80, + 0x26, 0x4f, 0xc3, 0x50, 0x95, 0x3a, 0xa6, 0xde, 0x98, 0x6b, 0xe3, 0x56, 0x51, 0x0a, 0xa5, 0xe8, + 0x22, 0xbc, 0x66, 0x21, 0x42, 0x8b, 0x90, 0x91, 0xb3, 0x90, 0x9f, 0x36, 0x2d, 0xff, 0x09, 0x03, + 0xfa, 0xb8, 0xaf, 0x9a, 0x96, 0xa7, 0x21, 0x54, 0xfd, 0xef, 0xd9, 0xf4, 0x84, 0x1a, 0x07, 0x30, + 0x1c, 0x77, 0x79, 0xd3, 0x1b, 0x53, 0x82, 0xfc, 0x1e, 0x94, 0x60, 0x19, 0x8e, 0x95, 0x8c, 0xa6, + 0x69, 0x95, 0xf0, 0xa7, 0x3b, 0x3b, 0x55, 0xc2, 0xe1, 0x2d, 0x3d, 0xa1, 0x8b, 0xa1, 0xc5, 0xf7, + 0xf0, 0xa0, 0xbc, 0x0c, 0x55, 0xd3, 0x39, 0xae, 0xd6, 0x5c, 0xd6, 0x6b, 0x75, 0x9e, 0x8b, 0x42, + 0x8b, 0x33, 0x55, 0xbf, 0x37, 0xbb, 0x45, 0x0e, 0x90, 0xfb, 0x51, 0xfa, 0xea, 0xe7, 0xb2, 0xdd, + 0xd3, 0xb0, 0xdc, 0x97, 0x42, 0xf9, 0x93, 0x6c, 0x4a, 0x52, 0x94, 0x3d, 0x49, 0xe2, 0x12, 0xf4, + 0x73, 0x36, 0x81, 0xab, 0x2d, 0xce, 0x38, 0x5c, 0x59, 0x71, 0xa6, 0xf3, 0xd1, 0x64, 0x0e, 0x4e, + 0x94, 0x96, 0x97, 0x69, 0xdd, 0x0b, 0xc3, 0x33, 0xcf, 0x85, 0x81, 0x52, 0x79, 0x38, 0x5a, 0x81, + 0x0f, 0xc3, 0x3b, 0x63, 0x40, 0x90, 0xd4, 0x72, 0x64, 0x11, 0x4e, 0xc5, 0xe1, 0x55, 0x6e, 0xa6, + 0xe7, 0xa5, 0x08, 0xb5, 0x09, 0x8e, 0xfc, 0x3f, 0xad, 0x43, 0xd9, 0xb4, 0x56, 0xe2, 0x74, 0xda, + 0xdb, 0xad, 0x95, 0x38, 0xb7, 0xa6, 0x96, 0x53, 0xbf, 0x94, 0x93, 0x73, 0xc7, 0xdc, 0xbf, 0x4e, + 0x51, 0xd7, 0x22, 0xae, 0xd0, 0xdb, 0x1d, 0x32, 0x4f, 0x8b, 0x28, 0x1f, 0x46, 0xdb, 0xf1, 0xbd, + 0x06, 0x83, 0x28, 0x03, 0x08, 0x94, 0xfd, 0xff, 0x02, 0x4a, 0x52, 0x81, 0x7c, 0xc9, 0x59, 0xe1, + 0x26, 0xe8, 0x56, 0x0f, 0x9f, 0x74, 0x67, 0xc5, 0x4d, 0x7f, 0xf8, 0xc4, 0x58, 0xa8, 0xdf, 0x93, + 0xed, 0x92, 0xee, 0xe5, 0xbe, 0x9c, 0x44, 0x7e, 0x28, 0xdb, 0x29, 0x71, 0xcb, 0x61, 0x75, 0xef, + 0x7a, 0x9b, 0x85, 0x73, 0xb8, 0x7d, 0xdf, 0xf6, 0x4f, 0x38, 0x8f, 0xcd, 0xf2, 0xf0, 0xd8, 0x37, + 0x4c, 0xcb, 0x20, 0x0f, 0xc0, 0xc9, 0x9b, 0xd5, 0x49, 0xad, 0x76, 0xa3, 0x32, 0x57, 0xae, 0xdd, + 0x9c, 0xab, 0x2e, 0x4c, 0x4e, 0x54, 0xa6, 0x2a, 0x93, 0xe5, 0xd1, 0x1e, 0x72, 0x1c, 0x8e, 0x85, + 0xa8, 0xe9, 0x9b, 0xb3, 0xa5, 0xb9, 0xd1, 0x0c, 0x19, 0x83, 0xe1, 0x10, 0x38, 0x3e, 0xbf, 0x38, + 0x9a, 0x7d, 0xec, 0xdd, 0x30, 0x88, 0xfb, 0x7f, 0x6e, 0x0b, 0x91, 0x21, 0xe8, 0x9f, 0x1f, 0xaf, + 0x4e, 0x6a, 0xb7, 0x90, 0x09, 0x40, 0xa1, 0x3c, 0x39, 0xc7, 0x18, 0x66, 0x1e, 0xfb, 0x5f, 0x19, + 0x80, 0xea, 0xd4, 0xe2, 0x82, 0x20, 0x1c, 0x84, 0xbe, 0xca, 0xdc, 0xad, 0xd2, 0x4c, 0x85, 0xd1, + 0xf5, 0x43, 0x7e, 0x7e, 0x61, 0x92, 0xd5, 0x30, 0x00, 0xbd, 0x13, 0x33, 0xf3, 0xd5, 0xc9, 0xd1, + 0x2c, 0x03, 0x6a, 0x93, 0xa5, 0xf2, 0x68, 0x8e, 0x01, 0x6f, 0x6b, 0x95, 0xc5, 0xc9, 0xd1, 0x3c, + 0xfb, 0x73, 0xa6, 0xba, 0x58, 0x5a, 0x1c, 0xed, 0x65, 0x7f, 0x4e, 0xe1, 0x9f, 0x05, 0xc6, 0xac, + 0x3a, 0xb9, 0x88, 0x3f, 0xfa, 0x58, 0x13, 0xa6, 0xfc, 0x5f, 0xfd, 0x0c, 0xc5, 0x58, 0x97, 0x2b, + 0xda, 0xe8, 0x00, 0xfb, 0xc1, 0x58, 0xb2, 0x1f, 0xc0, 0x1a, 0xa7, 0x4d, 0xce, 0xce, 0xdf, 0x9a, + 0x1c, 0x1d, 0x64, 0xbc, 0x66, 0x6f, 0x30, 0xf0, 0x10, 0xfb, 0x53, 0x9b, 0x65, 0x7f, 0x0e, 0x33, + 0x4e, 0xda, 0x64, 0x69, 0x66, 0xa1, 0xb4, 0x38, 0x3d, 0x3a, 0xc2, 0xda, 0x83, 0x3c, 0x8f, 0xf1, + 0x92, 0x73, 0xa5, 0xd9, 0xc9, 0xd1, 0x51, 0x41, 0x53, 0x9e, 0xa9, 0xcc, 0xdd, 0x18, 0x1d, 0xc3, + 0x86, 0xbc, 0x3e, 0x8b, 0x3f, 0x08, 0x2b, 0x80, 0x7f, 0x1d, 0x7f, 0xec, 0xc3, 0x50, 0x98, 0xaf, + 0xa2, 0xc5, 0x7f, 0x1a, 0x8e, 0xcf, 0x57, 0x6b, 0x8b, 0xaf, 0x2f, 0x4c, 0xc6, 0xe4, 0x3d, 0x06, + 0xc3, 0x3e, 0x62, 0xa6, 0x32, 0x77, 0xf3, 0x03, 0x5c, 0xda, 0x3e, 0x68, 0xb6, 0x34, 0x31, 0x5f, + 0x1d, 0xcd, 0xb2, 0x5e, 0xf1, 0x41, 0xb7, 0x2b, 0x73, 0xe5, 0xf9, 0xdb, 0xd5, 0xd1, 0xdc, 0x63, + 0x77, 0xfd, 0x5c, 0xc6, 0xf3, 0x8e, 0xb9, 0x62, 0x5a, 0xe4, 0x1c, 0x3c, 0x50, 0x9e, 0xbc, 0x55, + 0x99, 0x98, 0xac, 0xcd, 0x6b, 0x95, 0xeb, 0x95, 0xb9, 0x58, 0x4d, 0x27, 0x61, 0x2c, 0x8a, 0x2e, + 0x2d, 0x54, 0x46, 0x33, 0xe4, 0x14, 0x90, 0x28, 0xf8, 0xd5, 0xd2, 0xec, 0xd4, 0x68, 0x96, 0x28, + 0x70, 0x22, 0x0a, 0xaf, 0xcc, 0x2d, 0xde, 0x9c, 0x9b, 0x1c, 0xcd, 0x3d, 0xf6, 0x13, 0x19, 0x38, + 0x99, 0x1a, 0x80, 0x82, 0xa8, 0x70, 0x7e, 0x72, 0xa6, 0x54, 0x5d, 0xac, 0x4c, 0x54, 0x27, 0x4b, + 0xda, 0xc4, 0x74, 0x6d, 0xa2, 0xb4, 0x38, 0x79, 0x7d, 0x5e, 0x7b, 0xbd, 0x76, 0x7d, 0x72, 0x6e, + 0x52, 0x2b, 0xcd, 0x8c, 0xf6, 0x90, 0x47, 0xa0, 0xd8, 0x81, 0xa6, 0x3a, 0x39, 0x71, 0x53, 0xab, + 0x2c, 0xbe, 0x3e, 0x9a, 0x21, 0x0f, 0xc3, 0xb9, 0x8e, 0x44, 0xec, 0xf7, 0x68, 0x96, 0x9c, 0x87, + 0x33, 0x9d, 0x48, 0x5e, 0x9b, 0x19, 0xcd, 0x3d, 0xf6, 0x03, 0x19, 0x20, 0xc9, 0x08, 0x02, 0xe4, + 0x21, 0x38, 0xcb, 0xf4, 0xa2, 0xd6, 0xb9, 0x81, 0x0f, 0xc3, 0xb9, 0x54, 0x0a, 0xa9, 0x79, 0x45, + 0x78, 0xb0, 0x03, 0x89, 0x68, 0xdc, 0x59, 0x50, 0xd2, 0x09, 0xb0, 0x69, 0xbf, 0x94, 0x81, 0x93, + 0xa9, 0xdb, 0x0f, 0x72, 0x11, 0xde, 0x55, 0x2a, 0xcf, 0xb2, 0xbe, 0x99, 0x58, 0xac, 0xcc, 0xcf, + 0x55, 0x6b, 0xb3, 0x53, 0xa5, 0x1a, 0xd3, 0xbe, 0x9b, 0xd5, 0x58, 0x6f, 0x5e, 0x00, 0xb5, 0x0b, + 0xe5, 0xc4, 0x74, 0x69, 0xee, 0x3a, 0x1b, 0x7e, 0xe4, 0x5d, 0xf0, 0x50, 0x47, 0xba, 0xc9, 0xb9, + 0xd2, 0xf8, 0xcc, 0x64, 0x79, 0x34, 0x4b, 0x1e, 0x85, 0x87, 0x3b, 0x52, 0x95, 0x2b, 0x55, 0x4e, + 0x96, 0x1b, 0x2f, 0xbf, 0xf5, 0x1f, 0xce, 0xf7, 0xbc, 0xf5, 0xb5, 0xf3, 0x99, 0xdf, 0xfe, 0xda, + 0xf9, 0xcc, 0x1f, 0x7d, 0xed, 0x7c, 0xe6, 0x83, 0x57, 0x77, 0x12, 0x19, 0x82, 0x4f, 0x5b, 0x4b, + 0x05, 0x34, 0x05, 0x9e, 0xfa, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd7, 0xff, 0x14, 0x9e, 0x19, + 0x5b, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -28630,6 +28757,52 @@ func (m *OneOf_IntegrationDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } +func (m *OneOf_SPIFFEFederationCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_SPIFFEFederationCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SPIFFEFederationCreate != nil { + { + size, err := m.SPIFFEFederationCreate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + i-- + dAtA[i] = 0xc2 + } + return len(dAtA) - i, nil +} +func (m *OneOf_SPIFFEFederationDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_SPIFFEFederationDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SPIFFEFederationDelete != nil { + { + size, err := m.SPIFFEFederationDelete.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + i-- + dAtA[i] = 0xca + } + return len(dAtA) - i, nil +} func (m *StreamStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -28654,12 +28827,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n612, err612 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err612 != nil { - return 0, err612 + n614, err614 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err614 != nil { + return 0, err614 } - i -= n612 - i = encodeVarintEvents(dAtA, i, uint64(n612)) + i -= n614 + i = encodeVarintEvents(dAtA, i, uint64(n614)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -28818,12 +28991,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n616, err616 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err616 != nil { - return 0, err616 + n618, err618 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err618 != nil { + return 0, err618 } - i -= n616 - i = encodeVarintEvents(dAtA, i, uint64(n616)) + i -= n618 + i = encodeVarintEvents(dAtA, i, uint64(n618)) i-- dAtA[i] = 0x1 i-- @@ -28971,12 +29144,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n620, err620 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err620 != nil { - return 0, err620 + n622, err622 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err622 != nil { + return 0, err622 } - i -= n620 - i = encodeVarintEvents(dAtA, i, uint64(n620)) + i -= n622 + i = encodeVarintEvents(dAtA, i, uint64(n622)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -34177,6 +34350,140 @@ func (m *AccessGraphSettingsUpdate) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } +func (m *SPIFFEFederationCreate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SPIFFEFederationCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SPIFFEFederationCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *SPIFFEFederationDelete) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SPIFFEFederationDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SPIFFEFederationDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { offset -= sovEvents(v) base := offset @@ -39903,6 +40210,30 @@ func (m *OneOf_IntegrationDelete) Size() (n int) { } return n } +func (m *OneOf_SPIFFEFederationCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SPIFFEFederationCreate != nil { + l = m.SPIFFEFederationCreate.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_SPIFFEFederationDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SPIFFEFederationDelete != nil { + l = m.SPIFFEFederationDelete.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *StreamStatus) Size() (n int) { if m == nil { return 0 @@ -41950,6 +42281,46 @@ func (m *AccessGraphSettingsUpdate) Size() (n int) { return n } +func (m *SPIFFEFederationCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SPIFFEFederationDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovEvents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -78525,6 +78896,76 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { } m.Event = &OneOf_IntegrationDelete{v} iNdEx = postIndex + case 168: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SPIFFEFederationCreate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SPIFFEFederationCreate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_SPIFFEFederationCreate{v} + iNdEx = postIndex + case 169: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SPIFFEFederationDelete", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SPIFFEFederationDelete{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_SPIFFEFederationDelete{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -95041,6 +95482,372 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { } return nil } +func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SPIFFEFederationCreate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SPIFFEFederationCreate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SPIFFEFederationDelete: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SPIFFEFederationDelete: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipEvents(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From 9651c066fe61271b8964e315b458f4a3f24dc286 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 1 Aug 2024 13:27:22 +0100 Subject: [PATCH 08/12] Add audievents to main oneof converter --- api/types/events/oneof.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index 76c0f408c3437..3f8971e15dba6 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -704,6 +704,14 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_IntegrationDelete{ IntegrationDelete: e, } + case *SPIFFEFederationCreate: + out.Event = &OneOf_SPIFFEFederationCreate{ + SPIFFEFederationCreate: e, + } + case *SPIFFEFederationDelete: + out.Event = &OneOf_SPIFFEFederationDelete{ + SPIFFEFederationDelete: e, + } default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", in.GetType()) From c700a29f812cc5a467c3154e9137418a46065eb2 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 1 Aug 2024 13:49:40 +0100 Subject: [PATCH 09/12] Add audit events for create and delete --- .../machineidv1/spiffe_federation_service.go | 69 +++++++++++++++---- lib/events/api.go | 4 ++ lib/events/codes.go | 4 ++ lib/services/spiffe_federation.go | 2 + 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/lib/auth/machineid/machineidv1/spiffe_federation_service.go b/lib/auth/machineid/machineidv1/spiffe_federation_service.go index fe0b1ada122f9..796da7b2b3c9a 100644 --- a/lib/auth/machineid/machineidv1/spiffe_federation_service.go +++ b/lib/auth/machineid/machineidv1/spiffe_federation_service.go @@ -29,14 +29,26 @@ import ( "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/authz" - "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/events" ) +type spiffeFederationReader interface { + ListSPIFFEFederations(ctx context.Context, limit int, token string) ([]*machineidv1.SPIFFEFederation, string, error) + GetSPIFFEFederation(ctx context.Context, name string) (*machineidv1.SPIFFEFederation, error) +} + +type spiffeFederationReadWriter interface { + spiffeFederationReader + CreateSPIFFEFederation(ctx context.Context, federation *machineidv1.SPIFFEFederation) (*machineidv1.SPIFFEFederation, error) + DeleteSPIFFEFederation(ctx context.Context, name string) error +} + // SPIFFEFederationServiceConfig holds configuration options for // NewSPIFFEFederationService type SPIFFEFederationServiceConfig struct { Authorizer authz.Authorizer - Backend services.SPIFFEFederation + Backend spiffeFederationReadWriter + Cache spiffeFederationReader Logger *slog.Logger Clock clockwork.Clock Emitter apievents.Emitter @@ -64,7 +76,7 @@ func NewSPIFFEFederationService( return &SPIFFEFederationService{ authorizer: cfg.Authorizer, - backend: cfg.Backend, + store: cfg.Backend, logger: cfg.Logger, clock: cfg.Clock, }, nil @@ -76,7 +88,8 @@ type SPIFFEFederationService struct { machineidv1.UnimplementedSPIFFEFederationServiceServer authorizer authz.Authorizer - backend services.SPIFFEFederation + store spiffeFederationReadWriter + cache spiffeFederationReader logger *slog.Logger clock clockwork.Clock emitter apievents.Emitter @@ -99,8 +112,7 @@ func (s *SPIFFEFederationService) GetSPIFFEFederation( return nil, trace.BadParameter("name: must be non-empty") } - // TODO(noah): Use cache... - federation, err := s.backend.GetSPIFFEFederation(ctx, req.Name) + federation, err := s.cache.GetSPIFFEFederation(ctx, req.Name) if err != nil { return nil, trace.Wrap(err) } @@ -122,8 +134,7 @@ func (s *SPIFFEFederationService) ListSPIFFEFederations( return nil, trace.Wrap(err) } - // TODO: Use cache... - federations, nextToken, err := s.backend.ListSPIFFEFederations( + federations, nextToken, err := s.cache.ListSPIFFEFederations( ctx, int(req.PageSize), req.PageToken, @@ -158,10 +169,27 @@ func (s *SPIFFEFederationService) DeleteSPIFFEFederation( return nil, trace.BadParameter("name: must be non-empty") } - if err := s.backend.DeleteSPIFFEFederation(ctx, req.Name); err != nil { + if err := s.store.DeleteSPIFFEFederation(ctx, req.Name); err != nil { return nil, trace.Wrap(err) } - // TODO: audit log + + if err := s.emitter.EmitAuditEvent(ctx, &apievents.SPIFFEFederationDelete{ + Metadata: apievents.Metadata{ + Code: events.SPIFFEFederationDeleteCode, + Type: events.SPIFFEFederationDeleteEvent, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ConnectionMetadata: authz.ConnectionMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: req.Name, + }, + }); err != nil { + s.logger.ErrorContext( + ctx, "Failed to emit audit event for deletion", + "error", err, + ) + } + return &emptypb.Empty{}, nil } @@ -181,10 +209,27 @@ func (s *SPIFFEFederationService) CreateSPIFFEFederation( return nil, trace.Wrap(err) } - created, err := s.backend.CreateSPIFFEFederation(ctx, req.SpiffeFederation) + created, err := s.store.CreateSPIFFEFederation(ctx, req.SpiffeFederation) if err != nil { return nil, trace.Wrap(err) } - // TODO: audit log + + if err := s.emitter.EmitAuditEvent(ctx, &apievents.SPIFFEFederationCreate{ + Metadata: apievents.Metadata{ + Code: events.SPIFFEFederationCreateCode, + Type: events.SPIFFEFederationCreateEvent, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ConnectionMetadata: authz.ConnectionMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: req.SpiffeFederation.Metadata.Name, + }, + }); err != nil { + s.logger.ErrorContext( + ctx, "Failed to emit audit event for creation", + "error", err, + ) + } + return created, nil } diff --git a/lib/events/api.go b/lib/events/api.go index 8ac05d415ddde..4a579a9348b87 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -757,6 +757,10 @@ const ( // SPIFFESVIDIssuedEvent is emitted when a SPIFFE SVID is issued. SPIFFESVIDIssuedEvent = "spiffe.svid.issued" + // SPIFFEFederationCreateEvent is emitted when a SPIFFE federation is created. + SPIFFEFederationCreateEvent = "spiffe.federation.create" + // SPIFFEFederationDeleteEvent is emitted when a SPIFFE federation is deleted. + SPIFFEFederationDeleteEvent = "spiffe.federation.delete" // AuthPreferenceUpdateEvent is emitted when a user updates the cluster authentication preferences. AuthPreferenceUpdateEvent = "auth_preference.update" diff --git a/lib/events/codes.go b/lib/events/codes.go index 50f0d56147a93..253769fc4ffc6 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -609,6 +609,10 @@ const ( SPIFFESVIDIssuedSuccessCode = "TSPIFFE000I" // SPIFFESVIDIssuedFailureCode is the SPIFFE SVID issued failure code. SPIFFESVIDIssuedFailureCode = "TSPIFFE000E" + // SPIFFEFederationCreateCode is the SPIFFE Federation created code. + SPIFFEFederationCreateCode = "TSPIFFE001I" + // SPIFFEFederationDeleteCode is the SPIFFE Federation deleted code. + SPIFFEFederationDeleteCode = "TSPIFFE002I" // AuthPreferenceUpdateCode is the auth preference updated event code. AuthPreferenceUpdateCode = "TCAUTH001I" diff --git a/lib/services/spiffe_federation.go b/lib/services/spiffe_federation.go index f09ce94fd8c84..613110aad4188 100644 --- a/lib/services/spiffe_federation.go +++ b/lib/services/spiffe_federation.go @@ -60,6 +60,8 @@ func UnmarshalSPIFFEFederation(data []byte, opts ...MarshalOption) (*machineidv1 // ValidateSPIFFEFederation validates the SPIFFEFederation object. func ValidateSPIFFEFederation(s *machineidv1.SPIFFEFederation) error { switch { + case s == nil: + return trace.BadParameter("object cannot be nil") case s.Metadata.Name == "": return trace.BadParameter("metadata.name: is required") case s.Spec == nil: From 83690dc57eb935ed7f3a9a29cac48c24dc2be885 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 1 Aug 2024 15:09:50 +0100 Subject: [PATCH 10/12] Start wiring SPIFFEFederations into cache --- api/types/constants.go | 3 ++- lib/cache/cache.go | 1 + lib/services/local/events.go | 30 ++++++++++++++++++++++++++++++ lib/services/presets.go | 1 + lib/services/role.go | 1 + 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/api/types/constants.go b/api/types/constants.go index da4e2ffa4e60e..8eb83f9b748e0 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -66,7 +66,8 @@ const ( // KindBot is a Machine ID bot resource KindBot = "bot" // KindBotInstance is an instance of a Machine ID bot - KindBotInstance = "bot_instance" + KindBotInstance = "bot_instance" + // KindSPIFFEFederation is a SPIFFE federation resource KindSPIFFEFederation = "spiffe_federation" // KindHostCert is a host certificate diff --git a/lib/cache/cache.go b/lib/cache/cache.go index a744ea0df5f25..34ee075dda237 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -182,6 +182,7 @@ func ForAuth(cfg Config) Config { {Kind: types.KindAccessMonitoringRule}, {Kind: types.KindDatabaseObject}, {Kind: types.KindAccessGraphSettings}, + {Kind: types.KindSPIFFEFederation}, } cfg.QueueSize = defaults.AuthQueueSize // We don't want to enable partial health for auth cache because auth uses an event stream diff --git a/lib/services/local/events.go b/lib/services/local/events.go index 0cc0d9938a10c..913e574c389a3 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -224,6 +224,8 @@ func (e *EventsService) NewWatcher(ctx context.Context, watch types.Watch) (type parser = newAccessGraphSecretAuthorizedKeyParser() case types.KindAccessGraphSettings: parser = newAccessGraphSettingsParser() + case types.KindSPIFFEFederation: + parser = newSPIFFEFederationParser() default: if watch.AllowPartialSuccess { continue @@ -2174,6 +2176,34 @@ func (p *botInstanceParser) parse(event backend.Event) (types.Resource, error) { } } +func newSPIFFEFederationParser() *spiffeFederationParser { + return &spiffeFederationParser{ + baseParser: newBaseParser(backend.Key(spiffeFederationPrefix)), + } +} + +type spiffeFederationParser struct { + baseParser +} + +func (p *spiffeFederationParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + return resourceHeader(event, types.KindSPIFFEFederation, types.V1, 0) + case types.OpPut: + spiffeFed, err := services.UnmarshalSPIFFEFederation( + event.Item.Value, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision)) + if err != nil { + return nil, trace.Wrap(err) + } + return types.Resource153ToLegacy(spiffeFed), nil + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} + func newInstanceParser() *instanceParser { return &instanceParser{ baseParser: newBaseParser(backend.Key(instancePrefix)), diff --git a/lib/services/presets.go b/lib/services/presets.go index b24c51af4d3dc..bbb2bb5abc696 100644 --- a/lib/services/presets.go +++ b/lib/services/presets.go @@ -178,6 +178,7 @@ func NewPresetEditorRole() types.Role { types.NewRule(types.KindVnetConfig, RW()), types.NewRule(types.KindBotInstance, RW()), types.NewRule(types.KindAccessGraphSettings, RW()), + types.NewRule(types.KindSPIFFEFederation, RW()), }, }, }, diff --git a/lib/services/role.go b/lib/services/role.go index 8c760d56e98e6..5ed07c9e61b85 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -76,6 +76,7 @@ var DefaultImplicitRules = []types.Rule{ types.NewRule(types.KindKubernetesCluster, RO()), types.NewRule(types.KindUsageEvent, []string{types.VerbCreate}), types.NewRule(types.KindVnetConfig, RO()), + types.NewRule(types.KindSPIFFEFederation, RO()), } // DefaultCertAuthorityRules provides access the minimal set of resources From 96a994e3102a12925b3b6ac210a12f3db50a6f0c Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 1 Aug 2024 17:07:49 +0100 Subject: [PATCH 11/12] Hack on cache --- lib/cache/cache.go | 10 +++ lib/cache/collections.go | 11 +++ lib/cache/resource_spiffe_federation.go | 115 ++++++++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 lib/cache/resource_spiffe_federation.go diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 34ee075dda237..17b4a4e0a8168 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -520,6 +520,7 @@ type Cache struct { kubeWaitingContsCache *local.KubeWaitingContainerService notificationsCache services.Notifications accessMontoringRuleCache services.AccessMonitoringRules + spiffeFederationCache spiffeFederationCacher // closed indicates that the cache has been closed closed atomic.Bool @@ -692,6 +693,8 @@ type Config struct { Notifications services.Notifications // AccessMonitoringRules is the access monitoring rules service. AccessMonitoringRules services.AccessMonitoringRules + // SPIFFEFederations is the SPIFFE federations service. + SPIFFEFederations spiffeFederationGetter // Backend is a backend for local cache Backend backend.Backend // MaxRetryPeriod is the maximum period between cache retries on failures @@ -927,6 +930,12 @@ func New(config Config) (*Cache, error) { return nil, trace.Wrap(err) } + spiffeFederationCache, err := local.NewSPIFFEFederationService(config.Backend) + if err != nil { + cancel() + return nil, trace.Wrap(err) + } + cs := &Cache{ ctx: ctx, cancel: cancel, @@ -967,6 +976,7 @@ func New(config Config) (*Cache, error) { eventsFanout: fanout, lowVolumeEventsFanout: utils.NewRoundRobin(lowVolumeFanouts), kubeWaitingContsCache: kubeWaitingContsCache, + spiffeFederationCache: spiffeFederationCache, Logger: log.WithFields(log.Fields{ teleport.ComponentKey: config.Component, }), diff --git a/lib/cache/collections.go b/lib/cache/collections.go index f4e8592c53d85..75cc7f8206050 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -33,6 +33,7 @@ import ( crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" + machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" "github.com/gravitational/teleport/api/types" @@ -250,6 +251,7 @@ type cacheCollections struct { accessGraphSettings collectionReader[accessGraphSettingsGetter] globalNotifications collectionReader[notificationGetter] accessMonitoringRules collectionReader[accessMonitoringRuleGetter] + spiffeFederations collectionReader[spiffeFederationGetter] } // setupCollections returns a registry of collections. @@ -742,6 +744,15 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e watch: watch, } collections.byKind[resourceKind] = collections.accessGraphSettings + case types.KindSPIFFEFederation: + if c.spiffeFederationCache == nil { + return nil, trace.BadParameter("missing parameter spiffeFederationCache") + } + collections.spiffeFederations = &genericCollection[*machineidv1.SPIFFEFederation, spiffeFederationGetter, spiffeFederationExecutor]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.spiffeFederations default: return nil, trace.BadParameter("resource %q is not supported", watch.Kind) } diff --git a/lib/cache/resource_spiffe_federation.go b/lib/cache/resource_spiffe_federation.go new file mode 100644 index 0000000000000..697af51c3796a --- /dev/null +++ b/lib/cache/resource_spiffe_federation.go @@ -0,0 +1,115 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package cache + +import ( + "context" + + "github.com/gravitational/trace" + + machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" + "github.com/gravitational/teleport/api/types" +) + +type spiffeFederationGetter interface { + ListSPIFFEFederations(ctx context.Context, pageSize int, nextToken string) ([]*machineidv1.SPIFFEFederation, string, error) + GetSPIFFEFederation(ctx context.Context, name string) (*machineidv1.SPIFFEFederation, error) +} + +type spiffeFederationCacher interface { + spiffeFederationGetter + UpsertSPIFFEFederation(ctx context.Context, federation *machineidv1.SPIFFEFederation) (*machineidv1.SPIFFEFederation, error) + DeleteSPIFFEFederation(ctx context.Context, name string) error + DeleteAllSPIFFEFederations(ctx context.Context) error +} + +type spiffeFederationExecutor struct{} + +var _ executor[*machineidv1.SPIFFEFederation, spiffeFederationGetter] = spiffeFederationExecutor{} + +func (spiffeFederationExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*machineidv1.SPIFFEFederation, error) { + var out []*machineidv1.SPIFFEFederation + var nextToken string + for { + var page []*machineidv1.SPIFFEFederation + var err error + + page, nextToken, err = cache.Config.SPIFFEFederations.ListSPIFFEFederations(ctx, 0 /* default page size */, nextToken) + if err != nil { + return nil, trace.Wrap(err) + } + out = append(out, page...) + if nextToken == "" { + break + } + } + return out, nil +} + +func (spiffeFederationExecutor) upsert(ctx context.Context, cache *Cache, resource *machineidv1.SPIFFEFederation) error { + _, err := cache.spiffeFederationCache.UpsertSPIFFEFederation(ctx, resource) + return trace.Wrap(err) +} + +func (spiffeFederationExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return trace.Wrap(cache.secReportsCache.DeleteAllSecurityReports(ctx)) +} + +func (spiffeFederationExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return trace.Wrap(cache.secReportsCache.DeleteSecurityReport(ctx, resource.GetName())) +} + +func (spiffeFederationExecutor) isSingleton() bool { return false } + +func (spiffeFederationExecutor) getReader(cache *Cache, cacheOK bool) spiffeFederationGetter { + if cacheOK { + return cache.spiffeFederationCache + } + return cache.Config.SPIFFEFederations +} + +// ListSPIFFEFederations returns a paginated list of SPIFFE federations +func (c *Cache) ListSPIFFEFederations(ctx context.Context, pageSize int, nextToken string) ([]*machineidv1.SPIFFEFederation, string, error) { + ctx, span := c.Tracer.Start(ctx, "cache/ListSPIFFEFederations") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.spiffeFederations) + + if err != nil { + return nil, "", trace.Wrap(err) + } + defer rg.Release() + out, nextKey, err := rg.reader.ListSPIFFEFederations(ctx, pageSize, nextToken) + return out, nextKey, trace.Wrap(err) +} + +// GetSPIFFEFederation returns a single SPIFFE federation by name +func (c *Cache) GetSPIFFEFederation(ctx context.Context, name string) (*machineidv1.SPIFFEFederation, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetSPIFFEFederation") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.spiffeFederations) + + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + out, err := rg.reader.GetSPIFFEFederation(ctx, name) + return out, trace.Wrap(err) +} From 93c10e903eb3a699d69bbe9d6a543aed4af19cb5 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Fri, 2 Aug 2024 10:35:35 +0100 Subject: [PATCH 12/12] Finish threading thru caching for SPIFFE Federations --- lib/auth/accesspoint/accesspoint.go | 1 + lib/auth/auth.go | 8 +++++++ lib/auth/authclient/api.go | 7 +++++++ lib/auth/grpcserver.go | 3 ++- lib/auth/init.go | 3 +++ lib/cache/cache.go | 2 +- lib/cache/collections.go | 8 +++---- lib/cache/resource_spiffe_federation.go | 18 ++++++++++------ lib/services/local/spiffe_federation.go | 28 +++++++++++++++++++++---- lib/services/spiffe_federation.go | 17 +++++++-------- 10 files changed, 69 insertions(+), 26 deletions(-) diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index 9ed7fb66097c4..bab6caf387e3d 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -154,6 +154,7 @@ func NewAccessCache(cfg AccessCacheConfig) (*cache.Cache, error) { WebSession: cfg.Services.WebSessions(), WebToken: cfg.Services.WebTokens(), KubeWaitingContainers: cfg.Services, + SPIFFEFederations: nil, // TODO(noah) Component: teleport.Component(component...), MetricComponent: teleport.Component(metricComponent...), Tracer: tracer, diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 8d395e3977246..ce117a30b30c2 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -342,6 +342,12 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { return nil, trace.Wrap(err) } } + if cfg.SPIFFEFederations == nil { + cfg.SPIFFEFederations, err = local.NewSPIFFEFederationService(cfg.Backend) + if err != nil { + return nil, trace.Wrap(err) + } + } limiter, err := limiter.NewConnectionsLimiter(limiter.Config{ MaxConnections: defaults.LimiterMaxConcurrentSignatures, @@ -428,6 +434,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { AccessMonitoringRules: cfg.AccessMonitoringRules, CrownJewels: cfg.CrownJewels, BotInstance: cfg.BotInstance, + SPIFFEFederations: cfg.SPIFFEFederations, } as := Server{ @@ -619,6 +626,7 @@ type Services struct { services.BotInstance services.AccessGraphSecretsGetter services.DevicesGetter + services.SPIFFEFederations } // SecReportsClient returns the security reports client. diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index 7f0f89ab4e81b..7b9edd0712ec3 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -32,6 +32,7 @@ import ( crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" + machineidv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" @@ -1176,6 +1177,12 @@ type Cache interface { // GetAccessGraphSettings returns the access graph settings. GetAccessGraphSettings(context.Context) (*clusterconfigpb.AccessGraphSettings, error) + + // GetSPIFFEFederation gets a SPIFFE Federation by name. + GetSPIFFEFederation(ctx context.Context, name string) (*machineidv1.SPIFFEFederation, error) + // ListSPIFFEFederations lists all SPIFFE Federations using Google style + // pagination. + ListSPIFFEFederations(ctx context.Context, pageSize int, lastToken string) ([]*machineidv1.SPIFFEFederation, string, error) } type NodeWrapper struct { diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 620bd3642a545..48b26e56271bc 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -5194,7 +5194,8 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { spiffeFederationService, err := machineidv1.NewSPIFFEFederationService(machineidv1.SPIFFEFederationServiceConfig{ Authorizer: cfg.Authorizer, - Backend: nil, // TODO + Backend: cfg.AuthServer.Services.SPIFFEFederations, + Cache: cfg.AuthServer.Cache, Clock: cfg.AuthServer.GetClock(), Emitter: cfg.Emitter, }) diff --git a/lib/auth/init.go b/lib/auth/init.go index 02e598816eb47..40ffecd563591 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -306,6 +306,9 @@ type InitConfig struct { // BotInstance is a service that manages Machine ID bot instances BotInstance services.BotInstance + + // SPIFFEFederations is a service that manages storing SPIFFE federations. + SPIFFEFederations services.SPIFFEFederations } // Init instantiates and configures an instance of AuthServer diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 17b4a4e0a8168..6c938f571d0d5 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -694,7 +694,7 @@ type Config struct { // AccessMonitoringRules is the access monitoring rules service. AccessMonitoringRules services.AccessMonitoringRules // SPIFFEFederations is the SPIFFE federations service. - SPIFFEFederations spiffeFederationGetter + SPIFFEFederations spiffeFederationReader // Backend is a backend for local cache Backend backend.Backend // MaxRetryPeriod is the maximum period between cache retries on failures diff --git a/lib/cache/collections.go b/lib/cache/collections.go index 75cc7f8206050..7ba7d5511297f 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -251,7 +251,7 @@ type cacheCollections struct { accessGraphSettings collectionReader[accessGraphSettingsGetter] globalNotifications collectionReader[notificationGetter] accessMonitoringRules collectionReader[accessMonitoringRuleGetter] - spiffeFederations collectionReader[spiffeFederationGetter] + spiffeFederations collectionReader[spiffeFederationReader] } // setupCollections returns a registry of collections. @@ -745,10 +745,10 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e } collections.byKind[resourceKind] = collections.accessGraphSettings case types.KindSPIFFEFederation: - if c.spiffeFederationCache == nil { - return nil, trace.BadParameter("missing parameter spiffeFederationCache") + if c.Config.SPIFFEFederations == nil { + return nil, trace.BadParameter("missing parameter SPIFFEFederations") } - collections.spiffeFederations = &genericCollection[*machineidv1.SPIFFEFederation, spiffeFederationGetter, spiffeFederationExecutor]{ + collections.spiffeFederations = &genericCollection[*machineidv1.SPIFFEFederation, spiffeFederationReader, spiffeFederationExecutor]{ cache: c, watch: watch, } diff --git a/lib/cache/resource_spiffe_federation.go b/lib/cache/resource_spiffe_federation.go index 697af51c3796a..33a52dcd3038c 100644 --- a/lib/cache/resource_spiffe_federation.go +++ b/lib/cache/resource_spiffe_federation.go @@ -27,13 +27,19 @@ import ( "github.com/gravitational/teleport/api/types" ) -type spiffeFederationGetter interface { +// spiffeFederationReader is an interface that defines the methods for getting +// SPIFFE federations. This is returned as the reader for the SPIFFEFederations +// collection but is also used by the executor to read the full list of +// SPIFFE Federations on initialization. +type spiffeFederationReader interface { ListSPIFFEFederations(ctx context.Context, pageSize int, nextToken string) ([]*machineidv1.SPIFFEFederation, string, error) GetSPIFFEFederation(ctx context.Context, name string) (*machineidv1.SPIFFEFederation, error) } +// spiffeFederationCacher is used for storing and retrieving SPIFFE federations +// from the cache's local backend. type spiffeFederationCacher interface { - spiffeFederationGetter + spiffeFederationReader UpsertSPIFFEFederation(ctx context.Context, federation *machineidv1.SPIFFEFederation) (*machineidv1.SPIFFEFederation, error) DeleteSPIFFEFederation(ctx context.Context, name string) error DeleteAllSPIFFEFederations(ctx context.Context) error @@ -41,7 +47,7 @@ type spiffeFederationCacher interface { type spiffeFederationExecutor struct{} -var _ executor[*machineidv1.SPIFFEFederation, spiffeFederationGetter] = spiffeFederationExecutor{} +var _ executor[*machineidv1.SPIFFEFederation, spiffeFederationReader] = spiffeFederationExecutor{} func (spiffeFederationExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*machineidv1.SPIFFEFederation, error) { var out []*machineidv1.SPIFFEFederation @@ -68,16 +74,16 @@ func (spiffeFederationExecutor) upsert(ctx context.Context, cache *Cache, resour } func (spiffeFederationExecutor) deleteAll(ctx context.Context, cache *Cache) error { - return trace.Wrap(cache.secReportsCache.DeleteAllSecurityReports(ctx)) + return trace.Wrap(cache.spiffeFederationCache.DeleteAllSPIFFEFederations(ctx)) } func (spiffeFederationExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { - return trace.Wrap(cache.secReportsCache.DeleteSecurityReport(ctx, resource.GetName())) + return trace.Wrap(cache.spiffeFederationCache.DeleteSPIFFEFederation(ctx, resource.GetName())) } func (spiffeFederationExecutor) isSingleton() bool { return false } -func (spiffeFederationExecutor) getReader(cache *Cache, cacheOK bool) spiffeFederationGetter { +func (spiffeFederationExecutor) getReader(cache *Cache, cacheOK bool) spiffeFederationReader { if cacheOK { return cache.spiffeFederationCache } diff --git a/lib/services/local/spiffe_federation.go b/lib/services/local/spiffe_federation.go index 877c56a138f91..e3b925d9dc3b0 100644 --- a/lib/services/local/spiffe_federation.go +++ b/lib/services/local/spiffe_federation.go @@ -33,7 +33,7 @@ const ( ) // SPIFFEFederationService exposes backend functionality for storing -// SPIFFEFederation +// SPIFFEFederations type SPIFFEFederationService struct { service *generic.ServiceWrapper[*machineidv1.SPIFFEFederation] } @@ -56,7 +56,7 @@ func NewSPIFFEFederationService( }, nil } -// CreateSPIFFEFederation inserts a new SPIFFEFederation into the backend. +// CreateSPIFFEFederation inserts a new SPIFFEFederations into the backend. func (b *SPIFFEFederationService) CreateSPIFFEFederation( ctx context.Context, federation *machineidv1.SPIFFEFederation, ) (*machineidv1.SPIFFEFederation, error) { @@ -67,7 +67,7 @@ func (b *SPIFFEFederationService) CreateSPIFFEFederation( return created, trace.Wrap(err) } -// GetSPIFFEFederation retrieves a specific SPIFFEFederation given a name +// GetSPIFFEFederation retrieves a specific SPIFFEFederations given a name func (b *SPIFFEFederationService) GetSPIFFEFederation( ctx context.Context, name string, ) (*machineidv1.SPIFFEFederation, error) { @@ -84,9 +84,29 @@ func (b *SPIFFEFederationService) ListSPIFFEFederations( return r, nextToken, trace.Wrap(err) } -// DeleteSPIFFEFederation deletes a specific SPIFFEFederation. +// DeleteSPIFFEFederation deletes a specific SPIFFEFederations. func (b *SPIFFEFederationService) DeleteSPIFFEFederation( ctx context.Context, name string, ) error { return trace.Wrap(b.service.DeleteResource(ctx, name)) } + +// DeleteAllSPIFFEFederations deletes all SPIFFE federations, this is typically +// only meant to be used by the cache. +func (b *SPIFFEFederationService) DeleteAllSPIFFEFederations( + ctx context.Context, +) error { + return trace.Wrap(b.service.DeleteAllResources(ctx)) +} + +// UpsertSPIFFEFederation upserts a SPIFFEFederations. Prefer using +// CreateSPIFFEFederation. This is only designed for usage by the cache. +func (b *SPIFFEFederationService) UpsertSPIFFEFederation( + ctx context.Context, federation *machineidv1.SPIFFEFederation, +) (*machineidv1.SPIFFEFederation, error) { + if err := services.ValidateSPIFFEFederation(federation); err != nil { + return nil, trace.Wrap(err) + } + upserted, err := b.service.UpsertResource(ctx, federation) + return upserted, trace.Wrap(err) +} diff --git a/lib/services/spiffe_federation.go b/lib/services/spiffe_federation.go index 613110aad4188..05a4e2554494f 100644 --- a/lib/services/spiffe_federation.go +++ b/lib/services/spiffe_federation.go @@ -29,35 +29,32 @@ import ( "github.com/gravitational/teleport/api/types" ) -// SPIFFEFederation is an interface for the SPIFFEFederation service. -type SPIFFEFederation interface { - // CreateSPIFFEFederation creates a new SPIFFE Federation. - CreateSPIFFEFederation(ctx context.Context, spiffeFederation *machineidv1.SPIFFEFederation) (*machineidv1.SPIFFEFederation, error) - +// SPIFFEFederations is an interface for the SPIFFEFederations service. +type SPIFFEFederations interface { // GetSPIFFEFederation gets a SPIFFE Federation by name. GetSPIFFEFederation(ctx context.Context, name string) (*machineidv1.SPIFFEFederation, error) - // ListSPIFFEFederations lists all SPIFFE Federations using Google style // pagination. ListSPIFFEFederations(ctx context.Context, pageSize int, lastToken string) ([]*machineidv1.SPIFFEFederation, string, error) - + // CreateSPIFFEFederation creates a new SPIFFE Federation. + CreateSPIFFEFederation(ctx context.Context, spiffeFederation *machineidv1.SPIFFEFederation) (*machineidv1.SPIFFEFederation, error) // DeleteSPIFFEFederation deletes a SPIFFE Federation by name. DeleteSPIFFEFederation(ctx context.Context, name string) error } -// MarshalSPIFFEFederation marshals the SPIFFEFederation object into a JSON byte array. +// MarshalSPIFFEFederation marshals the SPIFFEFederations object into a JSON byte array. func MarshalSPIFFEFederation(object *machineidv1.SPIFFEFederation, opts ...MarshalOption) ([]byte, error) { object.Version = types.V1 object.Kind = types.KindSPIFFEFederation return MarshalProtoResource(object, opts...) } -// UnmarshalSPIFFEFederation unmarshals the SPIFFEFederation object from a JSON byte array. +// UnmarshalSPIFFEFederation unmarshals the SPIFFEFederations object from a JSON byte array. func UnmarshalSPIFFEFederation(data []byte, opts ...MarshalOption) (*machineidv1.SPIFFEFederation, error) { return UnmarshalProtoResource[*machineidv1.SPIFFEFederation](data, opts...) } -// ValidateSPIFFEFederation validates the SPIFFEFederation object. +// ValidateSPIFFEFederation validates the SPIFFEFederations object. func ValidateSPIFFEFederation(s *machineidv1.SPIFFEFederation) error { switch { case s == nil: