From 6abeb33669306723bb5c7e28f138f4e98b67bc6e Mon Sep 17 00:00:00 2001 From: Saravanan Balasubramanian <33908564+sarabala1979@users.noreply.github.com> Date: Thu, 22 Oct 2020 06:09:30 -0700 Subject: [PATCH] feat(calendar): Support catchup on calendar eventsource closes #897 (#911) * feat(calendar): Support catchup on calendar eventsource * codegen * updated * Update event_persist.go * Update start.go * Update start.go * Added test * updated * Update event_persist_test.go * updated * updated * updated * addressed comments * Update start.go * updated * Reverted comment event * Update event_persist.go * Update event_persist.go * Fixed codegen and added maxCatchupDuration * Update calendar.yaml * Update start.go * Refactored Spec * updated * missed changes * Addressed Derek Comments * Update start.go * Update calendar.yaml * Update calendar.yaml * Update start.go --- api/event-source.html | 137 + api/event-source.md | 3836 ++++++++++++++++- api/openapi-spec/swagger.json | 43 + docs/eventsources/catup.md | 30 + eventsources/eventing.go | 2 +- eventsources/persist/event_persist.go | 133 + eventsources/persist/event_persist_test.go | 73 + eventsources/sources/calendar/start.go | 185 +- examples/event-sources/calendar.yaml | 11 + manifests/install.yaml | 8 +- manifests/namespace-install.yaml | 8 +- pkg/apis/eventsource/v1alpha1/generated.pb.go | 1360 ++++-- pkg/apis/eventsource/v1alpha1/generated.proto | 27 + .../eventsource/v1alpha1/openapi_generated.go | 89 + pkg/apis/eventsource/v1alpha1/types.go | 27 + .../v1alpha1/zz_generated.deepcopy.go | 63 + 16 files changed, 5652 insertions(+), 380 deletions(-) create mode 100644 docs/eventsources/catup.md create mode 100644 eventsources/persist/event_persist.go create mode 100644 eventsources/persist/event_persist_test.go diff --git a/api/event-source.html b/api/event-source.html index 2b0800e8a5..6954ee96ec 100644 --- a/api/event-source.html +++ b/api/event-source.html @@ -291,6 +291,99 @@

CalendarEventSource

Metadata holds the user defined metadata which will passed along the event payload.

+ + +persistence
+ + +EventPersistence + + + + +

Persistence hold the configuration for event persistence

+ + + + +

CatchupConfiguration +

+

+(Appears on: +EventPersistence) +

+

+

+ + + + + + + + + + + + + + + + + +
FieldDescription
+enabled
+ +bool + +
+

Enabled enables to triggered the missed schedule when eventsource restarts

+
+maxDuration
+ +string + +
+

MaxDuration holds max catchup duration

+
+

ConfigMapPersistence +

+

+(Appears on: +EventPersistence) +

+

+

+ + + + + + + + + + + + + + + +
FieldDescription
+name
+ +string + +
+

Name of the configmap

+
+createIfNotExist
+ +bool + +
+

CreateIfNotExist will create configmap if it doesn’t exists

+

EmitterEventSource @@ -423,6 +516,50 @@

EmitterEventSource +

EventPersistence +

+

+(Appears on: +CalendarEventSource) +

+

+

+ + + + + + + + + + + + + + + + + +
FieldDescription
+catchup
+ + +CatchupConfiguration + + +
+

Catchup enables to triggered the missed schedule when eventsource restarts

+
+configMap
+ + +ConfigMapPersistence + + +
+

ConfigMap holds configmap details for persistence

+

EventSource

diff --git a/api/event-source.md b/api/event-source.md index 537b511b22..789da454d3 100644 --- a/api/event-source.md +++ b/api/event-source.md @@ -1,3307 +1,6539 @@

+ Packages: +

+ +

+ argoproj.io/v1alpha1 +

+

+

+ Package v1alpha1 is the v1alpha1 version of the API. +

+

+ Resource Types: + +

+ AMQPEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ AMQPEventSource refers to an event-source for AMQP stream events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ url
string +
+

+ URL for rabbitmq service +

+
+ exchangeName
string +
+

+ ExchangeName is the exchange name For more information, visit https://www.rabbitmq.com/tutorials/amqp-concepts.html +

+
+ exchangeType
string +
+

+ ExchangeType is rabbitmq exchange type +

+
+ routingKey
string +
+

+ Routing key for bindings +

+
+ connectionBackoff
github.com/argoproj/argo-events/pkg/apis/common.Backoff +
+ (Optional) +

+ Backoff holds parameters applied to connection. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ tls
github.com/argoproj/argo-events/pkg/apis/common.TLSConfig +
+ (Optional) +

+ TLS configuration for the amqp client. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ AzureEventsHubEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ AzureEventsHubEventSource describes the event source for azure events hub More info at https://docs.microsoft.com/en-us/azure/event-hubs/ +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ fqdn
string +
+

+ FQDN of the EventHubs namespace you created More info at https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-get-connection-string +

+
+ sharedAccessKeyName
Kubernetes core/v1.SecretKeySelector +
+

+ SharedAccessKeyName is the name you chose for your application’s SAS keys +

+
+ sharedAccessKey
Kubernetes core/v1.SecretKeySelector +
+

+ SharedAccessKey is the generated value of the key +

+
+ hubName
string +
+

+ Event Hub path/name +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ CalendarEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ CalendarEventSource describes a time based dependency. One of the fields (schedule, interval, or recurrence) must be passed. Schedule takes precedence over interval; interval takes precedence over recurrence +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ schedule
string +
+

+ Schedule is a cron-like expression. For reference, see: https://en.wikipedia.org/wiki/Cron +

+
+ interval
string +
+

+ Interval is a string that describes an interval duration, e.g. 1s, 30m, 2h… +

+
+ exclusionDates
\[\]string +
+
+ timezone
string +
+ (Optional) +

+ Timezone in which to run the schedule +

+
+ userPayload
encoding/json.RawMessage +
+ (Optional) +

+ UserPayload will be sent to sensor as extra data once the event is triggered Deprecated. Please use Metadata instead. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+ +persistence
+ EventPersistence + + +
+ +

+ +Persistence hold the configuration for event persistence + +

+ +
+ +

+ +CatchupConfiguration + +

+ +

+ +(Appears on: +EventPersistence) + +

+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Field + + + +Description + +
+ +enabled
bool + +
+ +

+ +Enabled enables to triggered the missed schedule when eventsource +restarts + +

+ +
+ +maxDuration
string + +
+ +

+ +MaxDuration holds max catchup duration + +

+ +
+ +

+ +ConfigMapPersistence + +

+ +

+ +(Appears on: +EventPersistence) + +

+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Field + + + +Description + +
+ +name
string + +
+ +

+ +Name of the configmap + +

+ +
+ +createIfNotExist
bool + +
+ +

+ +CreateIfNotExist will create configmap if it doesn’t exists + +

+ +
+

+ EmitterEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ EmitterEventSource describes the event source for emitter More info at https://emitter.io/develop/getting-started/ +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ broker
string +
+

+ Broker URI to connect to. +

+
+ channelKey
string +
+

+ ChannelKey refers to the channel key +

+
+ channelName
string +
+

+ ChannelName refers to the channel name +

+
+ username
Kubernetes core/v1.SecretKeySelector +
+ (Optional) +

+ Username to use to connect to broker +

+
+ password
Kubernetes core/v1.SecretKeySelector +
+ (Optional) +

+ Password to use to connect to broker +

+
+ connectionBackoff
github.com/argoproj/argo-events/pkg/apis/common.Backoff +
+ (Optional) +

+ Backoff holds parameters applied to connection. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ tls
github.com/argoproj/argo-events/pkg/apis/common.TLSConfig +
+ (Optional) +

+ TLS configuration for the emitter client. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. + +

+ +
+ +

+ +EventPersistence + +

+ +

+ +(Appears on: +CalendarEventSource) + +

+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +Field + + + +Description + +
+ +catchup
+ +CatchupConfiguration + +
+ +

+ +Catchup enables to triggered the missed schedule when eventsource +restarts + +

+ +
+ +configMap
+ +ConfigMapPersistence + +
+ +

+ +ConfigMap holds configmap details for persistence +

+
+

+ EventSource +

+

+

+ EventSource is the definition of a eventsource resource +

+

+ + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ metadata
Kubernetes meta/v1.ObjectMeta +
+ Refer to the Kubernetes API documentation for the fields of the metadata field. +
+ spec
EventSourceSpec +
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ eventBusName
string +
+

+ EventBusName references to a EventBus name. By default the value is “default” +

+
+ template
Template +
+ (Optional) +

+ Template is the pod specification for the event source +

+
+ service
Service +
+ (Optional) +

+ Service is the specifications of the service to expose the event source +

+
+ replica
int32 +
+

+ Replica is the event source deployment replicas +

+
+ minio
map\[string\]github.com/argoproj/argo-events/pkg/apis/common.S3Artifact +
+

+ Minio event sources +

+
+ calendar
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CalendarEventSource +
+

+ Calendar event sources +

+
+ file
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.FileEventSource +
+

+ File event sources +

+
+ resource
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceEventSource +
+

+ Resource event sources +

+
+ webhook
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.WebhookContext +
+

+ Webhook event sources +

+
+ amqp
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AMQPEventSource +
+

+ AMQP event sources +

+
+ kafka
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.KafkaEventSource +
+

+ Kafka event sources +

+
+ mqtt
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.MQTTEventSource +
+

+ MQTT event sources +

+
+ nats
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NATSEventsSource +
+

+ NATS event sources +

+
+ sns
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SNSEventSource +
+

+ SNS event sources +

+
+ sqs
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SQSEventSource +
+

+ SQS event sources +

+
+ pubSub
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PubSubEventSource +
+

+ PubSub event sources +

+
+ github
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GithubEventSource +
+

+ Github event sources +

+
+ gitlab
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GitlabEventSource +
+

+ Gitlab event sources +

+
+ hdfs
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.HDFSEventSource +
+

+ HDFS event sources +

+
+ slack
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SlackEventSource +
+

+ Slack event sources +

+
+ storageGrid
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StorageGridEventSource +
+

+ StorageGrid event sources +

+
+ azureEventsHub
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureEventsHubEventSource +
+

+ AzureEventsHub event sources +

+
+ stripe
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StripeEventSource +
+

+ Stripe event sources +

+
+ emitter
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EmitterEventSource +
+

+ Emitter event source +

+
+ redis
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisEventSource +
+

+ Redis event source +

+
+ nsq
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NSQEventSource +
+

+ NSQ event source +

+
+ pulsar
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PulsarEventSource +
+

+ Pulsar event source +

+
+ generic
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GenericEventSource +
+

+ Generic event source +

+
+
+ status
EventSourceStatus +
+
+

+ EventSourceSpec +

+

+ (Appears on: EventSource) +

+

+

+ EventSourceSpec refers to specification of event-source resource +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ eventBusName
string +
+

+ EventBusName references to a EventBus name. By default the value is “default” +

+
+ template
Template +
+ (Optional) +

+ Template is the pod specification for the event source +

+
+ service
Service +
+ (Optional) +

+ Service is the specifications of the service to expose the event source +

+
+ replica
int32 +
+

+ Replica is the event source deployment replicas +

+
+ minio
map\[string\]github.com/argoproj/argo-events/pkg/apis/common.S3Artifact +
+

+ Minio event sources +

+
+ calendar
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CalendarEventSource +
+

+ Calendar event sources +

+
+ file
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.FileEventSource +
+

+ File event sources +

+
+ resource
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceEventSource +
+

+ Resource event sources +

+
+ webhook
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.WebhookContext +
+

+ Webhook event sources +

+
+ amqp
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AMQPEventSource +
+

+ AMQP event sources +

+
+ kafka
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.KafkaEventSource +
+

+ Kafka event sources +

+
+ mqtt
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.MQTTEventSource +
+

+ MQTT event sources +

+
+ nats
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NATSEventsSource +
+

+ NATS event sources +

+
+ sns
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SNSEventSource +
+

+ SNS event sources +

+
+ sqs
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SQSEventSource +
+

+ SQS event sources +

+
+ pubSub
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PubSubEventSource +
+

+ PubSub event sources +

+
+ github
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GithubEventSource +
+

+ Github event sources +

+
+ gitlab
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GitlabEventSource +
+

+ Gitlab event sources +

+
+ hdfs
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.HDFSEventSource +
+

+ HDFS event sources +

+
+ slack
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SlackEventSource +
+

+ Slack event sources +

+
+ storageGrid
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StorageGridEventSource +
+

+ StorageGrid event sources +

+
+ azureEventsHub
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureEventsHubEventSource +
+

+ AzureEventsHub event sources +

+
+ stripe
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StripeEventSource +
+

+ Stripe event sources +

+
+ emitter
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EmitterEventSource +
+

+ Emitter event source +

+
+ redis
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisEventSource +
+

+ Redis event source +

+
+ nsq
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NSQEventSource +
+

+ NSQ event source +

+
+ pulsar
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PulsarEventSource +
+

+ Pulsar event source +

+
+ generic
map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GenericEventSource +
+

+ Generic event source +

+
+

+ EventSourceStatus +

+

+ (Appears on: EventSource) +

+

+

+ EventSourceStatus holds the status of the event-source resource +

+

+ + + + + + + + + + + + + +
+ Field + + Description +
+ Status
github.com/argoproj/argo-events/pkg/apis/common.Status +
+

+ (Members of Status are embedded into this type.) +

+
+

+ FileEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ FileEventSource describes an event-source for file related events. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ eventType
string +
+

+ Type of file operations to watch Refer https://github.com/fsnotify/fsnotify/blob/master/fsnotify.go for more information +

+
+ watchPathConfig
WatchPathConfig +
+

+ WatchPathConfig contains configuration about the file path to watch +

+
+ polling
bool +
+

+ Use polling instead of inotify +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ GenericEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ GenericEventSource refers to a generic event source. It can be used to implement a custom event source. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ url
string +
+

+ URL of the gRPC server that implements the event source. +

+
+ config
string +
+

+ Config is the event source configuration +

+
+ insecure
bool +
+

+ Insecure determines the type of connection. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ GithubEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ GithubEventSource refers to event-source for github related events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ id
int64 +
+

+ Id is the webhook’s id +

+
+ webhook
WebhookContext +
+

+ Webhook refers to the configuration required to run a http server +

+
+ owner
string +
+

+ Owner refers to GitHub owner name i.e. argoproj +

+
+ repository
string +
+

+ Repository refers to GitHub repo name i.e. argo-events +

+
+ events
\[\]string +
+
+ apiToken
Kubernetes core/v1.SecretKeySelector +
+

+ APIToken refers to a K8s secret containing github api token +

+
+ webhookSecret
Kubernetes core/v1.SecretKeySelector +
+ (Optional) +

+ WebhookSecret refers to K8s secret containing GitHub webhook secret https://developer.github.com/webhooks/securing/ +

+
+ insecure
bool +
+

+ Insecure tls verification +

+
+ active
bool +
+ (Optional) +

+ Active refers to status of the webhook for event deliveries. https://developer.github.com/webhooks/creating/\#active +

+
+ contentType
string +
+

+ ContentType of the event delivery +

+
+ githubBaseURL
string +
+ (Optional) +

+ GitHub base URL (for GitHub Enterprise) +

+
+ githubUploadURL
string +
+ (Optional) +

+ GitHub upload URL (for GitHub Enterprise) +

+
+ deleteHookOnFinish
bool +
+ (Optional) +

+ DeleteHookOnFinish determines whether to delete the GitHub hook for the repository once the event source is stopped. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ GitlabEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ GitlabEventSource refers to event-source related to Gitlab events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ webhook
WebhookContext +
+

+ Webhook holds configuration to run a http server +

+
+ projectID
string +
+

+ ProjectID is the id of project for which integration needs to setup +

+
+ events
\[\]string +
+

+ Events are gitlab event to listen to. Refer https://github.com/xanzy/go-gitlab/blob/bf34eca5d13a9f4c3f501d8a97b8ac226d55e4d9/projects.go\#L794. +

+
+ accessToken
Kubernetes core/v1.SecretKeySelector +
+

+ AccessToken is reference to k8 secret which holds the gitlab api access information +

+
+ enableSSLVerification
bool +
+ (Optional) +

+ EnableSSLVerification to enable ssl verification +

+
+ gitlabBaseURL
string +
+

+ GitlabBaseURL is the base URL for API requests to a custom endpoint +

+
+ deleteHookOnFinish
bool +
+ (Optional) +

+ DeleteHookOnFinish determines whether to delete the GitLab hook for the project once the event source is stopped. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ HDFSEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ HDFSEventSource refers to event-source for HDFS related events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ WatchPathConfig
WatchPathConfig +
+

+ (Members of WatchPathConfig are embedded into this type.) +

+
+ type
string +
+

+ Type of file operations to watch +

+
+ checkInterval
string +
+

+ CheckInterval is a string that describes an interval duration to check the directory state, e.g. 1s, 30m, 2h… (defaults to 1m) +

+
+ addresses
\[\]string +
+
+ hdfsUser
string +
+

+ HDFSUser is the user to access HDFS file system. It is ignored if either ccache or keytab is used. +

+
+ krbCCacheSecret
Kubernetes core/v1.SecretKeySelector +
+

+ KrbCCacheSecret is the secret selector for Kerberos ccache Either ccache or keytab can be set to use Kerberos. +

+
+ krbKeytabSecret
Kubernetes core/v1.SecretKeySelector +
+

+ KrbKeytabSecret is the secret selector for Kerberos keytab Either ccache or keytab can be set to use Kerberos. +

+
+ krbUsername
string +
+

+ KrbUsername is the Kerberos username used with Kerberos keytab It must be set if keytab is used. +

+
+ krbRealm
string +
+

+ KrbRealm is the Kerberos realm used with Kerberos keytab It must be set if keytab is used. +

+
+ krbConfigConfigMap
Kubernetes core/v1.ConfigMapKeySelector +
+

+ KrbConfig is the configmap selector for Kerberos config as string It must be set if either ccache or keytab is used. +

+
+ krbServicePrincipalName
string +
+

+ KrbServicePrincipalName is the principal name of Kerberos service It must be set if either ccache or keytab is used. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ KafkaConsumerGroup +

+

+ (Appears on: KafkaEventSource) +

+

+

+ + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ groupName
string +
+

+ The name for the consumer group to use +

+
+ oldest
bool +
+ (Optional) +

+ When starting up a new group do we want to start from the oldest event (true) or the newest event (false), defaults to false +

+
+ rebalanceStrategy
string +
+ (Optional) +

+ Rebalance strategy can be one of: sticky, roundrobin, range. Range is the default. +

+
+

+ KafkaEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ KafkaEventSource refers to event-source for Kafka related events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ url
string +
+

+ URL to kafka cluster, multiple URLs separated by comma +

+
+ partition
string +
+

+ Partition name +

+
+ topic
string +
+

+ Topic name +

+
+ connectionBackoff
github.com/argoproj/argo-events/pkg/apis/common.Backoff +
+

+ Backoff holds parameters applied to connection. +

+
+ tls
github.com/argoproj/argo-events/pkg/apis/common.TLSConfig +
+ (Optional) +

+ TLS configuration for the kafka client. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+ consumerGroup
KafkaConsumerGroup +
+ (Optional) +

+ Consumer group for kafka client +

+
+ limitEventsPerSecond
int64 +
+ (Optional) +

+ Sets a limit on how many events get read from kafka per second. +

+
+ version
string +
+ (Optional) +

+ Specify what kafka version is being connected to enables certain features in sarama, defaults to 1.0.0 +

+
+

+ MQTTEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ MQTTEventSource refers to event-source for MQTT related events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ url
string +
+

+ URL to connect to broker +

+
+ topic
string +
+

+ Topic name +

+
+ clientId
string +
+

+ ClientID is the id of the client +

+
+ connectionBackoff
github.com/argoproj/argo-events/pkg/apis/common.Backoff +
+

+ ConnectionBackoff holds backoff applied to connection. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ tls
github.com/argoproj/argo-events/pkg/apis/common.TLSConfig +
+ (Optional) +

+ TLS configuration for the mqtt client. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ NATSEventsSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ NATSEventsSource refers to event-source for NATS related events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ url
string +
+

+ URL to connect to NATS cluster +

+
+ subject
string +
+

+ Subject holds the name of the subject onto which messages are published +

+
+ connectionBackoff
github.com/argoproj/argo-events/pkg/apis/common.Backoff +
+

+ ConnectionBackoff holds backoff applied to connection. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ tls
github.com/argoproj/argo-events/pkg/apis/common.TLSConfig +
+ (Optional) +

+ TLS configuration for the nats client. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ NSQEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ NSQEventSource describes the event source for NSQ PubSub More info at https://godoc.org/github.com/nsqio/go-nsq +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ hostAddress
string +
+

+ HostAddress is the address of the host for NSQ lookup +

+
+ topic
string +
+

+ Topic to subscribe to. +

+
+ channel
string +
+

+ Channel used for subscription +

+
+ connectionBackoff
github.com/argoproj/argo-events/pkg/apis/common.Backoff +
+ (Optional) +

+ Backoff holds parameters applied to connection. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ tls
github.com/argoproj/argo-events/pkg/apis/common.TLSConfig +
+ (Optional) +

+ TLS configuration for the nsq client. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ PubSubEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ PubSubEventSource refers to event-source for GCP PubSub related events. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ projectID
string +
+ (Optional) +

+ ProjectID is GCP project ID for the subscription. Required if you run Argo Events outside of GKE/GCE. (otherwise, the default value is its project) +

+
+ topicProjectID
string +
+ (Optional) +

+ TopicProjectID is GCP project ID for the topic. By default, it is same as ProjectID. +

+
+ topic
string +
+ (Optional) +

+ Topic to which the subscription should belongs. Required if you want the eventsource to create a new subscription. If you specify this field along with an existing subscription, it will be verified whether it actually belongs to the specified topic. +

+
+ subscriptionID
string +
+ (Optional) +

+ SubscriptionID is ID of subscription. Required if you use existing subscription. The default value will be auto generated hash based on this eventsource setting, so the subscription might be recreated every time you update the setting, which has a possibility of event loss. +

+
+ credentialSecret
Kubernetes core/v1.SecretKeySelector +
+ (Optional) +

+ CredentialSecret references to the secret that contains JSON credentials to access GCP. If it is missing, it implicitly uses Workload Identity to access. https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity +

+
+ deleteSubscriptionOnFinish
bool +
+ (Optional) +

+ DeleteSubscriptionOnFinish determines whether to delete the GCP PubSub subscription once the event source is stopped. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ credentialsFile
string +
+

+ CredentialsFile is the file that contains credentials to authenticate for GCP Deprecated, use CredentialSecret instead +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ PulsarEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ PulsarEventSource describes the event source for Apache Pulsar +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ topics
\[\]string +
+

+ Name of the topics to subscribe to. +

+
+ type
string +
+ (Optional) +

+ Type of the subscription. Only “exclusive” and “shared” is supported. Defaults to exclusive. +

+
+ url
string +
+

+ Configure the service URL for the Pulsar service. +

+
+ tlsTrustCertsSecret
Kubernetes core/v1.SecretKeySelector +
+ (Optional) +

+ Trusted TLS certificate secret. +

+
+ tlsAllowInsecureConnection
bool +
+ (Optional) +

+ Whether the Pulsar client accept untrusted TLS certificate from broker. +

+
+ tlsValidateHostname
bool +
+ (Optional) +

+ Whether the Pulsar client verify the validity of the host name from broker. +

+
+ tls
github.com/argoproj/argo-events/pkg/apis/common.TLSConfig +
+ (Optional) +

+ TLS configuration for the pulsar client. +

+
+ connectionBackoff
github.com/argoproj/argo-events/pkg/apis/common.Backoff +
+ (Optional) +

+ Backoff holds parameters applied to connection. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ RedisEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ RedisEventSource describes an event source for the Redis PubSub. More info at https://godoc.org/github.com/go-redis/redis\#example-PubSub +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ hostAddress
string +
+

+ HostAddress refers to the address of the Redis host/server +

+
+ password
Kubernetes core/v1.SecretKeySelector +
+ (Optional) +

+ Password required for authentication if any. +

+
+ namespace
string +
+ (Optional) +

+ Namespace to use to retrieve the password from. It should only be specified if password is declared +

+
+ db
int32 +
+ (Optional) +

+ DB to use. If not specified, default DB 0 will be used. +

+
+ channels
\[\]string +
+
+ tls
github.com/argoproj/argo-events/pkg/apis/common.TLSConfig +
+ (Optional) +

+ TLS configuration for the redis client. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ ResourceEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ ResourceEventSource refers to a event-source for K8s resource related events. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ namespace
string +
+

+ Namespace where resource is deployed +

+
+ filter
ResourceFilter +
+ (Optional) +

+ Filter is applied on the metadata of the resource If you apply filter, then the internal event informer will only monitor objects that pass the filter. +

+
+ GroupVersionResource
Kubernetes meta/v1.GroupVersionResource +
+

+ (Members of GroupVersionResource are embedded into this type.) +

+

+ Group of the resource +

+
+ eventTypes
\[\]ResourceEventType +
+

+ EventTypes is the list of event type to watch. Possible values are - ADD, UPDATE and DELETE. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ ResourceEventType (string alias) +

+

+

+ (Appears on: ResourceEventSource) +

+

+

+ ResourceEventType is the type of event for the K8s resource mutation +

+

+

+ ResourceFilter +

+

+ (Appears on: ResourceEventSource) +

+

+

+ ResourceFilter contains K8 ObjectMeta information to further filter resource event objects +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ prefix
string +
+ (Optional) +

+ Prefix filter is applied on the resource name. +

+
+ labels
\[\]Selector +
+ (Optional) +

+ Labels provide listing options to K8s API to watch resource/s. Refer https://kubernetes.io/docs/concepts/overview/working-with-objects/label-selectors/ for more info. +

+
+ fields
\[\]Selector +
+ (Optional) +

+ Fields provide field filters similar to K8s field selector (see https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/). Unlike K8s field selector, it supports arbitrary fileds like “spec.serviceAccountName”, and the value could be a string or a regex. -Same as K8s field selector, operator “=”, “==” and “!=” are supported. +Same as K8s field selector, operator “=”, “==” and “\!=” are supported. +

+
+ createdBy
Kubernetes meta/v1.Time +
+ (Optional) +

+ If resource is created before the specified time then the event is treated as valid. +

+
+ afterStart
bool +
+ (Optional) +

+ If the resource is created after the start time then the event is treated as valid. +

+
+

+ SNSEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ SNSEventSource refers to event-source for AWS SNS related events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ webhook
WebhookContext +
+

+ Webhook configuration for http server +

+
+ topicArn
string +
+

+ TopicArn +

+
+ accessKey
Kubernetes core/v1.SecretKeySelector +
+

+ AccessKey refers K8 secret containing aws access key +

+
+ secretKey
Kubernetes core/v1.SecretKeySelector +
+

+ SecretKey refers K8 secret containing aws secret key +

+
+ region
string +
+

+ Region is AWS region +

+
+ roleARN
string +
+ (Optional) +

+ RoleARN is the Amazon Resource Name (ARN) of the role to assume. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ SQSEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ SQSEventSource refers to event-source for AWS SQS related events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ accessKey
Kubernetes core/v1.SecretKeySelector +
+

+ AccessKey refers K8 secret containing aws access key +

+
+ secretKey
Kubernetes core/v1.SecretKeySelector +
+

+ SecretKey refers K8 secret containing aws secret key +

+
+ region
string +
+

+ Region is AWS region +

+
+ queue
string +
+

+ Queue is AWS SQS queue to listen to for messages +

+
+ waitTimeSeconds
int64 +
+

+ WaitTimeSeconds is The duration (in seconds) for which the call waits for a message to arrive in the queue before returning. +

+
+ roleARN
string +
+ (Optional) +

+ RoleARN is the Amazon Resource Name (ARN) of the role to assume. +

+
+ jsonBody
bool +
+ (Optional) +

+ JSONBody specifies that all event body payload coming from this source will be JSON +

+
+ queueAccountId
string +
+ (Optional) +

+ QueueAccountID is the ID of the account that created the queue to monitor +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ Selector +

+

+ (Appears on: ResourceFilter) +

+

+

+ Selector represents conditional operation to select K8s objects. +

+

+ + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ key
string +
+

+ Key name +

+
+ operation
string +
+ (Optional) +

-Supported operations like ==, !=, <=, >= etc. Defaults to ==. -Refer + +Supported operations like ==, \!=, \<=, \>= etc. Defaults to ==. Refer https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/\#label-selectors for more info. +

+
+ value
string +
+

+ Value +

+
+

+ Service +

+

+ (Appears on: EventSourceSpec) +

+

+

+ Service holds the service information eventsource exposes +

+

+ + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ ports
\[\]Kubernetes core/v1.ServicePort +
+

+ The list of ports that are exposed by this ClusterIP service. +

+
+ clusterIP
string +
+ (Optional) +

+ clusterIP is the IP address of the service and is usually assigned randomly by the master. If an address is specified manually and is not in use by others, it will be allocated to the service; otherwise, @@ -3310,530 +6542,1002 @@ updates. Valid values are “None”, empty string (“”), or a valid IP address. “None” can be specified for headless services when proxying is not required. More info: https://kubernetes.io/docs/concepts/services-networking/service/\#virtual-ips-and-service-proxies +

+
+

+ SlackEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ SlackEventSource refers to event-source for Slack related events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ signingSecret
Kubernetes core/v1.SecretKeySelector +
+

+ Slack App signing secret +

+
+ token
Kubernetes core/v1.SecretKeySelector +
+

+ Token for URL verification handshake +

+
+ webhook
WebhookContext +
+

+ Webhook holds configuration for a REST endpoint +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ StorageGridEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ StorageGridEventSource refers to event-source for StorageGrid related events +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ webhook
WebhookContext +
+

+ Webhook holds configuration for a REST endpoint +

+
+ events
\[\]string +
+
+ filter
StorageGridFilter +
+

+ Filter on object key which caused the notification. +

+
+ topicArn
string +
+

+ TopicArn +

+
+ bucket
string +
+

+ Name of the bucket to register notifications for. +

+
+ region
string +
+ (Optional) +

+ S3 region. Defaults to us-east-1 +

+
+ authToken
Kubernetes core/v1.SecretKeySelector +
+

+ Auth token for storagegrid api +

+
+ apiURL
string +
+

+ APIURL is the url of the storagegrid api. +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ StorageGridFilter +

+

+ (Appears on: StorageGridEventSource) +

+

+

+ StorageGridFilter represents filters to apply to bucket notifications for specifying constraints on objects +

+

+ + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ prefix
string +
+
+ suffix
string +
+
+

+ StripeEventSource +

+

+ (Appears on: EventSourceSpec) +

+

+

+ StripeEventSource describes the event source for stripe webhook notifications More info at https://stripe.com/docs/webhooks +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ webhook
WebhookContext +
+

+ Webhook holds configuration for a REST endpoint +

+
+ createWebhook
bool +
+ (Optional) +

+ CreateWebhook if specified creates a new webhook programmatically. +

+
+ apiKey
Kubernetes core/v1.SecretKeySelector +
+ (Optional) +

+ APIKey refers to K8s secret that holds Stripe API key. Used only if CreateWebhook is enabled. +

+
+ eventFilter
\[\]string +
+ (Optional) +

+ EventFilter describes the type of events to listen to. If not specified, all types of events will be processed. More info at https://stripe.com/docs/api/events/list +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+

+ Template +

+

+ (Appears on: EventSourceSpec) +

+

+

+ Template holds the information of an EventSource deployment template +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ metadata
github.com/argoproj/argo-events/pkg/apis/common.Metadata +
+

+ Metadata sets the pods’s metadata, i.e. annotations and labels +

+
+ serviceAccountName
string +
+ (Optional) +

+ ServiceAccountName is the name of the ServiceAccount to use to run event source pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ +

+
+ container
Kubernetes core/v1.Container +
+ (Optional) +

+ Container is the main container image to run in the event source pod +

+
+ volumes
\[\]Kubernetes core/v1.Volume +
+ (Optional) +

+ Volumes is a list of volumes that can be mounted by containers in an eventsource. +

+
+ securityContext
Kubernetes core/v1.PodSecurityContext +
+ (Optional) +

+ SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field. +

+
+ affinity
Kubernetes core/v1.Affinity +
+ (Optional) +

+ If specified, the pod’s scheduling constraints +

+
+ tolerations
\[\]Kubernetes core/v1.Toleration +
+ (Optional) +

+ If specified, the pod’s tolerations. +

+
+ nodeSelector
map\[string\]string +
+ (Optional) +

+ NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node’s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ +

+
+

+ WatchPathConfig +

+

+ (Appears on: FileEventSource, HDFSEventSource) +

+

+

+ + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ directory
string +
+

+ Directory to watch for events +

+
+ path
string +
+

+ Path is relative path of object to watch with respect to the directory +

+
+ pathRegexp
string +
+

+ PathRegexp is regexp of relative path of object to watch with respect to the directory +

+
+

+ WebhookContext +

+

+ (Appears on: EventSourceSpec, GithubEventSource, @@ -3842,139 +7546,265 @@ WebhookContext SlackEventSource, StorageGridEventSource, StripeEventSource) +

+

+

+ WebhookContext holds a general purpose REST API context +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Description +
+ endpoint
string +
+

+ REST API endpoint +

+
+ method
string +
+

+ Method is HTTP request method that indicates the desired action to be performed for a given resource. See RFC7231 Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content +

+
+ port
string +
+

+ Port on which HTTP server is listening for incoming events. +

+
+ url
string +
+

+ URL is the url of the server. +

+
+ serverCertSecret
Kubernetes core/v1.SecretKeySelector +
+

+ ServerCertPath refers the file that contains the cert. +

+
+ serverKeySecret
Kubernetes core/v1.SecretKeySelector +
+

+ ServerKeyPath refers the file that contains private key +

+
+ metadata
map\[string\]string +
+ (Optional) +

+ Metadata holds the user defined metadata which will passed along the event payload. +

+
+ authSecret
Kubernetes core/v1.SecretKeySelector +
+ (Optional) +

+ AuthSecret holds a secret selector that contains a bearer token for authentication +

+
+ serverCertPath
string +
+

+ DeprecatedServerCertPath refers the file that contains the cert. +

+
+ serverKeyPath
string +
+

+ DeprecatedServerKeyPath refers the file that contains private key +

+
+
+

+ Generated with gen-crd-api-reference-docs. +

diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index bd5d26d498..01aee0ca0d 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -531,6 +531,10 @@ "type": "string" } }, + "persistence": { + "description": "Persistence hold the configuration for event persistence", + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.EventPersistence" + }, "schedule": { "description": "Schedule is a cron-like expression. For reference, see: https://en.wikipedia.org/wiki/Cron", "type": "string" @@ -546,6 +550,32 @@ } } }, + "io.argoproj.eventsource.v1alpha1.CatchupConfiguration": { + "type": "object", + "properties": { + "enabled": { + "description": "Enabled enables to triggered the missed schedule when eventsource restarts", + "type": "boolean" + }, + "maxDuration": { + "description": "MaxDuration holds max catchup duration", + "type": "string" + } + } + }, + "io.argoproj.eventsource.v1alpha1.ConfigMapPersistence": { + "type": "object", + "properties": { + "createIfNotExist": { + "description": "CreateIfNotExist will create configmap if it doesn't exists", + "type": "boolean" + }, + "name": { + "description": "Name of the configmap", + "type": "string" + } + } + }, "io.argoproj.eventsource.v1alpha1.EmitterEventSource": { "description": "EmitterEventSource describes the event source for emitter More info at https://emitter.io/develop/getting-started/", "type": "object", @@ -596,6 +626,19 @@ } } }, + "io.argoproj.eventsource.v1alpha1.EventPersistence": { + "type": "object", + "properties": { + "catchup": { + "description": "Catchup enables to triggered the missed schedule when eventsource restarts", + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.CatchupConfiguration" + }, + "configMap": { + "description": "ConfigMap holds configmap details for persistence", + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.ConfigMapPersistence" + } + } + }, "io.argoproj.eventsource.v1alpha1.EventSource": { "description": "EventSource is the definition of a eventsource resource", "type": "object", diff --git a/docs/eventsources/catup.md b/docs/eventsources/catup.md new file mode 100644 index 0000000000..7daea97cc2 --- /dev/null +++ b/docs/eventsources/catup.md @@ -0,0 +1,30 @@ +# Calender EventSource - Catchup +Catchup feature allow Calender eventsources to execute the missed schedules from last run. +## Enable Catchup forEventSource Definition +User can configure catchup on each events in eventsource. + +```yaml + example-with-catchup: + # Catchup the missed events from last Event timestamp. last event will be persisted in configmap. + schedule: "* * * * *" + persistence: + catchup: + enabled: true # Check missed schedules from last persisted event time on Every start + maxDuration: 5m # maximum amount of duration go back for the catchup + configMap: # Configmap for persist the last successful event timestamp + createIfNotExist: true + name: test-configmap +``` +Last calender event persisted in configured configmap. Multiple event can use the same configmap to persist the events. +```yaml +data: + calendar.example-with-catchup: '{"eventTime":"2020-10-19 22:50:00.0003192 +0000 UTC m=+683.567066901"}' +``` + +## Disable the catchup +Set `false` to catchup-->enabled element + +```yaml +catchup: + enabled: false +``` \ No newline at end of file diff --git a/eventsources/eventing.go b/eventsources/eventing.go index 4f26b0adfb..b74e6f21b5 100644 --- a/eventsources/eventing.go +++ b/eventsources/eventing.go @@ -81,7 +81,7 @@ func GetEventingServers(eventSource *v1alpha1.EventSource) map[apicommon.EventSo if len(eventSource.Spec.Calendar) != 0 { servers := []EventingServer{} for k, v := range eventSource.Spec.Calendar { - servers = append(servers, &calendar.EventListener{EventSourceName: eventSource.Name, EventName: k, CalendarEventSource: v}) + servers = append(servers, &calendar.EventListener{EventSourceName: eventSource.Name, EventName: k, CalendarEventSource: v, Namespace: eventSource.Namespace}) } result[apicommon.CalendarEvent] = servers } diff --git a/eventsources/persist/event_persist.go b/eventsources/persist/event_persist.go new file mode 100644 index 0000000000..d7d4afa212 --- /dev/null +++ b/eventsources/persist/event_persist.go @@ -0,0 +1,133 @@ +package persist + +import ( + "fmt" + + "github.com/pkg/errors" + v1 "k8s.io/api/core/v1" + apierr "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + + "github.com/argoproj/argo-events/common" + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" +) + +type EventPersist interface { + Save(event *Event) error + Get(key string) (*Event, error) + IsEnabled() bool +} + +type Event struct { + EventKey string + EventPayload string +} + +type ConfigMapPersist struct { + kubeClient kubernetes.Interface + name string + namespace string + createIfNotExist bool +} + +func createConfigmap(client kubernetes.Interface, name, namespace string) (*v1.ConfigMap, error) { + cm := v1.ConfigMap{} + cm.Name = name + cm.Namespace = namespace + return client.CoreV1().ConfigMaps(namespace).Create(&cm) +} + +func NewConfigMapPersist(client kubernetes.Interface, configmap *v1alpha1.ConfigMapPersistence, namespace string) (EventPersist, error) { + if configmap == nil { + return nil, fmt.Errorf("persistence configuration is nil") + } + _, err := client.CoreV1().ConfigMaps(namespace).Get(configmap.Name, metav1.GetOptions{}) + if err != nil { + if apierr.IsNotFound(err) && configmap.CreateIfNotExist { + _, err = createConfigmap(client, configmap.Name, namespace) + if err != nil { + if !apierr.IsAlreadyExists(err) { + return nil, err + } + } + } else { + return nil, err + } + } + cmp := ConfigMapPersist{ + kubeClient: client, + name: configmap.Name, + namespace: namespace, + createIfNotExist: configmap.CreateIfNotExist, + } + return &cmp, nil +} + +func (cmp *ConfigMapPersist) IsEnabled() bool { + return true +} + +func (cmp *ConfigMapPersist) Save(event *Event) error { + if event == nil { + return errors.Errorf("event object is nil") + } + //Using Connect util func for backoff retry if K8s API returns error + err := common.Connect(&common.DefaultRetry, func() error { + cm, err := cmp.kubeClient.CoreV1().ConfigMaps(cmp.namespace).Get(cmp.name, metav1.GetOptions{}) + if err != nil { + if apierr.IsNotFound(err) && cmp.createIfNotExist { + cm, err = createConfigmap(cmp.kubeClient, cmp.name, cmp.namespace) + if err != nil { + return err + } + } else { + return err + } + } + + if len(cm.Data) == 0 { + cm.Data = make(map[string]string) + } + + cm.Data[event.EventKey] = event.EventPayload + _, err = cmp.kubeClient.CoreV1().ConfigMaps(cmp.namespace).Update(cm) + + return err + }) + + if err != nil { + return err + } + return nil +} + +func (cmp *ConfigMapPersist) Get(key string) (*Event, error) { + cm, err := cmp.kubeClient.CoreV1().ConfigMaps(cmp.namespace).Get(cmp.name, metav1.GetOptions{}) + if err != nil { + if apierr.IsNotFound(err) { + return nil, nil + } + return nil, err + } + payload, exist := cm.Data[key] + if !exist { + return nil, nil + } + return &Event{EventKey: key, EventPayload: payload}, nil +} + +type NullPersistence struct { +} + +func (n *NullPersistence) Save(event *Event) error { + return nil +} + +func (n *NullPersistence) Get(key string) (*Event, error) { + return nil, nil +} + +func (cmp *NullPersistence) IsEnabled() bool { + return false +} diff --git a/eventsources/persist/event_persist_test.go b/eventsources/persist/event_persist_test.go new file mode 100644 index 0000000000..1ab11ac90b --- /dev/null +++ b/eventsources/persist/event_persist_test.go @@ -0,0 +1,73 @@ +package persist + +import ( + "testing" + + "github.com/stretchr/testify/assert" + apierr "k8s.io/apimachinery/pkg/api/errors" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/fake" + + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" +) + +func TestConfigMapPersist(t *testing.T) { + kubeClient := fake.NewSimpleClientset() + conf := &v1alpha1.ConfigMapPersistence{ + Name: "test-config", + CreateIfNotExist: true, + } + cp, err := NewConfigMapPersist(kubeClient, conf, "default") + assert.NoError(t, err) + assert.True(t, cp.IsEnabled()) + cm, err := kubeClient.CoreV1().ConfigMaps("default").Get("test-config", v1.GetOptions{}) + assert.NoError(t, err) + assert.NotNil(t, cm) + assert.Nil(t, cm.Data) + + t.Run("SaveAndGetEvent", func(t *testing.T) { + event := Event{ + EventKey: "test.test", + EventPayload: "{test}", + } + err = cp.Save(&event) + assert.NoError(t, err) + + event1, err := cp.Get("test.test") + assert.NoError(t, err) + assert.NotNil(t, event1) + assert.Equal(t, "test.test", event1.EventKey) + + event1, err = cp.Get("test.test1") + assert.NoError(t, err) + assert.Nil(t, event1) + }) + + t.Run("GetWithDeletedMap", func(t *testing.T) { + err = kubeClient.CoreV1().ConfigMaps("default").Delete("test-config", &v1.DeleteOptions{}) + assert.NoError(t, err) + event1, err := cp.Get("test.test") + assert.NoError(t, err) + assert.Nil(t, event1) + }) + + t.Run("SaveAndGetEventWithDeletedMap", func(t *testing.T) { + err = kubeClient.CoreV1().ConfigMaps("default").Delete("test-config", &v1.DeleteOptions{}) + assert.True(t, apierr.IsNotFound(err)) + event := Event{ + EventKey: "test.test", + EventPayload: "{test}", + } + err = cp.Save(&event) + assert.NoError(t, err) + + event1, err := cp.Get("test.test") + assert.NoError(t, err) + assert.NotNil(t, event1) + assert.Equal(t, "test.test", event1.EventKey) + + event1, err = cp.Get("test.test1") + assert.NoError(t, err) + assert.Nil(t, event1) + }) +} diff --git a/eventsources/sources/calendar/start.go b/eventsources/sources/calendar/start.go index 340d9f04d8..4facfb39c3 100644 --- a/eventsources/sources/calendar/start.go +++ b/eventsources/sources/calendar/start.go @@ -19,24 +19,31 @@ package calendar import ( "context" "encoding/json" + "fmt" + "os" + "strings" "time" - "github.com/pkg/errors" - cronlib "github.com/robfig/cron" - "go.uber.org/zap" - "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/common/logging" + "github.com/argoproj/argo-events/eventsources/persist" apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/events" "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" + "github.com/pkg/errors" + cronlib "github.com/robfig/cron" + "go.uber.org/zap" + "k8s.io/client-go/kubernetes" ) // EventListener implements Eventing for calendar based events type EventListener struct { EventSourceName string EventName string + Namespace string CalendarEventSource v1alpha1.CalendarEventSource + log *zap.Logger + eventPersistence persist.EventPersist } // GetEventSourceName returns name of event source @@ -54,25 +61,103 @@ func (el *EventListener) GetEventSourceType() apicommon.EventSourceType { return apicommon.CalendarEvent } +// initializePersistence initialize the persistence object. +// This func can move to eventing.go once we start supporting persistence for all sources. +func (el *EventListener) initializePersistence(ctx context.Context, persistence *v1alpha1.EventPersistence) error { + el.log.Info("Initializing Persistence") + if persistence.ConfigMap != nil { + kubeConfig, _ := os.LookupEnv(common.EnvVarKubeConfig) + + restConfig, err := common.GetClientConfig(kubeConfig) + if err != nil { + return errors.Wrapf(err, "failed to get a K8s rest config for the event source %s", el.GetEventName()) + } + kubeClientset, err := kubernetes.NewForConfig(restConfig) + if err != nil { + return errors.Wrapf(err, "failed to set up a K8s client for the event source %s", el.GetEventName()) + } + + el.eventPersistence, err = persist.NewConfigMapPersist(kubeClientset, persistence.ConfigMap, el.Namespace) + if err != nil { + return err + } + } + return nil +} + +func (el *EventListener) getPersistenceKey() string { + return fmt.Sprintf("%s.%s", el.EventSourceName, el.EventName) +} + +// getExecutionTime return starting schedule time for execution +func (el *EventListener) getExecutionTime() (time.Time, error) { + lastT := time.Now() + if el.eventPersistence.IsEnabled() && el.CalendarEventSource.Persistence.IsCatchUpEnabled() { + lastEvent, err := el.eventPersistence.Get(el.getPersistenceKey()) + if err != nil { + el.log.Error("failed to get last persisted event.", zap.Error(err)) + return lastT, errors.Wrap(err, "failed to get last persisted event.") + } + if lastEvent != nil && lastEvent.EventPayload != "" { + var eventData events.CalendarEventData + err := json.Unmarshal([]byte(lastEvent.EventPayload), &eventData) + if err != nil { + el.log.Info("failed to marshal last persisted event.", zap.Error(err)) + return lastT, errors.Wrap(err, "failed to marshal last persisted event.") + } + eventTime := strings.Split(eventData.EventTime, " m=") + lastT, err = time.Parse("2006-01-02 15:04:05.999999999 -0700 MST", eventTime[0]) + if err != nil { + el.log.Error("failed to parse the persisted last event timestamp", zap.Error(err)) + return lastT, errors.Wrap(err, "failed to parse the persisted last event timestamp.") + } + } + + if el.CalendarEventSource.Persistence.Catchup.MaxDuration != "" { + duration, err := time.ParseDuration(el.CalendarEventSource.Persistence.Catchup.MaxDuration) + if err != nil { + return lastT, err + } + + // Set maxCatchupDuration in execution time if last persisted event time is greater than maxCatchupDuration + if duration < time.Since(lastT) { + el.log.Info("set execution time", zap.Any("maxDuration", el.CalendarEventSource.Persistence.Catchup.MaxDuration)) + lastT = time.Now().Add(-duration) + } + } + } + return lastT, nil +} + // StartListening starts listening events func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byte) error) error { - log := logging.FromContext(ctx). + el.log = logging.FromContext(ctx). With(logging.LabelEventSourceType, el.GetEventSourceType(), logging.LabelEventName, el.GetEventName()).Desugar() - log.Info("started processing the calendar event source...") + el.log.Info("started processing the calendar event source...") calendarEventSource := &el.CalendarEventSource - log.Info("resolving calendar schedule...") + el.log.Info("resolving calendar schedule...") schedule, err := resolveSchedule(calendarEventSource) if err != nil { return err } - log.Info("parsing exclusion dates if any...") + el.log.Info("parsing exclusion dates if any...") exDates, err := common.ParseExclusionDates(calendarEventSource.ExclusionDates) if err != nil { return err } + el.eventPersistence = &persist.NullPersistence{} + if calendarEventSource.Persistence != nil { + err = el.initializePersistence(ctx, calendarEventSource.Persistence) + if err != nil { + return err + } + } else { + el.log.Info("Persistence disabled") + } + var next Next next = func(last time.Time) time.Time { nextT := schedule.Next(last) @@ -88,45 +173,89 @@ func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byt return nextT } - lastT := time.Now() + lastT, err := el.getExecutionTime() + if err != nil { + return err + } + var location *time.Location if calendarEventSource.Timezone != "" { - log.Info("loading location for the schedule...", zap.Any("location", calendarEventSource.Timezone)) + el.log.Info("loading location for the schedule...", zap.Any("location", calendarEventSource.Timezone)) location, err = time.LoadLocation(calendarEventSource.Timezone) if err != nil { return errors.Wrapf(err, "failed to load location for event source %s / %s", el.GetEventSourceName(), el.GetEventName()) } lastT = lastT.In(location) } + sendEventFunc := func(tx time.Time) error { + eventData := &events.CalendarEventData{ + EventTime: tx.String(), + UserPayload: calendarEventSource.UserPayload, + Metadata: calendarEventSource.Metadata, + } + payload, err := json.Marshal(eventData) + if err != nil { + el.log.Error("failed to marshal the event data", zap.Error(err)) + // no need to continue as further event payloads will suffer same fate as this one. + return errors.Wrapf(err, "failed to marshal the event data for event source %s / %s", el.GetEventSourceName(), el.GetEventName()) + } + el.log.Info("dispatching calendar event...") + err = dispatch(payload) + if err != nil { + el.log.Error("failed to dispatch calendar event", zap.Error(err)) + return errors.Wrapf(err, "failed to dispatch calendar event") + } + if el.eventPersistence != nil && el.eventPersistence.IsEnabled() { + event := persist.Event{EventKey: el.getPersistenceKey(), EventPayload: string(payload)} + err = el.eventPersistence.Save(&event) + if err != nil { + el.log.Error("failed to persist calendar event", zap.Error(err)) + } + } + return nil + } + el.log.Info("Calendar event start time:", zap.Any("Time", lastT.Format(time.RFC822))) for { t := next(lastT) + + // Catchup scenario + // Trigger the event immediately if the current schedule time is earlier then + if time.Now().After(t) { + el.log.Info("triggering catchup events", zap.Any(logging.LabelTime, t.UTC().String())) + err = sendEventFunc(t) + if err != nil { + el.log.Error("failed to dispatch calendar event", zap.Error(err)) + if el.eventPersistence.IsEnabled() { + time.Sleep(100 * time.Millisecond) + continue + } + } + lastT = t + if location != nil { + lastT = lastT.In(location) + } + continue + } + timer := time.After(time.Until(t)) - log.Info("expected next calendar event", zap.Any(logging.LabelTime, t.UTC().String())) + el.log.Info("expected next calendar event", zap.Any(logging.LabelTime, t.UTC().String())) select { case tx := <-timer: + err = sendEventFunc(tx) + if err != nil { + el.log.Error("failed to dispatch calendar event", zap.Error(err)) + if el.eventPersistence.IsEnabled() { + time.Sleep(100 * time.Millisecond) + continue + } + } lastT = tx if location != nil { lastT = lastT.In(location) } - response := &events.CalendarEventData{ - EventTime: tx.String(), - UserPayload: calendarEventSource.UserPayload, - Metadata: calendarEventSource.Metadata, - } - payload, err := json.Marshal(response) - if err != nil { - log.Error("failed to marshal the event data", zap.Error(err)) - // no need to continue as further event payloads will suffer same fate as this one. - return errors.Wrapf(err, "failed to marshal the event data for event source %s / %s", el.GetEventSourceName(), el.GetEventName()) - } - log.Info("dispatching calendar event...") - err = dispatch(payload) - if err != nil { - log.Error("failed to dispatch calendar event", zap.Error(err)) - } case <-ctx.Done(): - log.Info("exiting calendar event listener...") + el.log.Info("exiting calendar event listener...") return nil } } diff --git a/examples/event-sources/calendar.yaml b/examples/event-sources/calendar.yaml index 6641eebd49..7f3654527c 100644 --- a/examples/event-sources/calendar.yaml +++ b/examples/event-sources/calendar.yaml @@ -8,6 +8,17 @@ spec: # creates an event every 10 seconds interval: 10s +# example-with-catchup: +# # Catchup the missed events from last Event timestamp. last event will be persisted in configmap. +# schedule: "* * * * *" +# persistence: +# catchup: +# enabled: true +# maxDuration: 5m +# configMap: +# createIfNotExist: true +# name: test-configmap +# # example-with-schedule: # # schedules an event at 30 minutes past each hour # schedule: "30 * * * *" diff --git a/manifests/install.yaml b/manifests/install.yaml index 0f7152df05..7df334f08d 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -301,12 +301,12 @@ spec: spec: containers: - env: - - name: EVENTSOURCE_IMAGE - value: argoproj/eventsource:latest - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace + - name: EVENTSOURCE_IMAGE + value: argoproj/eventsource:latest image: argoproj/eventsource-controller:latest imagePullPolicy: Always livenessProbe: @@ -344,12 +344,12 @@ spec: spec: containers: - env: - - name: SENSOR_IMAGE - value: argoproj/sensor:latest - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace + - name: SENSOR_IMAGE + value: argoproj/sensor:latest image: argoproj/sensor-controller:latest livenessProbe: httpGet: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index b4e52ea7a8..161f58cef3 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -220,12 +220,12 @@ spec: - args: - --namespaced env: - - name: EVENTSOURCE_IMAGE - value: argoproj/eventsource:latest - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace + - name: EVENTSOURCE_IMAGE + value: argoproj/eventsource:latest image: argoproj/eventsource-controller:latest imagePullPolicy: Always livenessProbe: @@ -265,12 +265,12 @@ spec: - args: - --namespaced env: - - name: SENSOR_IMAGE - value: argoproj/sensor:latest - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace + - name: SENSOR_IMAGE + value: argoproj/sensor:latest image: argoproj/sensor-controller:latest livenessProbe: httpGet: diff --git a/pkg/apis/eventsource/v1alpha1/generated.pb.go b/pkg/apis/eventsource/v1alpha1/generated.pb.go index b1c3ef73b2..f8b1ae4d71 100644 --- a/pkg/apis/eventsource/v1alpha1/generated.pb.go +++ b/pkg/apis/eventsource/v1alpha1/generated.pb.go @@ -130,10 +130,66 @@ func (m *CalendarEventSource) XXX_DiscardUnknown() { var xxx_messageInfo_CalendarEventSource proto.InternalMessageInfo +func (m *CatchupConfiguration) Reset() { *m = CatchupConfiguration{} } +func (*CatchupConfiguration) ProtoMessage() {} +func (*CatchupConfiguration) Descriptor() ([]byte, []int) { + return fileDescriptor_c9ac5d6cd016403b, []int{3} +} +func (m *CatchupConfiguration) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CatchupConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *CatchupConfiguration) XXX_Merge(src proto.Message) { + xxx_messageInfo_CatchupConfiguration.Merge(m, src) +} +func (m *CatchupConfiguration) XXX_Size() int { + return m.Size() +} +func (m *CatchupConfiguration) XXX_DiscardUnknown() { + xxx_messageInfo_CatchupConfiguration.DiscardUnknown(m) +} + +var xxx_messageInfo_CatchupConfiguration proto.InternalMessageInfo + +func (m *ConfigMapPersistence) Reset() { *m = ConfigMapPersistence{} } +func (*ConfigMapPersistence) ProtoMessage() {} +func (*ConfigMapPersistence) Descriptor() ([]byte, []int) { + return fileDescriptor_c9ac5d6cd016403b, []int{4} +} +func (m *ConfigMapPersistence) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ConfigMapPersistence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ConfigMapPersistence) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConfigMapPersistence.Merge(m, src) +} +func (m *ConfigMapPersistence) XXX_Size() int { + return m.Size() +} +func (m *ConfigMapPersistence) XXX_DiscardUnknown() { + xxx_messageInfo_ConfigMapPersistence.DiscardUnknown(m) +} + +var xxx_messageInfo_ConfigMapPersistence proto.InternalMessageInfo + func (m *EmitterEventSource) Reset() { *m = EmitterEventSource{} } func (*EmitterEventSource) ProtoMessage() {} func (*EmitterEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{3} + return fileDescriptor_c9ac5d6cd016403b, []int{5} } func (m *EmitterEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,10 +214,38 @@ func (m *EmitterEventSource) XXX_DiscardUnknown() { var xxx_messageInfo_EmitterEventSource proto.InternalMessageInfo +func (m *EventPersistence) Reset() { *m = EventPersistence{} } +func (*EventPersistence) ProtoMessage() {} +func (*EventPersistence) Descriptor() ([]byte, []int) { + return fileDescriptor_c9ac5d6cd016403b, []int{6} +} +func (m *EventPersistence) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventPersistence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *EventPersistence) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventPersistence.Merge(m, src) +} +func (m *EventPersistence) XXX_Size() int { + return m.Size() +} +func (m *EventPersistence) XXX_DiscardUnknown() { + xxx_messageInfo_EventPersistence.DiscardUnknown(m) +} + +var xxx_messageInfo_EventPersistence proto.InternalMessageInfo + func (m *EventSource) Reset() { *m = EventSource{} } func (*EventSource) ProtoMessage() {} func (*EventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{4} + return fileDescriptor_c9ac5d6cd016403b, []int{7} } func (m *EventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -189,7 +273,7 @@ var xxx_messageInfo_EventSource proto.InternalMessageInfo func (m *EventSourceList) Reset() { *m = EventSourceList{} } func (*EventSourceList) ProtoMessage() {} func (*EventSourceList) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{5} + return fileDescriptor_c9ac5d6cd016403b, []int{8} } func (m *EventSourceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -217,7 +301,7 @@ var xxx_messageInfo_EventSourceList proto.InternalMessageInfo func (m *EventSourceSpec) Reset() { *m = EventSourceSpec{} } func (*EventSourceSpec) ProtoMessage() {} func (*EventSourceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{6} + return fileDescriptor_c9ac5d6cd016403b, []int{9} } func (m *EventSourceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -245,7 +329,7 @@ var xxx_messageInfo_EventSourceSpec proto.InternalMessageInfo func (m *EventSourceStatus) Reset() { *m = EventSourceStatus{} } func (*EventSourceStatus) ProtoMessage() {} func (*EventSourceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{7} + return fileDescriptor_c9ac5d6cd016403b, []int{10} } func (m *EventSourceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -273,7 +357,7 @@ var xxx_messageInfo_EventSourceStatus proto.InternalMessageInfo func (m *FileEventSource) Reset() { *m = FileEventSource{} } func (*FileEventSource) ProtoMessage() {} func (*FileEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{8} + return fileDescriptor_c9ac5d6cd016403b, []int{11} } func (m *FileEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -301,7 +385,7 @@ var xxx_messageInfo_FileEventSource proto.InternalMessageInfo func (m *GenericEventSource) Reset() { *m = GenericEventSource{} } func (*GenericEventSource) ProtoMessage() {} func (*GenericEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{9} + return fileDescriptor_c9ac5d6cd016403b, []int{12} } func (m *GenericEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -329,7 +413,7 @@ var xxx_messageInfo_GenericEventSource proto.InternalMessageInfo func (m *GithubEventSource) Reset() { *m = GithubEventSource{} } func (*GithubEventSource) ProtoMessage() {} func (*GithubEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{10} + return fileDescriptor_c9ac5d6cd016403b, []int{13} } func (m *GithubEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -357,7 +441,7 @@ var xxx_messageInfo_GithubEventSource proto.InternalMessageInfo func (m *GitlabEventSource) Reset() { *m = GitlabEventSource{} } func (*GitlabEventSource) ProtoMessage() {} func (*GitlabEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{11} + return fileDescriptor_c9ac5d6cd016403b, []int{14} } func (m *GitlabEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -385,7 +469,7 @@ var xxx_messageInfo_GitlabEventSource proto.InternalMessageInfo func (m *HDFSEventSource) Reset() { *m = HDFSEventSource{} } func (*HDFSEventSource) ProtoMessage() {} func (*HDFSEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{12} + return fileDescriptor_c9ac5d6cd016403b, []int{15} } func (m *HDFSEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -413,7 +497,7 @@ var xxx_messageInfo_HDFSEventSource proto.InternalMessageInfo func (m *KafkaConsumerGroup) Reset() { *m = KafkaConsumerGroup{} } func (*KafkaConsumerGroup) ProtoMessage() {} func (*KafkaConsumerGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{13} + return fileDescriptor_c9ac5d6cd016403b, []int{16} } func (m *KafkaConsumerGroup) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -441,7 +525,7 @@ var xxx_messageInfo_KafkaConsumerGroup proto.InternalMessageInfo func (m *KafkaEventSource) Reset() { *m = KafkaEventSource{} } func (*KafkaEventSource) ProtoMessage() {} func (*KafkaEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{14} + return fileDescriptor_c9ac5d6cd016403b, []int{17} } func (m *KafkaEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -469,7 +553,7 @@ var xxx_messageInfo_KafkaEventSource proto.InternalMessageInfo func (m *MQTTEventSource) Reset() { *m = MQTTEventSource{} } func (*MQTTEventSource) ProtoMessage() {} func (*MQTTEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{15} + return fileDescriptor_c9ac5d6cd016403b, []int{18} } func (m *MQTTEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -497,7 +581,7 @@ var xxx_messageInfo_MQTTEventSource proto.InternalMessageInfo func (m *NATSEventsSource) Reset() { *m = NATSEventsSource{} } func (*NATSEventsSource) ProtoMessage() {} func (*NATSEventsSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{16} + return fileDescriptor_c9ac5d6cd016403b, []int{19} } func (m *NATSEventsSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -525,7 +609,7 @@ var xxx_messageInfo_NATSEventsSource proto.InternalMessageInfo func (m *NSQEventSource) Reset() { *m = NSQEventSource{} } func (*NSQEventSource) ProtoMessage() {} func (*NSQEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{17} + return fileDescriptor_c9ac5d6cd016403b, []int{20} } func (m *NSQEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -553,7 +637,7 @@ var xxx_messageInfo_NSQEventSource proto.InternalMessageInfo func (m *PubSubEventSource) Reset() { *m = PubSubEventSource{} } func (*PubSubEventSource) ProtoMessage() {} func (*PubSubEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{18} + return fileDescriptor_c9ac5d6cd016403b, []int{21} } func (m *PubSubEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -581,7 +665,7 @@ var xxx_messageInfo_PubSubEventSource proto.InternalMessageInfo func (m *PulsarEventSource) Reset() { *m = PulsarEventSource{} } func (*PulsarEventSource) ProtoMessage() {} func (*PulsarEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{19} + return fileDescriptor_c9ac5d6cd016403b, []int{22} } func (m *PulsarEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -609,7 +693,7 @@ var xxx_messageInfo_PulsarEventSource proto.InternalMessageInfo func (m *RedisEventSource) Reset() { *m = RedisEventSource{} } func (*RedisEventSource) ProtoMessage() {} func (*RedisEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{20} + return fileDescriptor_c9ac5d6cd016403b, []int{23} } func (m *RedisEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -637,7 +721,7 @@ var xxx_messageInfo_RedisEventSource proto.InternalMessageInfo func (m *ResourceEventSource) Reset() { *m = ResourceEventSource{} } func (*ResourceEventSource) ProtoMessage() {} func (*ResourceEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{21} + return fileDescriptor_c9ac5d6cd016403b, []int{24} } func (m *ResourceEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -665,7 +749,7 @@ var xxx_messageInfo_ResourceEventSource proto.InternalMessageInfo func (m *ResourceFilter) Reset() { *m = ResourceFilter{} } func (*ResourceFilter) ProtoMessage() {} func (*ResourceFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{22} + return fileDescriptor_c9ac5d6cd016403b, []int{25} } func (m *ResourceFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -693,7 +777,7 @@ var xxx_messageInfo_ResourceFilter proto.InternalMessageInfo func (m *SNSEventSource) Reset() { *m = SNSEventSource{} } func (*SNSEventSource) ProtoMessage() {} func (*SNSEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{23} + return fileDescriptor_c9ac5d6cd016403b, []int{26} } func (m *SNSEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -721,7 +805,7 @@ var xxx_messageInfo_SNSEventSource proto.InternalMessageInfo func (m *SQSEventSource) Reset() { *m = SQSEventSource{} } func (*SQSEventSource) ProtoMessage() {} func (*SQSEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{24} + return fileDescriptor_c9ac5d6cd016403b, []int{27} } func (m *SQSEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -749,7 +833,7 @@ var xxx_messageInfo_SQSEventSource proto.InternalMessageInfo func (m *Selector) Reset() { *m = Selector{} } func (*Selector) ProtoMessage() {} func (*Selector) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{25} + return fileDescriptor_c9ac5d6cd016403b, []int{28} } func (m *Selector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -777,7 +861,7 @@ var xxx_messageInfo_Selector proto.InternalMessageInfo func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{26} + return fileDescriptor_c9ac5d6cd016403b, []int{29} } func (m *Service) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -805,7 +889,7 @@ var xxx_messageInfo_Service proto.InternalMessageInfo func (m *SlackEventSource) Reset() { *m = SlackEventSource{} } func (*SlackEventSource) ProtoMessage() {} func (*SlackEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{27} + return fileDescriptor_c9ac5d6cd016403b, []int{30} } func (m *SlackEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -833,7 +917,7 @@ var xxx_messageInfo_SlackEventSource proto.InternalMessageInfo func (m *StorageGridEventSource) Reset() { *m = StorageGridEventSource{} } func (*StorageGridEventSource) ProtoMessage() {} func (*StorageGridEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{28} + return fileDescriptor_c9ac5d6cd016403b, []int{31} } func (m *StorageGridEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -861,7 +945,7 @@ var xxx_messageInfo_StorageGridEventSource proto.InternalMessageInfo func (m *StorageGridFilter) Reset() { *m = StorageGridFilter{} } func (*StorageGridFilter) ProtoMessage() {} func (*StorageGridFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{29} + return fileDescriptor_c9ac5d6cd016403b, []int{32} } func (m *StorageGridFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -889,7 +973,7 @@ var xxx_messageInfo_StorageGridFilter proto.InternalMessageInfo func (m *StripeEventSource) Reset() { *m = StripeEventSource{} } func (*StripeEventSource) ProtoMessage() {} func (*StripeEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{30} + return fileDescriptor_c9ac5d6cd016403b, []int{33} } func (m *StripeEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -917,7 +1001,7 @@ var xxx_messageInfo_StripeEventSource proto.InternalMessageInfo func (m *Template) Reset() { *m = Template{} } func (*Template) ProtoMessage() {} func (*Template) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{31} + return fileDescriptor_c9ac5d6cd016403b, []int{34} } func (m *Template) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +1029,7 @@ var xxx_messageInfo_Template proto.InternalMessageInfo func (m *WatchPathConfig) Reset() { *m = WatchPathConfig{} } func (*WatchPathConfig) ProtoMessage() {} func (*WatchPathConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{32} + return fileDescriptor_c9ac5d6cd016403b, []int{35} } func (m *WatchPathConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -973,7 +1057,7 @@ var xxx_messageInfo_WatchPathConfig proto.InternalMessageInfo func (m *WebhookContext) Reset() { *m = WebhookContext{} } func (*WebhookContext) ProtoMessage() {} func (*WebhookContext) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{33} + return fileDescriptor_c9ac5d6cd016403b, []int{36} } func (m *WebhookContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1005,8 +1089,11 @@ func init() { proto.RegisterMapType((map[string]string)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.AzureEventsHubEventSource.MetadataEntry") proto.RegisterType((*CalendarEventSource)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.CalendarEventSource") proto.RegisterMapType((map[string]string)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.CalendarEventSource.MetadataEntry") + proto.RegisterType((*CatchupConfiguration)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.CatchupConfiguration") + proto.RegisterType((*ConfigMapPersistence)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.ConfigMapPersistence") proto.RegisterType((*EmitterEventSource)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EmitterEventSource") proto.RegisterMapType((map[string]string)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EmitterEventSource.MetadataEntry") + proto.RegisterType((*EventPersistence)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventPersistence") proto.RegisterType((*EventSource)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSource") proto.RegisterType((*EventSourceList)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceList") proto.RegisterType((*EventSourceSpec)(nil), "github.aaakk.us.kg.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec") @@ -1088,311 +1175,323 @@ func init() { } var fileDescriptor_c9ac5d6cd016403b = []byte{ - // 4856 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4b, 0x6f, 0x23, 0x47, - 0x7a, 0xa6, 0x48, 0x51, 0xd4, 0x47, 0x3d, 0x6b, 0xc6, 0x36, 0xad, 0x5d, 0x8f, 0x26, 0x32, 0x76, - 0x30, 0x93, 0xf5, 0x52, 0xf1, 0x24, 0x9b, 0x38, 0x36, 0xe2, 0x85, 0x28, 0x69, 0x34, 0x63, 0x3d, - 0x46, 0xfa, 0x28, 0xf9, 0xb1, 0x7e, 0x6d, 0xb3, 0x59, 0x24, 0xdb, 0x6c, 0x76, 0x53, 0xdd, 0xc5, - 0x99, 0x91, 0x81, 0x24, 0x8b, 0x20, 0xaf, 0x8d, 0xe3, 0x64, 0x17, 0xd9, 0x04, 0x41, 0x72, 0xcb, - 0x21, 0x0b, 0x24, 0xc7, 0x00, 0xf9, 0x0d, 0x06, 0x72, 0xd9, 0xdc, 0x16, 0x08, 0x20, 0xd8, 0x4a, - 0x90, 0x5b, 0x4e, 0xb9, 0x2c, 0x36, 0x08, 0x10, 0xd4, 0xa3, 0xab, 0x1f, 0x6c, 0xcd, 0x88, 0x16, - 0xc9, 0xb9, 0xe4, 0x32, 0x23, 0x7e, 0xef, 0xae, 0xfa, 0xbe, 0xfa, 0xea, 0xab, 0xfa, 0xba, 0x61, - 0xb7, 0x69, 0xb1, 0x56, 0xaf, 0x56, 0x36, 0xdd, 0xce, 0xaa, 0xe1, 0x35, 0xdd, 0xae, 0xe7, 0x7e, - 0x2c, 0xfe, 0xf8, 0x16, 0x7d, 0x40, 0x1d, 0xe6, 0xaf, 0x76, 0xdb, 0xcd, 0x55, 0xa3, 0x6b, 0xf9, - 0xab, 0xf2, 0xb7, 0xdb, 0xf3, 0x4c, 0xba, 0xfa, 0xe0, 0x15, 0xc3, 0xee, 0xb6, 0x8c, 0x57, 0x56, - 0x9b, 0xd4, 0xa1, 0x9e, 0xc1, 0x68, 0xbd, 0xdc, 0xf5, 0x5c, 0xe6, 0x92, 0xdf, 0x0a, 0xc5, 0x95, - 0x03, 0x71, 0xe2, 0x8f, 0x8f, 0x24, 0x7b, 0xb9, 0xdb, 0x6e, 0x96, 0xb9, 0xb8, 0x72, 0x44, 0x5c, - 0x39, 0x10, 0xb7, 0xf4, 0x9d, 0x0b, 0x5b, 0x63, 0xba, 0x9d, 0x8e, 0xeb, 0x24, 0xf5, 0x2f, 0x7d, - 0x2b, 0x22, 0xa0, 0xe9, 0x36, 0xdd, 0x55, 0x01, 0xae, 0xf5, 0x1a, 0xe2, 0x97, 0xf8, 0x21, 0xfe, - 0x52, 0xe4, 0x2b, 0xed, 0x57, 0xfd, 0xb2, 0xe5, 0x72, 0x91, 0xab, 0xa6, 0xeb, 0xf1, 0x07, 0xeb, - 0x13, 0xf9, 0x6b, 0x21, 0x4d, 0xc7, 0x30, 0x5b, 0x96, 0x43, 0xbd, 0x93, 0xd0, 0x8e, 0x0e, 0x65, - 0x46, 0x1a, 0xd7, 0xea, 0x79, 0x5c, 0x5e, 0xcf, 0x61, 0x56, 0x87, 0xf6, 0x31, 0xfc, 0xfa, 0x93, - 0x18, 0x7c, 0xb3, 0x45, 0x3b, 0x46, 0x92, 0x6f, 0xe5, 0xef, 0x27, 0x61, 0x7e, 0x6d, 0xf7, 0x60, - 0x7f, 0x93, 0x0f, 0x50, 0x55, 0x8c, 0x27, 0x79, 0x11, 0xb2, 0x3d, 0xcf, 0x2e, 0x65, 0xae, 0x67, - 0x6e, 0x4e, 0x57, 0x8a, 0x9f, 0x9f, 0x2e, 0x3f, 0x73, 0x76, 0xba, 0x9c, 0x3d, 0xc2, 0x1d, 0xe4, - 0x70, 0xf2, 0x2a, 0xcc, 0xd0, 0x47, 0x66, 0xcb, 0x70, 0x9a, 0x74, 0xcf, 0xe8, 0xd0, 0xd2, 0x84, - 0xa0, 0xbb, 0xaa, 0xe8, 0x66, 0x36, 0x23, 0x38, 0x8c, 0x51, 0x46, 0x39, 0x0f, 0x4f, 0xba, 0xb4, - 0x94, 0x4d, 0xe7, 0xe4, 0x38, 0x8c, 0x51, 0x92, 0xdb, 0x00, 0x9e, 0xdb, 0x63, 0x96, 0xd3, 0xdc, - 0xa6, 0x27, 0xa5, 0x9c, 0xe0, 0x23, 0x8a, 0x0f, 0x50, 0x63, 0x30, 0x42, 0x45, 0x7e, 0x1b, 0x16, - 0x4d, 0xd7, 0x71, 0xa8, 0xc9, 0x2c, 0xd7, 0xa9, 0x18, 0x66, 0xdb, 0x6d, 0x34, 0x4a, 0x93, 0xd7, - 0x33, 0x37, 0x8b, 0xb7, 0x5f, 0x2d, 0x5f, 0xd8, 0xd1, 0xa4, 0xa7, 0x94, 0x15, 0x7f, 0xe5, 0xd9, - 0xb3, 0xd3, 0xe5, 0xc5, 0xf5, 0xa4, 0x58, 0xec, 0xd7, 0x44, 0x5e, 0x86, 0xc2, 0xc7, 0xbe, 0xeb, - 0x54, 0xdc, 0xfa, 0x49, 0x29, 0x7f, 0x3d, 0x73, 0xb3, 0x50, 0x59, 0x50, 0x06, 0x17, 0xde, 0xac, - 0xde, 0xdf, 0xe3, 0x70, 0xd4, 0x14, 0xe4, 0x08, 0xb2, 0xcc, 0xf6, 0x4b, 0x53, 0xc2, 0xbc, 0xd7, - 0x06, 0x36, 0xef, 0x70, 0xa7, 0xba, 0xee, 0x3a, 0x0d, 0xab, 0x59, 0x99, 0xe2, 0x73, 0x75, 0xb8, - 0x53, 0x45, 0x2e, 0x8f, 0xfc, 0x49, 0x06, 0x0a, 0xdc, 0xc7, 0xea, 0x06, 0x33, 0x4a, 0x85, 0xeb, - 0xd9, 0x9b, 0xc5, 0xdb, 0xef, 0x97, 0x2f, 0x15, 0x64, 0xe5, 0x84, 0xb7, 0x94, 0x77, 0x95, 0xf8, - 0x4d, 0x87, 0x79, 0x27, 0xe1, 0x33, 0x06, 0x60, 0xd4, 0xfa, 0x97, 0x5e, 0x87, 0xd9, 0x18, 0x31, - 0x59, 0x80, 0x6c, 0x9b, 0x9e, 0x48, 0x47, 0x43, 0xfe, 0x27, 0xb9, 0x0a, 0x93, 0x0f, 0x0c, 0xbb, - 0xa7, 0x9c, 0x0a, 0xe5, 0x8f, 0xd7, 0x26, 0x5e, 0xcd, 0xac, 0xfc, 0x38, 0x07, 0x2f, 0xac, 0x7d, - 0xd2, 0xf3, 0xa8, 0xd0, 0xed, 0xdf, 0xed, 0xd5, 0xa2, 0x2e, 0x7b, 0x1d, 0x72, 0x8d, 0xe3, 0xba, - 0xa3, 0x7c, 0x76, 0x46, 0x19, 0x91, 0xbb, 0x73, 0xb0, 0xb1, 0x87, 0x02, 0x43, 0xba, 0x70, 0xc5, - 0x6f, 0x19, 0x1e, 0xad, 0xaf, 0x99, 0x26, 0xf5, 0xfd, 0x6d, 0x7a, 0xa2, 0x9d, 0xb7, 0x78, 0xfb, - 0x1b, 0x65, 0x19, 0x3e, 0xfc, 0xb1, 0xcb, 0x3c, 0x92, 0xcb, 0x0f, 0x5e, 0x29, 0x57, 0xa9, 0xe9, - 0x51, 0xb6, 0x4d, 0x4f, 0xaa, 0xd4, 0xa6, 0x26, 0x73, 0xbd, 0xca, 0xf3, 0x67, 0xa7, 0xcb, 0x57, - 0xaa, 0xfd, 0x52, 0x30, 0x4d, 0x34, 0xa9, 0xc3, 0x7c, 0x02, 0x2c, 0x1c, 0xfe, 0xc2, 0xda, 0xae, - 0x9c, 0x9d, 0x2e, 0xcf, 0x27, 0xb4, 0x61, 0x52, 0x24, 0xb9, 0x05, 0x53, 0xad, 0x5e, 0x4d, 0x3c, - 0x8b, 0x0c, 0x8b, 0x79, 0xf5, 0xf0, 0x53, 0x77, 0x25, 0x18, 0x03, 0x3c, 0xf9, 0x71, 0xd4, 0x19, - 0x26, 0x85, 0x33, 0x34, 0x2e, 0xeb, 0x0c, 0xe7, 0xcd, 0xc8, 0xb8, 0xdc, 0xe2, 0xe7, 0x59, 0xb8, - 0xb2, 0x6e, 0xd8, 0xd4, 0xa9, 0x1b, 0x5e, 0xd4, 0x21, 0x5e, 0x86, 0x02, 0x5f, 0xf1, 0xea, 0x3d, - 0x9b, 0x2a, 0xa7, 0xd0, 0x26, 0x54, 0x15, 0x1c, 0x35, 0x05, 0xa7, 0xb6, 0x1c, 0x46, 0xbd, 0x07, - 0x86, 0xad, 0x96, 0x33, 0x4d, 0x7d, 0x4f, 0xc1, 0x51, 0x53, 0x90, 0xd7, 0x60, 0x8e, 0x3e, 0x32, - 0xed, 0x9e, 0x6f, 0xb9, 0xce, 0x86, 0xc1, 0xa8, 0x5f, 0xca, 0x5e, 0xcf, 0xf2, 0x05, 0xe9, 0xec, - 0x74, 0x79, 0x6e, 0x33, 0x86, 0xc1, 0x04, 0x25, 0xd7, 0xc4, 0x97, 0xe3, 0x4f, 0x5c, 0x27, 0x98, - 0x2f, 0xad, 0xe9, 0x50, 0xc1, 0x51, 0x53, 0x90, 0x5d, 0x28, 0xf6, 0x7c, 0xea, 0xed, 0x1b, 0x27, - 0xb6, 0x6b, 0xd4, 0xc5, 0xe2, 0x35, 0x53, 0xf9, 0xe6, 0xd9, 0xe9, 0x72, 0xf1, 0x28, 0x04, 0xff, - 0xe2, 0x74, 0xb9, 0x44, 0x1d, 0xd3, 0xad, 0x5b, 0x4e, 0x73, 0x95, 0x2f, 0x28, 0x65, 0x34, 0x1e, - 0xee, 0x52, 0xdf, 0x37, 0x9a, 0x14, 0xa3, 0xfc, 0xe4, 0xcf, 0xa2, 0x0e, 0x90, 0x17, 0x0e, 0xf0, - 0xbd, 0x4b, 0x3a, 0x40, 0xca, 0xd8, 0x8f, 0x6b, 0xea, 0xff, 0x26, 0x0f, 0x64, 0xb3, 0x63, 0x31, - 0x46, 0x63, 0x33, 0x7f, 0x03, 0xf2, 0x35, 0xcf, 0x6d, 0x53, 0x4f, 0xcd, 0xfb, 0x9c, 0xd2, 0x9f, - 0xaf, 0x08, 0x28, 0x2a, 0x2c, 0x4f, 0x29, 0x3c, 0xc1, 0x38, 0xd4, 0xe6, 0x91, 0x39, 0x11, 0x4f, - 0x29, 0xeb, 0x1a, 0x83, 0x11, 0x2a, 0xf2, 0x6d, 0x28, 0xaa, 0x5f, 0x22, 0xe0, 0x64, 0xfe, 0xba, - 0xa2, 0x98, 0x8a, 0xeb, 0x21, 0x0a, 0xa3, 0x74, 0xe4, 0x3e, 0x14, 0xf8, 0x34, 0x38, 0x41, 0x90, - 0x5e, 0x78, 0x09, 0x98, 0xe1, 0xe3, 0x76, 0xa4, 0x58, 0x51, 0x0b, 0xe1, 0x02, 0xbb, 0x86, 0xef, - 0x3f, 0x74, 0xbd, 0xba, 0xca, 0x68, 0x83, 0x08, 0xdc, 0x57, 0xac, 0xa8, 0x85, 0xa4, 0xe7, 0xca, - 0xfc, 0x53, 0xc9, 0x95, 0x53, 0x17, 0xcd, 0x95, 0x85, 0x21, 0xe7, 0xca, 0xcf, 0xa2, 0xd1, 0x31, - 0x2d, 0xa2, 0xe3, 0xa3, 0x4b, 0x46, 0x47, 0xbf, 0x7b, 0x8e, 0x2b, 0x38, 0xfe, 0x6d, 0x02, 0x8a, - 0xd1, 0xa8, 0xf8, 0x5e, 0xe4, 0xd9, 0x32, 0x62, 0xe0, 0x7e, 0x25, 0xe2, 0x31, 0x7a, 0xcb, 0x18, - 0x3e, 0x0f, 0xa7, 0xe6, 0x3e, 0x74, 0xbf, 0xf6, 0x31, 0x35, 0x19, 0x37, 0x24, 0x8c, 0x8e, 0x10, - 0x16, 0x9a, 0x4b, 0xba, 0x90, 0xf3, 0xbb, 0xd4, 0x54, 0x19, 0x75, 0xef, 0xb2, 0x23, 0x17, 0xda, - 0x5e, 0xed, 0x52, 0x33, 0x4c, 0xe9, 0xfc, 0x17, 0x0a, 0x4d, 0xe4, 0x11, 0xe4, 0x7d, 0x66, 0xb0, - 0x9e, 0xaf, 0xf2, 0xea, 0xfe, 0x10, 0x75, 0x0a, 0xb9, 0xe1, 0xda, 0x21, 0x7f, 0xa3, 0xd2, 0xb7, - 0xf2, 0x45, 0x06, 0xe6, 0x23, 0xd4, 0x3b, 0x96, 0xcf, 0xc8, 0xfb, 0x7d, 0x23, 0x5c, 0xbe, 0xd8, - 0x08, 0x73, 0x6e, 0x31, 0xbe, 0xda, 0x19, 0x02, 0x48, 0x64, 0x74, 0x5d, 0x98, 0xb4, 0x18, 0xed, - 0xf8, 0xa5, 0x09, 0xe1, 0x98, 0x6f, 0x0e, 0xef, 0x51, 0x2b, 0xb3, 0x4a, 0xed, 0xe4, 0x3d, 0xae, - 0x00, 0xa5, 0x9e, 0x95, 0xff, 0xfc, 0x76, 0xec, 0x11, 0xf9, 0xb0, 0x8b, 0xfd, 0x3b, 0x07, 0x55, - 0x7a, 0xbe, 0x58, 0xff, 0x32, 0x89, 0xfd, 0x7b, 0x04, 0x87, 0x31, 0x4a, 0x72, 0x0c, 0x05, 0x46, - 0x3b, 0x5d, 0xdb, 0x60, 0xc1, 0x96, 0x6b, 0xeb, 0x92, 0x4f, 0x70, 0xa8, 0xc4, 0xc9, 0x25, 0x2d, - 0xf8, 0x85, 0x5a, 0x0d, 0xe9, 0xc0, 0x94, 0x4f, 0xbd, 0x07, 0x96, 0x49, 0x95, 0x7b, 0xdc, 0xb9, - 0xa4, 0xc6, 0xaa, 0x94, 0x56, 0x29, 0xf2, 0xcd, 0x95, 0xfa, 0x81, 0x81, 0x0e, 0xf2, 0x0d, 0x98, - 0xf2, 0x68, 0xd7, 0xb6, 0x4c, 0x43, 0x2c, 0xf1, 0x93, 0x92, 0x0c, 0x25, 0x08, 0x03, 0x1c, 0xf9, - 0x1d, 0x98, 0xec, 0x58, 0x8e, 0xe5, 0xaa, 0xfd, 0xd7, 0xbb, 0xc3, 0x0d, 0x93, 0xf2, 0x2e, 0x97, - 0x2d, 0x97, 0x16, 0x3d, 0xad, 0x02, 0x86, 0x52, 0xad, 0x28, 0x08, 0x4c, 0x95, 0xb3, 0xd5, 0x16, - 0xe0, 0xfd, 0x21, 0xdb, 0xa0, 0xb7, 0x04, 0xf1, 0x15, 0x2e, 0x00, 0xa3, 0xd6, 0x4f, 0x3e, 0x81, - 0x5c, 0xc3, 0xb2, 0x69, 0x69, 0x4a, 0xd8, 0xf1, 0xce, 0x90, 0xed, 0xb8, 0x63, 0xd9, 0x54, 0xda, - 0x10, 0xd6, 0x03, 0x96, 0x4d, 0x51, 0xe8, 0x14, 0x03, 0xe1, 0x51, 0x29, 0x63, 0x48, 0x95, 0x51, - 0xd2, 0x00, 0x54, 0xe2, 0x13, 0x03, 0x11, 0x80, 0x51, 0xeb, 0x27, 0x7f, 0x98, 0x81, 0xa9, 0x87, - 0xb4, 0xd6, 0x72, 0xdd, 0xb6, 0xca, 0x3c, 0xef, 0x0d, 0xd9, 0x96, 0xb7, 0xa5, 0x74, 0x69, 0x8a, - 0x2e, 0x11, 0x14, 0x14, 0x03, 0xe5, 0x7c, 0x46, 0x8c, 0xce, 0x71, 0xb7, 0x04, 0x23, 0x99, 0x91, - 0xb5, 0xce, 0x71, 0x37, 0x31, 0x23, 0xbc, 0x9a, 0x44, 0xa1, 0x93, 0x87, 0x46, 0xdb, 0x68, 0xb4, - 0x8d, 0x52, 0x71, 0x24, 0xa1, 0xb1, 0xcd, 0x65, 0x27, 0x42, 0x43, 0xc0, 0x50, 0xaa, 0xe5, 0xcf, - 0xde, 0x39, 0x66, 0xac, 0x34, 0x33, 0x92, 0x67, 0xdf, 0x3d, 0x66, 0x2c, 0xf1, 0xec, 0xbb, 0x07, - 0x87, 0x87, 0x28, 0x74, 0x72, 0xdd, 0x8e, 0xc1, 0xfc, 0xd2, 0xec, 0x48, 0x74, 0xef, 0x19, 0xcc, - 0x4f, 0xe8, 0xde, 0x5b, 0x3b, 0xac, 0xa2, 0xd0, 0x49, 0x1e, 0x40, 0xd6, 0x77, 0xfc, 0xd2, 0x9c, - 0x50, 0xfd, 0xf6, 0x90, 0x55, 0x57, 0x1d, 0xa5, 0x59, 0x9f, 0x23, 0x55, 0xf7, 0xaa, 0xc8, 0x15, - 0x0a, 0xbd, 0xc7, 0x7e, 0x69, 0x7e, 0x34, 0x7a, 0x8f, 0xfb, 0xf4, 0x1e, 0x70, 0xbd, 0xc7, 0x3e, - 0xf9, 0xbd, 0x0c, 0xe4, 0xbb, 0xbd, 0x5a, 0xb5, 0x57, 0x2b, 0x2d, 0x08, 0xdd, 0xdf, 0x1d, 0xb2, - 0xee, 0x7d, 0x21, 0x5c, 0xaa, 0xd7, 0x3b, 0x08, 0x09, 0x44, 0xa5, 0x59, 0x18, 0x21, 0xb5, 0x96, - 0x16, 0x47, 0x62, 0xc4, 0x96, 0x90, 0x96, 0x30, 0x42, 0x02, 0x51, 0x69, 0x0e, 0x8c, 0xb0, 0x8d, - 0x5a, 0x89, 0x8c, 0xca, 0x08, 0xdb, 0x48, 0x31, 0xc2, 0x36, 0xa4, 0x11, 0xb6, 0x51, 0xe3, 0xae, - 0xdf, 0xaa, 0x37, 0xfc, 0xd2, 0x95, 0x91, 0xb8, 0xfe, 0xdd, 0x7a, 0x23, 0xe9, 0xfa, 0x77, 0x37, - 0xee, 0x54, 0x51, 0xe8, 0xe4, 0x4b, 0x8e, 0x6f, 0x1b, 0x66, 0xbb, 0x74, 0x75, 0x24, 0x4b, 0x4e, - 0x95, 0xcb, 0x4e, 0x2c, 0x39, 0x02, 0x86, 0x52, 0x2d, 0xf9, 0xab, 0x0c, 0x14, 0x7d, 0xe6, 0x7a, - 0x46, 0x93, 0x6e, 0x79, 0x56, 0xbd, 0xf4, 0xec, 0x70, 0xaa, 0x8e, 0xa4, 0x19, 0xa1, 0x06, 0x69, - 0x8c, 0xae, 0x58, 0x23, 0x18, 0x8c, 0x1a, 0x42, 0xfe, 0x2e, 0x03, 0x73, 0x46, 0xec, 0x6c, 0xa7, - 0xf4, 0x9c, 0xb0, 0xad, 0x36, 0xec, 0x94, 0x10, 0x3f, 0x40, 0x12, 0xe6, 0x3d, 0xa7, 0xcc, 0x9b, - 0x8b, 0x23, 0x31, 0x61, 0x91, 0x70, 0x5f, 0x9f, 0x79, 0x56, 0x97, 0x96, 0x9e, 0x1f, 0x89, 0xfb, - 0x56, 0x85, 0xf0, 0x84, 0xfb, 0x4a, 0x20, 0x2a, 0xcd, 0x22, 0x75, 0x53, 0x59, 0xe6, 0x95, 0x4a, - 0x23, 0x49, 0xdd, 0x41, 0x11, 0x19, 0x4f, 0xdd, 0x0a, 0x8a, 0x81, 0x72, 0xee, 0xcb, 0x1e, 0xad, - 0x5b, 0x7e, 0xe9, 0x85, 0x91, 0xf8, 0x32, 0x72, 0xd9, 0x09, 0x5f, 0x16, 0x30, 0x94, 0x6a, 0xf9, - 0x72, 0xee, 0xf8, 0xc7, 0xa5, 0xa5, 0x91, 0x2c, 0xe7, 0x7b, 0xfe, 0x71, 0x62, 0x39, 0xdf, 0xab, - 0x1e, 0x20, 0x57, 0xa8, 0x96, 0x73, 0xdb, 0x37, 0xbc, 0xd2, 0xd7, 0x46, 0xb4, 0x9c, 0x73, 0xe1, - 0x7d, 0xcb, 0x39, 0x07, 0xa2, 0xd2, 0x2c, 0xbc, 0x40, 0x5c, 0xad, 0x58, 0x66, 0xe9, 0xeb, 0x23, - 0xf1, 0x82, 0x2d, 0x29, 0x3d, 0xe1, 0x05, 0x0a, 0x8a, 0x81, 0xf2, 0xa5, 0x1e, 0x40, 0x58, 0x03, - 0xa4, 0x9c, 0x18, 0x1c, 0x44, 0x4f, 0x0c, 0x8a, 0xb7, 0x5f, 0x1f, 0xf8, 0xf4, 0xa4, 0xfa, 0xab, - 0x6b, 0x1e, 0xb3, 0x1a, 0x86, 0xc9, 0x22, 0xc7, 0x0d, 0x4b, 0x7f, 0x9e, 0x81, 0xd9, 0xd8, 0xbe, - 0x3f, 0x45, 0x75, 0x2b, 0xae, 0x1a, 0x87, 0x7f, 0xf2, 0x18, 0xb5, 0xe8, 0x8f, 0x32, 0x30, 0xad, - 0x2b, 0x80, 0x14, 0x6b, 0xea, 0x71, 0x6b, 0x2e, 0x7b, 0x5e, 0x21, 0x54, 0xa5, 0x5b, 0xc2, 0xc7, - 0x26, 0x56, 0x0a, 0x8c, 0x7e, 0x6c, 0xb4, 0xba, 0x74, 0x8b, 0x7e, 0x90, 0x81, 0x99, 0x68, 0x41, - 0x90, 0x62, 0x90, 0x19, 0x37, 0x68, 0xf7, 0x92, 0x06, 0x29, 0x6d, 0xeb, 0xae, 0xc3, 0xe8, 0x23, - 0x96, 0x9c, 0x27, 0x5d, 0x17, 0x8c, 0x7e, 0x9e, 0x12, 0xb7, 0x57, 0x89, 0x51, 0x81, 0xb0, 0x48, - 0x48, 0x31, 0x85, 0xc6, 0x4d, 0xb9, 0x7f, 0x49, 0x53, 0xa4, 0xae, 0xf3, 0xbd, 0x57, 0x57, 0x0c, - 0xa3, 0x1f, 0x15, 0x5e, 0x89, 0x9c, 0x63, 0xc9, 0x1f, 0x67, 0x60, 0x5a, 0xd7, 0x0f, 0xa3, 0x1f, - 0x14, 0x5e, 0x97, 0xc8, 0x0c, 0xdf, 0x6f, 0xca, 0x1f, 0x64, 0xa0, 0x10, 0xd4, 0x13, 0xa3, 0x77, - 0xd9, 0xea, 0x5e, 0xf5, 0x9c, 0x21, 0x11, 0x76, 0x1c, 0x8f, 0xcd, 0x8e, 0x83, 0xf3, 0xec, 0xf8, - 0x34, 0x03, 0xc5, 0x48, 0xad, 0x91, 0x62, 0x4a, 0x23, 0x6e, 0xca, 0x65, 0x0f, 0x48, 0x95, 0xb2, - 0xf3, 0xad, 0x89, 0x14, 0x1d, 0xa3, 0xb7, 0x46, 0x29, 0x7b, 0xac, 0x35, 0x41, 0xf5, 0x31, 0x16, - 0x6b, 0xb8, 0xb2, 0xf3, 0xc3, 0x59, 0x57, 0x22, 0xa3, 0x0f, 0x67, 0x5e, 0xe1, 0x3c, 0x66, 0x91, - 0x0b, 0xcb, 0x92, 0xd1, 0xc7, 0xb3, 0xd4, 0x95, 0x6e, 0xcb, 0x5f, 0x66, 0x60, 0x21, 0x59, 0x9b, - 0xa4, 0x58, 0xd4, 0x8e, 0x5b, 0x74, 0x74, 0x59, 0x8b, 0x22, 0x1a, 0xd3, 0xed, 0xfa, 0xdb, 0x0c, - 0x5c, 0x49, 0xa9, 0x4b, 0x52, 0x4c, 0x73, 0xe2, 0xa6, 0xbd, 0x33, 0xaa, 0xdb, 0xf4, 0xa4, 0x67, - 0x47, 0x0a, 0x93, 0xd1, 0x7b, 0xb6, 0x52, 0x96, 0x6e, 0xcd, 0x67, 0x19, 0x98, 0x89, 0x16, 0x28, - 0x29, 0xe6, 0x34, 0xe3, 0xe6, 0x1c, 0x0c, 0xfd, 0x4e, 0x2d, 0xe9, 0xdf, 0x61, 0xa9, 0x32, 0x7a, - 0xff, 0x96, 0xba, 0xce, 0xcf, 0x13, 0x41, 0xe1, 0x32, 0xfa, 0x3c, 0xb1, 0x57, 0x3d, 0x78, 0x6c, - 0x9e, 0xd0, 0x45, 0xcc, 0x38, 0xf2, 0x84, 0x50, 0x76, 0xbe, 0xc7, 0x44, 0x8b, 0x99, 0xd1, 0x7b, - 0x4c, 0xa0, 0x2d, 0xd5, 0x9e, 0x15, 0x06, 0x8b, 0x7d, 0x17, 0x7f, 0xe4, 0x23, 0x7d, 0xb5, 0x28, - 0xaf, 0xf2, 0x7e, 0x63, 0xf0, 0x3a, 0xe9, 0xf1, 0x37, 0x88, 0xff, 0x92, 0x85, 0xf9, 0x44, 0xcd, - 0x40, 0x56, 0x61, 0x5a, 0x08, 0x13, 0xbd, 0x71, 0xf2, 0x6e, 0x6d, 0x51, 0xb1, 0x4f, 0x6f, 0x06, - 0x08, 0x0c, 0x69, 0xc8, 0x8f, 0x32, 0x30, 0xff, 0xd0, 0x60, 0x66, 0x6b, 0xdf, 0x60, 0x2d, 0x79, - 0xa7, 0x3d, 0xa4, 0x0c, 0xf2, 0x76, 0x5c, 0x6a, 0xe5, 0x79, 0x65, 0xc7, 0x7c, 0x02, 0x81, 0x49, - 0xfd, 0xe4, 0x16, 0x4c, 0x75, 0x5d, 0xdb, 0xb6, 0x9c, 0xa6, 0xb8, 0x76, 0x2b, 0x84, 0xb5, 0xea, - 0xbe, 0x04, 0x63, 0x80, 0x8f, 0x37, 0xa7, 0xe5, 0x86, 0x72, 0x05, 0x93, 0x18, 0xd2, 0x71, 0xdd, - 0xb6, 0xff, 0x7e, 0x16, 0x48, 0xbf, 0x97, 0x3d, 0xa9, 0x91, 0xf2, 0x06, 0xe4, 0xcd, 0x70, 0xd2, - 0x22, 0x9d, 0x2a, 0x6a, 0x6c, 0x15, 0x56, 0x76, 0x27, 0xf9, 0xd4, 0xec, 0x79, 0x54, 0x8d, 0x69, - 0xa4, 0x3b, 0x49, 0xc2, 0x51, 0x53, 0xc4, 0x7a, 0x29, 0x72, 0x4f, 0xec, 0xa5, 0xf8, 0xac, 0xbf, - 0x27, 0xec, 0xa3, 0xa1, 0x87, 0xdb, 0xd8, 0x9a, 0xc1, 0xa6, 0x60, 0xb1, 0x6f, 0x57, 0x48, 0x96, - 0x60, 0xc2, 0xaa, 0x0b, 0x01, 0xd9, 0x0a, 0x28, 0xd5, 0x13, 0xf7, 0x36, 0x70, 0xc2, 0xaa, 0x13, - 0x16, 0xde, 0xbb, 0x8d, 0xa2, 0xd0, 0x95, 0x97, 0xc0, 0x7d, 0xb7, 0x6c, 0x2f, 0xc1, 0xa4, 0xfb, - 0xd0, 0xa1, 0x9e, 0x6a, 0x20, 0xd2, 0xe7, 0x69, 0xf7, 0x39, 0x10, 0x25, 0x4e, 0xb4, 0xbc, 0xd2, - 0xae, 0xeb, 0x5b, 0xcc, 0xf5, 0xfa, 0x5b, 0x5e, 0x35, 0x06, 0x23, 0x54, 0x64, 0x05, 0xf2, 0xd2, - 0x2a, 0x31, 0x95, 0xd3, 0x15, 0xe0, 0xde, 0x24, 0x37, 0x14, 0xa8, 0x30, 0xe4, 0x3e, 0x14, 0x8c, - 0xae, 0x75, 0xe8, 0xb6, 0xa9, 0xa3, 0x3a, 0x7c, 0x06, 0xe9, 0x1d, 0x5a, 0xdb, 0xbf, 0x27, 0x58, - 0x51, 0x0b, 0x21, 0x1f, 0xc2, 0xac, 0x7a, 0x30, 0xc9, 0xa3, 0x9a, 0x58, 0x2f, 0x28, 0x75, 0xf1, - 0xec, 0x74, 0x79, 0xf6, 0xed, 0x28, 0x3f, 0xc6, 0xc5, 0xc5, 0xdc, 0xbf, 0xf0, 0x44, 0xf7, 0xbf, - 0x01, 0x79, 0xc3, 0x64, 0xd6, 0x03, 0x5a, 0x9a, 0x16, 0xb4, 0x3a, 0xa8, 0xd6, 0x04, 0x14, 0x15, - 0x56, 0xb4, 0x72, 0xf1, 0x49, 0x52, 0xcb, 0x2d, 0x24, 0x5a, 0xb9, 0x42, 0x14, 0x46, 0xe9, 0xc8, - 0xeb, 0x30, 0x2b, 0x1d, 0xa4, 0x62, 0xf8, 0xf4, 0x08, 0x77, 0x4a, 0x45, 0xc1, 0xf8, 0xac, 0x62, - 0x9c, 0xdd, 0x8a, 0x22, 0x31, 0x4e, 0x4b, 0xd6, 0x60, 0x5e, 0x02, 0x8e, 0xba, 0xb6, 0x6b, 0xd4, - 0x39, 0xfb, 0x8c, 0x60, 0xd7, 0xcb, 0xeb, 0x56, 0x1c, 0x8d, 0x49, 0x7a, 0xf2, 0x26, 0x90, 0x3a, - 0xb5, 0x29, 0xa3, 0x77, 0x5d, 0xb7, 0x7d, 0xdf, 0xb9, 0x63, 0x39, 0x96, 0xdf, 0x2a, 0xcd, 0x8a, - 0x47, 0x5d, 0x52, 0x52, 0xc8, 0x46, 0x1f, 0x05, 0xa6, 0x70, 0x91, 0x3f, 0x8d, 0xc6, 0xbe, 0xbc, - 0xfe, 0xfb, 0x70, 0xd8, 0x35, 0xd9, 0xb8, 0x42, 0xff, 0x6c, 0x52, 0x84, 0x7e, 0xbc, 0x04, 0x8b, - 0x86, 0x77, 0x66, 0x7c, 0xe1, 0xbd, 0x0a, 0xd3, 0x5c, 0x2c, 0x35, 0xd9, 0xbd, 0x0d, 0xb5, 0xb4, - 0xeb, 0x3c, 0xbe, 0x1f, 0x20, 0x30, 0xa4, 0x89, 0x84, 0x6d, 0xf6, 0xdc, 0xb0, 0x7d, 0x07, 0x8a, - 0x86, 0x68, 0xfa, 0x95, 0x91, 0x3b, 0x50, 0x1b, 0xe1, 0x3c, 0x77, 0xe9, 0xb5, 0x90, 0x1b, 0xa3, - 0xa2, 0x48, 0x15, 0x9e, 0xa5, 0x8e, 0x51, 0xb3, 0x69, 0xb5, 0xba, 0xf3, 0x16, 0xf5, 0xac, 0x86, - 0x65, 0x1a, 0xcc, 0x72, 0x1d, 0xd1, 0x59, 0x58, 0xa8, 0xbc, 0xa8, 0x4c, 0x7f, 0x76, 0x33, 0x8d, - 0x08, 0xd3, 0x79, 0x55, 0x9c, 0xd8, 0x86, 0x8e, 0x93, 0x7c, 0x5f, 0x9c, 0x84, 0x48, 0x8c, 0xd3, - 0x9e, 0xe3, 0xe4, 0x85, 0xcb, 0x3b, 0xf9, 0xf4, 0xb0, 0x9c, 0x3c, 0xee, 0x67, 0xe3, 0x72, 0xf2, - 0x9f, 0x14, 0x60, 0x3e, 0x51, 0xdb, 0xa7, 0xee, 0x01, 0x33, 0x4f, 0x79, 0x0f, 0x78, 0x1d, 0x72, - 0x8c, 0x2f, 0xaa, 0x13, 0xf1, 0x6e, 0x7c, 0xb1, 0x9a, 0x0a, 0x0c, 0x77, 0x0f, 0xb3, 0x45, 0xcd, - 0x76, 0xd0, 0x5d, 0xad, 0x32, 0xa1, 0x76, 0x8f, 0xf5, 0x28, 0x12, 0xe3, 0xb4, 0xe4, 0x9b, 0x30, - 0x6d, 0xd4, 0xeb, 0x1e, 0xf5, 0x7d, 0xea, 0x8b, 0x7d, 0xe3, 0x74, 0x65, 0x96, 0xc7, 0xd6, 0x5a, - 0x00, 0xc4, 0x10, 0xcf, 0xb3, 0x47, 0xab, 0xde, 0xf0, 0x8f, 0x7c, 0xea, 0x09, 0x87, 0x8e, 0x34, - 0x5c, 0xf3, 0xa1, 0xe4, 0x70, 0xd4, 0x14, 0xa4, 0x0e, 0xf3, 0x6d, 0xaf, 0xb6, 0xbe, 0x6e, 0x98, - 0x2d, 0xaa, 0xb2, 0x59, 0x7e, 0xe0, 0x9e, 0xfd, 0xed, 0xb8, 0x04, 0x4c, 0x8a, 0x54, 0x5a, 0xb6, - 0xe9, 0x09, 0x33, 0x6a, 0x5f, 0x25, 0x67, 0x06, 0x5a, 0xa2, 0x12, 0x30, 0x29, 0x92, 0x67, 0xb8, - 0xb6, 0x57, 0x0b, 0xba, 0x87, 0x45, 0xf8, 0x44, 0x32, 0xdc, 0x76, 0x88, 0xc2, 0x28, 0x1d, 0x1f, - 0xb0, 0xb6, 0x57, 0x43, 0x6a, 0xd8, 0x1d, 0x91, 0x42, 0x23, 0x03, 0xb6, 0xad, 0xe0, 0xa8, 0x29, - 0x48, 0x17, 0x08, 0x7f, 0x3a, 0x31, 0xef, 0xf2, 0xdf, 0x5d, 0xa3, 0x2b, 0xb2, 0x69, 0xf1, 0xf6, - 0xcd, 0xb4, 0xa7, 0xd1, 0x44, 0xd1, 0x07, 0x7a, 0x8e, 0x07, 0xf4, 0x76, 0x9f, 0x1c, 0x4c, 0x91, - 0x4d, 0xde, 0x85, 0xe7, 0xdb, 0x5e, 0x4d, 0xf5, 0xdf, 0xed, 0x7b, 0x96, 0x63, 0x5a, 0x5d, 0x43, - 0xf6, 0x63, 0xcb, 0x5c, 0xbc, 0xac, 0xcc, 0x7d, 0x7e, 0x3b, 0x9d, 0x0c, 0xcf, 0xe3, 0x8f, 0x17, - 0x24, 0x33, 0x43, 0x29, 0x48, 0x12, 0xe1, 0x3a, 0xae, 0x95, 0xe2, 0x9f, 0x33, 0x40, 0xc4, 0xfd, - 0xc2, 0xba, 0xeb, 0xf8, 0xbd, 0x0e, 0xf5, 0xb6, 0x3c, 0xb7, 0xd7, 0xe5, 0x99, 0xa9, 0xc9, 0xff, - 0x88, 0x74, 0x6f, 0xea, 0xcc, 0xb4, 0x15, 0x20, 0x30, 0xa4, 0xe1, 0xbb, 0x29, 0xd7, 0xae, 0x53, - 0x9f, 0x09, 0x15, 0x91, 0xdd, 0xd4, 0x7d, 0x01, 0x45, 0x85, 0x25, 0x5b, 0xb0, 0xe8, 0xd1, 0x9a, - 0x61, 0x1b, 0x0e, 0x2f, 0xa1, 0x3d, 0x83, 0xd1, 0xe6, 0x89, 0x8a, 0xe9, 0x17, 0x14, 0xcb, 0x22, - 0x26, 0x09, 0xb0, 0x9f, 0x67, 0xe5, 0x8b, 0x3c, 0x2c, 0x24, 0x2f, 0x46, 0x9e, 0x54, 0x47, 0xf1, - 0x7c, 0x6b, 0x78, 0xcc, 0x12, 0x49, 0x2b, 0x99, 0x6f, 0x03, 0x04, 0x86, 0x34, 0x7c, 0xff, 0xcd, - 0xdc, 0xae, 0x65, 0x26, 0xf7, 0xdf, 0x87, 0x1c, 0x88, 0x12, 0x97, 0xde, 0x12, 0x9f, 0x1b, 0x5b, - 0x4b, 0xbc, 0x6a, 0x72, 0x9f, 0x1c, 0x72, 0x93, 0xfb, 0x60, 0x6f, 0xa5, 0x7d, 0x1a, 0x0d, 0x08, - 0xd9, 0xa5, 0xf9, 0xc1, 0x90, 0x6f, 0xbd, 0x2e, 0x1e, 0x11, 0x3c, 0x3c, 0x67, 0xcd, 0xa8, 0x3f, - 0xab, 0x57, 0x00, 0x0e, 0x86, 0x61, 0x52, 0x2c, 0x50, 0x64, 0x55, 0x12, 0x03, 0x61, 0x5c, 0x35, - 0xd9, 0x87, 0xab, 0xb6, 0xd5, 0xb1, 0x98, 0xdc, 0xa6, 0xed, 0x53, 0xaf, 0x4a, 0x4d, 0xd7, 0xa9, - 0x8b, 0x25, 0x33, 0x5b, 0xf9, 0xba, 0x7a, 0x8c, 0xab, 0x3b, 0x29, 0x34, 0x98, 0xca, 0x49, 0x6e, - 0xc1, 0xd4, 0x03, 0xea, 0xf9, 0xdc, 0x89, 0x21, 0xfe, 0x26, 0xd7, 0x5b, 0x12, 0x8c, 0x01, 0xfe, - 0x72, 0x6b, 0xc3, 0xbf, 0xe6, 0x60, 0x3e, 0x71, 0xe1, 0xf7, 0xa4, 0x08, 0xd3, 0x01, 0x33, 0xf1, - 0x98, 0x80, 0x79, 0x19, 0x0a, 0xa6, 0x6d, 0x51, 0x87, 0xdd, 0xab, 0xab, 0xc0, 0x0a, 0x7b, 0x7f, - 0x25, 0x7c, 0x03, 0x35, 0xc5, 0xd3, 0x0e, 0xaf, 0x68, 0x1c, 0x4c, 0x5e, 0xf4, 0x8d, 0x93, 0xfc, - 0x28, 0xdf, 0xce, 0x9c, 0x1a, 0x4a, 0xbe, 0x49, 0x4c, 0xec, 0xb8, 0xf2, 0xcd, 0x3f, 0xe6, 0x60, - 0x21, 0x79, 0x75, 0xfb, 0x24, 0xa7, 0xba, 0x05, 0x53, 0x7e, 0x4f, 0xbc, 0x49, 0xa2, 0xdc, 0x4a, - 0xfb, 0x7b, 0x55, 0x82, 0x31, 0xc0, 0xa7, 0x3b, 0x4b, 0xf6, 0xa9, 0x38, 0x4b, 0xee, 0xa2, 0xce, - 0x32, 0xec, 0x95, 0xfb, 0xd3, 0xfe, 0x97, 0xf7, 0x3e, 0x18, 0xf2, 0x65, 0xfb, 0xb8, 0xbc, 0xe5, - 0x3f, 0x72, 0x30, 0x17, 0xbf, 0xae, 0xe0, 0x9b, 0xd5, 0x96, 0xeb, 0x33, 0xb5, 0x85, 0x57, 0x3e, - 0xa3, 0x37, 0xab, 0x77, 0x43, 0x14, 0x46, 0xe9, 0x2e, 0xb6, 0x30, 0xdd, 0x82, 0x29, 0xf5, 0x36, - 0x9e, 0x5a, 0x97, 0xb4, 0xa3, 0xa9, 0x37, 0xf6, 0x30, 0xc0, 0xff, 0xff, 0xaa, 0x64, 0xfb, 0xe4, - 0x07, 0xfd, 0xab, 0xd2, 0x7b, 0x43, 0xbd, 0x9b, 0x1a, 0x97, 0x9b, 0xfd, 0xef, 0x24, 0x2c, 0xf6, - 0xb5, 0x2c, 0xc4, 0x4f, 0x67, 0x32, 0x17, 0x38, 0x9d, 0x79, 0x03, 0xe6, 0x84, 0x1f, 0xed, 0x27, - 0xce, 0x74, 0x74, 0x9b, 0xea, 0x61, 0x0c, 0x8b, 0x09, 0xea, 0x8b, 0xed, 0x36, 0xdf, 0x80, 0x39, - 0xbf, 0x57, 0xf3, 0x4d, 0xcf, 0xea, 0x72, 0x87, 0xb8, 0xb7, 0xa1, 0x4e, 0x7c, 0xb5, 0x92, 0x6a, - 0x0c, 0x8b, 0x09, 0x6a, 0xd2, 0x84, 0x05, 0xd3, 0xa3, 0x75, 0xea, 0x30, 0xcb, 0xb0, 0x55, 0x4d, - 0x39, 0xd0, 0x9b, 0xa1, 0x57, 0xcf, 0x4e, 0x97, 0x17, 0xd6, 0x13, 0x22, 0xb0, 0x4f, 0x28, 0xa9, - 0xc1, 0x92, 0x3c, 0x65, 0x89, 0x1a, 0xa4, 0xcf, 0x68, 0xe4, 0x96, 0x72, 0x45, 0x19, 0xbd, 0xb4, - 0x71, 0x2e, 0x25, 0x3e, 0x46, 0xca, 0x80, 0xaf, 0x83, 0x6e, 0xc3, 0x7c, 0x68, 0xa5, 0x7f, 0xc7, - 0xb2, 0x83, 0x5a, 0xf7, 0x97, 0x14, 0xd3, 0x0b, 0x1b, 0xb4, 0xeb, 0x51, 0xd3, 0x60, 0xb4, 0xbe, - 0x1e, 0x27, 0xc4, 0x24, 0xe7, 0x28, 0x8e, 0x8b, 0xfa, 0x5c, 0x70, 0x5c, 0xfe, 0xff, 0x5f, 0x79, - 0xee, 0xff, 0x89, 0xab, 0x58, 0xb2, 0x02, 0x79, 0xe1, 0x72, 0x7c, 0x91, 0xd5, 0x87, 0x8d, 0xc2, - 0x17, 0x7d, 0x54, 0x98, 0x0b, 0x1c, 0xe0, 0xa8, 0xdc, 0x9e, 0x3d, 0x27, 0xb7, 0x77, 0xe1, 0x0a, - 0xb3, 0xfd, 0x43, 0xaf, 0xe7, 0xb3, 0x75, 0xea, 0x31, 0x5f, 0x79, 0x64, 0x6e, 0xe0, 0xaf, 0x2d, - 0x1c, 0xee, 0x54, 0x93, 0x52, 0x30, 0x4d, 0x34, 0xf7, 0x4b, 0x66, 0xfb, 0x6b, 0xb6, 0xed, 0x3e, - 0x0c, 0x6e, 0x05, 0xc2, 0x25, 0x57, 0x2d, 0xa6, 0xda, 0x2f, 0x0f, 0x77, 0xaa, 0xe7, 0x50, 0xe2, - 0x63, 0xa4, 0x90, 0x5d, 0xf1, 0x54, 0x6f, 0x19, 0xb6, 0x55, 0x37, 0x18, 0xe5, 0x49, 0x49, 0x9c, - 0xac, 0x48, 0xa7, 0xff, 0x9a, 0x12, 0xce, 0x4d, 0x4e, 0x92, 0x60, 0x1a, 0xdf, 0xa8, 0xbe, 0xf9, - 0x91, 0x9a, 0xc3, 0x0a, 0x4f, 0x25, 0x87, 0x4d, 0x3f, 0x31, 0x78, 0x63, 0xf1, 0x06, 0x43, 0x8a, - 0xb7, 0x84, 0xcb, 0x8f, 0x2b, 0xde, 0xfe, 0x29, 0x07, 0x0b, 0xc9, 0x7e, 0x90, 0xaf, 0xba, 0xb1, - 0x89, 0xbe, 0xe1, 0x3f, 0x31, 0x8c, 0x37, 0xfc, 0x57, 0x61, 0x9a, 0x3b, 0x9d, 0xdf, 0x35, 0xcc, - 0xe0, 0xc3, 0x05, 0x3a, 0xed, 0xed, 0x05, 0x08, 0x0c, 0x69, 0xc8, 0x12, 0x4c, 0xd4, 0x6b, 0xea, - 0x5d, 0x56, 0x7d, 0x6d, 0xba, 0x51, 0xc1, 0x89, 0x7a, 0x8d, 0xdc, 0x84, 0x82, 0xda, 0x31, 0x05, - 0x37, 0x8d, 0x42, 0xad, 0xda, 0x4e, 0xf9, 0xa8, 0xb1, 0xa3, 0xda, 0xa3, 0x8c, 0xe0, 0x60, 0x22, - 0x39, 0x73, 0x63, 0x7b, 0x53, 0x3f, 0x07, 0x57, 0x52, 0xfa, 0xb5, 0xe3, 0x13, 0x96, 0xb9, 0xc0, - 0x84, 0x1d, 0x43, 0xbe, 0x61, 0xd9, 0x8c, 0x7a, 0x43, 0xba, 0xca, 0x0e, 0x8c, 0xba, 0x23, 0x84, - 0xca, 0x3c, 0x21, 0xff, 0x46, 0xa5, 0x88, 0x47, 0xef, 0x55, 0x71, 0x58, 0x18, 0x9c, 0x50, 0x04, - 0x2f, 0xd4, 0x66, 0xd5, 0x7c, 0x5f, 0xe8, 0x05, 0xf8, 0xad, 0x14, 0x09, 0xe1, 0x09, 0x4a, 0x1a, - 0x16, 0x53, 0xb5, 0x92, 0x75, 0x00, 0xdd, 0x1c, 0x13, 0xdc, 0x0c, 0xbc, 0x74, 0x76, 0xba, 0x0c, - 0xba, 0x7b, 0xc6, 0xff, 0x85, 0x38, 0x88, 0x8c, 0x8c, 0xb6, 0xc8, 0x69, 0x11, 0xb6, 0xf8, 0x47, - 0x52, 0x26, 0x87, 0xf2, 0x91, 0x94, 0x94, 0xe9, 0x1d, 0x5b, 0x61, 0x9e, 0x85, 0xb9, 0xf8, 0x44, - 0x92, 0x1b, 0x90, 0xef, 0x7a, 0xb4, 0x61, 0x3d, 0x4a, 0x7e, 0x20, 0x65, 0x5f, 0x40, 0x51, 0x61, - 0x89, 0x0b, 0x79, 0xdb, 0xa8, 0xf1, 0x10, 0x97, 0xdf, 0x1c, 0xd8, 0xba, 0xf4, 0xfb, 0xf3, 0x6a, - 0x89, 0xd2, 0x0a, 0x77, 0x84, 0x78, 0x54, 0x6a, 0xb8, 0xc2, 0x86, 0x45, 0xed, 0xba, 0xbc, 0x06, - 0x1d, 0x85, 0xc2, 0x3b, 0x42, 0x3c, 0x2a, 0x35, 0xe4, 0x3d, 0x98, 0x36, 0x3d, 0xca, 0xf7, 0x85, - 0x95, 0x13, 0xb5, 0x37, 0xf9, 0xe5, 0x8b, 0xb9, 0xec, 0xa1, 0xd5, 0xa1, 0x61, 0x38, 0xae, 0x07, - 0x42, 0x30, 0x94, 0x47, 0x6e, 0x03, 0x18, 0x0d, 0x46, 0xbd, 0x2a, 0x33, 0x3c, 0xa6, 0x36, 0x20, - 0xba, 0x7f, 0x63, 0x4d, 0x63, 0x30, 0x42, 0xb5, 0xf2, 0xf3, 0x1c, 0xcc, 0xc5, 0xfb, 0xce, 0x9f, - 0xd2, 0x15, 0xf6, 0xcb, 0x50, 0x10, 0x5b, 0xc1, 0x35, 0xcf, 0x49, 0x7e, 0x10, 0xe9, 0x50, 0xc1, - 0x51, 0x53, 0x10, 0x84, 0x69, 0xe3, 0xab, 0x7d, 0xe3, 0x4a, 0xde, 0xdb, 0xe9, 0xaf, 0x5b, 0x85, - 0x62, 0xb8, 0x4c, 0x3f, 0x20, 0x1f, 0x6c, 0xdf, 0x28, 0x64, 0x6a, 0x30, 0x86, 0x62, 0xb8, 0xe7, - 0x7b, 0xb4, 0x19, 0xec, 0x07, 0x23, 0x9e, 0x8f, 0x02, 0x8a, 0x0a, 0x4b, 0x6e, 0xc1, 0x94, 0xe7, - 0xda, 0x74, 0x0d, 0xf7, 0xd4, 0xb5, 0xb5, 0x3e, 0x30, 0x40, 0x09, 0xc6, 0x00, 0x3f, 0x8a, 0x62, - 0x39, 0xee, 0x00, 0xe3, 0x5a, 0x28, 0xfe, 0x61, 0x12, 0xe6, 0xe2, 0xaf, 0x1a, 0xc4, 0xa7, 0x35, - 0x33, 0x82, 0x69, 0x9d, 0x18, 0xf6, 0xb4, 0x66, 0x1f, 0x3b, 0xad, 0x2f, 0xc1, 0xe4, 0x71, 0x8f, - 0xf6, 0x82, 0x0f, 0x6f, 0xe9, 0x42, 0xfc, 0x80, 0x03, 0x51, 0xe2, 0xc8, 0x1a, 0xcc, 0x3f, 0x34, - 0x2c, 0xc6, 0x03, 0x5c, 0x9e, 0xcb, 0xcb, 0x93, 0xbc, 0x6c, 0xf4, 0xfa, 0x3b, 0x86, 0xc6, 0x24, - 0xfd, 0x20, 0xee, 0x33, 0x58, 0xa5, 0xfb, 0x06, 0xcc, 0x09, 0x23, 0xd7, 0x4c, 0xd3, 0xed, 0x89, - 0x73, 0xf6, 0x42, 0xfc, 0x90, 0xe0, 0x20, 0x8a, 0xdd, 0xc0, 0x04, 0x75, 0xdc, 0x59, 0x87, 0xf3, - 0x9d, 0x89, 0xb8, 0xcb, 0x8c, 0xcb, 0x59, 0x7f, 0x17, 0x0a, 0x81, 0x5f, 0xf0, 0x4a, 0x54, 0xf3, - 0x85, 0x95, 0x28, 0x77, 0x11, 0x21, 0x64, 0x15, 0xa6, 0xdd, 0x2e, 0xf5, 0x8c, 0xb4, 0xcb, 0xc1, - 0xfb, 0x01, 0x02, 0x43, 0x1a, 0xee, 0x25, 0x52, 0x6b, 0xe2, 0xb8, 0xe6, 0x2d, 0x0e, 0x54, 0x46, - 0xac, 0x7c, 0x3f, 0x03, 0xc1, 0x27, 0x60, 0xc8, 0x06, 0x4c, 0x76, 0x5d, 0x8f, 0xc9, 0x7a, 0xba, - 0x78, 0x7b, 0x39, 0xdd, 0x9d, 0xe5, 0x75, 0xb3, 0xeb, 0xb1, 0x50, 0x22, 0xff, 0xe5, 0xa3, 0x64, - 0xe6, 0x76, 0x9a, 0x76, 0xcf, 0x67, 0xd4, 0xbb, 0xb7, 0x9f, 0xb4, 0x73, 0x3d, 0x40, 0x60, 0x48, - 0xb3, 0xf2, 0x3f, 0x59, 0x58, 0x48, 0xbe, 0x5d, 0x41, 0x3e, 0x84, 0x59, 0xdf, 0x6a, 0x3a, 0x96, - 0xd3, 0x54, 0x15, 0x77, 0x66, 0xe0, 0x5e, 0xbc, 0x6a, 0x94, 0x1f, 0xe3, 0xe2, 0xc8, 0x1d, 0x98, - 0x64, 0xa2, 0xff, 0x68, 0xa0, 0xd0, 0x9d, 0x96, 0xc7, 0x5d, 0x6d, 0xea, 0xa0, 0x64, 0x8f, 0x66, - 0xb5, 0xec, 0xf8, 0xb2, 0xda, 0xa7, 0xfd, 0x0d, 0xc7, 0x1f, 0x0c, 0xf9, 0xfd, 0x96, 0x71, 0x45, - 0xc0, 0x7f, 0x4f, 0xc2, 0x73, 0xe9, 0x6f, 0xb2, 0x3c, 0xa5, 0x1d, 0x43, 0xd8, 0xc3, 0x36, 0x71, - 0x6e, 0x0f, 0x1b, 0xd3, 0x15, 0x4a, 0x76, 0x48, 0x6f, 0xa6, 0xe8, 0x01, 0x78, 0x4c, 0x91, 0x12, - 0xdd, 0xcb, 0xe4, 0x9e, 0xb8, 0x97, 0xb9, 0x01, 0xf9, 0x5a, 0xcf, 0x6c, 0xab, 0xe3, 0xd3, 0xe8, - 0xe7, 0x03, 0x05, 0x14, 0x15, 0x36, 0x92, 0x74, 0xf2, 0x8f, 0x4d, 0x3a, 0x3c, 0x89, 0xf6, 0x58, - 0x4b, 0x76, 0xed, 0x4d, 0x0d, 0x9e, 0x44, 0x03, 0x5e, 0x0c, 0xc5, 0x88, 0x1e, 0xd7, 0xae, 0x75, - 0x84, 0x3b, 0x6a, 0xfd, 0x0f, 0x7b, 0x5c, 0xf7, 0xef, 0x1d, 0xe1, 0x0e, 0x2a, 0x2c, 0xf9, 0x51, - 0xff, 0x7a, 0x6f, 0x8e, 0xe4, 0xed, 0xa9, 0x71, 0x79, 0xbd, 0x09, 0x8b, 0x7d, 0x73, 0x7e, 0xe1, - 0x7a, 0xe6, 0x06, 0xe4, 0xfd, 0x5e, 0x83, 0xd3, 0x25, 0xda, 0xed, 0xab, 0x02, 0x8a, 0x0a, 0xbb, - 0xf2, 0xc3, 0x1c, 0xd7, 0x92, 0x78, 0xe7, 0xe9, 0x29, 0x45, 0xd5, 0xeb, 0x30, 0x2b, 0x2b, 0x8a, - 0xb7, 0x23, 0x5d, 0xea, 0x85, 0x48, 0x9f, 0x5c, 0x14, 0x89, 0x71, 0x5a, 0x72, 0x4f, 0xb8, 0xc9, - 0xc0, 0x7b, 0x72, 0x50, 0x9e, 0xc4, 0x53, 0xa8, 0x12, 0x40, 0x5e, 0x81, 0xa2, 0x78, 0x08, 0x39, - 0xe4, 0xaa, 0xb4, 0x16, 0x6d, 0xa5, 0x9b, 0x21, 0x18, 0xa3, 0x34, 0xf1, 0x93, 0xbd, 0xc9, 0xa1, - 0x9c, 0xec, 0xf5, 0xcd, 0xca, 0xd8, 0xaa, 0xe8, 0x3c, 0xe8, 0x4f, 0xcc, 0x11, 0xb3, 0xef, 0x43, - 0x7f, 0xbf, 0x39, 0xf0, 0xb9, 0x56, 0x60, 0x8a, 0x3c, 0x37, 0x4b, 0xe9, 0x75, 0x79, 0x13, 0x88, - 0xfa, 0xb2, 0x9c, 0xda, 0xbe, 0x45, 0x3e, 0xb5, 0xad, 0x5b, 0x60, 0xab, 0x7d, 0x14, 0x98, 0xc2, - 0x45, 0xde, 0x84, 0x69, 0xd3, 0x75, 0x98, 0x61, 0x39, 0x7a, 0xe5, 0x7d, 0xf1, 0x9c, 0xd6, 0x3c, - 0x49, 0x24, 0x97, 0x1e, 0xfd, 0x13, 0x43, 0x76, 0xb2, 0x09, 0x53, 0x0f, 0x5c, 0xbb, 0xd7, 0x51, - 0xe7, 0x2b, 0xc5, 0xdb, 0x4b, 0x69, 0x92, 0xde, 0x12, 0x24, 0x91, 0x06, 0x16, 0xc9, 0x82, 0x01, - 0x2f, 0xa1, 0x30, 0x2f, 0x4e, 0xd7, 0x2d, 0x76, 0xa2, 0x02, 0x40, 0xdd, 0x56, 0xdd, 0x48, 0x13, - 0xb7, 0xef, 0xd6, 0xab, 0x71, 0x6a, 0xf5, 0x71, 0xe4, 0x38, 0x10, 0x93, 0x32, 0xc9, 0x1d, 0x28, - 0x18, 0x8d, 0x86, 0xe5, 0x58, 0xec, 0x44, 0x1d, 0x41, 0x7e, 0x3d, 0x4d, 0xfe, 0x9a, 0xa2, 0x51, - 0xaf, 0x38, 0xa8, 0x5f, 0xa8, 0x79, 0xc9, 0x11, 0x14, 0x99, 0x6b, 0xab, 0x1d, 0xa2, 0xaf, 0xea, - 0xbc, 0x6b, 0x69, 0xa2, 0x0e, 0x35, 0x59, 0x78, 0xc8, 0x1b, 0xc2, 0x7c, 0x8c, 0xca, 0x21, 0x7f, - 0x91, 0x81, 0x19, 0xc7, 0xad, 0xd3, 0x20, 0xf4, 0xd4, 0x77, 0xe8, 0xde, 0x1d, 0xd2, 0xa7, 0x11, - 0xcb, 0x7b, 0x11, 0xd9, 0x32, 0x42, 0xf4, 0xb7, 0x1a, 0xa3, 0x28, 0x8c, 0x19, 0xb1, 0xf4, 0x1d, - 0x58, 0xec, 0x63, 0x1c, 0x28, 0x5a, 0xfe, 0x3a, 0x03, 0xc9, 0x1e, 0x61, 0xbe, 0xbd, 0xad, 0x5b, - 0x9e, 0x10, 0x78, 0x92, 0x3c, 0xcd, 0xdc, 0x08, 0x10, 0x18, 0xd2, 0x90, 0xeb, 0x90, 0xeb, 0x1a, - 0xac, 0x95, 0xbc, 0x82, 0xe2, 0x22, 0x51, 0x60, 0xc8, 0x6d, 0x00, 0xfe, 0x3f, 0xd2, 0x26, 0x7d, - 0xd4, 0x55, 0xbb, 0x75, 0x7d, 0xc0, 0xb2, 0xaf, 0x31, 0x18, 0xa1, 0x5a, 0xf9, 0x49, 0x1e, 0xe6, - 0xe2, 0x0b, 0x2f, 0xdf, 0x1e, 0x50, 0xa7, 0xde, 0x75, 0x2d, 0x87, 0x25, 0xbf, 0x14, 0xbd, 0xa9, - 0xe0, 0xa8, 0x29, 0x78, 0x12, 0xe9, 0x50, 0xd6, 0x72, 0xeb, 0xc9, 0x24, 0xb2, 0x2b, 0xa0, 0xa8, - 0xb0, 0xc2, 0x7c, 0xd7, 0x63, 0xca, 0xac, 0xd0, 0x7c, 0xd7, 0x63, 0x28, 0x30, 0xc1, 0x0d, 0x5a, - 0xee, 0x9c, 0x1b, 0xb4, 0x26, 0x2c, 0xf0, 0x50, 0xa6, 0xde, 0x3a, 0xf5, 0xd8, 0x57, 0xbe, 0xd0, - 0xad, 0x26, 0x44, 0x60, 0x9f, 0x50, 0xf1, 0x99, 0x72, 0x01, 0x13, 0xcc, 0x5f, 0xb1, 0xe5, 0xb9, - 0x1a, 0x97, 0x80, 0x49, 0x91, 0xa3, 0x38, 0x27, 0x89, 0xcf, 0xe3, 0x00, 0x7d, 0x84, 0x47, 0x00, - 0x7c, 0x2f, 0xa5, 0x1e, 0xb6, 0x30, 0xc8, 0xc3, 0xce, 0x89, 0xc3, 0x3b, 0xcd, 0x8c, 0x11, 0x41, - 0xe4, 0x2e, 0xcc, 0x85, 0x83, 0xcb, 0xfd, 0x4f, 0xb5, 0x4f, 0x5f, 0x57, 0xa6, 0x94, 0xc2, 0x6b, - 0xe8, 0x6a, 0x8c, 0x0e, 0x13, 0x7c, 0x64, 0x13, 0x66, 0xf5, 0xf8, 0x09, 0x41, 0x10, 0x6f, 0x6c, - 0x4e, 0x0a, 0x52, 0x64, 0x18, 0xe7, 0xba, 0x54, 0xca, 0xab, 0x94, 0x3f, 0xff, 0xf2, 0xda, 0x33, - 0x3f, 0xfd, 0xf2, 0xda, 0x33, 0x3f, 0xfb, 0xf2, 0xda, 0x33, 0xdf, 0x3f, 0xbb, 0x96, 0xf9, 0xfc, - 0xec, 0x5a, 0xe6, 0xa7, 0x67, 0xd7, 0x32, 0x3f, 0x3b, 0xbb, 0x96, 0xf9, 0xe2, 0xec, 0x5a, 0xe6, - 0x87, 0xff, 0x7e, 0xed, 0x99, 0xef, 0x16, 0x82, 0xd9, 0xf8, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xd3, 0xf0, 0x8a, 0x3d, 0x0a, 0x64, 0x00, 0x00, + // 5041 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7c, 0xdd, 0x6f, 0x23, 0x47, + 0x72, 0xb8, 0x29, 0x52, 0x14, 0x55, 0x5c, 0x7d, 0xf5, 0xae, 0x6d, 0x5a, 0x67, 0xaf, 0xf6, 0x27, + 0xe3, 0x16, 0xbb, 0xbf, 0xf3, 0x51, 0xb1, 0x92, 0x4b, 0x1c, 0x1b, 0xf1, 0x41, 0x94, 0xb4, 0x5a, + 0x59, 0x1f, 0x2b, 0x15, 0x25, 0x7f, 0x9c, 0xbf, 0x6e, 0x38, 0x6c, 0x92, 0x63, 0x0d, 0x67, 0xa8, + 0x99, 0xe6, 0xee, 0xca, 0x40, 0x2e, 0x46, 0x90, 0xaf, 0x3b, 0xc7, 0xc9, 0x19, 0xb9, 0x04, 0x41, + 0xf2, 0x96, 0x87, 0x1c, 0x90, 0x3c, 0x06, 0xc8, 0xdf, 0x60, 0x20, 0x2f, 0x97, 0xb7, 0x03, 0x0e, + 0x10, 0x6c, 0x25, 0xc8, 0x5b, 0x9e, 0xf2, 0x72, 0xb8, 0x20, 0x40, 0xd0, 0x1f, 0xd3, 0xf3, 0xc1, + 0xd1, 0xae, 0x68, 0x91, 0xdc, 0x97, 0x3c, 0x49, 0xac, 0xaa, 0xae, 0xaa, 0xe9, 0xae, 0xaa, 0xee, + 0xea, 0xae, 0x6e, 0xd8, 0x69, 0x5a, 0xac, 0xd5, 0xad, 0x95, 0x4d, 0xb7, 0xbd, 0x64, 0x78, 0x4d, + 0xb7, 0xe3, 0xb9, 0x1f, 0x89, 0x7f, 0xbe, 0x4d, 0xef, 0x53, 0x87, 0xf9, 0x4b, 0x9d, 0xa3, 0xe6, + 0x92, 0xd1, 0xb1, 0xfc, 0x25, 0xf9, 0xdb, 0xed, 0x7a, 0x26, 0x5d, 0xba, 0xff, 0xb2, 0x61, 0x77, + 0x5a, 0xc6, 0xcb, 0x4b, 0x4d, 0xea, 0x50, 0xcf, 0x60, 0xb4, 0x5e, 0xee, 0x78, 0x2e, 0x73, 0xc9, + 0xef, 0x84, 0xec, 0xca, 0x01, 0x3b, 0xf1, 0xcf, 0x87, 0xb2, 0x79, 0xb9, 0x73, 0xd4, 0x2c, 0x73, + 0x76, 0xe5, 0x08, 0xbb, 0x72, 0xc0, 0x6e, 0xfe, 0xbb, 0x17, 0xd6, 0xc6, 0x74, 0xdb, 0x6d, 0xd7, + 0x49, 0xca, 0x9f, 0xff, 0x76, 0x84, 0x41, 0xd3, 0x6d, 0xba, 0x4b, 0x02, 0x5c, 0xeb, 0x36, 0xc4, + 0x2f, 0xf1, 0x43, 0xfc, 0xa7, 0xc8, 0x17, 0x8f, 0x5e, 0xf1, 0xcb, 0x96, 0xcb, 0x59, 0x2e, 0x99, + 0xae, 0xc7, 0x3f, 0xac, 0x87, 0xe5, 0x6f, 0x84, 0x34, 0x6d, 0xc3, 0x6c, 0x59, 0x0e, 0xf5, 0x4e, + 0x42, 0x3d, 0xda, 0x94, 0x19, 0x69, 0xad, 0x96, 0xce, 0x6b, 0xe5, 0x75, 0x1d, 0x66, 0xb5, 0x69, + 0x4f, 0x83, 0xdf, 0x7c, 0x5c, 0x03, 0xdf, 0x6c, 0xd1, 0xb6, 0x91, 0x6c, 0xb7, 0xf8, 0xf7, 0xe3, + 0x30, 0xb3, 0xb2, 0xb3, 0xbf, 0xb7, 0xce, 0x3b, 0xa8, 0x2a, 0xfa, 0x93, 0xbc, 0x00, 0xd9, 0xae, + 0x67, 0x97, 0x32, 0x37, 0x32, 0xb7, 0x26, 0x2b, 0xc5, 0x2f, 0x4e, 0x17, 0x9e, 0x3a, 0x3b, 0x5d, + 0xc8, 0x1e, 0xe2, 0x36, 0x72, 0x38, 0x79, 0x05, 0xae, 0xd0, 0x87, 0x66, 0xcb, 0x70, 0x9a, 0x74, + 0xd7, 0x68, 0xd3, 0xd2, 0x98, 0xa0, 0xbb, 0xa6, 0xe8, 0xae, 0xac, 0x47, 0x70, 0x18, 0xa3, 0x8c, + 0xb6, 0x3c, 0x38, 0xe9, 0xd0, 0x52, 0x36, 0xbd, 0x25, 0xc7, 0x61, 0x8c, 0x92, 0x2c, 0x03, 0x78, + 0x6e, 0x97, 0x59, 0x4e, 0x73, 0x8b, 0x9e, 0x94, 0x72, 0xa2, 0x1d, 0x51, 0xed, 0x00, 0x35, 0x06, + 0x23, 0x54, 0xe4, 0x77, 0x61, 0xce, 0x74, 0x1d, 0x87, 0x9a, 0xcc, 0x72, 0x9d, 0x8a, 0x61, 0x1e, + 0xb9, 0x8d, 0x46, 0x69, 0xfc, 0x46, 0xe6, 0x56, 0x71, 0xf9, 0x95, 0xf2, 0x85, 0x0d, 0x4d, 0x5a, + 0x4a, 0x59, 0xb5, 0xaf, 0x3c, 0x7d, 0x76, 0xba, 0x30, 0xb7, 0x9a, 0x64, 0x8b, 0xbd, 0x92, 0xc8, + 0x4b, 0x50, 0xf8, 0xc8, 0x77, 0x9d, 0x8a, 0x5b, 0x3f, 0x29, 0xe5, 0x6f, 0x64, 0x6e, 0x15, 0x2a, + 0xb3, 0x4a, 0xe1, 0xc2, 0x1b, 0xd5, 0x7b, 0xbb, 0x1c, 0x8e, 0x9a, 0x82, 0x1c, 0x42, 0x96, 0xd9, + 0x7e, 0x69, 0x42, 0xa8, 0xf7, 0x6a, 0xdf, 0xea, 0x1d, 0x6c, 0x57, 0x57, 0x5d, 0xa7, 0x61, 0x35, + 0x2b, 0x13, 0x7c, 0xac, 0x0e, 0xb6, 0xab, 0xc8, 0xf9, 0x91, 0x1f, 0x65, 0xa0, 0xc0, 0x6d, 0xac, + 0x6e, 0x30, 0xa3, 0x54, 0xb8, 0x91, 0xbd, 0x55, 0x5c, 0x7e, 0xaf, 0x7c, 0x29, 0x27, 0x2b, 0x27, + 0xac, 0xa5, 0xbc, 0xa3, 0xd8, 0xaf, 0x3b, 0xcc, 0x3b, 0x09, 0xbf, 0x31, 0x00, 0xa3, 0x96, 0x3f, + 0xff, 0x1a, 0x4c, 0xc5, 0x88, 0xc9, 0x2c, 0x64, 0x8f, 0xe8, 0x89, 0x34, 0x34, 0xe4, 0xff, 0x92, + 0x6b, 0x30, 0x7e, 0xdf, 0xb0, 0xbb, 0xca, 0xa8, 0x50, 0xfe, 0x78, 0x75, 0xec, 0x95, 0xcc, 0xe2, + 0x4f, 0x72, 0xf0, 0xdc, 0xca, 0xc7, 0x5d, 0x8f, 0x0a, 0xd9, 0xfe, 0xdd, 0x6e, 0x2d, 0x6a, 0xb2, + 0x37, 0x20, 0xd7, 0x38, 0xae, 0x3b, 0xca, 0x66, 0xaf, 0x28, 0x25, 0x72, 0x77, 0xf6, 0xd7, 0x76, + 0x51, 0x60, 0x48, 0x07, 0xae, 0xfa, 0x2d, 0xc3, 0xa3, 0xf5, 0x15, 0xd3, 0xa4, 0xbe, 0xbf, 0x45, + 0x4f, 0xb4, 0xf1, 0x16, 0x97, 0xbf, 0x59, 0x96, 0xee, 0xc3, 0x3f, 0xbb, 0xcc, 0x3d, 0xb9, 0x7c, + 0xff, 0xe5, 0x72, 0x95, 0x9a, 0x1e, 0x65, 0x5b, 0xf4, 0xa4, 0x4a, 0x6d, 0x6a, 0x32, 0xd7, 0xab, + 0x3c, 0x7b, 0x76, 0xba, 0x70, 0xb5, 0xda, 0xcb, 0x05, 0xd3, 0x58, 0x93, 0x3a, 0xcc, 0x24, 0xc0, + 0xc2, 0xe0, 0x2f, 0x2c, 0xed, 0xea, 0xd9, 0xe9, 0xc2, 0x4c, 0x42, 0x1a, 0x26, 0x59, 0x92, 0xdb, + 0x30, 0xd1, 0xea, 0xd6, 0xc4, 0xb7, 0x48, 0xb7, 0x98, 0x51, 0x1f, 0x3f, 0x71, 0x57, 0x82, 0x31, + 0xc0, 0x93, 0x9f, 0x44, 0x8d, 0x61, 0x5c, 0x18, 0x43, 0xe3, 0xb2, 0xc6, 0x70, 0xde, 0x88, 0x8c, + 0xca, 0x2c, 0xfe, 0x27, 0x07, 0x57, 0x57, 0x0d, 0x9b, 0x3a, 0x75, 0xc3, 0x8b, 0x1a, 0xc4, 0x4b, + 0x50, 0xe0, 0x11, 0xaf, 0xde, 0xb5, 0xa9, 0x32, 0x0a, 0xad, 0x42, 0x55, 0xc1, 0x51, 0x53, 0x70, + 0x6a, 0xcb, 0x61, 0xd4, 0xbb, 0x6f, 0xd8, 0x2a, 0x9c, 0x69, 0xea, 0x4d, 0x05, 0x47, 0x4d, 0x41, + 0x5e, 0x85, 0x69, 0xfa, 0xd0, 0xb4, 0xbb, 0xbe, 0xe5, 0x3a, 0x6b, 0x06, 0xa3, 0x7e, 0x29, 0x7b, + 0x23, 0xcb, 0x03, 0xd2, 0xd9, 0xe9, 0xc2, 0xf4, 0x7a, 0x0c, 0x83, 0x09, 0x4a, 0x2e, 0x89, 0x87, + 0xe3, 0x8f, 0x5d, 0x27, 0x18, 0x2f, 0x2d, 0xe9, 0x40, 0xc1, 0x51, 0x53, 0x90, 0x1d, 0x28, 0x76, + 0x7d, 0xea, 0xed, 0x19, 0x27, 0xb6, 0x6b, 0xd4, 0x45, 0xf0, 0xba, 0x52, 0xf9, 0xd6, 0xd9, 0xe9, + 0x42, 0xf1, 0x30, 0x04, 0xff, 0xea, 0x74, 0xa1, 0x44, 0x1d, 0xd3, 0xad, 0x5b, 0x4e, 0x73, 0x89, + 0x07, 0x94, 0x32, 0x1a, 0x0f, 0x76, 0xa8, 0xef, 0x1b, 0x4d, 0x8a, 0xd1, 0xf6, 0xe4, 0xcf, 0xa2, + 0x06, 0x90, 0x17, 0x06, 0xf0, 0xfd, 0x4b, 0x1a, 0x40, 0x4a, 0xdf, 0x5f, 0x7c, 0xe8, 0xc9, 0xef, + 0x67, 0xa0, 0xd8, 0xa1, 0x9e, 0x6f, 0xf9, 0x8c, 0x3a, 0x26, 0x55, 0xe1, 0xef, 0xde, 0x25, 0x75, + 0x12, 0xba, 0xec, 0x85, 0x6c, 0x2b, 0x33, 0xbc, 0xc7, 0x22, 0x00, 0x8c, 0x0a, 0xbd, 0x9c, 0xfd, + 0x3d, 0x84, 0x6b, 0xab, 0x06, 0x33, 0x5b, 0xdd, 0x8e, 0x8c, 0xbf, 0x5d, 0xcf, 0xe0, 0x93, 0x00, + 0x77, 0x4b, 0xea, 0x18, 0x35, 0x9b, 0xd6, 0x05, 0x9f, 0x42, 0xe8, 0x96, 0xeb, 0x12, 0x8c, 0x01, + 0x9e, 0x7c, 0x07, 0x8a, 0x6d, 0xe3, 0xe1, 0x9a, 0x6a, 0xa9, 0xec, 0xef, 0xaa, 0x22, 0x2f, 0xee, + 0x84, 0x28, 0x8c, 0xd2, 0x2d, 0xfe, 0x00, 0xae, 0x49, 0x91, 0x3b, 0x46, 0x27, 0xf2, 0x6d, 0x3c, + 0x14, 0x3a, 0x3c, 0x1a, 0x24, 0x42, 0xa1, 0x08, 0x05, 0x02, 0x43, 0xd6, 0x60, 0xd6, 0xf4, 0xa8, + 0xc1, 0xe8, 0x66, 0x63, 0xd7, 0x65, 0xeb, 0x0f, 0x2d, 0x9f, 0x09, 0xa9, 0x85, 0x4a, 0x49, 0x51, + 0xcf, 0xae, 0x26, 0xf0, 0xd8, 0xd3, 0x62, 0xf1, 0x6f, 0xf2, 0x40, 0xd6, 0xdb, 0x16, 0x63, 0x34, + 0xe6, 0x78, 0x37, 0x21, 0x5f, 0xf3, 0xdc, 0x23, 0xea, 0x29, 0x05, 0xa6, 0x15, 0xcb, 0x7c, 0x45, + 0x40, 0x51, 0x61, 0xf9, 0x8c, 0xce, 0xe7, 0x77, 0x87, 0xda, 0x3c, 0x30, 0x8e, 0xc5, 0x67, 0xf4, + 0x55, 0x8d, 0xc1, 0x08, 0x15, 0xef, 0x29, 0xf5, 0x4b, 0xc4, 0xbb, 0x6c, 0xbc, 0xa7, 0x56, 0x43, + 0x14, 0x46, 0xe9, 0xc8, 0x3d, 0x28, 0x70, 0x2f, 0x70, 0x82, 0x18, 0x79, 0xe1, 0x08, 0x7c, 0x85, + 0x9b, 0xed, 0xa1, 0x6a, 0x8a, 0x9a, 0x09, 0x67, 0xd8, 0x31, 0x7c, 0xff, 0x81, 0xeb, 0xd5, 0xd5, + 0x82, 0xa2, 0x1f, 0x86, 0x7b, 0xaa, 0x29, 0x6a, 0x26, 0xe9, 0x4b, 0x95, 0xfc, 0x13, 0x59, 0xaa, + 0x4c, 0x5c, 0x74, 0xa9, 0x52, 0x18, 0xf0, 0x52, 0xe5, 0xb3, 0x68, 0x70, 0x9a, 0x14, 0xc1, 0xe9, + 0xc3, 0xcb, 0x06, 0x82, 0x1e, 0xf3, 0x1c, 0xd5, 0xb4, 0xf4, 0xf9, 0x18, 0xcc, 0x26, 0xc3, 0x10, + 0xf9, 0x18, 0x26, 0x4c, 0x19, 0x2b, 0x04, 0x93, 0xe2, 0x72, 0xf5, 0xd2, 0xc1, 0xb7, 0x37, 0xf2, + 0x54, 0x8a, 0x3c, 0xc8, 0x28, 0x0c, 0x06, 0x02, 0xc9, 0x27, 0x19, 0x98, 0x34, 0x83, 0x70, 0xa1, + 0x56, 0x3d, 0x97, 0x16, 0x9f, 0x12, 0x7e, 0x2a, 0x53, 0x67, 0xa7, 0x0b, 0x93, 0x1a, 0x83, 0xa1, + 0xd0, 0xc5, 0x5f, 0x8c, 0x41, 0x31, 0x1a, 0x29, 0xbe, 0x1f, 0x19, 0x6f, 0xd9, 0x1f, 0xbf, 0x16, + 0xf1, 0x22, 0x9d, 0xc5, 0x84, 0x4a, 0x70, 0x6a, 0xee, 0x57, 0xf7, 0x6a, 0x1f, 0x51, 0x93, 0xf1, + 0xc1, 0x09, 0x23, 0x46, 0x08, 0x8b, 0x4c, 0x2f, 0x1d, 0xc8, 0xf9, 0x1d, 0x6a, 0xaa, 0xcf, 0xdd, + 0x1d, 0xc4, 0xb4, 0x22, 0x75, 0xaf, 0x76, 0xa8, 0x19, 0x86, 0x56, 0xfe, 0x0b, 0x85, 0x24, 0xf2, + 0x10, 0xf2, 0x3e, 0x33, 0x58, 0xd7, 0x57, 0x4b, 0xbd, 0xbd, 0x01, 0xca, 0x14, 0x7c, 0xc3, 0x78, + 0x2a, 0x7f, 0xa3, 0x92, 0xb7, 0xf8, 0x65, 0x06, 0x66, 0x22, 0xd4, 0xdb, 0x96, 0xcf, 0xc8, 0x7b, + 0x3d, 0x3d, 0x5c, 0xbe, 0x58, 0x0f, 0xf3, 0xd6, 0xa2, 0x7f, 0xb5, 0x83, 0x04, 0x90, 0x48, 0xef, + 0xba, 0x30, 0x6e, 0x31, 0xda, 0xf6, 0x4b, 0x63, 0xc2, 0x59, 0xdf, 0x18, 0xdc, 0xa7, 0x56, 0xa6, + 0x94, 0xd8, 0xf1, 0x4d, 0x2e, 0x00, 0xa5, 0x9c, 0xc5, 0xff, 0xf8, 0x4e, 0xec, 0x13, 0x79, 0xb7, + 0x8b, 0x94, 0x92, 0x83, 0x2a, 0x5d, 0x7f, 0x37, 0x9c, 0xf5, 0xc2, 0x94, 0x32, 0x82, 0xc3, 0x18, + 0x25, 0x39, 0x86, 0x02, 0xa3, 0xed, 0x8e, 0x6d, 0xb0, 0x20, 0x0b, 0xd8, 0xb8, 0xe4, 0x17, 0x1c, + 0x28, 0x76, 0x32, 0xcc, 0x07, 0xbf, 0x50, 0x8b, 0x21, 0x6d, 0x98, 0xf0, 0xa9, 0x77, 0xdf, 0x32, + 0xa9, 0x32, 0x8f, 0x3b, 0x97, 0x94, 0x58, 0x95, 0xdc, 0xa4, 0xcf, 0xab, 0x1f, 0x18, 0xc8, 0x20, + 0xdf, 0x84, 0x09, 0x8f, 0x76, 0x6c, 0xcb, 0x34, 0xc4, 0xb4, 0x37, 0x2e, 0xc9, 0x50, 0x82, 0x30, + 0xc0, 0x91, 0x1f, 0xc0, 0x78, 0xdb, 0x72, 0x2c, 0x57, 0xa5, 0x04, 0xef, 0x0c, 0xd6, 0x4d, 0xca, + 0x3b, 0x9c, 0xb7, 0x0c, 0xb7, 0x7a, 0x58, 0x05, 0x0c, 0xa5, 0x58, 0x91, 0xa3, 0x9a, 0x6a, 0x19, + 0xa9, 0x56, 0xa5, 0xef, 0x0d, 0x58, 0x07, 0xbd, 0x4a, 0x8d, 0x47, 0xfd, 0x00, 0x8c, 0x5a, 0x3e, + 0xf9, 0x18, 0x72, 0x0d, 0xcb, 0xe6, 0x2b, 0x51, 0xae, 0xc7, 0xdb, 0x03, 0xd6, 0xe3, 0x8e, 0x65, + 0x53, 0xa9, 0x43, 0x98, 0xa2, 0x5a, 0x36, 0x45, 0x21, 0x53, 0x74, 0x84, 0x47, 0x25, 0x8f, 0x01, + 0x25, 0xeb, 0x49, 0x05, 0x50, 0xb1, 0x4f, 0x74, 0x44, 0x00, 0x46, 0x2d, 0x9f, 0xfc, 0x51, 0x06, + 0x26, 0x1e, 0xd0, 0x5a, 0xcb, 0x75, 0x8f, 0xd4, 0x6c, 0xfc, 0xee, 0x80, 0x75, 0x79, 0x4b, 0x72, + 0x97, 0xaa, 0xe8, 0xe5, 0xb1, 0x82, 0x62, 0x20, 0x9c, 0x8f, 0x88, 0xd1, 0x3e, 0xee, 0x94, 0x60, + 0x28, 0x23, 0xb2, 0xd2, 0x3e, 0xee, 0x24, 0x46, 0x64, 0x65, 0x67, 0x7f, 0x0f, 0x85, 0x4c, 0xee, + 0x1a, 0x47, 0x46, 0xe3, 0xc8, 0x28, 0x15, 0x87, 0xe2, 0x1a, 0x5b, 0x9c, 0x77, 0xc2, 0x35, 0x04, + 0x0c, 0xa5, 0x58, 0xfe, 0xed, 0xed, 0x63, 0xc6, 0x4a, 0x57, 0x86, 0xf2, 0xed, 0x3b, 0xc7, 0x8c, + 0x25, 0xbe, 0x7d, 0x67, 0xff, 0xe0, 0x00, 0x85, 0x4c, 0x2e, 0xdb, 0x31, 0x98, 0x5f, 0x9a, 0x1a, + 0x8a, 0xec, 0x5d, 0x83, 0xf9, 0x09, 0xd9, 0xbb, 0x2b, 0x07, 0x55, 0x14, 0x32, 0xc9, 0x7d, 0xc8, + 0xfa, 0x8e, 0x5f, 0x9a, 0x16, 0xa2, 0xdf, 0x1a, 0xb0, 0xe8, 0xaa, 0xa3, 0x24, 0xeb, 0xad, 0xcd, + 0xea, 0x6e, 0x15, 0xb9, 0x40, 0x21, 0xf7, 0xd8, 0x2f, 0xcd, 0x0c, 0x47, 0xee, 0x71, 0x8f, 0xdc, + 0x7d, 0x2e, 0xf7, 0xd8, 0xe7, 0x79, 0x70, 0xbe, 0xd3, 0xad, 0x55, 0xbb, 0xb5, 0xd2, 0xac, 0x90, + 0xfd, 0xbd, 0x01, 0xcb, 0xde, 0x13, 0xcc, 0xa5, 0x78, 0xbd, 0x82, 0x90, 0x40, 0x54, 0x92, 0x85, + 0x12, 0x52, 0x6a, 0x69, 0x6e, 0x28, 0x4a, 0x6c, 0x08, 0x6e, 0x09, 0x25, 0x24, 0x10, 0x95, 0xe4, + 0x40, 0x09, 0xdb, 0xa8, 0x95, 0xc8, 0xb0, 0x94, 0xb0, 0x8d, 0x14, 0x25, 0x6c, 0x43, 0x2a, 0x61, + 0x1b, 0x35, 0x6e, 0xfa, 0xad, 0x7a, 0xc3, 0x2f, 0x5d, 0x1d, 0x8a, 0xe9, 0xdf, 0xad, 0x37, 0x92, + 0xa6, 0x7f, 0x77, 0xed, 0x4e, 0x15, 0x85, 0x4c, 0x1e, 0x72, 0x7c, 0xdb, 0x30, 0x8f, 0x4a, 0xd7, + 0x86, 0x12, 0x72, 0xaa, 0x9c, 0x77, 0x22, 0xe4, 0x08, 0x18, 0x4a, 0xb1, 0xe4, 0xaf, 0x32, 0x50, + 0xf4, 0x99, 0xeb, 0x19, 0x4d, 0xba, 0xe1, 0x59, 0xf5, 0xd2, 0xd3, 0x83, 0xc9, 0xc4, 0x92, 0x6a, + 0x84, 0x12, 0xa4, 0x32, 0x3a, 0x8b, 0x8f, 0x60, 0x30, 0xaa, 0x08, 0xf9, 0xbb, 0x0c, 0x4c, 0x1b, + 0xb1, 0xed, 0xc6, 0xd2, 0x33, 0x42, 0xb7, 0xda, 0xa0, 0xa7, 0x84, 0xf8, 0x9e, 0xa6, 0x50, 0xef, + 0x19, 0xa5, 0xde, 0x74, 0x1c, 0x89, 0x09, 0x8d, 0x84, 0xf9, 0xfa, 0xcc, 0xb3, 0x3a, 0xb4, 0xf4, + 0xec, 0x50, 0xcc, 0xb7, 0x2a, 0x98, 0x27, 0xcc, 0x57, 0x02, 0x51, 0x49, 0x16, 0x53, 0x37, 0x95, + 0xa9, 0x6f, 0xa9, 0x34, 0x94, 0xa9, 0x3b, 0x48, 0xac, 0xe3, 0x53, 0xb7, 0x82, 0x62, 0x20, 0x9c, + 0xdb, 0xb2, 0x47, 0xeb, 0x96, 0x5f, 0x7a, 0x6e, 0x28, 0xb6, 0x8c, 0x9c, 0x77, 0xc2, 0x96, 0x05, + 0x0c, 0xa5, 0x58, 0x1e, 0xce, 0x1d, 0xff, 0xb8, 0x34, 0x3f, 0x94, 0x70, 0xbe, 0xeb, 0x1f, 0x27, + 0xc2, 0xf9, 0x6e, 0x75, 0x1f, 0xb9, 0x40, 0x15, 0xce, 0x6d, 0xdf, 0xf0, 0x4a, 0xdf, 0x18, 0x52, + 0x38, 0xe7, 0xcc, 0x7b, 0xc2, 0x39, 0x07, 0xa2, 0x92, 0x2c, 0xac, 0x40, 0x9c, 0xf6, 0x59, 0x66, + 0xe9, 0xf9, 0xa1, 0x58, 0xc1, 0x86, 0xe4, 0x9e, 0xb0, 0x02, 0x05, 0xc5, 0x40, 0xf8, 0x7c, 0x17, + 0x20, 0xcc, 0x01, 0x52, 0x76, 0x51, 0xf6, 0xa3, 0xbb, 0x28, 0xc5, 0xe5, 0xd7, 0xfa, 0xde, 0x51, + 0xaa, 0xfe, 0xfa, 0x8a, 0xc7, 0xac, 0x86, 0x61, 0xb2, 0xc8, 0x16, 0xcc, 0xfc, 0x9f, 0x67, 0x60, + 0x2a, 0xb6, 0xee, 0x4f, 0x11, 0xdd, 0x8a, 0x8b, 0xc6, 0xc1, 0x6f, 0x86, 0x47, 0x35, 0xfa, 0xe3, + 0x0c, 0x4c, 0xea, 0x0c, 0x20, 0x45, 0x9b, 0x7a, 0x5c, 0x9b, 0xcb, 0xee, 0x57, 0x08, 0x51, 0xe9, + 0x9a, 0xf0, 0xbe, 0x89, 0xa5, 0x02, 0xc3, 0xef, 0x1b, 0x2d, 0x2e, 0x5d, 0xa3, 0x1f, 0x66, 0xe0, + 0x4a, 0x34, 0x21, 0x48, 0x51, 0xc8, 0x8c, 0x2b, 0xb4, 0x73, 0x49, 0x85, 0x94, 0xb4, 0x55, 0xd7, + 0x61, 0xf4, 0x21, 0x4b, 0x8e, 0x93, 0xce, 0x0b, 0x86, 0x3f, 0x4e, 0x89, 0x03, 0xd5, 0x44, 0xaf, + 0x40, 0x98, 0x24, 0xa4, 0xa8, 0x42, 0xe3, 0xaa, 0x5c, 0xf6, 0xe4, 0x44, 0xca, 0x3a, 0xdf, 0x7a, + 0x75, 0xc6, 0x30, 0xfc, 0x5e, 0xe1, 0x99, 0xc8, 0x39, 0x9a, 0xfc, 0x49, 0x06, 0x26, 0x75, 0xfe, + 0x30, 0xfc, 0x4e, 0xe1, 0x79, 0x89, 0x9c, 0xe1, 0x7b, 0x55, 0xf9, 0xc3, 0x0c, 0x14, 0x82, 0x7c, + 0x62, 0xf8, 0x26, 0x5b, 0xdd, 0xad, 0x9e, 0xd3, 0x25, 0x42, 0x8f, 0xe3, 0x91, 0xe9, 0xb1, 0x7f, + 0x9e, 0x1e, 0x9f, 0x66, 0xa0, 0x18, 0xc9, 0x35, 0x52, 0x54, 0x69, 0xc4, 0x55, 0xb9, 0xec, 0x06, + 0xa9, 0x12, 0x76, 0xbe, 0x36, 0x91, 0xa4, 0x63, 0xf8, 0xda, 0x28, 0x61, 0x8f, 0xd4, 0x26, 0xc8, + 0x3e, 0x46, 0xa2, 0x0d, 0x17, 0x76, 0xbe, 0x3b, 0xeb, 0x4c, 0x64, 0xf8, 0xee, 0xcc, 0x33, 0x9c, + 0x47, 0x04, 0xb9, 0x30, 0x2d, 0x19, 0xbe, 0x3f, 0x4b, 0x59, 0xe9, 0xba, 0xfc, 0x65, 0x06, 0x66, + 0x93, 0xb9, 0x49, 0x8a, 0x46, 0x47, 0x71, 0x8d, 0x0e, 0x2f, 0xab, 0x51, 0x44, 0x62, 0xba, 0x5e, + 0x7f, 0x9b, 0x81, 0xab, 0x29, 0x79, 0x49, 0x8a, 0x6a, 0x4e, 0x5c, 0xb5, 0xb7, 0x87, 0x55, 0xe0, + 0x91, 0xb4, 0xec, 0x48, 0x62, 0x32, 0x7c, 0xcb, 0x56, 0xc2, 0xd2, 0xb5, 0xf9, 0x2c, 0x03, 0x57, + 0xa2, 0x09, 0x4a, 0x8a, 0x3a, 0xcd, 0xb8, 0x3a, 0xfb, 0x03, 0x3f, 0x67, 0x4c, 0xda, 0x77, 0x98, + 0xaa, 0x0c, 0xdf, 0xbe, 0xa5, 0xac, 0xf3, 0xe7, 0x89, 0x20, 0x71, 0x19, 0xfe, 0x3c, 0xb1, 0x5b, + 0xdd, 0x7f, 0xe4, 0x3c, 0xa1, 0x93, 0x98, 0x51, 0xcc, 0x13, 0x42, 0xd8, 0xf9, 0x16, 0x13, 0x4d, + 0x66, 0x86, 0x6f, 0x31, 0x81, 0xb4, 0x54, 0x7d, 0x16, 0x19, 0xcc, 0xf5, 0x1c, 0xfc, 0x91, 0x0f, + 0xf5, 0xd1, 0xa2, 0x3c, 0xca, 0xfb, 0xad, 0xfe, 0xf3, 0xa4, 0x47, 0x9f, 0x20, 0xfe, 0x4b, 0x16, + 0x66, 0x12, 0x39, 0x03, 0x59, 0x82, 0x49, 0xc1, 0x4c, 0x94, 0x6b, 0xca, 0xb3, 0xb5, 0x39, 0xd5, + 0x7c, 0x72, 0x3d, 0x40, 0x60, 0x48, 0x43, 0x3e, 0xcf, 0xc0, 0xcc, 0x03, 0x83, 0x99, 0xad, 0x3d, + 0x83, 0xb5, 0xe4, 0x31, 0xf0, 0x80, 0x66, 0x90, 0xb7, 0xe2, 0x5c, 0x2b, 0xcf, 0x2a, 0x3d, 0x66, + 0x12, 0x08, 0x4c, 0xca, 0x27, 0xb7, 0x61, 0xa2, 0xe3, 0xda, 0xb6, 0xe5, 0x34, 0xc5, 0xb1, 0x5b, + 0xa4, 0x16, 0x67, 0x4f, 0x82, 0x31, 0xc0, 0xc7, 0xeb, 0x25, 0x73, 0x03, 0x39, 0x82, 0x49, 0x74, + 0xe9, 0xa8, 0x2a, 0x10, 0xfe, 0x20, 0x0b, 0xa4, 0xd7, 0xca, 0x1e, 0x57, 0xdb, 0x7b, 0x13, 0xf2, + 0x66, 0x38, 0x68, 0x91, 0xea, 0x1d, 0xd5, 0xb7, 0x0a, 0x2b, 0x0b, 0xe6, 0x7c, 0x6a, 0x76, 0x3d, + 0xaa, 0xfa, 0x34, 0x52, 0x30, 0x27, 0xe1, 0xa8, 0x29, 0x62, 0xf5, 0x25, 0xb9, 0xc7, 0xd6, 0x97, + 0x7c, 0xd6, 0x5b, 0xa6, 0xf8, 0xe1, 0xc0, 0xdd, 0x6d, 0x54, 0xc3, 0xf0, 0xcb, 0x09, 0x98, 0xeb, + 0x59, 0x15, 0x92, 0x79, 0x18, 0xb3, 0x64, 0x61, 0x58, 0xb6, 0x02, 0x4a, 0xf4, 0xd8, 0xe6, 0x1a, + 0x8e, 0x59, 0x75, 0xc2, 0xc2, 0x73, 0xb7, 0x61, 0x24, 0xba, 0xf2, 0x10, 0xb8, 0xe7, 0x94, 0xed, + 0x45, 0x18, 0x77, 0x1f, 0x38, 0xd4, 0x53, 0x45, 0x55, 0x7a, 0x3f, 0xed, 0x1e, 0x07, 0xa2, 0xc4, + 0x89, 0x2a, 0x6c, 0xda, 0x71, 0x7d, 0x8b, 0xb9, 0x5e, 0x6f, 0x15, 0xb6, 0xc6, 0x60, 0x84, 0x8a, + 0x2c, 0x42, 0x5e, 0x6a, 0x25, 0x86, 0x72, 0xb2, 0x02, 0xdc, 0x9a, 0xe4, 0x82, 0x02, 0x15, 0x86, + 0xdc, 0x83, 0x82, 0xd1, 0xb1, 0x0e, 0xdc, 0x23, 0xea, 0xa8, 0xaa, 0xa7, 0x7e, 0xea, 0xa9, 0x56, + 0xf6, 0x36, 0x45, 0x53, 0xd4, 0x4c, 0xc8, 0x07, 0x30, 0xa5, 0x3e, 0x4c, 0xb6, 0x51, 0x85, 0x85, + 0x17, 0xe4, 0x3a, 0x77, 0x76, 0xba, 0x30, 0xf5, 0x56, 0xb4, 0x3d, 0xc6, 0xd9, 0xc5, 0xcc, 0xbf, + 0xf0, 0x58, 0xf3, 0xbf, 0x09, 0x79, 0xc3, 0x64, 0xd6, 0x7d, 0x5a, 0x9a, 0x14, 0xb4, 0xda, 0xa9, + 0x56, 0x04, 0x14, 0x15, 0x56, 0x94, 0xb7, 0xf1, 0x41, 0x52, 0xe1, 0x16, 0x12, 0xe5, 0x6d, 0x21, + 0x0a, 0xa3, 0x74, 0xe4, 0x35, 0x98, 0x92, 0x06, 0x52, 0x31, 0x7c, 0x7a, 0x88, 0xdb, 0xa5, 0xa2, + 0x68, 0xf8, 0xb4, 0x6a, 0x38, 0xb5, 0x11, 0x45, 0x62, 0x9c, 0x96, 0xac, 0xc0, 0x8c, 0x04, 0x1c, + 0x76, 0x6c, 0xd7, 0xa8, 0xf3, 0xe6, 0x57, 0x44, 0x73, 0x1d, 0x5e, 0x37, 0xe2, 0x68, 0x4c, 0xd2, + 0x93, 0x37, 0x80, 0xd4, 0xa9, 0x4d, 0x19, 0xbd, 0xeb, 0xba, 0x47, 0xf7, 0x9c, 0x3b, 0x96, 0x63, + 0xf9, 0xad, 0xd2, 0x94, 0xf8, 0xd4, 0x79, 0xc5, 0x85, 0xac, 0xf5, 0x50, 0x60, 0x4a, 0x2b, 0xf2, + 0xa7, 0x51, 0xdf, 0x97, 0xc7, 0x7f, 0x1f, 0x0c, 0x3a, 0x27, 0x1b, 0x95, 0xeb, 0x9f, 0x8d, 0x0b, + 0xd7, 0x8f, 0xa7, 0x60, 0x51, 0xf7, 0xce, 0x8c, 0xce, 0xbd, 0x97, 0x60, 0x92, 0xb3, 0xa5, 0x26, + 0xdb, 0x5c, 0x53, 0xa1, 0x5d, 0xcf, 0xe3, 0x7b, 0x01, 0x02, 0x43, 0x9a, 0x88, 0xdb, 0x66, 0xcf, + 0x75, 0xdb, 0xb7, 0xa1, 0x68, 0x88, 0x3a, 0x74, 0xe9, 0xb9, 0x7d, 0x95, 0x56, 0x8a, 0x92, 0xdc, + 0x95, 0xb0, 0x35, 0x46, 0x59, 0x91, 0x2a, 0x3c, 0x2d, 0xab, 0x63, 0xab, 0xd5, 0xed, 0x37, 0xa9, + 0x67, 0x35, 0x2c, 0x53, 0x16, 0xc7, 0x8e, 0x0b, 0xab, 0x7a, 0x41, 0xa9, 0xfe, 0xf4, 0x7a, 0x1a, + 0x11, 0xa6, 0xb7, 0x55, 0x7e, 0x62, 0x1b, 0xda, 0x4f, 0xf2, 0x3d, 0x7e, 0x12, 0x22, 0x31, 0x4e, + 0x7b, 0x8e, 0x91, 0x17, 0x2e, 0x6f, 0xe4, 0x93, 0x83, 0x32, 0xf2, 0xb8, 0x9d, 0x8d, 0xca, 0xc8, + 0x7f, 0x5a, 0x80, 0x99, 0x44, 0x6e, 0x9f, 0xba, 0x06, 0xcc, 0x3c, 0xe1, 0x35, 0xe0, 0x0d, 0xc8, + 0x31, 0x1e, 0x54, 0xc7, 0xe2, 0x55, 0xd1, 0x22, 0x9a, 0x0a, 0x0c, 0x37, 0x0f, 0xb3, 0x45, 0xcd, + 0xa3, 0xa0, 0xe0, 0x5f, 0xcd, 0x84, 0xda, 0x3c, 0x56, 0xa3, 0x48, 0x8c, 0xd3, 0x92, 0x6f, 0xc1, + 0xa4, 0x51, 0xaf, 0x7b, 0xd4, 0xf7, 0xa9, 0x2f, 0xd6, 0x8d, 0x93, 0xb2, 0x10, 0x72, 0x25, 0x00, + 0x62, 0x88, 0xe7, 0xb3, 0x47, 0xab, 0xde, 0xf0, 0x0f, 0x7d, 0xea, 0x09, 0x83, 0x8e, 0xdc, 0x01, + 0xe0, 0x5d, 0xc9, 0xe1, 0xa8, 0x29, 0x48, 0x1d, 0x66, 0x8e, 0xbc, 0xda, 0xea, 0xaa, 0x61, 0xb6, + 0xa8, 0x9a, 0xcd, 0xf2, 0x7d, 0x5f, 0x23, 0xd9, 0x8a, 0x73, 0xc0, 0x24, 0x4b, 0x25, 0x65, 0x8b, + 0x9e, 0x30, 0xa3, 0xf6, 0x75, 0xe6, 0xcc, 0x40, 0x4a, 0x94, 0x03, 0x26, 0x59, 0xf2, 0x19, 0xee, + 0xc8, 0xab, 0x05, 0x15, 0xd5, 0xc2, 0x7d, 0x22, 0x33, 0xdc, 0x56, 0x88, 0xc2, 0x28, 0x1d, 0xef, + 0xb0, 0x23, 0xaf, 0x86, 0xd4, 0xb0, 0xdb, 0x62, 0x0a, 0x8d, 0x74, 0xd8, 0x96, 0x82, 0xa3, 0xa6, + 0x20, 0x1d, 0x20, 0xfc, 0xeb, 0xc4, 0xb8, 0xeb, 0x42, 0x54, 0x31, 0x9b, 0x16, 0x97, 0x6f, 0xa5, + 0x7d, 0x8d, 0x26, 0x8a, 0x7e, 0xd0, 0x33, 0xdc, 0xa1, 0xb7, 0x7a, 0xf8, 0x60, 0x0a, 0x6f, 0xf2, + 0x0e, 0x3c, 0x7b, 0xe4, 0xd5, 0x54, 0xfd, 0xdd, 0x9e, 0x67, 0x39, 0xa6, 0xd5, 0x31, 0x64, 0x8d, + 0xba, 0x9c, 0x8b, 0x17, 0x94, 0xba, 0xcf, 0x6e, 0xa5, 0x93, 0xe1, 0x79, 0xed, 0xe3, 0x09, 0xc9, + 0x95, 0x81, 0x24, 0x24, 0x09, 0x77, 0x1d, 0x55, 0xa4, 0xf8, 0xe7, 0x0c, 0x10, 0x71, 0xbe, 0xb0, + 0xea, 0x3a, 0x7e, 0xb7, 0x4d, 0xbd, 0x0d, 0xcf, 0xed, 0x76, 0xf8, 0xcc, 0xd4, 0xe4, 0xff, 0x44, + 0xaa, 0x37, 0xf5, 0xcc, 0xb4, 0x11, 0x20, 0x30, 0xa4, 0xe1, 0xab, 0x29, 0xd7, 0xae, 0x53, 0x7d, + 0x67, 0x41, 0xaf, 0xa6, 0xee, 0x09, 0x28, 0x2a, 0x2c, 0xd9, 0x80, 0x39, 0x8f, 0xd6, 0x0c, 0xdb, + 0x70, 0x78, 0x0a, 0xed, 0x19, 0x8c, 0x36, 0x4f, 0x94, 0x4f, 0x3f, 0xa7, 0x9a, 0xcc, 0x61, 0x92, + 0x00, 0x7b, 0xdb, 0x2c, 0x7e, 0x99, 0x87, 0xd9, 0xe4, 0xc1, 0xc8, 0xe3, 0xf2, 0x28, 0x3e, 0xdf, + 0x1a, 0x1e, 0xb3, 0x22, 0x37, 0x3a, 0xc2, 0xf9, 0x36, 0x40, 0x60, 0x48, 0xc3, 0xd7, 0xdf, 0xcc, + 0xed, 0x58, 0x66, 0x72, 0xfd, 0x7d, 0xc0, 0x81, 0x28, 0x71, 0xe9, 0xd7, 0x04, 0x72, 0x23, 0xbb, + 0x26, 0xa0, 0x0a, 0xff, 0xc7, 0x07, 0x5c, 0xf8, 0xdf, 0xdf, 0x45, 0xc9, 0x4f, 0xa3, 0x0e, 0x21, + 0xab, 0x34, 0xdf, 0x1f, 0xf0, 0xa9, 0x57, 0x1f, 0x17, 0x98, 0x7e, 0x94, 0x81, 0x29, 0x33, 0x6a, + 0xcf, 0xea, 0x5a, 0xc4, 0xfe, 0x20, 0x54, 0x8a, 0x39, 0x8a, 0xcc, 0x4a, 0x62, 0x20, 0x8c, 0x8b, + 0x26, 0x7b, 0x70, 0xcd, 0xb6, 0xda, 0x16, 0x93, 0xcb, 0xb4, 0x3d, 0xea, 0x55, 0xa9, 0xe9, 0x3a, + 0x75, 0x11, 0x32, 0xb3, 0x95, 0xe7, 0xd5, 0x67, 0x5c, 0xdb, 0x4e, 0xa1, 0xc1, 0xd4, 0x96, 0xe4, + 0x36, 0x4c, 0xdc, 0xa7, 0x9e, 0xcf, 0x8d, 0x18, 0xe2, 0x97, 0x0b, 0xdf, 0x94, 0x60, 0x0c, 0xf0, + 0x97, 0x8b, 0x0d, 0xff, 0x9a, 0x83, 0x99, 0xc4, 0x81, 0xdf, 0xe3, 0x3c, 0x4c, 0x3b, 0xcc, 0xd8, + 0x23, 0x1c, 0xe6, 0x25, 0x28, 0x98, 0xb6, 0x45, 0x1d, 0xb6, 0x59, 0x57, 0x8e, 0x15, 0xd6, 0xfe, + 0x4a, 0xf8, 0x1a, 0x6a, 0x8a, 0x27, 0xed, 0x5e, 0x51, 0x3f, 0x18, 0xbf, 0xe8, 0x2d, 0x9c, 0xfc, + 0x30, 0x2f, 0x0c, 0x4f, 0x0c, 0x64, 0xbe, 0x49, 0x0c, 0xec, 0xa8, 0xe6, 0x9b, 0x7f, 0xcc, 0xc1, + 0x6c, 0xf2, 0xe8, 0xf6, 0x71, 0x46, 0x75, 0x1b, 0x26, 0xfc, 0xae, 0xb8, 0x49, 0xa2, 0xcc, 0x4a, + 0xdb, 0x7b, 0x55, 0x82, 0x31, 0xc0, 0xa7, 0x1b, 0x4b, 0xf6, 0x89, 0x18, 0x4b, 0xee, 0xa2, 0xc6, + 0x32, 0xe8, 0xc8, 0xfd, 0x69, 0xef, 0x7d, 0xd2, 0xf7, 0x07, 0x7c, 0xd8, 0x3e, 0x2a, 0x6b, 0xf9, + 0xf7, 0x1c, 0x4c, 0xc7, 0x8f, 0x2b, 0xf8, 0x62, 0xb5, 0xe5, 0xfa, 0x4c, 0x2d, 0xe1, 0x95, 0xcd, + 0xe8, 0xc5, 0xea, 0xdd, 0x10, 0x85, 0x51, 0xba, 0x8b, 0x05, 0xa6, 0xdb, 0x30, 0xa1, 0x6e, 0x28, + 0xaa, 0xb8, 0xa4, 0x0d, 0x4d, 0xdd, 0x62, 0xc4, 0x00, 0xff, 0x7f, 0x51, 0xc9, 0xf6, 0xc9, 0x0f, + 0x7b, 0xa3, 0xd2, 0xbb, 0x03, 0x3d, 0x9b, 0x1a, 0xd9, 0x75, 0xf5, 0x71, 0x98, 0xeb, 0x29, 0x59, + 0x88, 0xef, 0xce, 0x64, 0x2e, 0xb0, 0x3b, 0xf3, 0x3a, 0x4c, 0x0b, 0x3b, 0xda, 0x4b, 0xec, 0xe9, + 0xe8, 0x32, 0xd5, 0x83, 0x18, 0x16, 0x13, 0xd4, 0x17, 0x5b, 0x6d, 0xbe, 0x0e, 0xd3, 0x7e, 0xb7, + 0xe6, 0x9b, 0x9e, 0xd5, 0xe1, 0x06, 0xb1, 0xb9, 0xa6, 0x76, 0x7c, 0xb5, 0x90, 0x6a, 0x0c, 0x8b, + 0x09, 0x6a, 0xd2, 0x14, 0xd7, 0x8c, 0xeb, 0xd4, 0x61, 0x96, 0x61, 0xab, 0x9c, 0xb2, 0xaf, 0xdb, + 0xb2, 0xd7, 0xd4, 0x4d, 0xe4, 0x18, 0x0b, 0xec, 0x61, 0x4a, 0x6a, 0x30, 0x2f, 0x77, 0x59, 0xa2, + 0x0a, 0xe9, 0x3d, 0x1a, 0xb9, 0xa4, 0x5c, 0x54, 0x4a, 0xcf, 0xaf, 0x9d, 0x4b, 0x89, 0x8f, 0xe0, + 0xd2, 0xe7, 0x15, 0xd9, 0x2d, 0x98, 0x09, 0xb5, 0xf4, 0xef, 0x58, 0x76, 0x90, 0xeb, 0xfe, 0x3f, + 0xd5, 0xe8, 0xb9, 0x35, 0xda, 0xf1, 0xa8, 0x69, 0x30, 0x5a, 0x5f, 0x8d, 0x13, 0x62, 0xb2, 0xe5, + 0x30, 0xb6, 0x8b, 0x7a, 0x4c, 0x70, 0x54, 0xf6, 0xff, 0x9f, 0x79, 0x6e, 0xff, 0x89, 0xa3, 0x58, + 0xb2, 0x08, 0x79, 0x61, 0x72, 0x3c, 0xc8, 0xea, 0xcd, 0x46, 0x61, 0x8b, 0x3e, 0x2a, 0xcc, 0x05, + 0x36, 0x70, 0xd4, 0xdc, 0x9e, 0x3d, 0x67, 0x6e, 0xef, 0xc0, 0x55, 0x66, 0xfb, 0x07, 0x5e, 0xd7, + 0x67, 0xab, 0xd4, 0x63, 0xbe, 0xb2, 0xc8, 0x5c, 0xdf, 0x0f, 0x80, 0x1c, 0x6c, 0x57, 0x93, 0x5c, + 0x30, 0x8d, 0x35, 0xb7, 0x4b, 0x66, 0xfb, 0x2b, 0xb6, 0xed, 0x3e, 0x08, 0x4e, 0x05, 0xc2, 0x90, + 0xab, 0x82, 0xa9, 0xb6, 0xcb, 0x83, 0xed, 0xea, 0x39, 0x94, 0xf8, 0x08, 0x2e, 0x64, 0x47, 0x7c, + 0xd5, 0x9b, 0x86, 0x6d, 0xd5, 0x0d, 0x46, 0xf9, 0xa4, 0x24, 0x76, 0x56, 0xa4, 0xd1, 0x7f, 0x43, + 0x31, 0xe7, 0x2a, 0x27, 0x49, 0x30, 0xad, 0xdd, 0xb0, 0x9e, 0xa1, 0x49, 0x9d, 0xc3, 0x0a, 0x4f, + 0x64, 0x0e, 0x9b, 0x7c, 0xac, 0xf3, 0xc6, 0xfc, 0x0d, 0x06, 0xe4, 0x6f, 0x09, 0x93, 0x1f, 0x95, + 0xbf, 0xfd, 0x53, 0x0e, 0x66, 0x93, 0xf5, 0x20, 0x5f, 0x77, 0x61, 0x13, 0x7d, 0xf5, 0x60, 0x6c, + 0x10, 0xaf, 0x1e, 0x2c, 0xc1, 0x24, 0x37, 0x3a, 0xbf, 0x63, 0x98, 0xc1, 0x63, 0x0e, 0x7a, 0xda, + 0xdb, 0x0d, 0x10, 0x18, 0xd2, 0x90, 0x79, 0x18, 0xab, 0xd7, 0xd4, 0x5d, 0x56, 0x7d, 0x6c, 0xba, + 0x56, 0xc1, 0xb1, 0x7a, 0x8d, 0xdc, 0x82, 0x82, 0x5a, 0x31, 0x05, 0x27, 0x8d, 0x42, 0xac, 0x5a, + 0x4e, 0xf9, 0xa8, 0xb1, 0xc3, 0x5a, 0xa3, 0x0c, 0x61, 0x63, 0x22, 0x39, 0x72, 0xa3, 0xb2, 0x9a, + 0x5f, 0xe4, 0xe0, 0x6a, 0x4a, 0xbd, 0x76, 0x7c, 0xc0, 0x32, 0x17, 0x18, 0xb0, 0x63, 0xc8, 0x37, + 0x2c, 0x9b, 0x51, 0x6f, 0x40, 0x47, 0xd9, 0x81, 0x52, 0x77, 0x04, 0x53, 0x39, 0x4f, 0xc8, 0xff, + 0x51, 0x09, 0xe2, 0xde, 0x7b, 0x4d, 0x6c, 0x16, 0x06, 0x3b, 0x14, 0xc1, 0x85, 0xda, 0xac, 0x1a, + 0xef, 0x0b, 0x5d, 0x80, 0xdf, 0x48, 0xe1, 0x10, 0xee, 0xa0, 0xa4, 0x61, 0x31, 0x55, 0x2a, 0x59, + 0x05, 0xd0, 0xc5, 0x31, 0xc1, 0xc9, 0xc0, 0x8b, 0x67, 0xa7, 0x0b, 0xa0, 0xab, 0x67, 0xfc, 0x5f, + 0x89, 0x8d, 0xc8, 0x48, 0x6f, 0x8b, 0x39, 0x2d, 0xd2, 0x2c, 0xfe, 0x6e, 0xcf, 0xf8, 0x40, 0xde, + 0xed, 0x49, 0x19, 0xde, 0x91, 0x25, 0xe6, 0x59, 0x98, 0x8e, 0x0f, 0x24, 0xb9, 0x09, 0xf9, 0x8e, + 0x47, 0x1b, 0xd6, 0xc3, 0xe4, 0xa3, 0x31, 0x7b, 0x02, 0x8a, 0x0a, 0x4b, 0x5c, 0xc8, 0xdb, 0x46, + 0x8d, 0xbb, 0xb8, 0x7c, 0x73, 0x60, 0xe3, 0xd2, 0xf7, 0xe7, 0x55, 0x88, 0xd2, 0x02, 0xb7, 0x05, + 0x7b, 0x54, 0x62, 0xb8, 0xc0, 0x86, 0x45, 0xed, 0xba, 0x3c, 0x06, 0x1d, 0x86, 0xc0, 0x3b, 0x82, + 0x3d, 0x2a, 0x31, 0xe4, 0x5d, 0x98, 0x94, 0x2f, 0xed, 0xd4, 0x2b, 0x27, 0x6a, 0x6d, 0xf2, 0xff, + 0x2f, 0x66, 0xb2, 0x07, 0x56, 0x9b, 0x86, 0xee, 0xb8, 0x1a, 0x30, 0xc1, 0x90, 0x1f, 0x59, 0x06, + 0x30, 0x1a, 0x8c, 0x7a, 0x55, 0x66, 0x78, 0x4c, 0x2d, 0x40, 0x74, 0xfd, 0xc6, 0x8a, 0xc6, 0x60, + 0x84, 0x6a, 0xf1, 0x97, 0x39, 0x98, 0x8e, 0xd7, 0x9d, 0x3f, 0xa1, 0x23, 0xec, 0x97, 0xa0, 0x20, + 0x96, 0x82, 0x2b, 0x9e, 0x93, 0x7c, 0xa3, 0xeb, 0x40, 0xc1, 0x51, 0x53, 0x10, 0x84, 0x49, 0xe3, + 0xeb, 0x3d, 0xbb, 0x26, 0xcf, 0xed, 0xf4, 0x83, 0x6b, 0x21, 0x1b, 0xce, 0xd3, 0x0f, 0xc8, 0xfb, + 0x5b, 0x37, 0x0a, 0x9e, 0x1a, 0x8c, 0x21, 0x1b, 0x6e, 0xf9, 0x1e, 0x6d, 0x06, 0xeb, 0xc1, 0x88, + 0xe5, 0xa3, 0x80, 0xa2, 0xc2, 0x92, 0xdb, 0x30, 0xe1, 0xb9, 0x36, 0x5d, 0xc1, 0x5d, 0x75, 0x6c, + 0xad, 0x37, 0x0c, 0x50, 0x82, 0x31, 0xc0, 0x0f, 0x23, 0x59, 0x8e, 0x1b, 0xc0, 0xa8, 0x02, 0xc5, + 0x3f, 0x8c, 0xc3, 0x74, 0xfc, 0xaa, 0x41, 0x7c, 0x58, 0x33, 0x43, 0x18, 0xd6, 0xb1, 0x41, 0x0f, + 0x6b, 0xf6, 0x91, 0xc3, 0xfa, 0x22, 0x8c, 0x1f, 0x77, 0x69, 0x37, 0x78, 0x0b, 0x4e, 0x27, 0xe2, + 0xfb, 0x1c, 0x88, 0x12, 0x47, 0x56, 0x60, 0xe6, 0x81, 0x61, 0x31, 0xee, 0xe0, 0x72, 0x5f, 0x5e, + 0xee, 0xe4, 0x65, 0xa3, 0xc7, 0xdf, 0x31, 0x34, 0x26, 0xe9, 0xfb, 0x31, 0x9f, 0xfe, 0x32, 0xdd, + 0xd7, 0x61, 0x5a, 0x28, 0xb9, 0x62, 0x9a, 0x6e, 0x57, 0xec, 0xb3, 0x17, 0xe2, 0x9b, 0x04, 0xfb, + 0x51, 0xec, 0x1a, 0x26, 0xa8, 0xe3, 0xc6, 0x3a, 0x98, 0x77, 0x26, 0xe2, 0x26, 0x33, 0x2a, 0x63, + 0xfd, 0x3d, 0x28, 0x04, 0x76, 0xc1, 0x33, 0x51, 0xdd, 0x2e, 0xcc, 0x44, 0xb9, 0x89, 0x08, 0x26, + 0x4b, 0x30, 0xe9, 0x76, 0x68, 0xec, 0xb9, 0x37, 0x1d, 0xb7, 0xef, 0x05, 0x08, 0x0c, 0x69, 0xb8, + 0x95, 0x48, 0xa9, 0x89, 0xed, 0x9a, 0x37, 0x39, 0x50, 0x29, 0xb1, 0xf8, 0x49, 0x06, 0x82, 0x27, + 0x60, 0xc8, 0x1a, 0x8c, 0x77, 0x5c, 0x8f, 0xc9, 0x7c, 0xba, 0xb8, 0xbc, 0x90, 0x6e, 0xce, 0xf2, + 0xb8, 0xd9, 0xf5, 0x58, 0xc8, 0x91, 0xff, 0xf2, 0x51, 0x36, 0xe6, 0x7a, 0x9a, 0x76, 0xd7, 0x67, + 0xd4, 0xdb, 0xdc, 0x4b, 0xea, 0xb9, 0x1a, 0x20, 0x30, 0xa4, 0x59, 0xfc, 0xef, 0x2c, 0xcc, 0x26, + 0x6f, 0x57, 0x90, 0x0f, 0x60, 0xca, 0xb7, 0x9a, 0x8e, 0xe5, 0x34, 0x55, 0xc6, 0x9d, 0xe9, 0xbb, + 0x16, 0xaf, 0x1a, 0x6d, 0x8f, 0x71, 0x76, 0xe4, 0x0e, 0x8c, 0x33, 0x51, 0x7f, 0xd4, 0x97, 0xeb, + 0x4e, 0xca, 0xed, 0xae, 0x23, 0xea, 0xa0, 0x6c, 0x1e, 0x9d, 0xd5, 0xb2, 0xa3, 0x9b, 0xd5, 0x3e, + 0xed, 0x2d, 0x38, 0x7e, 0x7f, 0xc0, 0xf7, 0x5b, 0x46, 0xe5, 0x01, 0xff, 0x35, 0x0e, 0xcf, 0xa4, + 0xdf, 0x64, 0x79, 0x42, 0x2b, 0x86, 0xb0, 0x86, 0x6d, 0xec, 0xdc, 0x1a, 0x36, 0xa6, 0x33, 0x94, + 0xec, 0x80, 0x6e, 0xa6, 0xe8, 0x0e, 0x78, 0x44, 0x92, 0x12, 0x5d, 0xcb, 0xe4, 0x1e, 0xbb, 0x96, + 0xb9, 0x09, 0xf9, 0x5a, 0xd7, 0x3c, 0x52, 0xdb, 0xa7, 0xd1, 0x27, 0x15, 0x05, 0x14, 0x15, 0x36, + 0x32, 0xe9, 0xe4, 0x1f, 0x39, 0xe9, 0xf0, 0x49, 0xb4, 0xcb, 0x5a, 0xb2, 0x6a, 0x6f, 0xa2, 0xff, + 0x49, 0x34, 0x68, 0x8b, 0x21, 0x1b, 0x51, 0xe3, 0xda, 0xb1, 0x0e, 0x71, 0x5b, 0xc5, 0xff, 0xb0, + 0xc6, 0x75, 0x6f, 0xf3, 0x10, 0xb7, 0x51, 0x61, 0xc9, 0xe7, 0xbd, 0xf1, 0xde, 0x1c, 0xca, 0xed, + 0xa9, 0x51, 0x59, 0xbd, 0x09, 0x73, 0x3d, 0x63, 0x7e, 0xe1, 0x7c, 0xe6, 0x26, 0xe4, 0xfd, 0x6e, + 0x83, 0xd3, 0x25, 0xca, 0xed, 0xab, 0x02, 0x8a, 0x0a, 0xbb, 0xf8, 0xe3, 0x1c, 0x97, 0x92, 0xb8, + 0xf3, 0xf4, 0x84, 0xbc, 0xea, 0x35, 0x98, 0x92, 0x19, 0xc5, 0x5b, 0x91, 0x2a, 0xf5, 0x42, 0xa4, + 0x4e, 0x2e, 0x8a, 0xc4, 0x38, 0x2d, 0xd9, 0x14, 0x66, 0xd2, 0xf7, 0x9a, 0x1c, 0x94, 0x25, 0xf1, + 0x29, 0x54, 0x31, 0x20, 0x2f, 0x43, 0x51, 0x7c, 0x84, 0xec, 0x72, 0x95, 0x5a, 0x8b, 0xb2, 0xd2, + 0xf5, 0x10, 0x8c, 0x51, 0x9a, 0xf8, 0xce, 0xde, 0xf8, 0x40, 0x76, 0xf6, 0x7a, 0x46, 0x65, 0x64, + 0x59, 0x74, 0x1e, 0xf4, 0x13, 0x73, 0xc4, 0xec, 0x79, 0xe8, 0xef, 0xb7, 0xfb, 0xde, 0xd7, 0x0a, + 0x54, 0x91, 0xfb, 0x66, 0x29, 0xb5, 0x2e, 0x6f, 0x00, 0x51, 0x2f, 0xcb, 0xa9, 0xe5, 0x5b, 0xe4, + 0xf5, 0x77, 0x5d, 0x02, 0x5b, 0xed, 0xa1, 0xc0, 0x94, 0x56, 0xe4, 0x0d, 0xf1, 0x1a, 0x25, 0x33, + 0x2c, 0x47, 0x47, 0xde, 0x17, 0xce, 0x29, 0xcd, 0x93, 0x44, 0xfa, 0x5d, 0x49, 0xf9, 0x13, 0xc3, + 0xe6, 0x64, 0x1d, 0x26, 0xee, 0xbb, 0x76, 0xb7, 0xad, 0xf6, 0x57, 0x8a, 0xcb, 0xf3, 0x69, 0x9c, + 0xde, 0x14, 0x24, 0x91, 0x02, 0x16, 0xd9, 0x04, 0x83, 0xb6, 0x84, 0xc2, 0x8c, 0xd8, 0x5d, 0xb7, + 0xd8, 0x89, 0x72, 0x00, 0x75, 0x5a, 0x75, 0x33, 0x8d, 0xdd, 0x9e, 0x5b, 0xaf, 0xc6, 0xa9, 0xd5, + 0x7b, 0xdd, 0x71, 0x20, 0x26, 0x79, 0x92, 0x3b, 0x50, 0x30, 0x1a, 0x0d, 0xcb, 0xb1, 0xd8, 0x89, + 0xda, 0x82, 0x7c, 0x3e, 0x8d, 0xff, 0x8a, 0xa2, 0x51, 0x57, 0x1c, 0xd4, 0x2f, 0xd4, 0x6d, 0xc9, + 0x21, 0x14, 0x99, 0x6b, 0xab, 0x15, 0xa2, 0xaf, 0xf2, 0xbc, 0xeb, 0x69, 0xac, 0x0e, 0x34, 0x59, + 0xb8, 0xc9, 0x1b, 0xc2, 0x7c, 0x8c, 0xf2, 0x21, 0x7f, 0x91, 0x81, 0x2b, 0x8e, 0x5b, 0xa7, 0x81, + 0xeb, 0xa9, 0x77, 0xe8, 0xde, 0x19, 0xd0, 0xd3, 0x88, 0xe5, 0xdd, 0x08, 0x6f, 0xe9, 0x21, 0xfa, + 0xad, 0xc6, 0x28, 0x0a, 0x63, 0x4a, 0xcc, 0x7f, 0x17, 0xe6, 0x7a, 0x1a, 0xf6, 0xe5, 0x2d, 0x7f, + 0x9d, 0x81, 0x64, 0x8d, 0x30, 0x5f, 0xde, 0xd6, 0x2d, 0x4f, 0x30, 0x3c, 0x49, 0xee, 0x66, 0xae, + 0x05, 0x08, 0x0c, 0x69, 0xc8, 0x0d, 0xc8, 0x75, 0x0c, 0xd6, 0x4a, 0x1e, 0x41, 0x71, 0x96, 0x28, + 0x30, 0x64, 0x19, 0x80, 0xff, 0x45, 0xda, 0xa4, 0x0f, 0x3b, 0x6a, 0xb5, 0xae, 0x37, 0x58, 0xf6, + 0x34, 0x06, 0x23, 0x54, 0x8b, 0x3f, 0xcd, 0xc3, 0x74, 0x3c, 0xf0, 0xf2, 0xe5, 0x01, 0x75, 0xea, + 0x1d, 0xd7, 0x72, 0x58, 0xf2, 0xf1, 0xf2, 0x75, 0x05, 0x47, 0x4d, 0xc1, 0x27, 0x91, 0x36, 0x65, + 0x2d, 0xb7, 0x9e, 0x9c, 0x44, 0x76, 0x04, 0x14, 0x15, 0x56, 0xa8, 0xef, 0x7a, 0x4c, 0xa9, 0x15, + 0xaa, 0xef, 0x7a, 0x0c, 0x05, 0x26, 0x38, 0x41, 0xcb, 0x9d, 0x73, 0x82, 0xd6, 0x84, 0x59, 0xee, + 0xca, 0xd4, 0x5b, 0xa5, 0x1e, 0xfb, 0xda, 0x07, 0xba, 0xd5, 0x04, 0x0b, 0xec, 0x61, 0x2a, 0x5e, + 0xce, 0x17, 0x30, 0xd1, 0xf8, 0x6b, 0x96, 0x3c, 0x57, 0xe3, 0x1c, 0x30, 0xc9, 0x72, 0x18, 0xfb, + 0x24, 0xf1, 0x71, 0xec, 0xa3, 0x8e, 0xf0, 0x10, 0x80, 0xaf, 0xa5, 0xd4, 0xc7, 0x16, 0xfa, 0xf9, + 0xd8, 0x69, 0xb1, 0x79, 0xa7, 0x1b, 0x63, 0x84, 0x11, 0xb9, 0x0b, 0xd3, 0x61, 0xe7, 0x72, 0xfb, + 0x53, 0xe5, 0xd3, 0x37, 0x94, 0x2a, 0xa5, 0xf0, 0x18, 0xba, 0x1a, 0xa3, 0xc3, 0x44, 0x3b, 0xb2, + 0x0e, 0x53, 0xba, 0xff, 0x04, 0x23, 0x88, 0x17, 0x36, 0x27, 0x19, 0x29, 0x32, 0x8c, 0xb7, 0xba, + 0xd4, 0x94, 0x57, 0x29, 0x7f, 0xf1, 0xd5, 0xf5, 0xa7, 0x7e, 0xf6, 0xd5, 0xf5, 0xa7, 0x7e, 0xfe, + 0xd5, 0xf5, 0xa7, 0x3e, 0x39, 0xbb, 0x9e, 0xf9, 0xe2, 0xec, 0x7a, 0xe6, 0x67, 0x67, 0xd7, 0x33, + 0x3f, 0x3f, 0xbb, 0x9e, 0xf9, 0xf2, 0xec, 0x7a, 0xe6, 0xc7, 0xff, 0x76, 0xfd, 0xa9, 0xef, 0x15, + 0x82, 0xd1, 0xf8, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xba, 0x1a, 0x32, 0x49, 0x9d, 0x66, 0x00, + 0x00, } func (m *AMQPEventSource) Marshal() (dAtA []byte, err error) { @@ -1595,6 +1694,18 @@ func (m *CalendarEventSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Persistence != nil { + { + size, err := m.Persistence.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } if len(m.Metadata) > 0 { keysForMetadata := make([]string, 0, len(m.Metadata)) for k := range m.Metadata { @@ -1653,6 +1764,78 @@ func (m *CalendarEventSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *CatchupConfiguration) 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 *CatchupConfiguration) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CatchupConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.MaxDuration) + copy(dAtA[i:], m.MaxDuration) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.MaxDuration))) + i-- + dAtA[i] = 0x12 + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + +func (m *ConfigMapPersistence) 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 *ConfigMapPersistence) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConfigMapPersistence) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.CreateIfNotExist { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *EmitterEventSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1771,6 +1954,53 @@ func (m *EmitterEventSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *EventPersistence) 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 *EventPersistence) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventPersistence) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ConfigMap != nil { + { + size, err := m.ConfigMap.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Catchup != nil { + { + size, err := m.Catchup.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *EventSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5095,6 +5325,34 @@ func (m *CalendarEventSource) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } + if m.Persistence != nil { + l = m.Persistence.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *CatchupConfiguration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + l = len(m.MaxDuration) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ConfigMapPersistence) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 return n } @@ -5138,6 +5396,23 @@ func (m *EmitterEventSource) Size() (n int) { return n } +func (m *EventPersistence) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Catchup != nil { + l = m.Catchup.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ConfigMap != nil { + l = m.ConfigMap.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *EventSource) Size() (n int) { if m == nil { return 0 @@ -6314,17 +6589,40 @@ func (this *CalendarEventSource) String() string { `Timezone:` + fmt.Sprintf("%v", this.Timezone) + `,`, `UserPayload:` + valueToStringGenerated(this.UserPayload) + `,`, `Metadata:` + mapStringForMetadata + `,`, + `Persistence:` + strings.Replace(this.Persistence.String(), "EventPersistence", "EventPersistence", 1) + `,`, `}`, }, "") return s } -func (this *EmitterEventSource) String() string { +func (this *CatchupConfiguration) String() string { if this == nil { return "nil" } - keysForMetadata := make([]string, 0, len(this.Metadata)) - for k := range this.Metadata { - keysForMetadata = append(keysForMetadata, k) + s := strings.Join([]string{`&CatchupConfiguration{`, + `Enabled:` + fmt.Sprintf("%v", this.Enabled) + `,`, + `MaxDuration:` + fmt.Sprintf("%v", this.MaxDuration) + `,`, + `}`, + }, "") + return s +} +func (this *ConfigMapPersistence) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ConfigMapPersistence{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `CreateIfNotExist:` + fmt.Sprintf("%v", this.CreateIfNotExist) + `,`, + `}`, + }, "") + return s +} +func (this *EmitterEventSource) String() string { + if this == nil { + return "nil" + } + keysForMetadata := make([]string, 0, len(this.Metadata)) + for k := range this.Metadata { + keysForMetadata = append(keysForMetadata, k) } github_com_gogo_protobuf_sortkeys.Strings(keysForMetadata) mapStringForMetadata := "map[string]string{" @@ -6346,6 +6644,17 @@ func (this *EmitterEventSource) String() string { }, "") return s } +func (this *EventPersistence) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&EventPersistence{`, + `Catchup:` + strings.Replace(this.Catchup.String(), "CatchupConfiguration", "CatchupConfiguration", 1) + `,`, + `ConfigMap:` + strings.Replace(this.ConfigMap.String(), "ConfigMapPersistence", "ConfigMapPersistence", 1) + `,`, + `}`, + }, "") + return s +} func (this *EventSource) String() string { if this == nil { return "nil" @@ -8336,6 +8645,252 @@ func (m *CalendarEventSource) Unmarshal(dAtA []byte) error { } m.Metadata[mapkey] = mapvalue iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Persistence", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Persistence == nil { + m.Persistence = &EventPersistence{} + } + if err := m.Persistence.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CatchupConfiguration) 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 ErrIntOverflowGenerated + } + 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: CatchupConfiguration: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CatchupConfiguration: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxDuration", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MaxDuration = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConfigMapPersistence) 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 ErrIntOverflowGenerated + } + 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: ConfigMapPersistence: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfigMapPersistence: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateIfNotExist", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CreateIfNotExist = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -8800,6 +9355,131 @@ func (m *EmitterEventSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *EventPersistence) 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 ErrIntOverflowGenerated + } + 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: EventPersistence: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventPersistence: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Catchup", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Catchup == nil { + m.Catchup = &CatchupConfiguration{} + } + if err := m.Catchup.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMap", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConfigMap == nil { + m.ConfigMap = &ConfigMapPersistence{} + } + if err := m.ConfigMap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *EventSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/eventsource/v1alpha1/generated.proto b/pkg/apis/eventsource/v1alpha1/generated.proto index 96bbafb8c9..dc968817d3 100644 --- a/pkg/apis/eventsource/v1alpha1/generated.proto +++ b/pkg/apis/eventsource/v1alpha1/generated.proto @@ -106,6 +106,25 @@ message CalendarEventSource { // Metadata holds the user defined metadata which will passed along the event payload. // +optional map metadata = 6; + + // Persistence hold the configuration for event persistence + optional EventPersistence persistence = 7; +} + +message CatchupConfiguration { + // Enabled enables to triggered the missed schedule when eventsource restarts + optional bool enabled = 1; + + // MaxDuration holds max catchup duration + optional string maxDuration = 2; +} + +message ConfigMapPersistence { + // Name of the configmap + optional string name = 1; + + // CreateIfNotExist will create configmap if it doesn't exists + optional bool createIfNotExist = 2; } // EmitterEventSource describes the event source for emitter @@ -146,6 +165,14 @@ message EmitterEventSource { map metadata = 9; } +message EventPersistence { + // Catchup enables to triggered the missed schedule when eventsource restarts + optional CatchupConfiguration catchup = 1; + + // ConfigMap holds configmap details for persistence + optional ConfigMapPersistence configMap = 2; +} + // EventSource is the definition of a eventsource resource // +genclient // +kubebuilder:resource:shortName=es diff --git a/pkg/apis/eventsource/v1alpha1/openapi_generated.go b/pkg/apis/eventsource/v1alpha1/openapi_generated.go index b5fab2c38b..404c8996e5 100644 --- a/pkg/apis/eventsource/v1alpha1/openapi_generated.go +++ b/pkg/apis/eventsource/v1alpha1/openapi_generated.go @@ -32,7 +32,10 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AMQPEventSource": schema_pkg_apis_eventsource_v1alpha1_AMQPEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureEventsHubEventSource": schema_pkg_apis_eventsource_v1alpha1_AzureEventsHubEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CalendarEventSource": schema_pkg_apis_eventsource_v1alpha1_CalendarEventSource(ref), + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CatchupConfiguration": schema_pkg_apis_eventsource_v1alpha1_CatchupConfiguration(ref), + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ConfigMapPersistence": schema_pkg_apis_eventsource_v1alpha1_ConfigMapPersistence(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EmitterEventSource": schema_pkg_apis_eventsource_v1alpha1_EmitterEventSource(ref), + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventPersistence": schema_pkg_apis_eventsource_v1alpha1_EventPersistence(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventSource": schema_pkg_apis_eventsource_v1alpha1_EventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventSourceList": schema_pkg_apis_eventsource_v1alpha1_EventSourceList(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventSourceSpec": schema_pkg_apis_eventsource_v1alpha1_EventSourceSpec(ref), @@ -264,10 +267,70 @@ func schema_pkg_apis_eventsource_v1alpha1_CalendarEventSource(ref common.Referen }, }, }, + "persistence": { + SchemaProps: spec.SchemaProps{ + Description: "Persistence hold the configuration for event persistence", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventPersistence"), + }, + }, }, Required: []string{"schedule", "interval"}, }, }, + Dependencies: []string{ + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventPersistence"}, + } +} + +func schema_pkg_apis_eventsource_v1alpha1_CatchupConfiguration(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "enabled": { + SchemaProps: spec.SchemaProps{ + Description: "Enabled enables to triggered the missed schedule when eventsource restarts", + Type: []string{"boolean"}, + Format: "", + }, + }, + "maxDuration": { + SchemaProps: spec.SchemaProps{ + Description: "MaxDuration holds max catchup duration", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + } +} + +func schema_pkg_apis_eventsource_v1alpha1_ConfigMapPersistence(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name of the configmap", + Type: []string{"string"}, + Format: "", + }, + }, + "createIfNotExist": { + SchemaProps: spec.SchemaProps{ + Description: "CreateIfNotExist will create configmap if it doesn't exists", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + }, + }, } } @@ -354,6 +417,32 @@ func schema_pkg_apis_eventsource_v1alpha1_EmitterEventSource(ref common.Referenc } } +func schema_pkg_apis_eventsource_v1alpha1_EventPersistence(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "catchup": { + SchemaProps: spec.SchemaProps{ + Description: "Catchup enables to triggered the missed schedule when eventsource restarts", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CatchupConfiguration"), + }, + }, + "configMap": { + SchemaProps: spec.SchemaProps{ + Description: "ConfigMap holds configmap details for persistence", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ConfigMapPersistence"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CatchupConfiguration", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ConfigMapPersistence"}, + } +} + func schema_pkg_apis_eventsource_v1alpha1_EventSource(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/eventsource/v1alpha1/types.go b/pkg/apis/eventsource/v1alpha1/types.go index 1aa809967c..5ae3842bed 100644 --- a/pkg/apis/eventsource/v1alpha1/types.go +++ b/pkg/apis/eventsource/v1alpha1/types.go @@ -182,6 +182,33 @@ type CalendarEventSource struct { // Metadata holds the user defined metadata which will passed along the event payload. // +optional Metadata map[string]string `json:"metadata,omitempty" protobuf:"bytes,6,rep,name=metadata"` + // Persistence hold the configuration for event persistence + Persistence *EventPersistence `json:"persistence,omitempty" protobuf:"bytes,7,opt,name=persistence"` +} + +type EventPersistence struct { + // Catchup enables to triggered the missed schedule when eventsource restarts + Catchup *CatchupConfiguration `json:"catchup,omitempty" protobuf:"bytes,1,opt,name=catchup"` + // ConfigMap holds configmap details for persistence + ConfigMap *ConfigMapPersistence `json:"configMap,omitempty" protobuf:"bytes,2,opt,name=configMap"` +} + +func (ep *EventPersistence) IsCatchUpEnabled() bool { + return ep.Catchup != nil && ep.Catchup.Enabled +} + +type CatchupConfiguration struct { + // Enabled enables to triggered the missed schedule when eventsource restarts + Enabled bool `json:"enabled,omitempty" protobuf:"varint,1,opt,name=enabled"` + // MaxDuration holds max catchup duration + MaxDuration string `json:"maxDuration,omitempty" protobuf:"bytes,2,opt,name=maxDuration"` +} + +type ConfigMapPersistence struct { + // Name of the configmap + Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` + // CreateIfNotExist will create configmap if it doesn't exists + CreateIfNotExist bool `json:"createIfNotExist,omitempty" protobuf:"varint,2,opt,name=createIfNotExist"` } // FileEventSource describes an event-source for file related events. diff --git a/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go index 573b379584..cdf8648e61 100644 --- a/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go @@ -114,6 +114,11 @@ func (in *CalendarEventSource) DeepCopyInto(out *CalendarEventSource) { (*out)[key] = val } } + if in.Persistence != nil { + in, out := &in.Persistence, &out.Persistence + *out = new(EventPersistence) + (*in).DeepCopyInto(*out) + } return } @@ -127,6 +132,38 @@ func (in *CalendarEventSource) DeepCopy() *CalendarEventSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CatchupConfiguration) DeepCopyInto(out *CatchupConfiguration) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CatchupConfiguration. +func (in *CatchupConfiguration) DeepCopy() *CatchupConfiguration { + if in == nil { + return nil + } + out := new(CatchupConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConfigMapPersistence) DeepCopyInto(out *ConfigMapPersistence) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapPersistence. +func (in *ConfigMapPersistence) DeepCopy() *ConfigMapPersistence { + if in == nil { + return nil + } + out := new(ConfigMapPersistence) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EmitterEventSource) DeepCopyInto(out *EmitterEventSource) { *out = *in @@ -170,6 +207,32 @@ func (in *EmitterEventSource) DeepCopy() *EmitterEventSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EventPersistence) DeepCopyInto(out *EventPersistence) { + *out = *in + if in.Catchup != nil { + in, out := &in.Catchup, &out.Catchup + *out = new(CatchupConfiguration) + **out = **in + } + if in.ConfigMap != nil { + in, out := &in.ConfigMap, &out.ConfigMap + *out = new(ConfigMapPersistence) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventPersistence. +func (in *EventPersistence) DeepCopy() *EventPersistence { + if in == nil { + return nil + } + out := new(EventPersistence) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EventSource) DeepCopyInto(out *EventSource) { *out = *in