diff --git a/crates/agent/src/discovers/specs.rs b/crates/agent/src/discovers/specs.rs index 18df28fbcd..10b7c9e612 100644 --- a/crates/agent/src/discovers/specs.rs +++ b/crates/agent/src/discovers/specs.rs @@ -158,6 +158,7 @@ pub fn merge_capture( target: models::Collection::new(format!("{capture_prefix}/{recommended_name}")), disable: discovered_binding.disable, resource: models::RawValue::from_value(&resource), + backfill: 0, }); filtered_bindings.push(discovered_binding); } diff --git a/crates/agent/src/publications/linked_materializations.rs b/crates/agent/src/publications/linked_materializations.rs index 1a0c7bc644..c4a7f5eb6d 100644 --- a/crates/agent/src/publications/linked_materializations.rs +++ b/crates/agent/src/publications/linked_materializations.rs @@ -312,6 +312,7 @@ async fn update_linked_materialization( disable: false, fields: Default::default(), priority: Default::default(), + backfill: 0, }; materialization.bindings.push(binding); } diff --git a/crates/assemble/src/lib.rs b/crates/assemble/src/lib.rs index bc29f163b0..82ea4cd0d4 100644 --- a/crates/assemble/src/lib.rs +++ b/crates/assemble/src/lib.rs @@ -526,21 +526,25 @@ fn push_partitions(fields: &BTreeMap>, out: &mut Vec]) -> String { +pub fn encode_state_key(resource_path: &[impl AsRef], backfill: u32) -> String { let mut parts = Vec::new(); parts.extend(resource_path.iter().map(AsRef::as_ref)); - let mut name = String::new(); + let mut key = String::new(); for c in parts.join("/").chars() { match c { @@ -549,16 +553,20 @@ pub fn encode_resource_path(resource_path: &[impl AsRef]) -> String { // certain positions, no repeats, etc. As a resource_path // potentially contains arbitrary user input, we percent encode any // `/` characters here to avoid duplicating that validation logic. - '-' | '_' | '+' | '.' | '=' => name.push(c), - _ if c.is_alphanumeric() => name.push(c), - c => name.extend(percent_encoding::utf8_percent_encode( + '-' | '_' | '+' | '.' | '=' => key.push(c), + _ if c.is_alphanumeric() => key.push(c), + c => key.extend(percent_encoding::utf8_percent_encode( &c.to_string(), percent_encoding::NON_ALPHANUMERIC, )), } } - name + if backfill != 0 { + key.extend(format!(".v{backfill}").chars()); + } + + key } pub fn compression_codec(t: models::CompressionCodec) -> broker::CompressionCodec { @@ -650,18 +658,28 @@ mod test { } #[test] - fn test_name_escapes() { - let out = encode_resource_path(&vec![ - "he!lo৬".to_string(), - "a/part%".to_string(), - "_¾the-=res+.".to_string(), - ]); - assert_eq!(&out, "he%21lo৬%2Fa%2Fpart%25%2F_¾the-=res+."); + fn test_state_key_escapes() { + let out = encode_state_key(&["table"], 0); + assert_eq!(&out, "table"); + let out = encode_state_key(&["public", "table"], 0); + assert_eq!(&out, "public%2Ftable"); + let out = encode_state_key(&["public", "table"], 1); + assert_eq!(&out, "public%2Ftable.v1"); + + let out = encode_state_key( + &vec![ + "he!lo৬".to_string(), + "a/part%".to_string(), + "_¾the-=res+.".to_string(), + ], + 3, + ); + assert_eq!(&out, "he%21lo৬%2Fa%2Fpart%25%2F_¾the-=res+..v3"); let gross_url = "http://user:password@foo.bar.example.com:9000/hooks///baz?type=critical&test=true"; - let out = encode_resource_path(&vec!["prefix".to_string(), gross_url.to_string()]); - assert_eq!(&out, "prefix%2Fhttp%3A%2F%2Fuser%3Apassword%40foo.bar.example.com%3A9000%2Fhooks%2F%2F%2Fbaz%3Ftype=critical%26test=true"); + let out = encode_state_key(&vec!["prefix".to_string(), gross_url.to_string()], 42); + assert_eq!(&out, "prefix%2Fhttp%3A%2F%2Fuser%3Apassword%40foo.bar.example.com%3A9000%2Fhooks%2F%2F%2Fbaz%3Ftype=critical%26test=true.v42"); } #[test] diff --git a/crates/derive-sqlite/src/validate.rs b/crates/derive-sqlite/src/validate.rs index 91757de668..33c049570d 100644 --- a/crates/derive-sqlite/src/validate.rs +++ b/crates/derive-sqlite/src/validate.rs @@ -29,6 +29,7 @@ pub fn parse_validate( collection: source, lambda_config_json, shuffle_lambda_config_json: _, + backfill: _, } = transform; let source = source.as_ref().unwrap(); diff --git a/crates/flowctl/src/raw/discover.rs b/crates/flowctl/src/raw/discover.rs index 0d56a46715..9da3099066 100644 --- a/crates/flowctl/src/raw/discover.rs +++ b/crates/flowctl/src/raw/discover.rs @@ -129,6 +129,7 @@ pub async fn do_discover( target: collection.clone(), disable: false, resource: models::RawValue::from_string(binding.resource_config_json)?, + backfill: 0, }); collections.insert( diff --git a/crates/json/src/schema/formats.rs b/crates/json/src/schema/formats.rs index 3c00d49897..4e38dbdc05 100644 --- a/crates/json/src/schema/formats.rs +++ b/crates/json/src/schema/formats.rs @@ -44,6 +44,7 @@ pub enum Format { Regex, #[serde(rename = "relative-json-pointer")] RelativeJsonPointer, + #[serde(alias = "uint32", alias = "uint64")] Integer, Number, } @@ -266,6 +267,8 @@ mod test { ("integer", "1_234", true), ("integer", "1.234", false), ("integer", " 1234", false), + ("uint32", "1234", true), + ("uint64", "1234", true), ("number", "1234", true), ("number", "-1234", true), ("number", "1_234", true), diff --git a/crates/models/src/captures.rs b/crates/models/src/captures.rs index 37d7a1446c..edcf957640 100644 --- a/crates/models/src/captures.rs +++ b/crates/models/src/captures.rs @@ -81,6 +81,18 @@ pub struct CaptureBinding { // target, we should turn this into a Target enum as has already been done // with Source (used by Materialization & Derive). pub target: Collection, + /// # Backfill counter for this binding. + /// Every increment of this counter will result in a new backfill of this + /// binding from the captured endpoint. For example when capturing from a + /// SQL table, incrementing this counter will cause the table to be + /// re-captured in its entirety from the source database. + /// + /// Note that a backfill does *not* truncate the target collection, + /// and documents published by a backfilled binding will coexist with + /// (and be ordered after) any documents which were published as part + /// of a preceding backfill. + #[serde(default, skip_serializing_if = "super::is_u32_zero")] + pub backfill: u32, } impl CaptureDef { @@ -111,6 +123,7 @@ impl CaptureBinding { resource: serde_json::from_value(json!({"stream": "a_stream"})).unwrap(), disable: false, target: Collection::new("target/collection"), + backfill: 0, } } } diff --git a/crates/models/src/derivation.rs b/crates/models/src/derivation.rs index 2b60dab409..47521ea5ab 100644 --- a/crates/models/src/derivation.rs +++ b/crates/models/src/derivation.rs @@ -84,11 +84,21 @@ pub struct TransformDef { /// or as a relative URL to a file containing the lambda. #[serde(default, skip_serializing_if = "RawValue::is_null")] pub lambda: RawValue, - /// # Whether to disable this transform. /// Disabled transforms are completely ignored at runtime and are not validated. #[serde(default, skip_serializing_if = "super::is_false")] pub disable: bool, + /// # Backfill counter for this transform. + /// Every increment of this counter will result in a new backfill of this + /// transform. Specifically, the transform's lambda will be re-invoked for + /// every applicable document of its source collection. + /// + /// Note that a backfill does *not* truncate the derived collection, + /// and documents published by a backfilled transform will coexist with + /// (and be ordered after) any documents which were published as part + /// of a preceding backfill. + #[serde(default, skip_serializing_if = "super::is_u32_zero")] + pub backfill: u32, } /// A Shuffle specifies how a shuffling key is to be extracted from diff --git a/crates/models/src/lib.rs b/crates/models/src/lib.rs index 7fa1724acd..05c3ec2bb9 100644 --- a/crates/models/src/lib.rs +++ b/crates/models/src/lib.rs @@ -62,3 +62,7 @@ fn option_datetime_schema(_: &mut schemars::gen::SchemaGenerator) -> schemars::s fn is_false(b: &bool) -> bool { !*b } + +fn is_u32_zero(u: &u32) -> bool { + *u == 0 +} diff --git a/crates/models/src/materializations.rs b/crates/models/src/materializations.rs index 5041138b65..452bb19d2c 100644 --- a/crates/models/src/materializations.rs +++ b/crates/models/src/materializations.rs @@ -62,6 +62,14 @@ pub struct MaterializationBinding { /// # Selected projections for this materialization. #[serde(default)] pub fields: MaterializationFields, + /// # Backfill counter for this binding. + /// Every increment of this counter will result in a new backfill of this + /// binding from its source collection to its materialized resource. + /// For example when materializing to a SQL table, incrementing this counter + /// causes the table to be dropped and then rebuilt by re-reading the source + /// collection. + #[serde(default, skip_serializing_if = "super::is_u32_zero")] + pub backfill: u32, } /// MaterializationFields defines a selection of projections to materialize, @@ -104,6 +112,7 @@ impl MaterializationBinding { disable: false, priority: 0, fields: MaterializationFields::default(), + backfill: 0, } } diff --git a/crates/proto-flow/src/capture.rs b/crates/proto-flow/src/capture.rs index b333206202..c54be53962 100644 --- a/crates/proto-flow/src/capture.rs +++ b/crates/proto-flow/src/capture.rs @@ -89,6 +89,9 @@ pub mod request { pub collection: ::core::option::Option< super::super::super::flow::CollectionSpec, >, + /// Backfill counter for this binding. + #[prost(uint32, tag = "3")] + pub backfill: u32, } } /// Apply a capture configuration and bindings to its endpoint. diff --git a/crates/proto-flow/src/capture.serde.rs b/crates/proto-flow/src/capture.serde.rs index 1d2c1ae3b8..b34289fc39 100644 --- a/crates/proto-flow/src/capture.serde.rs +++ b/crates/proto-flow/src/capture.serde.rs @@ -940,6 +940,9 @@ impl serde::Serialize for request::validate::Binding { if self.collection.is_some() { len += 1; } + if self.backfill != 0 { + len += 1; + } let mut struct_ser = serializer.serialize_struct("capture.Request.Validate.Binding", len)?; if !self.resource_config_json.is_empty() { struct_ser.serialize_field("resourceConfig", crate::as_raw_json(&self.resource_config_json)?)?; @@ -947,6 +950,9 @@ impl serde::Serialize for request::validate::Binding { if let Some(v) = self.collection.as_ref() { struct_ser.serialize_field("collection", v)?; } + if self.backfill != 0 { + struct_ser.serialize_field("backfill", &self.backfill)?; + } struct_ser.end() } } @@ -960,12 +966,14 @@ impl<'de> serde::Deserialize<'de> for request::validate::Binding { "resource_config_json", "resourceConfig", "collection", + "backfill", ]; #[allow(clippy::enum_variant_names)] enum GeneratedField { ResourceConfigJson, Collection, + Backfill, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -989,6 +997,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Binding { match value { "resourceConfig" | "resource_config_json" => Ok(GeneratedField::ResourceConfigJson), "collection" => Ok(GeneratedField::Collection), + "backfill" => Ok(GeneratedField::Backfill), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -1010,6 +1019,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Binding { { let mut resource_config_json__ : Option> = None; let mut collection__ = None; + let mut backfill__ = None; while let Some(k) = map.next_key()? { match k { GeneratedField::ResourceConfigJson => { @@ -1024,11 +1034,20 @@ impl<'de> serde::Deserialize<'de> for request::validate::Binding { } collection__ = map.next_value()?; } + GeneratedField::Backfill => { + if backfill__.is_some() { + return Err(serde::de::Error::duplicate_field("backfill")); + } + backfill__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } } } Ok(request::validate::Binding { resource_config_json: resource_config_json__.map(|r| Box::::from(r).into()).unwrap_or_default(), collection: collection__, + backfill: backfill__.unwrap_or_default(), }) } } diff --git a/crates/proto-flow/src/derive.rs b/crates/proto-flow/src/derive.rs index 2ccb9ca68b..0a0645121e 100644 --- a/crates/proto-flow/src/derive.rs +++ b/crates/proto-flow/src/derive.rs @@ -105,6 +105,9 @@ pub mod request { /// JSON-encoded object which specifies the lambda configuration. #[prost(string, tag = "4")] pub lambda_config_json: ::prost::alloc::string::String, + /// Backfill counter for this transform. + #[prost(uint32, tag = "5")] + pub backfill: u32, } } /// Open a derivation stream. diff --git a/crates/proto-flow/src/derive.serde.rs b/crates/proto-flow/src/derive.serde.rs index 290cdff1f2..7870047b76 100644 --- a/crates/proto-flow/src/derive.serde.rs +++ b/crates/proto-flow/src/derive.serde.rs @@ -1202,6 +1202,9 @@ impl serde::Serialize for request::validate::Transform { if !self.lambda_config_json.is_empty() { len += 1; } + if self.backfill != 0 { + len += 1; + } let mut struct_ser = serializer.serialize_struct("derive.Request.Validate.Transform", len)?; if !self.name.is_empty() { struct_ser.serialize_field("name", &self.name)?; @@ -1215,6 +1218,9 @@ impl serde::Serialize for request::validate::Transform { if !self.lambda_config_json.is_empty() { struct_ser.serialize_field("lambdaConfig", crate::as_raw_json(&self.lambda_config_json)?)?; } + if self.backfill != 0 { + struct_ser.serialize_field("backfill", &self.backfill)?; + } struct_ser.end() } } @@ -1231,6 +1237,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Transform { "shuffleLambdaConfig", "lambda_config_json", "lambdaConfig", + "backfill", ]; #[allow(clippy::enum_variant_names)] @@ -1239,6 +1246,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Transform { Collection, ShuffleLambdaConfigJson, LambdaConfigJson, + Backfill, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -1264,6 +1272,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Transform { "collection" => Ok(GeneratedField::Collection), "shuffleLambdaConfig" | "shuffle_lambda_config_json" => Ok(GeneratedField::ShuffleLambdaConfigJson), "lambdaConfig" | "lambda_config_json" => Ok(GeneratedField::LambdaConfigJson), + "backfill" => Ok(GeneratedField::Backfill), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -1287,6 +1296,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Transform { let mut collection__ = None; let mut shuffle_lambda_config_json__ : Option> = None; let mut lambda_config_json__ : Option> = None; + let mut backfill__ = None; while let Some(k) = map.next_key()? { match k { GeneratedField::Name => { @@ -1313,6 +1323,14 @@ impl<'de> serde::Deserialize<'de> for request::validate::Transform { } lambda_config_json__ = Some(map.next_value()?); } + GeneratedField::Backfill => { + if backfill__.is_some() { + return Err(serde::de::Error::duplicate_field("backfill")); + } + backfill__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } } } Ok(request::validate::Transform { @@ -1320,6 +1338,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Transform { collection: collection__, shuffle_lambda_config_json: shuffle_lambda_config_json__.map(|r| Box::::from(r).into()).unwrap_or_default(), lambda_config_json: lambda_config_json__.map(|r| Box::::from(r).into()).unwrap_or_default(), + backfill: backfill__.unwrap_or_default(), }) } } diff --git a/crates/proto-flow/src/flow.rs b/crates/proto-flow/src/flow.rs index 01eceb5f78..5281af92e2 100644 --- a/crates/proto-flow/src/flow.rs +++ b/crates/proto-flow/src/flow.rs @@ -249,7 +249,7 @@ pub mod collection_spec { pub mod derivation { /// Transforms of the derivation. /// - /// Next tag: 13. + /// Next tag: 14. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Transform { @@ -295,6 +295,10 @@ pub mod collection_spec { /// When set, documents after this timestamp are not processed. #[prost(message, optional, tag = "12")] pub not_after: ::core::option::Option<::pbjson_types::Timestamp>, + /// Backfill counter for this transform. + /// Every increment of this counter results in a new backfill. + #[prost(uint32, tag = "13")] + pub backfill: u32, } #[derive( Clone, @@ -444,6 +448,8 @@ pub mod capture_spec { /// Bindings of endpoint resources and collections into which they're captured. /// Bindings are ordered and unique on the bound collection name, /// and are also unique on the resource path. + /// + /// Next tag: 6. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Binding { @@ -457,6 +463,13 @@ pub mod capture_spec { /// Collection to be captured into. #[prost(message, optional, tag = "3")] pub collection: ::core::option::Option, + /// Backfill counter for this binding. + /// Every increment of this counter results in a new backfill. + #[prost(uint32, tag = "4")] + pub backfill: u32, + /// A suggested key to use for this binding within connector states. + #[prost(string, tag = "5")] + pub state_key: ::prost::alloc::string::String, } /// Type of the capture's connector. #[derive( @@ -532,7 +545,7 @@ pub mod materialization_spec { /// materialized. Bindings are ordered and unique on the bound collection name, /// and are also unique on the resource path. /// - /// Next tag: 12. + /// Next tag: 14. #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Binding { @@ -573,6 +586,13 @@ pub mod materialization_spec { /// When set, documents after this timestamp are not processed. #[prost(message, optional, tag = "11")] pub not_after: ::core::option::Option<::pbjson_types::Timestamp>, + /// Backfill counter for this binding. + /// Every increment of this counter results in a new backfill. + #[prost(uint32, tag = "12")] + pub backfill: u32, + /// A suggested key to use for this binding within connector state. + #[prost(string, tag = "13")] + pub state_key: ::prost::alloc::string::String, } /// Nested message and enum types in `Binding`. pub mod binding { diff --git a/crates/proto-flow/src/flow.serde.rs b/crates/proto-flow/src/flow.serde.rs index e97eff7b52..e6c823d63d 100644 --- a/crates/proto-flow/src/flow.serde.rs +++ b/crates/proto-flow/src/flow.serde.rs @@ -654,6 +654,12 @@ impl serde::Serialize for capture_spec::Binding { if self.collection.is_some() { len += 1; } + if self.backfill != 0 { + len += 1; + } + if !self.state_key.is_empty() { + len += 1; + } let mut struct_ser = serializer.serialize_struct("flow.CaptureSpec.Binding", len)?; if !self.resource_config_json.is_empty() { struct_ser.serialize_field("resourceConfig", crate::as_raw_json(&self.resource_config_json)?)?; @@ -664,6 +670,12 @@ impl serde::Serialize for capture_spec::Binding { if let Some(v) = self.collection.as_ref() { struct_ser.serialize_field("collection", v)?; } + if self.backfill != 0 { + struct_ser.serialize_field("backfill", &self.backfill)?; + } + if !self.state_key.is_empty() { + struct_ser.serialize_field("stateKey", &self.state_key)?; + } struct_ser.end() } } @@ -679,6 +691,9 @@ impl<'de> serde::Deserialize<'de> for capture_spec::Binding { "resource_path", "resourcePath", "collection", + "backfill", + "state_key", + "stateKey", ]; #[allow(clippy::enum_variant_names)] @@ -686,6 +701,8 @@ impl<'de> serde::Deserialize<'de> for capture_spec::Binding { ResourceConfigJson, ResourcePath, Collection, + Backfill, + StateKey, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -710,6 +727,8 @@ impl<'de> serde::Deserialize<'de> for capture_spec::Binding { "resourceConfig" | "resource_config_json" => Ok(GeneratedField::ResourceConfigJson), "resourcePath" | "resource_path" => Ok(GeneratedField::ResourcePath), "collection" => Ok(GeneratedField::Collection), + "backfill" => Ok(GeneratedField::Backfill), + "stateKey" | "state_key" => Ok(GeneratedField::StateKey), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -732,6 +751,8 @@ impl<'de> serde::Deserialize<'de> for capture_spec::Binding { let mut resource_config_json__ : Option> = None; let mut resource_path__ = None; let mut collection__ = None; + let mut backfill__ = None; + let mut state_key__ = None; while let Some(k) = map.next_key()? { match k { GeneratedField::ResourceConfigJson => { @@ -752,12 +773,28 @@ impl<'de> serde::Deserialize<'de> for capture_spec::Binding { } collection__ = map.next_value()?; } + GeneratedField::Backfill => { + if backfill__.is_some() { + return Err(serde::de::Error::duplicate_field("backfill")); + } + backfill__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::StateKey => { + if state_key__.is_some() { + return Err(serde::de::Error::duplicate_field("stateKey")); + } + state_key__ = Some(map.next_value()?); + } } } Ok(capture_spec::Binding { resource_config_json: resource_config_json__.map(|r| Box::::from(r).into()).unwrap_or_default(), resource_path: resource_path__.unwrap_or_default(), collection: collection__, + backfill: backfill__.unwrap_or_default(), + state_key: state_key__.unwrap_or_default(), }) } } @@ -1500,6 +1537,9 @@ impl serde::Serialize for collection_spec::derivation::Transform { if self.not_after.is_some() { len += 1; } + if self.backfill != 0 { + len += 1; + } let mut struct_ser = serializer.serialize_struct("flow.CollectionSpec.Derivation.Transform", len)?; if !self.name.is_empty() { struct_ser.serialize_field("name", &self.name)?; @@ -1537,6 +1577,9 @@ impl serde::Serialize for collection_spec::derivation::Transform { if let Some(v) = self.not_after.as_ref() { struct_ser.serialize_field("notAfter", v)?; } + if self.backfill != 0 { + struct_ser.serialize_field("backfill", &self.backfill)?; + } struct_ser.end() } } @@ -1568,6 +1611,7 @@ impl<'de> serde::Deserialize<'de> for collection_spec::derivation::Transform { "notBefore", "not_after", "notAfter", + "backfill", ]; #[allow(clippy::enum_variant_names)] @@ -1584,6 +1628,7 @@ impl<'de> serde::Deserialize<'de> for collection_spec::derivation::Transform { JournalReadSuffix, NotBefore, NotAfter, + Backfill, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -1617,6 +1662,7 @@ impl<'de> serde::Deserialize<'de> for collection_spec::derivation::Transform { "journalReadSuffix" | "journal_read_suffix" => Ok(GeneratedField::JournalReadSuffix), "notBefore" | "not_before" => Ok(GeneratedField::NotBefore), "notAfter" | "not_after" => Ok(GeneratedField::NotAfter), + "backfill" => Ok(GeneratedField::Backfill), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -1648,6 +1694,7 @@ impl<'de> serde::Deserialize<'de> for collection_spec::derivation::Transform { let mut journal_read_suffix__ = None; let mut not_before__ = None; let mut not_after__ = None; + let mut backfill__ = None; while let Some(k) = map.next_key()? { match k { GeneratedField::Name => { @@ -1726,6 +1773,14 @@ impl<'de> serde::Deserialize<'de> for collection_spec::derivation::Transform { } not_after__ = map.next_value()?; } + GeneratedField::Backfill => { + if backfill__.is_some() { + return Err(serde::de::Error::duplicate_field("backfill")); + } + backfill__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } } } Ok(collection_spec::derivation::Transform { @@ -1741,6 +1796,7 @@ impl<'de> serde::Deserialize<'de> for collection_spec::derivation::Transform { journal_read_suffix: journal_read_suffix__.unwrap_or_default(), not_before: not_before__, not_after: not_after__, + backfill: backfill__.unwrap_or_default(), }) } } @@ -3908,6 +3964,12 @@ impl serde::Serialize for materialization_spec::Binding { if self.not_after.is_some() { len += 1; } + if self.backfill != 0 { + len += 1; + } + if !self.state_key.is_empty() { + len += 1; + } let mut struct_ser = serializer.serialize_struct("flow.MaterializationSpec.Binding", len)?; if !self.resource_config_json.is_empty() { struct_ser.serialize_field("resourceConfig", crate::as_raw_json(&self.resource_config_json)?)?; @@ -3942,6 +4004,12 @@ impl serde::Serialize for materialization_spec::Binding { if let Some(v) = self.not_after.as_ref() { struct_ser.serialize_field("notAfter", v)?; } + if self.backfill != 0 { + struct_ser.serialize_field("backfill", &self.backfill)?; + } + if !self.state_key.is_empty() { + struct_ser.serialize_field("stateKey", &self.state_key)?; + } struct_ser.end() } } @@ -3972,6 +4040,9 @@ impl<'de> serde::Deserialize<'de> for materialization_spec::Binding { "notBefore", "not_after", "notAfter", + "backfill", + "state_key", + "stateKey", ]; #[allow(clippy::enum_variant_names)] @@ -3987,6 +4058,8 @@ impl<'de> serde::Deserialize<'de> for materialization_spec::Binding { JournalReadSuffix, NotBefore, NotAfter, + Backfill, + StateKey, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -4019,6 +4092,8 @@ impl<'de> serde::Deserialize<'de> for materialization_spec::Binding { "journalReadSuffix" | "journal_read_suffix" => Ok(GeneratedField::JournalReadSuffix), "notBefore" | "not_before" => Ok(GeneratedField::NotBefore), "notAfter" | "not_after" => Ok(GeneratedField::NotAfter), + "backfill" => Ok(GeneratedField::Backfill), + "stateKey" | "state_key" => Ok(GeneratedField::StateKey), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -4049,6 +4124,8 @@ impl<'de> serde::Deserialize<'de> for materialization_spec::Binding { let mut journal_read_suffix__ = None; let mut not_before__ = None; let mut not_after__ = None; + let mut backfill__ = None; + let mut state_key__ = None; while let Some(k) = map.next_key()? { match k { GeneratedField::ResourceConfigJson => { @@ -4119,6 +4196,20 @@ impl<'de> serde::Deserialize<'de> for materialization_spec::Binding { } not_after__ = map.next_value()?; } + GeneratedField::Backfill => { + if backfill__.is_some() { + return Err(serde::de::Error::duplicate_field("backfill")); + } + backfill__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::StateKey => { + if state_key__.is_some() { + return Err(serde::de::Error::duplicate_field("stateKey")); + } + state_key__ = Some(map.next_value()?); + } } } Ok(materialization_spec::Binding { @@ -4133,6 +4224,8 @@ impl<'de> serde::Deserialize<'de> for materialization_spec::Binding { journal_read_suffix: journal_read_suffix__.unwrap_or_default(), not_before: not_before__, not_after: not_after__, + backfill: backfill__.unwrap_or_default(), + state_key: state_key__.unwrap_or_default(), }) } } diff --git a/crates/proto-flow/src/materialize.rs b/crates/proto-flow/src/materialize.rs index 8a26435d23..61d89794f6 100644 --- a/crates/proto-flow/src/materialize.rs +++ b/crates/proto-flow/src/materialize.rs @@ -88,6 +88,9 @@ pub mod request { ::prost::alloc::string::String, ::prost::alloc::string::String, >, + /// Backfill counter for this binding. + #[prost(uint32, tag = "4")] + pub backfill: u32, } } /// Apply a materialization configuration and bindings to its endpoint. diff --git a/crates/proto-flow/src/materialize.serde.rs b/crates/proto-flow/src/materialize.serde.rs index b524f2ab5e..f842c77983 100644 --- a/crates/proto-flow/src/materialize.serde.rs +++ b/crates/proto-flow/src/materialize.serde.rs @@ -1650,6 +1650,9 @@ impl serde::Serialize for request::validate::Binding { if !self.field_config_json_map.is_empty() { len += 1; } + if self.backfill != 0 { + len += 1; + } let mut struct_ser = serializer.serialize_struct("materialize.Request.Validate.Binding", len)?; if !self.resource_config_json.is_empty() { struct_ser.serialize_field("resourceConfig", crate::as_raw_json(&self.resource_config_json)?)?; @@ -1660,6 +1663,9 @@ impl serde::Serialize for request::validate::Binding { if !self.field_config_json_map.is_empty() { struct_ser.serialize_field("fieldConfig", &crate::as_raw_json_map(&self.field_config_json_map)?)?; } + if self.backfill != 0 { + struct_ser.serialize_field("backfill", &self.backfill)?; + } struct_ser.end() } } @@ -1675,6 +1681,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Binding { "collection", "field_config_json_map", "fieldConfig", + "backfill", ]; #[allow(clippy::enum_variant_names)] @@ -1682,6 +1689,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Binding { ResourceConfigJson, Collection, FieldConfigJsonMap, + Backfill, } impl<'de> serde::Deserialize<'de> for GeneratedField { fn deserialize(deserializer: D) -> std::result::Result @@ -1706,6 +1714,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Binding { "resourceConfig" | "resource_config_json" => Ok(GeneratedField::ResourceConfigJson), "collection" => Ok(GeneratedField::Collection), "fieldConfig" | "field_config_json_map" => Ok(GeneratedField::FieldConfigJsonMap), + "backfill" => Ok(GeneratedField::Backfill), _ => Err(serde::de::Error::unknown_field(value, FIELDS)), } } @@ -1728,6 +1737,7 @@ impl<'de> serde::Deserialize<'de> for request::validate::Binding { let mut resource_config_json__ : Option> = None; let mut collection__ = None; let mut field_config_json_map__ : Option>> = None; + let mut backfill__ = None; while let Some(k) = map.next_key()? { match k { GeneratedField::ResourceConfigJson => { @@ -1750,12 +1760,21 @@ impl<'de> serde::Deserialize<'de> for request::validate::Binding { map.next_value::>()? ); } + GeneratedField::Backfill => { + if backfill__.is_some() { + return Err(serde::de::Error::duplicate_field("backfill")); + } + backfill__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } } } Ok(request::validate::Binding { resource_config_json: resource_config_json__.map(|r| Box::::from(r).into()).unwrap_or_default(), collection: collection__, field_config_json_map: field_config_json_map__.unwrap_or_default().into_iter().map(|(field, value)| (field, Box::::from(value).into())).collect(), + backfill: backfill__.unwrap_or_default(), }) } } diff --git a/crates/proto-flow/tests/regression.rs b/crates/proto-flow/tests/regression.rs index 127dd55129..a694cd1364 100644 --- a/crates/proto-flow/tests/regression.rs +++ b/crates/proto-flow/tests/regression.rs @@ -176,6 +176,8 @@ fn ex_capture_spec() -> flow::CaptureSpec { resource_config_json: json!({"resource": "config"}).to_string(), resource_path: vec!["some".to_string(), "path".to_string()], collection: Some(ex_collection_spec()), + backfill: 3, + state_key: "a%2Fcdc%2Ftable+baz.v3".to_string(), }], network_ports: ex_network_ports(), } @@ -199,7 +201,7 @@ fn ex_derivation_spec() -> flow::CollectionSpec { read_only: true, shuffle_key: vec!["/shuffle".to_string(), "/key".to_string()], shuffle_lambda_config_json: json!("SELECT $shuffle, $key;").to_string(), - journal_read_suffix: "derive/a/collection/transform_name".to_string(), + journal_read_suffix: "derive/a/collection/transform_name.v2".to_string(), not_before: Some(pbjson_types::Timestamp { seconds: 1691722827, nanos: 0, @@ -208,6 +210,7 @@ fn ex_derivation_spec() -> flow::CollectionSpec { seconds: 1680000000, nanos: 0, }), + backfill: 2, }], shuffle_key_types: vec![ flow::collection_spec::derivation::ShuffleType::String as i32, @@ -251,7 +254,7 @@ fn ex_materialization_spec() -> flow::MaterializationSpec { }), delta_updates: false, deprecated_shuffle: None, - journal_read_suffix: "materialize/acmeCo/materialization/some%20path".to_string(), + journal_read_suffix: "materialize/acmeCo/materialization/some%20path.v1".to_string(), not_before: Some(pbjson_types::Timestamp { seconds: 1691722827, nanos: 0, @@ -260,6 +263,8 @@ fn ex_materialization_spec() -> flow::MaterializationSpec { seconds: 1680000000, nanos: 0, }), + backfill: 1, + state_key: "some%20path.v1".to_string(), }], network_ports: ex_network_ports(), } @@ -369,6 +374,7 @@ fn ex_capture_request() -> capture::Request { bindings: vec![capture::request::validate::Binding { collection: Some(ex_collection_spec()), resource_config_json: json!({"resource":"config"}).to_string(), + backfill: 1, }], }), apply: Some(capture::request::Apply { @@ -444,6 +450,7 @@ fn ex_derive_request() -> derive::Request { collection: Some(ex_collection_spec()), lambda_config_json: json!({"lambda": "config"}).to_string(), shuffle_lambda_config_json: json!({"shuffle": "config"}).to_string(), + backfill: 2, }], shuffle_key_types: vec![ flow::collection_spec::derivation::ShuffleType::Boolean as i32, @@ -530,6 +537,7 @@ fn ex_materialize_request() -> materialize::Request { collection: Some(ex_collection_spec()), resource_config_json: json!({"resource":"config"}).to_string(), field_config_json_map: ex_field_config(), + backfill: 3, }], }), apply: Some(materialize::request::Apply { diff --git a/crates/proto-flow/tests/snapshots/regression__capture_request_json.snap b/crates/proto-flow/tests/snapshots/regression__capture_request_json.snap index 3e04aea267..193f4ef7de 100644 --- a/crates/proto-flow/tests/snapshots/regression__capture_request_json.snap +++ b/crates/proto-flow/tests/snapshots/regression__capture_request_json.snap @@ -83,7 +83,8 @@ expression: json_test(msg) "flags": 4, "maxAppendRate": "4020303" } - } + }, + "backfill": 1 } ] }, @@ -164,7 +165,9 @@ expression: json_test(msg) "flags": 4, "maxAppendRate": "4020303" } - } + }, + "backfill": 3, + "stateKey": "a%2Fcdc%2Ftable+baz.v3" } ], "intervalSeconds": 300, @@ -292,7 +295,9 @@ expression: json_test(msg) "flags": 4, "maxAppendRate": "4020303" } - } + }, + "backfill": 3, + "stateKey": "a%2Fcdc%2Ftable+baz.v3" } ], "intervalSeconds": 300, diff --git a/crates/proto-flow/tests/snapshots/regression__capture_request_proto.snap b/crates/proto-flow/tests/snapshots/regression__capture_request_proto.snap index 31180dd88e..d2c558723b 100644 --- a/crates/proto-flow/tests/snapshots/regression__capture_request_proto.snap +++ b/crates/proto-flow/tests/snapshots/regression__capture_request_proto.snap @@ -5,10 +5,10 @@ expression: proto_test(msg) |0a150807 12117b22 73706563 223a2263| ......{"spec":"c 00000000 |6f6e6669 67227d12 19080712 157b2264| onfig"}......{"d 00000010 |6973636f 76657222 3a22636f 6e666967| iscover":"config 00000020 -|227d1ac6 030a1076 616c6964 6174652f| "}.....validate/ 00000030 +|227d1ac8 030a1076 616c6964 6174652f| "}.....validate/ 00000030 |63617074 75726510 071a157b 2276616c| capture....{"val 00000040 |69646174 65223a22 636f6e66 6967227d| idate":"config"} 00000050 -|2298030a 157b2272 65736f75 72636522| "....{"resource" 00000060 +|229a030a 157b2272 65736f75 72636522| "....{"resource" 00000060 |3a22636f 6e666967 227d12fe 020a1161| :"config"}.....a 00000070 |636d6543 6f2f636f 6c6c6563 74696f6e| cmeCo/collection 00000080 |1a082f6b 65792f6f 6e651a08 2f6b6579| ../key/one../key 00000090 @@ -33,96 +33,100 @@ expression: proto_test(msg) |083e1080 e59a773a 18506174 687b7b50| .>....w:.Path{{P 000001c0 |6f737466 69782e54 656d706c 6174657d| ostfix.Template} 000001d0 |7d300438 cfb0f501 5a117b22 72656164| }0.8....Z.{"read 000001e0 -|223a2273 6368656d 61227d22 b7050aa7| ":"schema"}".... 000001f0 -|050a0e61 636d6543 6f2f6361 70747572| ...acmeCo/captur 00000200 -|6510071a 197b2263 61707475 7265223a| e....{"capture": 00000210 -|7b22636f 6e666967 223a3432 7d7d22a4| {"config":42}}". 00000220 -|030a157b 22726573 6f757263 65223a22| ...{"resource":" 00000230 -|636f6e66 6967227d 1204736f 6d651204| config"}..some.. 00000240 -|70617468 1afe020a 1161636d 65436f2f| path.....acmeCo/ 00000250 -|636f6c6c 65637469 6f6e1a08 2f6b6579| collection../key 00000260 -|2f6f6e65 1a082f6b 65792f74 776f220b| /one../key/two". 00000270 -|2f5f6d65 74612f75 7569642a 04747970| /_meta/uuid*.typ 00000280 -|652a0672 6567696f 6e325d0a 092f6a73| e*.region2]../js 00000290 -|6f6e2f70 74721207 612d6669 656c6420| on/ptr..a-field 000002a0 -|0132450a 07696e74 65676572 0a067374| .2E..integer..st 000002b0 -|72696e67 1a131a03 74797022 04646174| ring....typ".dat 000002c0 -|6530b960 3a03656e 63220574 69746c65| e0.`:.enc".title 000002d0 -|2a046465 7363320e 7b226465 66223a22| *.desc2.{"def":" 000002e0 -|61756c74 227d4001 3a0e7b22 61636b22| ault"}@.:.{"ack" 000002f0 -|3a227472 7565227d 42127b22 77726974| :"true"}B.{"writ 00000300 -|65223a22 73636865 6d61227d 4aa3010a| e":"schema"}J... 00000310 -|12706172 74697469 6f6e2f74 656d706c| .partition/templ 00000320 -|61746510 031a400a 1e0a0f65 73747561| ate...@....estua 00000330 -|72792e64 65762f66 6f6f120b 6c616265| ry.dev/foo..labe 00000340 -|6c2d7661 6c75650a 1e0a0f65 73747561| l-value....estua 00000350 -|72792e64 65762f62 6172120b 6f746865| ry.dev/bar..othe 00000360 -|722d7661 6c756522 4208e9ec 0610031a| r-value"B....... 00000370 -|1273333a 2f2f6275 636b6574 2f707265| .s3://bucket/pre 00000380 -|66697822 0308ac02 3207083e 1080e59a| fix"....2..>.... 00000390 -|773a1850 6174687b 7b506f73 74666978| w:.Path{{Postfix 000003a0 -|2e54656d 706c6174 657d7d30 0438cfb0| .Template}}0.8.. 000003b0 -|f5015a11 7b227265 6164223a 22736368| ..Z.{"read":"sch 000003c0 -|656d6122 7d28ac02 3280010a 0e736861| ema"}(..2....sha 000003d0 -|72642f74 656d706c 6174651a 0f726563| rd/template..rec 000003e0 -|6f766572 792f7072 65666978 220b6869| overy/prefix".hi 000003f0 -|6e742f70 72656669 78280332 02083c48| nt/prefix(.2......w:.Pat 00000650 -|687b7b50 6f737466 69782e54 656d706c| h{{Postfix.Templ 00000660 -|6174657d 7d300438 cfb0f501 5a117b22| ate}}0.8....Z.{" 00000670 -|72656164 223a2273 6368656d 61227d28| read":"schema"}( 00000680 -|ac023280 010a0e73 68617264 2f74656d| ..2....shard/tem 00000690 -|706c6174 651a0f72 65636f76 6572792f| plate..recovery/ 000006a0 -|70726566 6978220b 68696e74 2f707265| prefix".hint/pre 000006b0 -|66697828 03320208 3c480152 400a1e0a| fix(.2.... 00000390 +|e59a773a 18506174 687b7b50 6f737466| ..w:.Path{{Postf 000003a0 +|69782e54 656d706c 6174657d 7d300438| ix.Template}}0.8 000003b0 +|cfb0f501 5a117b22 72656164 223a2273| ....Z.{"read":"s 000003c0 +|6368656d 61227d20 032a1661 25324663| chema"} .*.a%2Fc 000003d0 +|64632532 46746162 6c652b62 617a2e76| dc%2Ftable+baz.v 000003e0 +|3328ac02 3280010a 0e736861 72642f74| 3(..2....shard/t 000003f0 +|656d706c 6174651a 0f726563 6f766572| emplate..recover 00000400 +|792f7072 65666978 220b6869 6e742f70| y/prefix".hint/p 00000410 +|72656669 78280332 02083c48 0152400a| refix(.2......w:.Path{{P 00000670 +|6f737466 69782e54 656d706c 6174657d| ostfix.Template} 00000680 +|7d300438 cfb0f501 5a117b22 72656164| }0.8....Z.{"read 00000690 +|223a2273 6368656d 61227d20 032a1661| ":"schema"} .*.a 000006a0 +|25324663 64632532 46746162 6c652b62| %2Fcdc%2Ftable+b 000006b0 +|617a2e76 3328ac02 3280010a 0e736861| az.v3(..2....sha 000006c0 +|72642f74 656d706c 6174651a 0f726563| rd/template..rec 000006d0 +|6f766572 792f7072 65666978 220b6869| overy/prefix".hi 000006e0 +|6e742f70 72656669 78280332 02083c48| nt/prefix(.2......w:.Path 00000140 |7b7b506f 73746669 782e5465 6d706c61| {{Postfix.Templa 00000150 |74657d7d 300438cf b0f5015a 117b2272| te}}0.8....Z.{"r 00000160 -|65616422 3a227363 68656d61 227d62c5| ead":"schema"}b. 00000170 +|65616422 3a227363 68656d61 227d62ca| ead":"schema"}b. 00000170 |06080112 1c7b2264 65726976 6174696f| .....{"derivatio 00000180 |6e223a7b 22636f6e 66696722 3a34327d| n":{"config":42} 00000190 -|7d1ace04 0a0e7472 616e7366 6f726d5f| }.....transform_ 000001a0 +|7d1ad304 0a0e7472 616e7366 6f726d5f| }.....transform_ 000001a0 |6e616d65 12fe020a 1161636d 65436f2f| name.....acmeCo/ 000001b0 |636f6c6c 65637469 6f6e1a08 2f6b6579| collection../key 000001c0 |2f6f6e65 1a082f6b 65792f74 776f220b| /one../key/two". 000001d0 @@ -61,22 +61,22 @@ expression: proto_test(msg) |73687566 666c6532 042f6b65 793a1822| shuffle2./key:." 00000380 |53454c45 43542024 73687566 666c652c| SELECT $shuffle, 00000390 |20246b65 793b2242 137b226c 616d6264| $key;"B.{"lambd 000003a0 -|61223a22 636f6e66 6967227d 48015222| a":"config"}H.R" 000003b0 +|61223a22 636f6e66 6967227d 48015225| a":"config"}H.R% 000003b0 |64657269 76652f61 2f636f6c 6c656374| derive/a/collect 000003c0 |696f6e2f 7472616e 73666f72 6d5f6e61| ion/transform_na 000003d0 -|6d655a06 08cbc8d6 a6066206 0880888b| meZ.......b..... 000003e0 -|a1062202 03022a80 010a0e73 68617264| .."...*....shard 000003f0 -|2f74656d 706c6174 651a0f72 65636f76| /template..recov 00000400 -|6572792f 70726566 6978220b 68696e74| ery/prefix".hint 00000410 -|2f707265 66697828 03320208 3c480152| /prefix(.2......w:. 00000500 -|50617468 7b7b506f 73746669 782e5465| Path{{Postfix.Te 00000510 -|6d706c61 74657d7d 300438cf b0f5015a| mplate}}0.8....Z 00000520 -|117b2272 65616422 3a227363 68656d61| .{"read":"schema 00000530 -|227d120b 31313a32 323a3333 3a34341a| "}..11:22:33:44. 00000540 -|14153322 11001d77 66554425 bbaa9988| ..3"...wfUD%.... 00000550 -|2dffeedd cc2a1a7b 22636f6e 6e656374| -....*.{"connect 00000560 -|6f72223a 7b227374 61746522 3a34327d| or":{"state":42} 00000570 -|7d223e08 02121209 d2040000 00000000| }">............. 00000580 -|112e1600 00000000 001a160a 095b7472| .............[tr 00000590 -|75652c33 325d1204 564b1e09 1885c39f| ue,32]..VK...... 000005a0 -|15220e7b 22726561 64223a22 646f6322| .".{"read":"doc" 000005b0 -|7d2a0032 660a640a 4a0a1561 2f726561| }*.2f.d.J..a/rea 000005c0 -|642f6a6f 75726e61 6c3b7375 66666978| d/journal;suffix 000005d0 -|123108b9 6012150a 05030908 0507120c| .1..`........... 000005e0 -|09e32100 00000000 0010d708 12150a05| ..!............. 000005f0 -|070c662b 1d120c09 35010000 00000000| ..f+....5....... 00000600 -|10ae1112 160a0e61 6e2f6163 6b2f6a6f| .......an/ack/jo 00000610 -|75726e61 6c120403 0402053a 00a20606| urnal......:.... 00000620 -|12024869 1801| ..Hi.. 00000630 - 00000636 +|28022a02 01023214 66696c65 3a2f2f2f| (.*...2.file:/// 00000370 +|70726f6a 6563742f 726f6f74 3a320a18| project/root:2.. 00000380 +|2f757369 6e672f74 79706573 63726970| /using/typescrip 00000390 +|742f6d6f 64756c65 12166669 6c653a2f| t/module..file:/ 000003a0 +|2f2f7061 74682f74 6f2f696d 706f7274| //path/to/import 000003b0 +|1ac0030a fe020a11 61636d65 436f2f63| ........acmeCo/c 000003c0 +|6f6c6c65 6374696f 6e1a082f 6b65792f| ollection../key/ 000003d0 +|6f6e651a 082f6b65 792f7477 6f220b2f| one../key/two"./ 000003e0 +|5f6d6574 612f7575 69642a04 74797065| _meta/uuid*.type 000003f0 +|2a067265 67696f6e 325d0a09 2f6a736f| *.region2]../jso 00000400 +|6e2f7074 72120761 2d666965 6c642001| n/ptr..a-field . 00000410 +|32450a07 696e7465 6765720a 06737472| 2E..integer..str 00000420 +|696e671a 131a0374 79702204 64617465| ing....typ".date 00000430 +|30b9603a 03656e63 22057469 746c652a| 0.`:.enc".title* 00000440 +|04646573 63320e7b 22646566 223a2261| .desc2.{"def":"a 00000450 +|756c7422 7d40013a 0e7b2261 636b223a| ult"}@.:.{"ack": 00000460 +|22747275 65227d42 127b2277 72697465| "true"}B.{"write 00000470 +|223a2273 6368656d 61227d4a a3010a12| ":"schema"}J.... 00000480 +|70617274 6974696f 6e2f7465 6d706c61| partition/templa 00000490 +|74651003 1a400a1e 0a0f6573 74756172| te...@....estuar 000004a0 +|792e6465 762f666f 6f120b6c 6162656c| y.dev/foo..label 000004b0 +|2d76616c 75650a1e 0a0f6573 74756172| -value....estuar 000004c0 +|792e6465 762f6261 72120b6f 74686572| y.dev/bar..other 000004d0 +|2d76616c 75652242 08e9ec06 10031a12| -value"B........ 000004e0 +|73333a2f 2f627563 6b65742f 70726566| s3://bucket/pref 000004f0 +|69782203 08ac0232 07083e10 80e59a77| ix"....2..>....w 00000500 +|3a185061 74687b7b 506f7374 6669782e| :.Path{{Postfix. 00000510 +|54656d70 6c617465 7d7d3004 38cfb0f5| Template}}0.8... 00000520 +|015a117b 22726561 64223a22 73636865| .Z.{"read":"sche 00000530 +|6d61227d 120b3131 3a32323a 33333a34| ma"}..11:22:33:4 00000540 +|341a1415 33221100 1d776655 4425bbaa| 4...3"...wfUD%.. 00000550 +|99882dff eeddcc2a 1a7b2263 6f6e6e65| ..-....*.{"conne 00000560 +|63746f72 223a7b22 73746174 65223a34| ctor":{"state":4 00000570 +|327d7d22 3e080212 1209d204 00000000| 2}}">........... 00000580 +|0000112e 16000000 0000001a 160a095b| ...............[ 00000590 +|74727565 2c33325d 1204564b 1e091885| true,32]..VK.... 000005a0 +|c39f1522 0e7b2272 65616422 3a22646f| ...".{"read":"do 000005b0 +|63227d2a 0032660a 640a4a0a 15612f72| c"}*.2f.d.J..a/r 000005c0 +|6561642f 6a6f7572 6e616c3b 73756666| ead/journal;suff 000005d0 +|69781231 08b96012 150a0503 09080507| ix.1..`......... 000005e0 +|120c09e3 21000000 00000010 d7081215| ....!........... 000005f0 +|0a05070c 662b1d12 0c093501 00000000| ....f+....5..... 00000600 +|000010ae 1112160a 0e616e2f 61636b2f| .........an/ack/ 00000610 +|6a6f7572 6e616c12 04030402 053a00a2| journal......:.. 00000620 +|06061202 48691801| ....Hi.. 00000630 + 00000638 diff --git a/crates/proto-flow/tests/snapshots/regression__materialization_spec_json.snap b/crates/proto-flow/tests/snapshots/regression__materialization_spec_json.snap index e8b94386b4..d9d9219f86 100644 --- a/crates/proto-flow/tests/snapshots/regression__materialization_spec_json.snap +++ b/crates/proto-flow/tests/snapshots/regression__materialization_spec_json.snap @@ -107,9 +107,11 @@ expression: json_test(msg) "other/field": 42.5 } }, - "journalReadSuffix": "materialize/acmeCo/materialization/some%20path", + "journalReadSuffix": "materialize/acmeCo/materialization/some%20path.v1", "notBefore": "2023-08-11T03:00:27+00:00", - "notAfter": "2023-03-28T10:40:00+00:00" + "notAfter": "2023-03-28T10:40:00+00:00", + "backfill": 1, + "stateKey": "some%20path.v1" } ], "shardTemplate": { diff --git a/crates/proto-flow/tests/snapshots/regression__materialization_spec_proto.snap b/crates/proto-flow/tests/snapshots/regression__materialization_spec_proto.snap index 049391563d..6360204b9b 100644 --- a/crates/proto-flow/tests/snapshots/regression__materialization_spec_proto.snap +++ b/crates/proto-flow/tests/snapshots/regression__materialization_spec_proto.snap @@ -5,7 +5,7 @@ expression: proto_test(msg) |0a166163 6d65436f 2f6d6174 65726961| ..acmeCo/materia 00000000 |6c697a61 74696f6e 10081a1d 7b226d61| lization....{"ma 00000010 |74657269 616c697a 65223a7b 22636f6e| terialize":{"con 00000020 -|66696722 3a34327d 7d228105 0a157b22| fig":42}}"....{" 00000030 +|66696722 3a34327d 7d229605 0a157b22| fig":42}}"....{" 00000030 |7265736f 75726365 223a2263 6f6e6669| resource":"confi 00000040 |67227d12 04736f6d 65120470 6174681a| g"}..some..path. 00000050 |fe020a11 61636d65 436f2f63 6f6c6c65| ....acmeCo/colle 00000060 @@ -41,22 +41,24 @@ expression: proto_test(msg) |73747561 72792e64 65762f66 6f6f120b| stuary.dev/foo.. 00000240 |6c616265 6c2d7661 6c75650a 1e0a0f65| label-value....e 00000250 |73747561 72792e64 65762f62 6172120b| stuary.dev/bar.. 00000260 -|6f746865 722d7661 6c756542 2e6d6174| other-valueB.mat 00000270 +|6f746865 722d7661 6c756542 316d6174| other-valueB1mat 00000270 |65726961 6c697a65 2f61636d 65436f2f| erialize/acmeCo/ 00000280 |6d617465 7269616c 697a6174 696f6e2f| materialization/ 00000290 -|736f6d65 25323070 61746848 03520608| some%20pathH.R.. 000002a0 -|cbc8d6a6 065a0608 80888ba1 062a8001| .....Z.......*.. 000002b0 -|0a0e7368 6172642f 74656d70 6c617465| ..shard/template 000002c0 -|1a0f7265 636f7665 72792f70 72656669| ..recovery/prefi 000002d0 -|78220b68 696e742f 70726566 69782803| x".hint/prefix(. 000002e0 -|3202083c 48015240 0a1e0a0f 65737475| 2......w:. 000003c0 -|50617468 7b7b506f 73746669 782e5465| Path{{Postfix.Te 000003d0 -|6d706c61 74657d7d 300438cf b0f5015a| mplate}}0.8....Z 000003e0 -|117b2272 65616422 3a227363 68656d61| .{"read":"schema 000003f0 -|227d2255 0a076b65 792f6f6e 65120776| "}"U..key/one..v 00000400 -|616c2f74 776f1a0d 666c6f77 5f646f63| al/two..flow_doc 00000410 -|756d656e 74221d0a 07615f66 69656c64| ument"...a_field 00000420 -|12127b22 6669656c 64223a22 636f6e66| ..{"field":"conf 00000430 -|6967227d 22130a0b 6f746865 722f6669| ig"}"...other/fi 00000440 -|656c6412 0434322e 353a420a 400a1e0a| eld..42.5:B.@... 00000450 -|0f657374 75617279 2e646576 2f666f6f| .estuary.dev/foo 00000460 -|120b6c61 62656c2d 76616c75 650a1e0a| ..label-value... 00000470 -|0f657374 75617279 2e646576 2f626172| .estuary.dev/bar 00000480 -|120b6f74 6865722d 76616c75 65422e6d| ..other-valueB.m 00000490 -|61746572 69616c69 7a652f61 636d6543| aterialize/acmeC 000004a0 -|6f2f6d61 74657269 616c697a 6174696f| o/materializatio 000004b0 -|6e2f736f 6d652532 30706174 68480352| n/some%20pathH.R 000004c0 -|0608cbc8 d6a6065a 06088088 8ba1062a| .......Z.......* 000004d0 -|80010a0e 73686172 642f7465 6d706c61| ....shard/templa 000004e0 -|74651a0f 7265636f 76657279 2f707265| te..recovery/pre 000004f0 -|66697822 0b68696e 742f7072 65666978| fix".hint/prefix 00000500 -|28033202 083c4801 52400a1e 0a0f6573| (.2......w:. 00000760 -|50617468 7b7b506f 73746669 782e5465| Path{{Postfix.Te 00000770 -|6d706c61 74657d7d 300438cf b0f5015a| mplate}}0.8....Z 00000780 -|117b2272 65616422 3a227363 68656d61| .{"read":"schema 00000790 -|227d2255 0a076b65 792f6f6e 65120776| "}"U..key/one..v 000007a0 -|616c2f74 776f1a0d 666c6f77 5f646f63| al/two..flow_doc 000007b0 -|756d656e 74221d0a 07615f66 69656c64| ument"...a_field 000007c0 -|12127b22 6669656c 64223a22 636f6e66| ..{"field":"conf 000007d0 -|6967227d 22130a0b 6f746865 722f6669| ig"}"...other/fi 000007e0 -|656c6412 0434322e 353a420a 400a1e0a| eld..42.5:B.@... 000007f0 -|0f657374 75617279 2e646576 2f666f6f| .estuary.dev/foo 00000800 -|120b6c61 62656c2d 76616c75 650a1e0a| ..label-value... 00000810 -|0f657374 75617279 2e646576 2f626172| .estuary.dev/bar 00000820 -|120b6f74 6865722d 76616c75 65422e6d| ..other-valueB.m 00000830 -|61746572 69616c69 7a652f61 636d6543| aterialize/acmeC 00000840 -|6f2f6d61 74657269 616c697a 6174696f| o/materializatio 00000850 -|6e2f736f 6d652532 30706174 68480352| n/some%20pathH.R 00000860 -|0608cbc8 d6a6065a 06088088 8ba1062a| .......Z.......* 00000870 -|80010a0e 73686172 642f7465 6d706c61| ....shard/templa 00000880 -|74651a0f 7265636f 76657279 2f707265| te..recovery/pre 00000890 -|66697822 0b68696e 742f7072 65666978| fix".hint/prefix 000008a0 -|28033202 083c4801 52400a1e 0a0f6573| (.2......w 000003c0 +|3a185061 74687b7b 506f7374 6669782e| :.Path{{Postfix. 000003d0 +|54656d70 6c617465 7d7d3004 38cfb0f5| Template}}0.8... 000003e0 +|015a117b 22726561 64223a22 73636865| .Z.{"read":"sche 000003f0 +|6d61227d 22550a07 6b65792f 6f6e6512| ma"}"U..key/one. 00000400 +|0776616c 2f74776f 1a0d666c 6f775f64| .val/two..flow_d 00000410 +|6f63756d 656e7422 1d0a0761 5f666965| ocument"...a_fie 00000420 +|6c641212 7b226669 656c6422 3a22636f| ld..{"field":"co 00000430 +|6e666967 227d2213 0a0b6f74 6865722f| nfig"}"...other/ 00000440 +|6669656c 64120434 322e353a 420a400a| field..42.5:B.@. 00000450 +|1e0a0f65 73747561 72792e64 65762f66| ...estuary.dev/f 00000460 +|6f6f120b 6c616265 6c2d7661 6c75650a| oo..label-value. 00000470 +|1e0a0f65 73747561 72792e64 65762f62| ...estuary.dev/b 00000480 +|6172120b 6f746865 722d7661 6c756542| ar..other-valueB 00000490 +|316d6174 65726961 6c697a65 2f61636d| 1materialize/acm 000004a0 +|65436f2f 6d617465 7269616c 697a6174| eCo/materializat 000004b0 +|696f6e2f 736f6d65 25323070 6174682e| ion/some%20path. 000004c0 +|76314803 520608cb c8d6a606 5a060880| v1H.R.......Z... 000004d0 +|888ba106 60016a0e 736f6d65 25323070| ....`.j.some%20p 000004e0 +|6174682e 76312a80 010a0e73 68617264| ath.v1*....shard 000004f0 +|2f74656d 706c6174 651a0f72 65636f76| /template..recov 00000500 +|6572792f 70726566 6978220b 68696e74| ery/prefix".hint 00000510 +|2f707265 66697828 03320208 3c480152| /prefix(.2.. 00000770 +|1080e59a 773a1850 6174687b 7b506f73| ....w:.Path{{Pos 00000780 +|74666978 2e54656d 706c6174 657d7d30| tfix.Template}}0 00000790 +|0438cfb0 f5015a11 7b227265 6164223a| .8....Z.{"read": 000007a0 +|22736368 656d6122 7d22550a 076b6579| "schema"}"U..key 000007b0 +|2f6f6e65 12077661 6c2f7477 6f1a0d66| /one..val/two..f 000007c0 +|6c6f775f 646f6375 6d656e74 221d0a07| low_document"... 000007d0 +|615f6669 656c6412 127b2266 69656c64| a_field..{"field 000007e0 +|223a2263 6f6e6669 67227d22 130a0b6f| ":"config"}"...o 000007f0 +|74686572 2f666965 6c641204 34322e35| ther/field..42.5 00000800 +|3a420a40 0a1e0a0f 65737475 6172792e| :B.@....estuary. 00000810 +|6465762f 666f6f12 0b6c6162 656c2d76| dev/foo..label-v 00000820 +|616c7565 0a1e0a0f 65737475 6172792e| alue....estuary. 00000830 +|6465762f 62617212 0b6f7468 65722d76| dev/bar..other-v 00000840 +|616c7565 42316d61 74657269 616c697a| alueB1materializ 00000850 +|652f6163 6d65436f 2f6d6174 65726961| e/acmeCo/materia 00000860 +|6c697a61 74696f6e 2f736f6d 65253230| lization/some%20 00000870 +|70617468 2e763148 03520608 cbc8d6a6| path.v1H.R...... 00000880 +|065a0608 80888ba1 0660016a 0e736f6d| .Z.......`.j.som 00000890 +|65253230 70617468 2e76312a 80010a0e| e%20path.v1*.... 000008a0 +|73686172 642f7465 6d706c61 74651a0f| shard/template.. 000008b0 +|7265636f 76657279 2f707265 66697822| recovery/prefix" 000008c0 +|0b68696e 742f7072 65666978 28033202| .hint/prefix(.2. 000008d0 +|083c4801 52400a1e 0a0f6573 74756172| . anyhow::Result { let flow::capture_spec::Binding { + backfill: _, collection, resource_config_json: _, resource_path, + state_key: _, } = spec; let flow::CollectionSpec { diff --git a/crates/runtime/src/derive/task.rs b/crates/runtime/src/derive/task.rs index ae2977130f..2c2f3bdfc0 100644 --- a/crates/runtime/src/derive/task.rs +++ b/crates/runtime/src/derive/task.rs @@ -103,6 +103,7 @@ impl Task { impl Transform { pub fn new(spec: &flow::collection_spec::derivation::Transform) -> anyhow::Result { let flow::collection_spec::derivation::Transform { + backfill: _, collection, journal_read_suffix: _, lambda_config_json: _, diff --git a/crates/runtime/src/materialize/task.rs b/crates/runtime/src/materialize/task.rs index 936653b5d6..c4a2de690b 100644 --- a/crates/runtime/src/materialize/task.rs +++ b/crates/runtime/src/materialize/task.rs @@ -85,6 +85,7 @@ impl Binding { ser_policy: &doc::SerPolicy, ) -> anyhow::Result { let flow::materialization_spec::Binding { + backfill: _, collection, delta_updates, deprecated_shuffle: _, @@ -96,6 +97,7 @@ impl Binding { priority: _, resource_config_json: _, resource_path: _, + state_key: _, } = spec; let flow::FieldSelection { diff --git a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations-2.snap b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations-2.snap index afe9ae7c87..b0ed0b9613 100644 --- a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations-2.snap +++ b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations-2.snap @@ -79,7 +79,8 @@ Sources { "name": "do-the-thing", "source": "src/collection", "shuffle": "any", - "lambda": 42 + "lambda": 42, + "backfill": 2 } ], "shards": { diff --git a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations-3.snap b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations-3.snap index ed7fd662a9..4b055ad04d 100644 --- a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations-3.snap +++ b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations-3.snap @@ -79,7 +79,8 @@ Sources { "name": "do-the-thing", "source": "src/collection", "shuffle": "any", - "lambda": 42 + "lambda": 42, + "backfill": 2 } ], "shards": { @@ -197,7 +198,7 @@ Sources { resource: test://example/catalog.yaml, content_type: "CATALOG", content: ".. binary ..", - content_dom: {"collections":{"d1/collection":{"schema":"collection.schema.yaml","key":["/d1-key"],"derive":{"using":{"typescript":{"module":"collection.ts"}},"transforms":[{"name":"some-name","source":{"name":"src/collection","partitions":{"include":{"a_field":["foo",42]},"exclude":{"other_field":[false]}},"notBefore":"2017-03-03T03:02:01Z","notAfter":"2019-03-06T09:30:02Z"},"shuffle":{"key":["/shuffle","/key"]},"priority":32,"readDelay":"1h"}]}},"d2/collection":{"schema":"collection.schema.yaml","key":["/d2-key"],"journals":{"fragments":{"compressionCodec":"ZSTANDARD","flushInterval":"15m"}},"derive":{"using":{"connector":{"image":"some/image:tag","config":{"remote":"https://example/api"}}},"transforms":[{"name":"do-the-thing","source":"src/collection","shuffle":"any","lambda":42}],"shards":{"disable":true,"minTxnDuration":"15s","maxTxnDuration":"6m","hotStandbys":2,"ringBufferSize":12345,"readChannelSize":6789}}},"d3/collection":{"writeSchema":"collection.write.schema.yaml","readSchema":"collection.read.schema.yaml","key":["/some/key"],"derive":{"using":{"sqlite":{"migrations":["create table foo(bar int);\n","collection.migration.1.sql"]}},"transforms":[{"name":"frob","source":"src/collection","shuffle":{"lambda":"collection.lambda.frob.shuffle.sql"},"lambda":"collection.lambda.frob.sql"}],"shuffleKeyTypes":["string","integer"]}},"d4/local":{"schema":"local.schema.yaml","key":["/key"],"derive":{"using":{"local":{"command":["some-command","--with-args"],"config":{"some-local":"config"}}},"transforms":[]}}}}, + content_dom: {"collections":{"d1/collection":{"schema":"collection.schema.yaml","key":["/d1-key"],"derive":{"using":{"typescript":{"module":"collection.ts"}},"transforms":[{"name":"some-name","source":{"name":"src/collection","partitions":{"include":{"a_field":["foo",42]},"exclude":{"other_field":[false]}},"notBefore":"2017-03-03T03:02:01Z","notAfter":"2019-03-06T09:30:02Z"},"shuffle":{"key":["/shuffle","/key"]},"priority":32,"readDelay":"1h"}]}},"d2/collection":{"schema":"collection.schema.yaml","key":["/d2-key"],"journals":{"fragments":{"compressionCodec":"ZSTANDARD","flushInterval":"15m"}},"derive":{"using":{"connector":{"image":"some/image:tag","config":{"remote":"https://example/api"}}},"transforms":[{"name":"do-the-thing","source":"src/collection","shuffle":"any","lambda":42,"backfill":2}],"shards":{"disable":true,"minTxnDuration":"15s","maxTxnDuration":"6m","hotStandbys":2,"ringBufferSize":12345,"readChannelSize":6789}}},"d3/collection":{"writeSchema":"collection.write.schema.yaml","readSchema":"collection.read.schema.yaml","key":["/some/key"],"derive":{"using":{"sqlite":{"migrations":["create table foo(bar int);\n","collection.migration.1.sql"]}},"transforms":[{"name":"frob","source":"src/collection","shuffle":{"lambda":"collection.lambda.frob.shuffle.sql"},"lambda":"collection.lambda.frob.sql"}],"shuffleKeyTypes":["string","integer"]}},"d4/local":{"schema":"local.schema.yaml","key":["/key"],"derive":{"using":{"local":{"command":["some-command","--with-args"],"config":{"some-local":"config"}}},"transforms":[]}}}}, }, Resource { resource: test://example/collection.lambda.frob.shuffle.sql, diff --git a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations.snap b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations.snap index 816e0a9cba..93763ee56e 100644 --- a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations.snap +++ b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__derivations.snap @@ -79,7 +79,8 @@ Sources { "name": "do-the-thing", "source": "src/collection", "shuffle": "any", - "lambda": 42 + "lambda": 42, + "backfill": 2 } ], "shards": { @@ -230,7 +231,7 @@ Sources { resource: test://example/catalog.yaml, content_type: "CATALOG", content: ".. binary ..", - content_dom: {"collections":{"d1/collection":{"derive":{"transforms":[{"name":"some-name","priority":32,"readDelay":"1 hour","shuffle":{"key":["/shuffle","/key"]},"source":{"name":"src/collection","notAfter":"2019-03-06T09:30:02Z","notBefore":"2017-03-03T03:02:01Z","partitions":{"exclude":{"other_field":[false]},"include":{"a_field":["foo",42]}}}}],"using":{"typescript":{"module":"catalog.ts"}}},"key":["/d1-key"],"schema":"a-schema.json"},"d2/collection":{"derive":{"shards":{"disable":true,"hotStandbys":2,"maxTxnDuration":"6m","minTxnDuration":"15s","readChannelSize":6789,"ringBufferSize":12345},"transforms":[{"lambda":42,"name":"do-the-thing","shuffle":"any","source":"src/collection"}],"using":{"connector":{"config":{"remote":"https://example/api"},"image":"some/image:tag"}}},"journals":{"fragments":{"compressionCodec":"ZSTANDARD","flushInterval":"15m"}},"key":["/d2-key"],"schema":"a-schema.json"},"d3/collection":{"derive":{"shuffleKeyTypes":["string","integer"],"transforms":[{"lambda":"select 'a long string which makes this a larger lambda' * from foo;\n","name":"frob","shuffle":{"lambda":"sql/shuffle_lambda.sql"},"source":"src/collection"}],"using":{"sqlite":{"migrations":["create table foo(bar int);\n","sql/migration_two.sql"]}}},"key":["/some/key"],"readSchema":"other-schema.json","writeSchema":"a-schema.json"},"d4/local":{"derive":{"transforms":[],"using":{"local":{"command":["some-command","--with-args"],"config":{"some-local":"config"}}}},"key":["/key"],"schema":"a-schema.json"}}}, + content_dom: {"collections":{"d1/collection":{"derive":{"transforms":[{"name":"some-name","priority":32,"readDelay":"1 hour","shuffle":{"key":["/shuffle","/key"]},"source":{"name":"src/collection","notAfter":"2019-03-06T09:30:02Z","notBefore":"2017-03-03T03:02:01Z","partitions":{"exclude":{"other_field":[false]},"include":{"a_field":["foo",42]}}}}],"using":{"typescript":{"module":"catalog.ts"}}},"key":["/d1-key"],"schema":"a-schema.json"},"d2/collection":{"derive":{"shards":{"disable":true,"hotStandbys":2,"maxTxnDuration":"6m","minTxnDuration":"15s","readChannelSize":6789,"ringBufferSize":12345},"transforms":[{"backfill":2,"lambda":42,"name":"do-the-thing","shuffle":"any","source":"src/collection"}],"using":{"connector":{"config":{"remote":"https://example/api"},"image":"some/image:tag"}}},"journals":{"fragments":{"compressionCodec":"ZSTANDARD","flushInterval":"15m"}},"key":["/d2-key"],"schema":"a-schema.json"},"d3/collection":{"derive":{"shuffleKeyTypes":["string","integer"],"transforms":[{"lambda":"select 'a long string which makes this a larger lambda' * from foo;\n","name":"frob","shuffle":{"lambda":"sql/shuffle_lambda.sql"},"source":"src/collection"}],"using":{"sqlite":{"migrations":["create table foo(bar int);\n","sql/migration_two.sql"]}}},"key":["/some/key"],"readSchema":"other-schema.json","writeSchema":"a-schema.json"},"d4/local":{"derive":{"transforms":[],"using":{"local":{"command":["some-command","--with-args"],"config":{"some-local":"config"}}}},"key":["/key"],"schema":"a-schema.json"}}}, }, Resource { resource: test://example/other-schema.json, diff --git a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations-2.snap b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations-2.snap index ee61db1f01..0be2631258 100644 --- a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations-2.snap +++ b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations-2.snap @@ -17,7 +17,8 @@ Sources { "bindings": [ { "resource": "test://example/resource/not/found.yaml", - "target": "some/collection" + "target": "some/collection", + "backfill": 2 } ] }, @@ -93,7 +94,8 @@ Sources { }, { "resource": {"extra":"stuff"}, - "target": "other/collection" + "target": "other/collection", + "backfill": 1 } ] }, @@ -240,7 +242,8 @@ Sources { "source": "some/source/collection", "fields": { "recommended": true - } + }, + "backfill": 3 } ] }, diff --git a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations-3.snap b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations-3.snap index 3313a462ce..174677f025 100644 --- a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations-3.snap +++ b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations-3.snap @@ -17,7 +17,8 @@ Sources { "bindings": [ { "resource": "config-missing.resource.0.config.yaml", - "target": "some/collection" + "target": "some/collection", + "backfill": 2 } ] }, @@ -93,7 +94,8 @@ Sources { }, { "resource": {"extra":"stuff"}, - "target": "other/collection" + "target": "other/collection", + "backfill": 1 } ] }, @@ -264,7 +266,8 @@ Sources { "source": "some/source/collection", "fields": { "recommended": true - } + }, + "backfill": 3 } ] }, @@ -294,7 +297,7 @@ Sources { resource: test://example/catalog.yaml, content_type: "CATALOG", content: ".. binary ..", - content_dom: {"captures":{"capture/config-missing":{"endpoint":{"connector":{"image":"another/image","config":"config-missing.config.yaml"}},"bindings":[{"resource":"config-missing.resource.0.config.yaml","target":"some/collection"}]},"capture/config-raw":{"endpoint":{"connector":{"image":"another/image","config":"config-raw.config.yaml"}},"bindings":[]},"capture/local":{"endpoint":{"local":{"command":["do-the-thing","--arg=one","--arg","two"],"config":{"some":"local config"}}},"bindings":[]},"capture/second":{"endpoint":{"connector":{"image":"another/image","config":"second.config.yaml"}},"bindings":[{"resource":"second.resource.0.config.yaml","target":"third/collection"}],"interval":"3m","shards":{"maxTxnDuration":"30s","logLevel":"debug"}},"first/capture":{"endpoint":{"connector":{"image":"an/image","config":"capture.config.yaml"}},"bindings":[{"resource":{"stream":"contents"},"target":"a/collection"},{"resource":{"extra":"stuff"},"target":"other/collection"}]}},"materializations":{"a/materialization":{"sourceCapture":"a/capture","endpoint":{"connector":{"image":"materialization/image","config":{"its":"config"}}},"bindings":[{"resource":{"table":"table_one"},"source":"source/collection","fields":{"recommended":true}},{"resource":{"table":"table_two"},"source":{"name":"other/source/collection","partitions":{"include":{"a_field":["some-val"]},"exclude":{"other":[42]}}},"fields":{"include":{"add":{}},"exclude":["del"],"recommended":true}}]},"materialization/local":{"endpoint":{"local":{"command":["do-the-thing","--arg=one","--arg","two"],"config":{"some":"local config"}}},"bindings":[{"resource":{"table":"table_three"},"source":"final/source/collection","fields":{"recommended":true}}],"shards":{"ringBufferSize":12345}},"materialization/missing-config":{"endpoint":{"connector":{"image":"materialization/image","config":"missing-config.config.yaml"}},"bindings":[{"resource":"missing-config.resource.0.config.yaml","source":"other/source/collection","fields":{"recommended":true}}]},"materialization/with-config":{"endpoint":{"connector":{"image":"materialization/another:image","config":"with-config.config.yaml"}},"bindings":[{"resource":"with-config.resource.0.config.yaml","source":"some/source/collection","fields":{"recommended":true}}]},"materialization/with-config-fragment":{"endpoint":{"connector":{"image":"materialization/another:image","config":"with-config-fragment.config.yaml"}},"bindings":[]}}}, + content_dom: {"captures":{"capture/config-missing":{"endpoint":{"connector":{"image":"another/image","config":"config-missing.config.yaml"}},"bindings":[{"resource":"config-missing.resource.0.config.yaml","target":"some/collection","backfill":2}]},"capture/config-raw":{"endpoint":{"connector":{"image":"another/image","config":"config-raw.config.yaml"}},"bindings":[]},"capture/local":{"endpoint":{"local":{"command":["do-the-thing","--arg=one","--arg","two"],"config":{"some":"local config"}}},"bindings":[]},"capture/second":{"endpoint":{"connector":{"image":"another/image","config":"second.config.yaml"}},"bindings":[{"resource":"second.resource.0.config.yaml","target":"third/collection"}],"interval":"3m","shards":{"maxTxnDuration":"30s","logLevel":"debug"}},"first/capture":{"endpoint":{"connector":{"image":"an/image","config":"capture.config.yaml"}},"bindings":[{"resource":{"stream":"contents"},"target":"a/collection"},{"resource":{"extra":"stuff"},"target":"other/collection","backfill":1}]}},"materializations":{"a/materialization":{"sourceCapture":"a/capture","endpoint":{"connector":{"image":"materialization/image","config":{"its":"config"}}},"bindings":[{"resource":{"table":"table_one"},"source":"source/collection","fields":{"recommended":true}},{"resource":{"table":"table_two"},"source":{"name":"other/source/collection","partitions":{"include":{"a_field":["some-val"]},"exclude":{"other":[42]}}},"fields":{"include":{"add":{}},"exclude":["del"],"recommended":true}}]},"materialization/local":{"endpoint":{"local":{"command":["do-the-thing","--arg=one","--arg","two"],"config":{"some":"local config"}}},"bindings":[{"resource":{"table":"table_three"},"source":"final/source/collection","fields":{"recommended":true}}],"shards":{"ringBufferSize":12345}},"materialization/missing-config":{"endpoint":{"connector":{"image":"materialization/image","config":"missing-config.config.yaml"}},"bindings":[{"resource":"missing-config.resource.0.config.yaml","source":"other/source/collection","fields":{"recommended":true}}]},"materialization/with-config":{"endpoint":{"connector":{"image":"materialization/another:image","config":"with-config.config.yaml"}},"bindings":[{"resource":"with-config.resource.0.config.yaml","source":"some/source/collection","fields":{"recommended":true},"backfill":3}]},"materialization/with-config-fragment":{"endpoint":{"connector":{"image":"materialization/another:image","config":"with-config-fragment.config.yaml"}},"bindings":[]}}}, }, Resource { resource: test://example/config-missing.config.yaml, diff --git a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations.snap b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations.snap index 22644d6c7b..4dc71b3142 100644 --- a/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations.snap +++ b/crates/sources/src/scenarios/snapshots/sources__scenarios__test__endpoints_captures_materializations.snap @@ -17,7 +17,8 @@ Sources { "bindings": [ { "resource": "resource/not/found.yaml", - "target": "some/collection" + "target": "some/collection", + "backfill": 2 } ] }, @@ -93,7 +94,8 @@ Sources { }, { "resource": {"extra":"stuff"}, - "target": "other/collection" + "target": "other/collection", + "backfill": 1 } ] }, @@ -306,7 +308,8 @@ Sources { "source": "some/source/collection", "fields": { "recommended": true - } + }, + "backfill": 3 } ] }, @@ -330,7 +333,7 @@ Sources { resource: test://example/catalog.yaml, content_type: "CATALOG", content: ".. binary ..", - content_dom: {"captures":{"capture/config-missing":{"bindings":[{"resource":"resource/not/found.yaml","target":"some/collection"}],"endpoint":{"connector":{"config":"config/not/found.yaml","image":"another/image"}}},"capture/config-raw":{"bindings":[],"endpoint":{"connector":{"config":"raw-config.foo","image":"another/image"}}},"capture/local":{"bindings":[],"endpoint":{"local":{"command":["do-the-thing","--arg=one","--arg","two"],"config":{"some":"local config"}}}},"capture/second":{"bindings":[{"resource":"referenced/resource.yaml","target":"third/collection"}],"endpoint":{"connector":{"config":"referenced/config.yaml","image":"another/image"}},"interval":"3m","shards":{"logLevel":"debug","maxTxnDuration":"30s"}},"first/capture":{"bindings":[{"resource":{"stream":"contents"},"target":"a/collection"},{"resource":{"extra":"stuff"},"target":"other/collection"}],"endpoint":{"connector":{"config":{"bucket":"foobar","prefix":"path/prefix"},"image":"an/image"}}}},"materializations":{"a/materialization":{"bindings":[{"resource":{"table":"table_one"},"source":"source/collection"},{"fields":{"exclude":["del"],"include":{"add":{}},"recommended":true},"resource":{"table":"table_two"},"source":{"name":"other/source/collection","partitions":{"exclude":{"other":[42]},"include":{"a_field":["some-val"]}}}}],"endpoint":{"connector":{"config":{"its":"config"},"image":"materialization/image"}},"sourceCapture":"a/capture"},"materialization/local":{"bindings":[{"resource":{"table":"table_three"},"source":"final/source/collection"}],"endpoint":{"local":{"command":["do-the-thing","--arg=one","--arg","two"],"config":{"some":"local config"}}},"shards":{"ringBufferSize":12345}},"materialization/missing-config":{"bindings":[{"resource":"referenced/not/found.yaml","source":"other/source/collection"}],"endpoint":{"connector":{"config":"config/not/found.yaml","image":"materialization/image"}}},"materialization/with-config":{"bindings":[{"resource":"referenced/resource.yaml","source":"some/source/collection"}],"endpoint":{"connector":{"config":"referenced/config.yaml","image":"materialization/another:image"}}},"materialization/with-config-fragment":{"bindings":[],"endpoint":{"connector":{"config":"referenced/config.yaml#/bad/fragment","image":"materialization/another:image"}}}}}, + content_dom: {"captures":{"capture/config-missing":{"bindings":[{"backfill":2,"resource":"resource/not/found.yaml","target":"some/collection"}],"endpoint":{"connector":{"config":"config/not/found.yaml","image":"another/image"}}},"capture/config-raw":{"bindings":[],"endpoint":{"connector":{"config":"raw-config.foo","image":"another/image"}}},"capture/local":{"bindings":[],"endpoint":{"local":{"command":["do-the-thing","--arg=one","--arg","two"],"config":{"some":"local config"}}}},"capture/second":{"bindings":[{"resource":"referenced/resource.yaml","target":"third/collection"}],"endpoint":{"connector":{"config":"referenced/config.yaml","image":"another/image"}},"interval":"3m","shards":{"logLevel":"debug","maxTxnDuration":"30s"}},"first/capture":{"bindings":[{"resource":{"stream":"contents"},"target":"a/collection"},{"backfill":1,"resource":{"extra":"stuff"},"target":"other/collection"}],"endpoint":{"connector":{"config":{"bucket":"foobar","prefix":"path/prefix"},"image":"an/image"}}}},"materializations":{"a/materialization":{"bindings":[{"resource":{"table":"table_one"},"source":"source/collection"},{"fields":{"exclude":["del"],"include":{"add":{}},"recommended":true},"resource":{"table":"table_two"},"source":{"name":"other/source/collection","partitions":{"exclude":{"other":[42]},"include":{"a_field":["some-val"]}}}}],"endpoint":{"connector":{"config":{"its":"config"},"image":"materialization/image"}},"sourceCapture":"a/capture"},"materialization/local":{"bindings":[{"resource":{"table":"table_three"},"source":"final/source/collection"}],"endpoint":{"local":{"command":["do-the-thing","--arg=one","--arg","two"],"config":{"some":"local config"}}},"shards":{"ringBufferSize":12345}},"materialization/missing-config":{"bindings":[{"resource":"referenced/not/found.yaml","source":"other/source/collection"}],"endpoint":{"connector":{"config":"config/not/found.yaml","image":"materialization/image"}}},"materialization/with-config":{"bindings":[{"backfill":3,"resource":"referenced/resource.yaml","source":"some/source/collection"}],"endpoint":{"connector":{"config":"referenced/config.yaml","image":"materialization/another:image"}}},"materialization/with-config-fragment":{"bindings":[],"endpoint":{"connector":{"config":"referenced/config.yaml#/bad/fragment","image":"materialization/another:image"}}}}}, }, Resource { resource: test://example/raw-config.foo, diff --git a/crates/sources/src/scenarios/test_derivations.yaml b/crates/sources/src/scenarios/test_derivations.yaml index b9b251b46b..41061c7ac9 100644 --- a/crates/sources/src/scenarios/test_derivations.yaml +++ b/crates/sources/src/scenarios/test_derivations.yaml @@ -57,6 +57,7 @@ test://example/catalog.yaml: source: src/collection lambda: 42 shuffle: any + backfill: 2 shards: disable: true minTxnDuration: 15s diff --git a/crates/sources/src/scenarios/test_endpoints_captures_materializations.yaml b/crates/sources/src/scenarios/test_endpoints_captures_materializations.yaml index 3240b85f58..215558b735 100644 --- a/crates/sources/src/scenarios/test_endpoints_captures_materializations.yaml +++ b/crates/sources/src/scenarios/test_endpoints_captures_materializations.yaml @@ -13,6 +13,7 @@ test://example/catalog.yaml: resource: { stream: "contents" } - target: other/collection resource: { extra: "stuff" } + backfill: 1 capture/second: endpoint: @@ -35,6 +36,7 @@ test://example/catalog.yaml: bindings: - target: some/collection resource: resource/not/found.yaml + backfill: 2 capture/config-raw: endpoint: @@ -84,6 +86,7 @@ test://example/catalog.yaml: bindings: - source: some/source/collection resource: referenced/resource.yaml + backfill: 3 materialization/with-config-fragment: endpoint: diff --git a/crates/sources/tests/snapshots/schema_generation__catalog_schema_snapshot.snap b/crates/sources/tests/snapshots/schema_generation__catalog_schema_snapshot.snap index 06f9791479..b9b2715854 100644 --- a/crates/sources/tests/snapshots/schema_generation__catalog_schema_snapshot.snap +++ b/crates/sources/tests/snapshots/schema_generation__catalog_schema_snapshot.snap @@ -207,6 +207,13 @@ expression: "&schema" "target" ], "properties": { + "backfill": { + "title": "Backfill counter for this binding.", + "description": "Every increment of this counter will result in a new backfill of this binding from the captured endpoint. For example when capturing from a SQL table, incrementing this counter will cause the table to be re-captured in its entirety from the source database.\n\nNote that a backfill does *not* truncate the target collection, and documents published by a backfilled binding will coexist with (and be ordered after) any documents which were published as part of a preceding backfill.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "disable": { "title": "Whether to disable the binding", "description": "Disabled bindings are inactive, and not validated. They can be used to represent discovered resources that are intentionally not being captured.", @@ -776,6 +783,13 @@ expression: "&schema" "source" ], "properties": { + "backfill": { + "title": "Backfill counter for this binding.", + "description": "Every increment of this counter will result in a new backfill of this binding from its source collection to its materialized resource. For example when materializing to a SQL table, incrementing this counter causes the table to be dropped and then rebuilt by re-reading the source collection.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "disable": { "title": "Whether to disable the binding", "description": "Disabled bindings are inactive, and not validated.", @@ -1310,6 +1324,13 @@ expression: "&schema" "source" ], "properties": { + "backfill": { + "title": "Backfill counter for this transform.", + "description": "Every increment of this counter will result in a new backfill of this transform. Specifically, the transform's lambda will be re-invoked for every applicable document of its source collection.\n\nNote that a backfill does *not* truncate the derived collection, and documents published by a backfilled transform will coexist with (and be ordered after) any documents which were published as part of a preceding backfill.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "disable": { "title": "Whether to disable this transform.", "description": "Disabled transforms are completely ignored at runtime and are not validated.", diff --git a/crates/validation/src/capture.rs b/crates/validation/src/capture.rs index 32d566e527..abf08e3aaa 100644 --- a/crates/validation/src/capture.rs +++ b/crates/validation/src/capture.rs @@ -109,15 +109,21 @@ pub async fn walk_all_captures( let capture::request::validate::Binding { resource_config_json, collection, + backfill, } = binding_request; let capture::response::validated::Binding { resource_path } = binding_response; + + let state_key = assemble::encode_state_key(resource_path, backfill); + ( binding_index, flow::capture_spec::Binding { resource_config_json, resource_path: resource_path.clone(), collection, + backfill, + state_key, }, ) }) @@ -258,6 +264,7 @@ fn walk_capture_binding<'a>( resource, target, disable: _, + backfill, } = binding; // We must resolve the target collection to continue. @@ -274,6 +281,7 @@ fn walk_capture_binding<'a>( let request = capture::request::validate::Binding { resource_config_json: resource.to_string(), collection: Some(built_collection.spec.clone()), + backfill: *backfill, }; Some(request) @@ -298,7 +306,10 @@ fn extract_validated( let Some(validated) = response.validated else { return Err(Error::Connector { - detail: anyhow::anyhow!("expected Validated but got {}", serde_json::to_string(&response).unwrap()), + detail: anyhow::anyhow!( + "expected Validated but got {}", + serde_json::to_string(&response).unwrap() + ), }); }; let network_ports = internal.container.unwrap_or_default().network_ports; diff --git a/crates/validation/src/derivation.rs b/crates/validation/src/derivation.rs index e3fd2f882f..829f5965ed 100644 --- a/crates/validation/src/derivation.rs +++ b/crates/validation/src/derivation.rs @@ -34,7 +34,11 @@ pub async fn walk_all_derivations( // Look at only collections that are derivations, // and skip if we cannot map into a BuiltCollection. let Some(derive) = derive else { continue }; - let Ok(built_index) = built_collections.binary_search_by_key(&collection, |b| &b.collection) else { continue }; + let Ok(built_index) = + built_collections.binary_search_by_key(&collection, |b| &b.collection) + else { + continue; + }; let validation = walk_derive_request( built_collections, @@ -98,7 +102,7 @@ pub async fn walk_all_derivations( let models::Derivation { using: _, - transforms, + transforms: transform_models, shards, shuffle_key_types: _, } = derive; @@ -145,6 +149,10 @@ pub async fn walk_all_derivations( .push(scope, errors); } + // We only validated non-disabled transforms, in transform order. + // Filter `transform_models` correspondingly. + let transform_models: Vec<_> = transform_models.iter().filter(|b| !b.disable).collect(); + let built_transforms: Vec<_> = std::mem::take(transform_requests) .into_iter() .zip(transform_responses.into_iter()) @@ -152,21 +160,25 @@ pub async fn walk_all_derivations( .map( |(transform_index, (transform_request, transform_response))| { let derive::request::validate::Transform { - name, + name: transform_name, collection: source_collection, shuffle_lambda_config_json, lambda_config_json, + backfill, } = transform_request; let derive::response::validated::Transform { read_only } = transform_response; let models::TransformDef { - priority, - read_delay, + name: _, source, shuffle, - .. - } = &transforms[transform_index]; + priority, + read_delay, + lambda: _, + disable: _, + backfill: _, + } = transform_models[transform_index]; let shuffle_key = match shuffle { models::Shuffle::Key(key) => { @@ -197,12 +209,13 @@ pub async fn walk_all_derivations( let partition_selector = Some(assemble::journal_selector(source_name, source_partitions)); - let journal_read_suffix = format!("derive/{}/{}", this_collection, name); + let state_key = assemble::encode_state_key(&[&transform_name], backfill); + let journal_read_suffix = format!("derive/{}/{}", this_collection, state_key); ( transform_index, flow::collection_spec::derivation::Transform { - name, + name: transform_name, collection: source_collection, partition_selector, priority: *priority, @@ -214,6 +227,7 @@ pub async fn walk_all_derivations( journal_read_suffix, not_before: not_before.map(assemble::pb_datetime), not_after: not_after.map(assemble::pb_datetime), + backfill, }, ) }, @@ -456,6 +470,7 @@ fn walk_derive_transform( read_delay: _, lambda, disable: _, + backfill, } = transform; indexed::walk_name( @@ -545,6 +560,7 @@ fn walk_derive_transform( collection: Some(source.spec.clone()), lambda_config_json: lambda.to_string(), shuffle_lambda_config_json, + backfill: *backfill, }; Some((request, shuffle_types)) @@ -569,7 +585,10 @@ fn extract_validated( let Some(validated) = response.validated else { return Err(Error::Connector { - detail: anyhow::anyhow!("expected Validated but got {}", serde_json::to_string(&response).unwrap()), + detail: anyhow::anyhow!( + "expected Validated but got {}", + serde_json::to_string(&response).unwrap() + ), }); }; let network_ports = internal.container.unwrap_or_default().network_ports; diff --git a/crates/validation/src/materialization.rs b/crates/validation/src/materialization.rs index 7ce228b711..8804ef1283 100644 --- a/crates/validation/src/materialization.rs +++ b/crates/validation/src/materialization.rs @@ -109,6 +109,10 @@ pub async fn walk_all_materializations( .push(scope, errors); } + // We only validated non-disabled bindings, in binding order. + // Filter `binding_models` correspondingly. + let binding_models: Vec<_> = binding_models.iter().filter(|b| !b.disable).collect(); + // Join requests and responses to produce tuples // of (binding index, built binding). let built_bindings: Vec<_> = std::mem::take(binding_requests) @@ -120,6 +124,7 @@ pub async fn walk_all_materializations( resource_config_json, collection, field_config_json_map: _, + backfill, } = binding_request; let materialize::response::validated::Binding { @@ -128,21 +133,14 @@ pub async fn walk_all_materializations( resource_path, } = binding_response; - // When we lookup the binding in the model, we need to account - // for the presence of disabled bindings, which would cause - // binding indexes to differ between the model and the specs - // from the validation request/response. let models::MaterializationBinding { ref source, ref fields, disable: _, priority, resource: _, - } = binding_models - .iter() - .filter(|b| !b.disable) - .nth(binding_index) - .expect("models bindings are consistent with validation requests bindings"); + backfill: _, + } = binding_models[binding_index]; let field_selection = Some(walk_materialization_response( scope.push_prop("bindings").push_item(binding_index), @@ -170,11 +168,8 @@ pub async fn walk_all_materializations( let partition_selector = Some(assemble::journal_selector(source_name, source_partitions)); - let journal_read_suffix = format!( - "materialize/{}/{}", - materialization, - assemble::encode_resource_path(resource_path), - ); + let state_key = assemble::encode_state_key(resource_path, backfill); + let journal_read_suffix = format!("materialize/{}/{}", materialization, state_key); ( binding_index, @@ -190,6 +185,8 @@ pub async fn walk_all_materializations( journal_read_suffix, not_before: not_before.map(assemble::pb_datetime), not_after: not_after.map(assemble::pb_datetime), + backfill, + state_key, }, ) }) @@ -336,6 +333,7 @@ fn walk_materialization_binding<'a>( }, disable: _, priority: _, + backfill, } = binding; let (collection, source_partitions) = match source { @@ -383,6 +381,7 @@ fn walk_materialization_binding<'a>( resource_config_json: resource.to_string(), collection: Some(built_collection.spec.clone()), field_config_json_map, + backfill: *backfill, }; Some(request) @@ -655,7 +654,10 @@ fn extract_validated( let Some(validated) = response.validated else { return Err(Error::Connector { - detail: anyhow::anyhow!("expected Validated but got {}", serde_json::to_string(&response).unwrap()), + detail: anyhow::anyhow!( + "expected Validated but got {}", + serde_json::to_string(&response).unwrap() + ), }); }; let network_ports = internal.container.unwrap_or_default().network_ports; diff --git a/crates/validation/tests/model.yaml b/crates/validation/tests/model.yaml index d308f20b1f..2c83496769 100644 --- a/crates/validation/tests/model.yaml +++ b/crates/validation/tests/model.yaml @@ -111,6 +111,7 @@ test://example/int-string-captures: resource: stream: other-stream namespace: and namespace + backfill: 3 shards: hotStandbys: 1 minTxnDuration: 10s @@ -150,6 +151,7 @@ test://example/webhook-deliveries: include: Len: {} recommended: false + backfill: 7 test://example/webhook-config.yaml: address: http://example/webhook @@ -260,6 +262,7 @@ test://example/int-halve: shuffle: # Shuffle key is fully covered by logical partition fields. key: [/len, /partitionString] + backfill: 4 shards: disable: true diff --git a/crates/validation/tests/snapshots/scenario_tests__golden_all_visits.snap b/crates/validation/tests/snapshots/scenario_tests__golden_all_visits.snap index 218b10c7cc..4e196bdb06 100644 --- a/crates/validation/tests/snapshots/scenario_tests__golden_all_visits.snap +++ b/crates/validation/tests/snapshots/scenario_tests__golden_all_visits.snap @@ -228,6 +228,8 @@ All { derivation: None, }, ), + backfill: 3, + state_key: "schema%2Ftable.v3", }, ], interval_seconds: 300, @@ -598,6 +600,8 @@ All { derivation: None, }, ), + backfill: 0, + state_key: "bucke+%2Fpr%40fix", }, Binding { resource_config_json: "{\"stream\":\"v2-stream\"}", @@ -782,6 +786,8 @@ All { derivation: None, }, ), + backfill: 0, + state_key: "other-bucket", }, ], interval_seconds: 600, @@ -1451,6 +1457,7 @@ All { journal_read_suffix: "derive/testing/from-array-key/withBar", not_before: None, not_after: None, + backfill: 0, }, Transform { name: "withFoo", @@ -1655,6 +1662,7 @@ All { journal_read_suffix: "derive/testing/from-array-key/withFoo", not_before: None, not_after: None, + backfill: 0, }, ], shuffle_key_types: [ @@ -2466,6 +2474,7 @@ All { nanos: 0, }, ), + backfill: 0, }, Transform { name: "halveSelf", @@ -2817,9 +2826,10 @@ All { shuffle_lambda_config_json: "", lambda_config_json: "null", read_only: true, - journal_read_suffix: "derive/testing/int-halve/halveSelf", + journal_read_suffix: "derive/testing/int-halve/halveSelf.v4", not_before: None, not_after: None, + backfill: 4, }, ], shuffle_key_types: [ @@ -3356,6 +3366,7 @@ All { journal_read_suffix: "derive/testing/int-reverse/reverseIntString", not_before: None, not_after: None, + backfill: 0, }, ], shuffle_key_types: [], @@ -4873,6 +4884,8 @@ All { journal_read_suffix: "materialize/testing/db-views/view", not_before: None, not_after: None, + backfill: 0, + state_key: "view", }, ], shard_template: Some( @@ -5302,6 +5315,8 @@ All { }, ), not_after: None, + backfill: 0, + state_key: "Web%21hook%2Ffoo%20bar", }, Binding { resource_config_json: "{\"fixture\":\"two\"}", @@ -5666,9 +5681,11 @@ All { ), delta_updates: true, deprecated_shuffle: None, - journal_read_suffix: "materialize/testing/webhook/deliveries/targe+%2Ftwo", + journal_read_suffix: "materialize/testing/webhook/deliveries/targe+%2Ftwo.v7", not_before: None, not_after: None, + backfill: 7, + state_key: "targe+%2Ftwo.v7", }, ], shard_template: Some( @@ -5899,7 +5916,8 @@ All { "bindings": [ { "resource": {"namespace":"and namespace","stream":"other-stream"}, - "target": "testing/int-string" + "target": "testing/int-string", + "backfill": 3 } ], "shards": { @@ -6060,7 +6078,8 @@ All { "/len", "/partitionString" ] - } + }, + "backfill": 4 } ], "shards": { @@ -6409,7 +6428,8 @@ All { "Len": {} }, "recommended": false - } + }, + "backfill": 7 } ] }, @@ -6457,7 +6477,7 @@ All { resource: test://example/int-halve, content_type: "CATALOG", content: ".. binary ..", - content_dom: {"collections":{"testing/int-halve":{"derive":{"shards":{"disable":true},"transforms":[{"name":"halveIntString","shuffle":{"key":["/len","/str"]},"source":{"name":"testing/int-string-rw","notAfter":"2019-03-06T09:30:02Z","partitions":{"exclude":{"bit":[false]},"include":{"bit":[true]}}}},{"name":"halveSelf","shuffle":{"key":["/len","/partitionString"]},"source":{"name":"testing/int-halve"}}],"using":{"typescript":{"module":"int-halve.ts"}}},"journals":{"fragments":{"flushInterval":"15m","length":11223344}},"key":["/int"],"projections":{"Extra":"/extra","Len":{"location":"/len","partition":true},"Root":"","TheString":{"location":"/partitionString","partition":true}},"schema":"test://example/int-string-len.schema"}}}, + content_dom: {"collections":{"testing/int-halve":{"derive":{"shards":{"disable":true},"transforms":[{"name":"halveIntString","shuffle":{"key":["/len","/str"]},"source":{"name":"testing/int-string-rw","notAfter":"2019-03-06T09:30:02Z","partitions":{"exclude":{"bit":[false]},"include":{"bit":[true]}}}},{"backfill":4,"name":"halveSelf","shuffle":{"key":["/len","/partitionString"]},"source":{"name":"testing/int-halve"}}],"using":{"typescript":{"module":"int-halve.ts"}}},"journals":{"fragments":{"flushInterval":"15m","length":11223344}},"key":["/int"],"projections":{"Extra":"/extra","Len":{"location":"/len","partition":true},"Root":"","TheString":{"location":"/partitionString","partition":true}},"schema":"test://example/int-string-len.schema"}}}, }, Resource { resource: test://example/int-halve.ts, @@ -6487,7 +6507,7 @@ All { resource: test://example/int-string-captures, content_type: "CATALOG", content: ".. binary ..", - content_dom: {"captures":{"testing/db-cdc":{"bindings":[{"resource":{"namespace":"and namespace","stream":"other-stream"},"target":"testing/int-string"}],"endpoint":{"connector":{"config":"cdc-config.yaml","image":"database"}},"shards":{"hotStandbys":1,"minTxnDuration":"10s"}},"testing/s3-source":{"bindings":[{"resource":{"stream":"a-stream"},"target":"testing/int-string"},{"resource":{"stream":"v2-stream"},"target":"testing/int-string.v2"}],"endpoint":{"connector":{"config":{"bucket":"a-bucket","prefix":"and-prefix"},"image":"s3"}},"interval":"10m"}},"import":["test://example/int-string"]}, + content_dom: {"captures":{"testing/db-cdc":{"bindings":[{"backfill":3,"resource":{"namespace":"and namespace","stream":"other-stream"},"target":"testing/int-string"}],"endpoint":{"connector":{"config":"cdc-config.yaml","image":"database"}},"shards":{"hotStandbys":1,"minTxnDuration":"10s"}},"testing/s3-source":{"bindings":[{"resource":{"stream":"a-stream"},"target":"testing/int-string"},{"resource":{"stream":"v2-stream"},"target":"testing/int-string.v2"}],"endpoint":{"connector":{"config":{"bucket":"a-bucket","prefix":"and-prefix"},"image":"s3"}},"interval":"10m"}},"import":["test://example/int-string"]}, }, Resource { resource: test://example/int-string-len.schema, @@ -6517,7 +6537,7 @@ All { resource: test://example/webhook-deliveries, content_type: "CATALOG", content: ".. binary ..", - content_dom: {"import":["test://example/int-string","test://example/int-halve"],"materializations":{"testing/webhook/deliveries":{"bindings":[{"fields":{"exclude":["bit"],"include":{"str":{"pass":"through"}},"recommended":true},"resource":{"fixture":"one"},"source":{"name":"testing/int-string","notBefore":"2017-03-03T03:02:01Z","partitions":{"include":{"bit":[true]}}}},{"fields":{"include":{"Len":{}},"recommended":false},"priority":3,"resource":{"fixture":"two"},"source":"testing/int-halve"}],"endpoint":{"connector":{"config":"webhook-config.yaml","image":"webhook/connector"}}}}}, + content_dom: {"import":["test://example/int-string","test://example/int-halve"],"materializations":{"testing/webhook/deliveries":{"bindings":[{"fields":{"exclude":["bit"],"include":{"str":{"pass":"through"}},"recommended":true},"resource":{"fixture":"one"},"source":{"name":"testing/int-string","notBefore":"2017-03-03T03:02:01Z","partitions":{"include":{"bit":[true]}}}},{"backfill":7,"fields":{"include":{"Len":{}},"recommended":false},"priority":3,"resource":{"fixture":"two"},"source":"testing/int-halve"}],"endpoint":{"connector":{"config":"webhook-config.yaml","image":"webhook/connector"}}}}}, }, ], storage_mappings: [ diff --git a/flow.schema.json b/flow.schema.json index c4484c2d14..f9fb8f091a 100644 --- a/flow.schema.json +++ b/flow.schema.json @@ -203,6 +203,13 @@ "target" ], "properties": { + "backfill": { + "title": "Backfill counter for this binding.", + "description": "Every increment of this counter will result in a new backfill of this binding from the captured endpoint. For example when capturing from a SQL table, incrementing this counter will cause the table to be re-captured in its entirety from the source database.\n\nNote that a backfill does *not* truncate the target collection, and documents published by a backfilled binding will coexist with (and be ordered after) any documents which were published as part of a preceding backfill.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "disable": { "title": "Whether to disable the binding", "description": "Disabled bindings are inactive, and not validated. They can be used to represent discovered resources that are intentionally not being captured.", @@ -772,6 +779,13 @@ "source" ], "properties": { + "backfill": { + "title": "Backfill counter for this binding.", + "description": "Every increment of this counter will result in a new backfill of this binding from its source collection to its materialized resource. For example when materializing to a SQL table, incrementing this counter causes the table to be dropped and then rebuilt by re-reading the source collection.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "disable": { "title": "Whether to disable the binding", "description": "Disabled bindings are inactive, and not validated.", @@ -1306,6 +1320,13 @@ "source" ], "properties": { + "backfill": { + "title": "Backfill counter for this transform.", + "description": "Every increment of this counter will result in a new backfill of this transform. Specifically, the transform's lambda will be re-invoked for every applicable document of its source collection.\n\nNote that a backfill does *not* truncate the derived collection, and documents published by a backfilled transform will coexist with (and be ordered after) any documents which were published as part of a preceding backfill.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, "disable": { "title": "Whether to disable this transform.", "description": "Disabled transforms are completely ignored at runtime and are not validated.", diff --git a/go/bindings/.snapshots/TestBuildCatalog-all-captures b/go/bindings/.snapshots/TestBuildCatalog-all-captures index e4b338b3e9..60303f53e3 100644 --- a/go/bindings/.snapshots/TestBuildCatalog-all-captures +++ b/go/bindings/.snapshots/TestBuildCatalog-all-captures @@ -1,3 +1,3 @@ ([]*flow.CaptureSpec) (len=1) { - (*flow.CaptureSpec)(name:"example/capture" connector_type:IMAGE config_json:"{\"image\":\"ghcr.io/estuary/source-test:dev\",\"config\":{\"greetings\":1000}}" bindings: exists:MUST > > projections: > projections: > projections: title:"Flow Publication Time" description:"Flow publication date-time of this document" exists:MUST > > ack_template_json:"{\"_meta\":{\"ack\":true,\"uuid\":\"DocUUIDPlaceholder-329Bb50aa48EAa9ef\"}}" partition_template: labels: labels: labels: > fragment: path_postfix_template:"utc_date={{.Spool.FirstAppendTime.Format \"2006-01-02\"}}/utc_hour={{.Spool.FirstAppendTime.Format \"15\"}}" > flags:4 max_append_rate:4194304 > > > interval_seconds:300 shard_template: labels: labels: labels: labels: labels: > ring_buffer_size:65536 read_channel_size:4096 > recovery_log_template: labels: labels: labels: labels: > fragment: > flags:4 max_append_rate:4194304 > ) + (*flow.CaptureSpec)(name:"example/capture" connector_type:IMAGE config_json:"{\"image\":\"ghcr.io/estuary/source-test:dev\",\"config\":{\"greetings\":1000}}" bindings: exists:MUST > > projections: > projections: > projections: title:"Flow Publication Time" description:"Flow publication date-time of this document" exists:MUST > > ack_template_json:"{\"_meta\":{\"ack\":true,\"uuid\":\"DocUUIDPlaceholder-329Bb50aa48EAa9ef\"}}" partition_template: labels: labels: labels: > fragment: path_postfix_template:"utc_date={{.Spool.FirstAppendTime.Format \"2006-01-02\"}}/utc_hour={{.Spool.FirstAppendTime.Format \"15\"}}" > flags:4 max_append_rate:4194304 > > state_key:"greetings%2F0" > interval_seconds:300 shard_template: labels: labels: labels: labels: labels: > ring_buffer_size:65536 read_channel_size:4096 > recovery_log_template: labels: labels: labels: labels: > fragment: > flags:4 max_append_rate:4194304 > ) } diff --git a/go/bindings/.snapshots/TestBuildCatalog-all-materializations b/go/bindings/.snapshots/TestBuildCatalog-all-materializations index c748cef7f2..f659fd2790 100644 --- a/go/bindings/.snapshots/TestBuildCatalog-all-materializations +++ b/go/bindings/.snapshots/TestBuildCatalog-all-materializations @@ -1,3 +1,3 @@ ([]*flow.MaterializationSpec) (len=1) { - (*flow.MaterializationSpec)(name:"example/materialization" connector_type:IMAGE config_json:"{\"image\":\"ghcr.io/estuary/materialize-sqlite:dev\",\"config\":{}}" bindings: exists:MUST > > projections: > projections: title:"Flow Publication Time" description:"Flow publication date-time of this document" exists:MUST > > ack_template_json:"{\"_meta\":{\"ack\":true,\"uuid\":\"DocUUIDPlaceholder-329Bb50aa48EAa9ef\"}}" partition_template: labels: labels: labels: > fragment: path_postfix_template:"utc_date={{.Spool.FirstAppendTime.Format \"2006-01-02\"}}/utc_hour={{.Spool.FirstAppendTime.Format \"15\"}}" > flags:4 max_append_rate:4194304 > > partition_selector: > exclude:<> > field_selection: journal_read_suffix:"materialize/example/materialization/a_table" > shard_template: labels: labels: labels: labels: labels: labels: labels: > ring_buffer_size:65536 read_channel_size:4096 > recovery_log_template: labels: labels: labels: labels: > fragment: > flags:4 max_append_rate:4194304 > network_ports: ) + (*flow.MaterializationSpec)(name:"example/materialization" connector_type:IMAGE config_json:"{\"image\":\"ghcr.io/estuary/materialize-sqlite:dev\",\"config\":{}}" bindings: exists:MUST > > projections: > projections: title:"Flow Publication Time" description:"Flow publication date-time of this document" exists:MUST > > ack_template_json:"{\"_meta\":{\"ack\":true,\"uuid\":\"DocUUIDPlaceholder-329Bb50aa48EAa9ef\"}}" partition_template: labels: labels: labels: > fragment: path_postfix_template:"utc_date={{.Spool.FirstAppendTime.Format \"2006-01-02\"}}/utc_hour={{.Spool.FirstAppendTime.Format \"15\"}}" > flags:4 max_append_rate:4194304 > > partition_selector: > exclude:<> > field_selection: journal_read_suffix:"materialize/example/materialization/a_table" state_key:"a_table" > shard_template: labels: labels: labels: labels: labels: labels: labels: > ring_buffer_size:65536 read_channel_size:4096 > recovery_log_template: labels: labels: labels: labels: > fragment: > flags:4 max_append_rate:4194304 > network_ports: ) } diff --git a/go/bindings/.snapshots/TestBuildCatalog-one-capture b/go/bindings/.snapshots/TestBuildCatalog-one-capture index 9d1d79b6de..31e2c3e045 100644 --- a/go/bindings/.snapshots/TestBuildCatalog-one-capture +++ b/go/bindings/.snapshots/TestBuildCatalog-one-capture @@ -1 +1 @@ -(*flow.CaptureSpec)(name:"example/capture" connector_type:IMAGE config_json:"{\"image\":\"ghcr.io/estuary/source-test:dev\",\"config\":{\"greetings\":1000}}" bindings: exists:MUST > > projections: > projections: > projections: title:"Flow Publication Time" description:"Flow publication date-time of this document" exists:MUST > > ack_template_json:"{\"_meta\":{\"ack\":true,\"uuid\":\"DocUUIDPlaceholder-329Bb50aa48EAa9ef\"}}" partition_template: labels: labels: labels: > fragment: path_postfix_template:"utc_date={{.Spool.FirstAppendTime.Format \"2006-01-02\"}}/utc_hour={{.Spool.FirstAppendTime.Format \"15\"}}" > flags:4 max_append_rate:4194304 > > > interval_seconds:300 shard_template: labels: labels: labels: labels: labels: > ring_buffer_size:65536 read_channel_size:4096 > recovery_log_template: labels: labels: labels: labels: > fragment: > flags:4 max_append_rate:4194304 > ) +(*flow.CaptureSpec)(name:"example/capture" connector_type:IMAGE config_json:"{\"image\":\"ghcr.io/estuary/source-test:dev\",\"config\":{\"greetings\":1000}}" bindings: exists:MUST > > projections: > projections: > projections: title:"Flow Publication Time" description:"Flow publication date-time of this document" exists:MUST > > ack_template_json:"{\"_meta\":{\"ack\":true,\"uuid\":\"DocUUIDPlaceholder-329Bb50aa48EAa9ef\"}}" partition_template: labels: labels: labels: > fragment: path_postfix_template:"utc_date={{.Spool.FirstAppendTime.Format \"2006-01-02\"}}/utc_hour={{.Spool.FirstAppendTime.Format \"15\"}}" > flags:4 max_append_rate:4194304 > > state_key:"greetings%2F0" > interval_seconds:300 shard_template: labels: labels: labels: labels: labels: > ring_buffer_size:65536 read_channel_size:4096 > recovery_log_template: labels: labels: labels: labels: > fragment: > flags:4 max_append_rate:4194304 > ) diff --git a/go/bindings/.snapshots/TestBuildCatalog-one-materialization b/go/bindings/.snapshots/TestBuildCatalog-one-materialization index bb94b61143..f0b5aec443 100644 --- a/go/bindings/.snapshots/TestBuildCatalog-one-materialization +++ b/go/bindings/.snapshots/TestBuildCatalog-one-materialization @@ -1 +1 @@ -(*flow.MaterializationSpec)(name:"example/materialization" connector_type:IMAGE config_json:"{\"image\":\"ghcr.io/estuary/materialize-sqlite:dev\",\"config\":{}}" bindings: exists:MUST > > projections: > projections: title:"Flow Publication Time" description:"Flow publication date-time of this document" exists:MUST > > ack_template_json:"{\"_meta\":{\"ack\":true,\"uuid\":\"DocUUIDPlaceholder-329Bb50aa48EAa9ef\"}}" partition_template: labels: labels: labels: > fragment: path_postfix_template:"utc_date={{.Spool.FirstAppendTime.Format \"2006-01-02\"}}/utc_hour={{.Spool.FirstAppendTime.Format \"15\"}}" > flags:4 max_append_rate:4194304 > > partition_selector: > exclude:<> > field_selection: journal_read_suffix:"materialize/example/materialization/a_table" > shard_template: labels: labels: labels: labels: labels: labels: labels: > ring_buffer_size:65536 read_channel_size:4096 > recovery_log_template: labels: labels: labels: labels: > fragment: > flags:4 max_append_rate:4194304 > network_ports: ) +(*flow.MaterializationSpec)(name:"example/materialization" connector_type:IMAGE config_json:"{\"image\":\"ghcr.io/estuary/materialize-sqlite:dev\",\"config\":{}}" bindings: exists:MUST > > projections: > projections: title:"Flow Publication Time" description:"Flow publication date-time of this document" exists:MUST > > ack_template_json:"{\"_meta\":{\"ack\":true,\"uuid\":\"DocUUIDPlaceholder-329Bb50aa48EAa9ef\"}}" partition_template: labels: labels: labels: > fragment: path_postfix_template:"utc_date={{.Spool.FirstAppendTime.Format \"2006-01-02\"}}/utc_hour={{.Spool.FirstAppendTime.Format \"15\"}}" > flags:4 max_append_rate:4194304 > > partition_selector: > exclude:<> > field_selection: journal_read_suffix:"materialize/example/materialization/a_table" state_key:"a_table" > shard_template: labels: labels: labels: labels: labels: labels: labels: > ring_buffer_size:65536 read_channel_size:4096 > recovery_log_template: labels: labels: labels: labels: > fragment: > flags:4 max_append_rate:4194304 > network_ports: ) diff --git a/go/protocols/capture/capture.pb.go b/go/protocols/capture/capture.pb.go index 108be504b1..62ccaa2e36 100644 --- a/go/protocols/capture/capture.pb.go +++ b/go/protocols/capture/capture.pb.go @@ -226,10 +226,12 @@ type Request_Validate_Binding struct { // JSON-encoded object which specifies the endpoint resource to be captured. ResourceConfigJson encoding_json.RawMessage `protobuf:"bytes,1,opt,name=resource_config_json,json=resourceConfig,proto3,casttype=encoding/json.RawMessage" json:"resource_config_json,omitempty"` // Collection to be captured. - Collection flow.CollectionSpec `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Collection flow.CollectionSpec `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection"` + // Backfill counter for this binding. + Backfill uint32 `protobuf:"varint,3,opt,name=backfill,proto3" json:"backfill,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Request_Validate_Binding) Reset() { *m = Request_Validate_Binding{} } @@ -917,79 +919,79 @@ func init() { } var fileDescriptor_841a70e6e6288f13 = []byte{ - // 1138 bytes of a gzipped FileDescriptorProto + // 1152 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xdd, 0x6e, 0x1b, 0x45, - 0x14, 0xee, 0xda, 0x8e, 0xbd, 0x3e, 0x4e, 0xd2, 0x64, 0x14, 0xca, 0x66, 0x13, 0x25, 0x21, 0x0d, - 0x52, 0xfa, 0x83, 0x5d, 0x1c, 0x0a, 0x2d, 0x3f, 0x2d, 0xf9, 0xa1, 0x12, 0x95, 0x20, 0xd5, 0x84, - 0x1f, 0xc1, 0x8d, 0xb5, 0x99, 0x99, 0xda, 0x4b, 0xd6, 0x3b, 0xcb, 0xee, 0x3a, 0xc1, 0x12, 0x2f, - 0xc0, 0x05, 0x17, 0x3c, 0x00, 0x12, 0xf7, 0x88, 0xf7, 0xc8, 0x05, 0x17, 0x3c, 0x41, 0x24, 0xca, - 0x2d, 0xe2, 0x01, 0x2a, 0x21, 0xa1, 0xf9, 0x5b, 0x6f, 0xb2, 0x49, 0x64, 0x50, 0x2f, 0xb8, 0xb1, - 0x77, 0xce, 0xf9, 0xce, 0xcc, 0x99, 0xef, 0xcc, 0xf9, 0x66, 0x60, 0xb5, 0xcb, 0x5b, 0x51, 0xcc, - 0x53, 0x4e, 0x78, 0x90, 0xb4, 0x88, 0x17, 0xa5, 0x83, 0x98, 0x99, 0xff, 0xa6, 0xf4, 0xa0, 0x9a, - 0x1e, 0xba, 0x8b, 0xa7, 0xc0, 0x4f, 0x03, 0x7e, 0x24, 0x7f, 0x14, 0xcc, 0x9d, 0xeb, 0xf2, 0x2e, - 0x97, 0x9f, 0x2d, 0xf1, 0xa5, 0xac, 0xab, 0x7f, 0x02, 0xd4, 0x30, 0xfb, 0x7a, 0xc0, 0x92, 0x14, - 0xdd, 0x80, 0x4a, 0x12, 0x31, 0xe2, 0x58, 0x2b, 0xd6, 0x7a, 0xa3, 0xfd, 0x52, 0xd3, 0x2c, 0xa3, - 0xfd, 0xcd, 0xbd, 0x88, 0x11, 0x2c, 0x21, 0xe8, 0x2e, 0xd8, 0xd4, 0x4f, 0x08, 0x3f, 0x64, 0xb1, - 0x53, 0x92, 0xf0, 0xf9, 0x02, 0x7c, 0x47, 0x03, 0x70, 0x06, 0x15, 0x61, 0x87, 0x5e, 0xe0, 0x53, - 0x2f, 0x65, 0x4e, 0xf9, 0x82, 0xb0, 0xcf, 0x34, 0x00, 0x67, 0x50, 0x74, 0x1b, 0x26, 0xbc, 0x28, - 0x0a, 0x86, 0x4e, 0x45, 0xc6, 0x5c, 0x2b, 0xc4, 0x6c, 0x0a, 0x2f, 0x56, 0x20, 0xb1, 0x0d, 0x1e, - 0xb1, 0xd0, 0x99, 0xb8, 0x60, 0x1b, 0xbb, 0x11, 0x0b, 0xb1, 0x84, 0xa0, 0x07, 0xd0, 0xf0, 0xc8, - 0x41, 0xc8, 0x8f, 0x02, 0x46, 0xbb, 0xcc, 0xa9, 0xca, 0x88, 0xc5, 0xe2, 0xf4, 0x23, 0x0c, 0xce, - 0x07, 0xa0, 0x05, 0xb0, 0xfd, 0x30, 0x65, 0x71, 0xe8, 0x05, 0x0e, 0x5d, 0xb1, 0xd6, 0x27, 0x71, - 0x7d, 0xcd, 0x18, 0xdc, 0xef, 0x2c, 0xa8, 0x08, 0xca, 0xd0, 0x23, 0x98, 0x26, 0x3c, 0x0c, 0x19, - 0x49, 0x79, 0xdc, 0x49, 0x87, 0x11, 0x93, 0x0c, 0x4f, 0xb7, 0x97, 0x9b, 0xb2, 0x3c, 0xdb, 0x6a, - 0x35, 0x01, 0x6d, 0x6e, 0x1b, 0xdc, 0x27, 0xc3, 0x88, 0xe1, 0x29, 0x92, 0x1f, 0xa2, 0xfb, 0xd0, - 0x20, 0x3c, 0x7c, 0xea, 0x77, 0x3b, 0x5f, 0x25, 0x3c, 0x94, 0xbc, 0xd7, 0xb7, 0x16, 0x9f, 0x9f, - 0x2c, 0x3b, 0x2c, 0x24, 0x9c, 0xfa, 0x61, 0xb7, 0x25, 0x1c, 0x4d, 0xec, 0x1d, 0x7d, 0xc4, 0x92, - 0xc4, 0xeb, 0x32, 0x5c, 0x55, 0x01, 0xee, 0xf7, 0x16, 0xd8, 0xa6, 0x1e, 0xff, 0x87, 0x7c, 0x7e, - 0x2e, 0x83, 0x6d, 0x0a, 0x8d, 0x3e, 0x84, 0x4a, 0xe8, 0xf5, 0x55, 0x16, 0xf5, 0xad, 0xbb, 0xcf, - 0x4f, 0x96, 0x5f, 0xef, 0xfa, 0x69, 0x6f, 0xb0, 0xdf, 0x24, 0xbc, 0xdf, 0x62, 0x49, 0x3a, 0xf0, - 0xe2, 0xa1, 0x3a, 0xcf, 0x85, 0x13, 0x6e, 0xb2, 0xc5, 0x72, 0x8a, 0x73, 0xb6, 0x56, 0x7a, 0x11, - 0x5b, 0x2b, 0x8f, 0xbf, 0x35, 0xf4, 0x1e, 0xd8, 0xfb, 0x7e, 0x28, 0x20, 0x89, 0x53, 0x59, 0x29, - 0xaf, 0x37, 0xda, 0xaf, 0x5c, 0x78, 0xc6, 0x9b, 0x5b, 0x0a, 0x89, 0xb3, 0x10, 0xf7, 0x07, 0x0b, - 0x6a, 0xda, 0x8a, 0x1e, 0xc3, 0x5c, 0xcc, 0x12, 0x3e, 0x88, 0x09, 0xeb, 0xe4, 0xd3, 0xb1, 0xc6, - 0x48, 0x67, 0xda, 0x44, 0x6e, 0xab, 0xb4, 0xde, 0x06, 0x20, 0x3c, 0x08, 0x18, 0x49, 0x7d, 0x5d, - 0xab, 0x46, 0x7b, 0x4e, 0xb3, 0x92, 0xd9, 0x05, 0x31, 0x5b, 0x95, 0xe3, 0x93, 0xe5, 0x2b, 0x38, - 0x87, 0x76, 0xbb, 0x30, 0x21, 0x3b, 0x0c, 0xdd, 0x02, 0x23, 0x36, 0x5a, 0x24, 0x66, 0x0b, 0xbc, - 0x62, 0x83, 0x40, 0x0e, 0xd4, 0x0e, 0x59, 0x9c, 0x98, 0xe5, 0xea, 0xd8, 0x0c, 0xd1, 0xcb, 0x50, - 0xa3, 0xf1, 0xb0, 0x13, 0x0f, 0x14, 0xb3, 0x36, 0xae, 0xd2, 0x78, 0x88, 0x07, 0xa1, 0xfb, 0x8b, - 0x05, 0x15, 0xd1, 0x9e, 0x2f, 0x6a, 0xa1, 0x57, 0x61, 0x22, 0xf6, 0xc2, 0xae, 0x11, 0x9b, 0xab, - 0x6a, 0x12, 0x2c, 0x4c, 0x72, 0x0a, 0xe5, 0x45, 0x6f, 0x01, 0x24, 0xa9, 0x97, 0x32, 0xc5, 0x6e, - 0x65, 0x0c, 0x76, 0x27, 0x24, 0xde, 0x6d, 0x41, 0x23, 0xa7, 0x0d, 0x68, 0x05, 0x1a, 0xa4, 0xc7, - 0xc8, 0x41, 0xc4, 0xfd, 0x30, 0x4d, 0x64, 0xe6, 0x53, 0x38, 0x6f, 0x5a, 0xfd, 0xbb, 0x01, 0x36, - 0x66, 0x49, 0xc4, 0xc3, 0x84, 0xa1, 0x9b, 0xa7, 0xf4, 0x36, 0xaf, 0x6a, 0x0a, 0x90, 0x17, 0xdc, - 0x77, 0x01, 0x8c, 0x8a, 0x32, 0xaa, 0xcb, 0xb7, 0x58, 0x8c, 0xd8, 0xc9, 0x30, 0x38, 0x87, 0x47, - 0xf7, 0xa1, 0x6e, 0xc4, 0x94, 0x6a, 0x2e, 0x16, 0x8a, 0xc1, 0xe6, 0x54, 0x52, 0x3c, 0x42, 0xa3, - 0x0d, 0xa8, 0x09, 0x59, 0xf5, 0x19, 0xd5, 0xea, 0x3b, 0x5f, 0x0c, 0xdc, 0x54, 0x00, 0x6c, 0x90, - 0xe8, 0x0e, 0x54, 0x85, 0xbe, 0x32, 0xaa, 0x45, 0xd8, 0x29, 0xc6, 0xec, 0x4a, 0x3f, 0xd6, 0x38, - 0xf4, 0x26, 0xd8, 0x1a, 0x42, 0xb5, 0x0c, 0xbb, 0xc5, 0x18, 0x5d, 0x7d, 0x8a, 0x33, 0xac, 0xe0, - 0x65, 0xc4, 0xaf, 0x53, 0xbb, 0x88, 0x97, 0xed, 0x0c, 0x83, 0x73, 0xf8, 0xcb, 0xf5, 0xfb, 0xd7, - 0x92, 0xd6, 0x6f, 0x17, 0x6c, 0x23, 0x3a, 0xba, 0xa6, 0xd9, 0x18, 0x3d, 0x02, 0xa4, 0x3b, 0x33, - 0x21, 0x3d, 0xd6, 0xf7, 0xc6, 0x97, 0xc2, 0x49, 0x15, 0xb7, 0x27, 0xc3, 0xd0, 0xe7, 0xb0, 0x70, - 0xb6, 0xd5, 0xf3, 0x13, 0x8e, 0x23, 0x40, 0x73, 0xa7, 0x3b, 0x5e, 0x4f, 0x7c, 0x0b, 0x66, 0x29, - 0x27, 0x83, 0x3e, 0x0b, 0x53, 0x4f, 0x34, 0x73, 0x67, 0x10, 0x07, 0xea, 0x88, 0xe3, 0x99, 0x53, - 0x8e, 0x4f, 0xe3, 0x00, 0xad, 0x41, 0x95, 0x7b, 0x83, 0xb4, 0xd7, 0xd6, 0x75, 0x9b, 0x54, 0x0d, - 0xb3, 0xbb, 0x29, 0x6c, 0x58, 0xfb, 0xd0, 0x1b, 0x70, 0x2d, 0xcb, 0x35, 0xf2, 0xd2, 0x5e, 0x47, - 0x92, 0xc9, 0xe2, 0xc4, 0xa9, 0xae, 0x94, 0xd7, 0xeb, 0xa3, 0x44, 0x9e, 0x78, 0x69, 0xef, 0x89, - 0xf6, 0xb9, 0x7f, 0x95, 0x00, 0x46, 0xc7, 0x13, 0xbd, 0x9f, 0x93, 0x49, 0x4b, 0xca, 0xe4, 0xda, - 0x65, 0xc7, 0xf9, 0x1c, 0xa5, 0xfc, 0xb1, 0x34, 0x52, 0xca, 0x1b, 0x30, 0x13, 0x33, 0xc2, 0xfb, - 0x7d, 0x16, 0x52, 0x46, 0x3b, 0xa3, 0xeb, 0x04, 0x5f, 0xcd, 0xd9, 0x3f, 0x16, 0x57, 0xc4, 0x45, - 0xa2, 0x5a, 0xfa, 0x0f, 0xa2, 0xfa, 0x18, 0xe6, 0x0c, 0x87, 0xff, 0xba, 0x5c, 0xd3, 0x26, 0x52, - 0x17, 0x6a, 0x06, 0xca, 0x07, 0x6c, 0x28, 0xaf, 0x8c, 0x3a, 0x16, 0x9f, 0x42, 0xd7, 0xa8, 0x9f, - 0x78, 0xfb, 0x01, 0x93, 0xe5, 0xb0, 0xb1, 0x19, 0xa2, 0xeb, 0x30, 0x75, 0xaa, 0x02, 0x9a, 0xf8, - 0xc9, 0x3c, 0xf1, 0xee, 0xb7, 0x50, 0xcf, 0x3a, 0x1a, 0x3d, 0x2c, 0xd0, 0x7d, 0xfd, 0x12, 0x01, - 0x38, 0x87, 0xed, 0xe6, 0x88, 0xec, 0xc2, 0xea, 0xd6, 0x39, 0xab, 0xdf, 0x83, 0x9a, 0x96, 0x05, - 0xf4, 0x1a, 0x20, 0x4f, 0x5e, 0x24, 0x1d, 0xca, 0x12, 0x12, 0xfb, 0x91, 0xbc, 0x82, 0x54, 0x79, - 0x66, 0x95, 0x67, 0x67, 0xe4, 0x70, 0x3f, 0x80, 0xaa, 0x12, 0x07, 0xf4, 0x0e, 0xcc, 0xb3, 0x6f, - 0xa2, 0xc0, 0x27, 0x7e, 0xda, 0xc9, 0x3d, 0xbb, 0x04, 0x69, 0x4a, 0x5d, 0x6d, 0xec, 0x18, 0xc0, - 0xe6, 0x19, 0xbf, 0xfb, 0x05, 0xd8, 0x46, 0x2f, 0x04, 0x93, 0x7a, 0x23, 0xba, 0x81, 0xcd, 0x10, - 0x6d, 0x80, 0x4d, 0x39, 0x19, 0xff, 0x04, 0x94, 0x29, 0x27, 0xee, 0x3d, 0x80, 0x91, 0xa0, 0xa0, - 0x9b, 0xa0, 0x6e, 0x03, 0xad, 0xe3, 0xd9, 0xa5, 0xaa, 0xdf, 0x13, 0x7b, 0xc2, 0xa7, 0x2f, 0x8c, - 0xf6, 0x43, 0xa8, 0x67, 0x0e, 0xd4, 0x86, 0x9a, 0xce, 0x10, 0xcd, 0x9c, 0x7d, 0x22, 0xb8, 0xb3, - 0x85, 0xf2, 0xac, 0x5b, 0x77, 0xac, 0xad, 0x07, 0xc7, 0xbf, 0x2f, 0x5d, 0x39, 0x7e, 0xb6, 0x64, - 0xfd, 0xf6, 0x6c, 0xc9, 0xfa, 0xe9, 0x8f, 0x25, 0xeb, 0xcb, 0xdb, 0x63, 0xbd, 0x95, 0xf4, 0x64, - 0xfb, 0x55, 0x69, 0xda, 0xf8, 0x27, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x31, 0xb5, 0xe6, 0x59, 0x0c, - 0x00, 0x00, + 0x1b, 0xee, 0xda, 0x8e, 0xbd, 0x7e, 0x9d, 0xa4, 0xc9, 0x28, 0x5f, 0xbf, 0xcd, 0x26, 0x4a, 0x42, + 0x1a, 0xa4, 0xf4, 0x07, 0xbb, 0x38, 0x14, 0x5a, 0x7e, 0x5a, 0xf2, 0x43, 0x25, 0x2a, 0x41, 0xaa, + 0x09, 0x3f, 0x82, 0x13, 0x6b, 0x33, 0x33, 0xb1, 0x97, 0xac, 0x77, 0x96, 0xdd, 0x75, 0x82, 0x25, + 0x2e, 0x00, 0x0e, 0xb8, 0x04, 0x24, 0x6e, 0x80, 0xeb, 0x20, 0x07, 0x1c, 0x70, 0x05, 0x91, 0x28, + 0xe7, 0x5c, 0x40, 0x25, 0x24, 0x34, 0x7f, 0xeb, 0x4d, 0x36, 0x89, 0x0c, 0xea, 0x01, 0x27, 0x89, + 0xe7, 0x7d, 0x9f, 0x67, 0xe6, 0x9d, 0xe7, 0x9d, 0x79, 0x66, 0x61, 0xb5, 0xcb, 0x5b, 0x51, 0xcc, + 0x53, 0x4e, 0x78, 0x90, 0xb4, 0x88, 0x17, 0xa5, 0x83, 0x98, 0x99, 0xff, 0x4d, 0x99, 0x41, 0x35, + 0x3d, 0x74, 0x17, 0xcf, 0x80, 0x0f, 0x02, 0x7e, 0x2c, 0xff, 0x28, 0x98, 0x3b, 0xd7, 0xe5, 0x5d, + 0x2e, 0x7f, 0xb6, 0xc4, 0x2f, 0x15, 0x5d, 0xfd, 0xae, 0x01, 0x35, 0xcc, 0xbe, 0x1e, 0xb0, 0x24, + 0x45, 0xb7, 0xa0, 0x92, 0x44, 0x8c, 0x38, 0xd6, 0x8a, 0xb5, 0xde, 0x68, 0xff, 0xaf, 0x69, 0x96, + 0xd1, 0xf9, 0xe6, 0x5e, 0xc4, 0x08, 0x96, 0x10, 0x74, 0x1f, 0x6c, 0xea, 0x27, 0x84, 0x1f, 0xb1, + 0xd8, 0x29, 0x49, 0xf8, 0x7c, 0x01, 0xbe, 0xa3, 0x01, 0x38, 0x83, 0x0a, 0xda, 0x91, 0x17, 0xf8, + 0xd4, 0x4b, 0x99, 0x53, 0xbe, 0x84, 0xf6, 0x99, 0x06, 0xe0, 0x0c, 0x8a, 0xee, 0xc2, 0x84, 0x17, + 0x45, 0xc1, 0xd0, 0xa9, 0x48, 0xce, 0x8d, 0x02, 0x67, 0x53, 0x64, 0xb1, 0x02, 0x89, 0x6d, 0xf0, + 0x88, 0x85, 0xce, 0xc4, 0x25, 0xdb, 0xd8, 0x8d, 0x58, 0x88, 0x25, 0x04, 0x3d, 0x82, 0x86, 0x47, + 0x0e, 0x43, 0x7e, 0x1c, 0x30, 0xda, 0x65, 0x4e, 0x55, 0x32, 0x16, 0x8b, 0xd3, 0x8f, 0x30, 0x38, + 0x4f, 0x40, 0x0b, 0x60, 0xfb, 0x61, 0xca, 0xe2, 0xd0, 0x0b, 0x1c, 0xba, 0x62, 0xad, 0x4f, 0xe2, + 0xfa, 0x9a, 0x09, 0xb8, 0xdf, 0x5b, 0x50, 0x11, 0x92, 0xa1, 0x27, 0x30, 0x4d, 0x78, 0x18, 0x32, + 0x92, 0xf2, 0xb8, 0x93, 0x0e, 0x23, 0x26, 0x15, 0x9e, 0x6e, 0x2f, 0x37, 0x65, 0x7b, 0xb6, 0xd5, + 0x6a, 0x02, 0xda, 0xdc, 0x36, 0xb8, 0x4f, 0x86, 0x11, 0xc3, 0x53, 0x24, 0x3f, 0x44, 0x0f, 0xa1, + 0x41, 0x78, 0x78, 0xe0, 0x77, 0x3b, 0x5f, 0x25, 0x3c, 0x94, 0xba, 0xd7, 0xb7, 0x16, 0x5f, 0x9c, + 0x2e, 0x3b, 0x2c, 0x24, 0x9c, 0xfa, 0x61, 0xb7, 0x25, 0x12, 0x4d, 0xec, 0x1d, 0x7f, 0xc4, 0x92, + 0xc4, 0xeb, 0x32, 0x5c, 0x55, 0x04, 0xf7, 0x07, 0x0b, 0x6c, 0xd3, 0x8f, 0xff, 0x42, 0x3d, 0xbf, + 0x94, 0xc1, 0x36, 0x8d, 0x46, 0x1f, 0x42, 0x25, 0xf4, 0xfa, 0xaa, 0x8a, 0xfa, 0xd6, 0xfd, 0x17, + 0xa7, 0xcb, 0xaf, 0x77, 0xfd, 0xb4, 0x37, 0xd8, 0x6f, 0x12, 0xde, 0x6f, 0xb1, 0x24, 0x1d, 0x78, + 0xf1, 0x50, 0x9d, 0xe7, 0xc2, 0x09, 0x37, 0xd5, 0x62, 0x39, 0xc5, 0x05, 0x5b, 0x2b, 0xbd, 0x8c, + 0xad, 0x95, 0xc7, 0xdf, 0x1a, 0x7a, 0x0f, 0xec, 0x7d, 0x3f, 0x14, 0x90, 0xc4, 0xa9, 0xac, 0x94, + 0xd7, 0x1b, 0xed, 0x57, 0x2e, 0x3d, 0xe3, 0xcd, 0x2d, 0x85, 0xc4, 0x19, 0xc5, 0xfd, 0xd9, 0x82, + 0x9a, 0x8e, 0xa2, 0xa7, 0x30, 0x17, 0xb3, 0x84, 0x0f, 0x62, 0xc2, 0x3a, 0xf9, 0x72, 0xac, 0x31, + 0xca, 0x99, 0x36, 0xcc, 0x6d, 0x55, 0xd6, 0xdb, 0x00, 0x84, 0x07, 0x01, 0x23, 0xa9, 0xaf, 0x7b, + 0xd5, 0x68, 0xcf, 0x69, 0x55, 0xb2, 0xb8, 0x10, 0x66, 0xab, 0x72, 0x72, 0xba, 0x7c, 0x0d, 0xe7, + 0xd0, 0xc8, 0x05, 0x7b, 0xdf, 0x23, 0x87, 0x07, 0x7e, 0x10, 0x48, 0x29, 0xa6, 0x70, 0x36, 0x76, + 0xbb, 0x30, 0x21, 0x6f, 0x1f, 0xba, 0x03, 0xc6, 0x88, 0xb4, 0x81, 0xcc, 0x16, 0x34, 0xc7, 0x06, + 0x81, 0x1c, 0xa8, 0x1d, 0xb1, 0x38, 0x31, 0xa5, 0xd4, 0xb1, 0x19, 0xa2, 0xff, 0x43, 0x8d, 0xc6, + 0xc3, 0x4e, 0x3c, 0x50, 0xaa, 0xdb, 0xb8, 0x4a, 0xe3, 0x21, 0x1e, 0x84, 0x42, 0x98, 0x8a, 0xb8, + 0xba, 0x2f, 0x6b, 0xa1, 0x57, 0x61, 0x22, 0xf6, 0xc2, 0xae, 0x31, 0xa2, 0xeb, 0x6a, 0x12, 0x2c, + 0x42, 0x72, 0x0a, 0x95, 0x45, 0x6f, 0x01, 0x24, 0xa9, 0x97, 0x32, 0xa5, 0x7c, 0x65, 0x0c, 0xe5, + 0x27, 0x24, 0xde, 0x6d, 0x41, 0x23, 0xe7, 0x1b, 0x68, 0x05, 0x1a, 0xa4, 0xc7, 0xc8, 0x61, 0xc4, + 0xfd, 0x30, 0x4d, 0x64, 0xe5, 0x53, 0x38, 0x1f, 0x5a, 0xfd, 0xab, 0x01, 0x36, 0x66, 0x49, 0xc4, + 0xc3, 0x84, 0xa1, 0xdb, 0x67, 0xbc, 0x38, 0xef, 0x78, 0x0a, 0x90, 0x37, 0xe3, 0x77, 0x01, 0x8c, + 0xc3, 0x32, 0xaa, 0x5b, 0xbb, 0x58, 0x64, 0xec, 0x64, 0x18, 0x9c, 0xc3, 0xa3, 0x87, 0x50, 0x37, + 0x46, 0x4b, 0xb5, 0x16, 0x0b, 0x45, 0xb2, 0x39, 0xb1, 0x14, 0x8f, 0xd0, 0x68, 0x03, 0x6a, 0xc2, + 0x72, 0x7d, 0x46, 0xb5, 0x33, 0xcf, 0x17, 0x89, 0x9b, 0x0a, 0x80, 0x0d, 0x12, 0xdd, 0x83, 0xaa, + 0xf0, 0x5e, 0x46, 0xb5, 0x41, 0x3b, 0x45, 0xce, 0xae, 0xcc, 0x63, 0x8d, 0x43, 0x6f, 0x82, 0xad, + 0x21, 0x54, 0x5b, 0xb4, 0x5b, 0xe4, 0xe8, 0xee, 0x53, 0x9c, 0x61, 0x85, 0x2e, 0x23, 0x7d, 0x9d, + 0xda, 0x65, 0xba, 0x6c, 0x67, 0x18, 0x9c, 0xc3, 0x5f, 0xed, 0xed, 0xbf, 0x96, 0xb4, 0xb7, 0xbb, + 0x60, 0x1b, 0x43, 0xd2, 0x3d, 0xcd, 0xc6, 0xe8, 0x09, 0x20, 0x7d, 0x6b, 0x13, 0xd2, 0x63, 0x7d, + 0x6f, 0x7c, 0x9b, 0x9c, 0x54, 0xbc, 0x3d, 0x49, 0x43, 0x9f, 0xc3, 0xc2, 0x79, 0x1b, 0xc8, 0x4f, + 0x38, 0x8e, 0x39, 0xcd, 0x9d, 0x75, 0x03, 0x3d, 0xf1, 0x1d, 0x98, 0xa5, 0x9c, 0x0c, 0xfa, 0x2c, + 0x4c, 0x3d, 0x71, 0xd1, 0x3b, 0x83, 0x38, 0x50, 0x47, 0x1c, 0xcf, 0x9c, 0x49, 0x7c, 0x1a, 0x07, + 0x68, 0x0d, 0xaa, 0xdc, 0x1b, 0xa4, 0xbd, 0xb6, 0xee, 0xdb, 0xa4, 0xba, 0x30, 0xbb, 0x9b, 0x22, + 0x86, 0x75, 0x0e, 0xbd, 0x01, 0x37, 0xb2, 0x5a, 0x23, 0x2f, 0xed, 0x75, 0xa4, 0x98, 0x2c, 0x4e, + 0x9c, 0xea, 0x4a, 0x79, 0xbd, 0x3e, 0x2a, 0xe4, 0x99, 0x97, 0xf6, 0x9e, 0xe9, 0x9c, 0xfb, 0x67, + 0x09, 0x60, 0x74, 0x3c, 0xd1, 0xfb, 0x39, 0x0b, 0xb5, 0xa4, 0x85, 0xae, 0x5d, 0x75, 0x9c, 0x2f, + 0x70, 0xd1, 0x1f, 0x4b, 0x23, 0x17, 0xbd, 0x05, 0x33, 0x31, 0x23, 0xbc, 0xdf, 0x67, 0x21, 0x65, + 0xb4, 0x33, 0x7a, 0x6a, 0xf0, 0xf5, 0x5c, 0xfc, 0x63, 0xf1, 0x7c, 0x5c, 0x66, 0xb8, 0xa5, 0x7f, + 0x61, 0xb8, 0x4f, 0x61, 0xce, 0x68, 0xf8, 0x8f, 0xdb, 0x35, 0x6d, 0x98, 0xba, 0x51, 0x33, 0x50, + 0x3e, 0x64, 0x43, 0xf9, 0x9c, 0xd4, 0xb1, 0xf8, 0x29, 0x7c, 0x8d, 0xfa, 0x89, 0xb7, 0x1f, 0x30, + 0xd9, 0x0e, 0x1b, 0x9b, 0x21, 0xba, 0x09, 0x53, 0x67, 0x3a, 0xa0, 0x85, 0x9f, 0xcc, 0x0b, 0xef, + 0x7e, 0x0b, 0xf5, 0xec, 0x46, 0xa3, 0xc7, 0x05, 0xb9, 0x6f, 0x5e, 0x61, 0x00, 0x17, 0xa8, 0xdd, + 0x1c, 0x89, 0x5d, 0x58, 0xdd, 0xba, 0x60, 0xf5, 0x07, 0x50, 0xd3, 0xb6, 0x80, 0x5e, 0x03, 0xe4, + 0xc9, 0x47, 0xa6, 0x43, 0x59, 0x42, 0x62, 0x3f, 0x92, 0xcf, 0x93, 0x6a, 0xcf, 0xac, 0xca, 0xec, + 0x8c, 0x12, 0xee, 0x07, 0x50, 0x55, 0xe6, 0x80, 0xde, 0x81, 0x79, 0xf6, 0x4d, 0x14, 0xf8, 0xc4, + 0x4f, 0x3b, 0xb9, 0x4f, 0x32, 0x21, 0x9a, 0x72, 0x57, 0x1b, 0x3b, 0x06, 0xb0, 0x79, 0x2e, 0xef, + 0x7e, 0x01, 0xb6, 0xf1, 0x0b, 0xa1, 0xa4, 0xde, 0x88, 0xbe, 0xc0, 0x66, 0x88, 0x36, 0xc0, 0xa6, + 0x9c, 0x8c, 0x7f, 0x02, 0xca, 0x94, 0x13, 0xf7, 0x01, 0xc0, 0xc8, 0x50, 0xd0, 0x6d, 0x50, 0xaf, + 0x81, 0xf6, 0xf1, 0xec, 0xc1, 0xd5, 0xdf, 0x1a, 0x7b, 0x22, 0xa7, 0x1f, 0x8c, 0xf6, 0x63, 0xa8, + 0x67, 0x09, 0xd4, 0x86, 0x9a, 0xae, 0x10, 0xcd, 0x9c, 0xff, 0x7c, 0x70, 0x67, 0x0b, 0xed, 0x59, + 0xb7, 0xee, 0x59, 0x5b, 0x8f, 0x4e, 0x7e, 0x5f, 0xba, 0x76, 0xf2, 0x7c, 0xc9, 0xfa, 0xed, 0xf9, + 0x92, 0xf5, 0xd3, 0x1f, 0x4b, 0xd6, 0x97, 0x77, 0xc7, 0xfa, 0x8e, 0xd2, 0x93, 0xed, 0x57, 0x65, + 0x68, 0xe3, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xae, 0x80, 0x32, 0xe7, 0x75, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1374,6 +1376,11 @@ func (m *Request_Validate_Binding) MarshalToSizedBuffer(dAtA []byte) (int, error i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Backfill != 0 { + i = encodeVarintCapture(dAtA, i, uint64(m.Backfill)) + i-- + dAtA[i] = 0x18 + } { size, err := m.Collection.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -2214,6 +2221,9 @@ func (m *Request_Validate_Binding) ProtoSize() (n int) { } l = m.Collection.ProtoSize() n += 1 + l + sovCapture(uint64(l)) + if m.Backfill != 0 { + n += 1 + sovCapture(uint64(m.Backfill)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -3299,6 +3309,25 @@ func (m *Request_Validate_Binding) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Backfill", wireType) + } + m.Backfill = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCapture + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Backfill |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipCapture(dAtA[iNdEx:]) diff --git a/go/protocols/capture/capture.proto b/go/protocols/capture/capture.proto index 980afd0ef1..279657dc5d 100644 --- a/go/protocols/capture/capture.proto +++ b/go/protocols/capture/capture.proto @@ -115,6 +115,8 @@ message Request { ]; // Collection to be captured. flow.CollectionSpec collection = 2 [ (gogoproto.nullable) = false ]; + // Backfill counter for this binding. + uint32 backfill = 3; } repeated Binding bindings = 4; } diff --git a/go/protocols/derive/derive.pb.go b/go/protocols/derive/derive.pb.go index 46b0503557..6c14dd4526 100644 --- a/go/protocols/derive/derive.pb.go +++ b/go/protocols/derive/derive.pb.go @@ -199,10 +199,12 @@ type Request_Validate_Transform struct { // If this transform has no shuffle lambda, this is empty. ShuffleLambdaConfigJson encoding_json.RawMessage `protobuf:"bytes,3,opt,name=shuffle_lambda_config_json,json=shuffleLambdaConfig,proto3,casttype=encoding/json.RawMessage" json:"shuffle_lambda_config_json,omitempty"` // JSON-encoded object which specifies the lambda configuration. - LambdaConfigJson encoding_json.RawMessage `protobuf:"bytes,4,opt,name=lambda_config_json,json=lambdaConfig,proto3,casttype=encoding/json.RawMessage" json:"lambda_config_json,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + LambdaConfigJson encoding_json.RawMessage `protobuf:"bytes,4,opt,name=lambda_config_json,json=lambdaConfig,proto3,casttype=encoding/json.RawMessage" json:"lambda_config_json,omitempty"` + // Backfill counter for this transform. + Backfill uint32 `protobuf:"varint,5,opt,name=backfill,proto3" json:"backfill,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Request_Validate_Transform) Reset() { *m = Request_Validate_Transform{} } @@ -900,85 +902,85 @@ func init() { func init() { proto.RegisterFile("go/protocols/derive/derive.proto", fileDescriptor_4410d076c75e1e4f) } var fileDescriptor_4410d076c75e1e4f = []byte{ - // 1235 bytes of a gzipped FileDescriptorProto + // 1248 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0xdd, 0x6e, 0x1b, 0xc5, - 0x17, 0xef, 0x3a, 0xfe, 0xda, 0x13, 0xc7, 0x69, 0xa7, 0xf9, 0xff, 0x59, 0x6d, 0xa2, 0x34, 0x94, + 0x17, 0xef, 0x3a, 0xfe, 0xda, 0x13, 0x27, 0x69, 0xa7, 0xf9, 0xff, 0x59, 0x6d, 0xa2, 0x34, 0x94, 0x22, 0x0c, 0x11, 0x0e, 0x72, 0x2b, 0x28, 0xa5, 0x20, 0x1a, 0xb7, 0x41, 0x15, 0x54, 0xa9, 0x26, - 0x0d, 0x95, 0xb8, 0xb1, 0x36, 0xbb, 0xc7, 0xf6, 0x36, 0xeb, 0x9d, 0x65, 0x67, 0x36, 0x95, 0x5f, - 0x84, 0x4a, 0x5c, 0x21, 0x1e, 0x02, 0x89, 0x37, 0xc8, 0x25, 0x4f, 0x50, 0x89, 0xf2, 0x00, 0xdc, - 0xf7, 0x0a, 0xcd, 0xc7, 0x6e, 0xec, 0xd8, 0x29, 0xee, 0x1d, 0x37, 0xc9, 0x9c, 0x73, 0x7e, 0xe7, - 0xcc, 0xcc, 0x39, 0x67, 0xce, 0x6f, 0x0d, 0x5b, 0x03, 0xb6, 0x93, 0xa4, 0x4c, 0x30, 0x9f, 0x45, - 0x7c, 0x27, 0xc0, 0x34, 0x3c, 0x41, 0xf3, 0xaf, 0xad, 0xf4, 0xa4, 0xaa, 0x25, 0x77, 0xcb, 0x67, - 0x31, 0xcf, 0x46, 0x98, 0x16, 0xf8, 0x62, 0xa1, 0x91, 0xee, 0xc6, 0x54, 0xac, 0x7e, 0xc4, 0x9e, - 0xab, 0x3f, 0xc6, 0xba, 0x36, 0x60, 0x03, 0xa6, 0x96, 0x3b, 0x72, 0xa5, 0xb5, 0xd7, 0xff, 0x6e, - 0x42, 0x8d, 0xe2, 0x8f, 0x19, 0x72, 0x41, 0x5a, 0x50, 0xe6, 0x09, 0xfa, 0x8e, 0xb5, 0x65, 0xb5, - 0x96, 0x3b, 0x6b, 0x6d, 0x73, 0x0c, 0x63, 0x6e, 0x1f, 0x24, 0xe8, 0x53, 0x85, 0x20, 0xb7, 0xa0, - 0x7e, 0xe2, 0x45, 0x61, 0xe0, 0x09, 0x74, 0x4a, 0x0a, 0xed, 0x9c, 0x47, 0x7f, 0x6f, 0xec, 0xb4, - 0x40, 0xca, 0xf8, 0x2c, 0xc1, 0xd8, 0x59, 0x9a, 0x1f, 0x7f, 0x3f, 0xc1, 0x98, 0x2a, 0x84, 0x44, - 0xa6, 0xe8, 0x05, 0x4e, 0x79, 0x3e, 0x92, 0xa2, 0x17, 0x50, 0x85, 0x20, 0xdb, 0x50, 0xe9, 0x47, - 0x19, 0x1f, 0x3a, 0x15, 0x05, 0xfd, 0xdf, 0x79, 0xe8, 0x9e, 0x34, 0x52, 0x8d, 0x21, 0x5f, 0x41, - 0x83, 0x0b, 0x2f, 0x15, 0x3d, 0x9f, 0x8d, 0x46, 0xa1, 0x70, 0xaa, 0xca, 0x67, 0x7d, 0xe6, 0xa2, - 0x12, 0xd3, 0x55, 0x10, 0xba, 0xcc, 0xcf, 0x04, 0xb9, 0x59, 0x8a, 0x1c, 0x85, 0x53, 0x9b, 0xbf, - 0x19, 0x95, 0x46, 0xaa, 0x31, 0x64, 0x1d, 0xea, 0x61, 0x2c, 0x30, 0x8d, 0xbd, 0xc8, 0x09, 0xb6, - 0xac, 0x56, 0x83, 0xda, 0x37, 0x72, 0x85, 0xfb, 0xc2, 0x82, 0xb2, 0xcc, 0x27, 0x79, 0x02, 0x4d, - 0x9f, 0xc5, 0x31, 0xfa, 0x82, 0xa5, 0x3d, 0x31, 0x4e, 0x50, 0x65, 0xbf, 0xd9, 0xf9, 0xb8, 0xad, - 0x4a, 0xd7, 0x65, 0x51, 0x84, 0xbe, 0x08, 0x59, 0x2c, 0xd1, 0xed, 0xfb, 0x72, 0x3f, 0x4f, 0x8a, - 0xed, 0x6e, 0xee, 0xf5, 0x64, 0x9c, 0x20, 0x5d, 0xf1, 0x27, 0x45, 0xf2, 0x39, 0x2c, 0xfb, 0x2c, - 0xee, 0x87, 0x83, 0xde, 0x33, 0xce, 0x62, 0x55, 0x22, 0x7b, 0x77, 0xe3, 0xf5, 0xcb, 0x6b, 0x0e, - 0xc6, 0x3e, 0x0b, 0xc2, 0x78, 0xb0, 0x23, 0x0d, 0x6d, 0xea, 0x3d, 0x7f, 0x84, 0x9c, 0x7b, 0x03, - 0xa4, 0x55, 0xed, 0xe0, 0xfe, 0x5c, 0x85, 0x7a, 0x5e, 0xbb, 0xff, 0xdc, 0xe9, 0xc8, 0x1d, 0x00, - 0xbf, 0xd8, 0xb4, 0x68, 0xa4, 0x39, 0x87, 0xd9, 0x2d, 0x9f, 0xbe, 0xbc, 0x76, 0x89, 0x4e, 0xa0, - 0xc9, 0x2e, 0x80, 0x48, 0xbd, 0x98, 0xf7, 0x59, 0x3a, 0xe2, 0x4e, 0x79, 0x6b, 0xa9, 0xb5, 0xdc, - 0xb9, 0x7e, 0x51, 0xdb, 0xb6, 0x9f, 0xe4, 0x50, 0x3a, 0xe1, 0x45, 0x9e, 0xc2, 0x15, 0x3e, 0xcc, - 0xfa, 0xfd, 0x08, 0x7b, 0xc7, 0x38, 0x56, 0x29, 0xe1, 0x4e, 0x65, 0x6b, 0xa9, 0xd5, 0xec, 0x6c, - 0xff, 0x5b, 0x4e, 0x0e, 0xb4, 0xa3, 0xca, 0xc8, 0xaa, 0x89, 0xf2, 0x2d, 0x8e, 0xa5, 0xcc, 0xc9, - 0xbb, 0xd0, 0x48, 0x52, 0xf6, 0x0c, 0x7d, 0xd1, 0x4b, 0x19, 0xd3, 0xad, 0x69, 0xd3, 0x65, 0xa3, - 0xa3, 0x8c, 0x09, 0xb2, 0x07, 0x10, 0x8e, 0x12, 0x96, 0x8a, 0xde, 0xc8, 0x4b, 0x9c, 0x9a, 0x3a, - 0xff, 0x07, 0x17, 0x9e, 0xff, 0xa1, 0x82, 0x3e, 0xf2, 0x92, 0x07, 0xb1, 0x48, 0xc7, 0xd4, 0x0e, - 0x73, 0xd9, 0x7d, 0x6d, 0x81, 0x5d, 0xdc, 0x8e, 0x10, 0x28, 0xc7, 0xde, 0x48, 0x17, 0xd6, 0xa6, - 0x6a, 0x7d, 0x2e, 0xcb, 0xa5, 0xb7, 0xca, 0xf2, 0x21, 0xb8, 0x79, 0x86, 0x22, 0x6f, 0x74, 0x14, - 0x78, 0xbd, 0xc9, 0x5a, 0x2f, 0x2d, 0x50, 0xeb, 0xab, 0xc6, 0xff, 0x3b, 0xe5, 0xde, 0xd5, 0x85, - 0xdf, 0x03, 0x32, 0x27, 0x5c, 0x79, 0x81, 0x70, 0x8d, 0x68, 0x22, 0x8e, 0x7b, 0x17, 0x9a, 0xd3, - 0x99, 0x21, 0x97, 0x61, 0xe9, 0x18, 0xc7, 0xe6, 0xfe, 0x72, 0x49, 0xd6, 0xa0, 0x72, 0xe2, 0x45, - 0x99, 0x1e, 0x6d, 0x36, 0xd5, 0xc2, 0x9d, 0xd2, 0x6d, 0xcb, 0xfd, 0xcd, 0x82, 0xb2, 0x1c, 0x53, - 0xe4, 0xd6, 0x54, 0x86, 0xac, 0x8b, 0x33, 0x34, 0x95, 0x1b, 0x07, 0x6a, 0x27, 0x98, 0xf2, 0x3c, - 0xa9, 0x36, 0xcd, 0x45, 0xf2, 0x3e, 0x54, 0x52, 0x2f, 0x1e, 0xa0, 0x69, 0xe9, 0x55, 0x1d, 0x8a, - 0x4a, 0x95, 0x8a, 0xa2, 0xad, 0xe4, 0x33, 0x00, 0x2e, 0x3c, 0x81, 0xfa, 0xf6, 0x95, 0x05, 0x6e, - 0x5f, 0x51, 0x78, 0xf7, 0xd7, 0x12, 0x94, 0xe5, 0xd4, 0x24, 0x1b, 0x60, 0x17, 0xed, 0xac, 0xce, - 0xbd, 0x42, 0xcf, 0x14, 0xe4, 0x3d, 0x28, 0x67, 0x59, 0x18, 0x98, 0x92, 0x9b, 0x53, 0x1c, 0x1e, - 0x3e, 0xbc, 0xff, 0xd8, 0x4b, 0x05, 0xa7, 0xca, 0x48, 0x3e, 0x85, 0x9a, 0xa9, 0x90, 0x39, 0xed, - 0xc6, 0xbc, 0xf9, 0x9c, 0xb7, 0x3b, 0xcd, 0xc1, 0xe4, 0x26, 0xd4, 0x03, 0xe6, 0x2f, 0x5e, 0xb8, - 0xa5, 0x80, 0xf9, 0xee, 0x33, 0xa8, 0x1d, 0x9c, 0xf9, 0xcb, 0x37, 0xa7, 0xfc, 0xad, 0x45, 0xfc, - 0x65, 0x2d, 0xff, 0x0f, 0xd5, 0xc4, 0xf3, 0x8f, 0x51, 0xdf, 0xa9, 0x41, 0x8d, 0x24, 0xdb, 0x7e, - 0xe8, 0xf1, 0xa1, 0xba, 0xc1, 0x0a, 0x55, 0x6b, 0xb7, 0x06, 0x15, 0x45, 0x17, 0x2e, 0x85, 0xe5, - 0x09, 0x0e, 0x20, 0x5d, 0x20, 0x69, 0x16, 0x8b, 0x70, 0x84, 0x3d, 0x7f, 0x88, 0xfe, 0x71, 0xc2, - 0xc2, 0x58, 0x14, 0x45, 0xcf, 0x69, 0xb9, 0xdd, 0x2d, 0x6c, 0xf4, 0x8a, 0xc1, 0x9f, 0xa9, 0x64, - 0x70, 0x45, 0x0f, 0xd7, 0x7f, 0xaf, 0x43, 0x9d, 0x22, 0x4f, 0x58, 0xcc, 0x91, 0x7c, 0x38, 0x45, - 0xb9, 0x13, 0x84, 0xa2, 0xed, 0x93, 0x9c, 0x7b, 0x1b, 0xec, 0x9c, 0x49, 0xf3, 0x02, 0xb9, 0x33, - 0xf8, 0xfc, 0xf9, 0x07, 0xf4, 0x0c, 0x4c, 0x76, 0xa0, 0x2a, 0x59, 0x15, 0x03, 0x53, 0xaf, 0x77, - 0x66, 0xdc, 0xf6, 0x95, 0x99, 0x1a, 0x98, 0xdc, 0x2a, 0xc9, 0x8e, 0xa2, 0x90, 0x0f, 0x31, 0xe7, - 0xe0, 0xd9, 0xad, 0x1e, 0xe7, 0x08, 0x7a, 0x06, 0x26, 0x1d, 0xa8, 0x29, 0xaa, 0xc5, 0xc0, 0x10, - 0xb2, 0x33, 0xe3, 0xb7, 0xa7, 0xed, 0x34, 0x07, 0x92, 0x07, 0xd0, 0x54, 0x24, 0x8b, 0xc1, 0x34, - 0x2f, 0x6f, 0xce, 0x66, 0x43, 0xc3, 0x0c, 0x35, 0xaf, 0xf0, 0x49, 0xf1, 0xcd, 0x7c, 0xfb, 0x53, - 0xc9, 0xf0, 0xad, 0x0b, 0xf5, 0xfc, 0x13, 0xc9, 0xb4, 0x7f, 0x21, 0xcb, 0x19, 0x63, 0x86, 0x0b, - 0xf7, 0x87, 0x38, 0xf2, 0x16, 0xa7, 0xa7, 0x86, 0xf6, 0x3b, 0x50, 0x6e, 0xe4, 0x29, 0xac, 0xa7, - 0xc8, 0x59, 0x96, 0xfa, 0xd8, 0x9b, 0x13, 0x70, 0x91, 0x19, 0xb8, 0x96, 0x07, 0xe8, 0x4e, 0x06, - 0xde, 0x86, 0x2b, 0x01, 0xf3, 0xb3, 0x11, 0xc6, 0x42, 0x51, 0x4a, 0x2f, 0x4b, 0x23, 0xfd, 0x94, - 0xe8, 0xe5, 0x29, 0xc3, 0x61, 0x1a, 0x91, 0x1b, 0x50, 0x65, 0x5e, 0x26, 0x86, 0x1d, 0x53, 0x89, - 0x86, 0x7e, 0xcd, 0xfb, 0xf7, 0xa4, 0x8e, 0x1a, 0x9b, 0xfb, 0xa2, 0x04, 0x76, 0xd1, 0x34, 0xe4, - 0xfe, 0x14, 0x45, 0x5a, 0x8a, 0x62, 0x6e, 0x5c, 0xdc, 0x64, 0x17, 0x92, 0xe4, 0xea, 0x00, 0x63, - 0x4c, 0x25, 0xa4, 0xd7, 0x0f, 0x23, 0xe4, 0x4e, 0x49, 0x85, 0x6a, 0xbf, 0x21, 0xd4, 0x37, 0xb9, - 0xc7, 0x9e, 0x74, 0xd0, 0xa4, 0xd5, 0x1c, 0x4c, 0x29, 0xdd, 0xd6, 0x24, 0x71, 0xad, 0x83, 0x2d, - 0xbf, 0x00, 0x7b, 0x2c, 0x8e, 0xf4, 0xf4, 0xae, 0xd3, 0xba, 0x54, 0xec, 0xc7, 0xd1, 0xd8, 0xbd, - 0x07, 0x57, 0xe7, 0x04, 0x7c, 0xab, 0x59, 0x5f, 0x87, 0xaa, 0x7e, 0x16, 0xee, 0xd7, 0x60, 0x17, - 0xcd, 0x3e, 0x35, 0xc5, 0xac, 0x45, 0xa7, 0x98, 0x0d, 0x35, 0xd3, 0xf6, 0xee, 0x17, 0xb0, 0x32, - 0xd5, 0xc6, 0xe4, 0x23, 0xd0, 0x33, 0xfa, 0x3c, 0x8b, 0x98, 0x2f, 0xa6, 0x03, 0x69, 0x33, 0x63, - 0xbc, 0x73, 0x17, 0xec, 0xc2, 0x20, 0x9f, 0xb5, 0xfa, 0xba, 0x40, 0xb2, 0x7a, 0x6e, 0x00, 0xbb, - 0x97, 0xcf, 0x27, 0xba, 0x65, 0x7d, 0x62, 0xed, 0x7e, 0x79, 0xfa, 0xe7, 0xe6, 0xa5, 0xd3, 0x57, - 0x9b, 0xd6, 0x1f, 0xaf, 0x36, 0xad, 0x5f, 0xfe, 0xda, 0xb4, 0x7e, 0xd8, 0x1e, 0x84, 0x62, 0x98, - 0x1d, 0xb5, 0x7d, 0x36, 0xda, 0x41, 0x2e, 0x32, 0x2f, 0x1d, 0xeb, 0xdf, 0x0d, 0x73, 0x7e, 0x95, - 0x1c, 0x55, 0x95, 0xe6, 0xe6, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x54, 0xb7, 0x4c, 0xba, 0xb3, - 0x0c, 0x00, 0x00, + 0x0d, 0x95, 0xb8, 0xb1, 0x26, 0xbb, 0x63, 0x7b, 0x9b, 0xdd, 0x9d, 0x65, 0x66, 0x36, 0x95, 0x9f, + 0x81, 0xfb, 0xf6, 0x16, 0xf1, 0x10, 0x95, 0x78, 0x83, 0x5c, 0xf2, 0x04, 0x95, 0x28, 0x6f, 0xc1, + 0x15, 0x9a, 0x8f, 0xdd, 0xd8, 0x89, 0x53, 0xdc, 0x3b, 0x6e, 0x92, 0x39, 0xe7, 0xfc, 0xce, 0x99, + 0xd9, 0x73, 0xce, 0x9c, 0xdf, 0x18, 0x36, 0x87, 0x6c, 0x3b, 0xe3, 0x4c, 0xb2, 0x80, 0xc5, 0x62, + 0x3b, 0xa4, 0x3c, 0x3a, 0xa6, 0xf6, 0x5f, 0x47, 0xeb, 0x51, 0xdd, 0x48, 0xfe, 0x66, 0xc0, 0x52, + 0x91, 0x27, 0x94, 0x97, 0xf8, 0x72, 0x61, 0x90, 0xfe, 0xfa, 0x54, 0xac, 0x41, 0xcc, 0x9e, 0xeb, + 0x3f, 0xd6, 0xba, 0x3a, 0x64, 0x43, 0xa6, 0x97, 0xdb, 0x6a, 0x65, 0xb4, 0xd7, 0x7f, 0x59, 0x81, + 0x06, 0xa6, 0x3f, 0xe7, 0x54, 0x48, 0xd4, 0x86, 0xaa, 0xc8, 0x68, 0xe0, 0x39, 0x9b, 0x4e, 0x7b, + 0xb1, 0xbb, 0xda, 0xb1, 0xc7, 0xb0, 0xe6, 0xce, 0x7e, 0x46, 0x03, 0xac, 0x11, 0xe8, 0x16, 0x34, + 0x8f, 0x49, 0x1c, 0x85, 0x44, 0x52, 0xaf, 0xa2, 0xd1, 0xde, 0x59, 0xf4, 0x8f, 0xd6, 0x8e, 0x4b, + 0xa4, 0x8a, 0xcf, 0x32, 0x9a, 0x7a, 0x0b, 0xb3, 0xe3, 0xef, 0x65, 0x34, 0xc5, 0x1a, 0xa1, 0x90, + 0x9c, 0x92, 0xd0, 0xab, 0xce, 0x46, 0x62, 0x4a, 0x42, 0xac, 0x11, 0x68, 0x0b, 0x6a, 0x83, 0x38, + 0x17, 0x23, 0xaf, 0xa6, 0xa1, 0xff, 0x3b, 0x0b, 0xdd, 0x55, 0x46, 0x6c, 0x30, 0xe8, 0x1b, 0x68, + 0x09, 0x49, 0xb8, 0xec, 0x07, 0x2c, 0x49, 0x22, 0xe9, 0xd5, 0xb5, 0xcf, 0xda, 0xb9, 0x0f, 0x55, + 0x98, 0x9e, 0x86, 0xe0, 0x45, 0x71, 0x2a, 0xa8, 0xcd, 0x38, 0x15, 0x54, 0x7a, 0x8d, 0xd9, 0x9b, + 0x61, 0x65, 0xc4, 0x06, 0x83, 0xd6, 0xa0, 0x19, 0xa5, 0x92, 0xf2, 0x94, 0xc4, 0x5e, 0xb8, 0xe9, + 0xb4, 0x5b, 0xd8, 0xbd, 0x51, 0x28, 0xfc, 0x97, 0x0e, 0x54, 0x55, 0x3e, 0xd1, 0x13, 0x58, 0x0e, + 0x58, 0x9a, 0xd2, 0x40, 0x32, 0xde, 0x97, 0xe3, 0x8c, 0xea, 0xec, 0x2f, 0x77, 0x3f, 0xed, 0xe8, + 0xd2, 0xf5, 0x58, 0x1c, 0xd3, 0x40, 0x46, 0x2c, 0x55, 0xe8, 0xce, 0x7d, 0xb5, 0x1f, 0x51, 0x62, + 0xa7, 0x57, 0x78, 0x3d, 0x19, 0x67, 0x14, 0x2f, 0x05, 0x93, 0x22, 0xfa, 0x12, 0x16, 0x03, 0x96, + 0x0e, 0xa2, 0x61, 0xff, 0x99, 0x60, 0xa9, 0x2e, 0x91, 0xbb, 0xb3, 0xfe, 0xf7, 0xeb, 0x6b, 0x1e, + 0x4d, 0x03, 0x16, 0x46, 0xe9, 0x70, 0x5b, 0x19, 0x3a, 0x98, 0x3c, 0x7f, 0x44, 0x85, 0x20, 0x43, + 0x8a, 0xeb, 0xc6, 0xc1, 0x7f, 0x55, 0x87, 0x66, 0x51, 0xbb, 0xff, 0xdc, 0xe9, 0xd0, 0x1d, 0x80, + 0xa0, 0xdc, 0xb4, 0x6c, 0xa4, 0x19, 0x87, 0xd9, 0xa9, 0x9e, 0xbc, 0xbe, 0x76, 0x09, 0x4f, 0xa0, + 0xd1, 0x0e, 0x80, 0xe4, 0x24, 0x15, 0x03, 0xc6, 0x13, 0xe1, 0x55, 0x37, 0x17, 0xda, 0x8b, 0xdd, + 0xeb, 0x17, 0xb5, 0x6d, 0xe7, 0x49, 0x01, 0xc5, 0x13, 0x5e, 0xe8, 0x29, 0x5c, 0x11, 0xa3, 0x7c, + 0x30, 0x88, 0x69, 0xff, 0x88, 0x8e, 0x75, 0x4a, 0x84, 0x57, 0xdb, 0x5c, 0x68, 0x2f, 0x77, 0xb7, + 0xfe, 0x2d, 0x27, 0xfb, 0xc6, 0x51, 0x67, 0x64, 0xc5, 0x46, 0xf9, 0x9e, 0x8e, 0x95, 0x2c, 0xd0, + 0xfb, 0xd0, 0xca, 0x38, 0x7b, 0x46, 0x03, 0xd9, 0xe7, 0x8c, 0x99, 0xd6, 0x74, 0xf1, 0xa2, 0xd5, + 0x61, 0xc6, 0x24, 0xda, 0x05, 0x88, 0x92, 0x8c, 0x71, 0xd9, 0x4f, 0x48, 0xe6, 0x35, 0xf4, 0xf9, + 0x3f, 0xba, 0xf0, 0xfc, 0x0f, 0x35, 0xf4, 0x11, 0xc9, 0x1e, 0xa4, 0x92, 0x8f, 0xb1, 0x1b, 0x15, + 0xb2, 0xff, 0xa2, 0x02, 0x6e, 0xf9, 0x75, 0x08, 0x41, 0x35, 0x25, 0x89, 0x29, 0xac, 0x8b, 0xf5, + 0xfa, 0x4c, 0x96, 0x2b, 0xef, 0x94, 0xe5, 0x03, 0xf0, 0x8b, 0x0c, 0xc5, 0x24, 0x39, 0x0c, 0x49, + 0x7f, 0xb2, 0xd6, 0x0b, 0x73, 0xd4, 0xfa, 0xaa, 0xf5, 0xff, 0x41, 0xbb, 0xf7, 0x4c, 0xe1, 0x77, + 0x01, 0xcd, 0x08, 0x57, 0x9d, 0x23, 0x5c, 0x2b, 0x9e, 0x8c, 0xe3, 0x43, 0xf3, 0x90, 0x04, 0x47, + 0x83, 0x28, 0x8e, 0xf5, 0xc8, 0x58, 0xc2, 0xa5, 0xec, 0xdf, 0x85, 0xe5, 0xe9, 0xac, 0xa1, 0xcb, + 0xb0, 0x70, 0x44, 0xc7, 0x36, 0x37, 0x6a, 0x89, 0x56, 0xa1, 0x76, 0x4c, 0xe2, 0xdc, 0x8c, 0x3d, + 0x17, 0x1b, 0xe1, 0x4e, 0xe5, 0xb6, 0xe3, 0xbf, 0x72, 0xa0, 0xaa, 0x46, 0x18, 0xba, 0x35, 0x95, + 0x3d, 0xe7, 0xe2, 0xec, 0x4d, 0xe5, 0xcd, 0x83, 0xc6, 0x31, 0xe5, 0xa2, 0x48, 0xb8, 0x8b, 0x0b, + 0x11, 0x7d, 0x08, 0x35, 0x4e, 0xd2, 0x21, 0xb5, 0xed, 0xbe, 0x62, 0x42, 0x61, 0xa5, 0xd2, 0x51, + 0x8c, 0x15, 0x7d, 0x01, 0x20, 0x24, 0x91, 0xd4, 0x64, 0xa6, 0x36, 0x47, 0x66, 0x6a, 0x1a, 0xef, + 0xff, 0x56, 0x81, 0xaa, 0x9a, 0xa8, 0x68, 0x1d, 0xdc, 0xb2, 0xd5, 0xf5, 0xb9, 0x97, 0xf0, 0xa9, + 0x02, 0x7d, 0x00, 0xd5, 0x3c, 0x8f, 0x42, 0xdb, 0x0e, 0xf6, 0x14, 0x07, 0x07, 0x0f, 0xef, 0x3f, + 0x26, 0x5c, 0x0a, 0xac, 0x8d, 0xe8, 0x73, 0x68, 0xd8, 0xea, 0xd9, 0xd3, 0xae, 0xcf, 0x9a, 0xdd, + 0xc5, 0x55, 0xc0, 0x05, 0x18, 0xdd, 0x84, 0x66, 0xc8, 0x82, 0xf9, 0x8b, 0xba, 0x10, 0xb2, 0xc0, + 0x7f, 0x06, 0x8d, 0xfd, 0x53, 0x7f, 0x75, 0x1f, 0xb5, 0xbf, 0x33, 0x8f, 0xbf, 0xaa, 0xe5, 0xff, + 0xa1, 0x9e, 0x91, 0xe0, 0x88, 0x9a, 0x6f, 0x6a, 0x61, 0x2b, 0xa9, 0x2b, 0x31, 0x22, 0x62, 0xa4, + 0xbf, 0x60, 0x09, 0xeb, 0xb5, 0xdf, 0x80, 0x9a, 0xa6, 0x12, 0x1f, 0xc3, 0xe2, 0x04, 0x3f, 0xa0, + 0x1e, 0x20, 0x9e, 0xa7, 0x32, 0x4a, 0x68, 0x3f, 0x18, 0xd1, 0xe0, 0x28, 0x63, 0x51, 0x2a, 0xcb, + 0xa2, 0x17, 0x94, 0xdd, 0xe9, 0x95, 0x36, 0x7c, 0xc5, 0xe2, 0x4f, 0x55, 0x2a, 0xb8, 0xa6, 0x8e, + 0xeb, 0xbf, 0x37, 0xa1, 0x89, 0xa9, 0xc8, 0x58, 0x2a, 0x28, 0xfa, 0x78, 0x8a, 0x8e, 0x27, 0xc8, + 0xc6, 0xd8, 0x27, 0xf9, 0xf8, 0x36, 0xb8, 0x05, 0xcb, 0x16, 0x05, 0xf2, 0xcf, 0xe1, 0x8b, 0xd1, + 0x10, 0xe2, 0x53, 0x30, 0xda, 0x86, 0xba, 0x62, 0x5c, 0x1a, 0xda, 0x7a, 0xbd, 0x77, 0xce, 0x6d, + 0x4f, 0x9b, 0xb1, 0x85, 0xa9, 0xad, 0xb2, 0xfc, 0x30, 0x8e, 0xc4, 0x88, 0x16, 0xfc, 0x7c, 0x7e, + 0xab, 0xc7, 0x05, 0x02, 0x9f, 0x82, 0x51, 0x17, 0x1a, 0x9a, 0x86, 0x69, 0x68, 0xc9, 0xda, 0x3b, + 0xe7, 0xb7, 0x6b, 0xec, 0xb8, 0x00, 0xa2, 0x07, 0xb0, 0xac, 0x09, 0x98, 0x86, 0xd3, 0x9c, 0xbd, + 0x71, 0x3e, 0x1b, 0x06, 0x66, 0x69, 0x7b, 0x49, 0x4c, 0x8a, 0x6f, 0xe7, 0xe2, 0x17, 0x15, 0xcb, + 0xc5, 0x3e, 0x34, 0x8b, 0xe7, 0x93, 0x6d, 0xff, 0x52, 0x56, 0xf3, 0xc7, 0x0e, 0x1e, 0x11, 0x8c, + 0x68, 0x42, 0xe6, 0xa7, 0xae, 0x96, 0xf1, 0xdb, 0xd7, 0x6e, 0xe8, 0x29, 0xac, 0x71, 0x2a, 0x58, + 0xce, 0x03, 0xda, 0x9f, 0x11, 0x70, 0x9e, 0xf9, 0xb8, 0x5a, 0x04, 0xe8, 0x4d, 0x06, 0xde, 0x82, + 0x2b, 0x21, 0x0b, 0xf2, 0x84, 0xa6, 0x52, 0xd3, 0x4d, 0x3f, 0xe7, 0xb1, 0xb9, 0x4a, 0xf8, 0xf2, + 0x94, 0xe1, 0x80, 0xc7, 0xe8, 0x06, 0xd4, 0x19, 0xc9, 0xe5, 0xa8, 0x6b, 0x2b, 0xd1, 0x32, 0xb7, + 0x79, 0xef, 0x9e, 0xd2, 0x61, 0x6b, 0xf3, 0x5f, 0x56, 0xc0, 0x2d, 0x9b, 0x06, 0xdd, 0x9f, 0xa2, + 0x4f, 0x47, 0xd3, 0xcf, 0x8d, 0x8b, 0x9b, 0xec, 0x42, 0x02, 0x5d, 0x19, 0xd2, 0x94, 0x72, 0x05, + 0xe9, 0x0f, 0xa2, 0x98, 0x0a, 0xaf, 0xa2, 0x43, 0x75, 0xde, 0x12, 0xea, 0xbb, 0xc2, 0x63, 0x57, + 0x39, 0x18, 0x42, 0x5b, 0x1e, 0x4e, 0x29, 0xfd, 0xf6, 0x24, 0xa9, 0xad, 0x81, 0xab, 0x5e, 0x87, + 0x7d, 0x96, 0xc6, 0x66, 0x7a, 0x37, 0x71, 0x53, 0x29, 0xf6, 0xd2, 0x78, 0xec, 0xdf, 0x83, 0xab, + 0x33, 0x02, 0xbe, 0xd3, 0xac, 0x6f, 0x42, 0xdd, 0x5c, 0x0b, 0xff, 0x5b, 0x70, 0xcb, 0x66, 0x9f, + 0x9a, 0x62, 0xce, 0xbc, 0x53, 0xcc, 0x85, 0x86, 0x6d, 0x7b, 0xff, 0x2b, 0x58, 0x9a, 0x6a, 0x63, + 0xf4, 0x09, 0x98, 0x19, 0x7d, 0x96, 0x45, 0xec, 0x6b, 0x6a, 0x5f, 0xd9, 0xec, 0x18, 0xef, 0xde, + 0x05, 0xb7, 0x34, 0xa8, 0x6b, 0xad, 0x5f, 0x1e, 0x14, 0xad, 0x9c, 0x19, 0xc0, 0xfe, 0xe5, 0xb3, + 0x89, 0x6e, 0x3b, 0x9f, 0x39, 0x3b, 0x5f, 0x9f, 0xfc, 0xb9, 0x71, 0xe9, 0xe4, 0xcd, 0x86, 0xf3, + 0xc7, 0x9b, 0x0d, 0xe7, 0xd7, 0xbf, 0x36, 0x9c, 0x9f, 0xb6, 0x86, 0x91, 0x1c, 0xe5, 0x87, 0x9d, + 0x80, 0x25, 0xdb, 0x54, 0xc8, 0x9c, 0xf0, 0xb1, 0xf9, 0x4d, 0x31, 0xe3, 0x17, 0xcb, 0x61, 0x5d, + 0x6b, 0x6e, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0x83, 0x3a, 0xb3, 0x5b, 0xcf, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1383,6 +1385,11 @@ func (m *Request_Validate_Transform) MarshalToSizedBuffer(dAtA []byte) (int, err i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Backfill != 0 { + i = encodeVarintDerive(dAtA, i, uint64(m.Backfill)) + i-- + dAtA[i] = 0x28 + } if len(m.LambdaConfigJson) > 0 { i -= len(m.LambdaConfigJson) copy(dAtA[i:], m.LambdaConfigJson) @@ -2221,6 +2228,9 @@ func (m *Request_Validate_Transform) ProtoSize() (n int) { if l > 0 { n += 1 + l + sovDerive(uint64(l)) } + if m.Backfill != 0 { + n += 1 + sovDerive(uint64(m.Backfill)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -3513,6 +3523,25 @@ func (m *Request_Validate_Transform) Unmarshal(dAtA []byte) error { } m.LambdaConfigJson = encoding_json.RawMessage(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Backfill", wireType) + } + m.Backfill = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowDerive + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Backfill |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipDerive(dAtA[iNdEx:]) diff --git a/go/protocols/derive/derive.proto b/go/protocols/derive/derive.proto index d6a4c7d59e..d22f416456 100644 --- a/go/protocols/derive/derive.proto +++ b/go/protocols/derive/derive.proto @@ -65,6 +65,8 @@ message Request { (gogoproto.casttype) = "encoding/json.RawMessage", json_name = "lambdaConfig" ]; + // Backfill counter for this transform. + uint32 backfill = 5; } repeated Transform transforms = 4; // JSON types of shuffle key components extracted by the transforms of this derivation. diff --git a/go/protocols/flow/flow.pb.go b/go/protocols/flow/flow.pb.go index a1b2e43bbb..fcb4d7cf11 100644 --- a/go/protocols/flow/flow.pb.go +++ b/go/protocols/flow/flow.pb.go @@ -865,10 +865,13 @@ type CollectionSpec_Derivation_Transform struct { // When set, documents before this timestamp are not processed. NotBefore *types.Timestamp `protobuf:"bytes,11,opt,name=not_before,json=notBefore,proto3" json:"not_before,omitempty"` // When set, documents after this timestamp are not processed. - NotAfter *types.Timestamp `protobuf:"bytes,12,opt,name=not_after,json=notAfter,proto3" json:"not_after,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + NotAfter *types.Timestamp `protobuf:"bytes,12,opt,name=not_after,json=notAfter,proto3" json:"not_after,omitempty"` + // Backfill counter for this transform. + // Every increment of this counter results in a new backfill. + Backfill uint32 `protobuf:"varint,13,opt,name=backfill,proto3" json:"backfill,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *CollectionSpec_Derivation_Transform) Reset() { *m = CollectionSpec_Derivation_Transform{} } @@ -1020,10 +1023,15 @@ type CaptureSpec_Binding struct { // subresource being captured. ResourcePath []string `protobuf:"bytes,2,rep,name=resource_path,json=resourcePath,proto3" json:"resource_path,omitempty"` // Collection to be captured into. - Collection CollectionSpec `protobuf:"bytes,3,opt,name=collection,proto3" json:"collection"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Collection CollectionSpec `protobuf:"bytes,3,opt,name=collection,proto3" json:"collection"` + // Backfill counter for this binding. + // Every increment of this counter results in a new backfill. + Backfill uint32 `protobuf:"varint,4,opt,name=backfill,proto3" json:"backfill,omitempty"` + // A suggested key to use for this binding within connector states. + StateKey string `protobuf:"bytes,5,opt,name=state_key,json=stateKey,proto3" json:"state_key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *CaptureSpec_Binding) Reset() { *m = CaptureSpec_Binding{} } @@ -1139,10 +1147,15 @@ type MaterializationSpec_Binding struct { // When set, documents before this timestamp are not processed. NotBefore *types.Timestamp `protobuf:"bytes,10,opt,name=not_before,json=notBefore,proto3" json:"not_before,omitempty"` // When set, documents after this timestamp are not processed. - NotAfter *types.Timestamp `protobuf:"bytes,11,opt,name=not_after,json=notAfter,proto3" json:"not_after,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + NotAfter *types.Timestamp `protobuf:"bytes,11,opt,name=not_after,json=notAfter,proto3" json:"not_after,omitempty"` + // Backfill counter for this binding. + // Every increment of this counter results in a new backfill. + Backfill uint32 `protobuf:"varint,12,opt,name=backfill,proto3" json:"backfill,omitempty"` + // A suggested key to use for this binding within connector state. + StateKey string `protobuf:"bytes,13,opt,name=state_key,json=stateKey,proto3" json:"state_key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *MaterializationSpec_Binding) Reset() { *m = MaterializationSpec_Binding{} } @@ -2393,242 +2406,245 @@ func init() { func init() { proto.RegisterFile("go/protocols/flow/flow.proto", fileDescriptor_d0677502142fec31) } var fileDescriptor_d0677502142fec31 = []byte{ - // 3746 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0xcd, 0x6f, 0x1b, 0xd9, - 0x7d, 0x1a, 0x7e, 0xf3, 0xc7, 0x0f, 0x8d, 0x9e, 0x64, 0x9b, 0x66, 0xd6, 0xa2, 0x96, 0x49, 0xba, - 0xda, 0xdd, 0x2c, 0x95, 0x6a, 0x91, 0x74, 0x6d, 0xc3, 0x0d, 0xf8, 0x25, 0x9b, 0x36, 0x45, 0xb2, - 0x43, 0x2a, 0x1b, 0x07, 0x08, 0x06, 0xc3, 0x99, 0x47, 0x6a, 0x56, 0xc3, 0x19, 0x76, 0xe6, 0x51, - 0x36, 0x73, 0x69, 0xd1, 0x16, 0x28, 0xb0, 0x68, 0x81, 0x00, 0x45, 0x90, 0xdc, 0xba, 0x0d, 0x50, - 0xa0, 0x7f, 0x41, 0x81, 0xa6, 0x87, 0x16, 0xe8, 0x65, 0xfb, 0x05, 0x2c, 0x5a, 0xf4, 0x92, 0x83, - 0x17, 0x4d, 0x0f, 0x09, 0x50, 0xa0, 0xa7, 0x9e, 0x7c, 0x2a, 0xde, 0xc7, 0x0c, 0x87, 0xa2, 0x6c, - 0x51, 0x49, 0x7a, 0xc8, 0x85, 0x98, 0xf7, 0xfb, 0x9a, 0xf7, 0x7e, 0xdf, 0xf3, 0x7b, 0x84, 0x37, - 0xc6, 0xce, 0xc1, 0xd4, 0x75, 0x88, 0xa3, 0x3b, 0x96, 0x77, 0x30, 0xb2, 0x9c, 0x67, 0xec, 0xa7, - 0xc2, 0x60, 0x28, 0x46, 0x9f, 0x8b, 0xbb, 0x43, 0xd7, 0x39, 0xc3, 0x6e, 0x40, 0x17, 0x3c, 0x70, - 0xaa, 0xe2, 0x9e, 0xee, 0xd8, 0xde, 0x6c, 0xf2, 0x1a, 0x8a, 0x9d, 0xb1, 0x33, 0x76, 0xd8, 0xe3, - 0x01, 0x7d, 0x12, 0xd0, 0xd2, 0xd8, 0x71, 0xc6, 0x16, 0xe6, 0xc4, 0xc3, 0xd9, 0xe8, 0x80, 0x98, - 0x13, 0xec, 0x11, 0x6d, 0x32, 0xe5, 0x04, 0xe5, 0x07, 0x10, 0xef, 0x5b, 0xa6, 0x8e, 0xd1, 0x0e, - 0xc4, 0x87, 0x78, 0x6c, 0xda, 0x05, 0x69, 0x4f, 0xda, 0xcf, 0x29, 0x7c, 0x81, 0x64, 0x88, 0x62, - 0xdb, 0x28, 0x44, 0x18, 0x8c, 0x3e, 0xde, 0xcb, 0x7e, 0xf6, 0x17, 0xa5, 0x8d, 0xef, 0xfd, 0xa8, - 0xb4, 0xf1, 0xc3, 0x1f, 0x95, 0x36, 0xca, 0x36, 0xa4, 0x4f, 0x4e, 0x5a, 0x8d, 0x9e, 0xe6, 0x12, - 0x0f, 0x21, 0x88, 0xd9, 0x8e, 0x81, 0x99, 0x84, 0x84, 0xc2, 0x9e, 0xd1, 0x7d, 0x88, 0xeb, 0x96, - 0xa3, 0x9f, 0x31, 0x11, 0x89, 0xda, 0x97, 0x5f, 0xbe, 0x28, 0xbd, 0x39, 0x76, 0x2a, 0x63, 0xed, - 0xbb, 0x98, 0x10, 0x5c, 0x31, 0xf0, 0xf9, 0x81, 0xee, 0xb8, 0xf8, 0x60, 0x82, 0x3d, 0x4f, 0x1b, - 0xe3, 0x4a, 0x9d, 0x12, 0x2b, 0x9c, 0xe7, 0x9e, 0xfc, 0xf3, 0x4f, 0x4a, 0xd2, 0xd2, 0xfb, 0xfe, - 0x43, 0x02, 0xe8, 0xb9, 0xce, 0x47, 0x58, 0x27, 0xa6, 0xc3, 0xb6, 0x37, 0x25, 0x2e, 0x7b, 0x61, - 0x5a, 0xa1, 0x8f, 0xf4, 0x18, 0x23, 0x13, 0x5b, 0x7c, 0xcb, 0x69, 0x85, 0x2f, 0x50, 0x11, 0x52, - 0xf8, 0xf9, 0xd4, 0x32, 0x75, 0x93, 0x14, 0xa2, 0x7b, 0xd2, 0x7e, 0x4a, 0x09, 0xd6, 0x68, 0x1f, - 0x64, 0xd3, 0x53, 0xa7, 0x9a, 0x4b, 0x4c, 0x2a, 0x53, 0x3d, 0xc3, 0xf3, 0x42, 0x8c, 0xd1, 0xe4, - 0x4d, 0xaf, 0xe7, 0x83, 0x9f, 0xe0, 0x39, 0xfa, 0x12, 0xe4, 0x29, 0xa5, 0x6b, 0x4e, 0x34, 0x77, - 0xce, 0xe8, 0xe2, 0x8c, 0x2e, 0x6b, 0x7a, 0x3d, 0x0e, 0xa4, 0x54, 0xef, 0x43, 0xda, 0xb4, 0x47, - 0xd8, 0xc5, 0xb6, 0x8e, 0x0b, 0x89, 0x3d, 0x69, 0x3f, 0x73, 0xb8, 0x59, 0x61, 0x06, 0x6f, 0xf9, - 0xe0, 0x5a, 0xec, 0xd3, 0x17, 0xa5, 0x0d, 0x65, 0x41, 0x57, 0xfe, 0xdf, 0x28, 0xa4, 0x03, 0x34, - 0x3d, 0x04, 0x99, 0x4f, 0xb1, 0x57, 0x90, 0xf6, 0xa2, 0xf4, 0x10, 0x6c, 0x81, 0x2a, 0x90, 0xf0, - 0x88, 0x6b, 0xda, 0x63, 0x76, 0x84, 0xcc, 0xe1, 0xcd, 0x0b, 0x52, 0x2b, 0x7d, 0x86, 0x55, 0x04, - 0x15, 0x93, 0x62, 0x12, 0x0b, 0xb3, 0xd3, 0x50, 0x29, 0x74, 0x81, 0xf6, 0x20, 0x63, 0x60, 0x4f, - 0x77, 0xcd, 0x29, 0x3d, 0x16, 0x3b, 0x41, 0x5a, 0x09, 0x83, 0xd0, 0x7d, 0xc8, 0x1a, 0x78, 0xa4, - 0xcd, 0x2c, 0xa2, 0x7e, 0xe4, 0x39, 0x36, 0x3b, 0x43, 0xba, 0xf6, 0xc6, 0xcb, 0x17, 0xa5, 0x02, - 0xb6, 0x75, 0xc7, 0x30, 0xed, 0xf1, 0x01, 0x45, 0x54, 0x14, 0xed, 0xd9, 0x31, 0x37, 0x9b, 0x92, - 0x14, 0x1c, 0xe8, 0x26, 0x24, 0x3c, 0xac, 0xbb, 0x98, 0x14, 0x92, 0x4c, 0x37, 0x62, 0x45, 0x37, - 0x8f, 0x9f, 0x9b, 0x1e, 0xf1, 0x0a, 0xa9, 0x3d, 0x69, 0x3f, 0xbf, 0xba, 0xf9, 0x26, 0xc3, 0x2a, - 0x82, 0xaa, 0xf8, 0xe7, 0x12, 0x24, 0xf8, 0x79, 0xd0, 0x9b, 0x90, 0xd5, 0x1d, 0x9b, 0x60, 0x9b, - 0xa8, 0x54, 0x11, 0xec, 0xf4, 0x69, 0x25, 0x23, 0x60, 0x83, 0xf9, 0x14, 0xd3, 0xb7, 0x8e, 0x1c, - 0x77, 0xa2, 0x11, 0x71, 0x56, 0xb1, 0x42, 0x6f, 0x83, 0xec, 0xb3, 0xfa, 0x5b, 0x67, 0xfb, 0x4a, - 0x2b, 0x9b, 0x02, 0xde, 0x14, 0x60, 0x74, 0x07, 0x60, 0xa2, 0x3d, 0x57, 0x2d, 0x6c, 0x8f, 0xc9, - 0x29, 0x3b, 0x73, 0x4e, 0x49, 0x4f, 0xb4, 0xe7, 0x6d, 0x06, 0x78, 0x1c, 0x4b, 0x49, 0x72, 0xe4, - 0x71, 0x2c, 0x15, 0x91, 0xa3, 0x8f, 0x63, 0xa9, 0xb8, 0x9c, 0x28, 0xd7, 0x20, 0xc1, 0xf7, 0x8c, - 0x32, 0x90, 0x6c, 0x75, 0xbe, 0x59, 0x6d, 0xb7, 0x1a, 0xf2, 0x06, 0x4a, 0x41, 0xec, 0xf8, 0xa4, - 0x3f, 0x90, 0x25, 0x94, 0x84, 0xe8, 0x71, 0xf5, 0xa9, 0x1c, 0x41, 0x59, 0x48, 0xb5, 0x8e, 0x7b, - 0xed, 0x56, 0xbd, 0x35, 0x90, 0xa3, 0x08, 0x20, 0x51, 0xaf, 0x76, 0x3a, 0xdd, 0x81, 0x1c, 0x2b, - 0x3f, 0x85, 0x4c, 0x07, 0x93, 0x67, 0x8e, 0x7b, 0xd6, 0x73, 0x5c, 0xa6, 0x3c, 0x7b, 0x36, 0x19, - 0x62, 0x57, 0x04, 0xa1, 0x58, 0x51, 0xf7, 0xf5, 0xa3, 0x5d, 0xf8, 0x75, 0xb0, 0xa6, 0x3c, 0xd3, - 0xd9, 0xd0, 0x32, 0x75, 0xe1, 0xd8, 0x62, 0x55, 0xfe, 0x49, 0x1e, 0xf2, 0x75, 0xc7, 0xb2, 0x78, - 0xa4, 0xf4, 0xa7, 0x58, 0x47, 0x65, 0x88, 0xd9, 0xda, 0x84, 0xc7, 0x67, 0xba, 0x96, 0x7f, 0xf9, - 0xa2, 0x04, 0x0b, 0x0a, 0x85, 0xe1, 0x50, 0x03, 0xb6, 0x9e, 0xb9, 0x26, 0xc1, 0xaa, 0xa7, 0x9f, - 0xe2, 0x89, 0xc6, 0x3d, 0x20, 0xb5, 0x86, 0x07, 0x64, 0x18, 0x5b, 0x9f, 0x71, 0xa1, 0x1a, 0xc8, - 0x2e, 0xd6, 0x8c, 0x25, 0x21, 0x99, 0x35, 0x84, 0x00, 0xe5, 0x12, 0x32, 0x64, 0x88, 0xd2, 0x10, - 0x8b, 0xb2, 0x10, 0xa0, 0x8f, 0xe8, 0x36, 0xa4, 0x66, 0x33, 0xd3, 0x50, 0x69, 0xc8, 0x73, 0x3b, - 0x27, 0xe9, 0xba, 0x47, 0x5c, 0x6a, 0xe8, 0x45, 0x04, 0xb3, 0x98, 0xf7, 0x0a, 0x71, 0xc6, 0xb9, - 0x19, 0xc0, 0x8f, 0x18, 0x18, 0x7d, 0x00, 0x99, 0x69, 0x90, 0x41, 0xbc, 0x42, 0x62, 0x2f, 0xba, - 0x9f, 0x39, 0x94, 0xb9, 0x3b, 0x2e, 0x52, 0x8b, 0x08, 0xd1, 0x30, 0x29, 0xd5, 0x8d, 0xa6, 0x9f, - 0xa9, 0x04, 0x4f, 0xa6, 0x96, 0x46, 0x30, 0x3f, 0x56, 0x72, 0x1d, 0xdd, 0x68, 0xfa, 0xd9, 0x40, - 0x70, 0xa1, 0x06, 0xa0, 0xc5, 0x56, 0x7d, 0x59, 0x85, 0x34, 0x0b, 0xe9, 0x1b, 0x95, 0x20, 0xab, - 0x3f, 0x76, 0x66, 0xae, 0xad, 0x59, 0xd4, 0x70, 0xca, 0x56, 0xc0, 0x10, 0x48, 0xf9, 0x06, 0x80, - 0x81, 0x5d, 0xf3, 0x5c, 0x63, 0x51, 0x9c, 0x65, 0xdc, 0x25, 0x7e, 0x88, 0x65, 0xab, 0x57, 0x1a, - 0x01, 0x99, 0x12, 0x62, 0x29, 0xfe, 0x18, 0x00, 0x16, 0x28, 0x34, 0x80, 0xbc, 0xee, 0xd8, 0x36, - 0xd6, 0x89, 0xe3, 0xf2, 0x30, 0x93, 0x58, 0x9c, 0xbe, 0x77, 0x85, 0xcc, 0x4a, 0xdd, 0xe7, 0xa2, - 0x81, 0xa8, 0xe4, 0xf4, 0xf0, 0x12, 0xdd, 0x05, 0x1a, 0xa6, 0x23, 0x73, 0xcc, 0x75, 0x15, 0x59, - 0x43, 0x57, 0x09, 0xce, 0x80, 0xba, 0x00, 0xc4, 0xd5, 0x6c, 0x8f, 0x46, 0xb2, 0xc7, 0xbc, 0x20, - 0x73, 0xf8, 0xf6, 0x55, 0x9b, 0x19, 0xf8, 0x1c, 0xc2, 0x7c, 0x21, 0x11, 0xe8, 0x43, 0xd8, 0xf2, - 0x4e, 0x67, 0xa3, 0x91, 0x85, 0x69, 0xea, 0x56, 0x79, 0x82, 0x8d, 0xed, 0x45, 0xf7, 0xf3, 0x87, - 0xef, 0x5e, 0x25, 0xb7, 0xcf, 0x19, 0xd9, 0x11, 0x37, 0x85, 0x94, 0x27, 0x78, 0x3e, 0x60, 0x79, - 0xf9, 0x1e, 0xe4, 0xbd, 0x53, 0xcd, 0x35, 0x16, 0xc6, 0x8c, 0x33, 0x73, 0x6c, 0x57, 0xfc, 0xa2, - 0x5d, 0xe9, 0x53, 0x3c, 0x33, 0x65, 0x8e, 0x91, 0x06, 0x66, 0x6c, 0xc1, 0x0d, 0x17, 0xeb, 0xce, - 0x39, 0x76, 0xe7, 0xaa, 0xe5, 0x8c, 0x17, 0x22, 0x12, 0xaf, 0xf3, 0x87, 0x6d, 0x9f, 0xa7, 0xed, - 0x8c, 0x03, 0x51, 0x5f, 0x87, 0x9c, 0xcd, 0x73, 0x89, 0x3a, 0x75, 0x5c, 0xe2, 0x15, 0x92, 0x4c, - 0x67, 0x5b, 0xfc, 0x6c, 0xa1, 0x34, 0xa3, 0x64, 0xed, 0xc5, 0xc2, 0x2b, 0xfe, 0x61, 0x1c, 0xd2, - 0x81, 0xde, 0xd0, 0x9b, 0x4b, 0x39, 0x22, 0xf7, 0xf2, 0x45, 0x69, 0x81, 0x14, 0x29, 0xe2, 0x1e, - 0x80, 0x1e, 0x68, 0x8a, 0xd9, 0x34, 0x73, 0xb8, 0x73, 0x99, 0x06, 0x7d, 0x23, 0x2c, 0xa8, 0x51, - 0x3b, 0xec, 0xfc, 0x1e, 0xb6, 0x98, 0xab, 0x88, 0x7a, 0x76, 0x6b, 0x71, 0xd8, 0xb6, 0x36, 0xc4, - 0x56, 0x5f, 0xa0, 0x85, 0x98, 0x45, 0x10, 0xf8, 0x08, 0x9e, 0x17, 0x4d, 0xc7, 0x35, 0x09, 0x2f, - 0xd9, 0x39, 0x25, 0x58, 0xa3, 0xaf, 0x00, 0x62, 0x29, 0xc8, 0xc0, 0x96, 0x36, 0x57, 0x3d, 0xac, - 0x3b, 0x36, 0xcb, 0x09, 0x94, 0x8a, 0x25, 0xa7, 0x06, 0x45, 0xf4, 0x39, 0x1c, 0x95, 0x20, 0x13, - 0x72, 0x0e, 0x96, 0x14, 0xd2, 0x0a, 0x2c, 0x2c, 0x8d, 0x4e, 0xa0, 0xe8, 0x13, 0x58, 0xda, 0x64, - 0x68, 0x68, 0x6a, 0xd8, 0xb1, 0xd7, 0x49, 0x02, 0xdb, 0x82, 0xbf, 0xcd, 0xd8, 0xeb, 0xdc, 0xcb, - 0x8f, 0x00, 0x5d, 0x22, 0x6e, 0x9d, 0x7c, 0x9b, 0xb5, 0xc2, 0x72, 0xbe, 0x00, 0x69, 0x76, 0x5a, - 0xc7, 0xb6, 0xe6, 0x2c, 0x97, 0xa4, 0x94, 0x14, 0x05, 0x74, 0x6d, 0x6b, 0x8e, 0x2a, 0xb0, 0xfd, - 0x11, 0xf7, 0x1e, 0x95, 0x67, 0xe5, 0xd9, 0x68, 0x64, 0x3e, 0x2f, 0x00, 0x4b, 0xa1, 0x5b, 0x02, - 0xa5, 0xd0, 0xcc, 0xcb, 0x10, 0xe8, 0x2e, 0x80, 0xed, 0x10, 0x75, 0x88, 0x47, 0x8e, 0x8b, 0x59, - 0xde, 0xce, 0x1c, 0x16, 0x2b, 0xbc, 0x93, 0xac, 0xf8, 0x9d, 0x64, 0x65, 0xe0, 0x77, 0x92, 0x4a, - 0xda, 0x76, 0x48, 0x8d, 0x11, 0xa3, 0xdf, 0x02, 0xba, 0x50, 0xb5, 0x11, 0xc1, 0xae, 0xc8, 0x4a, - 0xaf, 0xe3, 0x4c, 0xd9, 0x0e, 0xa9, 0x52, 0xda, 0xf2, 0x77, 0x20, 0xb7, 0x94, 0x49, 0x50, 0x11, - 0x6e, 0x8a, 0xa2, 0xaa, 0xd6, 0xbb, 0x9d, 0x4e, 0xb3, 0x3e, 0xe8, 0x2a, 0xea, 0xe0, 0x69, 0xaf, - 0x29, 0x6f, 0xd0, 0x12, 0xda, 0xff, 0x9d, 0x76, 0x6b, 0xd0, 0x94, 0x25, 0x94, 0x07, 0xa0, 0xd0, - 0x7e, 0x5d, 0x69, 0xf5, 0x06, 0x72, 0x04, 0xa5, 0x21, 0xde, 0x3a, 0xae, 0x3e, 0x6c, 0xca, 0x51, - 0xfa, 0xd8, 0xee, 0xd6, 0xab, 0x6d, 0x39, 0x56, 0x3e, 0x86, 0x4c, 0x28, 0x86, 0x51, 0x01, 0x76, - 0x7c, 0xe1, 0xfd, 0x47, 0x27, 0x47, 0x47, 0xed, 0xa6, 0x2f, 0x3a, 0x03, 0xc9, 0x5a, 0xb7, 0xdb, - 0x6e, 0x56, 0x3b, 0xb2, 0xc4, 0x0b, 0xfb, 0xa0, 0xf9, 0xb0, 0xa9, 0xc8, 0x11, 0xf6, 0xd2, 0x81, - 0xd2, 0xea, 0x3c, 0x94, 0xa3, 0xe5, 0x1f, 0x44, 0x20, 0xcf, 0xca, 0x09, 0x77, 0x45, 0xea, 0xd9, - 0x08, 0x62, 0x67, 0x78, 0xee, 0xb7, 0x6c, 0xec, 0x99, 0xd6, 0xe6, 0x73, 0xcd, 0x9a, 0x61, 0xaf, - 0x10, 0x61, 0x50, 0xb1, 0xa2, 0x7e, 0x6b, 0x38, 0xfa, 0x6c, 0x82, 0x6d, 0x22, 0xba, 0x99, 0x60, - 0x8d, 0xce, 0xe1, 0x06, 0xab, 0x5f, 0x61, 0x87, 0x50, 0x27, 0xda, 0x94, 0xa5, 0xaa, 0xcc, 0xe1, - 0x57, 0x78, 0xa0, 0x2d, 0xbf, 0x9c, 0x2f, 0xb9, 0x2b, 0x3c, 0xf6, 0x1c, 0xfb, 0x58, 0x9b, 0x36, - 0x6d, 0xe2, 0xce, 0x6b, 0x6f, 0x7c, 0xfc, 0xf9, 0xeb, 0xca, 0xd2, 0x68, 0xc1, 0x56, 0x6c, 0xc2, - 0xad, 0x57, 0x48, 0xf1, 0x2b, 0xb1, 0xe8, 0xb2, 0x69, 0x25, 0xde, 0x81, 0x38, 0x3b, 0x8a, 0xdf, - 0x65, 0xb3, 0xc5, 0xbd, 0xc8, 0x07, 0x52, 0xf9, 0xef, 0xe2, 0x90, 0xa9, 0x6b, 0x53, 0x32, 0x73, - 0x31, 0xeb, 0x39, 0x4a, 0x4b, 0xf9, 0x24, 0xf3, 0xf2, 0x45, 0x29, 0x29, 0xd0, 0x22, 0x9b, 0x1c, - 0xad, 0x14, 0x9e, 0x08, 0x2b, 0x3c, 0x7e, 0x31, 0x5b, 0xc8, 0xba, 0x56, 0xa9, 0x89, 0x5e, 0xa3, - 0xd4, 0x7c, 0x0d, 0x52, 0x43, 0xd3, 0xa6, 0x24, 0x9e, 0xd0, 0xf2, 0xed, 0xd5, 0x97, 0xd7, 0x38, - 0x85, 0x12, 0x90, 0xd2, 0x9e, 0xc3, 0xb4, 0x09, 0x76, 0xcf, 0x35, 0xeb, 0x42, 0x7e, 0xd9, 0xf4, - 0xe1, 0x7e, 0x7a, 0x59, 0x2d, 0x11, 0x89, 0x5f, 0xbe, 0x44, 0x24, 0x7f, 0xf9, 0x12, 0x91, 0x5a, - 0xaf, 0x44, 0xfc, 0xb5, 0x04, 0x49, 0x71, 0x7e, 0xf4, 0x18, 0x76, 0x5c, 0xec, 0x39, 0x33, 0x57, - 0xc7, 0x4b, 0x39, 0x4b, 0x5a, 0x43, 0xe1, 0x79, 0x9f, 0x53, 0x64, 0xad, 0x2f, 0x42, 0x2e, 0x90, - 0x35, 0xd5, 0xc8, 0xa9, 0x08, 0x93, 0xac, 0x0f, 0xec, 0x69, 0xe4, 0xf4, 0x42, 0xb9, 0x89, 0x5e, - 0xa7, 0xdc, 0x94, 0x0f, 0x2f, 0x66, 0x95, 0xa5, 0x56, 0x3d, 0x48, 0x15, 0xc9, 0x45, 0xaa, 0x48, - 0x95, 0xff, 0x0c, 0x60, 0xfb, 0x58, 0x23, 0xd8, 0x35, 0x35, 0xcb, 0xfc, 0xae, 0x16, 0x74, 0xcf, - 0x6f, 0x2d, 0x79, 0xf2, 0xf6, 0xcb, 0x17, 0xa5, 0xcd, 0x0b, 0x64, 0xc2, 0xa3, 0x3b, 0xaf, 0xf0, - 0xe8, 0xb7, 0xf8, 0xa6, 0x2f, 0x91, 0xfd, 0xff, 0xe6, 0xd9, 0x0f, 0x56, 0x3c, 0xfb, 0xcd, 0x57, - 0x6f, 0x62, 0xd5, 0xc3, 0x7f, 0xcd, 0x3b, 0x9b, 0xef, 0x27, 0x7e, 0x3d, 0xdd, 0xf6, 0x15, 0x5d, - 0x52, 0xf2, 0x57, 0xd0, 0x25, 0xa5, 0x2f, 0x74, 0x49, 0x75, 0xd8, 0xe4, 0xd5, 0xc6, 0xf3, 0x6b, - 0x09, 0x6b, 0xa4, 0x82, 0xad, 0x2e, 0xd7, 0x19, 0xf1, 0x8e, 0xfc, 0x68, 0xb9, 0xf4, 0x7d, 0x11, - 0x72, 0x06, 0xb6, 0x88, 0xa6, 0xce, 0xa6, 0x86, 0x46, 0xb0, 0xe7, 0x8f, 0x45, 0x18, 0xf0, 0x84, - 0xc3, 0xd0, 0x10, 0x90, 0x81, 0xa7, 0x2e, 0xd6, 0x35, 0x82, 0x0d, 0x55, 0xf4, 0x42, 0xc2, 0x19, - 0xde, 0xbf, 0xd2, 0x29, 0x2b, 0x8d, 0x80, 0x57, 0xd4, 0x71, 0x65, 0xcb, 0xb8, 0x08, 0x7a, 0x55, - 0xa3, 0x93, 0x5a, 0xaf, 0xd1, 0x81, 0x5f, 0xb8, 0xd1, 0xc9, 0xac, 0xdf, 0xe8, 0x14, 0x7f, 0x5f, - 0x82, 0xad, 0x95, 0xc3, 0xa0, 0x3b, 0x00, 0x63, 0xd7, 0x99, 0x4d, 0xd5, 0x45, 0x8a, 0x51, 0xd2, - 0x0c, 0xd2, 0xa1, 0x29, 0xe5, 0x57, 0xda, 0x36, 0xaf, 0x9b, 0x15, 0x53, 0x8b, 0xac, 0x98, 0x2e, - 0xff, 0x4f, 0x1a, 0x12, 0xdd, 0xea, 0x8c, 0x9c, 0x1e, 0x8a, 0x69, 0xc4, 0xb9, 0x69, 0x60, 0x7f, - 0xf2, 0x16, 0xac, 0xd1, 0x3b, 0xb0, 0xa5, 0xcd, 0xc8, 0xa9, 0x3a, 0x73, 0xad, 0x45, 0xc4, 0xf3, - 0x26, 0x61, 0x93, 0x22, 0x4e, 0x5c, 0x2b, 0x08, 0xeb, 0xbb, 0x70, 0x5b, 0xd3, 0x75, 0xec, 0x79, - 0x2a, 0x71, 0xce, 0xb0, 0xbd, 0xcc, 0xc3, 0xdb, 0xa2, 0x9b, 0x9c, 0x60, 0x40, 0xf1, 0x61, 0xd6, - 0x0a, 0x6c, 0x2f, 0xb1, 0x4e, 0x30, 0x39, 0x75, 0x0c, 0x3e, 0x62, 0x50, 0xb6, 0x42, 0x4c, 0xc7, - 0x0c, 0xc1, 0xb6, 0x15, 0xa6, 0x1f, 0x3a, 0xc6, 0x5c, 0x8c, 0x10, 0x36, 0x43, 0xd4, 0x35, 0xc7, - 0x98, 0xa3, 0x3f, 0x92, 0xe0, 0xce, 0x12, 0xf1, 0x29, 0xd6, 0x0c, 0xec, 0x7a, 0x8b, 0x4e, 0x2c, - 0xce, 0xd2, 0x8f, 0xf8, 0x68, 0xe4, 0x4a, 0xa9, 0x54, 0x17, 0x52, 0x1e, 0x71, 0xfa, 0x6b, 0x34, - 0x62, 0x48, 0x5b, 0xe1, 0x46, 0x1f, 0x4b, 0xb0, 0xbb, 0xb4, 0x0d, 0x17, 0x7b, 0x53, 0xc7, 0xf6, - 0xf0, 0x62, 0x1f, 0x89, 0x70, 0x47, 0xb8, 0xba, 0x0f, 0x45, 0x30, 0x5c, 0x63, 0x23, 0x61, 0x7d, - 0xfb, 0xec, 0xc7, 0xda, 0x14, 0xdd, 0x87, 0xa2, 0x8b, 0x47, 0x2e, 0xf6, 0x4e, 0x2f, 0xb3, 0x15, - 0x9f, 0xa8, 0xdd, 0x12, 0x14, 0x2b, 0xc6, 0xfa, 0x2a, 0x4d, 0xbd, 0x61, 0x66, 0x61, 0xad, 0x2c, - 0x63, 0x43, 0x61, 0x36, 0x61, 0x2e, 0xf6, 0xed, 0x16, 0xe6, 0x60, 0xf6, 0xe2, 0x61, 0x2c, 0x87, - 0xe9, 0x99, 0xc1, 0xfe, 0x58, 0x82, 0xdd, 0x65, 0xf2, 0x15, 0x8b, 0xa5, 0x2f, 0xd1, 0x94, 0x12, - 0x92, 0x73, 0x7d, 0x93, 0x6d, 0xbb, 0xab, 0xec, 0xe8, 0x4f, 0x25, 0x28, 0x2d, 0xef, 0x64, 0xd5, - 0x68, 0xc0, 0xb6, 0xf2, 0xde, 0x2b, 0xb7, 0xf2, 0x0b, 0x58, 0x6d, 0x49, 0xf3, 0x21, 0xb3, 0x15, - 0xdb, 0xb0, 0xfb, 0x7a, 0xbf, 0xbc, 0x4e, 0x6b, 0x5f, 0x3c, 0x86, 0xd2, 0x15, 0xde, 0x75, 0x5d, - 0x71, 0x57, 0x98, 0xe0, 0x5a, 0xe2, 0x3a, 0xb0, 0x77, 0x95, 0x1a, 0xaf, 0xf5, 0x21, 0xf3, 0x37, - 0x51, 0x48, 0x0d, 0xb0, 0x47, 0x58, 0xef, 0x87, 0xc2, 0xbd, 0x9f, 0x68, 0xf3, 0x0e, 0x20, 0xee, - 0x11, 0x3c, 0xe5, 0xdf, 0x76, 0xb4, 0x27, 0x62, 0x16, 0xf5, 0x59, 0x2a, 0x7d, 0x82, 0xa7, 0x22, - 0x05, 0x73, 0xba, 0xe2, 0xcf, 0x22, 0x10, 0xa3, 0x50, 0xf4, 0x35, 0x48, 0x53, 0x48, 0x78, 0xcc, - 0x56, 0xb8, 0x84, 0xbb, 0xc2, 0x9a, 0xc1, 0x14, 0x25, 0x65, 0x59, 0xfa, 0x0e, 0x00, 0x63, 0x33, - 0x6d, 0x03, 0x3f, 0x17, 0x57, 0x32, 0x4c, 0x50, 0x8b, 0x02, 0x2e, 0x0e, 0xf6, 0xa3, 0xab, 0x83, - 0x7d, 0x5f, 0x80, 0xa7, 0x3b, 0x53, 0xff, 0x56, 0x80, 0x09, 0xe8, 0x53, 0x00, 0xaa, 0x2c, 0x75, - 0x2c, 0xf1, 0x4b, 0x87, 0xc4, 0xe1, 0x2e, 0xe5, 0x2e, 0xe4, 0x0c, 0x47, 0x17, 0x51, 0x76, 0x8e, - 0x75, 0x3e, 0x35, 0xb9, 0xa2, 0x97, 0x8a, 0x51, 0x16, 0xf4, 0x00, 0x20, 0x28, 0x4b, 0xde, 0x7a, - 0x8d, 0x4d, 0x88, 0xa1, 0xbc, 0x0b, 0x31, 0xa6, 0x11, 0x80, 0x44, 0xab, 0xf3, 0xb0, 0xd9, 0x1f, - 0xf0, 0x99, 0xc0, 0x37, 0x9b, 0x4a, 0xeb, 0xe8, 0xa9, 0x2c, 0x95, 0x7f, 0x20, 0x41, 0x5a, 0xd1, - 0xec, 0x31, 0xff, 0x04, 0xfd, 0x02, 0xa4, 0xcf, 0xf0, 0x5c, 0xe5, 0xb7, 0x5b, 0x54, 0x6d, 0x49, - 0x25, 0x75, 0x86, 0xe7, 0x35, 0x76, 0xc1, 0x75, 0x0b, 0x92, 0x14, 0x89, 0x6d, 0x83, 0x69, 0x2c, - 0xa9, 0x24, 0xce, 0xf0, 0xbc, 0x69, 0x1b, 0xa8, 0x0c, 0x39, 0x57, 0x65, 0xd7, 0x50, 0x82, 0x33, - 0xc6, 0xd0, 0x19, 0x97, 0xdd, 0x50, 0x71, 0xe6, 0x5d, 0xc8, 0xf8, 0x34, 0x54, 0x40, 0x9c, 0x51, - 0xa4, 0x39, 0x45, 0xd3, 0x36, 0xee, 0xc9, 0x3f, 0xfc, 0xa4, 0xb4, 0x71, 0xe1, 0xbe, 0x2c, 0x1f, - 0x94, 0xde, 0x3e, 0xa1, 0xd9, 0xf1, 0x3e, 0x64, 0x79, 0xdb, 0x64, 0xac, 0xdf, 0x90, 0x26, 0x05, - 0x07, 0x2a, 0x41, 0x66, 0x82, 0xdd, 0x31, 0x6b, 0x43, 0xf5, 0x53, 0x76, 0xb8, 0x94, 0x02, 0x0c, - 0xd4, 0xa3, 0x90, 0xf2, 0x5d, 0x48, 0xf7, 0xb1, 0xdb, 0x73, 0x2c, 0x53, 0x67, 0x23, 0x31, 0x8f, - 0xb8, 0x2a, 0x71, 0x67, 0x36, 0x6d, 0x3e, 0x44, 0xf3, 0xc2, 0xaf, 0x1a, 0x64, 0x8f, 0xb8, 0x03, - 0x81, 0xe0, 0x13, 0x99, 0xbf, 0x8c, 0x00, 0x34, 0x9f, 0x13, 0x57, 0xd3, 0x49, 0xb5, 0xd7, 0x2a, - 0xfe, 0xad, 0x04, 0x09, 0xd1, 0xff, 0x86, 0xe7, 0xf0, 0xd2, 0xf2, 0x1c, 0xfe, 0x01, 0x64, 0xc2, - 0x33, 0xff, 0x75, 0x06, 0xbe, 0xc0, 0x19, 0x68, 0xa0, 0x52, 0x0f, 0xe5, 0xed, 0xe8, 0x94, 0xb8, - 0x9e, 0x18, 0xfd, 0xa7, 0x19, 0xa4, 0x47, 0xdc, 0x95, 0xd1, 0x7d, 0x6c, 0xed, 0xd1, 0x7d, 0xf9, - 0x29, 0xc4, 0xea, 0x8e, 0x71, 0xa1, 0xd3, 0xc9, 0x41, 0xba, 0xde, 0xed, 0x1c, 0xb5, 0x1e, 0x9e, - 0x28, 0x4d, 0x3e, 0xed, 0x69, 0x7e, 0x6b, 0xa0, 0x54, 0xeb, 0x03, 0x39, 0x82, 0x10, 0xe4, 0xc5, - 0xa2, 0xd9, 0x50, 0x4f, 0x4e, 0x5a, 0x0d, 0x39, 0x8a, 0x76, 0x40, 0x5e, 0xc0, 0x8e, 0x5a, 0xcd, - 0x76, 0xa3, 0x2f, 0xc7, 0xca, 0x9f, 0xc5, 0x01, 0xea, 0xce, 0x64, 0x68, 0xda, 0x98, 0xea, 0xe9, - 0xbf, 0x23, 0x81, 0x9e, 0x2e, 0x28, 0x43, 0xba, 0xa6, 0x32, 0x6e, 0x03, 0x75, 0x53, 0xae, 0x0a, - 0xfe, 0x85, 0x41, 0x5d, 0x95, 0x29, 0xe2, 0x26, 0x24, 0xc4, 0x25, 0x07, 0xd7, 0x91, 0x58, 0xd1, - 0x52, 0xcb, 0x2d, 0x63, 0x69, 0x3a, 0x3e, 0x75, 0x2c, 0x03, 0xbb, 0xa1, 0xdb, 0x12, 0xc4, 0xac, - 0xb4, 0x40, 0x51, 0x83, 0x5d, 0x50, 0x69, 0x7c, 0xfd, 0xdb, 0x90, 0xb7, 0x60, 0x73, 0x91, 0x0c, - 0x78, 0xdf, 0xca, 0x6e, 0x0a, 0x95, 0xfc, 0x02, 0xcc, 0x9a, 0xd7, 0x77, 0x60, 0x8b, 0x5d, 0x74, - 0x2e, 0xdd, 0x06, 0x89, 0x5b, 0x38, 0x86, 0xe8, 0x2f, 0xce, 0x5c, 0x01, 0xf0, 0xe8, 0x9e, 0x99, - 0xc3, 0xb2, 0x8a, 0x1f, 0xdc, 0x9e, 0x06, 0x7e, 0xac, 0xa4, 0x3d, 0xff, 0xb1, 0xf8, 0x7b, 0x10, - 0xa7, 0x61, 0xe4, 0xa1, 0xdf, 0x80, 0x98, 0x85, 0x47, 0x84, 0x29, 0x39, 0x73, 0x88, 0x38, 0x4b, - 0xc3, 0xd1, 0xbd, 0xaa, 0x6d, 0xd4, 0xe6, 0x04, 0x7b, 0x0a, 0xc3, 0xa3, 0x7d, 0x88, 0xbb, 0xe6, - 0xf8, 0x94, 0x88, 0xb9, 0xf5, 0x65, 0x84, 0x9c, 0x00, 0x7d, 0x09, 0xa2, 0xce, 0x8c, 0x88, 0x26, - 0xfb, 0x32, 0x3a, 0x8a, 0x2e, 0xff, 0x9b, 0xb4, 0x86, 0x67, 0x6d, 0x42, 0x46, 0x69, 0x36, 0x4e, - 0xea, 0x4d, 0xb5, 0xdd, 0x3c, 0xa2, 0xde, 0xb5, 0x05, 0xb9, 0x7a, 0xf7, 0xb8, 0xd6, 0xea, 0x34, - 0x55, 0xa5, 0xf5, 0xf0, 0xd1, 0x40, 0x8e, 0x22, 0x19, 0x32, 0x0d, 0xa5, 0xda, 0xea, 0xa8, 0xf5, - 0x47, 0x27, 0x9d, 0x27, 0xf2, 0xa7, 0x12, 0xda, 0x85, 0xdb, 0x0c, 0xd2, 0x6c, 0xa8, 0x82, 0xb8, - 0xa1, 0x36, 0xba, 0xf5, 0x93, 0xe3, 0x66, 0x67, 0x20, 0xff, 0xa3, 0x84, 0xee, 0x40, 0xc1, 0xc7, - 0x73, 0xe9, 0x21, 0xf4, 0x3f, 0x49, 0x81, 0xc0, 0x66, 0x43, 0x7d, 0xd2, 0x7c, 0x2a, 0xff, 0xb3, - 0x84, 0xb6, 0x21, 0xef, 0x43, 0x84, 0xf7, 0xfe, 0x8b, 0x84, 0x10, 0xe4, 0x7c, 0x60, 0x7f, 0x50, - 0x1d, 0xf4, 0xe5, 0x7f, 0x95, 0xca, 0x3f, 0x93, 0x20, 0x55, 0x9b, 0x99, 0x96, 0x41, 0x1d, 0xfa, - 0x27, 0x4b, 0x81, 0x3f, 0xa4, 0x60, 0xd5, 0x34, 0xfc, 0xc0, 0x67, 0xeb, 0x96, 0xb1, 0x40, 0x19, - 0x43, 0x51, 0x4b, 0x39, 0xaa, 0x31, 0x64, 0x57, 0xc2, 0xec, 0xbb, 0x58, 0xd4, 0x24, 0xb1, 0x42, - 0x87, 0x90, 0x11, 0x1f, 0xd1, 0xac, 0x10, 0xc6, 0x58, 0x21, 0xdc, 0xf2, 0x3f, 0x91, 0x83, 0xcb, - 0x5d, 0x05, 0x38, 0x15, 0xcb, 0xf8, 0xef, 0xc2, 0xd6, 0x62, 0xb6, 0x22, 0x3e, 0xf6, 0xc5, 0x1d, - 0xb6, 0x1c, 0x20, 0xc4, 0x44, 0x00, 0xbd, 0x09, 0x59, 0xe1, 0xb0, 0xaa, 0xeb, 0x38, 0x44, 0xb8, - 0xa7, 0xef, 0xc4, 0x8a, 0xe3, 0x90, 0xf2, 0x36, 0x6c, 0x29, 0xd8, 0xc3, 0x84, 0xe5, 0x62, 0x05, - 0xff, 0xee, 0x0c, 0x7b, 0xa4, 0xbc, 0x03, 0x28, 0x0c, 0xe4, 0x8d, 0x44, 0xf9, 0x01, 0xa0, 0xaa, - 0x71, 0xae, 0xd9, 0x3a, 0xa6, 0x9f, 0x75, 0x82, 0x96, 0x46, 0x81, 0xc6, 0xa1, 0xc1, 0x0c, 0x90, - 0x6a, 0x26, 0xa6, 0xe4, 0x05, 0x58, 0x8c, 0x00, 0xcb, 0x37, 0x60, 0x7b, 0x89, 0x5d, 0x48, 0xfd, - 0x00, 0xb2, 0x61, 0xa7, 0xa2, 0x9d, 0x06, 0xad, 0x90, 0x22, 0x2b, 0xf3, 0x6a, 0xb9, 0x03, 0xf1, - 0x21, 0x45, 0x32, 0xc5, 0xc6, 0x14, 0xbe, 0x28, 0x7f, 0x5f, 0x82, 0x5c, 0xcb, 0x1e, 0x63, 0x8f, - 0xf8, 0x7b, 0x59, 0x2e, 0xe0, 0xd2, 0x95, 0x05, 0x3c, 0x6c, 0xce, 0xc8, 0xb2, 0x39, 0x57, 0x6a, - 0x7b, 0x74, 0xdd, 0xda, 0x5e, 0xfe, 0xf7, 0x08, 0xe4, 0xfd, 0x7d, 0xf1, 0x43, 0xa2, 0x1f, 0x4b, - 0x8b, 0x0f, 0x73, 0x7e, 0xbb, 0x4c, 0x3b, 0x74, 0x3e, 0x2b, 0x0f, 0x3e, 0xa4, 0x96, 0x79, 0xfc, - 0xa9, 0xd0, 0x87, 0x94, 0x9c, 0xf6, 0x86, 0x1e, 0xef, 0x84, 0xbf, 0xf3, 0x07, 0x9f, 0x97, 0xde, - 0xbd, 0xec, 0x0f, 0x24, 0x17, 0xfe, 0x40, 0xe3, 0xf3, 0x7f, 0xfc, 0x79, 0xe9, 0x9d, 0x75, 0xc8, - 0xbb, 0xa3, 0x91, 0x87, 0x49, 0x30, 0x24, 0x58, 0xbc, 0x16, 0xfd, 0x36, 0x64, 0xfd, 0xbd, 0x63, - 0xa2, 0x1b, 0x22, 0x71, 0x84, 0xe6, 0x57, 0xbc, 0x73, 0xad, 0x34, 0x89, 0x6e, 0xf8, 0x79, 0x52, - 0x30, 0x50, 0x50, 0xb1, 0x01, 0x37, 0x2f, 0x3f, 0xcb, 0x55, 0xed, 0x68, 0x34, 0xdc, 0x8e, 0xfe, - 0x55, 0x04, 0x6e, 0x0d, 0x34, 0xef, 0xcc, 0x9f, 0x76, 0xb9, 0xce, 0xf3, 0xb9, 0x6f, 0xf7, 0xaf, - 0x43, 0xcc, 0x99, 0x62, 0x5b, 0xe4, 0xbe, 0xb2, 0x68, 0x25, 0x2f, 0x27, 0xae, 0x74, 0xa7, 0xd8, - 0x56, 0x18, 0x3d, 0xf3, 0x35, 0x8d, 0x68, 0xec, 0x65, 0x59, 0x85, 0x3d, 0x17, 0xff, 0x5e, 0x82, - 0x18, 0x25, 0x41, 0xfb, 0x90, 0xe0, 0x9f, 0x51, 0x42, 0xac, 0x7c, 0xf1, 0xc0, 0x8a, 0xc0, 0xa3, - 0x36, 0xa4, 0xf8, 0x94, 0xd0, 0x77, 0xa3, 0xda, 0x6f, 0xbe, 0x7c, 0x51, 0x7a, 0xef, 0x32, 0xad, - 0xaf, 0xfc, 0x8b, 0x89, 0xcf, 0x0f, 0x5b, 0x0d, 0x25, 0xc9, 0x44, 0xb4, 0x58, 0x4b, 0x43, 0x34, - 0x77, 0x8c, 0x09, 0x9b, 0xf5, 0xb1, 0x94, 0x91, 0x53, 0x80, 0x83, 0xd8, 0x9f, 0x24, 0x4a, 0x90, - 0xd1, 0x2d, 0x13, 0xdb, 0x44, 0xd5, 0x0c, 0xc3, 0x2f, 0x6d, 0xc0, 0x41, 0x55, 0xc3, 0x70, 0xcb, - 0x7f, 0x12, 0x85, 0xc2, 0xea, 0xe9, 0x85, 0x2b, 0xf6, 0x20, 0x47, 0xcf, 0x1e, 0x7c, 0x98, 0x89, - 0xd3, 0xbd, 0xfb, 0x2a, 0xa5, 0x09, 0x6f, 0x64, 0x5a, 0x13, 0x0b, 0x25, 0xeb, 0x84, 0x56, 0x97, - 0x6a, 0xf1, 0x19, 0x64, 0xc3, 0x1c, 0xe8, 0x01, 0x24, 0x3c, 0xa2, 0x91, 0x99, 0x27, 0xda, 0xfd, - 0x2f, 0x5f, 0xf1, 0xba, 0x3e, 0x23, 0x56, 0x04, 0x53, 0xc8, 0x16, 0x91, 0xd7, 0xdb, 0xa2, 0xfc, - 0x3d, 0xf6, 0xb7, 0x19, 0xc6, 0x94, 0x80, 0x48, 0xf7, 0x89, 0xbc, 0x81, 0xb6, 0x61, 0xb3, 0xff, - 0xa8, 0xaa, 0x34, 0xd4, 0x4e, 0x77, 0xa0, 0x1e, 0x75, 0x4f, 0x3a, 0x0d, 0x59, 0xa2, 0xad, 0x4c, - 0xa7, 0xab, 0x72, 0x78, 0x4f, 0x69, 0x1d, 0x57, 0x95, 0xa7, 0x72, 0x04, 0xdd, 0x80, 0x2d, 0x4a, - 0xb4, 0x0c, 0x8e, 0xd2, 0x5e, 0xa8, 0xd5, 0x19, 0x34, 0x95, 0x4e, 0xb5, 0xad, 0x36, 0x15, 0xa5, - 0xab, 0xc8, 0x31, 0x5a, 0xc1, 0x38, 0x59, 0x7f, 0xd0, 0xed, 0xf5, 0x9a, 0x0d, 0x39, 0x8e, 0x6e, - 0x80, 0xdc, 0xeb, 0x2a, 0x03, 0xf6, 0x9e, 0x6a, 0xbb, 0xdd, 0xfd, 0xb0, 0xd9, 0x90, 0x7f, 0x9e, - 0x7c, 0xa7, 0x03, 0x99, 0x50, 0x36, 0xa7, 0x75, 0xb2, 0x5e, 0x1d, 0x54, 0xdb, 0xdd, 0x87, 0xf2, - 0x06, 0x2d, 0x8c, 0x8f, 0xfb, 0xdd, 0x8e, 0xda, 0xaf, 0x3f, 0x6a, 0x1e, 0x57, 0x65, 0x89, 0xfd, - 0x39, 0x86, 0x15, 0x4e, 0x39, 0x46, 0x77, 0xe3, 0xd7, 0xb3, 0xbe, 0x7a, 0xd4, 0xfa, 0xd6, 0x80, - 0x16, 0xd3, 0xf8, 0xe1, 0x3f, 0x48, 0x90, 0xa4, 0xdf, 0x49, 0xa6, 0x3d, 0x46, 0xdf, 0x00, 0x58, - 0x64, 0x6a, 0x74, 0x8b, 0x6b, 0x75, 0x25, 0xa1, 0x17, 0x0b, 0xab, 0x08, 0x61, 0x98, 0x1a, 0x64, - 0x42, 0x59, 0x19, 0x09, 0xc2, 0xd5, 0x3c, 0x5f, 0xbc, 0x7d, 0x09, 0x46, 0xc8, 0x78, 0x1f, 0x12, - 0x3c, 0x77, 0xa1, 0xed, 0xe5, 0x4c, 0xc6, 0x39, 0x77, 0x2e, 0x4b, 0x6f, 0x87, 0xdf, 0x86, 0x6c, - 0xd8, 0xf2, 0xe8, 0x31, 0xc4, 0xf9, 0xc3, 0x9d, 0xd7, 0x86, 0x6f, 0x71, 0xf7, 0xf5, 0x9e, 0xb3, - 0x2f, 0x7d, 0x55, 0xaa, 0xdd, 0xff, 0xf4, 0x3f, 0x77, 0x37, 0x3e, 0xfd, 0xe9, 0xae, 0xf4, 0xd9, - 0x4f, 0x77, 0xa5, 0x4f, 0xfe, 0x6b, 0x57, 0xfa, 0xf6, 0xdb, 0x63, 0x93, 0x9c, 0xce, 0x86, 0x15, - 0xdd, 0x99, 0x1c, 0x60, 0x8f, 0xcc, 0x34, 0x77, 0xce, 0xff, 0x88, 0xb8, 0xf2, 0xd7, 0xc4, 0x61, - 0x82, 0xad, 0xdf, 0xff, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x80, 0x77, 0x5c, 0xb6, 0x28, - 0x00, 0x00, + // 3795 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0xcd, 0x8f, 0x1b, 0xc9, + 0x75, 0x9f, 0xe6, 0x37, 0x1f, 0x3f, 0xa6, 0xa7, 0x66, 0x24, 0x51, 0xf4, 0x6a, 0x38, 0xa2, 0xed, + 0xec, 0xec, 0xae, 0x97, 0x72, 0x66, 0x61, 0x67, 0x25, 0x41, 0x31, 0xf8, 0x35, 0x12, 0x25, 0x0e, + 0xc9, 0x34, 0x39, 0x5e, 0xcb, 0x80, 0xd1, 0x68, 0x76, 0x17, 0x39, 0xbd, 0xd3, 0xec, 0x66, 0xba, + 0x8b, 0x92, 0xe8, 0x4b, 0x82, 0x20, 0x40, 0x80, 0x45, 0x02, 0xf8, 0x12, 0xd8, 0x37, 0x6f, 0x0c, + 0x04, 0xc8, 0xbf, 0x90, 0xe4, 0x12, 0x20, 0x97, 0x4d, 0xe2, 0x04, 0x8b, 0x04, 0xc9, 0x21, 0x07, + 0x2d, 0xe2, 0x1c, 0x6c, 0x20, 0x40, 0x72, 0x09, 0x82, 0x40, 0xa7, 0xa0, 0x3e, 0xba, 0xd9, 0x1c, + 0x8e, 0x66, 0x38, 0x6b, 0xe7, 0xb0, 0x17, 0xa2, 0xeb, 0xd5, 0x7b, 0xaf, 0xab, 0xde, 0xc7, 0xef, + 0xbd, 0xae, 0x22, 0xbc, 0x31, 0x76, 0xee, 0x4c, 0x5d, 0x87, 0x38, 0xba, 0x63, 0x79, 0x77, 0x46, + 0x96, 0xf3, 0x9c, 0xfd, 0x54, 0x18, 0x0d, 0xc5, 0xe8, 0x73, 0x71, 0x77, 0xe8, 0x3a, 0xa7, 0xd8, + 0x0d, 0xf8, 0x82, 0x07, 0xce, 0x55, 0xdc, 0xd3, 0x1d, 0xdb, 0x9b, 0x4d, 0x2e, 0xe0, 0xd8, 0x19, + 0x3b, 0x63, 0x87, 0x3d, 0xde, 0xa1, 0x4f, 0x82, 0x5a, 0x1a, 0x3b, 0xce, 0xd8, 0xc2, 0x9c, 0x79, + 0x38, 0x1b, 0xdd, 0x21, 0xe6, 0x04, 0x7b, 0x44, 0x9b, 0x4c, 0x39, 0x43, 0xf9, 0x01, 0xc4, 0xfb, + 0x96, 0xa9, 0x63, 0xb4, 0x03, 0xf1, 0x21, 0x1e, 0x9b, 0x76, 0x41, 0xda, 0x93, 0xf6, 0x73, 0x0a, + 0x1f, 0x20, 0x19, 0xa2, 0xd8, 0x36, 0x0a, 0x11, 0x46, 0xa3, 0x8f, 0xf7, 0xb2, 0x9f, 0xfe, 0x49, + 0x69, 0xe3, 0x07, 0x3f, 0x29, 0x6d, 0xfc, 0xe8, 0x27, 0xa5, 0x8d, 0xb2, 0x0d, 0xe9, 0xe3, 0xe3, + 0x56, 0xa3, 0xa7, 0xb9, 0xc4, 0x43, 0x08, 0x62, 0xb6, 0x63, 0x60, 0xa6, 0x21, 0xa1, 0xb0, 0x67, + 0x74, 0x1f, 0xe2, 0xba, 0xe5, 0xe8, 0xa7, 0x4c, 0x45, 0xa2, 0xf6, 0xd5, 0x57, 0x2f, 0x4b, 0xb7, + 0xc7, 0x4e, 0x65, 0xac, 0x7d, 0x1f, 0x13, 0x82, 0x2b, 0x06, 0x7e, 0x76, 0x47, 0x77, 0x5c, 0x7c, + 0x67, 0x82, 0x3d, 0x4f, 0x1b, 0xe3, 0x4a, 0x9d, 0x32, 0x2b, 0x5c, 0xe6, 0x9e, 0xfc, 0x8b, 0x8f, + 0x4b, 0xd2, 0xd2, 0xfb, 0xfe, 0x59, 0x02, 0xe8, 0xb9, 0xce, 0x87, 0x58, 0x27, 0xa6, 0xc3, 0x96, + 0x37, 0x25, 0x2e, 0x7b, 0x61, 0x5a, 0xa1, 0x8f, 0x74, 0x1b, 0x23, 0x13, 0x5b, 0x7c, 0xc9, 0x69, + 0x85, 0x0f, 0x50, 0x11, 0x52, 0xf8, 0xc5, 0xd4, 0x32, 0x75, 0x93, 0x14, 0xa2, 0x7b, 0xd2, 0x7e, + 0x4a, 0x09, 0xc6, 0x68, 0x1f, 0x64, 0xd3, 0x53, 0xa7, 0x9a, 0x4b, 0x4c, 0xaa, 0x53, 0x3d, 0xc5, + 0xf3, 0x42, 0x8c, 0xf1, 0xe4, 0x4d, 0xaf, 0xe7, 0x93, 0x9f, 0xe0, 0x39, 0xfa, 0x0a, 0xe4, 0x29, + 0xa7, 0x6b, 0x4e, 0x34, 0x77, 0xce, 0xf8, 0xe2, 0x8c, 0x2f, 0x6b, 0x7a, 0x3d, 0x4e, 0xa4, 0x5c, + 0xef, 0x41, 0xda, 0xb4, 0x47, 0xd8, 0xc5, 0xb6, 0x8e, 0x0b, 0x89, 0x3d, 0x69, 0x3f, 0x73, 0xb0, + 0x59, 0x61, 0x0e, 0x6f, 0xf9, 0xe4, 0x5a, 0xec, 0x93, 0x97, 0xa5, 0x0d, 0x65, 0xc1, 0x57, 0xfe, + 0xef, 0x28, 0xa4, 0x83, 0x69, 0xba, 0x09, 0x32, 0x9f, 0x62, 0xaf, 0x20, 0xed, 0x45, 0xe9, 0x26, + 0xd8, 0x00, 0x55, 0x20, 0xe1, 0x11, 0xd7, 0xb4, 0xc7, 0x6c, 0x0b, 0x99, 0x83, 0xeb, 0x67, 0xb4, + 0x56, 0xfa, 0x6c, 0x56, 0x11, 0x5c, 0x4c, 0x8b, 0x49, 0x2c, 0xcc, 0x76, 0x43, 0xb5, 0xd0, 0x01, + 0xda, 0x83, 0x8c, 0x81, 0x3d, 0xdd, 0x35, 0xa7, 0x74, 0x5b, 0x6c, 0x07, 0x69, 0x25, 0x4c, 0x42, + 0xf7, 0x21, 0x6b, 0xe0, 0x91, 0x36, 0xb3, 0x88, 0xfa, 0xa1, 0xe7, 0xd8, 0x6c, 0x0f, 0xe9, 0xda, + 0x1b, 0xaf, 0x5e, 0x96, 0x0a, 0xd8, 0xd6, 0x1d, 0xc3, 0xb4, 0xc7, 0x77, 0xe8, 0x44, 0x45, 0xd1, + 0x9e, 0x1f, 0x71, 0xb7, 0x29, 0x49, 0x21, 0x81, 0xae, 0x43, 0xc2, 0xc3, 0xba, 0x8b, 0x49, 0x21, + 0xc9, 0x6c, 0x23, 0x46, 0x74, 0xf1, 0xf8, 0x85, 0xe9, 0x11, 0xaf, 0x90, 0xda, 0x93, 0xf6, 0xf3, + 0xab, 0x8b, 0x6f, 0xb2, 0x59, 0x45, 0x70, 0x15, 0x7f, 0x2c, 0x41, 0x82, 0xef, 0x07, 0xdd, 0x86, + 0xac, 0xee, 0xd8, 0x04, 0xdb, 0x44, 0xa5, 0x86, 0x60, 0xbb, 0x4f, 0x2b, 0x19, 0x41, 0x1b, 0xcc, + 0xa7, 0x98, 0xbe, 0x75, 0xe4, 0xb8, 0x13, 0x8d, 0x88, 0xbd, 0x8a, 0x11, 0x7a, 0x0b, 0x64, 0x5f, + 0xd4, 0x5f, 0x3a, 0x5b, 0x57, 0x5a, 0xd9, 0x14, 0xf4, 0xa6, 0x20, 0xa3, 0x5b, 0x00, 0x13, 0xed, + 0x85, 0x6a, 0x61, 0x7b, 0x4c, 0x4e, 0xd8, 0x9e, 0x73, 0x4a, 0x7a, 0xa2, 0xbd, 0x68, 0x33, 0xc2, + 0xe3, 0x58, 0x4a, 0x92, 0x23, 0x8f, 0x63, 0xa9, 0x88, 0x1c, 0x7d, 0x1c, 0x4b, 0xc5, 0xe5, 0x44, + 0xb9, 0x06, 0x09, 0xbe, 0x66, 0x94, 0x81, 0x64, 0xab, 0xf3, 0xed, 0x6a, 0xbb, 0xd5, 0x90, 0x37, + 0x50, 0x0a, 0x62, 0x47, 0xc7, 0xfd, 0x81, 0x2c, 0xa1, 0x24, 0x44, 0x8f, 0xaa, 0x4f, 0xe5, 0x08, + 0xca, 0x42, 0xaa, 0x75, 0xd4, 0x6b, 0xb7, 0xea, 0xad, 0x81, 0x1c, 0x45, 0x00, 0x89, 0x7a, 0xb5, + 0xd3, 0xe9, 0x0e, 0xe4, 0x58, 0xf9, 0x29, 0x64, 0x3a, 0x98, 0x3c, 0x77, 0xdc, 0xd3, 0x9e, 0xe3, + 0x32, 0xe3, 0xd9, 0xb3, 0xc9, 0x10, 0xbb, 0x22, 0x09, 0xc5, 0x88, 0x86, 0xaf, 0x9f, 0xed, 0x22, + 0xae, 0x83, 0x31, 0x95, 0x99, 0xce, 0x86, 0x96, 0xa9, 0x8b, 0xc0, 0x16, 0xa3, 0xf2, 0xff, 0xe4, + 0x21, 0x5f, 0x77, 0x2c, 0x8b, 0x67, 0x4a, 0x7f, 0x8a, 0x75, 0x54, 0x86, 0x98, 0xad, 0x4d, 0x78, + 0x7e, 0xa6, 0x6b, 0xf9, 0x57, 0x2f, 0x4b, 0xb0, 0xe0, 0x50, 0xd8, 0x1c, 0x6a, 0xc0, 0xd6, 0x73, + 0xd7, 0x24, 0x58, 0xf5, 0xf4, 0x13, 0x3c, 0xd1, 0x78, 0x04, 0xa4, 0xd6, 0x88, 0x80, 0x0c, 0x13, + 0xeb, 0x33, 0x29, 0x54, 0x03, 0xd9, 0xc5, 0x9a, 0xb1, 0xa4, 0x24, 0xb3, 0x86, 0x12, 0xa0, 0x52, + 0x42, 0x87, 0x0c, 0x51, 0x9a, 0x62, 0x51, 0x96, 0x02, 0xf4, 0x11, 0xdd, 0x84, 0xd4, 0x6c, 0x66, + 0x1a, 0x2a, 0x4d, 0x79, 0xee, 0xe7, 0x24, 0x1d, 0xf7, 0x88, 0x4b, 0x1d, 0xbd, 0xc8, 0x60, 0x96, + 0xf3, 0x5e, 0x21, 0xce, 0x24, 0x37, 0x03, 0xfa, 0x21, 0x23, 0xa3, 0xf7, 0x21, 0x33, 0x0d, 0x10, + 0xc4, 0x2b, 0x24, 0xf6, 0xa2, 0xfb, 0x99, 0x03, 0x99, 0x87, 0xe3, 0x02, 0x5a, 0x44, 0x8a, 0x86, + 0x59, 0xa9, 0x6d, 0x34, 0xfd, 0x54, 0x25, 0x78, 0x32, 0xb5, 0x34, 0x82, 0xf9, 0xb6, 0x92, 0xeb, + 0xd8, 0x46, 0xd3, 0x4f, 0x07, 0x42, 0x0a, 0x35, 0x00, 0x2d, 0x96, 0xea, 0xeb, 0x2a, 0xa4, 0x59, + 0x4a, 0x5f, 0xab, 0x04, 0xa8, 0xfe, 0xd8, 0x99, 0xb9, 0xb6, 0x66, 0x51, 0xc7, 0x29, 0x5b, 0x81, + 0x40, 0xa0, 0xe5, 0x5b, 0x00, 0x06, 0x76, 0xcd, 0x67, 0x1a, 0xcb, 0xe2, 0x2c, 0x93, 0x2e, 0xf1, + 0x4d, 0x2c, 0x7b, 0xbd, 0xd2, 0x08, 0xd8, 0x94, 0x90, 0x48, 0xf1, 0x5f, 0x00, 0x60, 0x31, 0x85, + 0x06, 0x90, 0xd7, 0x1d, 0xdb, 0xc6, 0x3a, 0x71, 0x5c, 0x9e, 0x66, 0x12, 0xcb, 0xd3, 0x77, 0x2f, + 0xd1, 0x59, 0xa9, 0xfb, 0x52, 0x34, 0x11, 0x95, 0x9c, 0x1e, 0x1e, 0xa2, 0xbb, 0x40, 0xd3, 0x74, + 0x64, 0x8e, 0xb9, 0xad, 0x22, 0x6b, 0xd8, 0x2a, 0xc1, 0x05, 0x50, 0x17, 0x80, 0xb8, 0x9a, 0xed, + 0xd1, 0x4c, 0xf6, 0x58, 0x14, 0x64, 0x0e, 0xde, 0xba, 0x6c, 0x31, 0x03, 0x5f, 0x42, 0xb8, 0x2f, + 0xa4, 0x02, 0x7d, 0x00, 0x5b, 0xde, 0xc9, 0x6c, 0x34, 0xb2, 0x30, 0x85, 0x6e, 0x95, 0x03, 0x6c, + 0x6c, 0x2f, 0xba, 0x9f, 0x3f, 0x78, 0xe7, 0x32, 0xbd, 0x7d, 0x2e, 0xc8, 0xb6, 0xb8, 0x29, 0xb4, + 0x3c, 0xc1, 0xf3, 0x01, 0xc3, 0xe5, 0x7b, 0x90, 0xf7, 0x4e, 0x34, 0xd7, 0x58, 0x38, 0x33, 0xce, + 0xdc, 0xb1, 0x5d, 0xf1, 0x8b, 0x76, 0xa5, 0x4f, 0xe7, 0x99, 0x2b, 0x73, 0x8c, 0x35, 0x70, 0x63, + 0x0b, 0xae, 0xb9, 0x58, 0x77, 0x9e, 0x61, 0x77, 0xae, 0x5a, 0xce, 0x78, 0xa1, 0x22, 0x71, 0x51, + 0x3c, 0x6c, 0xfb, 0x32, 0x6d, 0x67, 0x1c, 0xa8, 0xfa, 0x26, 0xe4, 0x6c, 0x8e, 0x25, 0xea, 0xd4, + 0x71, 0x89, 0x57, 0x48, 0x32, 0x9b, 0x6d, 0xf1, 0xbd, 0x85, 0x60, 0x46, 0xc9, 0xda, 0x8b, 0x81, + 0x57, 0xfc, 0x71, 0x1c, 0xd2, 0x81, 0xdd, 0xd0, 0xed, 0x25, 0x8c, 0xc8, 0xbd, 0x7a, 0x59, 0x5a, + 0x4c, 0x0a, 0x88, 0xb8, 0x07, 0xa0, 0x07, 0x96, 0x62, 0x3e, 0xcd, 0x1c, 0xec, 0x9c, 0x67, 0x41, + 0xdf, 0x09, 0x0b, 0x6e, 0xd4, 0x0e, 0x07, 0xbf, 0x87, 0x2d, 0x16, 0x2a, 0xa2, 0x9e, 0xdd, 0x58, + 0x6c, 0xb6, 0xad, 0x0d, 0xb1, 0xd5, 0x17, 0xd3, 0x42, 0xcd, 0x22, 0x09, 0xfc, 0x09, 0x8e, 0x8b, + 0xa6, 0xe3, 0x9a, 0x84, 0x97, 0xec, 0x9c, 0x12, 0x8c, 0xd1, 0xd7, 0x00, 0x31, 0x08, 0x32, 0xb0, + 0xa5, 0xcd, 0x55, 0x0f, 0xeb, 0x8e, 0xcd, 0x30, 0x81, 0x72, 0x31, 0x70, 0x6a, 0xd0, 0x89, 0x3e, + 0xa7, 0xa3, 0x12, 0x64, 0x42, 0xc1, 0xc1, 0x40, 0x21, 0xad, 0xc0, 0xc2, 0xd3, 0xe8, 0x18, 0x8a, + 0x3e, 0x83, 0xa5, 0x4d, 0x86, 0x86, 0xa6, 0x86, 0x03, 0x7b, 0x1d, 0x10, 0xd8, 0x16, 0xf2, 0x6d, + 0x26, 0x5e, 0xe7, 0x51, 0x7e, 0x08, 0xe8, 0x1c, 0x75, 0xeb, 0xe0, 0x6d, 0xd6, 0x0a, 0xeb, 0xf9, + 0x12, 0xa4, 0xd9, 0x6e, 0x1d, 0xdb, 0x9a, 0x33, 0x2c, 0x49, 0x29, 0x29, 0x4a, 0xe8, 0xda, 0xd6, + 0x1c, 0x55, 0x60, 0xfb, 0x43, 0x1e, 0x3d, 0x2a, 0x47, 0xe5, 0xd9, 0x68, 0x64, 0xbe, 0x28, 0x00, + 0x83, 0xd0, 0x2d, 0x31, 0xa5, 0x50, 0xe4, 0x65, 0x13, 0xe8, 0x2e, 0x80, 0xed, 0x10, 0x75, 0x88, + 0x47, 0x8e, 0x8b, 0x19, 0x6e, 0x67, 0x0e, 0x8a, 0x15, 0xde, 0x49, 0x56, 0xfc, 0x4e, 0xb2, 0x32, + 0xf0, 0x3b, 0x49, 0x25, 0x6d, 0x3b, 0xa4, 0xc6, 0x98, 0xd1, 0x6f, 0x00, 0x1d, 0xa8, 0xda, 0x88, + 0x60, 0x57, 0xa0, 0xd2, 0x45, 0x92, 0x29, 0xdb, 0x21, 0x55, 0xca, 0x4b, 0x5d, 0x39, 0xd4, 0xf4, + 0xd3, 0x91, 0x69, 0x59, 0x85, 0x1c, 0x77, 0xa5, 0x3f, 0x2e, 0x7f, 0x0f, 0x72, 0x4b, 0x28, 0x83, + 0x8a, 0x70, 0x5d, 0x14, 0x5c, 0xb5, 0xde, 0xed, 0x74, 0x9a, 0xf5, 0x41, 0x57, 0x51, 0x07, 0x4f, + 0x7b, 0x4d, 0x79, 0x83, 0x96, 0xd7, 0xfe, 0x6f, 0xb5, 0x5b, 0x83, 0xa6, 0x2c, 0xa1, 0x3c, 0x00, + 0xa5, 0xf6, 0xeb, 0x4a, 0xab, 0x37, 0x90, 0x23, 0x28, 0x0d, 0xf1, 0xd6, 0x51, 0xf5, 0x61, 0x53, + 0x8e, 0xd2, 0xc7, 0x76, 0xb7, 0x5e, 0x6d, 0xcb, 0xb1, 0xf2, 0x11, 0x64, 0x42, 0xf9, 0x8d, 0x0a, + 0xb0, 0xe3, 0x2b, 0xef, 0x3f, 0x3a, 0x3e, 0x3c, 0x6c, 0x37, 0x7d, 0xd5, 0x19, 0x48, 0xd6, 0xba, + 0xdd, 0x76, 0xb3, 0xda, 0x91, 0x25, 0x5e, 0xf4, 0x07, 0xcd, 0x87, 0x4d, 0x45, 0x8e, 0xb0, 0x97, + 0x0e, 0x94, 0x56, 0xe7, 0xa1, 0x1c, 0x2d, 0xff, 0x30, 0x02, 0x79, 0x56, 0x6a, 0x78, 0x98, 0xd2, + 0xa8, 0x47, 0x10, 0x3b, 0xc5, 0x73, 0xbf, 0x9d, 0x63, 0xcf, 0xb4, 0x6e, 0x3f, 0xd3, 0xac, 0x19, + 0xf6, 0x0a, 0x11, 0x46, 0x15, 0x23, 0x6a, 0x08, 0xc3, 0xd1, 0x67, 0x13, 0x6c, 0x13, 0xd1, 0xe9, + 0x04, 0x63, 0xf4, 0x0c, 0xae, 0xb1, 0xda, 0x16, 0x0e, 0x16, 0x75, 0xa2, 0x4d, 0x19, 0x8c, 0x65, + 0x0e, 0xbe, 0xc6, 0x93, 0x70, 0xf9, 0xe5, 0x7c, 0xc8, 0xc3, 0xe4, 0xb1, 0xe7, 0xd8, 0x47, 0xda, + 0xb4, 0x69, 0x13, 0x77, 0x5e, 0x7b, 0xe3, 0xa3, 0xcf, 0x2e, 0x2a, 0x59, 0xa3, 0x85, 0x58, 0xb1, + 0x09, 0x37, 0x5e, 0xa3, 0xc5, 0xaf, 0xd2, 0xa2, 0x03, 0xa7, 0x55, 0x7a, 0x07, 0xe2, 0x6c, 0x2b, + 0x7e, 0x07, 0xce, 0x06, 0xf7, 0x22, 0xef, 0x4b, 0xe5, 0xff, 0x8d, 0x43, 0xa6, 0xae, 0x4d, 0xc9, + 0xcc, 0xc5, 0xac, 0x1f, 0x29, 0x2d, 0x61, 0x4d, 0xe6, 0xd5, 0xcb, 0x52, 0x52, 0x4c, 0x0b, 0xa4, + 0x39, 0x5c, 0x29, 0x4a, 0x11, 0x56, 0x94, 0xfc, 0x42, 0xb7, 0xd0, 0x75, 0xa5, 0x32, 0x14, 0xbd, + 0x42, 0x19, 0xfa, 0x06, 0xa4, 0x86, 0xa6, 0x4d, 0x59, 0x3c, 0x61, 0xe5, 0x9b, 0xab, 0x2f, 0xaf, + 0x71, 0x0e, 0x25, 0x60, 0xa5, 0xfd, 0x88, 0x69, 0x13, 0xec, 0x3e, 0xd3, 0xac, 0x33, 0xd8, 0xb3, + 0xe9, 0xd3, 0x7d, 0xe8, 0x59, 0x2d, 0x1f, 0x89, 0x5f, 0xbe, 0x7c, 0x24, 0x7f, 0xf9, 0xf2, 0x91, + 0x5a, 0xaf, 0x7c, 0xfc, 0x97, 0x04, 0x49, 0xb1, 0x7f, 0xf4, 0x18, 0x76, 0x5c, 0xec, 0x39, 0x33, + 0x57, 0xc7, 0x4b, 0x78, 0x26, 0xad, 0x61, 0xf0, 0xbc, 0x2f, 0x29, 0x10, 0xed, 0xcb, 0x90, 0x0b, + 0x74, 0x4d, 0x35, 0x72, 0x22, 0xd2, 0x24, 0xeb, 0x13, 0x7b, 0x1a, 0x39, 0x39, 0x53, 0x8a, 0xa2, + 0x57, 0x2a, 0x45, 0x61, 0xc4, 0x89, 0x2d, 0x23, 0x0e, 0x85, 0x53, 0x8f, 0xd0, 0x16, 0xcf, 0xff, + 0xc8, 0x4b, 0x2b, 0x29, 0x46, 0x78, 0x82, 0xe7, 0xe5, 0x83, 0xb3, 0x70, 0xb4, 0xd4, 0xff, 0x07, + 0x18, 0x93, 0x5c, 0x60, 0x4c, 0xaa, 0xfc, 0x53, 0x80, 0xed, 0x23, 0x8d, 0x60, 0xd7, 0xd4, 0x2c, + 0xf3, 0xfb, 0x5a, 0xd0, 0x92, 0xbf, 0xb9, 0x94, 0x02, 0xdb, 0xaf, 0x5e, 0x96, 0x36, 0xcf, 0xb0, + 0x89, 0x54, 0xe8, 0xbc, 0x26, 0x15, 0xde, 0xe4, 0xbb, 0x3d, 0x47, 0xf7, 0xff, 0x5b, 0x4a, 0x3c, + 0x58, 0x49, 0x89, 0xdb, 0xaf, 0x5f, 0xc4, 0x6a, 0x6a, 0x7c, 0xc1, 0xdb, 0xa5, 0x7f, 0x48, 0x7c, + 0x41, 0xe3, 0xfd, 0xfc, 0xd6, 0x2b, 0xf9, 0x2b, 0x68, 0xbd, 0xd2, 0x67, 0x5a, 0xaf, 0x3a, 0x6c, + 0xf2, 0x32, 0xe5, 0xf9, 0x45, 0x88, 0x25, 0x58, 0xb0, 0xd4, 0xe5, 0x02, 0x25, 0xde, 0x91, 0x1f, + 0x2d, 0xd7, 0xcc, 0x2f, 0x43, 0xce, 0xc0, 0x16, 0xd1, 0xd4, 0xd9, 0xd4, 0xd0, 0x08, 0xf6, 0xfc, + 0xb3, 0x16, 0x46, 0x3c, 0xe6, 0x34, 0x34, 0x04, 0x64, 0xe0, 0xa9, 0x8b, 0x75, 0x8d, 0x60, 0x43, + 0x15, 0x0d, 0x96, 0x08, 0x86, 0xf7, 0x2e, 0x0d, 0xca, 0x4a, 0x23, 0x90, 0x15, 0x0d, 0x80, 0xb2, + 0x65, 0x9c, 0x25, 0xbd, 0xae, 0x7b, 0x4a, 0xad, 0xd7, 0x3d, 0xc1, 0xe7, 0xee, 0x9e, 0x32, 0x9f, + 0xb3, 0x7b, 0xca, 0x5e, 0x84, 0x65, 0xb9, 0x65, 0x2c, 0x2b, 0xfe, 0xae, 0x04, 0x5b, 0x2b, 0x56, + 0x40, 0xb7, 0x00, 0xc6, 0xae, 0x33, 0x9b, 0xaa, 0x0b, 0x6c, 0x52, 0xd2, 0x8c, 0xd2, 0xa1, 0x58, + 0xf4, 0x2b, 0x6d, 0xe2, 0xd7, 0x85, 0xd3, 0xd4, 0x02, 0x4e, 0xd3, 0xe5, 0xff, 0x4c, 0x43, 0xa2, + 0x5b, 0x9d, 0x91, 0x93, 0x03, 0x71, 0x36, 0xf2, 0xcc, 0x34, 0xb0, 0x7f, 0x0e, 0x18, 0x8c, 0xd1, + 0xdb, 0xb0, 0xa5, 0xcd, 0xc8, 0x89, 0x3a, 0x73, 0xad, 0x05, 0x54, 0xf0, 0xb6, 0x64, 0x93, 0x4e, + 0x1c, 0xbb, 0x56, 0x80, 0x07, 0x77, 0xe1, 0xa6, 0xa6, 0xeb, 0xd8, 0xf3, 0x54, 0xe2, 0x9c, 0x62, + 0x7b, 0x59, 0x86, 0x37, 0x62, 0xd7, 0x39, 0xc3, 0x80, 0xce, 0x87, 0x45, 0x2b, 0xb0, 0xbd, 0x24, + 0x3a, 0xc1, 0xe4, 0xc4, 0x31, 0xf8, 0x81, 0x87, 0xb2, 0x15, 0x12, 0x3a, 0x62, 0x13, 0x6c, 0x59, + 0x61, 0xfe, 0xa1, 0x63, 0xcc, 0xc5, 0x81, 0xc6, 0x66, 0x88, 0xbb, 0xe6, 0x18, 0x73, 0xf4, 0xfb, + 0x12, 0xdc, 0x5a, 0x62, 0x3e, 0xc1, 0x9a, 0x81, 0x5d, 0x6f, 0xd1, 0xfb, 0xc5, 0x19, 0x6e, 0x89, + 0x4f, 0x58, 0x6e, 0x94, 0x4a, 0x75, 0xa1, 0xe5, 0x11, 0xe7, 0xbf, 0x42, 0xeb, 0x87, 0xb4, 0x15, + 0x69, 0xf4, 0x91, 0x04, 0xbb, 0x4b, 0xcb, 0x70, 0xb1, 0x37, 0x75, 0x6c, 0x0f, 0x2f, 0xd6, 0x91, + 0x08, 0xf7, 0xa0, 0xab, 0xeb, 0x50, 0x84, 0xc0, 0x15, 0x16, 0x12, 0xb6, 0xb7, 0x2f, 0x7e, 0xa4, + 0x4d, 0xd1, 0x7d, 0x28, 0xba, 0x78, 0xe4, 0x62, 0xef, 0xe4, 0x3c, 0x5f, 0xf1, 0xf3, 0xbd, 0x1b, + 0x82, 0x63, 0xc5, 0x59, 0x5f, 0xa7, 0x98, 0x1d, 0x16, 0x16, 0xde, 0xca, 0x32, 0x31, 0x14, 0x16, + 0x13, 0xee, 0x62, 0x5f, 0x92, 0x61, 0x09, 0xe6, 0x2f, 0x9e, 0xff, 0x72, 0x98, 0x9f, 0x39, 0xec, + 0x0f, 0x24, 0xd8, 0x5d, 0x66, 0x5f, 0xf1, 0x58, 0xfa, 0x1c, 0x4b, 0x29, 0x21, 0x3d, 0x57, 0x77, + 0xd9, 0xb6, 0xbb, 0x2a, 0x8e, 0xfe, 0x48, 0x82, 0xd2, 0xf2, 0x4a, 0x56, 0x9d, 0x06, 0x6c, 0x29, + 0xef, 0xbe, 0x76, 0x29, 0x9f, 0xc3, 0x6b, 0x4b, 0x96, 0x0f, 0xb9, 0xad, 0xd8, 0x86, 0xdd, 0x8b, + 0xe3, 0xf2, 0x2a, 0x1f, 0x13, 0xc5, 0x23, 0x28, 0x5d, 0x12, 0x5d, 0x57, 0x55, 0x77, 0x89, 0x0b, + 0xae, 0xa4, 0xae, 0x03, 0x7b, 0x97, 0x99, 0xf1, 0x4a, 0x9f, 0x4e, 0x7f, 0x1e, 0x85, 0xd4, 0x00, + 0x7b, 0x84, 0x35, 0x8d, 0x28, 0xdc, 0x34, 0x8a, 0xfe, 0xf0, 0x0e, 0xc4, 0x3d, 0x82, 0xa7, 0xfc, + 0x6b, 0x92, 0x36, 0x53, 0xcc, 0xa3, 0xbe, 0x48, 0xa5, 0x4f, 0xf0, 0x54, 0x40, 0x30, 0xe7, 0x2b, + 0xfe, 0x3c, 0x02, 0x31, 0x4a, 0x45, 0xdf, 0xa0, 0xf5, 0x01, 0x4f, 0xc3, 0x87, 0x7e, 0x85, 0x73, + 0xa4, 0x2b, 0xac, 0x8b, 0x4c, 0x51, 0x56, 0x86, 0xd2, 0xb7, 0x00, 0x98, 0x98, 0x69, 0x1b, 0xf8, + 0x85, 0xb8, 0x20, 0x62, 0x8a, 0x5a, 0x94, 0x70, 0xf6, 0x9a, 0x21, 0xba, 0x7a, 0xcd, 0xe0, 0x2b, + 0xf0, 0x74, 0x67, 0xea, 0xdf, 0x51, 0x30, 0x05, 0x7d, 0x4a, 0x40, 0x95, 0xa5, 0x56, 0x27, 0x7e, + 0xee, 0x91, 0x75, 0xb8, 0xbd, 0xb9, 0x0b, 0x39, 0xc3, 0xd1, 0x45, 0x96, 0x3d, 0xc3, 0x3a, 0x3f, + 0xc3, 0xb9, 0xa4, 0x09, 0x8b, 0x51, 0x11, 0xf4, 0x00, 0x20, 0x28, 0x4b, 0xde, 0x7a, 0x1d, 0x51, + 0x48, 0xa0, 0xbc, 0x0b, 0x31, 0x66, 0x11, 0x80, 0x44, 0xab, 0xf3, 0xb0, 0xd9, 0x1f, 0xf0, 0x53, + 0x88, 0x6f, 0x37, 0x95, 0xd6, 0xe1, 0x53, 0x59, 0x2a, 0xff, 0x50, 0x82, 0xb4, 0xa2, 0xd9, 0x63, + 0xfe, 0xd1, 0xfb, 0x25, 0x48, 0x9f, 0xe2, 0xb9, 0xca, 0xef, 0xda, 0xa8, 0xd9, 0x92, 0x4a, 0xea, + 0x14, 0xcf, 0x6b, 0xec, 0xba, 0xed, 0x06, 0x24, 0xe9, 0x24, 0xb6, 0x0d, 0x66, 0xb1, 0xa4, 0x92, + 0x38, 0xc5, 0xf3, 0xa6, 0x6d, 0xa0, 0x32, 0xe4, 0x5c, 0x95, 0x5d, 0x8a, 0x09, 0xc9, 0x18, 0x9b, + 0xce, 0xb8, 0xec, 0xbe, 0x8c, 0x0b, 0xef, 0x42, 0xc6, 0xe7, 0xa1, 0x0a, 0xe2, 0x8c, 0x23, 0xcd, + 0x39, 0x9a, 0xb6, 0x71, 0x4f, 0xfe, 0xd1, 0xc7, 0xa5, 0x8d, 0x33, 0xb7, 0x77, 0xf9, 0xa0, 0xf4, + 0xf6, 0x69, 0x4b, 0x80, 0xee, 0x43, 0x96, 0xf7, 0x5b, 0xc6, 0xfa, 0x9d, 0x6c, 0x52, 0x48, 0xa0, + 0x12, 0x64, 0x26, 0xd8, 0x1d, 0xb3, 0xfe, 0x55, 0x3f, 0x61, 0x9b, 0x4b, 0x29, 0xc0, 0x48, 0x3d, + 0x4a, 0x29, 0xdf, 0x85, 0x74, 0x1f, 0xbb, 0x3d, 0xc7, 0x32, 0x75, 0x76, 0x40, 0xe7, 0x11, 0x57, + 0x25, 0xee, 0xcc, 0xa6, 0xcd, 0x87, 0xe8, 0x7a, 0xf8, 0xc5, 0x87, 0xec, 0x11, 0x77, 0x20, 0x26, + 0x58, 0x87, 0x53, 0xfe, 0xd3, 0x08, 0x40, 0xf3, 0x05, 0x71, 0x35, 0x9d, 0x54, 0x7b, 0xad, 0xe2, + 0x5f, 0x4a, 0x90, 0x10, 0x8d, 0x73, 0xf8, 0x56, 0x40, 0x5a, 0xbe, 0x15, 0x78, 0x00, 0x99, 0xf0, + 0x0d, 0xc4, 0x3a, 0xc7, 0xcf, 0xc0, 0x05, 0x68, 0xa2, 0xd2, 0x08, 0xe5, 0x7d, 0xec, 0x94, 0xb8, + 0x9e, 0xb8, 0x88, 0x48, 0x33, 0x4a, 0x8f, 0xb8, 0x2b, 0x17, 0x09, 0xb1, 0xb5, 0x2f, 0x12, 0xca, + 0x4f, 0x21, 0x56, 0x77, 0x8c, 0x33, 0x9d, 0x4e, 0x0e, 0xd2, 0xf5, 0x6e, 0xe7, 0xb0, 0xf5, 0xf0, + 0x58, 0x69, 0xf2, 0xf3, 0xa5, 0xe6, 0x77, 0x06, 0x4a, 0xb5, 0x3e, 0x90, 0x23, 0x08, 0x41, 0x5e, + 0x0c, 0x9a, 0x0d, 0xf5, 0xf8, 0xb8, 0xd5, 0x90, 0xa3, 0x68, 0x07, 0xe4, 0x05, 0xed, 0xb0, 0xd5, + 0x6c, 0x37, 0xfa, 0x72, 0xac, 0xfc, 0x69, 0x1c, 0xa0, 0xee, 0x4c, 0x86, 0xa6, 0x8d, 0xa9, 0x9d, + 0xfe, 0x23, 0x12, 0xd8, 0xe9, 0x8c, 0x31, 0xa4, 0x2b, 0x1a, 0xe3, 0x26, 0xd0, 0x30, 0xe5, 0xa6, + 0xe0, 0x9f, 0x26, 0x34, 0x54, 0x99, 0x21, 0xae, 0x43, 0x42, 0x5c, 0xb9, 0x70, 0x1b, 0x89, 0x11, + 0x2d, 0xb5, 0xdc, 0x33, 0x96, 0xa6, 0xe3, 0x13, 0xc7, 0x32, 0xb0, 0x1b, 0xba, 0xbb, 0x41, 0xcc, + 0x4b, 0x8b, 0x29, 0xea, 0xb0, 0x33, 0x26, 0x8d, 0xaf, 0x7f, 0x37, 0xf3, 0x26, 0x6c, 0x2e, 0xc0, + 0x80, 0xf7, 0xad, 0xec, 0xde, 0x52, 0xc9, 0x2f, 0xc8, 0xac, 0x79, 0x7d, 0x1b, 0xb6, 0xd8, 0xb5, + 0xeb, 0xd2, 0xdd, 0x94, 0xb8, 0x13, 0x64, 0x13, 0xfd, 0xc5, 0x9e, 0x2b, 0x00, 0x1e, 0x5d, 0x33, + 0x0b, 0x58, 0x56, 0xf1, 0x83, 0xbb, 0xdc, 0x20, 0x8e, 0x95, 0xb4, 0xe7, 0x3f, 0x16, 0x7f, 0x07, + 0xe2, 0x34, 0x8d, 0x3c, 0xf4, 0x6b, 0x10, 0xb3, 0xf0, 0x88, 0x30, 0x23, 0x67, 0x0e, 0x10, 0x17, + 0x69, 0x38, 0xba, 0x57, 0xb5, 0x8d, 0xda, 0x9c, 0x60, 0x4f, 0x61, 0xf3, 0x68, 0x1f, 0xe2, 0xae, + 0x39, 0x3e, 0x21, 0xe2, 0x14, 0xfd, 0x3c, 0x46, 0xce, 0x80, 0xbe, 0x02, 0x51, 0x67, 0x46, 0x44, + 0x93, 0x7d, 0x1e, 0x1f, 0x9d, 0x2e, 0xff, 0xa3, 0xb4, 0x46, 0x64, 0x6d, 0x42, 0x46, 0x69, 0x36, + 0x8e, 0xeb, 0x4d, 0xb5, 0xdd, 0x3c, 0xa4, 0xd1, 0xb5, 0x05, 0xb9, 0x7a, 0xf7, 0xa8, 0xd6, 0xea, + 0x34, 0x55, 0xa5, 0xf5, 0xf0, 0xd1, 0x40, 0x8e, 0x22, 0x19, 0x32, 0x0d, 0xa5, 0xda, 0xea, 0xa8, + 0xf5, 0x47, 0xc7, 0x9d, 0x27, 0xf2, 0x27, 0x12, 0xda, 0x85, 0x9b, 0x8c, 0xd2, 0x6c, 0xa8, 0x82, + 0xb9, 0xa1, 0x36, 0xba, 0xf5, 0xe3, 0xa3, 0x66, 0x67, 0x20, 0xff, 0x8d, 0x84, 0x6e, 0x41, 0xc1, + 0x9f, 0xe7, 0xda, 0x43, 0xd3, 0x7f, 0x2b, 0x05, 0x0a, 0x9b, 0x0d, 0xf5, 0x49, 0xf3, 0xa9, 0xfc, + 0x77, 0x12, 0xda, 0x86, 0xbc, 0x4f, 0x11, 0xd1, 0xfb, 0x53, 0x09, 0x21, 0xc8, 0xf9, 0xc4, 0xfe, + 0xa0, 0x3a, 0xe8, 0xcb, 0x7f, 0x2f, 0x95, 0x7f, 0x2e, 0x41, 0xaa, 0x36, 0x33, 0x2d, 0x83, 0x06, + 0xf4, 0xbf, 0x2e, 0x25, 0xfe, 0x90, 0x92, 0x55, 0xd3, 0xf0, 0x13, 0x9f, 0x8d, 0x5b, 0xc6, 0x62, + 0xca, 0x18, 0x8a, 0x5a, 0xca, 0xa7, 0x1a, 0x43, 0x76, 0x41, 0xcd, 0x3e, 0xa8, 0x45, 0x4d, 0x12, + 0x23, 0x74, 0x00, 0x19, 0xf1, 0xf5, 0xcd, 0x0a, 0x61, 0x8c, 0x15, 0xc2, 0x2d, 0xff, 0xdb, 0x3a, + 0xb8, 0x6a, 0x56, 0x80, 0x73, 0x31, 0xc4, 0x7f, 0x07, 0xb6, 0x16, 0x87, 0x32, 0xe2, 0x94, 0x40, + 0x1c, 0x17, 0xc9, 0xc1, 0x84, 0x38, 0x4a, 0x40, 0xb7, 0x21, 0x2b, 0x02, 0x56, 0x75, 0x1d, 0x87, + 0x88, 0xf0, 0xf4, 0x83, 0x58, 0x71, 0x1c, 0x52, 0xde, 0x86, 0x2d, 0x05, 0x7b, 0x98, 0x30, 0x2c, + 0x56, 0xf0, 0x6f, 0xcf, 0xb0, 0x47, 0xca, 0x3b, 0x80, 0xc2, 0x44, 0xde, 0x48, 0x94, 0x1f, 0x00, + 0xaa, 0x1a, 0xcf, 0x34, 0x5b, 0xc7, 0xf4, 0x7b, 0x50, 0xf0, 0xd2, 0x2c, 0xd0, 0x38, 0x35, 0x38, + 0x75, 0xa4, 0x96, 0x89, 0x29, 0x79, 0x41, 0x16, 0x87, 0x8e, 0xe5, 0x6b, 0xb0, 0xbd, 0x24, 0x2e, + 0xb4, 0xbe, 0x0f, 0xd9, 0x70, 0x50, 0xd1, 0x4e, 0x83, 0x56, 0x48, 0x81, 0xca, 0xbc, 0x5a, 0xee, + 0x40, 0x7c, 0x48, 0x27, 0x99, 0x61, 0x63, 0x0a, 0x1f, 0x94, 0xff, 0x58, 0x82, 0x5c, 0xcb, 0x1e, + 0x63, 0x8f, 0xf8, 0x6b, 0x59, 0x2e, 0xe0, 0xd2, 0xa5, 0x05, 0x3c, 0xec, 0xce, 0xc8, 0xb2, 0x3b, + 0x57, 0x6a, 0x7b, 0x74, 0xdd, 0xda, 0x5e, 0xfe, 0xa7, 0x08, 0xe4, 0xfd, 0x75, 0xf1, 0x4d, 0xa2, + 0xbf, 0x90, 0x16, 0x5f, 0xf4, 0xfc, 0xae, 0x9b, 0x76, 0xe8, 0xfc, 0x74, 0x3e, 0xf8, 0x90, 0x5a, + 0x96, 0xf1, 0x8f, 0x93, 0x3e, 0xa0, 0xec, 0xb4, 0x37, 0xf4, 0x78, 0x27, 0xfc, 0xbd, 0xdf, 0xfb, + 0xac, 0xf4, 0xce, 0x79, 0x7f, 0x67, 0x39, 0xf3, 0x77, 0x1e, 0x5f, 0xfe, 0xa3, 0xcf, 0x4a, 0x6f, + 0xaf, 0xc3, 0xde, 0x1d, 0x8d, 0x3c, 0x4c, 0x82, 0xd3, 0x85, 0xc5, 0x6b, 0xd1, 0x6f, 0x42, 0xd6, + 0x5f, 0x3b, 0x26, 0xba, 0x21, 0x80, 0x23, 0x74, 0xf0, 0xc5, 0x3b, 0xd7, 0x4a, 0x93, 0xe8, 0x86, + 0x8f, 0x93, 0x42, 0x80, 0x92, 0x8a, 0x0d, 0xb8, 0x7e, 0xfe, 0x5e, 0x2e, 0x6b, 0x47, 0xa3, 0xe1, + 0x76, 0xf4, 0xcf, 0x22, 0x70, 0x63, 0xa0, 0x79, 0xa7, 0xfe, 0x31, 0x99, 0xeb, 0xbc, 0x98, 0xfb, + 0x7e, 0xff, 0x26, 0xc4, 0x9c, 0x29, 0xb6, 0x05, 0xf6, 0x95, 0x45, 0x2b, 0x79, 0x3e, 0x73, 0xa5, + 0x3b, 0xc5, 0xb6, 0xc2, 0xf8, 0x59, 0xac, 0x69, 0x44, 0x63, 0x2f, 0xcb, 0x2a, 0xec, 0xb9, 0xf8, + 0x57, 0x12, 0xc4, 0x28, 0x0b, 0xda, 0x87, 0x04, 0xff, 0x8c, 0x12, 0x6a, 0xe5, 0xb3, 0x1b, 0x56, + 0xc4, 0x3c, 0x6a, 0x43, 0x8a, 0x1f, 0x2f, 0xfa, 0x61, 0x54, 0xfb, 0xf5, 0x57, 0x2f, 0x4b, 0xef, + 0x9e, 0x67, 0xf5, 0x95, 0xff, 0x54, 0xf1, 0x83, 0xc7, 0x56, 0x43, 0x49, 0x32, 0x15, 0x2d, 0xd6, + 0xd2, 0x10, 0xcd, 0x1d, 0x63, 0xc2, 0x0e, 0x09, 0x19, 0x64, 0xe4, 0x14, 0xe0, 0x24, 0xf6, 0x97, + 0x8d, 0x12, 0x64, 0x74, 0xcb, 0xc4, 0x36, 0x51, 0x35, 0xc3, 0xf0, 0x4b, 0x1b, 0x70, 0x52, 0xd5, + 0x30, 0xdc, 0xf2, 0x1f, 0x46, 0xa1, 0xb0, 0xba, 0x7b, 0x11, 0x8a, 0x3d, 0xc8, 0xd1, 0xbd, 0x07, + 0x1f, 0x66, 0x62, 0x77, 0xef, 0xbc, 0xce, 0x68, 0x22, 0x1a, 0x99, 0xd5, 0xc4, 0x40, 0xc9, 0x3a, + 0xa1, 0xd1, 0xb9, 0x56, 0x7c, 0x0e, 0xd9, 0xb0, 0x04, 0x7a, 0x00, 0x09, 0x8f, 0x68, 0x64, 0xe6, + 0x89, 0x76, 0xff, 0xab, 0x97, 0xbc, 0xae, 0xcf, 0x98, 0x15, 0x21, 0x14, 0xf2, 0x45, 0xe4, 0x62, + 0x5f, 0x94, 0x7f, 0xc0, 0xfe, 0xc4, 0xc3, 0x84, 0x12, 0x10, 0xe9, 0x3e, 0x91, 0x37, 0xd0, 0x36, + 0x6c, 0xf6, 0x1f, 0x55, 0x95, 0x86, 0xda, 0xe9, 0x0e, 0xd4, 0xc3, 0xee, 0x71, 0xa7, 0x21, 0x4b, + 0xb4, 0x95, 0xe9, 0x74, 0x55, 0x4e, 0xef, 0x29, 0xad, 0xa3, 0xaa, 0xf2, 0x54, 0x8e, 0xa0, 0x6b, + 0xb0, 0x45, 0x99, 0x96, 0xc9, 0x51, 0xda, 0x0b, 0xb5, 0x3a, 0x83, 0xa6, 0xd2, 0xa9, 0xb6, 0xd5, + 0xa6, 0xa2, 0x74, 0x15, 0x39, 0x46, 0x2b, 0x18, 0x67, 0xeb, 0x0f, 0xba, 0xbd, 0x5e, 0xb3, 0x21, + 0xc7, 0xd1, 0x35, 0x90, 0x7b, 0x5d, 0x65, 0xc0, 0xde, 0x53, 0x6d, 0xb7, 0xbb, 0x1f, 0x34, 0x1b, + 0xf2, 0x2f, 0x92, 0x6f, 0x77, 0x20, 0x13, 0x42, 0x73, 0x5a, 0x27, 0xeb, 0xd5, 0x41, 0xb5, 0xdd, + 0x7d, 0x28, 0x6f, 0xd0, 0xc2, 0xf8, 0xb8, 0xdf, 0xed, 0xa8, 0xfd, 0xfa, 0xa3, 0xe6, 0x51, 0x55, + 0x96, 0xd8, 0x5f, 0x75, 0x58, 0xe1, 0x94, 0x63, 0x74, 0x35, 0x7e, 0x3d, 0xeb, 0xab, 0x87, 0xad, + 0xef, 0x0c, 0x68, 0x31, 0x8d, 0x1f, 0xfc, 0xb5, 0x04, 0x49, 0xfa, 0x9d, 0x64, 0xda, 0x63, 0xf4, + 0x2d, 0x80, 0x05, 0x52, 0xa3, 0x1b, 0xdc, 0xaa, 0x2b, 0x80, 0x5e, 0x2c, 0xac, 0x4e, 0x08, 0xc7, + 0xd4, 0x20, 0x13, 0x42, 0x65, 0x24, 0x18, 0x57, 0x71, 0xbe, 0x78, 0xf3, 0x9c, 0x19, 0xa1, 0xe3, + 0x3d, 0x48, 0x70, 0xec, 0x42, 0xdb, 0xcb, 0x48, 0xc6, 0x25, 0x77, 0xce, 0x83, 0xb7, 0x83, 0xef, + 0x42, 0x36, 0xec, 0x79, 0xf4, 0x18, 0xe2, 0xfc, 0xe1, 0xd6, 0x85, 0xe9, 0x5b, 0xdc, 0xbd, 0x38, + 0x72, 0xf6, 0xa5, 0xaf, 0x4b, 0xb5, 0xfb, 0x9f, 0xfc, 0xdb, 0xee, 0xc6, 0x27, 0x3f, 0xdb, 0x95, + 0x3e, 0xfd, 0xd9, 0xae, 0xf4, 0xf1, 0xbf, 0xef, 0x4a, 0xdf, 0x7d, 0x6b, 0x6c, 0x92, 0x93, 0xd9, + 0xb0, 0xa2, 0x3b, 0x93, 0x3b, 0xd8, 0x23, 0x33, 0xcd, 0x9d, 0xf3, 0xbf, 0x45, 0xae, 0xfc, 0x51, + 0x72, 0x98, 0x60, 0xe3, 0xf7, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x8c, 0x72, 0x9d, 0x44, + 0x29, 0x00, 0x00, } func (this *UUIDParts) Equal(that interface{}) bool { @@ -3501,6 +3517,11 @@ func (m *CollectionSpec_Derivation_Transform) MarshalToSizedBuffer(dAtA []byte) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Backfill != 0 { + i = encodeVarintFlow(dAtA, i, uint64(m.Backfill)) + i-- + dAtA[i] = 0x68 + } if m.NotAfter != nil { { size, err := m.NotAfter.MarshalToSizedBuffer(dAtA[:i]) @@ -3803,6 +3824,18 @@ func (m *CaptureSpec_Binding) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.StateKey) > 0 { + i -= len(m.StateKey) + copy(dAtA[i:], m.StateKey) + i = encodeVarintFlow(dAtA, i, uint64(len(m.StateKey))) + i-- + dAtA[i] = 0x2a + } + if m.Backfill != 0 { + i = encodeVarintFlow(dAtA, i, uint64(m.Backfill)) + i-- + dAtA[i] = 0x20 + } { size, err := m.Collection.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -3954,6 +3987,18 @@ func (m *MaterializationSpec_Binding) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.StateKey) > 0 { + i -= len(m.StateKey) + copy(dAtA[i:], m.StateKey) + i = encodeVarintFlow(dAtA, i, uint64(len(m.StateKey))) + i-- + dAtA[i] = 0x6a + } + if m.Backfill != 0 { + i = encodeVarintFlow(dAtA, i, uint64(m.Backfill)) + i-- + dAtA[i] = 0x60 + } if m.NotAfter != nil { { size, err := m.NotAfter.MarshalToSizedBuffer(dAtA[:i]) @@ -5648,6 +5693,9 @@ func (m *CollectionSpec_Derivation_Transform) ProtoSize() (n int) { l = m.NotAfter.ProtoSize() n += 1 + l + sovFlow(uint64(l)) } + if m.Backfill != 0 { + n += 1 + sovFlow(uint64(m.Backfill)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -5754,6 +5802,13 @@ func (m *CaptureSpec_Binding) ProtoSize() (n int) { } l = m.Collection.ProtoSize() n += 1 + l + sovFlow(uint64(l)) + if m.Backfill != 0 { + n += 1 + sovFlow(uint64(m.Backfill)) + } + l = len(m.StateKey) + if l > 0 { + n += 1 + l + sovFlow(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -5847,6 +5902,13 @@ func (m *MaterializationSpec_Binding) ProtoSize() (n int) { l = m.NotAfter.ProtoSize() n += 1 + l + sovFlow(uint64(l)) } + if m.Backfill != 0 { + n += 1 + sovFlow(uint64(m.Backfill)) + } + l = len(m.StateKey) + if l > 0 { + n += 1 + l + sovFlow(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -8433,6 +8495,25 @@ func (m *CollectionSpec_Derivation_Transform) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Backfill", wireType) + } + m.Backfill = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFlow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Backfill |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipFlow(dAtA[iNdEx:]) @@ -9148,6 +9229,57 @@ func (m *CaptureSpec_Binding) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Backfill", wireType) + } + m.Backfill = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFlow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Backfill |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StateKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFlow + } + 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 ErrInvalidLengthFlow + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthFlow + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StateKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipFlow(dAtA[iNdEx:]) @@ -9815,6 +9947,57 @@ func (m *MaterializationSpec_Binding) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Backfill", wireType) + } + m.Backfill = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFlow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Backfill |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StateKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFlow + } + 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 ErrInvalidLengthFlow + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthFlow + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StateKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipFlow(dAtA[iNdEx:]) diff --git a/go/protocols/flow/flow.proto b/go/protocols/flow/flow.proto index e18b0dfacd..7b0c12371f 100644 --- a/go/protocols/flow/flow.proto +++ b/go/protocols/flow/flow.proto @@ -190,7 +190,7 @@ message CollectionSpec { ]; // Transforms of the derivation. message Transform { - // Next tag: 13. + // Next tag: 14. // Stable name of this transform. string name = 1 [ (gogoproto.casttype) = "Transform" ]; @@ -226,6 +226,9 @@ message CollectionSpec { google.protobuf.Timestamp not_before = 11; // When set, documents after this timestamp are not processed. google.protobuf.Timestamp not_after = 12; + // Backfill counter for this transform. + // Every increment of this counter results in a new backfill. + uint32 backfill = 13; } repeated Transform transforms = 3 [ (gogoproto.nullable) = false ]; // JSON types of shuffle key components extracted by the transforms of this derivation. @@ -285,6 +288,8 @@ message CaptureSpec { // Bindings are ordered and unique on the bound collection name, // and are also unique on the resource path. message Binding { + // Next tag: 6. + // JSON-encoded configuration of the bound resource. string resource_config_json = 1 [ (gogoproto.casttype) = "encoding/json.RawMessage", @@ -295,6 +300,11 @@ message CaptureSpec { repeated string resource_path = 2; // Collection to be captured into. CollectionSpec collection = 3 [ (gogoproto.nullable) = false ]; + // Backfill counter for this binding. + // Every increment of this counter results in a new backfill. + uint32 backfill = 4; + // A suggested key to use for this binding within connector states. + string state_key = 5; } repeated Binding bindings = 4; // Minimum interval of time between successive invocations of the capture. @@ -328,7 +338,7 @@ message MaterializationSpec { // materialized. Bindings are ordered and unique on the bound collection name, // and are also unique on the resource path. message Binding { - // Next tag: 12. + // Next tag: 14. // JSON-encoded configuration of the bound resource. string resource_config_json = 1 [ @@ -362,6 +372,11 @@ message MaterializationSpec { google.protobuf.Timestamp not_before = 10; // When set, documents after this timestamp are not processed. google.protobuf.Timestamp not_after = 11; + // Backfill counter for this binding. + // Every increment of this counter results in a new backfill. + uint32 backfill = 12; + // A suggested key to use for this binding within connector state. + string state_key = 13; } repeated Binding bindings = 4; // Template for shards of this materialization. diff --git a/go/protocols/materialize/materialize.pb.go b/go/protocols/materialize/materialize.pb.go index 4e31d26cd1..636099a943 100644 --- a/go/protocols/materialize/materialize.pb.go +++ b/go/protocols/materialize/materialize.pb.go @@ -238,10 +238,12 @@ type Request_Validate_Binding struct { Collection flow.CollectionSpec `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection"` // Projection configuration, keyed by the projection field name, // with JSON-encoded and driver-defined configuration objects. - FieldConfigJsonMap map[string]encoding_json.RawMessage `protobuf:"bytes,3,rep,name=field_config_json_map,json=fieldConfig,proto3,castvalue=encoding/json.RawMessage" json:"field_config_json_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + FieldConfigJsonMap map[string]encoding_json.RawMessage `protobuf:"bytes,3,rep,name=field_config_json_map,json=fieldConfig,proto3,castvalue=encoding/json.RawMessage" json:"field_config_json_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Backfill counter for this binding. + Backfill uint32 `protobuf:"varint,4,opt,name=backfill,proto3" json:"backfill,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Request_Validate_Binding) Reset() { *m = Request_Validate_Binding{} } @@ -1312,109 +1314,110 @@ func init() { } var fileDescriptor_3e8b62b327f34bc6 = []byte{ - // 1631 bytes of a gzipped FileDescriptorProto + // 1648 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0x4f, 0x6f, 0xdb, 0xc8, 0x15, 0x0f, 0x65, 0xfd, 0x7d, 0x92, 0x6c, 0x79, 0xaa, 0x74, 0x59, 0xae, 0xd7, 0xf6, 0x7a, 0x77, - 0xb1, 0x46, 0x8a, 0x95, 0x03, 0xa7, 0xc0, 0x26, 0x1b, 0xa4, 0xa8, 0xfe, 0x02, 0x4a, 0x65, 0xcb, - 0x19, 0xc7, 0x09, 0x90, 0x8b, 0x30, 0x21, 0xc7, 0x32, 0x63, 0x8a, 0xc3, 0x92, 0x54, 0x12, 0xf5, - 0xd2, 0x1e, 0x5a, 0x14, 0xe8, 0xa9, 0x05, 0x8a, 0x5e, 0x7a, 0x29, 0xfa, 0x1d, 0xfa, 0x09, 0x8a, - 0x02, 0xb9, 0xb5, 0x9f, 0x20, 0x45, 0xd3, 0x4f, 0xd0, 0x6b, 0x4e, 0xc5, 0xfc, 0x21, 0x45, 0x39, - 0x92, 0xa2, 0x43, 0x9a, 0x8b, 0xc0, 0x79, 0xf3, 0xfb, 0x3d, 0xbd, 0x79, 0x7c, 0xf3, 0xde, 0x8f, - 0x70, 0x63, 0xc8, 0x0e, 0x3c, 0x9f, 0x85, 0xcc, 0x64, 0x4e, 0x70, 0x30, 0x22, 0x21, 0xf5, 0x6d, - 0xe2, 0xd8, 0x3f, 0xa7, 0xc9, 0xe7, 0x9a, 0x40, 0xa0, 0x62, 0xc2, 0x64, 0xec, 0x9a, 0xcc, 0x0d, - 0xc6, 0x23, 0xea, 0xc7, 0xf4, 0xf8, 0x41, 0xc2, 0x8d, 0xad, 0x19, 0xd7, 0xe7, 0x0e, 0x7b, 0x21, - 0x7e, 0xd4, 0x6e, 0x75, 0xc8, 0x86, 0x4c, 0x3c, 0x1e, 0xf0, 0x27, 0x69, 0xdd, 0xfb, 0xd5, 0x26, - 0xe4, 0x30, 0xfd, 0xd9, 0x98, 0x06, 0x21, 0xfa, 0x06, 0xd2, 0x81, 0x47, 0x4d, 0x5d, 0xdb, 0xd5, - 0xf6, 0x8b, 0x87, 0x3f, 0xa8, 0x25, 0x03, 0x52, 0x98, 0xda, 0xa9, 0x47, 0x4d, 0x2c, 0x60, 0xe8, - 0x0e, 0xe4, 0x9f, 0x13, 0xc7, 0xb6, 0x48, 0x48, 0xf5, 0x94, 0xa0, 0x7c, 0x36, 0x97, 0xf2, 0x48, - 0x81, 0x70, 0x0c, 0x47, 0x37, 0x21, 0x43, 0x3c, 0xcf, 0x99, 0xe8, 0x6b, 0x82, 0x67, 0xcc, 0xe5, - 0xd5, 0x39, 0x02, 0x4b, 0x20, 0x8f, 0x8d, 0x79, 0xd4, 0xd5, 0xd3, 0x4b, 0x62, 0xeb, 0x7b, 0xd4, - 0xc5, 0x02, 0xc6, 0xe1, 0x0e, 0x23, 0x96, 0x9e, 0x59, 0x02, 0xef, 0x31, 0x62, 0x61, 0x01, 0xe3, - 0xf1, 0x9c, 0x3b, 0xe3, 0xe0, 0x42, 0xcf, 0x2e, 0x89, 0xa7, 0xc3, 0x11, 0x58, 0x02, 0x39, 0x23, - 0x08, 0x99, 0x4f, 0xf5, 0xdc, 0x12, 0xc6, 0x29, 0x47, 0x60, 0x09, 0x44, 0x4d, 0x28, 0x05, 0x21, - 0xf1, 0xc3, 0x81, 0xc9, 0x46, 0x23, 0x3b, 0xd4, 0xf3, 0x82, 0xb8, 0xbb, 0x80, 0x48, 0xfc, 0xb0, - 0x29, 0x70, 0xb8, 0x18, 0x4c, 0x17, 0xa8, 0x01, 0x45, 0x62, 0x5e, 0xba, 0xec, 0x85, 0x43, 0xad, - 0x21, 0xd5, 0x0b, 0x4b, 0x7c, 0xd4, 0xa7, 0x38, 0x9c, 0x24, 0xa1, 0x4f, 0x21, 0x6f, 0xbb, 0x21, - 0xf5, 0x5d, 0xe2, 0xe8, 0xd6, 0xae, 0xb6, 0x5f, 0xc2, 0x85, 0x2f, 0x23, 0x83, 0xf1, 0x7b, 0x0d, - 0xd2, 0xfc, 0x1d, 0xa3, 0x63, 0x58, 0x37, 0x99, 0xeb, 0x52, 0x33, 0x64, 0xfe, 0x20, 0x9c, 0x78, - 0x54, 0x94, 0xc5, 0xfa, 0xe1, 0xd7, 0x35, 0x51, 0x53, 0x47, 0xf1, 0x3f, 0x92, 0xd0, 0x66, 0x2e, - 0xa7, 0xd4, 0x9a, 0x11, 0xfe, 0xe1, 0xc4, 0xa3, 0xb8, 0x6c, 0x26, 0x97, 0xe8, 0x0e, 0x14, 0x4d, - 0xe6, 0x9e, 0xdb, 0xc3, 0xc1, 0xb3, 0x80, 0xb9, 0xa2, 0x60, 0x0a, 0x8d, 0xad, 0xb7, 0xaf, 0x77, - 0x74, 0xea, 0x9a, 0xcc, 0xb2, 0xdd, 0xe1, 0x01, 0xdf, 0xa8, 0x61, 0xf2, 0xe2, 0x88, 0x06, 0x01, - 0x19, 0x52, 0x9c, 0x95, 0x04, 0xe3, 0x77, 0x19, 0xc8, 0x47, 0x45, 0x84, 0x1e, 0x40, 0xda, 0x25, - 0x23, 0x19, 0x4d, 0xa1, 0x71, 0xef, 0xed, 0xeb, 0x9d, 0x3b, 0x43, 0x3b, 0xbc, 0x18, 0x3f, 0xad, - 0x99, 0x6c, 0x74, 0x40, 0x83, 0x70, 0x4c, 0xfc, 0x89, 0x2c, 0xfe, 0x77, 0xae, 0xc3, 0xd5, 0xa8, - 0xb1, 0x70, 0x35, 0xe7, 0xa8, 0xa9, 0x0f, 0x79, 0xd4, 0xb5, 0xd5, 0x8f, 0x8a, 0xea, 0x90, 0x7f, - 0x6a, 0xbb, 0x1c, 0x12, 0xe8, 0xe9, 0xdd, 0xb5, 0xfd, 0xe2, 0xe1, 0x57, 0x4b, 0xef, 0x54, 0xad, - 0x21, 0xd1, 0x38, 0xa6, 0x19, 0x6f, 0x52, 0x90, 0x53, 0x56, 0x74, 0x1f, 0xaa, 0x3e, 0x0d, 0xd8, - 0xd8, 0x37, 0xe9, 0x20, 0x19, 0x92, 0xb6, 0x42, 0x48, 0xeb, 0x11, 0xb3, 0x29, 0x43, 0xfb, 0x0e, - 0xc0, 0x64, 0x8e, 0x43, 0x4d, 0x9e, 0x04, 0x75, 0xe1, 0xab, 0x32, 0x43, 0xcd, 0xd8, 0xce, 0x93, - 0xd3, 0x48, 0xbf, 0x7a, 0xbd, 0x73, 0x0d, 0x27, 0xd0, 0xe8, 0x37, 0x1a, 0x5c, 0x3f, 0xb7, 0xa9, - 0x63, 0x25, 0xa3, 0x18, 0x8c, 0x88, 0xa7, 0xaf, 0x89, 0x43, 0xde, 0x5b, 0xe9, 0x90, 0xb5, 0x0e, - 0x77, 0x21, 0xc3, 0xb9, 0x1f, 0x30, 0xf7, 0x88, 0x78, 0x6d, 0x37, 0xf4, 0x27, 0x8d, 0xad, 0xdf, - 0xfe, 0x6b, 0xc9, 0x41, 0x8a, 0xe7, 0x53, 0x9a, 0xd1, 0x86, 0x4f, 0x16, 0x78, 0x41, 0x15, 0x58, - 0xbb, 0xa4, 0x13, 0x99, 0x1b, 0xcc, 0x1f, 0x51, 0x15, 0x32, 0xcf, 0x89, 0x33, 0x96, 0xf5, 0x50, - 0xc0, 0x72, 0xf1, 0x5d, 0xea, 0xb6, 0x66, 0xfc, 0x02, 0x32, 0xa2, 0x3d, 0xa1, 0x26, 0x6c, 0x8c, - 0x66, 0xeb, 0x23, 0x6e, 0x9f, 0x8b, 0x8a, 0x07, 0x5f, 0x65, 0x20, 0x1d, 0x72, 0xcf, 0xa9, 0x1f, - 0x44, 0x79, 0x2d, 0xe0, 0x68, 0x89, 0x3e, 0x81, 0x9c, 0xe5, 0x4f, 0x06, 0xfe, 0x58, 0x96, 0x51, - 0x1e, 0x67, 0x2d, 0x7f, 0x82, 0xc7, 0xae, 0xf1, 0x77, 0x0d, 0xd2, 0xbc, 0xdf, 0xfd, 0xbf, 0x03, - 0xf8, 0x0a, 0x32, 0x3e, 0x71, 0x87, 0x54, 0x75, 0xea, 0x0d, 0xe9, 0x14, 0x73, 0x93, 0x70, 0x25, - 0x77, 0xd1, 0xb7, 0x00, 0x41, 0x48, 0x42, 0x2a, 0xcb, 0x2b, 0xbd, 0x42, 0x79, 0x65, 0x04, 0xde, - 0x08, 0x21, 0xcd, 0xfb, 0x30, 0x8f, 0x40, 0x55, 0xb0, 0x08, 0xbf, 0x8c, 0xa3, 0x25, 0xba, 0x05, - 0xf9, 0x4b, 0x3a, 0x59, 0xbd, 0x6b, 0x88, 0x37, 0xf7, 0x19, 0x00, 0x27, 0x79, 0xc4, 0xbc, 0xa4, - 0x96, 0x88, 0xbd, 0x84, 0x0b, 0x97, 0x74, 0x72, 0x22, 0x0c, 0x46, 0x0e, 0x32, 0xa2, 0x9b, 0x1b, - 0x7f, 0x49, 0x41, 0x46, 0x74, 0xe9, 0x8f, 0x1b, 0x00, 0x6f, 0x11, 0xa2, 0x98, 0x82, 0xd5, 0x13, - 0x96, 0x95, 0x04, 0xf4, 0x05, 0x94, 0x15, 0x55, 0x39, 0xcf, 0x08, 0xe7, 0x25, 0x69, 0x54, 0xfe, - 0x6f, 0x41, 0xde, 0x62, 0xa6, 0x74, 0x9e, 0x5d, 0x25, 0x66, 0x8b, 0x99, 0xe8, 0xfb, 0x90, 0xa5, - 0x2f, 0xed, 0x20, 0x0c, 0xc4, 0x50, 0xcb, 0x63, 0xb5, 0x32, 0x30, 0x14, 0x13, 0x03, 0x09, 0x35, - 0x01, 0xf9, 0x63, 0x37, 0xb4, 0x47, 0x74, 0x60, 0x5e, 0x50, 0xf3, 0xd2, 0x63, 0xb6, 0x1b, 0xaa, - 0xa2, 0xab, 0xd6, 0x22, 0x95, 0x52, 0x6b, 0xc6, 0x7b, 0x78, 0x53, 0xe1, 0xa7, 0x26, 0xa3, 0x0c, - 0xc5, 0xc4, 0x80, 0xda, 0xfb, 0x47, 0x19, 0xf2, 0x98, 0x06, 0x1e, 0x73, 0x03, 0x8a, 0x6a, 0x33, - 0x3a, 0xe4, 0xea, 0x68, 0x95, 0xa0, 0xa4, 0x10, 0xb9, 0x07, 0x85, 0x48, 0x59, 0x58, 0xaa, 0x31, - 0xed, 0xcc, 0x27, 0x45, 0x1d, 0xc5, 0xc2, 0x53, 0x06, 0xfa, 0x16, 0x72, 0x5c, 0x63, 0xd8, 0xea, - 0x3d, 0xbd, 0x2b, 0x63, 0x14, 0xb9, 0x2e, 0x41, 0x38, 0x42, 0xa3, 0x1f, 0x41, 0x96, 0x8b, 0x0d, - 0x6a, 0x29, 0x55, 0xb2, 0x35, 0x9f, 0xd7, 0x17, 0x18, 0xac, 0xb0, 0x9c, 0xc5, 0x35, 0x07, 0x8d, - 0xc4, 0xc9, 0x02, 0x56, 0x4f, 0x60, 0xb0, 0xc2, 0xf2, 0x20, 0x85, 0xf0, 0xa0, 0x96, 0xd2, 0x28, - 0x0b, 0x82, 0xec, 0x48, 0x10, 0x8e, 0xd0, 0xe8, 0x3e, 0xac, 0x0b, 0x01, 0x41, 0xad, 0x48, 0x78, - 0x48, 0xc5, 0xf2, 0xc5, 0x82, 0xb4, 0x4a, 0xac, 0xd2, 0x1e, 0xe5, 0x20, 0xb9, 0x44, 0x1d, 0x28, - 0x25, 0x84, 0x84, 0xa5, 0x24, 0xcc, 0xde, 0x82, 0x74, 0x25, 0x90, 0x78, 0x86, 0xb7, 0x5c, 0x81, - 0xfc, 0x31, 0xa5, 0x14, 0x88, 0x01, 0xf9, 0x68, 0x7c, 0xab, 0x2b, 0x19, 0xaf, 0x51, 0x07, 0x90, - 0x9a, 0x24, 0x81, 0x79, 0x41, 0x47, 0x64, 0xf5, 0xdb, 0x59, 0x92, 0xbc, 0x53, 0x41, 0x43, 0x8f, - 0xe1, 0xd3, 0xab, 0x03, 0x32, 0xe9, 0x70, 0x95, 0xd1, 0x5d, 0x9d, 0x9d, 0x93, 0xca, 0xf1, 0x0f, - 0x61, 0xd3, 0x62, 0xe6, 0x78, 0x44, 0xdd, 0x50, 0xb4, 0xd8, 0xc1, 0xd8, 0x77, 0xe4, 0x35, 0xc7, - 0x95, 0x99, 0x8d, 0x33, 0xdf, 0x41, 0x5f, 0x42, 0x96, 0x91, 0x71, 0x78, 0x71, 0xa8, 0x4a, 0xa2, - 0x24, 0xbb, 0x6c, 0xbf, 0xce, 0x6d, 0x58, 0xed, 0x19, 0xff, 0x4d, 0x43, 0x21, 0x2e, 0x60, 0xd4, - 0x4c, 0x28, 0x05, 0x4d, 0x0c, 0xd1, 0xaf, 0xdf, 0x53, 0xf3, 0x73, 0xb4, 0xc2, 0x2f, 0x53, 0x00, - 0x4d, 0xe6, 0x06, 0xa1, 0x4f, 0x6c, 0x97, 0xdf, 0xec, 0x74, 0x42, 0xfe, 0x1c, 0xbc, 0xcf, 0xdf, - 0x94, 0x59, 0x13, 0x32, 0x48, 0x90, 0x79, 0x17, 0xf1, 0x29, 0x89, 0xb3, 0x87, 0xd5, 0x6a, 0xef, - 0x0f, 0x1a, 0xa4, 0x85, 0x3c, 0x2a, 0x42, 0xae, 0x7b, 0xfc, 0xa8, 0xde, 0xeb, 0xb6, 0x2a, 0xd7, - 0x10, 0x82, 0xf5, 0x4e, 0xb7, 0xdd, 0x6b, 0x0d, 0x70, 0xfb, 0xc1, 0x59, 0x17, 0xb7, 0x5b, 0x15, - 0x0d, 0x5d, 0x87, 0xcd, 0x5e, 0xbf, 0x59, 0x7f, 0xd8, 0xed, 0x1f, 0x4f, 0xcd, 0x29, 0xa4, 0x43, - 0x35, 0x61, 0x6e, 0xf6, 0x8f, 0x8e, 0xda, 0xc7, 0xad, 0x76, 0xab, 0xb2, 0x36, 0x75, 0xd2, 0x3f, - 0xe1, 0xbb, 0xf5, 0x5e, 0x25, 0x8d, 0xbe, 0x07, 0x1b, 0xd2, 0xd6, 0xe9, 0xe3, 0x46, 0xb7, 0xd5, - 0x6a, 0x1f, 0x57, 0x32, 0x68, 0x13, 0xca, 0x67, 0xc7, 0xa7, 0xf5, 0x87, 0xdd, 0xd3, 0x4e, 0xb7, - 0xde, 0xe8, 0xb5, 0x2b, 0x59, 0xe3, 0x4f, 0x09, 0xb9, 0xf4, 0x44, 0x08, 0x37, 0x75, 0xa6, 0x28, - 0xad, 0xb7, 0x57, 0x4c, 0x6b, 0x22, 0x1d, 0x81, 0x10, 0x14, 0x38, 0xe9, 0x8c, 0xb7, 0xed, 0xb8, - 0xd2, 0x3c, 0x12, 0x5e, 0xe8, 0xa9, 0xdd, 0xb5, 0xfd, 0x02, 0x2e, 0x45, 0xc6, 0x13, 0x12, 0x5e, - 0x70, 0x90, 0x45, 0x9d, 0x90, 0x0c, 0xc6, 0x1e, 0xf7, 0x1d, 0xa8, 0xa1, 0x5f, 0x12, 0xc6, 0x33, - 0x69, 0x33, 0x9e, 0x41, 0xe5, 0xea, 0x5f, 0xcd, 0xd1, 0x2e, 0x3f, 0x49, 0x6a, 0x97, 0xe2, 0xe1, - 0x8d, 0xd5, 0x5f, 0x66, 0x52, 0xe7, 0xdc, 0x86, 0x9c, 0x6a, 0x7b, 0xe8, 0x1b, 0x40, 0x44, 0xa8, - 0xb9, 0x81, 0x45, 0x03, 0xd3, 0xb7, 0xbd, 0x58, 0x6b, 0x14, 0xf0, 0xa6, 0xdc, 0x69, 0x4d, 0x37, - 0x8c, 0x23, 0xc8, 0xca, 0xc6, 0xf7, 0x61, 0xe6, 0xc5, 0x63, 0xc8, 0xca, 0x8e, 0xb8, 0x7c, 0x50, - 0xc7, 0x43, 0x2f, 0xb5, 0xe2, 0xd0, 0x33, 0x0a, 0x90, 0x53, 0x3d, 0xd3, 0xb8, 0x0b, 0xe5, 0x99, - 0xf6, 0x87, 0x6e, 0x80, 0x54, 0x29, 0x71, 0xb0, 0x4a, 0xed, 0x2a, 0xb1, 0x7f, 0xca, 0xf7, 0x22, - 0x21, 0xb3, 0x0e, 0xa5, 0x64, 0xc7, 0xdb, 0xfb, 0x75, 0x1a, 0x32, 0xed, 0x97, 0xa1, 0x4f, 0x8c, - 0xbf, 0x69, 0xf0, 0x79, 0x94, 0xe7, 0x36, 0x9f, 0xa8, 0xb6, 0x3b, 0x3c, 0xf1, 0xd9, 0x33, 0xa9, - 0x8d, 0xa3, 0x8f, 0xef, 0x1e, 0x54, 0xa8, 0xda, 0x1c, 0x24, 0xcf, 0x57, 0x3c, 0xfc, 0x7c, 0xf1, - 0x67, 0x48, 0x74, 0xa3, 0x37, 0x22, 0x6a, 0x54, 0xc9, 0x27, 0x50, 0xf1, 0x7c, 0xe6, 0xb1, 0x80, - 0x5a, 0xb1, 0x37, 0x59, 0x08, 0x2b, 0x7e, 0x4f, 0x6c, 0x44, 0x74, 0x65, 0x30, 0xfe, 0x9a, 0x9a, - 0x9e, 0x42, 0xd9, 0xea, 0x43, 0x62, 0xbb, 0x41, 0x98, 0x28, 0x46, 0x74, 0x77, 0xf6, 0xe5, 0xac, - 0x14, 0x7c, 0xfc, 0xfe, 0x86, 0xb3, 0xd7, 0x2f, 0x25, 0xae, 0x5f, 0x7b, 0x26, 0x5e, 0x91, 0xd1, - 0xda, 0x7b, 0xe3, 0x58, 0x7e, 0x17, 0x3f, 0xe6, 0x0d, 0x3a, 0xfc, 0x29, 0x14, 0xe2, 0x82, 0x41, - 0x3f, 0x86, 0xe2, 0x34, 0x13, 0x14, 0x55, 0xe7, 0xbd, 0x0b, 0xe3, 0xfa, 0xdc, 0x3f, 0xda, 0xd7, - 0x6e, 0x6a, 0x8d, 0xc6, 0xab, 0x7f, 0x6f, 0x5f, 0x7b, 0xf5, 0x66, 0x5b, 0xfb, 0xe7, 0x9b, 0x6d, - 0xed, 0xcf, 0xff, 0xd9, 0xd6, 0x9e, 0xdc, 0x5c, 0xe9, 0xe3, 0x37, 0xe1, 0xf0, 0x69, 0x56, 0x98, - 0x6f, 0xfd, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xf5, 0xf6, 0xf5, 0x84, 0x89, 0x12, 0x00, 0x00, + 0xb1, 0x46, 0x8a, 0x95, 0x03, 0xa7, 0xc0, 0x26, 0xbb, 0x48, 0x51, 0xfd, 0x05, 0x94, 0xca, 0x96, + 0x77, 0x1c, 0xef, 0x02, 0xb9, 0x08, 0x63, 0x72, 0x2c, 0x33, 0xa6, 0x38, 0x2c, 0x49, 0x25, 0x51, + 0x2f, 0xed, 0xa5, 0x28, 0xd0, 0x5b, 0x81, 0xa2, 0x97, 0x5e, 0x82, 0x9e, 0x7b, 0xed, 0x27, 0x28, + 0x0a, 0xe4, 0xd6, 0x7e, 0x82, 0x14, 0x4d, 0x3f, 0x41, 0xaf, 0x39, 0x14, 0xc5, 0xfc, 0x21, 0x45, + 0x39, 0x92, 0xa2, 0x43, 0x36, 0x17, 0x81, 0xf3, 0xe6, 0xf7, 0x7b, 0x7a, 0xf3, 0xf8, 0xe6, 0xbd, + 0x1f, 0xe1, 0xd6, 0x90, 0x1d, 0x78, 0x3e, 0x0b, 0x99, 0xc9, 0x9c, 0xe0, 0x60, 0x44, 0x42, 0xea, + 0xdb, 0xc4, 0xb1, 0x7f, 0x49, 0x93, 0xcf, 0x35, 0x81, 0x40, 0xc5, 0x84, 0xc9, 0xd8, 0x35, 0x99, + 0x1b, 0x8c, 0x47, 0xd4, 0x8f, 0xe9, 0xf1, 0x83, 0x84, 0x1b, 0x5b, 0x33, 0xae, 0x2f, 0x1c, 0xf6, + 0x54, 0xfc, 0xa8, 0xdd, 0xea, 0x90, 0x0d, 0x99, 0x78, 0x3c, 0xe0, 0x4f, 0xd2, 0xba, 0xf7, 0x7c, + 0x13, 0x72, 0x98, 0xfe, 0x62, 0x4c, 0x83, 0x10, 0x7d, 0x01, 0xe9, 0xc0, 0xa3, 0xa6, 0xae, 0xed, + 0x6a, 0xfb, 0xc5, 0xc3, 0x1f, 0xd5, 0x92, 0x01, 0x29, 0x4c, 0xed, 0xd4, 0xa3, 0x26, 0x16, 0x30, + 0x74, 0x0f, 0xf2, 0x4f, 0x88, 0x63, 0x5b, 0x24, 0xa4, 0x7a, 0x4a, 0x50, 0x3e, 0x9a, 0x4b, 0xf9, + 0x56, 0x81, 0x70, 0x0c, 0x47, 0xb7, 0x21, 0x43, 0x3c, 0xcf, 0x99, 0xe8, 0x6b, 0x82, 0x67, 0xcc, + 0xe5, 0xd5, 0x39, 0x02, 0x4b, 0x20, 0x8f, 0x8d, 0x79, 0xd4, 0xd5, 0xd3, 0x4b, 0x62, 0xeb, 0x7b, + 0xd4, 0xc5, 0x02, 0xc6, 0xe1, 0x0e, 0x23, 0x96, 0x9e, 0x59, 0x02, 0xef, 0x31, 0x62, 0x61, 0x01, + 0xe3, 0xf1, 0x5c, 0x38, 0xe3, 0xe0, 0x52, 0xcf, 0x2e, 0x89, 0xa7, 0xc3, 0x11, 0x58, 0x02, 0x39, + 0x23, 0x08, 0x99, 0x4f, 0xf5, 0xdc, 0x12, 0xc6, 0x29, 0x47, 0x60, 0x09, 0x44, 0x4d, 0x28, 0x05, + 0x21, 0xf1, 0xc3, 0x81, 0xc9, 0x46, 0x23, 0x3b, 0xd4, 0xf3, 0x82, 0xb8, 0xbb, 0x80, 0x48, 0xfc, + 0xb0, 0x29, 0x70, 0xb8, 0x18, 0x4c, 0x17, 0xa8, 0x01, 0x45, 0x62, 0x5e, 0xb9, 0xec, 0xa9, 0x43, + 0xad, 0x21, 0xd5, 0x0b, 0x4b, 0x7c, 0xd4, 0xa7, 0x38, 0x9c, 0x24, 0xa1, 0x0f, 0x21, 0x6f, 0xbb, + 0x21, 0xf5, 0x5d, 0xe2, 0xe8, 0xd6, 0xae, 0xb6, 0x5f, 0xc2, 0x85, 0x4f, 0x23, 0x83, 0xf1, 0x7b, + 0x0d, 0xd2, 0xfc, 0x1d, 0xa3, 0x63, 0x58, 0x37, 0x99, 0xeb, 0x52, 0x33, 0x64, 0xfe, 0x20, 0x9c, + 0x78, 0x54, 0x94, 0xc5, 0xfa, 0xe1, 0xe7, 0x35, 0x51, 0x53, 0x47, 0xf1, 0x3f, 0x92, 0xd0, 0x66, + 0x2e, 0xa7, 0xd4, 0x9a, 0x11, 0xfe, 0xe1, 0xc4, 0xa3, 0xb8, 0x6c, 0x26, 0x97, 0xe8, 0x1e, 0x14, + 0x4d, 0xe6, 0x5e, 0xd8, 0xc3, 0xc1, 0xe3, 0x80, 0xb9, 0xa2, 0x60, 0x0a, 0x8d, 0xad, 0xd7, 0x2f, + 0x77, 0x74, 0xea, 0x9a, 0xcc, 0xb2, 0xdd, 0xe1, 0x01, 0xdf, 0xa8, 0x61, 0xf2, 0xf4, 0x88, 0x06, + 0x01, 0x19, 0x52, 0x9c, 0x95, 0x04, 0xe3, 0x2f, 0x19, 0xc8, 0x47, 0x45, 0x84, 0xbe, 0x81, 0xb4, + 0x4b, 0x46, 0x32, 0x9a, 0x42, 0xe3, 0xfe, 0xeb, 0x97, 0x3b, 0xf7, 0x86, 0x76, 0x78, 0x39, 0x3e, + 0xaf, 0x99, 0x6c, 0x74, 0x40, 0x83, 0x70, 0x4c, 0xfc, 0x89, 0x2c, 0xfe, 0x37, 0xae, 0xc3, 0xf5, + 0xa8, 0xb1, 0x70, 0x35, 0xe7, 0xa8, 0xa9, 0x77, 0x79, 0xd4, 0xb5, 0xd5, 0x8f, 0x8a, 0xea, 0x90, + 0x3f, 0xb7, 0x5d, 0x0e, 0x09, 0xf4, 0xf4, 0xee, 0xda, 0x7e, 0xf1, 0xf0, 0xb3, 0xa5, 0x77, 0xaa, + 0xd6, 0x90, 0x68, 0x1c, 0xd3, 0x8c, 0xff, 0xa5, 0x20, 0xa7, 0xac, 0xe8, 0x01, 0x54, 0x7d, 0x1a, + 0xb0, 0xb1, 0x6f, 0xd2, 0x41, 0x32, 0x24, 0x6d, 0x85, 0x90, 0xd6, 0x23, 0x66, 0x53, 0x86, 0xf6, + 0x15, 0x80, 0xc9, 0x1c, 0x87, 0x9a, 0x3c, 0x09, 0xea, 0xc2, 0x57, 0x65, 0x86, 0x9a, 0xb1, 0x9d, + 0x27, 0xa7, 0x91, 0x7e, 0xf1, 0x72, 0xe7, 0x06, 0x4e, 0xa0, 0xd1, 0x6f, 0x35, 0xb8, 0x79, 0x61, + 0x53, 0xc7, 0x4a, 0x46, 0x31, 0x18, 0x11, 0x4f, 0x5f, 0x13, 0x87, 0xbc, 0xbf, 0xd2, 0x21, 0x6b, + 0x1d, 0xee, 0x42, 0x86, 0xf3, 0x20, 0x60, 0xee, 0x11, 0xf1, 0xda, 0x6e, 0xe8, 0x4f, 0x1a, 0x5b, + 0xbf, 0xfb, 0xd7, 0x92, 0x83, 0x14, 0x2f, 0xa6, 0x34, 0x64, 0x40, 0xfe, 0x9c, 0x98, 0x57, 0x17, + 0xb6, 0xe3, 0x88, 0x5e, 0x52, 0xc6, 0xf1, 0xda, 0x68, 0xc3, 0x07, 0x0b, 0xfe, 0x01, 0x55, 0x60, + 0xed, 0x8a, 0x4e, 0x64, 0xde, 0x30, 0x7f, 0x44, 0x55, 0xc8, 0x3c, 0x21, 0xce, 0x58, 0xd6, 0x4a, + 0x01, 0xcb, 0xc5, 0x57, 0xa9, 0xbb, 0x9a, 0xf1, 0x2b, 0xc8, 0x88, 0xd6, 0x85, 0x9a, 0xb0, 0x31, + 0x9a, 0xad, 0x9d, 0xb8, 0xb5, 0x2e, 0x2a, 0x2c, 0x7c, 0x9d, 0x81, 0x74, 0xc8, 0x3d, 0xa1, 0x7e, + 0x10, 0xe5, 0xbc, 0x80, 0xa3, 0x25, 0xfa, 0x00, 0x72, 0x96, 0x3f, 0x19, 0xf8, 0x63, 0x59, 0x62, + 0x79, 0x9c, 0xb5, 0xfc, 0x09, 0x1e, 0xbb, 0xc6, 0xdf, 0x35, 0x48, 0xf3, 0x5e, 0xf8, 0x7d, 0x07, + 0xf0, 0x19, 0x64, 0x7c, 0xe2, 0x0e, 0xa9, 0xea, 0xe2, 0x1b, 0xd2, 0x29, 0xe6, 0x26, 0xe1, 0x4a, + 0xee, 0xa2, 0x2f, 0x01, 0x82, 0x90, 0x84, 0x54, 0x96, 0x5e, 0x7a, 0x85, 0xd2, 0xcb, 0x08, 0xbc, + 0x11, 0x42, 0x9a, 0xf7, 0x68, 0x1e, 0x81, 0xaa, 0x6e, 0x11, 0x7e, 0x19, 0x47, 0x4b, 0x74, 0x07, + 0xf2, 0x57, 0x74, 0xb2, 0x7a, 0x47, 0x11, 0x6f, 0xee, 0x23, 0x00, 0x4e, 0xf2, 0x88, 0x79, 0x45, + 0x2d, 0x11, 0x7b, 0x09, 0x17, 0xae, 0xe8, 0xe4, 0x44, 0x18, 0x8c, 0x1c, 0x64, 0x44, 0xa7, 0x37, + 0xfe, 0x9c, 0x82, 0x8c, 0xe8, 0xe0, 0xef, 0x37, 0x00, 0xde, 0x3e, 0x44, 0x31, 0x05, 0xab, 0x27, + 0x2c, 0x2b, 0x09, 0xe8, 0x13, 0x28, 0x2b, 0xaa, 0x72, 0x9e, 0x11, 0xce, 0x4b, 0xd2, 0xa8, 0xfc, + 0xdf, 0x81, 0xbc, 0xc5, 0x4c, 0xe9, 0x3c, 0xbb, 0x4a, 0xcc, 0x16, 0x33, 0xd1, 0x0f, 0x21, 0x4b, + 0x9f, 0xd9, 0x41, 0x18, 0x88, 0x81, 0x97, 0xc7, 0x6a, 0x65, 0x60, 0x28, 0x26, 0x86, 0x15, 0x6a, + 0x02, 0xf2, 0xc7, 0x6e, 0x68, 0x8f, 0xe8, 0xc0, 0xbc, 0xa4, 0xe6, 0x95, 0xc7, 0x6c, 0x37, 0x54, + 0x45, 0x57, 0xad, 0x45, 0x0a, 0xa6, 0xd6, 0x8c, 0xf7, 0xf0, 0xa6, 0xc2, 0x4f, 0x4d, 0x46, 0x19, + 0x8a, 0x89, 0xe1, 0xb5, 0xf7, 0x8f, 0x32, 0xe4, 0x31, 0x0d, 0x3c, 0xe6, 0x06, 0x14, 0xd5, 0x66, + 0x34, 0xca, 0xf5, 0xb1, 0x2b, 0x41, 0x49, 0x91, 0x72, 0x1f, 0x0a, 0x91, 0xea, 0xb0, 0x54, 0xd3, + 0xda, 0x99, 0x4f, 0x8a, 0xba, 0x8d, 0x85, 0xa7, 0x0c, 0xf4, 0x25, 0xe4, 0xb8, 0xfe, 0xb0, 0xd5, + 0x7b, 0x7a, 0x53, 0xe2, 0x28, 0x72, 0x5d, 0x82, 0x70, 0x84, 0x46, 0x3f, 0x81, 0x2c, 0x17, 0x22, + 0xd4, 0x52, 0x8a, 0x65, 0x6b, 0x3e, 0xaf, 0x2f, 0x30, 0x58, 0x61, 0x39, 0x8b, 0xeb, 0x11, 0x1a, + 0x09, 0x97, 0x05, 0xac, 0x9e, 0xc0, 0x60, 0x85, 0xe5, 0x41, 0x0a, 0x51, 0x42, 0x2d, 0xa5, 0x5f, + 0x16, 0x04, 0xd9, 0x91, 0x20, 0x1c, 0xa1, 0xd1, 0x03, 0x58, 0x17, 0xe2, 0x82, 0x5a, 0x91, 0x28, + 0x91, 0x6a, 0xe6, 0x93, 0x05, 0x69, 0x95, 0x58, 0xa5, 0x4b, 0xca, 0x41, 0x72, 0x89, 0x3a, 0x50, + 0x4a, 0x88, 0x0c, 0x4b, 0xc9, 0x9b, 0xbd, 0x05, 0xe9, 0x4a, 0x20, 0xf1, 0x0c, 0x6f, 0xb9, 0x3a, + 0xf9, 0x63, 0x4a, 0xa9, 0x13, 0x03, 0xf2, 0xd1, 0x68, 0x57, 0x57, 0x32, 0x5e, 0xa3, 0x0e, 0x20, + 0x35, 0x65, 0x02, 0xf3, 0x92, 0x8e, 0xc8, 0xea, 0xb7, 0xb3, 0x24, 0x79, 0xa7, 0x82, 0x86, 0xbe, + 0x83, 0x0f, 0xaf, 0x0f, 0xcf, 0xa4, 0xc3, 0x55, 0xc6, 0x7a, 0x75, 0x76, 0x86, 0x2a, 0xc7, 0x3f, + 0x86, 0x4d, 0x8b, 0x99, 0xe3, 0x11, 0x75, 0x43, 0xd1, 0x62, 0x07, 0x63, 0x5f, 0x0e, 0xa3, 0x02, + 0xae, 0xcc, 0x6c, 0x9c, 0xf9, 0x0e, 0xfa, 0x14, 0xb2, 0x8c, 0x8c, 0xc3, 0xcb, 0x43, 0x55, 0x12, + 0x25, 0xd9, 0x65, 0xfb, 0x75, 0x6e, 0xc3, 0x6a, 0xcf, 0xf8, 0x6f, 0x1a, 0x0a, 0x71, 0x01, 0xa3, + 0x66, 0x42, 0x45, 0x68, 0x62, 0xc0, 0x7e, 0xfe, 0x96, 0x9a, 0x9f, 0xa3, 0x23, 0x7e, 0x9d, 0x02, + 0x68, 0x32, 0x37, 0x08, 0x7d, 0x62, 0xbb, 0xfc, 0x66, 0xa7, 0x13, 0xd2, 0xe8, 0xe0, 0x6d, 0xfe, + 0xa6, 0xcc, 0x9a, 0x90, 0x48, 0x82, 0xcc, 0xbb, 0x88, 0x4f, 0x49, 0x9c, 0x3d, 0xac, 0x56, 0x7b, + 0x7f, 0xd0, 0x20, 0x2d, 0xa4, 0x53, 0x11, 0x72, 0xdd, 0xe3, 0x6f, 0xeb, 0xbd, 0x6e, 0xab, 0x72, + 0x03, 0x21, 0x58, 0xef, 0x74, 0xdb, 0xbd, 0xd6, 0x00, 0xb7, 0xbf, 0x39, 0xeb, 0xe2, 0x76, 0xab, + 0xa2, 0xa1, 0x9b, 0xb0, 0xd9, 0xeb, 0x37, 0xeb, 0x0f, 0xbb, 0xfd, 0xe3, 0xa9, 0x39, 0x85, 0x74, + 0xa8, 0x26, 0xcc, 0xcd, 0xfe, 0xd1, 0x51, 0xfb, 0xb8, 0xd5, 0x6e, 0x55, 0xd6, 0xa6, 0x4e, 0xfa, + 0x27, 0x7c, 0xb7, 0xde, 0xab, 0xa4, 0xd1, 0x0f, 0x60, 0x43, 0xda, 0x3a, 0x7d, 0xdc, 0xe8, 0xb6, + 0x5a, 0xed, 0xe3, 0x4a, 0x06, 0x6d, 0x42, 0xf9, 0xec, 0xf8, 0xb4, 0xfe, 0xb0, 0x7b, 0xda, 0xe9, + 0xd6, 0x1b, 0xbd, 0x76, 0x25, 0x6b, 0xfc, 0x29, 0x21, 0xa5, 0x1e, 0x09, 0x51, 0xa7, 0xce, 0x14, + 0xa5, 0xf5, 0xee, 0x8a, 0x69, 0x4d, 0xa4, 0x23, 0x10, 0x82, 0x02, 0x27, 0x9d, 0xf1, 0xb6, 0x1d, + 0x57, 0x9a, 0x47, 0xc2, 0x4b, 0x3d, 0xb5, 0xbb, 0xb6, 0x5f, 0xc0, 0xa5, 0xc8, 0x78, 0x42, 0xc2, + 0x4b, 0x0e, 0xb2, 0xa8, 0x13, 0x92, 0xc1, 0xd8, 0xe3, 0xbe, 0x03, 0x35, 0xf4, 0x4b, 0xc2, 0x78, + 0x26, 0x6d, 0xc6, 0x63, 0xa8, 0x5c, 0xff, 0xab, 0x39, 0xda, 0xe5, 0x67, 0x49, 0xed, 0x52, 0x3c, + 0xbc, 0xb5, 0xfa, 0xcb, 0x4c, 0xea, 0x9c, 0xbb, 0x90, 0x53, 0x6d, 0x0f, 0x7d, 0x01, 0x88, 0x08, + 0xa5, 0x37, 0xb0, 0x68, 0x60, 0xfa, 0xb6, 0x17, 0x6b, 0x8d, 0x02, 0xde, 0x94, 0x3b, 0xad, 0xe9, + 0x86, 0x71, 0x04, 0x59, 0xd9, 0xf8, 0xde, 0xcd, 0xbc, 0xf8, 0x0e, 0xb2, 0xb2, 0x23, 0x2e, 0x1f, + 0xd4, 0xf1, 0xd0, 0x4b, 0xad, 0x38, 0xf4, 0x8c, 0x02, 0xe4, 0x54, 0xcf, 0x34, 0xbe, 0x86, 0xf2, + 0x4c, 0xfb, 0x43, 0xb7, 0x40, 0xaa, 0x94, 0x38, 0x58, 0xa5, 0x84, 0xd5, 0x87, 0xc0, 0x29, 0xdf, + 0x8b, 0x84, 0xcc, 0x3a, 0x94, 0x92, 0x1d, 0x6f, 0xef, 0x37, 0x69, 0xc8, 0xb4, 0x9f, 0x85, 0x3e, + 0x31, 0xfe, 0xa6, 0xc1, 0xc7, 0x51, 0x9e, 0xdb, 0x7c, 0xa2, 0xda, 0xee, 0xf0, 0xc4, 0x67, 0x8f, + 0xa5, 0x6e, 0x8e, 0x3e, 0xcc, 0x7b, 0x50, 0xa1, 0x6a, 0x73, 0x90, 0x3c, 0x5f, 0xf1, 0xf0, 0xe3, + 0xc5, 0x9f, 0x28, 0xd1, 0x8d, 0xde, 0x88, 0xa8, 0x51, 0x25, 0x9f, 0x40, 0xc5, 0xf3, 0x99, 0xc7, + 0x02, 0x6a, 0xc5, 0xde, 0x64, 0x21, 0xac, 0xf8, 0xad, 0xb1, 0x11, 0xd1, 0x95, 0xc1, 0xf8, 0x6b, + 0x6a, 0x7a, 0x0a, 0x65, 0xab, 0x0f, 0x89, 0xed, 0x06, 0x61, 0xa2, 0x18, 0xd1, 0xd7, 0xb3, 0x2f, + 0x67, 0xa5, 0xe0, 0xe3, 0xf7, 0x37, 0x9c, 0xbd, 0x7e, 0x29, 0x71, 0xfd, 0xda, 0x33, 0xf1, 0x8a, + 0x8c, 0xd6, 0xde, 0x1a, 0xc7, 0xf2, 0xbb, 0xf8, 0x3e, 0x6f, 0xd0, 0xe1, 0xcf, 0xa1, 0x10, 0x17, + 0x0c, 0xfa, 0x29, 0x14, 0xa7, 0x99, 0xa0, 0xa8, 0x3a, 0xef, 0x5d, 0x18, 0x37, 0xe7, 0xfe, 0xd1, + 0xbe, 0x76, 0x5b, 0x6b, 0x34, 0x5e, 0xfc, 0x7b, 0xfb, 0xc6, 0x8b, 0x57, 0xdb, 0xda, 0x3f, 0x5f, + 0x6d, 0x6b, 0xcf, 0xff, 0xb3, 0xad, 0x3d, 0xba, 0xbd, 0xd2, 0x87, 0x71, 0xc2, 0xe1, 0x79, 0x56, + 0x98, 0xef, 0xfc, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x76, 0x9c, 0xc0, 0xa5, 0x12, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1796,6 +1799,11 @@ func (m *Request_Validate_Binding) MarshalToSizedBuffer(dAtA []byte) (int, error i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Backfill != 0 { + i = encodeVarintMaterialize(dAtA, i, uint64(m.Backfill)) + i-- + dAtA[i] = 0x20 + } if len(m.FieldConfigJsonMap) > 0 { for k := range m.FieldConfigJsonMap { v := m.FieldConfigJsonMap[k] @@ -3000,6 +3008,9 @@ func (m *Request_Validate_Binding) ProtoSize() (n int) { n += mapEntrySize + 1 + sovMaterialize(uint64(mapEntrySize)) } } + if m.Backfill != 0 { + n += 1 + sovMaterialize(uint64(m.Backfill)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -4366,6 +4377,25 @@ func (m *Request_Validate_Binding) Unmarshal(dAtA []byte) error { } m.FieldConfigJsonMap[mapkey] = ((encoding_json.RawMessage)(mapvalue)) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Backfill", wireType) + } + m.Backfill = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMaterialize + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Backfill |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipMaterialize(dAtA[iNdEx:]) diff --git a/go/protocols/materialize/materialize.proto b/go/protocols/materialize/materialize.proto index 311e7eafb4..8f5dec22d8 100644 --- a/go/protocols/materialize/materialize.proto +++ b/go/protocols/materialize/materialize.proto @@ -66,6 +66,8 @@ message Request { (gogoproto.castvalue) = "encoding/json.RawMessage", json_name = "fieldConfig" ]; + // Backfill counter for this binding. + uint32 backfill = 4; } repeated Binding bindings = 4; }