diff --git a/.gear/predownloaded-development/vendor/buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/LICENSE b/.gear/predownloaded-development/vendor/buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/LICENSE
new file mode 100644
index 0000000..f308f8b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2023 Buf Technologies, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/.gear/predownloaded-development/vendor/buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate/validate.pb.go b/.gear/predownloaded-development/vendor/buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate/validate.pb.go
new file mode 100644
index 0000000..f380ae5
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate/validate.pb.go
@@ -0,0 +1,11046 @@
+// Copyright 2023 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.36.0
+// protoc (unknown)
+// source: buf/validate/validate.proto
+
+package validate
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ descriptorpb "google.golang.org/protobuf/types/descriptorpb"
+ durationpb "google.golang.org/protobuf/types/known/durationpb"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// Specifies how FieldConstraints.ignore behaves. See the documentation for
+// FieldConstraints.required for definitions of "populated" and "nullable".
+type Ignore int32
+
+const (
+ // Validation is only skipped if it's an unpopulated nullable fields.
+ //
+ // ```proto
+ // syntax="proto3";
+ //
+ // message Request {
+ // // The uri rule applies to any value, including the empty string.
+ // string foo = 1 [
+ // (buf.validate.field).string.uri = true
+ // ];
+ //
+ // // The uri rule only applies if the field is set, including if it's
+ // // set to the empty string.
+ // optional string bar = 2 [
+ // (buf.validate.field).string.uri = true
+ // ];
+ //
+ // // The min_items rule always applies, even if the list is empty.
+ // repeated string baz = 3 [
+ // (buf.validate.field).repeated.min_items = 3
+ // ];
+ //
+ // // The custom CEL rule applies only if the field is set, including if
+ // // it's the "zero" value of that message.
+ // SomeMessage quux = 4 [
+ // (buf.validate.field).cel = {/* ... */}
+ // ];
+ // }
+ //
+ // ```
+ Ignore_IGNORE_UNSPECIFIED Ignore = 0
+ // Validation is skipped if the field is unpopulated. This rule is redundant
+ // if the field is already nullable. This value is equivalent behavior to the
+ // deprecated ignore_empty rule.
+ //
+ // ```proto
+ // syntax="proto3
+ //
+ // message Request {
+ // // The uri rule applies only if the value is not the empty string.
+ // string foo = 1 [
+ // (buf.validate.field).string.uri = true,
+ // (buf.validate.field).ignore = IGNORE_IF_UNPOPULATED
+ // ];
+ //
+ // // IGNORE_IF_UNPOPULATED is equivalent to IGNORE_UNSPECIFIED in this
+ // // case: the uri rule only applies if the field is set, including if
+ // // it's set to the empty string.
+ // optional string bar = 2 [
+ // (buf.validate.field).string.uri = true,
+ // (buf.validate.field).ignore = IGNORE_IF_UNPOPULATED
+ // ];
+ //
+ // // The min_items rule only applies if the list has at least one item.
+ // repeated string baz = 3 [
+ // (buf.validate.field).repeated.min_items = 3,
+ // (buf.validate.field).ignore = IGNORE_IF_UNPOPULATED
+ // ];
+ //
+ // // IGNORE_IF_UNPOPULATED is equivalent to IGNORE_UNSPECIFIED in this
+ // // case: the custom CEL rule applies only if the field is set, including
+ // // if it's the "zero" value of that message.
+ // SomeMessage quux = 4 [
+ // (buf.validate.field).cel = {/* ... */},
+ // (buf.validate.field).ignore = IGNORE_IF_UNPOPULATED
+ // ];
+ // }
+ //
+ // ```
+ Ignore_IGNORE_IF_UNPOPULATED Ignore = 1
+ // Validation is skipped if the field is unpopulated or if it is a nullable
+ // field populated with its default value. This is typically the zero or
+ // empty value, but proto2 scalars support custom defaults. For messages, the
+ // default is a non-null message with all its fields unpopulated.
+ //
+ // ```proto
+ // syntax="proto3
+ //
+ // message Request {
+ // // IGNORE_IF_DEFAULT_VALUE is equivalent to IGNORE_IF_UNPOPULATED in
+ // // this case; the uri rule applies only if the value is not the empty
+ // // string.
+ // string foo = 1 [
+ // (buf.validate.field).string.uri = true,
+ // (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE
+ // ];
+ //
+ // // The uri rule only applies if the field is set to a value other than
+ // // the empty string.
+ // optional string bar = 2 [
+ // (buf.validate.field).string.uri = true,
+ // (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE
+ // ];
+ //
+ // // IGNORE_IF_DEFAULT_VALUE is equivalent to IGNORE_IF_UNPOPULATED in
+ // // this case; the min_items rule only applies if the list has at least
+ // // one item.
+ // repeated string baz = 3 [
+ // (buf.validate.field).repeated.min_items = 3,
+ // (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE
+ // ];
+ //
+ // // The custom CEL rule only applies if the field is set to a value other
+ // // than an empty message (i.e., fields are unpopulated).
+ // SomeMessage quux = 4 [
+ // (buf.validate.field).cel = {/* ... */},
+ // (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE
+ // ];
+ // }
+ //
+ // ```
+ //
+ // This rule is affected by proto2 custom default values:
+ //
+ // ```proto
+ // syntax="proto2";
+ //
+ // message Request {
+ // // The gt rule only applies if the field is set and it's value is not
+ // the default (i.e., not -42). The rule even applies if the field is set
+ // to zero since the default value differs.
+ // optional int32 value = 1 [
+ // default = -42,
+ // (buf.validate.field).int32.gt = 0,
+ // (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE
+ // ];
+ // }
+ Ignore_IGNORE_IF_DEFAULT_VALUE Ignore = 2
+ // The validation rules of this field will be skipped and not evaluated. This
+ // is useful for situations that necessitate turning off the rules of a field
+ // containing a message that may not make sense in the current context, or to
+ // temporarily disable constraints during development.
+ //
+ // ```proto
+ //
+ // message MyMessage {
+ // // The field's rules will always be ignored, including any validation's
+ // // on value's fields.
+ // MyOtherMessage value = 1 [
+ // (buf.validate.field).ignore = IGNORE_ALWAYS];
+ // }
+ //
+ // ```
+ Ignore_IGNORE_ALWAYS Ignore = 3
+ // Deprecated: Use IGNORE_IF_UNPOPULATED instead. TODO: Remove this value pre-v1.
+ //
+ // Deprecated: Marked as deprecated in buf/validate/validate.proto.
+ Ignore_IGNORE_EMPTY Ignore = 1
+ // Deprecated: Use IGNORE_IF_DEFAULT_VALUE. TODO: Remove this value pre-v1.
+ //
+ // Deprecated: Marked as deprecated in buf/validate/validate.proto.
+ Ignore_IGNORE_DEFAULT Ignore = 2
+)
+
+// Enum value maps for Ignore.
+var (
+ Ignore_name = map[int32]string{
+ 0: "IGNORE_UNSPECIFIED",
+ 1: "IGNORE_IF_UNPOPULATED",
+ 2: "IGNORE_IF_DEFAULT_VALUE",
+ 3: "IGNORE_ALWAYS",
+ // Duplicate value: 1: "IGNORE_EMPTY",
+ // Duplicate value: 2: "IGNORE_DEFAULT",
+ }
+ Ignore_value = map[string]int32{
+ "IGNORE_UNSPECIFIED": 0,
+ "IGNORE_IF_UNPOPULATED": 1,
+ "IGNORE_IF_DEFAULT_VALUE": 2,
+ "IGNORE_ALWAYS": 3,
+ "IGNORE_EMPTY": 1,
+ "IGNORE_DEFAULT": 2,
+ }
+)
+
+func (x Ignore) Enum() *Ignore {
+ p := new(Ignore)
+ *p = x
+ return p
+}
+
+func (x Ignore) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Ignore) Descriptor() protoreflect.EnumDescriptor {
+ return file_buf_validate_validate_proto_enumTypes[0].Descriptor()
+}
+
+func (Ignore) Type() protoreflect.EnumType {
+ return &file_buf_validate_validate_proto_enumTypes[0]
+}
+
+func (x Ignore) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *Ignore) UnmarshalJSON(b []byte) error {
+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+ if err != nil {
+ return err
+ }
+ *x = Ignore(num)
+ return nil
+}
+
+// Deprecated: Use Ignore.Descriptor instead.
+func (Ignore) EnumDescriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{0}
+}
+
+// WellKnownRegex contain some well-known patterns.
+type KnownRegex int32
+
+const (
+ KnownRegex_KNOWN_REGEX_UNSPECIFIED KnownRegex = 0
+ // HTTP header name as defined by [RFC 7230](https://tools.ietf.org/html/rfc7230#section-3.2).
+ KnownRegex_KNOWN_REGEX_HTTP_HEADER_NAME KnownRegex = 1
+ // HTTP header value as defined by [RFC 7230](https://tools.ietf.org/html/rfc7230#section-3.2.4).
+ KnownRegex_KNOWN_REGEX_HTTP_HEADER_VALUE KnownRegex = 2
+)
+
+// Enum value maps for KnownRegex.
+var (
+ KnownRegex_name = map[int32]string{
+ 0: "KNOWN_REGEX_UNSPECIFIED",
+ 1: "KNOWN_REGEX_HTTP_HEADER_NAME",
+ 2: "KNOWN_REGEX_HTTP_HEADER_VALUE",
+ }
+ KnownRegex_value = map[string]int32{
+ "KNOWN_REGEX_UNSPECIFIED": 0,
+ "KNOWN_REGEX_HTTP_HEADER_NAME": 1,
+ "KNOWN_REGEX_HTTP_HEADER_VALUE": 2,
+ }
+)
+
+func (x KnownRegex) Enum() *KnownRegex {
+ p := new(KnownRegex)
+ *p = x
+ return p
+}
+
+func (x KnownRegex) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (KnownRegex) Descriptor() protoreflect.EnumDescriptor {
+ return file_buf_validate_validate_proto_enumTypes[1].Descriptor()
+}
+
+func (KnownRegex) Type() protoreflect.EnumType {
+ return &file_buf_validate_validate_proto_enumTypes[1]
+}
+
+func (x KnownRegex) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *KnownRegex) UnmarshalJSON(b []byte) error {
+ num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+ if err != nil {
+ return err
+ }
+ *x = KnownRegex(num)
+ return nil
+}
+
+// Deprecated: Use KnownRegex.Descriptor instead.
+func (KnownRegex) EnumDescriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{1}
+}
+
+// `Constraint` represents a validation rule written in the Common Expression
+// Language (CEL) syntax. Each Constraint includes a unique identifier, an
+// optional error message, and the CEL expression to evaluate. For more
+// information on CEL, [see our documentation](https://github.com/bufbuild/protovalidate/blob/main/docs/cel.md).
+//
+// ```proto
+//
+// message Foo {
+// option (buf.validate.message).cel = {
+// id: "foo.bar"
+// message: "bar must be greater than 0"
+// expression: "this.bar > 0"
+// };
+// int32 bar = 1;
+// }
+//
+// ```
+type Constraint struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `id` is a string that serves as a machine-readable name for this Constraint.
+ // It should be unique within its scope, which could be either a message or a field.
+ Id *string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
+ // `message` is an optional field that provides a human-readable error message
+ // for this Constraint when the CEL expression evaluates to false. If a
+ // non-empty message is provided, any strings resulting from the CEL
+ // expression evaluation are ignored.
+ Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"`
+ // `expression` is the actual CEL expression that will be evaluated for
+ // validation. This string must resolve to either a boolean or a string
+ // value. If the expression evaluates to false or a non-empty string, the
+ // validation is considered failed, and the message is rejected.
+ Expression *string `protobuf:"bytes,3,opt,name=expression" json:"expression,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *Constraint) Reset() {
+ *x = Constraint{}
+ mi := &file_buf_validate_validate_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *Constraint) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Constraint) ProtoMessage() {}
+
+func (x *Constraint) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[0]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Constraint.ProtoReflect.Descriptor instead.
+func (*Constraint) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Constraint) GetId() string {
+ if x != nil && x.Id != nil {
+ return *x.Id
+ }
+ return ""
+}
+
+func (x *Constraint) GetMessage() string {
+ if x != nil && x.Message != nil {
+ return *x.Message
+ }
+ return ""
+}
+
+func (x *Constraint) GetExpression() string {
+ if x != nil && x.Expression != nil {
+ return *x.Expression
+ }
+ return ""
+}
+
+// MessageConstraints represents validation rules that are applied to the entire message.
+// It includes disabling options and a list of Constraint messages representing Common Expression Language (CEL) validation rules.
+type MessageConstraints struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `disabled` is a boolean flag that, when set to true, nullifies any validation rules for this message.
+ // This includes any fields within the message that would otherwise support validation.
+ //
+ // ```proto
+ //
+ // message MyMessage {
+ // // validation will be bypassed for this message
+ // option (buf.validate.message).disabled = true;
+ // }
+ //
+ // ```
+ Disabled *bool `protobuf:"varint,1,opt,name=disabled" json:"disabled,omitempty"`
+ // `cel` is a repeated field of type Constraint. Each Constraint specifies a validation rule to be applied to this message.
+ // These constraints are written in Common Expression Language (CEL) syntax. For more information on
+ // CEL, [see our documentation](https://github.com/bufbuild/protovalidate/blob/main/docs/cel.md).
+ //
+ // ```proto
+ //
+ // message MyMessage {
+ // // The field `foo` must be greater than 42.
+ // option (buf.validate.message).cel = {
+ // id: "my_message.value",
+ // message: "value must be greater than 42",
+ // expression: "this.foo > 42",
+ // };
+ // optional int32 foo = 1;
+ // }
+ //
+ // ```
+ Cel []*Constraint `protobuf:"bytes,3,rep,name=cel" json:"cel,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MessageConstraints) Reset() {
+ *x = MessageConstraints{}
+ mi := &file_buf_validate_validate_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MessageConstraints) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MessageConstraints) ProtoMessage() {}
+
+func (x *MessageConstraints) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[1]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MessageConstraints.ProtoReflect.Descriptor instead.
+func (*MessageConstraints) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *MessageConstraints) GetDisabled() bool {
+ if x != nil && x.Disabled != nil {
+ return *x.Disabled
+ }
+ return false
+}
+
+func (x *MessageConstraints) GetCel() []*Constraint {
+ if x != nil {
+ return x.Cel
+ }
+ return nil
+}
+
+// The `OneofConstraints` message type enables you to manage constraints for
+// oneof fields in your protobuf messages.
+type OneofConstraints struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // If `required` is true, exactly one field of the oneof must be present. A
+ // validation error is returned if no fields in the oneof are present. The
+ // field itself may still be a default value; further constraints
+ // should be placed on the fields themselves to ensure they are valid values,
+ // such as `min_len` or `gt`.
+ //
+ // ```proto
+ //
+ // message MyMessage {
+ // oneof value {
+ // // Either `a` or `b` must be set. If `a` is set, it must also be
+ // // non-empty; whereas if `b` is set, it can still be an empty string.
+ // option (buf.validate.oneof).required = true;
+ // string a = 1 [(buf.validate.field).string.min_len = 1];
+ // string b = 2;
+ // }
+ // }
+ //
+ // ```
+ Required *bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *OneofConstraints) Reset() {
+ *x = OneofConstraints{}
+ mi := &file_buf_validate_validate_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *OneofConstraints) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OneofConstraints) ProtoMessage() {}
+
+func (x *OneofConstraints) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[2]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use OneofConstraints.ProtoReflect.Descriptor instead.
+func (*OneofConstraints) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *OneofConstraints) GetRequired() bool {
+ if x != nil && x.Required != nil {
+ return *x.Required
+ }
+ return false
+}
+
+// FieldConstraints encapsulates the rules for each type of field. Depending on
+// the field, the correct set should be used to ensure proper validations.
+type FieldConstraints struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `cel` is a repeated field used to represent a textual expression
+ // in the Common Expression Language (CEL) syntax. For more information on
+ // CEL, [see our documentation](https://github.com/bufbuild/protovalidate/blob/main/docs/cel.md).
+ //
+ // ```proto
+ //
+ // message MyMessage {
+ // // The field `value` must be greater than 42.
+ // optional int32 value = 1 [(buf.validate.field).cel = {
+ // id: "my_message.value",
+ // message: "value must be greater than 42",
+ // expression: "this > 42",
+ // }];
+ // }
+ //
+ // ```
+ Cel []*Constraint `protobuf:"bytes,23,rep,name=cel" json:"cel,omitempty"`
+ // If `required` is true, the field must be populated. A populated field can be
+ // described as "serialized in the wire format," which includes:
+ //
+ // - the following "nullable" fields must be explicitly set to be considered populated:
+ // - singular message fields (whose fields may be unpopulated/default values)
+ // - member fields of a oneof (may be their default value)
+ // - proto3 optional fields (may be their default value)
+ // - proto2 scalar fields (both optional and required)
+ //
+ // - proto3 scalar fields must be non-zero to be considered populated
+ // - repeated and map fields must be non-empty to be considered populated
+ //
+ // ```proto
+ //
+ // message MyMessage {
+ // // The field `value` must be set to a non-null value.
+ // optional MyOtherMessage value = 1 [(buf.validate.field).required = true];
+ // }
+ //
+ // ```
+ Required *bool `protobuf:"varint,25,opt,name=required" json:"required,omitempty"`
+ // Skip validation on the field if its value matches the specified criteria.
+ // See Ignore enum for details.
+ //
+ // ```proto
+ //
+ // message UpdateRequest {
+ // // The uri rule only applies if the field is populated and not an empty
+ // // string.
+ // optional string url = 1 [
+ // (buf.validate.field).ignore = IGNORE_IF_DEFAULT_VALUE,
+ // (buf.validate.field).string.uri = true,
+ // ];
+ // }
+ //
+ // ```
+ Ignore *Ignore `protobuf:"varint,27,opt,name=ignore,enum=buf.validate.Ignore" json:"ignore,omitempty"`
+ // Types that are valid to be assigned to Type:
+ //
+ // *FieldConstraints_Float
+ // *FieldConstraints_Double
+ // *FieldConstraints_Int32
+ // *FieldConstraints_Int64
+ // *FieldConstraints_Uint32
+ // *FieldConstraints_Uint64
+ // *FieldConstraints_Sint32
+ // *FieldConstraints_Sint64
+ // *FieldConstraints_Fixed32
+ // *FieldConstraints_Fixed64
+ // *FieldConstraints_Sfixed32
+ // *FieldConstraints_Sfixed64
+ // *FieldConstraints_Bool
+ // *FieldConstraints_String_
+ // *FieldConstraints_Bytes
+ // *FieldConstraints_Enum
+ // *FieldConstraints_Repeated
+ // *FieldConstraints_Map
+ // *FieldConstraints_Any
+ // *FieldConstraints_Duration
+ // *FieldConstraints_Timestamp
+ Type isFieldConstraints_Type `protobuf_oneof:"type"`
+ // DEPRECATED: use ignore=IGNORE_ALWAYS instead. TODO: remove this field pre-v1.
+ //
+ // Deprecated: Marked as deprecated in buf/validate/validate.proto.
+ Skipped *bool `protobuf:"varint,24,opt,name=skipped" json:"skipped,omitempty"`
+ // DEPRECATED: use ignore=IGNORE_IF_UNPOPULATED instead. TODO: remove this field pre-v1.
+ //
+ // Deprecated: Marked as deprecated in buf/validate/validate.proto.
+ IgnoreEmpty *bool `protobuf:"varint,26,opt,name=ignore_empty,json=ignoreEmpty" json:"ignore_empty,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *FieldConstraints) Reset() {
+ *x = FieldConstraints{}
+ mi := &file_buf_validate_validate_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *FieldConstraints) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FieldConstraints) ProtoMessage() {}
+
+func (x *FieldConstraints) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[3]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use FieldConstraints.ProtoReflect.Descriptor instead.
+func (*FieldConstraints) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *FieldConstraints) GetCel() []*Constraint {
+ if x != nil {
+ return x.Cel
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetRequired() bool {
+ if x != nil && x.Required != nil {
+ return *x.Required
+ }
+ return false
+}
+
+func (x *FieldConstraints) GetIgnore() Ignore {
+ if x != nil && x.Ignore != nil {
+ return *x.Ignore
+ }
+ return Ignore_IGNORE_UNSPECIFIED
+}
+
+func (x *FieldConstraints) GetType() isFieldConstraints_Type {
+ if x != nil {
+ return x.Type
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetFloat() *FloatRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Float); ok {
+ return x.Float
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetDouble() *DoubleRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Double); ok {
+ return x.Double
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetInt32() *Int32Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Int32); ok {
+ return x.Int32
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetInt64() *Int64Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Int64); ok {
+ return x.Int64
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetUint32() *UInt32Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Uint32); ok {
+ return x.Uint32
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetUint64() *UInt64Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Uint64); ok {
+ return x.Uint64
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetSint32() *SInt32Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Sint32); ok {
+ return x.Sint32
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetSint64() *SInt64Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Sint64); ok {
+ return x.Sint64
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetFixed32() *Fixed32Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Fixed32); ok {
+ return x.Fixed32
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetFixed64() *Fixed64Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Fixed64); ok {
+ return x.Fixed64
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetSfixed32() *SFixed32Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Sfixed32); ok {
+ return x.Sfixed32
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetSfixed64() *SFixed64Rules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Sfixed64); ok {
+ return x.Sfixed64
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetBool() *BoolRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Bool); ok {
+ return x.Bool
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetString_() *StringRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_String_); ok {
+ return x.String_
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetBytes() *BytesRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Bytes); ok {
+ return x.Bytes
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetEnum() *EnumRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Enum); ok {
+ return x.Enum
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetRepeated() *RepeatedRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Repeated); ok {
+ return x.Repeated
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetMap() *MapRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Map); ok {
+ return x.Map
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetAny() *AnyRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Any); ok {
+ return x.Any
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetDuration() *DurationRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Duration); ok {
+ return x.Duration
+ }
+ }
+ return nil
+}
+
+func (x *FieldConstraints) GetTimestamp() *TimestampRules {
+ if x != nil {
+ if x, ok := x.Type.(*FieldConstraints_Timestamp); ok {
+ return x.Timestamp
+ }
+ }
+ return nil
+}
+
+// Deprecated: Marked as deprecated in buf/validate/validate.proto.
+func (x *FieldConstraints) GetSkipped() bool {
+ if x != nil && x.Skipped != nil {
+ return *x.Skipped
+ }
+ return false
+}
+
+// Deprecated: Marked as deprecated in buf/validate/validate.proto.
+func (x *FieldConstraints) GetIgnoreEmpty() bool {
+ if x != nil && x.IgnoreEmpty != nil {
+ return *x.IgnoreEmpty
+ }
+ return false
+}
+
+type isFieldConstraints_Type interface {
+ isFieldConstraints_Type()
+}
+
+type FieldConstraints_Float struct {
+ // Scalar Field Types
+ Float *FloatRules `protobuf:"bytes,1,opt,name=float,oneof"`
+}
+
+type FieldConstraints_Double struct {
+ Double *DoubleRules `protobuf:"bytes,2,opt,name=double,oneof"`
+}
+
+type FieldConstraints_Int32 struct {
+ Int32 *Int32Rules `protobuf:"bytes,3,opt,name=int32,oneof"`
+}
+
+type FieldConstraints_Int64 struct {
+ Int64 *Int64Rules `protobuf:"bytes,4,opt,name=int64,oneof"`
+}
+
+type FieldConstraints_Uint32 struct {
+ Uint32 *UInt32Rules `protobuf:"bytes,5,opt,name=uint32,oneof"`
+}
+
+type FieldConstraints_Uint64 struct {
+ Uint64 *UInt64Rules `protobuf:"bytes,6,opt,name=uint64,oneof"`
+}
+
+type FieldConstraints_Sint32 struct {
+ Sint32 *SInt32Rules `protobuf:"bytes,7,opt,name=sint32,oneof"`
+}
+
+type FieldConstraints_Sint64 struct {
+ Sint64 *SInt64Rules `protobuf:"bytes,8,opt,name=sint64,oneof"`
+}
+
+type FieldConstraints_Fixed32 struct {
+ Fixed32 *Fixed32Rules `protobuf:"bytes,9,opt,name=fixed32,oneof"`
+}
+
+type FieldConstraints_Fixed64 struct {
+ Fixed64 *Fixed64Rules `protobuf:"bytes,10,opt,name=fixed64,oneof"`
+}
+
+type FieldConstraints_Sfixed32 struct {
+ Sfixed32 *SFixed32Rules `protobuf:"bytes,11,opt,name=sfixed32,oneof"`
+}
+
+type FieldConstraints_Sfixed64 struct {
+ Sfixed64 *SFixed64Rules `protobuf:"bytes,12,opt,name=sfixed64,oneof"`
+}
+
+type FieldConstraints_Bool struct {
+ Bool *BoolRules `protobuf:"bytes,13,opt,name=bool,oneof"`
+}
+
+type FieldConstraints_String_ struct {
+ String_ *StringRules `protobuf:"bytes,14,opt,name=string,oneof"`
+}
+
+type FieldConstraints_Bytes struct {
+ Bytes *BytesRules `protobuf:"bytes,15,opt,name=bytes,oneof"`
+}
+
+type FieldConstraints_Enum struct {
+ // Complex Field Types
+ Enum *EnumRules `protobuf:"bytes,16,opt,name=enum,oneof"`
+}
+
+type FieldConstraints_Repeated struct {
+ Repeated *RepeatedRules `protobuf:"bytes,18,opt,name=repeated,oneof"`
+}
+
+type FieldConstraints_Map struct {
+ Map *MapRules `protobuf:"bytes,19,opt,name=map,oneof"`
+}
+
+type FieldConstraints_Any struct {
+ // Well-Known Field Types
+ Any *AnyRules `protobuf:"bytes,20,opt,name=any,oneof"`
+}
+
+type FieldConstraints_Duration struct {
+ Duration *DurationRules `protobuf:"bytes,21,opt,name=duration,oneof"`
+}
+
+type FieldConstraints_Timestamp struct {
+ Timestamp *TimestampRules `protobuf:"bytes,22,opt,name=timestamp,oneof"`
+}
+
+func (*FieldConstraints_Float) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Double) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Int32) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Int64) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Uint32) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Uint64) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Sint32) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Sint64) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Fixed32) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Fixed64) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Sfixed32) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Sfixed64) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Bool) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_String_) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Bytes) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Enum) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Repeated) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Map) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Any) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Duration) isFieldConstraints_Type() {}
+
+func (*FieldConstraints_Timestamp) isFieldConstraints_Type() {}
+
+// PredefinedConstraints are custom constraints that can be re-used with
+// multiple fields.
+type PredefinedConstraints struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `cel` is a repeated field used to represent a textual expression
+ // in the Common Expression Language (CEL) syntax. For more information on
+ // CEL, [see our documentation](https://github.com/bufbuild/protovalidate/blob/main/docs/cel.md).
+ //
+ // ```proto
+ //
+ // message MyMessage {
+ // // The field `value` must be greater than 42.
+ // optional int32 value = 1 [(buf.validate.predefined).cel = {
+ // id: "my_message.value",
+ // message: "value must be greater than 42",
+ // expression: "this > 42",
+ // }];
+ // }
+ //
+ // ```
+ Cel []*Constraint `protobuf:"bytes,1,rep,name=cel" json:"cel,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *PredefinedConstraints) Reset() {
+ *x = PredefinedConstraints{}
+ mi := &file_buf_validate_validate_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *PredefinedConstraints) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PredefinedConstraints) ProtoMessage() {}
+
+func (x *PredefinedConstraints) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[4]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PredefinedConstraints.ProtoReflect.Descriptor instead.
+func (*PredefinedConstraints) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *PredefinedConstraints) GetCel() []*Constraint {
+ if x != nil {
+ return x.Cel
+ }
+ return nil
+}
+
+// FloatRules describes the constraints applied to `float` values. These
+// rules may also be applied to the `google.protobuf.FloatValue` Well-Known-Type.
+type FloatRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFloat {
+ // // value must equal 42.0
+ // float value = 1 [(buf.validate.field).float.const = 42.0];
+ // }
+ //
+ // ```
+ Const *float32 `protobuf:"fixed32,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *FloatRules_Lt
+ // *FloatRules_Lte
+ LessThan isFloatRules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *FloatRules_Gt
+ // *FloatRules_Gte
+ GreaterThan isFloatRules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message
+ // is generated.
+ //
+ // ```proto
+ //
+ // message MyFloat {
+ // // value must be in list [1.0, 2.0, 3.0]
+ // repeated float value = 1 (buf.validate.field).float = { in: [1.0, 2.0, 3.0] };
+ // }
+ //
+ // ```
+ In []float32 `protobuf:"fixed32,6,rep,name=in" json:"in,omitempty"`
+ // `in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MyFloat {
+ // // value must not be in list [1.0, 2.0, 3.0]
+ // repeated float value = 1 (buf.validate.field).float = { not_in: [1.0, 2.0, 3.0] };
+ // }
+ //
+ // ```
+ NotIn []float32 `protobuf:"fixed32,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `finite` requires the field value to be finite. If the field value is
+ // infinite or NaN, an error message is generated.
+ Finite *bool `protobuf:"varint,8,opt,name=finite" json:"finite,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyFloat {
+ // float value = 1 [
+ // (buf.validate.field).float.example = 1.0,
+ // (buf.validate.field).float.example = "Infinity"
+ // ];
+ // }
+ //
+ // ```
+ Example []float32 `protobuf:"fixed32,9,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *FloatRules) Reset() {
+ *x = FloatRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *FloatRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FloatRules) ProtoMessage() {}
+
+func (x *FloatRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[5]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use FloatRules.ProtoReflect.Descriptor instead.
+func (*FloatRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *FloatRules) GetConst() float32 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *FloatRules) GetLessThan() isFloatRules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *FloatRules) GetLt() float32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*FloatRules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *FloatRules) GetLte() float32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*FloatRules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *FloatRules) GetGreaterThan() isFloatRules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *FloatRules) GetGt() float32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*FloatRules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *FloatRules) GetGte() float32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*FloatRules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *FloatRules) GetIn() []float32 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *FloatRules) GetNotIn() []float32 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *FloatRules) GetFinite() bool {
+ if x != nil && x.Finite != nil {
+ return *x.Finite
+ }
+ return false
+}
+
+func (x *FloatRules) GetExample() []float32 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isFloatRules_LessThan interface {
+ isFloatRules_LessThan()
+}
+
+type FloatRules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field <
+ // value). If the field value is equal to or greater than the specified value,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFloat {
+ // // value must be less than 10.0
+ // float value = 1 [(buf.validate.field).float.lt = 10.0];
+ // }
+ //
+ // ```
+ Lt float32 `protobuf:"fixed32,2,opt,name=lt,oneof"`
+}
+
+type FloatRules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFloat {
+ // // value must be less than or equal to 10.0
+ // float value = 1 [(buf.validate.field).float.lte = 10.0];
+ // }
+ //
+ // ```
+ Lte float32 `protobuf:"fixed32,3,opt,name=lte,oneof"`
+}
+
+func (*FloatRules_Lt) isFloatRules_LessThan() {}
+
+func (*FloatRules_Lte) isFloatRules_LessThan() {}
+
+type isFloatRules_GreaterThan interface {
+ isFloatRules_GreaterThan()
+}
+
+type FloatRules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFloat {
+ // // value must be greater than 5.0 [float.gt]
+ // float value = 1 [(buf.validate.field).float.gt = 5.0];
+ //
+ // // value must be greater than 5 and less than 10.0 [float.gt_lt]
+ // float other_value = 2 [(buf.validate.field).float = { gt: 5.0, lt: 10.0 }];
+ //
+ // // value must be greater than 10 or less than 5.0 [float.gt_lt_exclusive]
+ // float another_value = 3 [(buf.validate.field).float = { gt: 10.0, lt: 5.0 }];
+ // }
+ //
+ // ```
+ Gt float32 `protobuf:"fixed32,4,opt,name=gt,oneof"`
+}
+
+type FloatRules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFloat {
+ // // value must be greater than or equal to 5.0 [float.gte]
+ // float value = 1 [(buf.validate.field).float.gte = 5.0];
+ //
+ // // value must be greater than or equal to 5.0 and less than 10.0 [float.gte_lt]
+ // float other_value = 2 [(buf.validate.field).float = { gte: 5.0, lt: 10.0 }];
+ //
+ // // value must be greater than or equal to 10.0 or less than 5.0 [float.gte_lt_exclusive]
+ // float another_value = 3 [(buf.validate.field).float = { gte: 10.0, lt: 5.0 }];
+ // }
+ //
+ // ```
+ Gte float32 `protobuf:"fixed32,5,opt,name=gte,oneof"`
+}
+
+func (*FloatRules_Gt) isFloatRules_GreaterThan() {}
+
+func (*FloatRules_Gte) isFloatRules_GreaterThan() {}
+
+// DoubleRules describes the constraints applied to `double` values. These
+// rules may also be applied to the `google.protobuf.DoubleValue` Well-Known-Type.
+type DoubleRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyDouble {
+ // // value must equal 42.0
+ // double value = 1 [(buf.validate.field).double.const = 42.0];
+ // }
+ //
+ // ```
+ Const *float64 `protobuf:"fixed64,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *DoubleRules_Lt
+ // *DoubleRules_Lte
+ LessThan isDoubleRules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *DoubleRules_Gt
+ // *DoubleRules_Gte
+ GreaterThan isDoubleRules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyDouble {
+ // // value must be in list [1.0, 2.0, 3.0]
+ // repeated double value = 1 (buf.validate.field).double = { in: [1.0, 2.0, 3.0] };
+ // }
+ //
+ // ```
+ In []float64 `protobuf:"fixed64,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MyDouble {
+ // // value must not be in list [1.0, 2.0, 3.0]
+ // repeated double value = 1 (buf.validate.field).double = { not_in: [1.0, 2.0, 3.0] };
+ // }
+ //
+ // ```
+ NotIn []float64 `protobuf:"fixed64,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `finite` requires the field value to be finite. If the field value is
+ // infinite or NaN, an error message is generated.
+ Finite *bool `protobuf:"varint,8,opt,name=finite" json:"finite,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyDouble {
+ // double value = 1 [
+ // (buf.validate.field).double.example = 1.0,
+ // (buf.validate.field).double.example = "Infinity"
+ // ];
+ // }
+ //
+ // ```
+ Example []float64 `protobuf:"fixed64,9,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *DoubleRules) Reset() {
+ *x = DoubleRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *DoubleRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DoubleRules) ProtoMessage() {}
+
+func (x *DoubleRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[6]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DoubleRules.ProtoReflect.Descriptor instead.
+func (*DoubleRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *DoubleRules) GetConst() float64 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *DoubleRules) GetLessThan() isDoubleRules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *DoubleRules) GetLt() float64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*DoubleRules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *DoubleRules) GetLte() float64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*DoubleRules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *DoubleRules) GetGreaterThan() isDoubleRules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *DoubleRules) GetGt() float64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*DoubleRules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *DoubleRules) GetGte() float64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*DoubleRules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *DoubleRules) GetIn() []float64 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *DoubleRules) GetNotIn() []float64 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *DoubleRules) GetFinite() bool {
+ if x != nil && x.Finite != nil {
+ return *x.Finite
+ }
+ return false
+}
+
+func (x *DoubleRules) GetExample() []float64 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isDoubleRules_LessThan interface {
+ isDoubleRules_LessThan()
+}
+
+type DoubleRules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field <
+ // value). If the field value is equal to or greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyDouble {
+ // // value must be less than 10.0
+ // double value = 1 [(buf.validate.field).double.lt = 10.0];
+ // }
+ //
+ // ```
+ Lt float64 `protobuf:"fixed64,2,opt,name=lt,oneof"`
+}
+
+type DoubleRules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified value
+ // (field <= value). If the field value is greater than the specified value,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyDouble {
+ // // value must be less than or equal to 10.0
+ // double value = 1 [(buf.validate.field).double.lte = 10.0];
+ // }
+ //
+ // ```
+ Lte float64 `protobuf:"fixed64,3,opt,name=lte,oneof"`
+}
+
+func (*DoubleRules_Lt) isDoubleRules_LessThan() {}
+
+func (*DoubleRules_Lte) isDoubleRules_LessThan() {}
+
+type isDoubleRules_GreaterThan interface {
+ isDoubleRules_GreaterThan()
+}
+
+type DoubleRules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or `lte`,
+ // the range is reversed, and the field value must be outside the specified
+ // range. If the field value doesn't meet the required conditions, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MyDouble {
+ // // value must be greater than 5.0 [double.gt]
+ // double value = 1 [(buf.validate.field).double.gt = 5.0];
+ //
+ // // value must be greater than 5 and less than 10.0 [double.gt_lt]
+ // double other_value = 2 [(buf.validate.field).double = { gt: 5.0, lt: 10.0 }];
+ //
+ // // value must be greater than 10 or less than 5.0 [double.gt_lt_exclusive]
+ // double another_value = 3 [(buf.validate.field).double = { gt: 10.0, lt: 5.0 }];
+ // }
+ //
+ // ```
+ Gt float64 `protobuf:"fixed64,4,opt,name=gt,oneof"`
+}
+
+type DoubleRules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyDouble {
+ // // value must be greater than or equal to 5.0 [double.gte]
+ // double value = 1 [(buf.validate.field).double.gte = 5.0];
+ //
+ // // value must be greater than or equal to 5.0 and less than 10.0 [double.gte_lt]
+ // double other_value = 2 [(buf.validate.field).double = { gte: 5.0, lt: 10.0 }];
+ //
+ // // value must be greater than or equal to 10.0 or less than 5.0 [double.gte_lt_exclusive]
+ // double another_value = 3 [(buf.validate.field).double = { gte: 10.0, lt: 5.0 }];
+ // }
+ //
+ // ```
+ Gte float64 `protobuf:"fixed64,5,opt,name=gte,oneof"`
+}
+
+func (*DoubleRules_Gt) isDoubleRules_GreaterThan() {}
+
+func (*DoubleRules_Gte) isDoubleRules_GreaterThan() {}
+
+// Int32Rules describes the constraints applied to `int32` values. These
+// rules may also be applied to the `google.protobuf.Int32Value` Well-Known-Type.
+type Int32Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt32 {
+ // // value must equal 42
+ // int32 value = 1 [(buf.validate.field).int32.const = 42];
+ // }
+ //
+ // ```
+ Const *int32 `protobuf:"varint,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *Int32Rules_Lt
+ // *Int32Rules_Lte
+ LessThan isInt32Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *Int32Rules_Gt
+ // *Int32Rules_Gte
+ GreaterThan isInt32Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyInt32 {
+ // // value must be in list [1, 2, 3]
+ // repeated int32 value = 1 (buf.validate.field).int32 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []int32 `protobuf:"varint,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error message
+ // is generated.
+ //
+ // ```proto
+ //
+ // message MyInt32 {
+ // // value must not be in list [1, 2, 3]
+ // repeated int32 value = 1 (buf.validate.field).int32 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []int32 `protobuf:"varint,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyInt32 {
+ // int32 value = 1 [
+ // (buf.validate.field).int32.example = 1,
+ // (buf.validate.field).int32.example = -10
+ // ];
+ // }
+ //
+ // ```
+ Example []int32 `protobuf:"varint,8,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *Int32Rules) Reset() {
+ *x = Int32Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *Int32Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Int32Rules) ProtoMessage() {}
+
+func (x *Int32Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[7]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Int32Rules.ProtoReflect.Descriptor instead.
+func (*Int32Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *Int32Rules) GetConst() int32 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *Int32Rules) GetLessThan() isInt32Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *Int32Rules) GetLt() int32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*Int32Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *Int32Rules) GetLte() int32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*Int32Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *Int32Rules) GetGreaterThan() isInt32Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *Int32Rules) GetGt() int32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*Int32Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *Int32Rules) GetGte() int32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*Int32Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *Int32Rules) GetIn() []int32 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *Int32Rules) GetNotIn() []int32 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *Int32Rules) GetExample() []int32 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isInt32Rules_LessThan interface {
+ isInt32Rules_LessThan()
+}
+
+type Int32Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field
+ // < value). If the field value is equal to or greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt32 {
+ // // value must be less than 10
+ // int32 value = 1 [(buf.validate.field).int32.lt = 10];
+ // }
+ //
+ // ```
+ Lt int32 `protobuf:"varint,2,opt,name=lt,oneof"`
+}
+
+type Int32Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt32 {
+ // // value must be less than or equal to 10
+ // int32 value = 1 [(buf.validate.field).int32.lte = 10];
+ // }
+ //
+ // ```
+ Lte int32 `protobuf:"varint,3,opt,name=lte,oneof"`
+}
+
+func (*Int32Rules_Lt) isInt32Rules_LessThan() {}
+
+func (*Int32Rules_Lte) isInt32Rules_LessThan() {}
+
+type isInt32Rules_GreaterThan interface {
+ isInt32Rules_GreaterThan()
+}
+
+type Int32Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt32 {
+ // // value must be greater than 5 [int32.gt]
+ // int32 value = 1 [(buf.validate.field).int32.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [int32.gt_lt]
+ // int32 other_value = 2 [(buf.validate.field).int32 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [int32.gt_lt_exclusive]
+ // int32 another_value = 3 [(buf.validate.field).int32 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt int32 `protobuf:"varint,4,opt,name=gt,oneof"`
+}
+
+type Int32Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified value
+ // (exclusive). If the value of `gte` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt32 {
+ // // value must be greater than or equal to 5 [int32.gte]
+ // int32 value = 1 [(buf.validate.field).int32.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [int32.gte_lt]
+ // int32 other_value = 2 [(buf.validate.field).int32 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [int32.gte_lt_exclusive]
+ // int32 another_value = 3 [(buf.validate.field).int32 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte int32 `protobuf:"varint,5,opt,name=gte,oneof"`
+}
+
+func (*Int32Rules_Gt) isInt32Rules_GreaterThan() {}
+
+func (*Int32Rules_Gte) isInt32Rules_GreaterThan() {}
+
+// Int64Rules describes the constraints applied to `int64` values. These
+// rules may also be applied to the `google.protobuf.Int64Value` Well-Known-Type.
+type Int64Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt64 {
+ // // value must equal 42
+ // int64 value = 1 [(buf.validate.field).int64.const = 42];
+ // }
+ //
+ // ```
+ Const *int64 `protobuf:"varint,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *Int64Rules_Lt
+ // *Int64Rules_Lte
+ LessThan isInt64Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *Int64Rules_Gt
+ // *Int64Rules_Gte
+ GreaterThan isInt64Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyInt64 {
+ // // value must be in list [1, 2, 3]
+ // repeated int64 value = 1 (buf.validate.field).int64 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []int64 `protobuf:"varint,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt64 {
+ // // value must not be in list [1, 2, 3]
+ // repeated int64 value = 1 (buf.validate.field).int64 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []int64 `protobuf:"varint,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyInt64 {
+ // int64 value = 1 [
+ // (buf.validate.field).int64.example = 1,
+ // (buf.validate.field).int64.example = -10
+ // ];
+ // }
+ //
+ // ```
+ Example []int64 `protobuf:"varint,9,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *Int64Rules) Reset() {
+ *x = Int64Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *Int64Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Int64Rules) ProtoMessage() {}
+
+func (x *Int64Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[8]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Int64Rules.ProtoReflect.Descriptor instead.
+func (*Int64Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *Int64Rules) GetConst() int64 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *Int64Rules) GetLessThan() isInt64Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *Int64Rules) GetLt() int64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*Int64Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *Int64Rules) GetLte() int64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*Int64Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *Int64Rules) GetGreaterThan() isInt64Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *Int64Rules) GetGt() int64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*Int64Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *Int64Rules) GetGte() int64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*Int64Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *Int64Rules) GetIn() []int64 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *Int64Rules) GetNotIn() []int64 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *Int64Rules) GetExample() []int64 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isInt64Rules_LessThan interface {
+ isInt64Rules_LessThan()
+}
+
+type Int64Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field <
+ // value). If the field value is equal to or greater than the specified value,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt64 {
+ // // value must be less than 10
+ // int64 value = 1 [(buf.validate.field).int64.lt = 10];
+ // }
+ //
+ // ```
+ Lt int64 `protobuf:"varint,2,opt,name=lt,oneof"`
+}
+
+type Int64Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt64 {
+ // // value must be less than or equal to 10
+ // int64 value = 1 [(buf.validate.field).int64.lte = 10];
+ // }
+ //
+ // ```
+ Lte int64 `protobuf:"varint,3,opt,name=lte,oneof"`
+}
+
+func (*Int64Rules_Lt) isInt64Rules_LessThan() {}
+
+func (*Int64Rules_Lte) isInt64Rules_LessThan() {}
+
+type isInt64Rules_GreaterThan interface {
+ isInt64Rules_GreaterThan()
+}
+
+type Int64Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt64 {
+ // // value must be greater than 5 [int64.gt]
+ // int64 value = 1 [(buf.validate.field).int64.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [int64.gt_lt]
+ // int64 other_value = 2 [(buf.validate.field).int64 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [int64.gt_lt_exclusive]
+ // int64 another_value = 3 [(buf.validate.field).int64 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt int64 `protobuf:"varint,4,opt,name=gt,oneof"`
+}
+
+type Int64Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyInt64 {
+ // // value must be greater than or equal to 5 [int64.gte]
+ // int64 value = 1 [(buf.validate.field).int64.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [int64.gte_lt]
+ // int64 other_value = 2 [(buf.validate.field).int64 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [int64.gte_lt_exclusive]
+ // int64 another_value = 3 [(buf.validate.field).int64 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte int64 `protobuf:"varint,5,opt,name=gte,oneof"`
+}
+
+func (*Int64Rules_Gt) isInt64Rules_GreaterThan() {}
+
+func (*Int64Rules_Gte) isInt64Rules_GreaterThan() {}
+
+// UInt32Rules describes the constraints applied to `uint32` values. These
+// rules may also be applied to the `google.protobuf.UInt32Value` Well-Known-Type.
+type UInt32Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt32 {
+ // // value must equal 42
+ // uint32 value = 1 [(buf.validate.field).uint32.const = 42];
+ // }
+ //
+ // ```
+ Const *uint32 `protobuf:"varint,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *UInt32Rules_Lt
+ // *UInt32Rules_Lte
+ LessThan isUInt32Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *UInt32Rules_Gt
+ // *UInt32Rules_Gte
+ GreaterThan isUInt32Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyUInt32 {
+ // // value must be in list [1, 2, 3]
+ // repeated uint32 value = 1 (buf.validate.field).uint32 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []uint32 `protobuf:"varint,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt32 {
+ // // value must not be in list [1, 2, 3]
+ // repeated uint32 value = 1 (buf.validate.field).uint32 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []uint32 `protobuf:"varint,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyUInt32 {
+ // uint32 value = 1 [
+ // (buf.validate.field).uint32.example = 1,
+ // (buf.validate.field).uint32.example = 10
+ // ];
+ // }
+ //
+ // ```
+ Example []uint32 `protobuf:"varint,8,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *UInt32Rules) Reset() {
+ *x = UInt32Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *UInt32Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UInt32Rules) ProtoMessage() {}
+
+func (x *UInt32Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[9]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use UInt32Rules.ProtoReflect.Descriptor instead.
+func (*UInt32Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *UInt32Rules) GetConst() uint32 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *UInt32Rules) GetLessThan() isUInt32Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *UInt32Rules) GetLt() uint32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*UInt32Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *UInt32Rules) GetLte() uint32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*UInt32Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *UInt32Rules) GetGreaterThan() isUInt32Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *UInt32Rules) GetGt() uint32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*UInt32Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *UInt32Rules) GetGte() uint32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*UInt32Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *UInt32Rules) GetIn() []uint32 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *UInt32Rules) GetNotIn() []uint32 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *UInt32Rules) GetExample() []uint32 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isUInt32Rules_LessThan interface {
+ isUInt32Rules_LessThan()
+}
+
+type UInt32Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field <
+ // value). If the field value is equal to or greater than the specified value,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt32 {
+ // // value must be less than 10
+ // uint32 value = 1 [(buf.validate.field).uint32.lt = 10];
+ // }
+ //
+ // ```
+ Lt uint32 `protobuf:"varint,2,opt,name=lt,oneof"`
+}
+
+type UInt32Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt32 {
+ // // value must be less than or equal to 10
+ // uint32 value = 1 [(buf.validate.field).uint32.lte = 10];
+ // }
+ //
+ // ```
+ Lte uint32 `protobuf:"varint,3,opt,name=lte,oneof"`
+}
+
+func (*UInt32Rules_Lt) isUInt32Rules_LessThan() {}
+
+func (*UInt32Rules_Lte) isUInt32Rules_LessThan() {}
+
+type isUInt32Rules_GreaterThan interface {
+ isUInt32Rules_GreaterThan()
+}
+
+type UInt32Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt32 {
+ // // value must be greater than 5 [uint32.gt]
+ // uint32 value = 1 [(buf.validate.field).uint32.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [uint32.gt_lt]
+ // uint32 other_value = 2 [(buf.validate.field).uint32 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [uint32.gt_lt_exclusive]
+ // uint32 another_value = 3 [(buf.validate.field).uint32 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt uint32 `protobuf:"varint,4,opt,name=gt,oneof"`
+}
+
+type UInt32Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt32 {
+ // // value must be greater than or equal to 5 [uint32.gte]
+ // uint32 value = 1 [(buf.validate.field).uint32.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [uint32.gte_lt]
+ // uint32 other_value = 2 [(buf.validate.field).uint32 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [uint32.gte_lt_exclusive]
+ // uint32 another_value = 3 [(buf.validate.field).uint32 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte uint32 `protobuf:"varint,5,opt,name=gte,oneof"`
+}
+
+func (*UInt32Rules_Gt) isUInt32Rules_GreaterThan() {}
+
+func (*UInt32Rules_Gte) isUInt32Rules_GreaterThan() {}
+
+// UInt64Rules describes the constraints applied to `uint64` values. These
+// rules may also be applied to the `google.protobuf.UInt64Value` Well-Known-Type.
+type UInt64Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt64 {
+ // // value must equal 42
+ // uint64 value = 1 [(buf.validate.field).uint64.const = 42];
+ // }
+ //
+ // ```
+ Const *uint64 `protobuf:"varint,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *UInt64Rules_Lt
+ // *UInt64Rules_Lte
+ LessThan isUInt64Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *UInt64Rules_Gt
+ // *UInt64Rules_Gte
+ GreaterThan isUInt64Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyUInt64 {
+ // // value must be in list [1, 2, 3]
+ // repeated uint64 value = 1 (buf.validate.field).uint64 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []uint64 `protobuf:"varint,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt64 {
+ // // value must not be in list [1, 2, 3]
+ // repeated uint64 value = 1 (buf.validate.field).uint64 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []uint64 `protobuf:"varint,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyUInt64 {
+ // uint64 value = 1 [
+ // (buf.validate.field).uint64.example = 1,
+ // (buf.validate.field).uint64.example = -10
+ // ];
+ // }
+ //
+ // ```
+ Example []uint64 `protobuf:"varint,8,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *UInt64Rules) Reset() {
+ *x = UInt64Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *UInt64Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UInt64Rules) ProtoMessage() {}
+
+func (x *UInt64Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[10]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use UInt64Rules.ProtoReflect.Descriptor instead.
+func (*UInt64Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *UInt64Rules) GetConst() uint64 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *UInt64Rules) GetLessThan() isUInt64Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *UInt64Rules) GetLt() uint64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*UInt64Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *UInt64Rules) GetLte() uint64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*UInt64Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *UInt64Rules) GetGreaterThan() isUInt64Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *UInt64Rules) GetGt() uint64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*UInt64Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *UInt64Rules) GetGte() uint64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*UInt64Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *UInt64Rules) GetIn() []uint64 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *UInt64Rules) GetNotIn() []uint64 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *UInt64Rules) GetExample() []uint64 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isUInt64Rules_LessThan interface {
+ isUInt64Rules_LessThan()
+}
+
+type UInt64Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field <
+ // value). If the field value is equal to or greater than the specified value,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt64 {
+ // // value must be less than 10
+ // uint64 value = 1 [(buf.validate.field).uint64.lt = 10];
+ // }
+ //
+ // ```
+ Lt uint64 `protobuf:"varint,2,opt,name=lt,oneof"`
+}
+
+type UInt64Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt64 {
+ // // value must be less than or equal to 10
+ // uint64 value = 1 [(buf.validate.field).uint64.lte = 10];
+ // }
+ //
+ // ```
+ Lte uint64 `protobuf:"varint,3,opt,name=lte,oneof"`
+}
+
+func (*UInt64Rules_Lt) isUInt64Rules_LessThan() {}
+
+func (*UInt64Rules_Lte) isUInt64Rules_LessThan() {}
+
+type isUInt64Rules_GreaterThan interface {
+ isUInt64Rules_GreaterThan()
+}
+
+type UInt64Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt64 {
+ // // value must be greater than 5 [uint64.gt]
+ // uint64 value = 1 [(buf.validate.field).uint64.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [uint64.gt_lt]
+ // uint64 other_value = 2 [(buf.validate.field).uint64 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [uint64.gt_lt_exclusive]
+ // uint64 another_value = 3 [(buf.validate.field).uint64 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt uint64 `protobuf:"varint,4,opt,name=gt,oneof"`
+}
+
+type UInt64Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyUInt64 {
+ // // value must be greater than or equal to 5 [uint64.gte]
+ // uint64 value = 1 [(buf.validate.field).uint64.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [uint64.gte_lt]
+ // uint64 other_value = 2 [(buf.validate.field).uint64 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [uint64.gte_lt_exclusive]
+ // uint64 another_value = 3 [(buf.validate.field).uint64 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte uint64 `protobuf:"varint,5,opt,name=gte,oneof"`
+}
+
+func (*UInt64Rules_Gt) isUInt64Rules_GreaterThan() {}
+
+func (*UInt64Rules_Gte) isUInt64Rules_GreaterThan() {}
+
+// SInt32Rules describes the constraints applied to `sint32` values.
+type SInt32Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt32 {
+ // // value must equal 42
+ // sint32 value = 1 [(buf.validate.field).sint32.const = 42];
+ // }
+ //
+ // ```
+ Const *int32 `protobuf:"zigzag32,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *SInt32Rules_Lt
+ // *SInt32Rules_Lte
+ LessThan isSInt32Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *SInt32Rules_Gt
+ // *SInt32Rules_Gte
+ GreaterThan isSInt32Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MySInt32 {
+ // // value must be in list [1, 2, 3]
+ // repeated sint32 value = 1 (buf.validate.field).sint32 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []int32 `protobuf:"zigzag32,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt32 {
+ // // value must not be in list [1, 2, 3]
+ // repeated sint32 value = 1 (buf.validate.field).sint32 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []int32 `protobuf:"zigzag32,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MySInt32 {
+ // sint32 value = 1 [
+ // (buf.validate.field).sint32.example = 1,
+ // (buf.validate.field).sint32.example = -10
+ // ];
+ // }
+ //
+ // ```
+ Example []int32 `protobuf:"zigzag32,8,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *SInt32Rules) Reset() {
+ *x = SInt32Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[11]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *SInt32Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SInt32Rules) ProtoMessage() {}
+
+func (x *SInt32Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[11]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SInt32Rules.ProtoReflect.Descriptor instead.
+func (*SInt32Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *SInt32Rules) GetConst() int32 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *SInt32Rules) GetLessThan() isSInt32Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *SInt32Rules) GetLt() int32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*SInt32Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *SInt32Rules) GetLte() int32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*SInt32Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *SInt32Rules) GetGreaterThan() isSInt32Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *SInt32Rules) GetGt() int32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*SInt32Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *SInt32Rules) GetGte() int32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*SInt32Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *SInt32Rules) GetIn() []int32 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *SInt32Rules) GetNotIn() []int32 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *SInt32Rules) GetExample() []int32 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isSInt32Rules_LessThan interface {
+ isSInt32Rules_LessThan()
+}
+
+type SInt32Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field
+ // < value). If the field value is equal to or greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt32 {
+ // // value must be less than 10
+ // sint32 value = 1 [(buf.validate.field).sint32.lt = 10];
+ // }
+ //
+ // ```
+ Lt int32 `protobuf:"zigzag32,2,opt,name=lt,oneof"`
+}
+
+type SInt32Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt32 {
+ // // value must be less than or equal to 10
+ // sint32 value = 1 [(buf.validate.field).sint32.lte = 10];
+ // }
+ //
+ // ```
+ Lte int32 `protobuf:"zigzag32,3,opt,name=lte,oneof"`
+}
+
+func (*SInt32Rules_Lt) isSInt32Rules_LessThan() {}
+
+func (*SInt32Rules_Lte) isSInt32Rules_LessThan() {}
+
+type isSInt32Rules_GreaterThan interface {
+ isSInt32Rules_GreaterThan()
+}
+
+type SInt32Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt32 {
+ // // value must be greater than 5 [sint32.gt]
+ // sint32 value = 1 [(buf.validate.field).sint32.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [sint32.gt_lt]
+ // sint32 other_value = 2 [(buf.validate.field).sint32 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [sint32.gt_lt_exclusive]
+ // sint32 another_value = 3 [(buf.validate.field).sint32 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt int32 `protobuf:"zigzag32,4,opt,name=gt,oneof"`
+}
+
+type SInt32Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt32 {
+ // // value must be greater than or equal to 5 [sint32.gte]
+ // sint32 value = 1 [(buf.validate.field).sint32.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [sint32.gte_lt]
+ // sint32 other_value = 2 [(buf.validate.field).sint32 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [sint32.gte_lt_exclusive]
+ // sint32 another_value = 3 [(buf.validate.field).sint32 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte int32 `protobuf:"zigzag32,5,opt,name=gte,oneof"`
+}
+
+func (*SInt32Rules_Gt) isSInt32Rules_GreaterThan() {}
+
+func (*SInt32Rules_Gte) isSInt32Rules_GreaterThan() {}
+
+// SInt64Rules describes the constraints applied to `sint64` values.
+type SInt64Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt64 {
+ // // value must equal 42
+ // sint64 value = 1 [(buf.validate.field).sint64.const = 42];
+ // }
+ //
+ // ```
+ Const *int64 `protobuf:"zigzag64,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *SInt64Rules_Lt
+ // *SInt64Rules_Lte
+ LessThan isSInt64Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *SInt64Rules_Gt
+ // *SInt64Rules_Gte
+ GreaterThan isSInt64Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message
+ // is generated.
+ //
+ // ```proto
+ //
+ // message MySInt64 {
+ // // value must be in list [1, 2, 3]
+ // repeated sint64 value = 1 (buf.validate.field).sint64 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []int64 `protobuf:"zigzag64,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt64 {
+ // // value must not be in list [1, 2, 3]
+ // repeated sint64 value = 1 (buf.validate.field).sint64 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []int64 `protobuf:"zigzag64,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MySInt64 {
+ // sint64 value = 1 [
+ // (buf.validate.field).sint64.example = 1,
+ // (buf.validate.field).sint64.example = -10
+ // ];
+ // }
+ //
+ // ```
+ Example []int64 `protobuf:"zigzag64,8,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *SInt64Rules) Reset() {
+ *x = SInt64Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[12]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *SInt64Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SInt64Rules) ProtoMessage() {}
+
+func (x *SInt64Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[12]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SInt64Rules.ProtoReflect.Descriptor instead.
+func (*SInt64Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *SInt64Rules) GetConst() int64 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *SInt64Rules) GetLessThan() isSInt64Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *SInt64Rules) GetLt() int64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*SInt64Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *SInt64Rules) GetLte() int64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*SInt64Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *SInt64Rules) GetGreaterThan() isSInt64Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *SInt64Rules) GetGt() int64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*SInt64Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *SInt64Rules) GetGte() int64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*SInt64Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *SInt64Rules) GetIn() []int64 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *SInt64Rules) GetNotIn() []int64 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *SInt64Rules) GetExample() []int64 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isSInt64Rules_LessThan interface {
+ isSInt64Rules_LessThan()
+}
+
+type SInt64Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field
+ // < value). If the field value is equal to or greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt64 {
+ // // value must be less than 10
+ // sint64 value = 1 [(buf.validate.field).sint64.lt = 10];
+ // }
+ //
+ // ```
+ Lt int64 `protobuf:"zigzag64,2,opt,name=lt,oneof"`
+}
+
+type SInt64Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt64 {
+ // // value must be less than or equal to 10
+ // sint64 value = 1 [(buf.validate.field).sint64.lte = 10];
+ // }
+ //
+ // ```
+ Lte int64 `protobuf:"zigzag64,3,opt,name=lte,oneof"`
+}
+
+func (*SInt64Rules_Lt) isSInt64Rules_LessThan() {}
+
+func (*SInt64Rules_Lte) isSInt64Rules_LessThan() {}
+
+type isSInt64Rules_GreaterThan interface {
+ isSInt64Rules_GreaterThan()
+}
+
+type SInt64Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt64 {
+ // // value must be greater than 5 [sint64.gt]
+ // sint64 value = 1 [(buf.validate.field).sint64.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [sint64.gt_lt]
+ // sint64 other_value = 2 [(buf.validate.field).sint64 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [sint64.gt_lt_exclusive]
+ // sint64 another_value = 3 [(buf.validate.field).sint64 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt int64 `protobuf:"zigzag64,4,opt,name=gt,oneof"`
+}
+
+type SInt64Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySInt64 {
+ // // value must be greater than or equal to 5 [sint64.gte]
+ // sint64 value = 1 [(buf.validate.field).sint64.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [sint64.gte_lt]
+ // sint64 other_value = 2 [(buf.validate.field).sint64 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [sint64.gte_lt_exclusive]
+ // sint64 another_value = 3 [(buf.validate.field).sint64 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte int64 `protobuf:"zigzag64,5,opt,name=gte,oneof"`
+}
+
+func (*SInt64Rules_Gt) isSInt64Rules_GreaterThan() {}
+
+func (*SInt64Rules_Gte) isSInt64Rules_GreaterThan() {}
+
+// Fixed32Rules describes the constraints applied to `fixed32` values.
+type Fixed32Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value.
+ // If the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed32 {
+ // // value must equal 42
+ // fixed32 value = 1 [(buf.validate.field).fixed32.const = 42];
+ // }
+ //
+ // ```
+ Const *uint32 `protobuf:"fixed32,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *Fixed32Rules_Lt
+ // *Fixed32Rules_Lte
+ LessThan isFixed32Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *Fixed32Rules_Gt
+ // *Fixed32Rules_Gte
+ GreaterThan isFixed32Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message
+ // is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed32 {
+ // // value must be in list [1, 2, 3]
+ // repeated fixed32 value = 1 (buf.validate.field).fixed32 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []uint32 `protobuf:"fixed32,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed32 {
+ // // value must not be in list [1, 2, 3]
+ // repeated fixed32 value = 1 (buf.validate.field).fixed32 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []uint32 `protobuf:"fixed32,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyFixed32 {
+ // fixed32 value = 1 [
+ // (buf.validate.field).fixed32.example = 1,
+ // (buf.validate.field).fixed32.example = 2
+ // ];
+ // }
+ //
+ // ```
+ Example []uint32 `protobuf:"fixed32,8,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *Fixed32Rules) Reset() {
+ *x = Fixed32Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[13]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *Fixed32Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Fixed32Rules) ProtoMessage() {}
+
+func (x *Fixed32Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[13]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Fixed32Rules.ProtoReflect.Descriptor instead.
+func (*Fixed32Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *Fixed32Rules) GetConst() uint32 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *Fixed32Rules) GetLessThan() isFixed32Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *Fixed32Rules) GetLt() uint32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*Fixed32Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *Fixed32Rules) GetLte() uint32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*Fixed32Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *Fixed32Rules) GetGreaterThan() isFixed32Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *Fixed32Rules) GetGt() uint32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*Fixed32Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *Fixed32Rules) GetGte() uint32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*Fixed32Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *Fixed32Rules) GetIn() []uint32 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *Fixed32Rules) GetNotIn() []uint32 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *Fixed32Rules) GetExample() []uint32 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isFixed32Rules_LessThan interface {
+ isFixed32Rules_LessThan()
+}
+
+type Fixed32Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field <
+ // value). If the field value is equal to or greater than the specified value,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed32 {
+ // // value must be less than 10
+ // fixed32 value = 1 [(buf.validate.field).fixed32.lt = 10];
+ // }
+ //
+ // ```
+ Lt uint32 `protobuf:"fixed32,2,opt,name=lt,oneof"`
+}
+
+type Fixed32Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed32 {
+ // // value must be less than or equal to 10
+ // fixed32 value = 1 [(buf.validate.field).fixed32.lte = 10];
+ // }
+ //
+ // ```
+ Lte uint32 `protobuf:"fixed32,3,opt,name=lte,oneof"`
+}
+
+func (*Fixed32Rules_Lt) isFixed32Rules_LessThan() {}
+
+func (*Fixed32Rules_Lte) isFixed32Rules_LessThan() {}
+
+type isFixed32Rules_GreaterThan interface {
+ isFixed32Rules_GreaterThan()
+}
+
+type Fixed32Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed32 {
+ // // value must be greater than 5 [fixed32.gt]
+ // fixed32 value = 1 [(buf.validate.field).fixed32.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [fixed32.gt_lt]
+ // fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [fixed32.gt_lt_exclusive]
+ // fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt uint32 `protobuf:"fixed32,4,opt,name=gt,oneof"`
+}
+
+type Fixed32Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed32 {
+ // // value must be greater than or equal to 5 [fixed32.gte]
+ // fixed32 value = 1 [(buf.validate.field).fixed32.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [fixed32.gte_lt]
+ // fixed32 other_value = 2 [(buf.validate.field).fixed32 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [fixed32.gte_lt_exclusive]
+ // fixed32 another_value = 3 [(buf.validate.field).fixed32 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte uint32 `protobuf:"fixed32,5,opt,name=gte,oneof"`
+}
+
+func (*Fixed32Rules_Gt) isFixed32Rules_GreaterThan() {}
+
+func (*Fixed32Rules_Gte) isFixed32Rules_GreaterThan() {}
+
+// Fixed64Rules describes the constraints applied to `fixed64` values.
+type Fixed64Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed64 {
+ // // value must equal 42
+ // fixed64 value = 1 [(buf.validate.field).fixed64.const = 42];
+ // }
+ //
+ // ```
+ Const *uint64 `protobuf:"fixed64,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *Fixed64Rules_Lt
+ // *Fixed64Rules_Lte
+ LessThan isFixed64Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *Fixed64Rules_Gt
+ // *Fixed64Rules_Gte
+ GreaterThan isFixed64Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyFixed64 {
+ // // value must be in list [1, 2, 3]
+ // repeated fixed64 value = 1 (buf.validate.field).fixed64 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []uint64 `protobuf:"fixed64,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed64 {
+ // // value must not be in list [1, 2, 3]
+ // repeated fixed64 value = 1 (buf.validate.field).fixed64 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []uint64 `protobuf:"fixed64,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyFixed64 {
+ // fixed64 value = 1 [
+ // (buf.validate.field).fixed64.example = 1,
+ // (buf.validate.field).fixed64.example = 2
+ // ];
+ // }
+ //
+ // ```
+ Example []uint64 `protobuf:"fixed64,8,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *Fixed64Rules) Reset() {
+ *x = Fixed64Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[14]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *Fixed64Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Fixed64Rules) ProtoMessage() {}
+
+func (x *Fixed64Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[14]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Fixed64Rules.ProtoReflect.Descriptor instead.
+func (*Fixed64Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *Fixed64Rules) GetConst() uint64 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *Fixed64Rules) GetLessThan() isFixed64Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *Fixed64Rules) GetLt() uint64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*Fixed64Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *Fixed64Rules) GetLte() uint64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*Fixed64Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *Fixed64Rules) GetGreaterThan() isFixed64Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *Fixed64Rules) GetGt() uint64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*Fixed64Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *Fixed64Rules) GetGte() uint64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*Fixed64Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *Fixed64Rules) GetIn() []uint64 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *Fixed64Rules) GetNotIn() []uint64 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *Fixed64Rules) GetExample() []uint64 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isFixed64Rules_LessThan interface {
+ isFixed64Rules_LessThan()
+}
+
+type Fixed64Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field <
+ // value). If the field value is equal to or greater than the specified value,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed64 {
+ // // value must be less than 10
+ // fixed64 value = 1 [(buf.validate.field).fixed64.lt = 10];
+ // }
+ //
+ // ```
+ Lt uint64 `protobuf:"fixed64,2,opt,name=lt,oneof"`
+}
+
+type Fixed64Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed64 {
+ // // value must be less than or equal to 10
+ // fixed64 value = 1 [(buf.validate.field).fixed64.lte = 10];
+ // }
+ //
+ // ```
+ Lte uint64 `protobuf:"fixed64,3,opt,name=lte,oneof"`
+}
+
+func (*Fixed64Rules_Lt) isFixed64Rules_LessThan() {}
+
+func (*Fixed64Rules_Lte) isFixed64Rules_LessThan() {}
+
+type isFixed64Rules_GreaterThan interface {
+ isFixed64Rules_GreaterThan()
+}
+
+type Fixed64Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed64 {
+ // // value must be greater than 5 [fixed64.gt]
+ // fixed64 value = 1 [(buf.validate.field).fixed64.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [fixed64.gt_lt]
+ // fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [fixed64.gt_lt_exclusive]
+ // fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt uint64 `protobuf:"fixed64,4,opt,name=gt,oneof"`
+}
+
+type Fixed64Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyFixed64 {
+ // // value must be greater than or equal to 5 [fixed64.gte]
+ // fixed64 value = 1 [(buf.validate.field).fixed64.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [fixed64.gte_lt]
+ // fixed64 other_value = 2 [(buf.validate.field).fixed64 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [fixed64.gte_lt_exclusive]
+ // fixed64 another_value = 3 [(buf.validate.field).fixed64 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte uint64 `protobuf:"fixed64,5,opt,name=gte,oneof"`
+}
+
+func (*Fixed64Rules_Gt) isFixed64Rules_GreaterThan() {}
+
+func (*Fixed64Rules_Gte) isFixed64Rules_GreaterThan() {}
+
+// SFixed32Rules describes the constraints applied to `fixed32` values.
+type SFixed32Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed32 {
+ // // value must equal 42
+ // sfixed32 value = 1 [(buf.validate.field).sfixed32.const = 42];
+ // }
+ //
+ // ```
+ Const *int32 `protobuf:"fixed32,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *SFixed32Rules_Lt
+ // *SFixed32Rules_Lte
+ LessThan isSFixed32Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *SFixed32Rules_Gt
+ // *SFixed32Rules_Gte
+ GreaterThan isSFixed32Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MySFixed32 {
+ // // value must be in list [1, 2, 3]
+ // repeated sfixed32 value = 1 (buf.validate.field).sfixed32 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []int32 `protobuf:"fixed32,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed32 {
+ // // value must not be in list [1, 2, 3]
+ // repeated sfixed32 value = 1 (buf.validate.field).sfixed32 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []int32 `protobuf:"fixed32,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MySFixed32 {
+ // sfixed32 value = 1 [
+ // (buf.validate.field).sfixed32.example = 1,
+ // (buf.validate.field).sfixed32.example = 2
+ // ];
+ // }
+ //
+ // ```
+ Example []int32 `protobuf:"fixed32,8,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *SFixed32Rules) Reset() {
+ *x = SFixed32Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[15]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *SFixed32Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SFixed32Rules) ProtoMessage() {}
+
+func (x *SFixed32Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[15]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SFixed32Rules.ProtoReflect.Descriptor instead.
+func (*SFixed32Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *SFixed32Rules) GetConst() int32 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *SFixed32Rules) GetLessThan() isSFixed32Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *SFixed32Rules) GetLt() int32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*SFixed32Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *SFixed32Rules) GetLte() int32 {
+ if x != nil {
+ if x, ok := x.LessThan.(*SFixed32Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *SFixed32Rules) GetGreaterThan() isSFixed32Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *SFixed32Rules) GetGt() int32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*SFixed32Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *SFixed32Rules) GetGte() int32 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*SFixed32Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *SFixed32Rules) GetIn() []int32 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *SFixed32Rules) GetNotIn() []int32 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *SFixed32Rules) GetExample() []int32 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isSFixed32Rules_LessThan interface {
+ isSFixed32Rules_LessThan()
+}
+
+type SFixed32Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field <
+ // value). If the field value is equal to or greater than the specified value,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed32 {
+ // // value must be less than 10
+ // sfixed32 value = 1 [(buf.validate.field).sfixed32.lt = 10];
+ // }
+ //
+ // ```
+ Lt int32 `protobuf:"fixed32,2,opt,name=lt,oneof"`
+}
+
+type SFixed32Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed32 {
+ // // value must be less than or equal to 10
+ // sfixed32 value = 1 [(buf.validate.field).sfixed32.lte = 10];
+ // }
+ //
+ // ```
+ Lte int32 `protobuf:"fixed32,3,opt,name=lte,oneof"`
+}
+
+func (*SFixed32Rules_Lt) isSFixed32Rules_LessThan() {}
+
+func (*SFixed32Rules_Lte) isSFixed32Rules_LessThan() {}
+
+type isSFixed32Rules_GreaterThan interface {
+ isSFixed32Rules_GreaterThan()
+}
+
+type SFixed32Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed32 {
+ // // value must be greater than 5 [sfixed32.gt]
+ // sfixed32 value = 1 [(buf.validate.field).sfixed32.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [sfixed32.gt_lt]
+ // sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [sfixed32.gt_lt_exclusive]
+ // sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt int32 `protobuf:"fixed32,4,opt,name=gt,oneof"`
+}
+
+type SFixed32Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed32 {
+ // // value must be greater than or equal to 5 [sfixed32.gte]
+ // sfixed32 value = 1 [(buf.validate.field).sfixed32.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [sfixed32.gte_lt]
+ // sfixed32 other_value = 2 [(buf.validate.field).sfixed32 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [sfixed32.gte_lt_exclusive]
+ // sfixed32 another_value = 3 [(buf.validate.field).sfixed32 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte int32 `protobuf:"fixed32,5,opt,name=gte,oneof"`
+}
+
+func (*SFixed32Rules_Gt) isSFixed32Rules_GreaterThan() {}
+
+func (*SFixed32Rules_Gte) isSFixed32Rules_GreaterThan() {}
+
+// SFixed64Rules describes the constraints applied to `fixed64` values.
+type SFixed64Rules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed64 {
+ // // value must equal 42
+ // sfixed64 value = 1 [(buf.validate.field).sfixed64.const = 42];
+ // }
+ //
+ // ```
+ Const *int64 `protobuf:"fixed64,1,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *SFixed64Rules_Lt
+ // *SFixed64Rules_Lte
+ LessThan isSFixed64Rules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *SFixed64Rules_Gt
+ // *SFixed64Rules_Gte
+ GreaterThan isSFixed64Rules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` requires the field value to be equal to one of the specified values.
+ // If the field value isn't one of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MySFixed64 {
+ // // value must be in list [1, 2, 3]
+ // repeated sfixed64 value = 1 (buf.validate.field).sfixed64 = { in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ In []int64 `protobuf:"fixed64,6,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to not be equal to any of the specified
+ // values. If the field value is one of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed64 {
+ // // value must not be in list [1, 2, 3]
+ // repeated sfixed64 value = 1 (buf.validate.field).sfixed64 = { not_in: [1, 2, 3] };
+ // }
+ //
+ // ```
+ NotIn []int64 `protobuf:"fixed64,7,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MySFixed64 {
+ // sfixed64 value = 1 [
+ // (buf.validate.field).sfixed64.example = 1,
+ // (buf.validate.field).sfixed64.example = 2
+ // ];
+ // }
+ //
+ // ```
+ Example []int64 `protobuf:"fixed64,8,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *SFixed64Rules) Reset() {
+ *x = SFixed64Rules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[16]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *SFixed64Rules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SFixed64Rules) ProtoMessage() {}
+
+func (x *SFixed64Rules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[16]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SFixed64Rules.ProtoReflect.Descriptor instead.
+func (*SFixed64Rules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *SFixed64Rules) GetConst() int64 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *SFixed64Rules) GetLessThan() isSFixed64Rules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *SFixed64Rules) GetLt() int64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*SFixed64Rules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return 0
+}
+
+func (x *SFixed64Rules) GetLte() int64 {
+ if x != nil {
+ if x, ok := x.LessThan.(*SFixed64Rules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return 0
+}
+
+func (x *SFixed64Rules) GetGreaterThan() isSFixed64Rules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *SFixed64Rules) GetGt() int64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*SFixed64Rules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return 0
+}
+
+func (x *SFixed64Rules) GetGte() int64 {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*SFixed64Rules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return 0
+}
+
+func (x *SFixed64Rules) GetIn() []int64 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *SFixed64Rules) GetNotIn() []int64 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *SFixed64Rules) GetExample() []int64 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isSFixed64Rules_LessThan interface {
+ isSFixed64Rules_LessThan()
+}
+
+type SFixed64Rules_Lt struct {
+ // `lt` requires the field value to be less than the specified value (field <
+ // value). If the field value is equal to or greater than the specified value,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed64 {
+ // // value must be less than 10
+ // sfixed64 value = 1 [(buf.validate.field).sfixed64.lt = 10];
+ // }
+ //
+ // ```
+ Lt int64 `protobuf:"fixed64,2,opt,name=lt,oneof"`
+}
+
+type SFixed64Rules_Lte struct {
+ // `lte` requires the field value to be less than or equal to the specified
+ // value (field <= value). If the field value is greater than the specified
+ // value, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed64 {
+ // // value must be less than or equal to 10
+ // sfixed64 value = 1 [(buf.validate.field).sfixed64.lte = 10];
+ // }
+ //
+ // ```
+ Lte int64 `protobuf:"fixed64,3,opt,name=lte,oneof"`
+}
+
+func (*SFixed64Rules_Lt) isSFixed64Rules_LessThan() {}
+
+func (*SFixed64Rules_Lte) isSFixed64Rules_LessThan() {}
+
+type isSFixed64Rules_GreaterThan interface {
+ isSFixed64Rules_GreaterThan()
+}
+
+type SFixed64Rules_Gt struct {
+ // `gt` requires the field value to be greater than the specified value
+ // (exclusive). If the value of `gt` is larger than a specified `lt` or
+ // `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed64 {
+ // // value must be greater than 5 [sfixed64.gt]
+ // sfixed64 value = 1 [(buf.validate.field).sfixed64.gt = 5];
+ //
+ // // value must be greater than 5 and less than 10 [sfixed64.gt_lt]
+ // sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gt: 5, lt: 10 }];
+ //
+ // // value must be greater than 10 or less than 5 [sfixed64.gt_lt_exclusive]
+ // sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gt: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gt int64 `protobuf:"fixed64,4,opt,name=gt,oneof"`
+}
+
+type SFixed64Rules_Gte struct {
+ // `gte` requires the field value to be greater than or equal to the specified
+ // value (exclusive). If the value of `gte` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MySFixed64 {
+ // // value must be greater than or equal to 5 [sfixed64.gte]
+ // sfixed64 value = 1 [(buf.validate.field).sfixed64.gte = 5];
+ //
+ // // value must be greater than or equal to 5 and less than 10 [sfixed64.gte_lt]
+ // sfixed64 other_value = 2 [(buf.validate.field).sfixed64 = { gte: 5, lt: 10 }];
+ //
+ // // value must be greater than or equal to 10 or less than 5 [sfixed64.gte_lt_exclusive]
+ // sfixed64 another_value = 3 [(buf.validate.field).sfixed64 = { gte: 10, lt: 5 }];
+ // }
+ //
+ // ```
+ Gte int64 `protobuf:"fixed64,5,opt,name=gte,oneof"`
+}
+
+func (*SFixed64Rules_Gt) isSFixed64Rules_GreaterThan() {}
+
+func (*SFixed64Rules_Gte) isSFixed64Rules_GreaterThan() {}
+
+// BoolRules describes the constraints applied to `bool` values. These rules
+// may also be applied to the `google.protobuf.BoolValue` Well-Known-Type.
+type BoolRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified boolean value.
+ // If the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBool {
+ // // value must equal true
+ // bool value = 1 [(buf.validate.field).bool.const = true];
+ // }
+ //
+ // ```
+ Const *bool `protobuf:"varint,1,opt,name=const" json:"const,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyBool {
+ // bool value = 1 [
+ // (buf.validate.field).bool.example = 1,
+ // (buf.validate.field).bool.example = 2
+ // ];
+ // }
+ //
+ // ```
+ Example []bool `protobuf:"varint,2,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *BoolRules) Reset() {
+ *x = BoolRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[17]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *BoolRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BoolRules) ProtoMessage() {}
+
+func (x *BoolRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[17]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use BoolRules.ProtoReflect.Descriptor instead.
+func (*BoolRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *BoolRules) GetConst() bool {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return false
+}
+
+func (x *BoolRules) GetExample() []bool {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+// StringRules describes the constraints applied to `string` values These
+// rules may also be applied to the `google.protobuf.StringValue` Well-Known-Type.
+type StringRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified value. If
+ // the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must equal `hello`
+ // string value = 1 [(buf.validate.field).string.const = "hello"];
+ // }
+ //
+ // ```
+ Const *string `protobuf:"bytes,1,opt,name=const" json:"const,omitempty"`
+ // `len` dictates that the field value must have the specified
+ // number of characters (Unicode code points), which may differ from the number
+ // of bytes in the string. If the field value does not meet the specified
+ // length, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value length must be 5 characters
+ // string value = 1 [(buf.validate.field).string.len = 5];
+ // }
+ //
+ // ```
+ Len *uint64 `protobuf:"varint,19,opt,name=len" json:"len,omitempty"`
+ // `min_len` specifies that the field value must have at least the specified
+ // number of characters (Unicode code points), which may differ from the number
+ // of bytes in the string. If the field value contains fewer characters, an error
+ // message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value length must be at least 3 characters
+ // string value = 1 [(buf.validate.field).string.min_len = 3];
+ // }
+ //
+ // ```
+ MinLen *uint64 `protobuf:"varint,2,opt,name=min_len,json=minLen" json:"min_len,omitempty"`
+ // `max_len` specifies that the field value must have no more than the specified
+ // number of characters (Unicode code points), which may differ from the
+ // number of bytes in the string. If the field value contains more characters,
+ // an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value length must be at most 10 characters
+ // string value = 1 [(buf.validate.field).string.max_len = 10];
+ // }
+ //
+ // ```
+ MaxLen *uint64 `protobuf:"varint,3,opt,name=max_len,json=maxLen" json:"max_len,omitempty"`
+ // `len_bytes` dictates that the field value must have the specified number of
+ // bytes. If the field value does not match the specified length in bytes,
+ // an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value length must be 6 bytes
+ // string value = 1 [(buf.validate.field).string.len_bytes = 6];
+ // }
+ //
+ // ```
+ LenBytes *uint64 `protobuf:"varint,20,opt,name=len_bytes,json=lenBytes" json:"len_bytes,omitempty"`
+ // `min_bytes` specifies that the field value must have at least the specified
+ // number of bytes. If the field value contains fewer bytes, an error message
+ // will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value length must be at least 4 bytes
+ // string value = 1 [(buf.validate.field).string.min_bytes = 4];
+ // }
+ //
+ // ```
+ MinBytes *uint64 `protobuf:"varint,4,opt,name=min_bytes,json=minBytes" json:"min_bytes,omitempty"`
+ // `max_bytes` specifies that the field value must have no more than the
+ // specified number of bytes. If the field value contains more bytes, an
+ // error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value length must be at most 8 bytes
+ // string value = 1 [(buf.validate.field).string.max_bytes = 8];
+ // }
+ //
+ // ```
+ MaxBytes *uint64 `protobuf:"varint,5,opt,name=max_bytes,json=maxBytes" json:"max_bytes,omitempty"`
+ // `pattern` specifies that the field value must match the specified
+ // regular expression (RE2 syntax), with the expression provided without any
+ // delimiters. If the field value doesn't match the regular expression, an
+ // error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value does not match regex pattern `^[a-zA-Z]//$`
+ // string value = 1 [(buf.validate.field).string.pattern = "^[a-zA-Z]//$"];
+ // }
+ //
+ // ```
+ Pattern *string `protobuf:"bytes,6,opt,name=pattern" json:"pattern,omitempty"`
+ // `prefix` specifies that the field value must have the
+ // specified substring at the beginning of the string. If the field value
+ // doesn't start with the specified prefix, an error message will be
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value does not have prefix `pre`
+ // string value = 1 [(buf.validate.field).string.prefix = "pre"];
+ // }
+ //
+ // ```
+ Prefix *string `protobuf:"bytes,7,opt,name=prefix" json:"prefix,omitempty"`
+ // `suffix` specifies that the field value must have the
+ // specified substring at the end of the string. If the field value doesn't
+ // end with the specified suffix, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value does not have suffix `post`
+ // string value = 1 [(buf.validate.field).string.suffix = "post"];
+ // }
+ //
+ // ```
+ Suffix *string `protobuf:"bytes,8,opt,name=suffix" json:"suffix,omitempty"`
+ // `contains` specifies that the field value must have the
+ // specified substring anywhere in the string. If the field value doesn't
+ // contain the specified substring, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value does not contain substring `inside`.
+ // string value = 1 [(buf.validate.field).string.contains = "inside"];
+ // }
+ //
+ // ```
+ Contains *string `protobuf:"bytes,9,opt,name=contains" json:"contains,omitempty"`
+ // `not_contains` specifies that the field value must not have the
+ // specified substring anywhere in the string. If the field value contains
+ // the specified substring, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value contains substring `inside`.
+ // string value = 1 [(buf.validate.field).string.not_contains = "inside"];
+ // }
+ //
+ // ```
+ NotContains *string `protobuf:"bytes,23,opt,name=not_contains,json=notContains" json:"not_contains,omitempty"`
+ // `in` specifies that the field value must be equal to one of the specified
+ // values. If the field value isn't one of the specified values, an error
+ // message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be in list ["apple", "banana"]
+ // repeated string value = 1 [(buf.validate.field).string.in = "apple", (buf.validate.field).string.in = "banana"];
+ // }
+ //
+ // ```
+ In []string `protobuf:"bytes,10,rep,name=in" json:"in,omitempty"`
+ // `not_in` specifies that the field value cannot be equal to any
+ // of the specified values. If the field value is one of the specified values,
+ // an error message will be generated.
+ // ```proto
+ //
+ // message MyString {
+ // // value must not be in list ["orange", "grape"]
+ // repeated string value = 1 [(buf.validate.field).string.not_in = "orange", (buf.validate.field).string.not_in = "grape"];
+ // }
+ //
+ // ```
+ NotIn []string `protobuf:"bytes,11,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `WellKnown` rules provide advanced constraints against common string
+ // patterns
+ //
+ // Types that are valid to be assigned to WellKnown:
+ //
+ // *StringRules_Email
+ // *StringRules_Hostname
+ // *StringRules_Ip
+ // *StringRules_Ipv4
+ // *StringRules_Ipv6
+ // *StringRules_Uri
+ // *StringRules_UriRef
+ // *StringRules_Address
+ // *StringRules_Uuid
+ // *StringRules_Tuuid
+ // *StringRules_IpWithPrefixlen
+ // *StringRules_Ipv4WithPrefixlen
+ // *StringRules_Ipv6WithPrefixlen
+ // *StringRules_IpPrefix
+ // *StringRules_Ipv4Prefix
+ // *StringRules_Ipv6Prefix
+ // *StringRules_HostAndPort
+ // *StringRules_WellKnownRegex
+ WellKnown isStringRules_WellKnown `protobuf_oneof:"well_known"`
+ // This applies to regexes `HTTP_HEADER_NAME` and `HTTP_HEADER_VALUE` to
+ // enable strict header validation. By default, this is true, and HTTP header
+ // validations are [RFC-compliant](https://tools.ietf.org/html/rfc7230#section-3). Setting to false will enable looser
+ // validations that only disallow `\r\n\0` characters, which can be used to
+ // bypass header matching rules.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // The field `value` must have be a valid HTTP headers, but not enforced with strict rules.
+ // string value = 1 [(buf.validate.field).string.strict = false];
+ // }
+ //
+ // ```
+ Strict *bool `protobuf:"varint,25,opt,name=strict" json:"strict,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // string value = 1 [
+ // (buf.validate.field).string.example = "hello",
+ // (buf.validate.field).string.example = "world"
+ // ];
+ // }
+ //
+ // ```
+ Example []string `protobuf:"bytes,34,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *StringRules) Reset() {
+ *x = StringRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[18]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *StringRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StringRules) ProtoMessage() {}
+
+func (x *StringRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[18]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use StringRules.ProtoReflect.Descriptor instead.
+func (*StringRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *StringRules) GetConst() string {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return ""
+}
+
+func (x *StringRules) GetLen() uint64 {
+ if x != nil && x.Len != nil {
+ return *x.Len
+ }
+ return 0
+}
+
+func (x *StringRules) GetMinLen() uint64 {
+ if x != nil && x.MinLen != nil {
+ return *x.MinLen
+ }
+ return 0
+}
+
+func (x *StringRules) GetMaxLen() uint64 {
+ if x != nil && x.MaxLen != nil {
+ return *x.MaxLen
+ }
+ return 0
+}
+
+func (x *StringRules) GetLenBytes() uint64 {
+ if x != nil && x.LenBytes != nil {
+ return *x.LenBytes
+ }
+ return 0
+}
+
+func (x *StringRules) GetMinBytes() uint64 {
+ if x != nil && x.MinBytes != nil {
+ return *x.MinBytes
+ }
+ return 0
+}
+
+func (x *StringRules) GetMaxBytes() uint64 {
+ if x != nil && x.MaxBytes != nil {
+ return *x.MaxBytes
+ }
+ return 0
+}
+
+func (x *StringRules) GetPattern() string {
+ if x != nil && x.Pattern != nil {
+ return *x.Pattern
+ }
+ return ""
+}
+
+func (x *StringRules) GetPrefix() string {
+ if x != nil && x.Prefix != nil {
+ return *x.Prefix
+ }
+ return ""
+}
+
+func (x *StringRules) GetSuffix() string {
+ if x != nil && x.Suffix != nil {
+ return *x.Suffix
+ }
+ return ""
+}
+
+func (x *StringRules) GetContains() string {
+ if x != nil && x.Contains != nil {
+ return *x.Contains
+ }
+ return ""
+}
+
+func (x *StringRules) GetNotContains() string {
+ if x != nil && x.NotContains != nil {
+ return *x.NotContains
+ }
+ return ""
+}
+
+func (x *StringRules) GetIn() []string {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *StringRules) GetNotIn() []string {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *StringRules) GetWellKnown() isStringRules_WellKnown {
+ if x != nil {
+ return x.WellKnown
+ }
+ return nil
+}
+
+func (x *StringRules) GetEmail() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Email); ok {
+ return x.Email
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetHostname() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Hostname); ok {
+ return x.Hostname
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetIp() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Ip); ok {
+ return x.Ip
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetIpv4() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Ipv4); ok {
+ return x.Ipv4
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetIpv6() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Ipv6); ok {
+ return x.Ipv6
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetUri() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Uri); ok {
+ return x.Uri
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetUriRef() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_UriRef); ok {
+ return x.UriRef
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetAddress() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Address); ok {
+ return x.Address
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetUuid() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Uuid); ok {
+ return x.Uuid
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetTuuid() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Tuuid); ok {
+ return x.Tuuid
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetIpWithPrefixlen() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_IpWithPrefixlen); ok {
+ return x.IpWithPrefixlen
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetIpv4WithPrefixlen() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Ipv4WithPrefixlen); ok {
+ return x.Ipv4WithPrefixlen
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetIpv6WithPrefixlen() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Ipv6WithPrefixlen); ok {
+ return x.Ipv6WithPrefixlen
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetIpPrefix() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_IpPrefix); ok {
+ return x.IpPrefix
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetIpv4Prefix() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Ipv4Prefix); ok {
+ return x.Ipv4Prefix
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetIpv6Prefix() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_Ipv6Prefix); ok {
+ return x.Ipv6Prefix
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetHostAndPort() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_HostAndPort); ok {
+ return x.HostAndPort
+ }
+ }
+ return false
+}
+
+func (x *StringRules) GetWellKnownRegex() KnownRegex {
+ if x != nil {
+ if x, ok := x.WellKnown.(*StringRules_WellKnownRegex); ok {
+ return x.WellKnownRegex
+ }
+ }
+ return KnownRegex_KNOWN_REGEX_UNSPECIFIED
+}
+
+func (x *StringRules) GetStrict() bool {
+ if x != nil && x.Strict != nil {
+ return *x.Strict
+ }
+ return false
+}
+
+func (x *StringRules) GetExample() []string {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isStringRules_WellKnown interface {
+ isStringRules_WellKnown()
+}
+
+type StringRules_Email struct {
+ // `email` specifies that the field value must be a valid email address
+ // (addr-spec only) as defined by [RFC 5322](https://tools.ietf.org/html/rfc5322#section-3.4.1).
+ // If the field value isn't a valid email address, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid email address
+ // string value = 1 [(buf.validate.field).string.email = true];
+ // }
+ //
+ // ```
+ Email bool `protobuf:"varint,12,opt,name=email,oneof"`
+}
+
+type StringRules_Hostname struct {
+ // `hostname` specifies that the field value must be a valid
+ // hostname as defined by [RFC 1034](https://tools.ietf.org/html/rfc1034#section-3.5). This constraint doesn't support
+ // internationalized domain names (IDNs). If the field value isn't a
+ // valid hostname, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid hostname
+ // string value = 1 [(buf.validate.field).string.hostname = true];
+ // }
+ //
+ // ```
+ Hostname bool `protobuf:"varint,13,opt,name=hostname,oneof"`
+}
+
+type StringRules_Ip struct {
+ // `ip` specifies that the field value must be a valid IP
+ // (v4 or v6) address, without surrounding square brackets for IPv6 addresses.
+ // If the field value isn't a valid IP address, an error message will be
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid IP address
+ // string value = 1 [(buf.validate.field).string.ip = true];
+ // }
+ //
+ // ```
+ Ip bool `protobuf:"varint,14,opt,name=ip,oneof"`
+}
+
+type StringRules_Ipv4 struct {
+ // `ipv4` specifies that the field value must be a valid IPv4
+ // address. If the field value isn't a valid IPv4 address, an error message
+ // will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid IPv4 address
+ // string value = 1 [(buf.validate.field).string.ipv4 = true];
+ // }
+ //
+ // ```
+ Ipv4 bool `protobuf:"varint,15,opt,name=ipv4,oneof"`
+}
+
+type StringRules_Ipv6 struct {
+ // `ipv6` specifies that the field value must be a valid
+ // IPv6 address, without surrounding square brackets. If the field value is
+ // not a valid IPv6 address, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid IPv6 address
+ // string value = 1 [(buf.validate.field).string.ipv6 = true];
+ // }
+ //
+ // ```
+ Ipv6 bool `protobuf:"varint,16,opt,name=ipv6,oneof"`
+}
+
+type StringRules_Uri struct {
+ // `uri` specifies that the field value must be a valid,
+ // absolute URI as defined by [RFC 3986](https://tools.ietf.org/html/rfc3986#section-3). If the field value isn't a valid,
+ // absolute URI, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid URI
+ // string value = 1 [(buf.validate.field).string.uri = true];
+ // }
+ //
+ // ```
+ Uri bool `protobuf:"varint,17,opt,name=uri,oneof"`
+}
+
+type StringRules_UriRef struct {
+ // `uri_ref` specifies that the field value must be a valid URI
+ // as defined by [RFC 3986](https://tools.ietf.org/html/rfc3986#section-3) and may be either relative or absolute. If the
+ // field value isn't a valid URI, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid URI
+ // string value = 1 [(buf.validate.field).string.uri_ref = true];
+ // }
+ //
+ // ```
+ UriRef bool `protobuf:"varint,18,opt,name=uri_ref,json=uriRef,oneof"`
+}
+
+type StringRules_Address struct {
+ // `address` specifies that the field value must be either a valid hostname
+ // as defined by [RFC 1034](https://tools.ietf.org/html/rfc1034#section-3.5)
+ // (which doesn't support internationalized domain names or IDNs) or a valid
+ // IP (v4 or v6). If the field value isn't a valid hostname or IP, an error
+ // message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid hostname, or ip address
+ // string value = 1 [(buf.validate.field).string.address = true];
+ // }
+ //
+ // ```
+ Address bool `protobuf:"varint,21,opt,name=address,oneof"`
+}
+
+type StringRules_Uuid struct {
+ // `uuid` specifies that the field value must be a valid UUID as defined by
+ // [RFC 4122](https://tools.ietf.org/html/rfc4122#section-4.1.2). If the
+ // field value isn't a valid UUID, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid UUID
+ // string value = 1 [(buf.validate.field).string.uuid = true];
+ // }
+ //
+ // ```
+ Uuid bool `protobuf:"varint,22,opt,name=uuid,oneof"`
+}
+
+type StringRules_Tuuid struct {
+ // `tuuid` (trimmed UUID) specifies that the field value must be a valid UUID as
+ // defined by [RFC 4122](https://tools.ietf.org/html/rfc4122#section-4.1.2) with all dashes
+ // omitted. If the field value isn't a valid UUID without dashes, an error message
+ // will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid trimmed UUID
+ // string value = 1 [(buf.validate.field).string.tuuid = true];
+ // }
+ //
+ // ```
+ Tuuid bool `protobuf:"varint,33,opt,name=tuuid,oneof"`
+}
+
+type StringRules_IpWithPrefixlen struct {
+ // `ip_with_prefixlen` specifies that the field value must be a valid IP (v4 or v6)
+ // address with prefix length. If the field value isn't a valid IP with prefix
+ // length, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid IP with prefix length
+ // string value = 1 [(buf.validate.field).string.ip_with_prefixlen = true];
+ // }
+ //
+ // ```
+ IpWithPrefixlen bool `protobuf:"varint,26,opt,name=ip_with_prefixlen,json=ipWithPrefixlen,oneof"`
+}
+
+type StringRules_Ipv4WithPrefixlen struct {
+ // `ipv4_with_prefixlen` specifies that the field value must be a valid
+ // IPv4 address with prefix.
+ // If the field value isn't a valid IPv4 address with prefix length,
+ // an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid IPv4 address with prefix length
+ // string value = 1 [(buf.validate.field).string.ipv4_with_prefixlen = true];
+ // }
+ //
+ // ```
+ Ipv4WithPrefixlen bool `protobuf:"varint,27,opt,name=ipv4_with_prefixlen,json=ipv4WithPrefixlen,oneof"`
+}
+
+type StringRules_Ipv6WithPrefixlen struct {
+ // `ipv6_with_prefixlen` specifies that the field value must be a valid
+ // IPv6 address with prefix length.
+ // If the field value is not a valid IPv6 address with prefix length,
+ // an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid IPv6 address prefix length
+ // string value = 1 [(buf.validate.field).string.ipv6_with_prefixlen = true];
+ // }
+ //
+ // ```
+ Ipv6WithPrefixlen bool `protobuf:"varint,28,opt,name=ipv6_with_prefixlen,json=ipv6WithPrefixlen,oneof"`
+}
+
+type StringRules_IpPrefix struct {
+ // `ip_prefix` specifies that the field value must be a valid IP (v4 or v6) prefix.
+ // If the field value isn't a valid IP prefix, an error message will be
+ // generated. The prefix must have all zeros for the masked bits of the prefix (e.g.,
+ // `127.0.0.0/16`, not `127.0.0.1/16`).
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid IP prefix
+ // string value = 1 [(buf.validate.field).string.ip_prefix = true];
+ // }
+ //
+ // ```
+ IpPrefix bool `protobuf:"varint,29,opt,name=ip_prefix,json=ipPrefix,oneof"`
+}
+
+type StringRules_Ipv4Prefix struct {
+ // `ipv4_prefix` specifies that the field value must be a valid IPv4
+ // prefix. If the field value isn't a valid IPv4 prefix, an error message
+ // will be generated. The prefix must have all zeros for the masked bits of
+ // the prefix (e.g., `127.0.0.0/16`, not `127.0.0.1/16`).
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid IPv4 prefix
+ // string value = 1 [(buf.validate.field).string.ipv4_prefix = true];
+ // }
+ //
+ // ```
+ Ipv4Prefix bool `protobuf:"varint,30,opt,name=ipv4_prefix,json=ipv4Prefix,oneof"`
+}
+
+type StringRules_Ipv6Prefix struct {
+ // `ipv6_prefix` specifies that the field value must be a valid IPv6 prefix.
+ // If the field value is not a valid IPv6 prefix, an error message will be
+ // generated. The prefix must have all zeros for the masked bits of the prefix
+ // (e.g., `2001:db8::/48`, not `2001:db8::1/48`).
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid IPv6 prefix
+ // string value = 1 [(buf.validate.field).string.ipv6_prefix = true];
+ // }
+ //
+ // ```
+ Ipv6Prefix bool `protobuf:"varint,31,opt,name=ipv6_prefix,json=ipv6Prefix,oneof"`
+}
+
+type StringRules_HostAndPort struct {
+ // `host_and_port` specifies the field value must be a valid host and port
+ // pair. The host must be a valid hostname or IP address while the port
+ // must be in the range of 0-65535, inclusive. IPv6 addresses must be delimited
+ // with square brackets (e.g., `[::1]:1234`).
+ HostAndPort bool `protobuf:"varint,32,opt,name=host_and_port,json=hostAndPort,oneof"`
+}
+
+type StringRules_WellKnownRegex struct {
+ // `well_known_regex` specifies a common well-known pattern
+ // defined as a regex. If the field value doesn't match the well-known
+ // regex, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyString {
+ // // value must be a valid HTTP header value
+ // string value = 1 [(buf.validate.field).string.well_known_regex = KNOWN_REGEX_HTTP_HEADER_VALUE];
+ // }
+ //
+ // ```
+ //
+ // #### KnownRegex
+ //
+ // `well_known_regex` contains some well-known patterns.
+ //
+ // | Name | Number | Description |
+ // |-------------------------------|--------|-------------------------------------------|
+ // | KNOWN_REGEX_UNSPECIFIED | 0 | |
+ // | KNOWN_REGEX_HTTP_HEADER_NAME | 1 | HTTP header name as defined by [RFC 7230](https://tools.ietf.org/html/rfc7230#section-3.2) |
+ // | KNOWN_REGEX_HTTP_HEADER_VALUE | 2 | HTTP header value as defined by [RFC 7230](https://tools.ietf.org/html/rfc7230#section-3.2.4) |
+ WellKnownRegex KnownRegex `protobuf:"varint,24,opt,name=well_known_regex,json=wellKnownRegex,enum=buf.validate.KnownRegex,oneof"`
+}
+
+func (*StringRules_Email) isStringRules_WellKnown() {}
+
+func (*StringRules_Hostname) isStringRules_WellKnown() {}
+
+func (*StringRules_Ip) isStringRules_WellKnown() {}
+
+func (*StringRules_Ipv4) isStringRules_WellKnown() {}
+
+func (*StringRules_Ipv6) isStringRules_WellKnown() {}
+
+func (*StringRules_Uri) isStringRules_WellKnown() {}
+
+func (*StringRules_UriRef) isStringRules_WellKnown() {}
+
+func (*StringRules_Address) isStringRules_WellKnown() {}
+
+func (*StringRules_Uuid) isStringRules_WellKnown() {}
+
+func (*StringRules_Tuuid) isStringRules_WellKnown() {}
+
+func (*StringRules_IpWithPrefixlen) isStringRules_WellKnown() {}
+
+func (*StringRules_Ipv4WithPrefixlen) isStringRules_WellKnown() {}
+
+func (*StringRules_Ipv6WithPrefixlen) isStringRules_WellKnown() {}
+
+func (*StringRules_IpPrefix) isStringRules_WellKnown() {}
+
+func (*StringRules_Ipv4Prefix) isStringRules_WellKnown() {}
+
+func (*StringRules_Ipv6Prefix) isStringRules_WellKnown() {}
+
+func (*StringRules_HostAndPort) isStringRules_WellKnown() {}
+
+func (*StringRules_WellKnownRegex) isStringRules_WellKnown() {}
+
+// BytesRules describe the constraints applied to `bytes` values. These rules
+// may also be applied to the `google.protobuf.BytesValue` Well-Known-Type.
+type BytesRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified bytes
+ // value. If the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value must be "\x01\x02\x03\x04"
+ // bytes value = 1 [(buf.validate.field).bytes.const = "\x01\x02\x03\x04"];
+ // }
+ //
+ // ```
+ Const []byte `protobuf:"bytes,1,opt,name=const" json:"const,omitempty"`
+ // `len` requires the field value to have the specified length in bytes.
+ // If the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value length must be 4 bytes.
+ // optional bytes value = 1 [(buf.validate.field).bytes.len = 4];
+ // }
+ //
+ // ```
+ Len *uint64 `protobuf:"varint,13,opt,name=len" json:"len,omitempty"`
+ // `min_len` requires the field value to have at least the specified minimum
+ // length in bytes.
+ // If the field value doesn't meet the requirement, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value length must be at least 2 bytes.
+ // optional bytes value = 1 [(buf.validate.field).bytes.min_len = 2];
+ // }
+ //
+ // ```
+ MinLen *uint64 `protobuf:"varint,2,opt,name=min_len,json=minLen" json:"min_len,omitempty"`
+ // `max_len` requires the field value to have at most the specified maximum
+ // length in bytes.
+ // If the field value exceeds the requirement, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value must be at most 6 bytes.
+ // optional bytes value = 1 [(buf.validate.field).bytes.max_len = 6];
+ // }
+ //
+ // ```
+ MaxLen *uint64 `protobuf:"varint,3,opt,name=max_len,json=maxLen" json:"max_len,omitempty"`
+ // `pattern` requires the field value to match the specified regular
+ // expression ([RE2 syntax](https://github.com/google/re2/wiki/Syntax)).
+ // The value of the field must be valid UTF-8 or validation will fail with a
+ // runtime error.
+ // If the field value doesn't match the pattern, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value must match regex pattern "^[a-zA-Z0-9]+$".
+ // optional bytes value = 1 [(buf.validate.field).bytes.pattern = "^[a-zA-Z0-9]+$"];
+ // }
+ //
+ // ```
+ Pattern *string `protobuf:"bytes,4,opt,name=pattern" json:"pattern,omitempty"`
+ // `prefix` requires the field value to have the specified bytes at the
+ // beginning of the string.
+ // If the field value doesn't meet the requirement, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value does not have prefix \x01\x02
+ // optional bytes value = 1 [(buf.validate.field).bytes.prefix = "\x01\x02"];
+ // }
+ //
+ // ```
+ Prefix []byte `protobuf:"bytes,5,opt,name=prefix" json:"prefix,omitempty"`
+ // `suffix` requires the field value to have the specified bytes at the end
+ // of the string.
+ // If the field value doesn't meet the requirement, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value does not have suffix \x03\x04
+ // optional bytes value = 1 [(buf.validate.field).bytes.suffix = "\x03\x04"];
+ // }
+ //
+ // ```
+ Suffix []byte `protobuf:"bytes,6,opt,name=suffix" json:"suffix,omitempty"`
+ // `contains` requires the field value to have the specified bytes anywhere in
+ // the string.
+ // If the field value doesn't meet the requirement, an error message is generated.
+ //
+ // ```protobuf
+ //
+ // message MyBytes {
+ // // value does not contain \x02\x03
+ // optional bytes value = 1 [(buf.validate.field).bytes.contains = "\x02\x03"];
+ // }
+ //
+ // ```
+ Contains []byte `protobuf:"bytes,7,opt,name=contains" json:"contains,omitempty"`
+ // `in` requires the field value to be equal to one of the specified
+ // values. If the field value doesn't match any of the specified values, an
+ // error message is generated.
+ //
+ // ```protobuf
+ //
+ // message MyBytes {
+ // // value must in ["\x01\x02", "\x02\x03", "\x03\x04"]
+ // optional bytes value = 1 [(buf.validate.field).bytes.in = {"\x01\x02", "\x02\x03", "\x03\x04"}];
+ // }
+ //
+ // ```
+ In [][]byte `protobuf:"bytes,8,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to be not equal to any of the specified
+ // values.
+ // If the field value matches any of the specified values, an error message is
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value must not in ["\x01\x02", "\x02\x03", "\x03\x04"]
+ // optional bytes value = 1 [(buf.validate.field).bytes.not_in = {"\x01\x02", "\x02\x03", "\x03\x04"}];
+ // }
+ //
+ // ```
+ NotIn [][]byte `protobuf:"bytes,9,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // WellKnown rules provide advanced constraints against common byte
+ // patterns
+ //
+ // Types that are valid to be assigned to WellKnown:
+ //
+ // *BytesRules_Ip
+ // *BytesRules_Ipv4
+ // *BytesRules_Ipv6
+ WellKnown isBytesRules_WellKnown `protobuf_oneof:"well_known"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // bytes value = 1 [
+ // (buf.validate.field).bytes.example = "\x01\x02",
+ // (buf.validate.field).bytes.example = "\x02\x03"
+ // ];
+ // }
+ //
+ // ```
+ Example [][]byte `protobuf:"bytes,14,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *BytesRules) Reset() {
+ *x = BytesRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[19]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *BytesRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BytesRules) ProtoMessage() {}
+
+func (x *BytesRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[19]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use BytesRules.ProtoReflect.Descriptor instead.
+func (*BytesRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *BytesRules) GetConst() []byte {
+ if x != nil {
+ return x.Const
+ }
+ return nil
+}
+
+func (x *BytesRules) GetLen() uint64 {
+ if x != nil && x.Len != nil {
+ return *x.Len
+ }
+ return 0
+}
+
+func (x *BytesRules) GetMinLen() uint64 {
+ if x != nil && x.MinLen != nil {
+ return *x.MinLen
+ }
+ return 0
+}
+
+func (x *BytesRules) GetMaxLen() uint64 {
+ if x != nil && x.MaxLen != nil {
+ return *x.MaxLen
+ }
+ return 0
+}
+
+func (x *BytesRules) GetPattern() string {
+ if x != nil && x.Pattern != nil {
+ return *x.Pattern
+ }
+ return ""
+}
+
+func (x *BytesRules) GetPrefix() []byte {
+ if x != nil {
+ return x.Prefix
+ }
+ return nil
+}
+
+func (x *BytesRules) GetSuffix() []byte {
+ if x != nil {
+ return x.Suffix
+ }
+ return nil
+}
+
+func (x *BytesRules) GetContains() []byte {
+ if x != nil {
+ return x.Contains
+ }
+ return nil
+}
+
+func (x *BytesRules) GetIn() [][]byte {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *BytesRules) GetNotIn() [][]byte {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *BytesRules) GetWellKnown() isBytesRules_WellKnown {
+ if x != nil {
+ return x.WellKnown
+ }
+ return nil
+}
+
+func (x *BytesRules) GetIp() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*BytesRules_Ip); ok {
+ return x.Ip
+ }
+ }
+ return false
+}
+
+func (x *BytesRules) GetIpv4() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*BytesRules_Ipv4); ok {
+ return x.Ipv4
+ }
+ }
+ return false
+}
+
+func (x *BytesRules) GetIpv6() bool {
+ if x != nil {
+ if x, ok := x.WellKnown.(*BytesRules_Ipv6); ok {
+ return x.Ipv6
+ }
+ }
+ return false
+}
+
+func (x *BytesRules) GetExample() [][]byte {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isBytesRules_WellKnown interface {
+ isBytesRules_WellKnown()
+}
+
+type BytesRules_Ip struct {
+ // `ip` ensures that the field `value` is a valid IP address (v4 or v6) in byte format.
+ // If the field value doesn't meet this constraint, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value must be a valid IP address
+ // optional bytes value = 1 [(buf.validate.field).bytes.ip = true];
+ // }
+ //
+ // ```
+ Ip bool `protobuf:"varint,10,opt,name=ip,oneof"`
+}
+
+type BytesRules_Ipv4 struct {
+ // `ipv4` ensures that the field `value` is a valid IPv4 address in byte format.
+ // If the field value doesn't meet this constraint, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyBytes {
+ // // value must be a valid IPv4 address
+ // optional bytes value = 1 [(buf.validate.field).bytes.ipv4 = true];
+ // }
+ //
+ // ```
+ Ipv4 bool `protobuf:"varint,11,opt,name=ipv4,oneof"`
+}
+
+type BytesRules_Ipv6 struct {
+ // `ipv6` ensures that the field `value` is a valid IPv6 address in byte format.
+ // If the field value doesn't meet this constraint, an error message is generated.
+ // ```proto
+ //
+ // message MyBytes {
+ // // value must be a valid IPv6 address
+ // optional bytes value = 1 [(buf.validate.field).bytes.ipv6 = true];
+ // }
+ //
+ // ```
+ Ipv6 bool `protobuf:"varint,12,opt,name=ipv6,oneof"`
+}
+
+func (*BytesRules_Ip) isBytesRules_WellKnown() {}
+
+func (*BytesRules_Ipv4) isBytesRules_WellKnown() {}
+
+func (*BytesRules_Ipv6) isBytesRules_WellKnown() {}
+
+// EnumRules describe the constraints applied to `enum` values.
+type EnumRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` requires the field value to exactly match the specified enum value.
+ // If the field value doesn't match, an error message is generated.
+ //
+ // ```proto
+ //
+ // enum MyEnum {
+ // MY_ENUM_UNSPECIFIED = 0;
+ // MY_ENUM_VALUE1 = 1;
+ // MY_ENUM_VALUE2 = 2;
+ // }
+ //
+ // message MyMessage {
+ // // The field `value` must be exactly MY_ENUM_VALUE1.
+ // MyEnum value = 1 [(buf.validate.field).enum.const = 1];
+ // }
+ //
+ // ```
+ Const *int32 `protobuf:"varint,1,opt,name=const" json:"const,omitempty"`
+ // `defined_only` requires the field value to be one of the defined values for
+ // this enum, failing on any undefined value.
+ //
+ // ```proto
+ //
+ // enum MyEnum {
+ // MY_ENUM_UNSPECIFIED = 0;
+ // MY_ENUM_VALUE1 = 1;
+ // MY_ENUM_VALUE2 = 2;
+ // }
+ //
+ // message MyMessage {
+ // // The field `value` must be a defined value of MyEnum.
+ // MyEnum value = 1 [(buf.validate.field).enum.defined_only = true];
+ // }
+ //
+ // ```
+ DefinedOnly *bool `protobuf:"varint,2,opt,name=defined_only,json=definedOnly" json:"defined_only,omitempty"`
+ // `in` requires the field value to be equal to one of the
+ // specified enum values. If the field value doesn't match any of the
+ // specified values, an error message is generated.
+ //
+ // ```proto
+ //
+ // enum MyEnum {
+ // MY_ENUM_UNSPECIFIED = 0;
+ // MY_ENUM_VALUE1 = 1;
+ // MY_ENUM_VALUE2 = 2;
+ // }
+ //
+ // message MyMessage {
+ // // The field `value` must be equal to one of the specified values.
+ // MyEnum value = 1 [(buf.validate.field).enum = { in: [1, 2]}];
+ // }
+ //
+ // ```
+ In []int32 `protobuf:"varint,3,rep,name=in" json:"in,omitempty"`
+ // `not_in` requires the field value to be not equal to any of the
+ // specified enum values. If the field value matches one of the specified
+ // values, an error message is generated.
+ //
+ // ```proto
+ //
+ // enum MyEnum {
+ // MY_ENUM_UNSPECIFIED = 0;
+ // MY_ENUM_VALUE1 = 1;
+ // MY_ENUM_VALUE2 = 2;
+ // }
+ //
+ // message MyMessage {
+ // // The field `value` must not be equal to any of the specified values.
+ // MyEnum value = 1 [(buf.validate.field).enum = { not_in: [1, 2]}];
+ // }
+ //
+ // ```
+ NotIn []int32 `protobuf:"varint,4,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // enum MyEnum {
+ // MY_ENUM_UNSPECIFIED = 0;
+ // MY_ENUM_VALUE1 = 1;
+ // MY_ENUM_VALUE2 = 2;
+ // }
+ //
+ // message MyMessage {
+ // (buf.validate.field).enum.example = 1,
+ // (buf.validate.field).enum.example = 2
+ // }
+ //
+ // ```
+ Example []int32 `protobuf:"varint,5,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *EnumRules) Reset() {
+ *x = EnumRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[20]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *EnumRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnumRules) ProtoMessage() {}
+
+func (x *EnumRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[20]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnumRules.ProtoReflect.Descriptor instead.
+func (*EnumRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *EnumRules) GetConst() int32 {
+ if x != nil && x.Const != nil {
+ return *x.Const
+ }
+ return 0
+}
+
+func (x *EnumRules) GetDefinedOnly() bool {
+ if x != nil && x.DefinedOnly != nil {
+ return *x.DefinedOnly
+ }
+ return false
+}
+
+func (x *EnumRules) GetIn() []int32 {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *EnumRules) GetNotIn() []int32 {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *EnumRules) GetExample() []int32 {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+// RepeatedRules describe the constraints applied to `repeated` values.
+type RepeatedRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `min_items` requires that this field must contain at least the specified
+ // minimum number of items.
+ //
+ // Note that `min_items = 1` is equivalent to setting a field as `required`.
+ //
+ // ```proto
+ //
+ // message MyRepeated {
+ // // value must contain at least 2 items
+ // repeated string value = 1 [(buf.validate.field).repeated.min_items = 2];
+ // }
+ //
+ // ```
+ MinItems *uint64 `protobuf:"varint,1,opt,name=min_items,json=minItems" json:"min_items,omitempty"`
+ // `max_items` denotes that this field must not exceed a
+ // certain number of items as the upper limit. If the field contains more
+ // items than specified, an error message will be generated, requiring the
+ // field to maintain no more than the specified number of items.
+ //
+ // ```proto
+ //
+ // message MyRepeated {
+ // // value must contain no more than 3 item(s)
+ // repeated string value = 1 [(buf.validate.field).repeated.max_items = 3];
+ // }
+ //
+ // ```
+ MaxItems *uint64 `protobuf:"varint,2,opt,name=max_items,json=maxItems" json:"max_items,omitempty"`
+ // `unique` indicates that all elements in this field must
+ // be unique. This constraint is strictly applicable to scalar and enum
+ // types, with message types not being supported.
+ //
+ // ```proto
+ //
+ // message MyRepeated {
+ // // repeated value must contain unique items
+ // repeated string value = 1 [(buf.validate.field).repeated.unique = true];
+ // }
+ //
+ // ```
+ Unique *bool `protobuf:"varint,3,opt,name=unique" json:"unique,omitempty"`
+ // `items` details the constraints to be applied to each item
+ // in the field. Even for repeated message fields, validation is executed
+ // against each item unless skip is explicitly specified.
+ //
+ // ```proto
+ //
+ // message MyRepeated {
+ // // The items in the field `value` must follow the specified constraints.
+ // repeated string value = 1 [(buf.validate.field).repeated.items = {
+ // string: {
+ // min_len: 3
+ // max_len: 10
+ // }
+ // }];
+ // }
+ //
+ // ```
+ Items *FieldConstraints `protobuf:"bytes,4,opt,name=items" json:"items,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *RepeatedRules) Reset() {
+ *x = RepeatedRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[21]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *RepeatedRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RepeatedRules) ProtoMessage() {}
+
+func (x *RepeatedRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[21]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use RepeatedRules.ProtoReflect.Descriptor instead.
+func (*RepeatedRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *RepeatedRules) GetMinItems() uint64 {
+ if x != nil && x.MinItems != nil {
+ return *x.MinItems
+ }
+ return 0
+}
+
+func (x *RepeatedRules) GetMaxItems() uint64 {
+ if x != nil && x.MaxItems != nil {
+ return *x.MaxItems
+ }
+ return 0
+}
+
+func (x *RepeatedRules) GetUnique() bool {
+ if x != nil && x.Unique != nil {
+ return *x.Unique
+ }
+ return false
+}
+
+func (x *RepeatedRules) GetItems() *FieldConstraints {
+ if x != nil {
+ return x.Items
+ }
+ return nil
+}
+
+// MapRules describe the constraints applied to `map` values.
+type MapRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // Specifies the minimum number of key-value pairs allowed. If the field has
+ // fewer key-value pairs than specified, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyMap {
+ // // The field `value` must have at least 2 key-value pairs.
+ // map value = 1 [(buf.validate.field).map.min_pairs = 2];
+ // }
+ //
+ // ```
+ MinPairs *uint64 `protobuf:"varint,1,opt,name=min_pairs,json=minPairs" json:"min_pairs,omitempty"`
+ // Specifies the maximum number of key-value pairs allowed. If the field has
+ // more key-value pairs than specified, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyMap {
+ // // The field `value` must have at most 3 key-value pairs.
+ // map value = 1 [(buf.validate.field).map.max_pairs = 3];
+ // }
+ //
+ // ```
+ MaxPairs *uint64 `protobuf:"varint,2,opt,name=max_pairs,json=maxPairs" json:"max_pairs,omitempty"`
+ // Specifies the constraints to be applied to each key in the field.
+ //
+ // ```proto
+ //
+ // message MyMap {
+ // // The keys in the field `value` must follow the specified constraints.
+ // map value = 1 [(buf.validate.field).map.keys = {
+ // string: {
+ // min_len: 3
+ // max_len: 10
+ // }
+ // }];
+ // }
+ //
+ // ```
+ Keys *FieldConstraints `protobuf:"bytes,4,opt,name=keys" json:"keys,omitempty"`
+ // Specifies the constraints to be applied to the value of each key in the
+ // field. Message values will still have their validations evaluated unless
+ // skip is specified here.
+ //
+ // ```proto
+ //
+ // message MyMap {
+ // // The values in the field `value` must follow the specified constraints.
+ // map value = 1 [(buf.validate.field).map.values = {
+ // string: {
+ // min_len: 5
+ // max_len: 20
+ // }
+ // }];
+ // }
+ //
+ // ```
+ Values *FieldConstraints `protobuf:"bytes,5,opt,name=values" json:"values,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *MapRules) Reset() {
+ *x = MapRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[22]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *MapRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MapRules) ProtoMessage() {}
+
+func (x *MapRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[22]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MapRules.ProtoReflect.Descriptor instead.
+func (*MapRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *MapRules) GetMinPairs() uint64 {
+ if x != nil && x.MinPairs != nil {
+ return *x.MinPairs
+ }
+ return 0
+}
+
+func (x *MapRules) GetMaxPairs() uint64 {
+ if x != nil && x.MaxPairs != nil {
+ return *x.MaxPairs
+ }
+ return 0
+}
+
+func (x *MapRules) GetKeys() *FieldConstraints {
+ if x != nil {
+ return x.Keys
+ }
+ return nil
+}
+
+func (x *MapRules) GetValues() *FieldConstraints {
+ if x != nil {
+ return x.Values
+ }
+ return nil
+}
+
+// AnyRules describe constraints applied exclusively to the `google.protobuf.Any` well-known type.
+type AnyRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `in` requires the field's `type_url` to be equal to one of the
+ // specified values. If it doesn't match any of the specified values, an error
+ // message is generated.
+ //
+ // ```proto
+ //
+ // message MyAny {
+ // // The `value` field must have a `type_url` equal to one of the specified values.
+ // google.protobuf.Any value = 1 [(buf.validate.field).any.in = ["type.googleapis.com/MyType1", "type.googleapis.com/MyType2"]];
+ // }
+ //
+ // ```
+ In []string `protobuf:"bytes,2,rep,name=in" json:"in,omitempty"`
+ // requires the field's type_url to be not equal to any of the specified values. If it matches any of the specified values, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyAny {
+ // // The field `value` must not have a `type_url` equal to any of the specified values.
+ // google.protobuf.Any value = 1 [(buf.validate.field).any.not_in = ["type.googleapis.com/ForbiddenType1", "type.googleapis.com/ForbiddenType2"]];
+ // }
+ //
+ // ```
+ NotIn []string `protobuf:"bytes,3,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *AnyRules) Reset() {
+ *x = AnyRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[23]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *AnyRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AnyRules) ProtoMessage() {}
+
+func (x *AnyRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[23]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AnyRules.ProtoReflect.Descriptor instead.
+func (*AnyRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *AnyRules) GetIn() []string {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *AnyRules) GetNotIn() []string {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+// DurationRules describe the constraints applied exclusively to the `google.protobuf.Duration` well-known type.
+type DurationRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` dictates that the field must match the specified value of the `google.protobuf.Duration` type exactly.
+ // If the field's value deviates from the specified value, an error message
+ // will be generated.
+ //
+ // ```proto
+ //
+ // message MyDuration {
+ // // value must equal 5s
+ // google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = "5s"];
+ // }
+ //
+ // ```
+ Const *durationpb.Duration `protobuf:"bytes,2,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *DurationRules_Lt
+ // *DurationRules_Lte
+ LessThan isDurationRules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *DurationRules_Gt
+ // *DurationRules_Gte
+ GreaterThan isDurationRules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `in` asserts that the field must be equal to one of the specified values of the `google.protobuf.Duration` type.
+ // If the field's value doesn't correspond to any of the specified values,
+ // an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyDuration {
+ // // value must be in list [1s, 2s, 3s]
+ // google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = ["1s", "2s", "3s"]];
+ // }
+ //
+ // ```
+ In []*durationpb.Duration `protobuf:"bytes,7,rep,name=in" json:"in,omitempty"`
+ // `not_in` denotes that the field must not be equal to
+ // any of the specified values of the `google.protobuf.Duration` type.
+ // If the field's value matches any of these values, an error message will be
+ // generated.
+ //
+ // ```proto
+ //
+ // message MyDuration {
+ // // value must not be in list [1s, 2s, 3s]
+ // google.protobuf.Duration value = 1 [(buf.validate.field).duration.not_in = ["1s", "2s", "3s"]];
+ // }
+ //
+ // ```
+ NotIn []*durationpb.Duration `protobuf:"bytes,8,rep,name=not_in,json=notIn" json:"not_in,omitempty"`
+ // `example` specifies values that the field may have. These values SHOULD
+ // conform to other constraints. `example` values will not impact validation
+ // but may be used as helpful guidance on how to populate the given field.
+ //
+ // ```proto
+ //
+ // message MyDuration {
+ // google.protobuf.Duration value = 1 [
+ // (buf.validate.field).duration.example = { seconds: 1 },
+ // (buf.validate.field).duration.example = { seconds: 2 },
+ // ];
+ // }
+ //
+ // ```
+ Example []*durationpb.Duration `protobuf:"bytes,9,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *DurationRules) Reset() {
+ *x = DurationRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[24]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *DurationRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DurationRules) ProtoMessage() {}
+
+func (x *DurationRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[24]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use DurationRules.ProtoReflect.Descriptor instead.
+func (*DurationRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *DurationRules) GetConst() *durationpb.Duration {
+ if x != nil {
+ return x.Const
+ }
+ return nil
+}
+
+func (x *DurationRules) GetLessThan() isDurationRules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *DurationRules) GetLt() *durationpb.Duration {
+ if x != nil {
+ if x, ok := x.LessThan.(*DurationRules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return nil
+}
+
+func (x *DurationRules) GetLte() *durationpb.Duration {
+ if x != nil {
+ if x, ok := x.LessThan.(*DurationRules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return nil
+}
+
+func (x *DurationRules) GetGreaterThan() isDurationRules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *DurationRules) GetGt() *durationpb.Duration {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*DurationRules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return nil
+}
+
+func (x *DurationRules) GetGte() *durationpb.Duration {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*DurationRules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return nil
+}
+
+func (x *DurationRules) GetIn() []*durationpb.Duration {
+ if x != nil {
+ return x.In
+ }
+ return nil
+}
+
+func (x *DurationRules) GetNotIn() []*durationpb.Duration {
+ if x != nil {
+ return x.NotIn
+ }
+ return nil
+}
+
+func (x *DurationRules) GetExample() []*durationpb.Duration {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isDurationRules_LessThan interface {
+ isDurationRules_LessThan()
+}
+
+type DurationRules_Lt struct {
+ // `lt` stipulates that the field must be less than the specified value of the `google.protobuf.Duration` type,
+ // exclusive. If the field's value is greater than or equal to the specified
+ // value, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyDuration {
+ // // value must be less than 5s
+ // google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = "5s"];
+ // }
+ //
+ // ```
+ Lt *durationpb.Duration `protobuf:"bytes,3,opt,name=lt,oneof"`
+}
+
+type DurationRules_Lte struct {
+ // `lte` indicates that the field must be less than or equal to the specified
+ // value of the `google.protobuf.Duration` type, inclusive. If the field's value is greater than the specified value,
+ // an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyDuration {
+ // // value must be less than or equal to 10s
+ // google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = "10s"];
+ // }
+ //
+ // ```
+ Lte *durationpb.Duration `protobuf:"bytes,4,opt,name=lte,oneof"`
+}
+
+func (*DurationRules_Lt) isDurationRules_LessThan() {}
+
+func (*DurationRules_Lte) isDurationRules_LessThan() {}
+
+type isDurationRules_GreaterThan interface {
+ isDurationRules_GreaterThan()
+}
+
+type DurationRules_Gt struct {
+ // `gt` requires the duration field value to be greater than the specified
+ // value (exclusive). If the value of `gt` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyDuration {
+ // // duration must be greater than 5s [duration.gt]
+ // google.protobuf.Duration value = 1 [(buf.validate.field).duration.gt = { seconds: 5 }];
+ //
+ // // duration must be greater than 5s and less than 10s [duration.gt_lt]
+ // google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gt: { seconds: 5 }, lt: { seconds: 10 } }];
+ //
+ // // duration must be greater than 10s or less than 5s [duration.gt_lt_exclusive]
+ // google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gt: { seconds: 10 }, lt: { seconds: 5 } }];
+ // }
+ //
+ // ```
+ Gt *durationpb.Duration `protobuf:"bytes,5,opt,name=gt,oneof"`
+}
+
+type DurationRules_Gte struct {
+ // `gte` requires the duration field value to be greater than or equal to the
+ // specified value (exclusive). If the value of `gte` is larger than a
+ // specified `lt` or `lte`, the range is reversed, and the field value must
+ // be outside the specified range. If the field value doesn't meet the
+ // required conditions, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyDuration {
+ // // duration must be greater than or equal to 5s [duration.gte]
+ // google.protobuf.Duration value = 1 [(buf.validate.field).duration.gte = { seconds: 5 }];
+ //
+ // // duration must be greater than or equal to 5s and less than 10s [duration.gte_lt]
+ // google.protobuf.Duration another_value = 2 [(buf.validate.field).duration = { gte: { seconds: 5 }, lt: { seconds: 10 } }];
+ //
+ // // duration must be greater than or equal to 10s or less than 5s [duration.gte_lt_exclusive]
+ // google.protobuf.Duration other_value = 3 [(buf.validate.field).duration = { gte: { seconds: 10 }, lt: { seconds: 5 } }];
+ // }
+ //
+ // ```
+ Gte *durationpb.Duration `protobuf:"bytes,6,opt,name=gte,oneof"`
+}
+
+func (*DurationRules_Gt) isDurationRules_GreaterThan() {}
+
+func (*DurationRules_Gte) isDurationRules_GreaterThan() {}
+
+// TimestampRules describe the constraints applied exclusively to the `google.protobuf.Timestamp` well-known type.
+type TimestampRules struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `const` dictates that this field, of the `google.protobuf.Timestamp` type, must exactly match the specified value. If the field value doesn't correspond to the specified timestamp, an error message will be generated.
+ //
+ // ```proto
+ //
+ // message MyTimestamp {
+ // // value must equal 2023-05-03T10:00:00Z
+ // google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.const = {seconds: 1727998800}];
+ // }
+ //
+ // ```
+ Const *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=const" json:"const,omitempty"`
+ // Types that are valid to be assigned to LessThan:
+ //
+ // *TimestampRules_Lt
+ // *TimestampRules_Lte
+ // *TimestampRules_LtNow
+ LessThan isTimestampRules_LessThan `protobuf_oneof:"less_than"`
+ // Types that are valid to be assigned to GreaterThan:
+ //
+ // *TimestampRules_Gt
+ // *TimestampRules_Gte
+ // *TimestampRules_GtNow
+ GreaterThan isTimestampRules_GreaterThan `protobuf_oneof:"greater_than"`
+ // `within` specifies that this field, of the `google.protobuf.Timestamp` type, must be within the specified duration of the current time. If the field value isn't within the duration, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyTimestamp {
+ // // value must be within 1 hour of now
+ // google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.within = {seconds: 3600}];
+ // }
+ //
+ // ```
+ Within *durationpb.Duration `protobuf:"bytes,9,opt,name=within" json:"within,omitempty"`
+ Example []*timestamppb.Timestamp `protobuf:"bytes,10,rep,name=example" json:"example,omitempty"`
+ extensionFields protoimpl.ExtensionFields
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *TimestampRules) Reset() {
+ *x = TimestampRules{}
+ mi := &file_buf_validate_validate_proto_msgTypes[25]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *TimestampRules) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TimestampRules) ProtoMessage() {}
+
+func (x *TimestampRules) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[25]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use TimestampRules.ProtoReflect.Descriptor instead.
+func (*TimestampRules) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *TimestampRules) GetConst() *timestamppb.Timestamp {
+ if x != nil {
+ return x.Const
+ }
+ return nil
+}
+
+func (x *TimestampRules) GetLessThan() isTimestampRules_LessThan {
+ if x != nil {
+ return x.LessThan
+ }
+ return nil
+}
+
+func (x *TimestampRules) GetLt() *timestamppb.Timestamp {
+ if x != nil {
+ if x, ok := x.LessThan.(*TimestampRules_Lt); ok {
+ return x.Lt
+ }
+ }
+ return nil
+}
+
+func (x *TimestampRules) GetLte() *timestamppb.Timestamp {
+ if x != nil {
+ if x, ok := x.LessThan.(*TimestampRules_Lte); ok {
+ return x.Lte
+ }
+ }
+ return nil
+}
+
+func (x *TimestampRules) GetLtNow() bool {
+ if x != nil {
+ if x, ok := x.LessThan.(*TimestampRules_LtNow); ok {
+ return x.LtNow
+ }
+ }
+ return false
+}
+
+func (x *TimestampRules) GetGreaterThan() isTimestampRules_GreaterThan {
+ if x != nil {
+ return x.GreaterThan
+ }
+ return nil
+}
+
+func (x *TimestampRules) GetGt() *timestamppb.Timestamp {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*TimestampRules_Gt); ok {
+ return x.Gt
+ }
+ }
+ return nil
+}
+
+func (x *TimestampRules) GetGte() *timestamppb.Timestamp {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*TimestampRules_Gte); ok {
+ return x.Gte
+ }
+ }
+ return nil
+}
+
+func (x *TimestampRules) GetGtNow() bool {
+ if x != nil {
+ if x, ok := x.GreaterThan.(*TimestampRules_GtNow); ok {
+ return x.GtNow
+ }
+ }
+ return false
+}
+
+func (x *TimestampRules) GetWithin() *durationpb.Duration {
+ if x != nil {
+ return x.Within
+ }
+ return nil
+}
+
+func (x *TimestampRules) GetExample() []*timestamppb.Timestamp {
+ if x != nil {
+ return x.Example
+ }
+ return nil
+}
+
+type isTimestampRules_LessThan interface {
+ isTimestampRules_LessThan()
+}
+
+type TimestampRules_Lt struct {
+ // requires the duration field value to be less than the specified value (field < value). If the field value doesn't meet the required conditions, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyDuration {
+ // // duration must be less than 'P3D' [duration.lt]
+ // google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 259200 }];
+ // }
+ //
+ // ```
+ Lt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=lt,oneof"`
+}
+
+type TimestampRules_Lte struct {
+ // requires the timestamp field value to be less than or equal to the specified value (field <= value). If the field value doesn't meet the required conditions, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyTimestamp {
+ // // timestamp must be less than or equal to '2023-05-14T00:00:00Z' [timestamp.lte]
+ // google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.lte = { seconds: 1678867200 }];
+ // }
+ //
+ // ```
+ Lte *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=lte,oneof"`
+}
+
+type TimestampRules_LtNow struct {
+ // `lt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be less than the current time. `lt_now` can only be used with the `within` rule.
+ //
+ // ```proto
+ //
+ // message MyTimestamp {
+ // // value must be less than now
+ // google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.lt_now = true];
+ // }
+ //
+ // ```
+ LtNow bool `protobuf:"varint,7,opt,name=lt_now,json=ltNow,oneof"`
+}
+
+func (*TimestampRules_Lt) isTimestampRules_LessThan() {}
+
+func (*TimestampRules_Lte) isTimestampRules_LessThan() {}
+
+func (*TimestampRules_LtNow) isTimestampRules_LessThan() {}
+
+type isTimestampRules_GreaterThan interface {
+ isTimestampRules_GreaterThan()
+}
+
+type TimestampRules_Gt struct {
+ // `gt` requires the timestamp field value to be greater than the specified
+ // value (exclusive). If the value of `gt` is larger than a specified `lt`
+ // or `lte`, the range is reversed, and the field value must be outside the
+ // specified range. If the field value doesn't meet the required conditions,
+ // an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyTimestamp {
+ // // timestamp must be greater than '2023-01-01T00:00:00Z' [timestamp.gt]
+ // google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gt = { seconds: 1672444800 }];
+ //
+ // // timestamp must be greater than '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gt_lt]
+ // google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gt: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];
+ //
+ // // timestamp must be greater than '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gt_lt_exclusive]
+ // google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gt: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];
+ // }
+ //
+ // ```
+ Gt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=gt,oneof"`
+}
+
+type TimestampRules_Gte struct {
+ // `gte` requires the timestamp field value to be greater than or equal to the
+ // specified value (exclusive). If the value of `gte` is larger than a
+ // specified `lt` or `lte`, the range is reversed, and the field value
+ // must be outside the specified range. If the field value doesn't meet
+ // the required conditions, an error message is generated.
+ //
+ // ```proto
+ //
+ // message MyTimestamp {
+ // // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' [timestamp.gte]
+ // google.protobuf.Timestamp value = 1 [(buf.validate.field).timestamp.gte = { seconds: 1672444800 }];
+ //
+ // // timestamp must be greater than or equal to '2023-01-01T00:00:00Z' and less than '2023-01-02T00:00:00Z' [timestamp.gte_lt]
+ // google.protobuf.Timestamp another_value = 2 [(buf.validate.field).timestamp = { gte: { seconds: 1672444800 }, lt: { seconds: 1672531200 } }];
+ //
+ // // timestamp must be greater than or equal to '2023-01-02T00:00:00Z' or less than '2023-01-01T00:00:00Z' [timestamp.gte_lt_exclusive]
+ // google.protobuf.Timestamp other_value = 3 [(buf.validate.field).timestamp = { gte: { seconds: 1672531200 }, lt: { seconds: 1672444800 } }];
+ // }
+ //
+ // ```
+ Gte *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=gte,oneof"`
+}
+
+type TimestampRules_GtNow struct {
+ // `gt_now` specifies that this field, of the `google.protobuf.Timestamp` type, must be greater than the current time. `gt_now` can only be used with the `within` rule.
+ //
+ // ```proto
+ //
+ // message MyTimestamp {
+ // // value must be greater than now
+ // google.protobuf.Timestamp created_at = 1 [(buf.validate.field).timestamp.gt_now = true];
+ // }
+ //
+ // ```
+ GtNow bool `protobuf:"varint,8,opt,name=gt_now,json=gtNow,oneof"`
+}
+
+func (*TimestampRules_Gt) isTimestampRules_GreaterThan() {}
+
+func (*TimestampRules_Gte) isTimestampRules_GreaterThan() {}
+
+func (*TimestampRules_GtNow) isTimestampRules_GreaterThan() {}
+
+// `Violations` is a collection of `Violation` messages. This message type is returned by
+// protovalidate when a proto message fails to meet the requirements set by the `Constraint` validation rules.
+// Each individual violation is represented by a `Violation` message.
+type Violations struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `violations` is a repeated field that contains all the `Violation` messages corresponding to the violations detected.
+ Violations []*Violation `protobuf:"bytes,1,rep,name=violations" json:"violations,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *Violations) Reset() {
+ *x = Violations{}
+ mi := &file_buf_validate_validate_proto_msgTypes[26]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *Violations) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Violations) ProtoMessage() {}
+
+func (x *Violations) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[26]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Violations.ProtoReflect.Descriptor instead.
+func (*Violations) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *Violations) GetViolations() []*Violation {
+ if x != nil {
+ return x.Violations
+ }
+ return nil
+}
+
+// `Violation` represents a single instance where a validation rule, expressed
+// as a `Constraint`, was not met. It provides information about the field that
+// caused the violation, the specific constraint that wasn't fulfilled, and a
+// human-readable error message.
+//
+// ```json
+//
+// {
+// "fieldPath": "bar",
+// "constraintId": "foo.bar",
+// "message": "bar must be greater than 0"
+// }
+//
+// ```
+type Violation struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `field` is a machine-readable path to the field that failed validation.
+ // This could be a nested field, in which case the path will include all the parent fields leading to the actual field that caused the violation.
+ //
+ // For example, consider the following message:
+ //
+ // ```proto
+ //
+ // message Message {
+ // bool a = 1 [(buf.validate.field).required = true];
+ // }
+ //
+ // ```
+ //
+ // It could produce the following violation:
+ //
+ // ```textproto
+ //
+ // violation {
+ // field { element { field_number: 1, field_name: "a", field_type: 8 } }
+ // ...
+ // }
+ //
+ // ```
+ Field *FieldPath `protobuf:"bytes,5,opt,name=field" json:"field,omitempty"`
+ // `rule` is a machine-readable path that points to the specific constraint rule that failed validation.
+ // This will be a nested field starting from the FieldConstraints of the field that failed validation.
+ // For custom constraints, this will provide the path of the constraint, e.g. `cel[0]`.
+ //
+ // For example, consider the following message:
+ //
+ // ```proto
+ //
+ // message Message {
+ // bool a = 1 [(buf.validate.field).required = true];
+ // bool b = 2 [(buf.validate.field).cel = {
+ // id: "custom_constraint",
+ // expression: "!this ? 'b must be true': ''"
+ // }]
+ // }
+ //
+ // ```
+ //
+ // It could produce the following violations:
+ //
+ // ```textproto
+ //
+ // violation {
+ // rule { element { field_number: 25, field_name: "required", field_type: 8 } }
+ // ...
+ // }
+ //
+ // violation {
+ // rule { element { field_number: 23, field_name: "cel", field_type: 11, index: 0 } }
+ // ...
+ // }
+ //
+ // ```
+ Rule *FieldPath `protobuf:"bytes,6,opt,name=rule" json:"rule,omitempty"`
+ // `field_path` is a human-readable identifier that points to the specific field that failed the validation.
+ // This could be a nested field, in which case the path will include all the parent fields leading to the actual field that caused the violation.
+ //
+ // Deprecated: use the `field` instead.
+ //
+ // Deprecated: Marked as deprecated in buf/validate/validate.proto.
+ FieldPath *string `protobuf:"bytes,1,opt,name=field_path,json=fieldPath" json:"field_path,omitempty"`
+ // `constraint_id` is the unique identifier of the `Constraint` that was not fulfilled.
+ // This is the same `id` that was specified in the `Constraint` message, allowing easy tracing of which rule was violated.
+ ConstraintId *string `protobuf:"bytes,2,opt,name=constraint_id,json=constraintId" json:"constraint_id,omitempty"`
+ // `message` is a human-readable error message that describes the nature of the violation.
+ // This can be the default error message from the violated `Constraint`, or it can be a custom message that gives more context about the violation.
+ Message *string `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"`
+ // `for_key` indicates whether the violation was caused by a map key, rather than a value.
+ ForKey *bool `protobuf:"varint,4,opt,name=for_key,json=forKey" json:"for_key,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *Violation) Reset() {
+ *x = Violation{}
+ mi := &file_buf_validate_validate_proto_msgTypes[27]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *Violation) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Violation) ProtoMessage() {}
+
+func (x *Violation) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[27]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Violation.ProtoReflect.Descriptor instead.
+func (*Violation) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *Violation) GetField() *FieldPath {
+ if x != nil {
+ return x.Field
+ }
+ return nil
+}
+
+func (x *Violation) GetRule() *FieldPath {
+ if x != nil {
+ return x.Rule
+ }
+ return nil
+}
+
+// Deprecated: Marked as deprecated in buf/validate/validate.proto.
+func (x *Violation) GetFieldPath() string {
+ if x != nil && x.FieldPath != nil {
+ return *x.FieldPath
+ }
+ return ""
+}
+
+func (x *Violation) GetConstraintId() string {
+ if x != nil && x.ConstraintId != nil {
+ return *x.ConstraintId
+ }
+ return ""
+}
+
+func (x *Violation) GetMessage() string {
+ if x != nil && x.Message != nil {
+ return *x.Message
+ }
+ return ""
+}
+
+func (x *Violation) GetForKey() bool {
+ if x != nil && x.ForKey != nil {
+ return *x.ForKey
+ }
+ return false
+}
+
+// `FieldPath` provides a path to a nested protobuf field.
+//
+// This message provides enough information to render a dotted field path even without protobuf descriptors.
+// It also provides enough information to resolve a nested field through unknown wire data.
+type FieldPath struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `elements` contains each element of the path, starting from the root and recursing downward.
+ Elements []*FieldPathElement `protobuf:"bytes,1,rep,name=elements" json:"elements,omitempty"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *FieldPath) Reset() {
+ *x = FieldPath{}
+ mi := &file_buf_validate_validate_proto_msgTypes[28]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *FieldPath) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FieldPath) ProtoMessage() {}
+
+func (x *FieldPath) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[28]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use FieldPath.ProtoReflect.Descriptor instead.
+func (*FieldPath) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *FieldPath) GetElements() []*FieldPathElement {
+ if x != nil {
+ return x.Elements
+ }
+ return nil
+}
+
+// `FieldPathElement` provides enough information to nest through a single protobuf field.
+//
+// If the selected field is a map or repeated field, the `subscript` value selects a specific element from it.
+// A path that refers to a value nested under a map key or repeated field index will have a `subscript` value.
+// The `field_type` field allows unambiguous resolution of a field even if descriptors are not available.
+type FieldPathElement struct {
+ state protoimpl.MessageState `protogen:"open.v1"`
+ // `field_number` is the field number this path element refers to.
+ FieldNumber *int32 `protobuf:"varint,1,opt,name=field_number,json=fieldNumber" json:"field_number,omitempty"`
+ // `field_name` contains the field name this path element refers to.
+ // This can be used to display a human-readable path even if the field number is unknown.
+ FieldName *string `protobuf:"bytes,2,opt,name=field_name,json=fieldName" json:"field_name,omitempty"`
+ // `field_type` specifies the type of this field. When using reflection, this value is not needed.
+ //
+ // This value is provided to make it possible to traverse unknown fields through wire data.
+ // When traversing wire data, be mindful of both packed[1] and delimited[2] encoding schemes.
+ //
+ // N.B.: Although groups are deprecated, the corresponding delimited encoding scheme is not, and
+ // can be explicitly used in Protocol Buffers 2023 Edition.
+ //
+ // [1]: https://protobuf.dev/programming-guides/encoding/#packed
+ // [2]: https://protobuf.dev/programming-guides/encoding/#groups
+ FieldType *descriptorpb.FieldDescriptorProto_Type `protobuf:"varint,3,opt,name=field_type,json=fieldType,enum=google.protobuf.FieldDescriptorProto_Type" json:"field_type,omitempty"`
+ // `key_type` specifies the map key type of this field. This value is useful when traversing
+ // unknown fields through wire data: specifically, it allows handling the differences between
+ // different integer encodings.
+ KeyType *descriptorpb.FieldDescriptorProto_Type `protobuf:"varint,4,opt,name=key_type,json=keyType,enum=google.protobuf.FieldDescriptorProto_Type" json:"key_type,omitempty"`
+ // `value_type` specifies map value type of this field. This is useful if you want to display a
+ // value inside unknown fields through wire data.
+ ValueType *descriptorpb.FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=value_type,json=valueType,enum=google.protobuf.FieldDescriptorProto_Type" json:"value_type,omitempty"`
+ // `subscript` contains a repeated index or map key, if this path element nests into a repeated or map field.
+ //
+ // Types that are valid to be assigned to Subscript:
+ //
+ // *FieldPathElement_Index
+ // *FieldPathElement_BoolKey
+ // *FieldPathElement_IntKey
+ // *FieldPathElement_UintKey
+ // *FieldPathElement_StringKey
+ Subscript isFieldPathElement_Subscript `protobuf_oneof:"subscript"`
+ unknownFields protoimpl.UnknownFields
+ sizeCache protoimpl.SizeCache
+}
+
+func (x *FieldPathElement) Reset() {
+ *x = FieldPathElement{}
+ mi := &file_buf_validate_validate_proto_msgTypes[29]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+}
+
+func (x *FieldPathElement) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FieldPathElement) ProtoMessage() {}
+
+func (x *FieldPathElement) ProtoReflect() protoreflect.Message {
+ mi := &file_buf_validate_validate_proto_msgTypes[29]
+ if x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use FieldPathElement.ProtoReflect.Descriptor instead.
+func (*FieldPathElement) Descriptor() ([]byte, []int) {
+ return file_buf_validate_validate_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *FieldPathElement) GetFieldNumber() int32 {
+ if x != nil && x.FieldNumber != nil {
+ return *x.FieldNumber
+ }
+ return 0
+}
+
+func (x *FieldPathElement) GetFieldName() string {
+ if x != nil && x.FieldName != nil {
+ return *x.FieldName
+ }
+ return ""
+}
+
+func (x *FieldPathElement) GetFieldType() descriptorpb.FieldDescriptorProto_Type {
+ if x != nil && x.FieldType != nil {
+ return *x.FieldType
+ }
+ return descriptorpb.FieldDescriptorProto_Type(1)
+}
+
+func (x *FieldPathElement) GetKeyType() descriptorpb.FieldDescriptorProto_Type {
+ if x != nil && x.KeyType != nil {
+ return *x.KeyType
+ }
+ return descriptorpb.FieldDescriptorProto_Type(1)
+}
+
+func (x *FieldPathElement) GetValueType() descriptorpb.FieldDescriptorProto_Type {
+ if x != nil && x.ValueType != nil {
+ return *x.ValueType
+ }
+ return descriptorpb.FieldDescriptorProto_Type(1)
+}
+
+func (x *FieldPathElement) GetSubscript() isFieldPathElement_Subscript {
+ if x != nil {
+ return x.Subscript
+ }
+ return nil
+}
+
+func (x *FieldPathElement) GetIndex() uint64 {
+ if x != nil {
+ if x, ok := x.Subscript.(*FieldPathElement_Index); ok {
+ return x.Index
+ }
+ }
+ return 0
+}
+
+func (x *FieldPathElement) GetBoolKey() bool {
+ if x != nil {
+ if x, ok := x.Subscript.(*FieldPathElement_BoolKey); ok {
+ return x.BoolKey
+ }
+ }
+ return false
+}
+
+func (x *FieldPathElement) GetIntKey() int64 {
+ if x != nil {
+ if x, ok := x.Subscript.(*FieldPathElement_IntKey); ok {
+ return x.IntKey
+ }
+ }
+ return 0
+}
+
+func (x *FieldPathElement) GetUintKey() uint64 {
+ if x != nil {
+ if x, ok := x.Subscript.(*FieldPathElement_UintKey); ok {
+ return x.UintKey
+ }
+ }
+ return 0
+}
+
+func (x *FieldPathElement) GetStringKey() string {
+ if x != nil {
+ if x, ok := x.Subscript.(*FieldPathElement_StringKey); ok {
+ return x.StringKey
+ }
+ }
+ return ""
+}
+
+type isFieldPathElement_Subscript interface {
+ isFieldPathElement_Subscript()
+}
+
+type FieldPathElement_Index struct {
+ // `index` specifies a 0-based index into a repeated field.
+ Index uint64 `protobuf:"varint,6,opt,name=index,oneof"`
+}
+
+type FieldPathElement_BoolKey struct {
+ // `bool_key` specifies a map key of type bool.
+ BoolKey bool `protobuf:"varint,7,opt,name=bool_key,json=boolKey,oneof"`
+}
+
+type FieldPathElement_IntKey struct {
+ // `int_key` specifies a map key of type int32, int64, sint32, sint64, sfixed32 or sfixed64.
+ IntKey int64 `protobuf:"varint,8,opt,name=int_key,json=intKey,oneof"`
+}
+
+type FieldPathElement_UintKey struct {
+ // `uint_key` specifies a map key of type uint32, uint64, fixed32 or fixed64.
+ UintKey uint64 `protobuf:"varint,9,opt,name=uint_key,json=uintKey,oneof"`
+}
+
+type FieldPathElement_StringKey struct {
+ // `string_key` specifies a map key of type string.
+ StringKey string `protobuf:"bytes,10,opt,name=string_key,json=stringKey,oneof"`
+}
+
+func (*FieldPathElement_Index) isFieldPathElement_Subscript() {}
+
+func (*FieldPathElement_BoolKey) isFieldPathElement_Subscript() {}
+
+func (*FieldPathElement_IntKey) isFieldPathElement_Subscript() {}
+
+func (*FieldPathElement_UintKey) isFieldPathElement_Subscript() {}
+
+func (*FieldPathElement_StringKey) isFieldPathElement_Subscript() {}
+
+var file_buf_validate_validate_proto_extTypes = []protoimpl.ExtensionInfo{
+ {
+ ExtendedType: (*descriptorpb.MessageOptions)(nil),
+ ExtensionType: (*MessageConstraints)(nil),
+ Field: 1159,
+ Name: "buf.validate.message",
+ Tag: "bytes,1159,opt,name=message",
+ Filename: "buf/validate/validate.proto",
+ },
+ {
+ ExtendedType: (*descriptorpb.OneofOptions)(nil),
+ ExtensionType: (*OneofConstraints)(nil),
+ Field: 1159,
+ Name: "buf.validate.oneof",
+ Tag: "bytes,1159,opt,name=oneof",
+ Filename: "buf/validate/validate.proto",
+ },
+ {
+ ExtendedType: (*descriptorpb.FieldOptions)(nil),
+ ExtensionType: (*FieldConstraints)(nil),
+ Field: 1159,
+ Name: "buf.validate.field",
+ Tag: "bytes,1159,opt,name=field",
+ Filename: "buf/validate/validate.proto",
+ },
+ {
+ ExtendedType: (*descriptorpb.FieldOptions)(nil),
+ ExtensionType: (*PredefinedConstraints)(nil),
+ Field: 1160,
+ Name: "buf.validate.predefined",
+ Tag: "bytes,1160,opt,name=predefined",
+ Filename: "buf/validate/validate.proto",
+ },
+}
+
+// Extension fields to descriptorpb.MessageOptions.
+var (
+ // Rules specify the validations to be performed on this message. By default,
+ // no validation is performed against a message.
+ //
+ // optional buf.validate.MessageConstraints message = 1159;
+ E_Message = &file_buf_validate_validate_proto_extTypes[0]
+)
+
+// Extension fields to descriptorpb.OneofOptions.
+var (
+ // Rules specify the validations to be performed on this oneof. By default,
+ // no validation is performed against a oneof.
+ //
+ // optional buf.validate.OneofConstraints oneof = 1159;
+ E_Oneof = &file_buf_validate_validate_proto_extTypes[1]
+)
+
+// Extension fields to descriptorpb.FieldOptions.
+var (
+ // Rules specify the validations to be performed on this field. By default,
+ // no validation is performed against a field.
+ //
+ // optional buf.validate.FieldConstraints field = 1159;
+ E_Field = &file_buf_validate_validate_proto_extTypes[2]
+ // Specifies predefined rules. When extending a standard constraint message,
+ // this adds additional CEL expressions that apply when the extension is used.
+ //
+ // ```proto
+ //
+ // extend buf.validate.Int32Rules {
+ // bool is_zero [(buf.validate.predefined).cel = {
+ // id: "int32.is_zero",
+ // message: "value must be zero",
+ // expression: "!rule || this == 0",
+ // }];
+ // }
+ //
+ // message Foo {
+ // int32 reserved = 1 [(buf.validate.field).int32.(is_zero) = true];
+ // }
+ //
+ // ```
+ //
+ // optional buf.validate.PredefinedConstraints predefined = 1160;
+ E_Predefined = &file_buf_validate_validate_proto_extTypes[3]
+)
+
+var File_buf_validate_validate_proto protoreflect.FileDescriptor
+
+var file_buf_validate_validate_proto_rawDesc = []byte{
+ 0x0a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x62,
+ 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x20, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64,
+ 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74,
+ 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56,
+ 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07,
+ 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d,
+ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73,
+ 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72,
+ 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x12, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+ 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08,
+ 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08,
+ 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x03, 0x63, 0x65, 0x6c, 0x18,
+ 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52,
+ 0x03, 0x63, 0x65, 0x6c, 0x22, 0x2e, 0x0a, 0x10, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x43, 0x6f, 0x6e,
+ 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75,
+ 0x69, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75,
+ 0x69, 0x72, 0x65, 0x64, 0x22, 0xab, 0x0a, 0x0a, 0x10, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f,
+ 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x63, 0x65, 0x6c,
+ 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74,
+ 0x52, 0x03, 0x63, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28,
+ 0x0e, 0x32, 0x14, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,
+ 0x2e, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x12,
+ 0x30, 0x0a, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18,
+ 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x6c,
+ 0x6f, 0x61, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x05, 0x66, 0x6c, 0x6f, 0x61,
+ 0x74, 0x12, 0x33, 0x0a, 0x06, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,
+ 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x06,
+ 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48,
+ 0x00, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x30, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x36,
+ 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x75, 0x6c, 0x65,
+ 0x73, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x33, 0x0a, 0x06, 0x75, 0x69,
+ 0x6e, 0x74, 0x33, 0x32, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x66,
+ 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32,
+ 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12,
+ 0x33, 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x19, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x55,
+ 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x06, 0x75, 0x69,
+ 0x6e, 0x74, 0x36, 0x34, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x61, 0x74, 0x65, 0x2e, 0x53, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48,
+ 0x00, 0x52, 0x06, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x69, 0x6e,
+ 0x74, 0x36, 0x34, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x66, 0x2e,
+ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52,
+ 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x36,
+ 0x0a, 0x07, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x1a, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x46,
+ 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x66,
+ 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x36, 0x0a, 0x07, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36,
+ 0x34, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x75,
+ 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x12, 0x39,
+ 0x0a, 0x08, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x1b, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e,
+ 0x53, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52,
+ 0x08, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x75,
+ 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x46, 0x69, 0x78, 0x65,
+ 0x64, 0x36, 0x34, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x08, 0x73, 0x66, 0x69, 0x78,
+ 0x65, 0x64, 0x36, 0x34, 0x12, 0x2d, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74,
+ 0x65, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x04, 0x62,
+ 0x6f, 0x6f, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00,
+ 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65,
+ 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x75, 0x6c, 0x65,
+ 0x73, 0x48, 0x00, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x65, 0x6e,
+ 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65,
+ 0x73, 0x48, 0x00, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x39, 0x0a, 0x08, 0x72, 0x65, 0x70,
+ 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x62, 0x75,
+ 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x65, 0x61,
+ 0x74, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65,
+ 0x61, 0x74, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x13, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,
+ 0x2e, 0x4d, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70,
+ 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e,
+ 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x41, 0x6e, 0x79,
+ 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6e, 0x79, 0x12, 0x39, 0x0a, 0x08,
+ 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b,
+ 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x75,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x08, 0x64,
+ 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73,
+ 0x74, 0x61, 0x6d, 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x66,
+ 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
+ 0x61, 0x6d, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65,
+ 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1c, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64,
+ 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70,
+ 0x70, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0c, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x65, 0x6d,
+ 0x70, 0x74, 0x79, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x69,
+ 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79,
+ 0x70, 0x65, 0x22, 0x43, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,
+ 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x63,
+ 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69,
+ 0x6e, 0x74, 0x52, 0x03, 0x63, 0x65, 0x6c, 0x22, 0xea, 0x17, 0x0a, 0x0a, 0x46, 0x6c, 0x6f, 0x61,
+ 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x70, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x02, 0x42, 0x5a, 0xc2, 0x48, 0x57, 0x0a, 0x55, 0x0a, 0x0b, 0x66, 0x6c,
+ 0x6f, 0x61, 0x74, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x02, 0x6c, 0x74, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x02, 0x42, 0x90, 0x01, 0xc2, 0x48, 0x8c, 0x01, 0x0a, 0x89, 0x01, 0x0a,
+ 0x08, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x6c, 0x74, 0x1a, 0x7d, 0x21, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xb4,
+ 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x42, 0x9f, 0x01, 0xc2,
+ 0x48, 0x9b, 0x01, 0x0a, 0x98, 0x01, 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x6c, 0x74,
+ 0x65, 0x1a, 0x8a, 0x01, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69,
+ 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00,
+ 0x52, 0x03, 0x6c, 0x74, 0x65, 0x12, 0xf3, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x02, 0x42, 0xe0, 0x07, 0xc2, 0x48, 0xdc, 0x07, 0x0a, 0x8d, 0x01, 0x0a, 0x08, 0x66, 0x6c,
+ 0x6f, 0x61, 0x74, 0x2e, 0x67, 0x74, 0x1a, 0x80, 0x01, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74,
+ 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc3, 0x01, 0x0a, 0x0b, 0x66, 0x6c,
+ 0x6f, 0x61, 0x74, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xb3, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e,
+ 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a,
+ 0xcd, 0x01, 0x0a, 0x15, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x5f,
+ 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb3, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28,
+ 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c,
+ 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x29, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20,
+ 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a,
+ 0xd3, 0x01, 0x0a, 0x0c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65,
+ 0x1a, 0xc2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74,
+ 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20,
+ 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xdd, 0x01, 0x0a, 0x16, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e,
+ 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65,
+ 0x1a, 0xc2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68,
+ 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x29, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0xbf, 0x08, 0x0a, 0x03,
+ 0x67, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x42, 0xaa, 0x08, 0xc2, 0x48, 0xa6, 0x08,
+ 0x0a, 0x9b, 0x01, 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x8d,
+ 0x01, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61,
+ 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xd2,
+ 0x01, 0x0a, 0x0c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a,
+ 0xc1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69,
+ 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xdc, 0x01, 0x0a, 0x16, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x67, 0x74,
+ 0x65, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xc1,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e,
+ 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x29, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f,
+ 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x0a, 0xe2, 0x01, 0x0a, 0x0d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x67, 0x74, 0x65,
+ 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xd0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20,
+ 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29,
+ 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20,
+ 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xec, 0x01, 0x0a, 0x17, 0x66, 0x6c, 0x6f, 0x61,
+ 0x74, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73,
+ 0x69, 0x76, 0x65, 0x1a, 0xd0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c,
+ 0x7c, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20,
+ 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x79, 0x0a,
+ 0x02, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x02, 0x42, 0x69, 0xc2, 0x48, 0x66, 0x0a, 0x64,
+ 0x0a, 0x08, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29,
+ 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20,
+ 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7d, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f,
+ 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x02, 0x42, 0x66, 0xc2, 0x48, 0x63, 0x0a, 0x61, 0x0a,
+ 0x0c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x1a, 0x51, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74,
+ 0x5f, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x7d, 0x0a, 0x06, 0x66, 0x69, 0x6e, 0x69, 0x74,
+ 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x42, 0x65, 0xc2, 0x48, 0x62, 0x0a, 0x60, 0x0a, 0x0c,
+ 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x1a, 0x50, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x20, 0x3f, 0x20, 0x28, 0x74, 0x68,
+ 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x28, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x69,
+ 0x74, 0x65, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x06,
+ 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x02, 0x42, 0x1a, 0xc2, 0x48, 0x17, 0x0a, 0x15, 0x0a, 0x0d,
+ 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74,
+ 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8,
+ 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x65, 0x73, 0x73, 0x5f,
+ 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f,
+ 0x74, 0x68, 0x61, 0x6e, 0x22, 0xfc, 0x17, 0x0a, 0x0b, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52,
+ 0x75, 0x6c, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x01, 0x42, 0x5b, 0xc2, 0x48, 0x58, 0x0a, 0x56, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62,
+ 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0xa4, 0x01, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x01, 0x42, 0x91, 0x01, 0xc2, 0x48, 0x8d, 0x01, 0x0a, 0x8a, 0x01, 0x0a, 0x09,
+ 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x6c, 0x74, 0x1a, 0x7d, 0x21, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xb5,
+ 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x42, 0xa0, 0x01, 0xc2,
+ 0x48, 0x9c, 0x01, 0x0a, 0x99, 0x01, 0x0a, 0x0a, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x6c,
+ 0x74, 0x65, 0x1a, 0x8a, 0x01, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e,
+ 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20,
+ 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48,
+ 0x00, 0x52, 0x03, 0x6c, 0x74, 0x65, 0x12, 0xf8, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x01, 0x42, 0xe5, 0x07, 0xc2, 0x48, 0xe1, 0x07, 0x0a, 0x8e, 0x01, 0x0a, 0x09, 0x64,
+ 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x67, 0x74, 0x1a, 0x80, 0x01, 0x21, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc4, 0x01, 0x0a, 0x0c,
+ 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xb3, 0x01, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73,
+ 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x0a, 0xce, 0x01, 0x0a, 0x16, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x67, 0x74,
+ 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb3, 0x01,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73,
+ 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xd4, 0x01, 0x0a, 0x0d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x67,
+ 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20,
+ 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29,
+ 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xde, 0x01, 0x0a, 0x17, 0x64,
+ 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63,
+ 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xc2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20,
+ 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29,
+ 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c,
+ 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x02, 0x67,
+ 0x74, 0x12, 0xc4, 0x08, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x42,
+ 0xaf, 0x08, 0xc2, 0x48, 0xab, 0x08, 0x0a, 0x9c, 0x01, 0x0a, 0x0a, 0x64, 0x6f, 0x75, 0x62, 0x6c,
+ 0x65, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x8d, 0x01, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68,
+ 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xd3, 0x01, 0x0a, 0x0d, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65,
+ 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a, 0xc1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28,
+ 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xdd, 0x01, 0x0a, 0x17,
+ 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78,
+ 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xc1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20,
+ 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29,
+ 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xe3, 0x01, 0x0a, 0x0e,
+ 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xd0,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68,
+ 0x69, 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c,
+ 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x0a, 0xed, 0x01, 0x0a, 0x18, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x67, 0x74, 0x65,
+ 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xd0,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69,
+ 0x73, 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26,
+ 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73,
+ 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x48, 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x06,
+ 0x20, 0x03, 0x28, 0x01, 0x42, 0x6a, 0xc2, 0x48, 0x67, 0x0a, 0x65, 0x0a, 0x09, 0x64, 0x6f, 0x75,
+ 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e,
+ 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7e, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x07,
+ 0x20, 0x03, 0x28, 0x01, 0x42, 0x67, 0xc2, 0x48, 0x64, 0x0a, 0x62, 0x0a, 0x0d, 0x64, 0x6f, 0x75,
+ 0x62, 0x6c, 0x65, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e,
+ 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e,
+ 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x7e, 0x0a, 0x06, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x18, 0x08,
+ 0x20, 0x01, 0x28, 0x08, 0x42, 0x66, 0xc2, 0x48, 0x63, 0x0a, 0x61, 0x0a, 0x0d, 0x64, 0x6f, 0x75,
+ 0x62, 0x6c, 0x65, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x1a, 0x50, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x20, 0x3f, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73,
+ 0x2e, 0x69, 0x73, 0x4e, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x2e, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x28, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65,
+ 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x06, 0x66, 0x69,
+ 0x6e, 0x69, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18,
+ 0x09, 0x20, 0x03, 0x28, 0x01, 0x42, 0x1b, 0xc2, 0x48, 0x18, 0x0a, 0x16, 0x0a, 0x0e, 0x64, 0x6f,
+ 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72,
+ 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07,
+ 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74,
+ 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74,
+ 0x68, 0x61, 0x6e, 0x22, 0x94, 0x15, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x75, 0x6c,
+ 0x65, 0x73, 0x12, 0x70, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x05, 0x42, 0x5a, 0xc2, 0x48, 0x57, 0x0a, 0x55, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63,
+ 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x05, 0x42, 0x7c, 0xc2, 0x48, 0x79, 0x0a, 0x77, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e,
+ 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48,
+ 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xa1, 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x05, 0x42, 0x8c, 0x01, 0xc2, 0x48, 0x88, 0x01, 0x0a, 0x85, 0x01, 0x0a, 0x09, 0x69,
+ 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x6c, 0x74, 0x65, 0x1a, 0x78, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x74, 0x65, 0x12, 0x9b, 0x07, 0x0a, 0x02, 0x67, 0x74,
+ 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x88, 0x07, 0xc2, 0x48, 0x84, 0x07, 0x0a, 0x7a, 0x0a,
+ 0x08, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xb3, 0x01, 0x0a, 0x0b, 0x69, 0x6e,
+ 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a,
+ 0xbb, 0x01, 0x0a, 0x15, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x5f,
+ 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc3, 0x01,
+ 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xcb, 0x01, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74,
+ 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25,
+ 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0xe8, 0x07, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x05, 0x42, 0xd3, 0x07, 0xc2, 0x48, 0xcf, 0x07, 0x0a, 0x88, 0x01, 0x0a,
+ 0x09, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc2, 0x01, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x33,
+ 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a, 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xca, 0x01, 0x0a,
+ 0x16, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78,
+ 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xaf, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20,
+ 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20,
+ 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xd2, 0x01, 0x0a, 0x0d, 0x69, 0x6e,
+ 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc0, 0x01, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71,
+ 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xda,
+ 0x01, 0x0a, 0x17, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65,
+ 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe, 0x01, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65,
+ 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x03, 0x67,
+ 0x74, 0x65, 0x12, 0x79, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x05, 0x42, 0x69,
+ 0xc2, 0x48, 0x66, 0x0a, 0x64, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x69, 0x6e, 0x1a,
+ 0x58, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e,
+ 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e,
+ 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7d, 0x0a,
+ 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x05, 0x42, 0x66, 0xc2,
+ 0x48, 0x63, 0x0a, 0x61, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x6e, 0x6f, 0x74, 0x5f,
+ 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e,
+ 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x34, 0x0a, 0x07,
+ 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x05, 0x42, 0x1a, 0xc2,
+ 0x48, 0x17, 0x0a, 0x15, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a,
+ 0x09, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x22, 0x94, 0x15, 0x0a, 0x0a, 0x49,
+ 0x6e, 0x74, 0x36, 0x34, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x70, 0x0a, 0x05, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x5a, 0xc2, 0x48, 0x57, 0x0a, 0x55, 0x0a,
+ 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
+ 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20,
+ 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x02,
+ 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x7c, 0xc2, 0x48, 0x79, 0x0a, 0x77, 0x0a,
+ 0x08, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xa1, 0x01, 0x0a,
+ 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x8c, 0x01, 0xc2, 0x48, 0x88,
+ 0x01, 0x0a, 0x85, 0x01, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x6c, 0x74, 0x65, 0x1a,
+ 0x78, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29,
+ 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x74, 0x65,
+ 0x12, 0x9b, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x88, 0x07,
+ 0xc2, 0x48, 0x84, 0x07, 0x0a, 0x7a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74,
+ 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29,
+ 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x0a, 0xb3, 0x01, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74,
+ 0x1a, 0xa3, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29,
+ 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xbb, 0x01, 0x0a, 0x15, 0x69, 0x6e, 0x74, 0x36, 0x34,
+ 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65,
+ 0x1a, 0xa1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29,
+ 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25,
+ 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20,
+ 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc3, 0x01, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67,
+ 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20,
+ 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcb, 0x01, 0x0a, 0x16, 0x69,
+ 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c,
+ 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0xe8,
+ 0x07, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0xd3, 0x07, 0xc2,
+ 0x48, 0xcf, 0x07, 0x0a, 0x88, 0x01, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74,
+ 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc2,
+ 0x01, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a,
+ 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xca, 0x01, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74,
+ 0x65, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xaf,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20,
+ 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x0a, 0xd2, 0x01, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c,
+ 0x74, 0x65, 0x1a, 0xc0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f,
+ 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xda, 0x01, 0x0a, 0x17, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e,
+ 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76,
+ 0x65, 0x1a, 0xbe, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20,
+ 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25,
+ 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x48, 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x79, 0x0a, 0x02, 0x69, 0x6e, 0x18,
+ 0x06, 0x20, 0x03, 0x28, 0x03, 0x42, 0x69, 0xc2, 0x48, 0x66, 0x0a, 0x64, 0x0a, 0x08, 0x69, 0x6e,
+ 0x74, 0x36, 0x34, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e,
+ 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7d, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x07,
+ 0x20, 0x03, 0x28, 0x03, 0x42, 0x66, 0xc2, 0x48, 0x63, 0x0a, 0x61, 0x0a, 0x0c, 0x69, 0x6e, 0x74,
+ 0x36, 0x34, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e,
+ 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f,
+ 0x74, 0x49, 0x6e, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x09,
+ 0x20, 0x03, 0x28, 0x03, 0x42, 0x1a, 0xc2, 0x48, 0x17, 0x0a, 0x15, 0x0a, 0x0d, 0x69, 0x6e, 0x74,
+ 0x36, 0x34, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65,
+ 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80,
+ 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61,
+ 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61,
+ 0x6e, 0x22, 0xa5, 0x15, 0x0a, 0x0b, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x75, 0x6c, 0x65,
+ 0x73, 0x12, 0x71, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,
+ 0x42, 0x5b, 0xc2, 0x48, 0x58, 0x0a, 0x56, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63,
+ 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x8f, 0x01, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x0d, 0x42, 0x7d, 0xc2, 0x48, 0x7a, 0x0a, 0x78, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32,
+ 0x2e, 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xa2, 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x0d, 0x42, 0x8d, 0x01, 0xc2, 0x48, 0x89, 0x01, 0x0a, 0x86, 0x01, 0x0a, 0x0a,
+ 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x6c, 0x74, 0x65, 0x1a, 0x78, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65,
+ 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20,
+ 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x74, 0x65, 0x12, 0xa0, 0x07, 0x0a, 0x02,
+ 0x67, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x8d, 0x07, 0xc2, 0x48, 0x89, 0x07, 0x0a,
+ 0x7b, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xb4, 0x01, 0x0a,
+ 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xbc, 0x01, 0x0a, 0x16, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67,
+ 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x0a, 0xc4, 0x01, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74,
+ 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20,
+ 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcc, 0x01, 0x0a, 0x17, 0x75, 0x69,
+ 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c,
+ 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0xed,
+ 0x07, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x42, 0xd8, 0x07, 0xc2,
+ 0x48, 0xd4, 0x07, 0x0a, 0x89, 0x01, 0x0a, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67,
+ 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20,
+ 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a,
+ 0xc3, 0x01, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c,
+ 0x74, 0x1a, 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20,
+ 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcb, 0x01, 0x0a, 0x17, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32,
+ 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76,
+ 0x65, 0x1a, 0xaf, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26,
+ 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xd3, 0x01, 0x0a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67,
+ 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xdb, 0x01, 0x0a, 0x18, 0x75, 0x69,
+ 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63,
+ 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x7a,
+ 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0d, 0x42, 0x6a, 0xc2, 0x48, 0x67, 0x0a,
+ 0x65, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69,
+ 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64,
+ 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7e, 0x0a, 0x06, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0d, 0x42, 0x67, 0xc2, 0x48, 0x64, 0x0a,
+ 0x62, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e,
+ 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c,
+ 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x35, 0x0a, 0x07, 0x65, 0x78,
+ 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0d, 0x42, 0x1b, 0xc2, 0x48, 0x18,
+ 0x0a, 0x16, 0x0a, 0x0e, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09,
+ 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x22, 0xa5, 0x15, 0x0a, 0x0b, 0x55, 0x49,
+ 0x6e, 0x74, 0x36, 0x34, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x05, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x5b, 0xc2, 0x48, 0x58, 0x0a, 0x56, 0x0a,
+ 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x8f, 0x01, 0x0a,
+ 0x02, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x7d, 0xc2, 0x48, 0x7a, 0x0a, 0x78,
+ 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xa2,
+ 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x8d, 0x01, 0xc2,
+ 0x48, 0x89, 0x01, 0x0a, 0x86, 0x01, 0x0a, 0x0a, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x6c,
+ 0x74, 0x65, 0x1a, 0x78, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x03,
+ 0x6c, 0x74, 0x65, 0x12, 0xa0, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04,
+ 0x42, 0x8d, 0x07, 0xc2, 0x48, 0x89, 0x07, 0x0a, 0x7b, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36,
+ 0x34, 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20,
+ 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xb4, 0x01, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e,
+ 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xbc, 0x01, 0x0a, 0x16,
+ 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63,
+ 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc4, 0x01, 0x0a, 0x0d, 0x75,
+ 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2, 0x01, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x0a, 0xcc, 0x01, 0x0a, 0x17, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f,
+ 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0xed, 0x07, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x04, 0x42, 0xd8, 0x07, 0xc2, 0x48, 0xd4, 0x07, 0x0a, 0x89, 0x01, 0x0a, 0x0a,
+ 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc3, 0x01, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74,
+ 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a, 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcb, 0x01,
+ 0x0a, 0x17, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x5f,
+ 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xaf, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c,
+ 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xd3, 0x01, 0x0a, 0x0e,
+ 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc0,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c,
+ 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x0a, 0xdb, 0x01, 0x0a, 0x18, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65,
+ 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f,
+ 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65,
+ 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48,
+ 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03,
+ 0x28, 0x04, 0x42, 0x6a, 0xc2, 0x48, 0x67, 0x0a, 0x65, 0x0a, 0x09, 0x75, 0x69, 0x6e, 0x74, 0x36,
+ 0x34, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20,
+ 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d,
+ 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02,
+ 0x69, 0x6e, 0x12, 0x7e, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03,
+ 0x28, 0x04, 0x42, 0x67, 0xc2, 0x48, 0x64, 0x0a, 0x62, 0x0a, 0x0d, 0x75, 0x69, 0x6e, 0x74, 0x36,
+ 0x34, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74,
+ 0x49, 0x6e, 0x12, 0x35, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x08, 0x20,
+ 0x03, 0x28, 0x04, 0x42, 0x1b, 0xc2, 0x48, 0x18, 0x0a, 0x16, 0x0a, 0x0e, 0x75, 0x69, 0x6e, 0x74,
+ 0x36, 0x34, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65,
+ 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80,
+ 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61,
+ 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61,
+ 0x6e, 0x22, 0xa5, 0x15, 0x0a, 0x0b, 0x53, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x75, 0x6c, 0x65,
+ 0x73, 0x12, 0x71, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11,
+ 0x42, 0x5b, 0xc2, 0x48, 0x58, 0x0a, 0x56, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63,
+ 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x8f, 0x01, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x11, 0x42, 0x7d, 0xc2, 0x48, 0x7a, 0x0a, 0x78, 0x0a, 0x09, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32,
+ 0x2e, 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xa2, 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x11, 0x42, 0x8d, 0x01, 0xc2, 0x48, 0x89, 0x01, 0x0a, 0x86, 0x01, 0x0a, 0x0a,
+ 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x6c, 0x74, 0x65, 0x1a, 0x78, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65,
+ 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20,
+ 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x74, 0x65, 0x12, 0xa0, 0x07, 0x0a, 0x02,
+ 0x67, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x11, 0x42, 0x8d, 0x07, 0xc2, 0x48, 0x89, 0x07, 0x0a,
+ 0x7b, 0x0a, 0x09, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xb4, 0x01, 0x0a,
+ 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xbc, 0x01, 0x0a, 0x16, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67,
+ 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x0a, 0xc4, 0x01, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74,
+ 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20,
+ 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcc, 0x01, 0x0a, 0x17, 0x73, 0x69,
+ 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c,
+ 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0xed,
+ 0x07, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x42, 0xd8, 0x07, 0xc2,
+ 0x48, 0xd4, 0x07, 0x0a, 0x89, 0x01, 0x0a, 0x0a, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67,
+ 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20,
+ 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a,
+ 0xc3, 0x01, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c,
+ 0x74, 0x1a, 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20,
+ 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcb, 0x01, 0x0a, 0x17, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32,
+ 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76,
+ 0x65, 0x1a, 0xaf, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26,
+ 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xd3, 0x01, 0x0a, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67,
+ 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xdb, 0x01, 0x0a, 0x18, 0x73, 0x69,
+ 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63,
+ 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x7a,
+ 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x11, 0x42, 0x6a, 0xc2, 0x48, 0x67, 0x0a,
+ 0x65, 0x0a, 0x09, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69,
+ 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64,
+ 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7e, 0x0a, 0x06, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x11, 0x42, 0x67, 0xc2, 0x48, 0x64, 0x0a,
+ 0x62, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e,
+ 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c,
+ 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x35, 0x0a, 0x07, 0x65, 0x78,
+ 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x11, 0x42, 0x1b, 0xc2, 0x48, 0x18,
+ 0x0a, 0x16, 0x0a, 0x0e, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09,
+ 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x22, 0xa5, 0x15, 0x0a, 0x0b, 0x53, 0x49,
+ 0x6e, 0x74, 0x36, 0x34, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x05, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x12, 0x42, 0x5b, 0xc2, 0x48, 0x58, 0x0a, 0x56, 0x0a,
+ 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x8f, 0x01, 0x0a,
+ 0x02, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x12, 0x42, 0x7d, 0xc2, 0x48, 0x7a, 0x0a, 0x78,
+ 0x0a, 0x09, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xa2,
+ 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x12, 0x42, 0x8d, 0x01, 0xc2,
+ 0x48, 0x89, 0x01, 0x0a, 0x86, 0x01, 0x0a, 0x0a, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x6c,
+ 0x74, 0x65, 0x1a, 0x78, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x03,
+ 0x6c, 0x74, 0x65, 0x12, 0xa0, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x12,
+ 0x42, 0x8d, 0x07, 0xc2, 0x48, 0x89, 0x07, 0x0a, 0x7b, 0x0a, 0x09, 0x73, 0x69, 0x6e, 0x74, 0x36,
+ 0x34, 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20,
+ 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xb4, 0x01, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e,
+ 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xbc, 0x01, 0x0a, 0x16,
+ 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63,
+ 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc4, 0x01, 0x0a, 0x0d, 0x73,
+ 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2, 0x01, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x0a, 0xcc, 0x01, 0x0a, 0x17, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f,
+ 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0xed, 0x07, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x12, 0x42, 0xd8, 0x07, 0xc2, 0x48, 0xd4, 0x07, 0x0a, 0x89, 0x01, 0x0a, 0x0a,
+ 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc3, 0x01, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74,
+ 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a, 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcb, 0x01,
+ 0x0a, 0x17, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x5f,
+ 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xaf, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c,
+ 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xd3, 0x01, 0x0a, 0x0e,
+ 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc0,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c,
+ 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x0a, 0xdb, 0x01, 0x0a, 0x18, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65,
+ 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f,
+ 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65,
+ 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48,
+ 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03,
+ 0x28, 0x12, 0x42, 0x6a, 0xc2, 0x48, 0x67, 0x0a, 0x65, 0x0a, 0x09, 0x73, 0x69, 0x6e, 0x74, 0x36,
+ 0x34, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20,
+ 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d,
+ 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02,
+ 0x69, 0x6e, 0x12, 0x7e, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03,
+ 0x28, 0x12, 0x42, 0x67, 0xc2, 0x48, 0x64, 0x0a, 0x62, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x74, 0x36,
+ 0x34, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69,
+ 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74,
+ 0x49, 0x6e, 0x12, 0x35, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x08, 0x20,
+ 0x03, 0x28, 0x12, 0x42, 0x1b, 0xc2, 0x48, 0x18, 0x0a, 0x16, 0x0a, 0x0e, 0x73, 0x69, 0x6e, 0x74,
+ 0x36, 0x34, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65,
+ 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80,
+ 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61,
+ 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61,
+ 0x6e, 0x22, 0xb6, 0x15, 0x0a, 0x0c, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x52, 0x75, 0x6c,
+ 0x65, 0x73, 0x12, 0x72, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x07, 0x42, 0x5c, 0xc2, 0x48, 0x59, 0x0a, 0x57, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33,
+ 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52,
+ 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x90, 0x01, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x07, 0x42, 0x7e, 0xc2, 0x48, 0x7b, 0x0a, 0x79, 0x0a, 0x0a, 0x66, 0x69, 0x78, 0x65,
+ 0x64, 0x33, 0x32, 0x2e, 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x3f, 0x20, 0x27,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x03, 0x6c, 0x74,
+ 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x07, 0x42, 0x8e, 0x01, 0xc2, 0x48, 0x8a, 0x01, 0x0a, 0x87,
+ 0x01, 0x0a, 0x0b, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x6c, 0x74, 0x65, 0x1a, 0x78,
+ 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x74, 0x65, 0x12,
+ 0xa5, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x07, 0x42, 0x92, 0x07, 0xc2,
+ 0x48, 0x8e, 0x07, 0x0a, 0x7c, 0x0a, 0x0a, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67,
+ 0x74, 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x0a, 0xb5, 0x01, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74,
+ 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20,
+ 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xbd, 0x01, 0x0a, 0x17, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c,
+ 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc5, 0x01, 0x0a, 0x0e, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2, 0x01, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x0a, 0xcd, 0x01, 0x0a, 0x18, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74,
+ 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25,
+ 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0xf2, 0x07, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x07, 0x42, 0xdd, 0x07, 0xc2, 0x48, 0xd9, 0x07, 0x0a, 0x8a, 0x01, 0x0a,
+ 0x0b, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc4, 0x01, 0x0a, 0x0e, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a, 0xb1, 0x01, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x0a, 0xcc, 0x01, 0x0a, 0x18, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65,
+ 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xaf, 0x01,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c,
+ 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a,
+ 0xd4, 0x01, 0x0a, 0x0f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f,
+ 0x6c, 0x74, 0x65, 0x1a, 0xc0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xdc, 0x01, 0x0a, 0x19, 0x66, 0x69, 0x78, 0x65, 0x64,
+ 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75,
+ 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x7b, 0x0a, 0x02,
+ 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x07, 0x42, 0x6b, 0xc2, 0x48, 0x68, 0x0a, 0x66, 0x0a,
+ 0x0a, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73,
+ 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79,
+ 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7f, 0x0a, 0x06, 0x6e, 0x6f, 0x74,
+ 0x5f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x07, 0x42, 0x68, 0xc2, 0x48, 0x65, 0x0a, 0x63,
+ 0x0a, 0x0e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e,
+ 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c,
+ 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x36, 0x0a, 0x07, 0x65, 0x78,
+ 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x07, 0x42, 0x1c, 0xc2, 0x48, 0x19,
+ 0x0a, 0x17, 0x0a, 0x0f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a,
+ 0x09, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x22, 0xb6, 0x15, 0x0a, 0x0c, 0x46,
+ 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x72, 0x0a, 0x05, 0x63,
+ 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x06, 0x42, 0x5c, 0xc2, 0x48, 0x59, 0x0a,
+ 0x57, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+ 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12,
+ 0x90, 0x01, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x06, 0x42, 0x7e, 0xc2, 0x48,
+ 0x7b, 0x0a, 0x79, 0x0a, 0x0a, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x6c, 0x74, 0x1a,
+ 0x6b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29,
+ 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02,
+ 0x6c, 0x74, 0x12, 0xa3, 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x06,
+ 0x42, 0x8e, 0x01, 0xc2, 0x48, 0x8a, 0x01, 0x0a, 0x87, 0x01, 0x0a, 0x0b, 0x66, 0x69, 0x78, 0x65,
+ 0x64, 0x36, 0x34, 0x2e, 0x6c, 0x74, 0x65, 0x1a, 0x78, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c,
+ 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x74, 0x65, 0x12, 0xa5, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x06, 0x42, 0x92, 0x07, 0xc2, 0x48, 0x8e, 0x07, 0x0a, 0x7c, 0x0a, 0x0a,
+ 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xb5, 0x01, 0x0a, 0x0d, 0x66,
+ 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x0a, 0xbd, 0x01, 0x0a, 0x17, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67,
+ 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x0a, 0xc5, 0x01, 0x0a, 0x0e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67,
+ 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20,
+ 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcd, 0x01, 0x0a, 0x18, 0x66,
+ 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78,
+ 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x02, 0x67, 0x74,
+ 0x12, 0xf2, 0x07, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x06, 0x42, 0xdd,
+ 0x07, 0xc2, 0x48, 0xd9, 0x07, 0x0a, 0x8a, 0x01, 0x0a, 0x0b, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36,
+ 0x34, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x0a, 0xc4, 0x01, 0x0a, 0x0e, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67,
+ 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a, 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcc, 0x01, 0x0a, 0x18, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63,
+ 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xaf, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xd4, 0x01, 0x0a, 0x0f, 0x66, 0x69, 0x78,
+ 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc0, 0x01, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65,
+ 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a,
+ 0xdc, 0x01, 0x0a, 0x19, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f,
+ 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe, 0x01,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+ 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72,
+ 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71,
+ 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01,
+ 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x7b, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28,
+ 0x06, 0x42, 0x6b, 0xc2, 0x48, 0x68, 0x0a, 0x66, 0x0a, 0x0a, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36,
+ 0x34, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20,
+ 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d,
+ 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02,
+ 0x69, 0x6e, 0x12, 0x7f, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03,
+ 0x28, 0x06, 0x42, 0x68, 0xc2, 0x48, 0x65, 0x0a, 0x63, 0x0a, 0x0e, 0x66, 0x69, 0x78, 0x65, 0x64,
+ 0x36, 0x34, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e,
+ 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f,
+ 0x74, 0x49, 0x6e, 0x12, 0x36, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x08,
+ 0x20, 0x03, 0x28, 0x06, 0x42, 0x1c, 0xc2, 0x48, 0x19, 0x0a, 0x17, 0x0a, 0x0f, 0x66, 0x69, 0x78,
+ 0x65, 0x64, 0x36, 0x34, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72,
+ 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07,
+ 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74,
+ 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74,
+ 0x68, 0x61, 0x6e, 0x22, 0xc8, 0x15, 0x0a, 0x0d, 0x53, 0x46, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32,
+ 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x73, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x0f, 0x42, 0x5d, 0xc2, 0x48, 0x5a, 0x0a, 0x58, 0x0a, 0x0e, 0x73, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+ 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65,
+ 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x91, 0x01, 0x0a, 0x02, 0x6c,
+ 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0f, 0x42, 0x7f, 0xc2, 0x48, 0x7c, 0x0a, 0x7a, 0x0a, 0x0b,
+ 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xa4,
+ 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0f, 0x42, 0x8f, 0x01, 0xc2,
+ 0x48, 0x8b, 0x01, 0x0a, 0x88, 0x01, 0x0a, 0x0c, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32,
+ 0x2e, 0x6c, 0x74, 0x65, 0x1a, 0x78, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00,
+ 0x52, 0x03, 0x6c, 0x74, 0x65, 0x12, 0xaa, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x0f, 0x42, 0x97, 0x07, 0xc2, 0x48, 0x93, 0x07, 0x0a, 0x7d, 0x0a, 0x0b, 0x73, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xb6, 0x01, 0x0a, 0x0e, 0x73, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x0a, 0xbe, 0x01, 0x0a, 0x18, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67,
+ 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1,
+ 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x0a, 0xc6, 0x01, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e,
+ 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c,
+ 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
+ 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xce, 0x01, 0x0a, 0x19,
+ 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x5f,
+ 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20,
+ 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x02,
+ 0x67, 0x74, 0x12, 0xf7, 0x07, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0f,
+ 0x42, 0xe2, 0x07, 0xc2, 0x48, 0xde, 0x07, 0x0a, 0x8b, 0x01, 0x0a, 0x0c, 0x73, 0x66, 0x69, 0x78,
+ 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc5, 0x01, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64,
+ 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a, 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcd, 0x01,
+ 0x0a, 0x19, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c,
+ 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xaf, 0x01, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71,
+ 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xd5, 0x01,
+ 0x0a, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c,
+ 0x74, 0x65, 0x1a, 0xc0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f,
+ 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xdd, 0x01, 0x0a, 0x1a, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64,
+ 0x33, 0x32, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75,
+ 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x7c, 0x0a, 0x02,
+ 0x69, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0f, 0x42, 0x6c, 0xc2, 0x48, 0x69, 0x0a, 0x67, 0x0a,
+ 0x0b, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69,
+ 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64,
+ 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x80, 0x01, 0x0a, 0x06, 0x6e,
+ 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0f, 0x42, 0x69, 0xc2, 0x48, 0x66,
+ 0x0a, 0x64, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e, 0x6e, 0x6f, 0x74,
+ 0x5f, 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69,
+ 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x37, 0x0a,
+ 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0f, 0x42, 0x1d,
+ 0xc2, 0x48, 0x1a, 0x0a, 0x18, 0x0a, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x2e,
+ 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65,
+ 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80,
+ 0x02, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e,
+ 0x0a, 0x0c, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x22, 0xc8,
+ 0x15, 0x0a, 0x0d, 0x53, 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x52, 0x75, 0x6c, 0x65, 0x73,
+ 0x12, 0x73, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x10, 0x42,
+ 0x5d, 0xc2, 0x48, 0x5a, 0x0a, 0x58, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34,
+ 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x91, 0x01, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x10, 0x42, 0x7f, 0xc2, 0x48, 0x7c, 0x0a, 0x7a, 0x0a, 0x0b, 0x73, 0x66, 0x69, 0x78, 0x65,
+ 0x64, 0x36, 0x34, 0x2e, 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x3f, 0x20, 0x27,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xa4, 0x01, 0x0a, 0x03, 0x6c, 0x74,
+ 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x10, 0x42, 0x8f, 0x01, 0xc2, 0x48, 0x8b, 0x01, 0x0a, 0x88,
+ 0x01, 0x0a, 0x0c, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x6c, 0x74, 0x65, 0x1a,
+ 0x78, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29,
+ 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x74, 0x65,
+ 0x12, 0xaa, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x10, 0x42, 0x97, 0x07,
+ 0xc2, 0x48, 0x93, 0x07, 0x0a, 0x7d, 0x0a, 0x0b, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34,
+ 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xb6, 0x01, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34,
+ 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xbe, 0x01, 0x0a,
+ 0x18, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x5f,
+ 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc6, 0x01,
+ 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74,
+ 0x65, 0x1a, 0xb2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20,
+ 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xce, 0x01, 0x0a, 0x19, 0x73, 0x66, 0x69, 0x78, 0x65,
+ 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75,
+ 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0xf7, 0x07,
+ 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x10, 0x42, 0xe2, 0x07, 0xc2, 0x48,
+ 0xde, 0x07, 0x0a, 0x8b, 0x01, 0x0a, 0x0c, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e,
+ 0x67, 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x0a, 0xc5, 0x01, 0x0a, 0x0f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74,
+ 0x65, 0x5f, 0x6c, 0x74, 0x1a, 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f,
+ 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcd, 0x01, 0x0a, 0x19, 0x73, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63,
+ 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xaf, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xd5, 0x01, 0x0a, 0x10, 0x73, 0x66, 0x69,
+ 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc0, 0x01,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x0a, 0xdd, 0x01, 0x0a, 0x1a, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x67, 0x74,
+ 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a,
+ 0xbe, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29,
+ 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26,
+ 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x48, 0x01, 0x52, 0x03, 0x67, 0x74, 0x65, 0x12, 0x7c, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x06, 0x20,
+ 0x03, 0x28, 0x10, 0x42, 0x6c, 0xc2, 0x48, 0x69, 0x0a, 0x67, 0x0a, 0x0b, 0x73, 0x66, 0x69, 0x78,
+ 0x65, 0x64, 0x36, 0x34, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69,
+ 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x80, 0x01, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e,
+ 0x18, 0x07, 0x20, 0x03, 0x28, 0x10, 0x42, 0x69, 0xc2, 0x48, 0x66, 0x0a, 0x64, 0x0a, 0x0f, 0x73,
+ 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x1a, 0x51,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73,
+ 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x37, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x10, 0x42, 0x1d, 0xc2, 0x48, 0x1a, 0x0a, 0x18,
+ 0x0a, 0x10, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09,
+ 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x22, 0xbc, 0x01, 0x0a, 0x09, 0x42, 0x6f,
+ 0x6f, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x6f, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x59, 0xc2, 0x48, 0x56, 0x0a, 0x54, 0x0a, 0x0a, 0x62,
+ 0x6f, 0x6f, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x08, 0x42, 0x19, 0xc2, 0x48, 0x16, 0x0a, 0x14,
+ 0x0a, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04,
+ 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08,
+ 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xa1, 0x39, 0x0a, 0x0b, 0x53, 0x74, 0x72,
+ 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x73, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73,
+ 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5d, 0xc2, 0x48, 0x5a, 0x0a, 0x58, 0x0a, 0x0c,
+ 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x48, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
+ 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x60, 0x25, 0x73, 0x60, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x83, 0x01,
+ 0x0a, 0x03, 0x6c, 0x65, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x04, 0x42, 0x71, 0xc2, 0x48, 0x6e,
+ 0x0a, 0x6c, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6c, 0x65, 0x6e, 0x1a, 0x5e,
+ 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29,
+ 0x29, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x20, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x25, 0x73, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63,
+ 0x74, 0x65, 0x72, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x03,
+ 0x6c, 0x65, 0x6e, 0x12, 0xa1, 0x01, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x87, 0x01, 0xc2, 0x48, 0x83, 0x01, 0x0a, 0x80, 0x01, 0x0a,
+ 0x0e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x1a,
+ 0x6e, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28,
+ 0x29, 0x29, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x6c,
+ 0x65, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67,
+ 0x74, 0x68, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65,
+ 0x61, 0x73, 0x74, 0x20, 0x25, 0x73, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52,
+ 0x06, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x12, 0x9f, 0x01, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f,
+ 0x6c, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x85, 0x01, 0xc2, 0x48, 0x81, 0x01,
+ 0x0a, 0x7f, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x6c,
+ 0x65, 0x6e, 0x1a, 0x6d, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69,
+ 0x7a, 0x65, 0x28, 0x29, 0x29, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61,
+ 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6c,
+ 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x74,
+ 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x25, 0x73, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+ 0x65, 0x72, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0xa5, 0x01, 0x0a, 0x09, 0x6c, 0x65,
+ 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x04, 0x42, 0x87, 0x01,
+ 0xc2, 0x48, 0x83, 0x01, 0x0a, 0x80, 0x01, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e,
+ 0x6c, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x1a, 0x6c, 0x75, 0x69, 0x6e, 0x74, 0x28,
+ 0x62, 0x79, 0x74, 0x65, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x73, 0x69, 0x7a, 0x65,
+ 0x28, 0x29, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e,
+ 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x25,
+ 0x73, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x08, 0x6c, 0x65, 0x6e, 0x42, 0x79, 0x74, 0x65,
+ 0x73, 0x12, 0xad, 0x01, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x04, 0x42, 0x8f, 0x01, 0xc2, 0x48, 0x8b, 0x01, 0x0a, 0x88, 0x01, 0x0a,
+ 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65,
+ 0x73, 0x1a, 0x74, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x28, 0x74, 0x68,
+ 0x69, 0x73, 0x29, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x29, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x25,
+ 0x73, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x42, 0x79, 0x74, 0x65,
+ 0x73, 0x12, 0xac, 0x01, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x04, 0x42, 0x8e, 0x01, 0xc2, 0x48, 0x8a, 0x01, 0x0a, 0x87, 0x01, 0x0a,
+ 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65,
+ 0x73, 0x1a, 0x73, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x28, 0x74, 0x68,
+ 0x69, 0x73, 0x29, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x29, 0x20, 0x3e, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x25, 0x73,
+ 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73,
+ 0x12, 0x96, 0x01, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01,
+ 0x28, 0x09, 0x42, 0x7c, 0xc2, 0x48, 0x79, 0x0a, 0x77, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x69, 0x6e,
+ 0x67, 0x2e, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x1a, 0x65, 0x21, 0x74, 0x68, 0x69, 0x73,
+ 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70,
+ 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20,
+ 0x72, 0x65, 0x67, 0x65, 0x78, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x60, 0x25,
+ 0x73, 0x60, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x8c, 0x01, 0x0a, 0x06, 0x70, 0x72,
+ 0x65, 0x66, 0x69, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x74, 0xc2, 0x48, 0x71, 0x0a,
+ 0x6f, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+ 0x1a, 0x5e, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x57, 0x69,
+ 0x74, 0x68, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29,
+ 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x60,
+ 0x25, 0x73, 0x60, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27,
+ 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x8a, 0x01, 0x0a, 0x06, 0x73, 0x75, 0x66,
+ 0x66, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x72, 0xc2, 0x48, 0x6f, 0x0a, 0x6d,
+ 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x1a,
+ 0x5c, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x29, 0x20, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+ 0x68, 0x61, 0x76, 0x65, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x20, 0x60, 0x25, 0x73, 0x60,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x06, 0x73,
+ 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x9a, 0x01, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x7e, 0xc2, 0x48, 0x7b, 0x0a, 0x79, 0x0a,
+ 0x0f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73,
+ 0x1a, 0x66, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x29,
+ 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x20, 0x60, 0x25, 0x73, 0x60, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+ 0x73, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x73, 0x12, 0xa5, 0x01, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+ 0x69, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x42, 0x81, 0x01, 0xc2, 0x48, 0x7e, 0x0a,
+ 0x7c, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x1a, 0x65, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e,
+ 0x74, 0x61, 0x69, 0x6e, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f,
+ 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x73, 0x75, 0x62, 0x73,
+ 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x60, 0x25, 0x73, 0x60, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x0b, 0x6e,
+ 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x02, 0x69, 0x6e,
+ 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x42, 0x6a, 0xc2, 0x48, 0x67, 0x0a, 0x65, 0x0a, 0x09, 0x73,
+ 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6e, 0x1a, 0x58, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27,
+ 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7e, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e,
+ 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x42, 0x67, 0xc2, 0x48, 0x64, 0x0a, 0x62, 0x0a, 0x0d, 0x73,
+ 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f,
+ 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52,
+ 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0xe6, 0x01, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+ 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x42, 0xcd, 0x01, 0xc2, 0x48, 0xc9, 0x01, 0x0a, 0x61, 0x0a,
+ 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x23, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x20, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x1a, 0x2c, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+ 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c,
+ 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x28, 0x29,
+ 0x0a, 0x64, 0x0a, 0x12, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+ 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x32, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73,
+ 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x65, 0x6d, 0x61,
+ 0x69, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1a, 0x21, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12,
+ 0xf1, 0x01, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01,
+ 0x28, 0x08, 0x42, 0xd2, 0x01, 0xc2, 0x48, 0xce, 0x01, 0x0a, 0x65, 0x0a, 0x0f, 0x73, 0x74, 0x72,
+ 0x69, 0x6e, 0x67, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x32, 0x21, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x29,
+ 0x0a, 0x65, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x6e,
+ 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68,
+ 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20,
+ 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x1d, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e,
+ 0x61, 0x6d, 0x65, 0x12, 0xcb, 0x01, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08,
+ 0x42, 0xb8, 0x01, 0xc2, 0x48, 0xb4, 0x01, 0x0a, 0x55, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e,
+ 0x67, 0x2e, 0x69, 0x70, 0x12, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x61,
+ 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x26, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69,
+ 0x70, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20,
+ 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49, 0x70, 0x28, 0x29, 0x0a, 0x5b,
+ 0x0a, 0x0f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x5f, 0x65, 0x6d, 0x70, 0x74,
+ 0x79, 0x12, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74,
+ 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+ 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x1a, 0x17, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x69,
+ 0x70, 0x12, 0xdc, 0x01, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x34, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08,
+ 0x42, 0xc5, 0x01, 0xc2, 0x48, 0xc1, 0x01, 0x0a, 0x5c, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e,
+ 0x67, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x12, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50,
+ 0x76, 0x34, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x29, 0x21, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73,
+ 0x49, 0x70, 0x28, 0x34, 0x29, 0x0a, 0x61, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e,
+ 0x69, 0x70, 0x76, 0x34, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63,
+ 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x20, 0x49, 0x50, 0x76, 0x34, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x19, 0x21,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x34,
+ 0x12, 0xdc, 0x01, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x42,
+ 0xc5, 0x01, 0xc2, 0x48, 0xc1, 0x01, 0x0a, 0x5c, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+ 0x2e, 0x69, 0x70, 0x76, 0x36, 0x12, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x76,
+ 0x36, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x29, 0x21, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x69, 0x70, 0x76, 0x36, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d,
+ 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49,
+ 0x70, 0x28, 0x36, 0x29, 0x0a, 0x61, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69,
+ 0x70, 0x76, 0x36, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68,
+ 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20,
+ 0x49, 0x50, 0x76, 0x36, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x19, 0x21, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x36, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x04, 0x69, 0x70, 0x76, 0x36, 0x12,
+ 0xc4, 0x01, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x42, 0xaf, 0x01,
+ 0xc2, 0x48, 0xab, 0x01, 0x0a, 0x51, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x75,
+ 0x72, 0x69, 0x12, 0x19, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x52, 0x49, 0x1a, 0x28, 0x21,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x75, 0x72, 0x69, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e,
+ 0x69, 0x73, 0x55, 0x72, 0x69, 0x28, 0x29, 0x0a, 0x56, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x69, 0x6e,
+ 0x67, 0x2e, 0x75, 0x72, 0x69, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x28, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x20, 0x55, 0x52, 0x49, 0x1a, 0x18, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x75, 0x72,
+ 0x69, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48,
+ 0x00, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x6e, 0x0a, 0x07, 0x75, 0x72, 0x69, 0x5f, 0x72, 0x65,
+ 0x66, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x42, 0x53, 0xc2, 0x48, 0x50, 0x0a, 0x4e, 0x0a, 0x0e,
+ 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x75, 0x72, 0x69, 0x5f, 0x72, 0x65, 0x66, 0x12, 0x19,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20,
+ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x52, 0x49, 0x1a, 0x21, 0x21, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x75, 0x72, 0x69, 0x5f, 0x72, 0x65, 0x66, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x2e, 0x69, 0x73, 0x55, 0x72, 0x69, 0x52, 0x65, 0x66, 0x28, 0x29, 0x48, 0x00, 0x52, 0x06,
+ 0x75, 0x72, 0x69, 0x52, 0x65, 0x66, 0x12, 0x99, 0x02, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x42, 0xfc, 0x01, 0xc2, 0x48, 0xf8, 0x01, 0x0a,
+ 0x81, 0x01, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x12, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61,
+ 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x70, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+ 0x73, 0x1a, 0x40, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
+ 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20,
+ 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61,
+ 0x6d, 0x65, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49,
+ 0x70, 0x28, 0x29, 0x0a, 0x72, 0x0a, 0x14, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x61, 0x64,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69,
+ 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69,
+ 0x70, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1c, 0x21, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
+ 0x73, 0x73, 0x12, 0x9e, 0x02, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28,
+ 0x08, 0x42, 0x87, 0x02, 0xc2, 0x48, 0x83, 0x02, 0x0a, 0xa5, 0x01, 0x0a, 0x0b, 0x73, 0x74, 0x72,
+ 0x69, 0x6e, 0x67, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20,
+ 0x55, 0x55, 0x49, 0x44, 0x1a, 0x7a, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x75, 0x75, 0x69,
+ 0x64, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20,
+ 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28,
+ 0x27, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x38, 0x7d,
+ 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d,
+ 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b,
+ 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, 0x30,
+ 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x31, 0x32, 0x7d, 0x24, 0x27, 0x29,
+ 0x0a, 0x59, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x5f,
+ 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x29, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20,
+ 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x55, 0x49, 0x44,
+ 0x1a, 0x19, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x75, 0x75, 0x69, 0x64, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x04, 0x75,
+ 0x75, 0x69, 0x64, 0x12, 0xf7, 0x01, 0x0a, 0x05, 0x74, 0x75, 0x75, 0x69, 0x64, 0x18, 0x21, 0x20,
+ 0x01, 0x28, 0x08, 0x42, 0xde, 0x01, 0xc2, 0x48, 0xda, 0x01, 0x0a, 0x73, 0x0a, 0x0c, 0x73, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x74, 0x75, 0x75, 0x69, 0x64, 0x12, 0x22, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x20, 0x55, 0x55, 0x49, 0x44, 0x1a, 0x3f,
+ 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x74, 0x75, 0x75, 0x69, 0x64, 0x20, 0x7c, 0x7c, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x30, 0x2d,
+ 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x33, 0x32, 0x7d, 0x24, 0x27, 0x29, 0x0a,
+ 0x63, 0x0a, 0x12, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x74, 0x75, 0x75, 0x69, 0x64, 0x5f,
+ 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20,
+ 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20,
+ 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x72, 0x69, 0x6d,
+ 0x6d, 0x65, 0x64, 0x20, 0x55, 0x55, 0x49, 0x44, 0x1a, 0x1a, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x74, 0x75, 0x75, 0x69, 0x64, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21,
+ 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x05, 0x74, 0x75, 0x75, 0x69, 0x64, 0x12, 0xa7, 0x02,
+ 0x0a, 0x11, 0x69, 0x70, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+ 0x6c, 0x65, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x42, 0xf8, 0x01, 0xc2, 0x48, 0xf4, 0x01,
+ 0x0a, 0x78, 0x0a, 0x18, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x5f, 0x77, 0x69,
+ 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x12, 0x1f, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x3b, 0x21,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72,
+ 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73,
+ 0x49, 0x70, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x29, 0x0a, 0x78, 0x0a, 0x1e, 0x73, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65,
+ 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2e, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68,
+ 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x26, 0x21, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65,
+ 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21,
+ 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x70, 0x57, 0x69, 0x74, 0x68, 0x50, 0x72,
+ 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x12, 0xe2, 0x02, 0x0a, 0x13, 0x69, 0x70, 0x76, 0x34,
+ 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x18,
+ 0x1b, 0x20, 0x01, 0x28, 0x08, 0x42, 0xaf, 0x02, 0xc2, 0x48, 0xab, 0x02, 0x0a, 0x93, 0x01, 0x0a,
+ 0x1a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x77, 0x69, 0x74,
+ 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x12, 0x35, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x20, 0x49, 0x50, 0x76, 0x34, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x6c, 0x65, 0x6e, 0x67,
+ 0x74, 0x68, 0x1a, 0x3e, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x5f,
+ 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x20, 0x7c,
+ 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49, 0x70, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28,
+ 0x34, 0x29, 0x0a, 0x92, 0x01, 0x0a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70,
+ 0x76, 0x34, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65,
+ 0x6e, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x44, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69,
+ 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50,
+ 0x76, 0x34, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+ 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x1a, 0x28, 0x21,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f,
+ 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x11, 0x69, 0x70, 0x76, 0x34, 0x57,
+ 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x12, 0xe2, 0x02, 0x0a,
+ 0x13, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69,
+ 0x78, 0x6c, 0x65, 0x6e, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x08, 0x42, 0xaf, 0x02, 0xc2, 0x48, 0xab,
+ 0x02, 0x0a, 0x93, 0x01, 0x0a, 0x1a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x76,
+ 0x36, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e,
+ 0x12, 0x35, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x76, 0x36, 0x20, 0x61, 0x64, 0x64,
+ 0x72, 0x65, 0x73, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+ 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x1a, 0x3e, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x69, 0x70, 0x76, 0x36, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+ 0x6c, 0x65, 0x6e, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27,
+ 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49, 0x70, 0x50, 0x72,
+ 0x65, 0x66, 0x69, 0x78, 0x28, 0x36, 0x29, 0x0a, 0x92, 0x01, 0x0a, 0x20, 0x73, 0x74, 0x72, 0x69,
+ 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65,
+ 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x44, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68,
+ 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c,
+ 0x69, 0x64, 0x20, 0x49, 0x50, 0x76, 0x36, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20,
+ 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x6c, 0x65, 0x6e, 0x67,
+ 0x74, 0x68, 0x1a, 0x28, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x36, 0x5f,
+ 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65, 0x6e, 0x20, 0x7c,
+ 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x11,
+ 0x69, 0x70, 0x76, 0x36, 0x57, 0x69, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6c, 0x65,
+ 0x6e, 0x12, 0xfc, 0x01, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18,
+ 0x1d, 0x20, 0x01, 0x28, 0x08, 0x42, 0xdc, 0x01, 0xc2, 0x48, 0xd8, 0x01, 0x0a, 0x6c, 0x0a, 0x10,
+ 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+ 0x12, 0x1f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69,
+ 0x78, 0x1a, 0x37, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x5f, 0x70, 0x72, 0x65,
+ 0x66, 0x69, 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27,
+ 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49, 0x70, 0x50, 0x72,
+ 0x65, 0x66, 0x69, 0x78, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x68, 0x0a, 0x16, 0x73, 0x74,
+ 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x65,
+ 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65,
+ 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x70, 0x72,
+ 0x65, 0x66, 0x69, 0x78, 0x1a, 0x1e, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x5f,
+ 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21,
+ 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x08, 0x69, 0x70, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78,
+ 0x12, 0x8f, 0x02, 0x0a, 0x0b, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+ 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x42, 0xeb, 0x01, 0xc2, 0x48, 0xe7, 0x01, 0x0a, 0x75, 0x0a,
+ 0x12, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x70, 0x72, 0x65,
+ 0x66, 0x69, 0x78, 0x12, 0x21, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x76, 0x34, 0x20,
+ 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x3c, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69,
+ 0x70, 0x76, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x2e, 0x69, 0x73, 0x49, 0x70, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x34, 0x2c, 0x20, 0x74,
+ 0x72, 0x75, 0x65, 0x29, 0x0a, 0x6e, 0x0a, 0x18, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69,
+ 0x70, 0x76, 0x34, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79,
+ 0x12, 0x30, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79,
+ 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61,
+ 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x76, 0x34, 0x20, 0x70, 0x72, 0x65, 0x66,
+ 0x69, 0x78, 0x1a, 0x20, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x5f,
+ 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21,
+ 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x70, 0x76, 0x34, 0x50, 0x72, 0x65, 0x66,
+ 0x69, 0x78, 0x12, 0x8f, 0x02, 0x0a, 0x0b, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x70, 0x72, 0x65, 0x66,
+ 0x69, 0x78, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x42, 0xeb, 0x01, 0xc2, 0x48, 0xe7, 0x01, 0x0a,
+ 0x75, 0x0a, 0x12, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x70,
+ 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x76,
+ 0x36, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x3c, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x7c, 0x7c, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49, 0x70, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x36, 0x2c,
+ 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x6e, 0x0a, 0x18, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+ 0x2e, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x65, 0x6d, 0x70,
+ 0x74, 0x79, 0x12, 0x30, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70,
+ 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x76, 0x36, 0x20, 0x70, 0x72,
+ 0x65, 0x66, 0x69, 0x78, 0x1a, 0x20, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76,
+ 0x36, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x70, 0x76, 0x36, 0x50, 0x72,
+ 0x65, 0x66, 0x69, 0x78, 0x12, 0xc2, 0x02, 0x0a, 0x0d, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x6e,
+ 0x64, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x42, 0x9b, 0x02, 0xc2,
+ 0x48, 0x97, 0x02, 0x0a, 0x99, 0x01, 0x0a, 0x14, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x68,
+ 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x41, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x28, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61,
+ 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
+ 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x69, 0x72, 0x1a,
+ 0x3e, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x64,
+ 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d,
+ 0x20, 0x27, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x48, 0x6f,
+ 0x73, 0x74, 0x41, 0x6e, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a,
+ 0x79, 0x0a, 0x1a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x61,
+ 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77,
+ 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x72,
+ 0x74, 0x20, 0x70, 0x61, 0x69, 0x72, 0x1a, 0x22, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x68,
+ 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7c, 0x7c, 0x20,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x0b, 0x68, 0x6f,
+ 0x73, 0x74, 0x41, 0x6e, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x12, 0xb8, 0x05, 0x0a, 0x10, 0x77, 0x65,
+ 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x18, 0x18,
+ 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x61, 0x74, 0x65, 0x2e, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x42, 0xf1,
+ 0x04, 0xc2, 0x48, 0xed, 0x04, 0x0a, 0xf0, 0x01, 0x0a, 0x23, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+ 0x2e, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x65,
+ 0x78, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76,
+ 0x61, 0x6c, 0x69, 0x64, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0xa0, 0x01, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x77, 0x65,
+ 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x20, 0x21,
+ 0x3d, 0x20, 0x31, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x27,
+ 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65,
+ 0x73, 0x28, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x74, 0x72,
+ 0x69, 0x63, 0x74, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x74,
+ 0x72, 0x69, 0x63, 0x74, 0x20, 0x3f, 0x27, 0x5e, 0x3a, 0x3f, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d,
+ 0x7a, 0x41, 0x2d, 0x5a, 0x21, 0x23, 0x24, 0x25, 0x26, 0x5c, 0x27, 0x2a, 0x2b, 0x2d, 0x2e, 0x5e,
+ 0x5f, 0x7c, 0x7e, 0x5c, 0x78, 0x36, 0x30, 0x5d, 0x2b, 0x24, 0x27, 0x20, 0x3a, 0x27, 0x5e, 0x5b,
+ 0x5e, 0x5c, 0x75, 0x30, 0x30, 0x30, 0x30, 0x5c, 0x75, 0x30, 0x30, 0x30, 0x41, 0x5c, 0x75, 0x30,
+ 0x30, 0x30, 0x44, 0x5d, 0x2b, 0x24, 0x27, 0x29, 0x0a, 0x8d, 0x01, 0x0a, 0x29, 0x73, 0x74, 0x72,
+ 0x69, 0x6e, 0x67, 0x2e, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72,
+ 0x65, 0x67, 0x65, 0x78, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
+ 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73,
+ 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x48, 0x54, 0x54,
+ 0x50, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x29, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f,
+ 0x72, 0x65, 0x67, 0x65, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x31, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x27, 0x27, 0x0a, 0xe7, 0x01, 0x0a, 0x24, 0x73, 0x74, 0x72,
+ 0x69, 0x6e, 0x67, 0x2e, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72,
+ 0x65, 0x67, 0x65, 0x78, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x12, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x68, 0x65,
+ 0x61, 0x64, 0x65, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x95, 0x01, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72, 0x65,
+ 0x67, 0x65, 0x78, 0x20, 0x21, 0x3d, 0x20, 0x32, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, 0x3f, 0x27, 0x5e, 0x5b,
+ 0x5e, 0x5c, 0x75, 0x30, 0x30, 0x30, 0x30, 0x2d, 0x5c, 0x75, 0x30, 0x30, 0x30, 0x38, 0x5c, 0x75,
+ 0x30, 0x30, 0x30, 0x41, 0x2d, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x46, 0x5c, 0x75, 0x30, 0x30, 0x37,
+ 0x46, 0x5d, 0x2a, 0x24, 0x27, 0x20, 0x3a, 0x27, 0x5e, 0x5b, 0x5e, 0x5c, 0x75, 0x30, 0x30, 0x30,
+ 0x30, 0x5c, 0x75, 0x30, 0x30, 0x30, 0x41, 0x5c, 0x75, 0x30, 0x30, 0x30, 0x44, 0x5d, 0x2a, 0x24,
+ 0x27, 0x29, 0x48, 0x00, 0x52, 0x0e, 0x77, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x52,
+ 0x65, 0x67, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x18, 0x19,
+ 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x07,
+ 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x22, 0x20, 0x03, 0x28, 0x09, 0x42, 0x1b, 0xc2,
+ 0x48, 0x18, 0x0a, 0x16, 0x0a, 0x0e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x65, 0x78, 0x61,
+ 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d,
+ 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0c,
+ 0x0a, 0x0a, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0xa3, 0x11, 0x0a,
+ 0x0a, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x05, 0x63,
+ 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x57, 0xc2, 0x48, 0x54, 0x0a,
+ 0x52, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x43,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f,
+ 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x25, 0x78, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x03, 0x6c, 0x65,
+ 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x42, 0x6b, 0xc2, 0x48, 0x68, 0x0a, 0x66, 0x0a, 0x09,
+ 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x1a, 0x59, 0x75, 0x69, 0x6e, 0x74, 0x28,
+ 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x29, 0x20, 0x21, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
+ 0x65, 0x20, 0x25, 0x73, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x5d, 0x29, 0x20,
+ 0x3a, 0x20, 0x27, 0x27, 0x52, 0x03, 0x6c, 0x65, 0x6e, 0x12, 0x98, 0x01, 0x0a, 0x07, 0x6d, 0x69,
+ 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x7f, 0xc2, 0x48, 0x7c,
+ 0x0a, 0x7a, 0x0a, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65,
+ 0x6e, 0x1a, 0x69, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a,
+ 0x65, 0x28, 0x29, 0x29, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x69, 0x6e,
+ 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6c, 0x65,
+ 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x74, 0x20,
+ 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x25, 0x73, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x69,
+ 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x06, 0x6d, 0x69,
+ 0x6e, 0x4c, 0x65, 0x6e, 0x12, 0x90, 0x01, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x77, 0xc2, 0x48, 0x74, 0x0a, 0x72, 0x0a, 0x0d, 0x62,
+ 0x79, 0x74, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x1a, 0x61, 0x75, 0x69,
+ 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x29, 0x20,
+ 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x20,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x25, 0x73, 0x20, 0x62, 0x79, 0x74, 0x65,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52,
+ 0x06, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x99, 0x01, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74,
+ 0x65, 0x72, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x7f, 0xc2, 0x48, 0x7c, 0x0a, 0x7a,
+ 0x0a, 0x0d, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x1a,
+ 0x69, 0x21, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x2e, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x61, 0x74,
+ 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x72, 0x65, 0x67, 0x65, 0x78, 0x20,
+ 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x60, 0x25, 0x73, 0x60, 0x27, 0x2e, 0x66, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x61, 0x74, 0x74,
+ 0x65, 0x72, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74,
+ 0x65, 0x72, 0x6e, 0x12, 0x89, 0x01, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x0c, 0x42, 0x71, 0xc2, 0x48, 0x6e, 0x0a, 0x6c, 0x0a, 0x0c, 0x62, 0x79, 0x74,
+ 0x65, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x5c, 0x21, 0x74, 0x68, 0x69, 0x73,
+ 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65,
+ 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x25, 0x78, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12,
+ 0x87, 0x01, 0x0a, 0x06, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c,
+ 0x42, 0x6f, 0xc2, 0x48, 0x6c, 0x0a, 0x6a, 0x0a, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x73,
+ 0x75, 0x66, 0x66, 0x69, 0x78, 0x1a, 0x5a, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64,
+ 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x75, 0x66, 0x66,
+ 0x69, 0x78, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x65,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69,
+ 0x78, 0x20, 0x25, 0x78, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x52, 0x06, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x8d, 0x01, 0x0a, 0x08, 0x63, 0x6f,
+ 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x71, 0xc2, 0x48,
+ 0x6e, 0x0a, 0x6c, 0x0a, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+ 0x69, 0x6e, 0x73, 0x1a, 0x5a, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+ 0x69, 0x6e, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x65,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x25, 0x78,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52,
+ 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x9b, 0x01, 0x0a, 0x02, 0x69, 0x6e,
+ 0x18, 0x08, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x8a, 0x01, 0xc2, 0x48, 0x86, 0x01, 0x0a, 0x83, 0x01,
+ 0x0a, 0x08, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x1a, 0x77, 0x64, 0x79, 0x6e, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x2e, 0x73, 0x69, 0x7a,
+ 0x65, 0x28, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x21, 0x28, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b,
+ 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7d, 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69,
+ 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0c, 0x42, 0x66, 0xc2, 0x48, 0x63, 0x0a, 0x61, 0x0a, 0x0c,
+ 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f,
+ 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52,
+ 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0xef, 0x01, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x0a, 0x20,
+ 0x01, 0x28, 0x08, 0x42, 0xdc, 0x01, 0xc2, 0x48, 0xd8, 0x01, 0x0a, 0x74, 0x0a, 0x08, 0x62, 0x79,
+ 0x74, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x12, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50,
+ 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x46, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x69, 0x70, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65,
+ 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e,
+ 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x7c, 0x7c, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x36,
+ 0x0a, 0x60, 0x0a, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x5f, 0x65, 0x6d, 0x70,
+ 0x74, 0x79, 0x12, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70,
+ 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+ 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72,
+ 0x65, 0x73, 0x73, 0x1a, 0x1d, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x20, 0x7c,
+ 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x21, 0x3d,
+ 0x20, 0x30, 0x48, 0x00, 0x52, 0x02, 0x69, 0x70, 0x12, 0xea, 0x01, 0x0a, 0x04, 0x69, 0x70, 0x76,
+ 0x34, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x42, 0xd3, 0x01, 0xc2, 0x48, 0xcf, 0x01, 0x0a, 0x65,
+ 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x12, 0x22, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61,
+ 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x76, 0x34, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
+ 0x1a, 0x33, 0x21, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20,
+ 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29,
+ 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x0a, 0x66, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x69,
+ 0x70, 0x76, 0x34, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68,
+ 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20,
+ 0x49, 0x50, 0x76, 0x34, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1f, 0x21, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x34, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x48, 0x00, 0x52,
+ 0x04, 0x69, 0x70, 0x76, 0x34, 0x12, 0xeb, 0x01, 0x0a, 0x04, 0x69, 0x70, 0x76, 0x36, 0x18, 0x0c,
+ 0x20, 0x01, 0x28, 0x08, 0x42, 0xd4, 0x01, 0xc2, 0x48, 0xd0, 0x01, 0x0a, 0x66, 0x0a, 0x0a, 0x62,
+ 0x79, 0x74, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x36, 0x12, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x20, 0x49, 0x50, 0x76, 0x36, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x34, 0x21,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x36, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x7c,
+ 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x3d, 0x3d,
+ 0x20, 0x31, 0x36, 0x0a, 0x66, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76,
+ 0x36, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69,
+ 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69,
+ 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50,
+ 0x76, 0x36, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1f, 0x21, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x69, 0x70, 0x76, 0x36, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e,
+ 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x48, 0x00, 0x52, 0x04, 0x69,
+ 0x70, 0x76, 0x36, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0e,
+ 0x20, 0x03, 0x28, 0x0c, 0x42, 0x1a, 0xc2, 0x48, 0x17, 0x0a, 0x15, 0x0a, 0x0d, 0x62, 0x79, 0x74,
+ 0x65, 0x73, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65,
+ 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80,
+ 0x80, 0x80, 0x80, 0x02, 0x42, 0x0c, 0x0a, 0x0a, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f,
+ 0x77, 0x6e, 0x22, 0xd7, 0x03, 0x0a, 0x09, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x75, 0x6c, 0x65, 0x73,
+ 0x12, 0x6f, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42,
+ 0x59, 0xc2, 0x48, 0x56, 0x0a, 0x54, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f,
+ 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73,
+ 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c,
+ 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,
+ 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x78, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05,
+ 0x42, 0x68, 0xc2, 0x48, 0x65, 0x0a, 0x63, 0x0a, 0x07, 0x65, 0x6e, 0x75, 0x6d, 0x2e, 0x69, 0x6e,
+ 0x1a, 0x58, 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69,
+ 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69,
+ 0x6e, 0x27, 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x7c,
+ 0x0a, 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x42, 0x65,
+ 0xc2, 0x48, 0x62, 0x0a, 0x60, 0x0a, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x2e, 0x6e, 0x6f, 0x74, 0x5f,
+ 0x69, 0x6e, 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e,
+ 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x33, 0x0a, 0x07,
+ 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x42, 0x19, 0xc2,
+ 0x48, 0x16, 0x0a, 0x14, 0x0a, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xa4, 0x04, 0x0a,
+ 0x0d, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0xa8,
+ 0x01, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x04, 0x42, 0x8a, 0x01, 0xc2, 0x48, 0x86, 0x01, 0x0a, 0x83, 0x01, 0x0a, 0x12, 0x72, 0x65,
+ 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73,
+ 0x1a, 0x6d, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65,
+ 0x28, 0x29, 0x29, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x5f,
+ 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d,
+ 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x74, 0x20, 0x6c,
+ 0x65, 0x61, 0x73, 0x74, 0x20, 0x25, 0x64, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x28, 0x73, 0x29, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d,
+ 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52,
+ 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x09, 0x6d, 0x61,
+ 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x8e, 0x01,
+ 0xc2, 0x48, 0x8a, 0x01, 0x0a, 0x87, 0x01, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65,
+ 0x64, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x71, 0x75, 0x69, 0x6e,
+ 0x74, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x29, 0x20, 0x3e,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73,
+ 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63,
+ 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x28, 0x73, 0x29, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61,
+ 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x08,
+ 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x78, 0x0a, 0x06, 0x75, 0x6e, 0x69, 0x71,
+ 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x60, 0xc2, 0x48, 0x5d, 0x0a, 0x5b, 0x0a,
+ 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65,
+ 0x12, 0x28, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x75, 0x6e,
+ 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x1e, 0x21, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x28, 0x29, 0x52, 0x06, 0x75, 0x6e, 0x69, 0x71,
+ 0x75, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,
+ 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74,
+ 0x73, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80,
+ 0x80, 0x80, 0x02, 0x22, 0xb8, 0x03, 0x0a, 0x08, 0x4d, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x73,
+ 0x12, 0x99, 0x01, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x04, 0x42, 0x7c, 0xc2, 0x48, 0x79, 0x0a, 0x77, 0x0a, 0x0d, 0x6d, 0x61, 0x70,
+ 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x1a, 0x66, 0x75, 0x69, 0x6e, 0x74,
+ 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x29, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20,
+ 0x3f, 0x20, 0x27, 0x6d, 0x61, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61,
+ 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x25, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x69,
+ 0x65, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x5d, 0x29, 0x20, 0x3a, 0x20,
+ 0x27, 0x27, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x50, 0x61, 0x69, 0x72, 0x73, 0x12, 0x98, 0x01, 0x0a,
+ 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04,
+ 0x42, 0x7b, 0xc2, 0x48, 0x78, 0x0a, 0x76, 0x0a, 0x0d, 0x6d, 0x61, 0x70, 0x2e, 0x6d, 0x61, 0x78,
+ 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x1a, 0x65, 0x75, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x68, 0x69,
+ 0x73, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x29, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x3f, 0x20, 0x27, 0x6d,
+ 0x61, 0x70, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6d, 0x6f,
+ 0x73, 0x74, 0x20, 0x25, 0x64, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x27, 0x2e, 0x66,
+ 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x78,
+ 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x08, 0x6d,
+ 0x61, 0x78, 0x50, 0x61, 0x69, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69,
+ 0x64, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72,
+ 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x75,
+ 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,
+ 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x06, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x73, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x31,
+ 0x0a, 0x08, 0x41, 0x6e, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e,
+ 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49,
+ 0x6e, 0x22, 0xa2, 0x17, 0x0a, 0x0d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75,
+ 0x6c, 0x65, 0x73, 0x12, 0x8e, 0x01, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x5d,
+ 0xc2, 0x48, 0x5a, 0x0a, 0x58, 0x0a, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63,
+ 0x6f, 0x6e, 0x73, 0x74, 0x12, 0xac, 0x01, 0x0a, 0x02, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x7f, 0xc2, 0x48,
+ 0x7c, 0x0a, 0x7a, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6c, 0x74,
+ 0x1a, 0x6b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61,
+ 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52,
+ 0x02, 0x6c, 0x74, 0x12, 0xbf, 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x8f, 0x01, 0xc2,
+ 0x48, 0x8b, 0x01, 0x0a, 0x88, 0x01, 0x0a, 0x0c, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x6c, 0x74, 0x65, 0x1a, 0x78, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00,
+ 0x52, 0x03, 0x6c, 0x74, 0x65, 0x12, 0xc5, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x97, 0x07,
+ 0xc2, 0x48, 0x93, 0x07, 0x0a, 0x7d, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c,
+ 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xb6, 0x01, 0x0a, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26,
+ 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xbe, 0x01, 0x0a,
+ 0x18, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x5f,
+ 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xa1, 0x01, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc6, 0x01,
+ 0x0a, 0x0f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74,
+ 0x65, 0x1a, 0xb2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20,
+ 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28,
+ 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+ 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20,
+ 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d,
+ 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xce, 0x01, 0x0a, 0x19, 0x64, 0x75, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75,
+ 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26,
+ 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0x92, 0x08,
+ 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xe2, 0x07, 0xc2, 0x48, 0xde, 0x07, 0x0a, 0x8b, 0x01,
+ 0x0a, 0x0c, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x7b,
+ 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc5, 0x01, 0x0a, 0x0f,
+ 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a,
+ 0xb1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c,
+ 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
+ 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61,
+ 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xcd, 0x01, 0x0a, 0x19, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76,
+ 0x65, 0x1a, 0xaf, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26,
+ 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+ 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xd5, 0x01, 0x0a, 0x10, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71,
+ 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xdd, 0x01, 0x0a, 0x1a,
+ 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65,
+ 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe, 0x01, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65,
+ 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x03, 0x67,
+ 0x74, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,
+ 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+ 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0xc2, 0x48, 0x69, 0x0a,
+ 0x67, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x69, 0x6e, 0x1a, 0x58,
+ 0x21, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20,
+ 0x6c, 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28,
+ 0x5b, 0x64, 0x79, 0x6e, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x5b, 0x27, 0x69, 0x6e, 0x27,
+ 0x5d, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x9b, 0x01, 0x0a,
+ 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+ 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0xc2, 0x48, 0x66, 0x0a, 0x64, 0x0a,
+ 0x0f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e,
+ 0x1a, 0x51, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+ 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c,
+ 0x69, 0x73, 0x74, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x52, 0x0a, 0x07, 0x65, 0x78,
+ 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1d, 0xc2, 0x48, 0x1a, 0x0a, 0x18, 0x0a, 0x10, 0x64,
+ 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a,
+ 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x09,
+ 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x65, 0x73,
+ 0x73, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x22, 0xb0, 0x18, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x73,
+ 0x74, 0x61, 0x6d, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x05, 0x63, 0x6f,
+ 0x6e, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+ 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x5e, 0xc2, 0x48, 0x5b, 0x0a, 0x59, 0x0a, 0x0f, 0x74, 0x69,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x1a, 0x46, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x21, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e,
+ 0x73, 0x74, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74,
+ 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x52, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x12, 0xaf, 0x01, 0x0a,
+ 0x02, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
+ 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x80, 0x01, 0xc2, 0x48, 0x7d, 0x0a, 0x7b, 0x0a, 0x0c, 0x74,
+ 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x6c, 0x74, 0x1a, 0x6b, 0x21, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20,
+ 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26,
+ 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20,
+ 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27,
+ 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x02, 0x6c, 0x74, 0x12, 0xc1,
+ 0x01, 0x0a, 0x03, 0x6c, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
+ 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x90, 0x01, 0xc2, 0x48, 0x8c, 0x01, 0x0a,
+ 0x89, 0x01, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x6c, 0x74,
+ 0x65, 0x1a, 0x78, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68,
+ 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25,
+ 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00, 0x52, 0x03, 0x6c,
+ 0x74, 0x65, 0x12, 0x73, 0x0a, 0x06, 0x6c, 0x74, 0x5f, 0x6e, 0x6f, 0x77, 0x18, 0x07, 0x20, 0x01,
+ 0x28, 0x08, 0x42, 0x5a, 0xc2, 0x48, 0x57, 0x0a, 0x55, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x73,
+ 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x6c, 0x74, 0x5f, 0x6e, 0x6f, 0x77, 0x1a, 0x41, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5f, 0x6e, 0x6f, 0x77, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3e, 0x20, 0x6e, 0x6f, 0x77, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6e, 0x6f, 0x77, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x00,
+ 0x52, 0x05, 0x6c, 0x74, 0x4e, 0x6f, 0x77, 0x12, 0xcb, 0x07, 0x0a, 0x02, 0x67, 0x74, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
+ 0x42, 0x9c, 0x07, 0xc2, 0x48, 0x98, 0x07, 0x0a, 0x7e, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73,
+ 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x67, 0x74, 0x1a, 0x6e, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73, 0x28,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x3f, 0x20,
+ 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xb7, 0x01, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65,
+ 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x1a, 0xa3, 0x01, 0x68, 0x61,
+ 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e,
+ 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e,
+ 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74,
+ 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27,
+ 0x27, 0x0a, 0xbf, 0x01, 0x0a, 0x19, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e,
+ 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a,
+ 0xa1, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20,
+ 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73,
+ 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29,
+ 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65,
+ 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73,
+ 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x0a, 0xc7, 0x01, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+ 0x70, 0x2e, 0x67, 0x74, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xb2, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71,
+ 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+ 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xcf, 0x01,
+ 0x0a, 0x1a, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x67, 0x74, 0x5f, 0x6c,
+ 0x74, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xb0, 0x01, 0x68,
+ 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x2c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48,
+ 0x01, 0x52, 0x02, 0x67, 0x74, 0x12, 0x98, 0x08, 0x0a, 0x03, 0x67, 0x74, 0x65, 0x18, 0x06, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42,
+ 0xe7, 0x07, 0xc2, 0x48, 0xe3, 0x07, 0x0a, 0x8c, 0x01, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73,
+ 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x67, 0x74, 0x65, 0x1a, 0x7b, 0x21, 0x68, 0x61, 0x73, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x74,
+ 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x5d, 0x29,
+ 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xc6, 0x01, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74,
+ 0x61, 0x6d, 0x70, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x1a, 0xb1, 0x01, 0x68, 0x61, 0x73,
+ 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x3d, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71,
+ 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65,
+ 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d,
+ 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xce,
+ 0x01, 0x0a, 0x1a, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x67, 0x74, 0x65,
+ 0x5f, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xaf, 0x01,
+ 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x29, 0x20, 0x26, 0x26,
+ 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f,
+ 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+ 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+ 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c,
+ 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72,
+ 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a,
+ 0xd6, 0x01, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x67, 0x74,
+ 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x1a, 0xc0, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e,
+ 0x6c, 0x74, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65,
+ 0x20, 0x26, 0x26, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3e, 0x20, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+ 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f,
+ 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74,
+ 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x0a, 0xde, 0x01, 0x0a, 0x1b, 0x74, 0x69, 0x6d,
+ 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x67, 0x74, 0x65, 0x5f, 0x6c, 0x74, 0x65, 0x5f, 0x65,
+ 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0xbe, 0x01, 0x68, 0x61, 0x73, 0x28, 0x72,
+ 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x29, 0x20, 0x26, 0x26, 0x20, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65, 0x20, 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67,
+ 0x74, 0x65, 0x20, 0x26, 0x26, 0x20, 0x28, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x74, 0x65,
+ 0x20, 0x3c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+ 0x3c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x29, 0x3f, 0x20, 0x27, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+ 0x6f, 0x20, 0x25, 0x73, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b, 0x72, 0x75,
+ 0x6c, 0x65, 0x73, 0x2e, 0x67, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c,
+ 0x74, 0x65, 0x5d, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48, 0x01, 0x52, 0x03, 0x67, 0x74, 0x65,
+ 0x12, 0x76, 0x0a, 0x06, 0x67, 0x74, 0x5f, 0x6e, 0x6f, 0x77, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08,
+ 0x42, 0x5d, 0xc2, 0x48, 0x5a, 0x0a, 0x58, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+ 0x6d, 0x70, 0x2e, 0x67, 0x74, 0x5f, 0x6e, 0x6f, 0x77, 0x1a, 0x44, 0x28, 0x72, 0x75, 0x6c, 0x65,
+ 0x73, 0x2e, 0x67, 0x74, 0x5f, 0x6e, 0x6f, 0x77, 0x20, 0x26, 0x26, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x3c, 0x20, 0x6e, 0x6f, 0x77, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72,
+ 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6e, 0x6f, 0x77, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x48,
+ 0x01, 0x52, 0x05, 0x67, 0x74, 0x4e, 0x6f, 0x77, 0x12, 0xc0, 0x01, 0x0a, 0x06, 0x77, 0x69, 0x74,
+ 0x68, 0x69, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x8c, 0x01, 0xc2, 0x48, 0x88, 0x01, 0x0a, 0x85, 0x01, 0x0a, 0x10,
+ 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e,
+ 0x1a, 0x71, 0x74, 0x68, 0x69, 0x73, 0x20, 0x3c, 0x20, 0x6e, 0x6f, 0x77, 0x2d, 0x72, 0x75, 0x6c,
+ 0x65, 0x73, 0x2e, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69,
+ 0x73, 0x20, 0x3e, 0x20, 0x6e, 0x6f, 0x77, 0x2b, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x77, 0x69,
+ 0x74, 0x68, 0x69, 0x6e, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75,
+ 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x25, 0x73, 0x20,
+ 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x77, 0x27, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x5b,
+ 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x5d, 0x29, 0x20, 0x3a,
+ 0x20, 0x27, 0x27, 0x52, 0x06, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x12, 0x54, 0x0a, 0x07, 0x65,
+ 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
+ 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x1e, 0xc2, 0x48, 0x1b, 0x0a, 0x19, 0x0a,
+ 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70,
+ 0x6c, 0x65, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
+ 0x65, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x42, 0x0b, 0x0a, 0x09,
+ 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x67, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x61, 0x6e, 0x22, 0x45, 0x0a, 0x0a, 0x56, 0x69, 0x6f,
+ 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75,
+ 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x69, 0x6f, 0x6c, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+ 0x22, 0xe2, 0x01, 0x0a, 0x09, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d,
+ 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
+ 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x69, 0x65,
+ 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2b, 0x0a,
+ 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x75,
+ 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,
+ 0x50, 0x61, 0x74, 0x68, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0a, 0x66, 0x69,
+ 0x65, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02,
+ 0x18, 0x01, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x23, 0x0a,
+ 0x0d, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74,
+ 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x07,
+ 0x66, 0x6f, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66,
+ 0x6f, 0x72, 0x4b, 0x65, 0x79, 0x22, 0x47, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61,
+ 0x74, 0x68, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64,
+ 0x61, 0x74, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x45, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xcc,
+ 0x03, 0x0a, 0x10, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x45, 0x6c, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x75, 0x6d,
+ 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64,
+ 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f,
+ 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c,
+ 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x74,
+ 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c,
+ 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+ 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65,
+ 0x12, 0x45, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07,
+ 0x6b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69,
+ 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f,
+ 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79,
+ 0x70, 0x65, 0x12, 0x16, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28,
+ 0x04, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x08, 0x62, 0x6f,
+ 0x6f, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07,
+ 0x62, 0x6f, 0x6f, 0x6c, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x0a, 0x07, 0x69, 0x6e, 0x74, 0x5f, 0x6b,
+ 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x06, 0x69, 0x6e, 0x74, 0x4b,
+ 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x08, 0x75, 0x69, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09,
+ 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x07, 0x75, 0x69, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12,
+ 0x1f, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0a, 0x20,
+ 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79,
+ 0x42, 0x0b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2a, 0x9d, 0x01,
+ 0x0a, 0x06, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x47, 0x4e, 0x4f,
+ 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
+ 0x12, 0x19, 0x0a, 0x15, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x49, 0x46, 0x5f, 0x55, 0x4e,
+ 0x50, 0x4f, 0x50, 0x55, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x49,
+ 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x49, 0x46, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54,
+ 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x47, 0x4e, 0x4f,
+ 0x52, 0x45, 0x5f, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x0c, 0x49,
+ 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x01, 0x1a, 0x02, 0x08,
+ 0x01, 0x12, 0x16, 0x0a, 0x0e, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41,
+ 0x55, 0x4c, 0x54, 0x10, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x1a, 0x02, 0x10, 0x01, 0x2a, 0x6e, 0x0a,
+ 0x0a, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x17, 0x4b,
+ 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x52, 0x45, 0x47, 0x45, 0x58, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
+ 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x4e, 0x4f, 0x57,
+ 0x4e, 0x5f, 0x52, 0x45, 0x47, 0x45, 0x58, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x48, 0x45, 0x41,
+ 0x44, 0x45, 0x52, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x4b, 0x4e,
+ 0x4f, 0x57, 0x4e, 0x5f, 0x52, 0x45, 0x47, 0x45, 0x58, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x48,
+ 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x3a, 0x5c, 0x0a,
+ 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x87, 0x09, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x20, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e,
+ 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e,
+ 0x74, 0x73, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x54, 0x0a, 0x05, 0x6f,
+ 0x6e, 0x65, 0x6f, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x18, 0x87, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x62, 0x75, 0x66,
+ 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x43,
+ 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x6f,
+ 0x66, 0x3a, 0x54, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,
+ 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x87, 0x09, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x1e, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e,
+ 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73,
+ 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x63, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x64, 0x65,
+ 0x66, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x88, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x62, 0x75,
+ 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x64, 0x65,
+ 0x66, 0x69, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73,
+ 0x52, 0x0a, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x42, 0x6e, 0x0a, 0x12,
+ 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+ 0x74, 0x65, 0x42, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74,
+ 0x6f, 0x50, 0x01, 0x5a, 0x47, 0x62, 0x75, 0x66, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x67,
+ 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x62, 0x75, 0x66, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2f, 0x67, 0x6f, 0x2f,
+ 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65,
+}
+
+var (
+ file_buf_validate_validate_proto_rawDescOnce sync.Once
+ file_buf_validate_validate_proto_rawDescData = file_buf_validate_validate_proto_rawDesc
+)
+
+func file_buf_validate_validate_proto_rawDescGZIP() []byte {
+ file_buf_validate_validate_proto_rawDescOnce.Do(func() {
+ file_buf_validate_validate_proto_rawDescData = protoimpl.X.CompressGZIP(file_buf_validate_validate_proto_rawDescData)
+ })
+ return file_buf_validate_validate_proto_rawDescData
+}
+
+var file_buf_validate_validate_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_buf_validate_validate_proto_msgTypes = make([]protoimpl.MessageInfo, 30)
+var file_buf_validate_validate_proto_goTypes = []any{
+ (Ignore)(0), // 0: buf.validate.Ignore
+ (KnownRegex)(0), // 1: buf.validate.KnownRegex
+ (*Constraint)(nil), // 2: buf.validate.Constraint
+ (*MessageConstraints)(nil), // 3: buf.validate.MessageConstraints
+ (*OneofConstraints)(nil), // 4: buf.validate.OneofConstraints
+ (*FieldConstraints)(nil), // 5: buf.validate.FieldConstraints
+ (*PredefinedConstraints)(nil), // 6: buf.validate.PredefinedConstraints
+ (*FloatRules)(nil), // 7: buf.validate.FloatRules
+ (*DoubleRules)(nil), // 8: buf.validate.DoubleRules
+ (*Int32Rules)(nil), // 9: buf.validate.Int32Rules
+ (*Int64Rules)(nil), // 10: buf.validate.Int64Rules
+ (*UInt32Rules)(nil), // 11: buf.validate.UInt32Rules
+ (*UInt64Rules)(nil), // 12: buf.validate.UInt64Rules
+ (*SInt32Rules)(nil), // 13: buf.validate.SInt32Rules
+ (*SInt64Rules)(nil), // 14: buf.validate.SInt64Rules
+ (*Fixed32Rules)(nil), // 15: buf.validate.Fixed32Rules
+ (*Fixed64Rules)(nil), // 16: buf.validate.Fixed64Rules
+ (*SFixed32Rules)(nil), // 17: buf.validate.SFixed32Rules
+ (*SFixed64Rules)(nil), // 18: buf.validate.SFixed64Rules
+ (*BoolRules)(nil), // 19: buf.validate.BoolRules
+ (*StringRules)(nil), // 20: buf.validate.StringRules
+ (*BytesRules)(nil), // 21: buf.validate.BytesRules
+ (*EnumRules)(nil), // 22: buf.validate.EnumRules
+ (*RepeatedRules)(nil), // 23: buf.validate.RepeatedRules
+ (*MapRules)(nil), // 24: buf.validate.MapRules
+ (*AnyRules)(nil), // 25: buf.validate.AnyRules
+ (*DurationRules)(nil), // 26: buf.validate.DurationRules
+ (*TimestampRules)(nil), // 27: buf.validate.TimestampRules
+ (*Violations)(nil), // 28: buf.validate.Violations
+ (*Violation)(nil), // 29: buf.validate.Violation
+ (*FieldPath)(nil), // 30: buf.validate.FieldPath
+ (*FieldPathElement)(nil), // 31: buf.validate.FieldPathElement
+ (*durationpb.Duration)(nil), // 32: google.protobuf.Duration
+ (*timestamppb.Timestamp)(nil), // 33: google.protobuf.Timestamp
+ (descriptorpb.FieldDescriptorProto_Type)(0), // 34: google.protobuf.FieldDescriptorProto.Type
+ (*descriptorpb.MessageOptions)(nil), // 35: google.protobuf.MessageOptions
+ (*descriptorpb.OneofOptions)(nil), // 36: google.protobuf.OneofOptions
+ (*descriptorpb.FieldOptions)(nil), // 37: google.protobuf.FieldOptions
+}
+var file_buf_validate_validate_proto_depIdxs = []int32{
+ 2, // 0: buf.validate.MessageConstraints.cel:type_name -> buf.validate.Constraint
+ 2, // 1: buf.validate.FieldConstraints.cel:type_name -> buf.validate.Constraint
+ 0, // 2: buf.validate.FieldConstraints.ignore:type_name -> buf.validate.Ignore
+ 7, // 3: buf.validate.FieldConstraints.float:type_name -> buf.validate.FloatRules
+ 8, // 4: buf.validate.FieldConstraints.double:type_name -> buf.validate.DoubleRules
+ 9, // 5: buf.validate.FieldConstraints.int32:type_name -> buf.validate.Int32Rules
+ 10, // 6: buf.validate.FieldConstraints.int64:type_name -> buf.validate.Int64Rules
+ 11, // 7: buf.validate.FieldConstraints.uint32:type_name -> buf.validate.UInt32Rules
+ 12, // 8: buf.validate.FieldConstraints.uint64:type_name -> buf.validate.UInt64Rules
+ 13, // 9: buf.validate.FieldConstraints.sint32:type_name -> buf.validate.SInt32Rules
+ 14, // 10: buf.validate.FieldConstraints.sint64:type_name -> buf.validate.SInt64Rules
+ 15, // 11: buf.validate.FieldConstraints.fixed32:type_name -> buf.validate.Fixed32Rules
+ 16, // 12: buf.validate.FieldConstraints.fixed64:type_name -> buf.validate.Fixed64Rules
+ 17, // 13: buf.validate.FieldConstraints.sfixed32:type_name -> buf.validate.SFixed32Rules
+ 18, // 14: buf.validate.FieldConstraints.sfixed64:type_name -> buf.validate.SFixed64Rules
+ 19, // 15: buf.validate.FieldConstraints.bool:type_name -> buf.validate.BoolRules
+ 20, // 16: buf.validate.FieldConstraints.string:type_name -> buf.validate.StringRules
+ 21, // 17: buf.validate.FieldConstraints.bytes:type_name -> buf.validate.BytesRules
+ 22, // 18: buf.validate.FieldConstraints.enum:type_name -> buf.validate.EnumRules
+ 23, // 19: buf.validate.FieldConstraints.repeated:type_name -> buf.validate.RepeatedRules
+ 24, // 20: buf.validate.FieldConstraints.map:type_name -> buf.validate.MapRules
+ 25, // 21: buf.validate.FieldConstraints.any:type_name -> buf.validate.AnyRules
+ 26, // 22: buf.validate.FieldConstraints.duration:type_name -> buf.validate.DurationRules
+ 27, // 23: buf.validate.FieldConstraints.timestamp:type_name -> buf.validate.TimestampRules
+ 2, // 24: buf.validate.PredefinedConstraints.cel:type_name -> buf.validate.Constraint
+ 1, // 25: buf.validate.StringRules.well_known_regex:type_name -> buf.validate.KnownRegex
+ 5, // 26: buf.validate.RepeatedRules.items:type_name -> buf.validate.FieldConstraints
+ 5, // 27: buf.validate.MapRules.keys:type_name -> buf.validate.FieldConstraints
+ 5, // 28: buf.validate.MapRules.values:type_name -> buf.validate.FieldConstraints
+ 32, // 29: buf.validate.DurationRules.const:type_name -> google.protobuf.Duration
+ 32, // 30: buf.validate.DurationRules.lt:type_name -> google.protobuf.Duration
+ 32, // 31: buf.validate.DurationRules.lte:type_name -> google.protobuf.Duration
+ 32, // 32: buf.validate.DurationRules.gt:type_name -> google.protobuf.Duration
+ 32, // 33: buf.validate.DurationRules.gte:type_name -> google.protobuf.Duration
+ 32, // 34: buf.validate.DurationRules.in:type_name -> google.protobuf.Duration
+ 32, // 35: buf.validate.DurationRules.not_in:type_name -> google.protobuf.Duration
+ 32, // 36: buf.validate.DurationRules.example:type_name -> google.protobuf.Duration
+ 33, // 37: buf.validate.TimestampRules.const:type_name -> google.protobuf.Timestamp
+ 33, // 38: buf.validate.TimestampRules.lt:type_name -> google.protobuf.Timestamp
+ 33, // 39: buf.validate.TimestampRules.lte:type_name -> google.protobuf.Timestamp
+ 33, // 40: buf.validate.TimestampRules.gt:type_name -> google.protobuf.Timestamp
+ 33, // 41: buf.validate.TimestampRules.gte:type_name -> google.protobuf.Timestamp
+ 32, // 42: buf.validate.TimestampRules.within:type_name -> google.protobuf.Duration
+ 33, // 43: buf.validate.TimestampRules.example:type_name -> google.protobuf.Timestamp
+ 29, // 44: buf.validate.Violations.violations:type_name -> buf.validate.Violation
+ 30, // 45: buf.validate.Violation.field:type_name -> buf.validate.FieldPath
+ 30, // 46: buf.validate.Violation.rule:type_name -> buf.validate.FieldPath
+ 31, // 47: buf.validate.FieldPath.elements:type_name -> buf.validate.FieldPathElement
+ 34, // 48: buf.validate.FieldPathElement.field_type:type_name -> google.protobuf.FieldDescriptorProto.Type
+ 34, // 49: buf.validate.FieldPathElement.key_type:type_name -> google.protobuf.FieldDescriptorProto.Type
+ 34, // 50: buf.validate.FieldPathElement.value_type:type_name -> google.protobuf.FieldDescriptorProto.Type
+ 35, // 51: buf.validate.message:extendee -> google.protobuf.MessageOptions
+ 36, // 52: buf.validate.oneof:extendee -> google.protobuf.OneofOptions
+ 37, // 53: buf.validate.field:extendee -> google.protobuf.FieldOptions
+ 37, // 54: buf.validate.predefined:extendee -> google.protobuf.FieldOptions
+ 3, // 55: buf.validate.message:type_name -> buf.validate.MessageConstraints
+ 4, // 56: buf.validate.oneof:type_name -> buf.validate.OneofConstraints
+ 5, // 57: buf.validate.field:type_name -> buf.validate.FieldConstraints
+ 6, // 58: buf.validate.predefined:type_name -> buf.validate.PredefinedConstraints
+ 59, // [59:59] is the sub-list for method output_type
+ 59, // [59:59] is the sub-list for method input_type
+ 55, // [55:59] is the sub-list for extension type_name
+ 51, // [51:55] is the sub-list for extension extendee
+ 0, // [0:51] is the sub-list for field type_name
+}
+
+func init() { file_buf_validate_validate_proto_init() }
+func file_buf_validate_validate_proto_init() {
+ if File_buf_validate_validate_proto != nil {
+ return
+ }
+ file_buf_validate_validate_proto_msgTypes[3].OneofWrappers = []any{
+ (*FieldConstraints_Float)(nil),
+ (*FieldConstraints_Double)(nil),
+ (*FieldConstraints_Int32)(nil),
+ (*FieldConstraints_Int64)(nil),
+ (*FieldConstraints_Uint32)(nil),
+ (*FieldConstraints_Uint64)(nil),
+ (*FieldConstraints_Sint32)(nil),
+ (*FieldConstraints_Sint64)(nil),
+ (*FieldConstraints_Fixed32)(nil),
+ (*FieldConstraints_Fixed64)(nil),
+ (*FieldConstraints_Sfixed32)(nil),
+ (*FieldConstraints_Sfixed64)(nil),
+ (*FieldConstraints_Bool)(nil),
+ (*FieldConstraints_String_)(nil),
+ (*FieldConstraints_Bytes)(nil),
+ (*FieldConstraints_Enum)(nil),
+ (*FieldConstraints_Repeated)(nil),
+ (*FieldConstraints_Map)(nil),
+ (*FieldConstraints_Any)(nil),
+ (*FieldConstraints_Duration)(nil),
+ (*FieldConstraints_Timestamp)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[5].OneofWrappers = []any{
+ (*FloatRules_Lt)(nil),
+ (*FloatRules_Lte)(nil),
+ (*FloatRules_Gt)(nil),
+ (*FloatRules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[6].OneofWrappers = []any{
+ (*DoubleRules_Lt)(nil),
+ (*DoubleRules_Lte)(nil),
+ (*DoubleRules_Gt)(nil),
+ (*DoubleRules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[7].OneofWrappers = []any{
+ (*Int32Rules_Lt)(nil),
+ (*Int32Rules_Lte)(nil),
+ (*Int32Rules_Gt)(nil),
+ (*Int32Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[8].OneofWrappers = []any{
+ (*Int64Rules_Lt)(nil),
+ (*Int64Rules_Lte)(nil),
+ (*Int64Rules_Gt)(nil),
+ (*Int64Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[9].OneofWrappers = []any{
+ (*UInt32Rules_Lt)(nil),
+ (*UInt32Rules_Lte)(nil),
+ (*UInt32Rules_Gt)(nil),
+ (*UInt32Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[10].OneofWrappers = []any{
+ (*UInt64Rules_Lt)(nil),
+ (*UInt64Rules_Lte)(nil),
+ (*UInt64Rules_Gt)(nil),
+ (*UInt64Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[11].OneofWrappers = []any{
+ (*SInt32Rules_Lt)(nil),
+ (*SInt32Rules_Lte)(nil),
+ (*SInt32Rules_Gt)(nil),
+ (*SInt32Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[12].OneofWrappers = []any{
+ (*SInt64Rules_Lt)(nil),
+ (*SInt64Rules_Lte)(nil),
+ (*SInt64Rules_Gt)(nil),
+ (*SInt64Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[13].OneofWrappers = []any{
+ (*Fixed32Rules_Lt)(nil),
+ (*Fixed32Rules_Lte)(nil),
+ (*Fixed32Rules_Gt)(nil),
+ (*Fixed32Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[14].OneofWrappers = []any{
+ (*Fixed64Rules_Lt)(nil),
+ (*Fixed64Rules_Lte)(nil),
+ (*Fixed64Rules_Gt)(nil),
+ (*Fixed64Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[15].OneofWrappers = []any{
+ (*SFixed32Rules_Lt)(nil),
+ (*SFixed32Rules_Lte)(nil),
+ (*SFixed32Rules_Gt)(nil),
+ (*SFixed32Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[16].OneofWrappers = []any{
+ (*SFixed64Rules_Lt)(nil),
+ (*SFixed64Rules_Lte)(nil),
+ (*SFixed64Rules_Gt)(nil),
+ (*SFixed64Rules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[18].OneofWrappers = []any{
+ (*StringRules_Email)(nil),
+ (*StringRules_Hostname)(nil),
+ (*StringRules_Ip)(nil),
+ (*StringRules_Ipv4)(nil),
+ (*StringRules_Ipv6)(nil),
+ (*StringRules_Uri)(nil),
+ (*StringRules_UriRef)(nil),
+ (*StringRules_Address)(nil),
+ (*StringRules_Uuid)(nil),
+ (*StringRules_Tuuid)(nil),
+ (*StringRules_IpWithPrefixlen)(nil),
+ (*StringRules_Ipv4WithPrefixlen)(nil),
+ (*StringRules_Ipv6WithPrefixlen)(nil),
+ (*StringRules_IpPrefix)(nil),
+ (*StringRules_Ipv4Prefix)(nil),
+ (*StringRules_Ipv6Prefix)(nil),
+ (*StringRules_HostAndPort)(nil),
+ (*StringRules_WellKnownRegex)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[19].OneofWrappers = []any{
+ (*BytesRules_Ip)(nil),
+ (*BytesRules_Ipv4)(nil),
+ (*BytesRules_Ipv6)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[24].OneofWrappers = []any{
+ (*DurationRules_Lt)(nil),
+ (*DurationRules_Lte)(nil),
+ (*DurationRules_Gt)(nil),
+ (*DurationRules_Gte)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[25].OneofWrappers = []any{
+ (*TimestampRules_Lt)(nil),
+ (*TimestampRules_Lte)(nil),
+ (*TimestampRules_LtNow)(nil),
+ (*TimestampRules_Gt)(nil),
+ (*TimestampRules_Gte)(nil),
+ (*TimestampRules_GtNow)(nil),
+ }
+ file_buf_validate_validate_proto_msgTypes[29].OneofWrappers = []any{
+ (*FieldPathElement_Index)(nil),
+ (*FieldPathElement_BoolKey)(nil),
+ (*FieldPathElement_IntKey)(nil),
+ (*FieldPathElement_UintKey)(nil),
+ (*FieldPathElement_StringKey)(nil),
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_buf_validate_validate_proto_rawDesc,
+ NumEnums: 2,
+ NumMessages: 30,
+ NumExtensions: 4,
+ NumServices: 0,
+ },
+ GoTypes: file_buf_validate_validate_proto_goTypes,
+ DependencyIndexes: file_buf_validate_validate_proto_depIdxs,
+ EnumInfos: file_buf_validate_validate_proto_enumTypes,
+ MessageInfos: file_buf_validate_validate_proto_msgTypes,
+ ExtensionInfos: file_buf_validate_validate_proto_extTypes,
+ }.Build()
+ File_buf_validate_validate_proto = out.File
+ file_buf_validate_validate_proto_rawDesc = nil
+ file_buf_validate_validate_proto_goTypes = nil
+ file_buf_validate_validate_proto_depIdxs = nil
+}
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/.gitignore b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/.gitignore
new file mode 100644
index 0000000..409e986
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/.gitignore
@@ -0,0 +1,2 @@
+/.tmp/
+/internal/cmd/generate-txt-testdata/generate-txt-testdata
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/.golangci.yml b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/.golangci.yml
new file mode 100644
index 0000000..d4eebbf
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/.golangci.yml
@@ -0,0 +1,77 @@
+linters-settings:
+ gocyclo:
+ min-complexity: 15
+ depguard:
+ rules:
+ Main:
+ files:
+ - $all
+ - "!$test"
+ allow:
+ - $gostd
+ - github.com/bufbuild/protoyaml-go/decode
+ - github.com/bufbuild/protovalidate-go
+ - buf.build/gen/go/bufbuild/protovalidate
+ errcheck:
+ check-type-assertions: true
+ forbidigo:
+ forbid:
+ - '^fmt\.Print'
+ - '^log\.'
+ - '^print$'
+ - '^println$'
+ - '^panic$'
+ godox:
+ # TODO, OPT, etc. comments are fine to commit. Use FIXME comments for
+ # temporary hacks, and use godox to prevent committing them.
+ keywords: [FIXME]
+ varnamelen:
+ ignore-decls:
+ - ok bool
+ - T any
+ - i int
+ - wg sync.WaitGroup
+linters:
+ enable-all: true
+ disable:
+ - cyclop # covered by gocyclo
+ - execinquery # deprecated as of golangci v1.58.0
+ - exhaustive
+ - exhaustruct
+ - exportloopref # deprecated as of golangci v1.60.2
+ - funlen # rely on code review to limit function length
+ - gochecknoglobals
+ - gocognit # dubious "cognitive overhead" quantification
+ - gofumpt # prefer standard gofmt
+ - goimports # rely on gci instead
+ - gomnd # some unnamed constants are okay
+ - ireturn # "accept interfaces, return structs" isn't ironclad
+ - lll # don't want hard limits for line length
+ - maintidx # covered by gocyclo
+ - mnd
+ - nlreturn # generous whitespace violates house style
+ - nonamedreturns
+ - testpackage # internal tests are fine
+ - wrapcheck # don't _always_ need to wrap errors
+ - wsl # generous whitespace violates house style
+issues:
+ exclude-dirs-use-default: false
+ exclude:
+ # Don't ban use of fmt.Errorf to create new errors, but the remaining
+ # checks from err113 are useful.
+ - "do not define dynamic errors.*"
+ # Loosen requirements on tests
+ exclude-rules:
+ - path: _test.go
+ linters:
+ - nestif
+ - path: internal/*
+ linters:
+ - depguard
+ - revive
+ - forbidigo
+ - path: internal/protoyamltest/*
+ linters:
+ - gosec
+ - gosmopolitan
+ - prealloc
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/LICENSE b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/LICENSE
new file mode 100644
index 0000000..f308f8b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2023 Buf Technologies, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/Makefile b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/Makefile
new file mode 100644
index 0000000..0cc527f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/Makefile
@@ -0,0 +1,89 @@
+# See https://tech.davis-hansson.com/p/make/
+SHELL := bash
+.DELETE_ON_ERROR:
+.SHELLFLAGS := -eu -o pipefail -c
+.DEFAULT_GOAL := all
+MAKEFLAGS += --warn-undefined-variables
+MAKEFLAGS += --no-builtin-rules
+MAKEFLAGS += --no-print-directory
+BIN := .tmp/bin
+export PATH := $(BIN):$(PATH)
+export GOBIN := $(abspath $(BIN))
+COPYRIGHT_YEARS := 2023-2024
+LICENSE_IGNORE := --ignore testdata/
+
+.PHONY: help
+help: ## Describe useful make targets
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "%-30s %s\n", $$1, $$2}'
+
+.PHONY: all
+all: ## Build, test, and lint (default)
+ $(MAKE) test
+ $(MAKE) lint
+
+.PHONY: clean
+clean: ## Delete intermediate build artifacts
+ @# -X only removes untracked files, -d recurses into directories, -f actually removes files/dirs
+ git clean -Xdf
+
+.PHONY: test
+test: build ## Run unit tests
+ go test -vet=off -race -cover ./...
+
+.PHONY: build
+build: generate ## Build all packages
+ go build ./...
+
+.PHONY: lint
+lint: $(BIN)/golangci-lint $(BIN)/buf ## Lint
+ go vet ./...
+ $(BIN)/golangci-lint run
+ buf lint
+ buf format -d --exit-code
+
+.PHONY: lintfix
+lintfix: $(BIN)/golangci-lint ## Automatically fix some lint errors
+ $(BIN)/golangci-lint run --fix
+ buf format -w
+
+.PHONY: install
+install: ## Install all binaries
+ go install ./...
+
+.PHONY: generate
+generate: $(BIN)/license-header $(BIN)/buf ## Regenerate code and licenses
+ rm -rf internal/gen
+ buf generate
+ license-header \
+ --license-type apache \
+ --copyright-holder "Buf Technologies, Inc." \
+ --year-range "$(COPYRIGHT_YEARS)" $(LICENSE_IGNORE)
+
+.PHONY: golden
+golden:
+ find internal/testdata -name "*.txt" -type f -delete
+ go run internal/cmd/generate-txt-testdata/main.go internal/testdata
+
+.PHONY: upgrade
+upgrade: ## Upgrade dependencies
+ go get -u -t ./...
+ go mod tidy -v
+ buf mod update internal/proto
+
+.PHONY: checkgenerate
+checkgenerate:
+ @# Used in CI to verify that `make generate` doesn't produce a diff.
+ test -z "$$(git status --porcelain | tee /dev/stderr)"
+
+$(BIN):
+ @mkdir -p $(BIN)
+
+$(BIN)/buf: $(BIN) Makefile
+ go install github.com/bufbuild/buf/cmd/buf@v1.41.0
+
+$(BIN)/license-header: $(BIN) Makefile
+ go install \
+ github.com/bufbuild/buf/private/pkg/licenseheader/cmd/license-header@v1.41.0
+
+$(BIN)/golangci-lint: $(BIN) Makefile
+ go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.60.3
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/README.md b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/README.md
new file mode 100644
index 0000000..cff30c8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/README.md
@@ -0,0 +1,150 @@
+# ProtoYAML
+
+[](https://github.com/bufbuild/protoyaml-go/actions/workflows/ci.yaml)
+[](https://goreportcard.com/report/buf.build/go/protoyaml)
+[](https://pkg.go.dev/buf.build/go/protoyaml)
+
+Marshal and unmarshal Protocol Buffers as YAML. Provides fine-grained error details with file, line, column and snippet information.
+
+Fully compatible with [protojson](https://github.com/protocolbuffers/protobuf-go/tree/master/encoding/protojson).
+
+## Usage
+
+```go
+package main
+
+import (
+ "log"
+
+ "buf.build/go/protoyaml"
+)
+
+func main() {
+ // Marshal a proto message to YAML.
+ yamlBytes, err := protoyaml.Marshal(
+ &pb.MyMessage{
+ MyField: "hello world",
+ },
+ )
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Unmarshal a proto message from YAML.
+ options := protoyaml.UnmarshalOptions{
+ Path: "testdata/basic.proto3test.yaml",
+ }
+ var myMessage pb.MyMessage
+ if err := options.Unmarshal(yamlBytes, &myMessage); err != nil {
+ log.Fatal(err)
+ }
+}
+```
+
+ProtoYAML returns either `nil` or an error with a detailed message. For every error found in the file, the error
+message includes the file name (if `Path` is set on `UnmarshalOptions`), line number, column number, and snippet
+of the YAML that caused the error. For example, when unmarshalling the following YAML file:
+
+```yaml
+values:
+ - single_bool: true
+ - single_bool: false
+ - single_bool: 1
+ - single_bool: 0
+ - single_bool: "true"
+ - single_bool: "false"
+ - single_bool: True
+ - single_bool: False
+ - single_bool: TRUE
+ - single_bool: FALSE
+ - single_bool: yes
+ - single_bool: no
+```
+
+The following errors are returned:
+
+```
+testdata/basic.proto3test.yaml:5:18: expected bool, got "1"
+ 5 | - single_bool: 1
+ | .................^
+testdata/basic.proto3test.yaml:6:18: expected bool, got "0"
+ 6 | - single_bool: 0
+ | .................^
+testdata/basic.proto3test.yaml:7:18: expected tag !!bool, got !!str
+ 7 | - single_bool: "true"
+ | .................^
+testdata/basic.proto3test.yaml:8:18: expected tag !!bool, got !!str
+ 8 | - single_bool: "false"
+ | .................^
+testdata/basic.proto3test.yaml:9:18: expected bool, got "True"
+ 9 | - single_bool: True
+ | .................^
+testdata/basic.proto3test.yaml:10:18: expected bool, got "False"
+ 10 | - single_bool: False
+ | .................^
+testdata/basic.proto3test.yaml:11:18: expected bool, got "TRUE"
+ 11 | - single_bool: TRUE
+ | .................^
+testdata/basic.proto3test.yaml:12:18: expected bool, got "FALSE"
+ 12 | - single_bool: FALSE
+ | .................^
+testdata/basic.proto3test.yaml:13:18: expected bool, got "yes"
+ 13 | - single_bool: yes
+ | .................^
+testdata/basic.proto3test.yaml:14:18: expected bool, got "no"
+ 14 | - single_bool: no
+ | .................^
+```
+
+Only `true` and `false` are valid values for the `single_bool` field.
+
+For more examples, see the [internal/testdata](internal/testdata) directory.
+
+## Validation
+
+ProtoYAML can integrate with external validation libraries such as
+[Protovalidate](https://github.com/bufbuild/protovalidate-go) to provide additional rich error
+information. Simply provide a `Validator` to the `UnmarshalOptions`:
+
+```go
+package main
+
+import (
+ "log"
+
+ "buf.build/go/protoyaml"
+ "github.com/bufbuild/protovalidate-go"
+)
+
+func main() {
+ validator, err := protovalidate.NewValidator()
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ var myMessage pb.MyMessage
+ options := protoyaml.UnmarshalOptions{
+ Path: "testdata/basic.proto3test.yaml",
+ Validator: validator,
+ }
+ if err := options.Unmarshal(yamlBytes, &myMessage); err != nil {
+ log.Fatal(err)
+ }
+}
+```
+
+The errors produced by the `Validator` will show up along side the ProtoYAML errors. For example:
+
+```
+testdata/validate.validate.yaml:4:18 cases[2].float_gt_lt: value must be greater than 0 and less than 10 (float.gt_lt)
+ 4 | - float_gt_lt: 10.5
+ | .................^
+```
+
+## Status: Beta
+
+ProtoYAML is not yet stable. However, the final shape is unlikely to change drastically—future edits will be somewhat minor.
+
+## Legal
+
+Offered under the [Apache 2 license](https://github.com/bufbuild/protoyaml-go/blob/main/LICENSE)
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/buf.gen.yaml b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/buf.gen.yaml
new file mode 100644
index 0000000..8da4ea5
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/buf.gen.yaml
@@ -0,0 +1,11 @@
+version: v1
+managed:
+ enabled: true
+ go_package_prefix:
+ default: buf.build/go/protoyaml/internal/gen/proto
+ except:
+ - buf.build/bufbuild/protovalidate
+plugins:
+ - plugin: buf.build/protocolbuffers/go:v1.36.0
+ out: internal/gen/proto
+ opt: paths=source_relative
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/buf.work.yaml b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/buf.work.yaml
new file mode 100644
index 0000000..30f1e1f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/buf.work.yaml
@@ -0,0 +1,3 @@
+version: v1
+directories:
+ - internal/proto
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/decode.go b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/decode.go
new file mode 100644
index 0000000..d2b8f39
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/decode.go
@@ -0,0 +1,1372 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package protoyaml
+
+import (
+ "encoding/base64"
+ "errors"
+ "fmt"
+ "math"
+ "math/big"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/bufbuild/protovalidate-go"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+ "google.golang.org/protobuf/reflect/protoregistry"
+ "google.golang.org/protobuf/types/known/anypb"
+ "google.golang.org/protobuf/types/known/durationpb"
+ "google.golang.org/protobuf/types/known/structpb"
+ "google.golang.org/protobuf/types/known/timestamppb"
+ "gopkg.in/yaml.v3"
+)
+
+var (
+ // We have to initialize this from an init() function below
+ // instead of via initializer expression here to avoid the Go
+ // compiler complaining about a potential initialization cycle
+ // (the initializer expression refers to the function
+ // unmarshalAnyMsg, which indirectly refers back to this var).
+ wktUnmarshalers map[protoreflect.FullName]customUnmarshaler
+)
+
+// Validator is an interface for validating a Protobuf message produced from a given YAML node.
+type Validator interface {
+ // Validate the given message.
+ Validate(message proto.Message) error
+}
+
+// UnmarshalOptions is a configurable YAML format parser for Protobuf messages.
+type UnmarshalOptions struct {
+ // The path for the data being unmarshaled.
+ //
+ // If set, this will be used when producing error messages.
+ Path string
+ // Validator is a validator to run after unmarshaling a message.
+ Validator Validator
+ // Resolver is the Protobuf type resolver to use.
+ Resolver interface {
+ protoregistry.MessageTypeResolver
+ protoregistry.ExtensionTypeResolver
+ }
+
+ // If AllowPartial is set, input for messages that will result in missing
+ // required fields will not return an error.
+ AllowPartial bool
+
+ // DiscardUnknown specifies whether to discard unknown fields instead of
+ // returning an error.
+ DiscardUnknown bool
+}
+
+// Unmarshal a Protobuf message from the given YAML data.
+func Unmarshal(data []byte, message proto.Message) error {
+ return (UnmarshalOptions{}).Unmarshal(data, message)
+}
+
+// Unmarshal a Protobuf message from the given YAML data.
+func (o UnmarshalOptions) Unmarshal(data []byte, message proto.Message) error {
+ var yamlFile yaml.Node
+ if err := yaml.Unmarshal(data, &yamlFile); err != nil {
+ return err
+ }
+ if err := o.unmarshalNode(&yamlFile, message, data); err != nil {
+ return err
+ }
+ if !o.AllowPartial {
+ if err := proto.CheckInitialized(message); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// ParseDuration parses a duration string into a durationpb.Duration.
+//
+// Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".
+//
+// This function supports the full range of durationpb.Duration values, including
+// those outside the range of time.Duration.
+func ParseDuration(str string) (*durationpb.Duration, error) {
+ // [-+]?([0-9]*(\.[0-9]*)?[a-z]+)+
+ neg := false
+
+ // Consume [-+]?
+ if str != "" {
+ c := str[0]
+ if c == '-' || c == '+' {
+ neg = c == '-'
+ str = str[1:]
+ }
+ }
+ // Special case: if all that is left is "0", this is zero.
+ if str == "0" {
+ var empty *durationpb.Duration
+ return empty, nil
+ }
+ if str == "" {
+ return nil, errors.New("invalid duration")
+ }
+ totalNanos := &big.Int{}
+ var err error
+ for str != "" {
+ str, err = parseDurationNext(str, totalNanos)
+ if err != nil {
+ return nil, err
+ }
+ }
+ if neg {
+ totalNanos.Neg(totalNanos)
+ }
+ result := &durationpb.Duration{}
+ quo, rem := totalNanos.QuoRem(totalNanos, nanosPerSecond, &big.Int{})
+ if !quo.IsInt64() {
+ return nil, errors.New("invalid duration: out of range")
+ }
+ result.Seconds = quo.Int64()
+ result.Nanos = int32(rem.Int64()) //nolint:gosec // not an overflow risk; value is less than 2^30
+ return result, nil
+}
+
+func (o UnmarshalOptions) unmarshalNode(node *yaml.Node, message proto.Message, data []byte) error {
+ if node.Kind == 0 {
+ return nil
+ }
+ unm := &unmarshaler{
+ options: o,
+ validator: o.Validator,
+ lines: strings.Split(string(data), "\n"),
+ }
+
+ // Unwrap the document node
+ if node.Kind == yaml.DocumentNode {
+ if len(node.Content) != 1 {
+ return errors.New("expected exactly one node in document")
+ }
+ node = node.Content[0]
+ }
+
+ unm.unmarshalMessage(node, message, false)
+ if unm.validator != nil {
+ err := unm.validator.Validate(message)
+ var verr *protovalidate.ValidationError
+ switch {
+ case err == nil: // Valid.
+ case errors.As(err, &verr):
+ for _, violation := range verr.Violations {
+ closest := unm.nodeClosestToPath(node, message.ProtoReflect().Descriptor(), protovalidate.FieldPathString(violation.Proto.GetField()), violation.Proto.GetForKey())
+ unm.addError(closest, &violationError{
+ Violation: violation.Proto,
+ })
+ }
+ default:
+ unm.addError(node, err)
+ }
+ }
+
+ if len(unm.errors) > 0 {
+ return unmarshalErrors(unm.errors)
+ }
+ return nil
+}
+
+const atTypeFieldName = "@type"
+
+type protoResolver interface {
+ protoregistry.MessageTypeResolver
+ protoregistry.ExtensionTypeResolver
+}
+
+type unmarshaler struct {
+ options UnmarshalOptions
+ errors []error
+ validator Validator
+ lines []string
+}
+
+func (u *unmarshaler) addError(node *yaml.Node, err error) {
+ u.errors = append(u.errors, &nodeError{
+ Path: u.options.Path,
+ Node: node,
+ cause: err,
+ line: u.lines[node.Line-1],
+ })
+}
+func (u *unmarshaler) addErrorf(node *yaml.Node, format string, args ...interface{}) {
+ u.addError(node, fmt.Errorf(format, args...))
+}
+
+func (u *unmarshaler) checkKind(node *yaml.Node, expected yaml.Kind) bool {
+ if node.Kind != expected {
+ u.addErrorf(node, "expected %v, got %v", getNodeKind(expected), getNodeKind(node.Kind))
+ return false
+ }
+ return true
+}
+
+func (u *unmarshaler) checkTag(node *yaml.Node, expected string) {
+ if node.Tag != "" && node.Tag != expected {
+ u.addErrorf(node, "expected tag %v, got %v", expected, node.Tag)
+ }
+}
+
+func (u *unmarshaler) findAnyTypeURL(node *yaml.Node) string {
+ typeURL := ""
+ for i := 1; i < len(node.Content); i += 2 {
+ keyNode := node.Content[i-1]
+ valueNode := node.Content[i]
+ if keyNode.Value == atTypeFieldName && u.checkKind(valueNode, yaml.ScalarNode) {
+ typeURL = valueNode.Value
+ break
+ }
+ }
+ return typeURL
+}
+
+func (u *unmarshaler) resolveAnyType(typeURL string) (protoreflect.MessageType, error) {
+ // Get the message type.
+ msgType, err := u.getResolver().FindMessageByURL(typeURL)
+ if err != nil {
+ return nil, err
+ }
+ return msgType, nil
+}
+
+func (u *unmarshaler) findAnyType(node *yaml.Node) (protoreflect.MessageType, error) {
+ typeURL := u.findAnyTypeURL(node)
+ if typeURL == "" {
+ return nil, errors.New("missing @type field")
+ }
+ return u.resolveAnyType(typeURL)
+}
+
+// Unmarshal the field based on the field kind, ignoring IsList and IsMap,
+// which are handled by the caller.
+func (u *unmarshaler) unmarshalScalar(
+ node *yaml.Node,
+ field protoreflect.FieldDescriptor,
+ forKey bool,
+) (protoreflect.Value, bool) {
+ switch field.Kind() {
+ case protoreflect.BoolKind:
+ return protoreflect.ValueOfBool(u.unmarshalBool(node, forKey)), true
+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
+ //nolint:gosec // not overflow risk since unmarshalInteger does range check
+ return protoreflect.ValueOfInt32(int32(u.unmarshalInteger(node, 32))), true
+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
+ return protoreflect.ValueOfInt64(u.unmarshalInteger(node, 64)), true
+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
+ //nolint:gosec // not overflow risk since unmarshalUnsigned does range check
+ return protoreflect.ValueOfUint32(uint32(u.unmarshalUnsigned(node, 32))), true
+ case protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
+ return protoreflect.ValueOfUint64(u.unmarshalUnsigned(node, 64)), true
+ case protoreflect.FloatKind:
+ return protoreflect.ValueOfFloat32(float32(u.unmarshalFloat(node, 32))), true
+ case protoreflect.DoubleKind:
+ return protoreflect.ValueOfFloat64(u.unmarshalFloat(node, 64)), true
+ case protoreflect.StringKind:
+ u.checkKind(node, yaml.ScalarNode)
+ return protoreflect.ValueOfString(node.Value), true
+ case protoreflect.BytesKind:
+ return protoreflect.ValueOfBytes(u.unmarshalBytes(node)), true
+ case protoreflect.EnumKind:
+ return protoreflect.ValueOfEnum(u.unmarshalEnum(node, field)), true
+ default:
+ u.addErrorf(node, "unimplemented scalar type %v", field.Kind())
+ return protoreflect.Value{}, false
+ }
+}
+
+// Base64 decodes the given node value.
+func (u *unmarshaler) unmarshalBytes(node *yaml.Node) []byte {
+ if !u.checkKind(node, yaml.ScalarNode) {
+ return nil
+ }
+
+ enc := base64.StdEncoding
+ if strings.ContainsAny(node.Value, "-_") {
+ enc = base64.URLEncoding
+ }
+ if len(node.Value)%4 != 0 {
+ enc = enc.WithPadding(base64.NoPadding)
+ }
+
+ // base64 decode the value.
+ data, err := enc.DecodeString(node.Value)
+ if err != nil {
+ u.addErrorf(node, "invalid base64: %v", err)
+ }
+ return data
+}
+
+// Unmarshal raw `true` or `false` values, only allowing for strings for keys.
+func (u *unmarshaler) unmarshalBool(node *yaml.Node, forKey bool) bool {
+ if u.checkKind(node, yaml.ScalarNode) {
+ switch node.Value {
+ case "true":
+ if !forKey {
+ u.checkTag(node, "!!bool")
+ }
+ return true
+ case "false":
+ if !forKey {
+ u.checkTag(node, "!!bool")
+ }
+ return false
+ default:
+ u.addErrorf(node, "expected bool, got %#v", node.Value)
+ }
+ }
+ return false
+}
+
+// Unmarshal the given node into an enum value.
+//
+// Accepts either the enum name or number.
+func (u *unmarshaler) unmarshalEnum(node *yaml.Node, field protoreflect.FieldDescriptor) protoreflect.EnumNumber {
+ u.checkKind(node, yaml.ScalarNode)
+ // Get the enum descriptor.
+ enumDesc := field.Enum()
+ if enumDesc.FullName() == "google.protobuf.NullValue" {
+ return 0
+ }
+ // Get the enum value.
+ enumVal := enumDesc.Values().ByName(protoreflect.Name(node.Value))
+ if enumVal == nil {
+ lit, err := parseIntLiteral(node.Value)
+ if err != nil {
+ u.addErrorf(node, "unknown enum value %#v, expected one of %v", node.Value,
+ getEnumValueNames(enumDesc.Values()))
+ return 0
+ } else if err := lit.checkI32(field); err != nil {
+ u.addErrorf(node, "%w, expected one of %v", err,
+ getEnumValueNames(enumDesc.Values()))
+ return 0
+ }
+ //nolint:gosec // not overflow risk since list.checkI32 call above does range check
+ num := protoreflect.EnumNumber(lit.value)
+ if lit.negative {
+ num = -num
+ }
+ return num
+ }
+ return enumVal.Number()
+}
+
+// Unmarshal the given node into a float with the given bits.
+func (u *unmarshaler) unmarshalFloat(node *yaml.Node, bits int) float64 {
+ if !u.checkKind(node, yaml.ScalarNode) {
+ return 0
+ }
+
+ parsed, err := strconv.ParseFloat(node.Value, bits)
+ if err != nil {
+ u.addErrorf(node, "invalid float: %v", err)
+ }
+ return parsed
+}
+
+// Unmarshal the given node into an unsigned integer with the given bits.
+func (u *unmarshaler) unmarshalUnsigned(node *yaml.Node, bits int) uint64 {
+ if !u.checkKind(node, yaml.ScalarNode) {
+ return 0
+ }
+
+ parsed, err := parseUintLiteral(node.Value)
+ if err != nil {
+ u.addErrorf(node, "invalid integer: %v", err)
+ }
+ if bits < 64 && parsed >= 1< %v", 1<= 1<<(bits-1) {
+ u.addErrorf(node, "integer is too large: > %v", 1<<(bits-1)-1)
+ }
+ //nolint:gosec // we just checked above so not overflow risk
+ return int64(lit.value)
+}
+
+func getFieldNames(fields protoreflect.FieldDescriptors) []protoreflect.Name {
+ names := make([]protoreflect.Name, 0, fields.Len())
+ for i := 0; i < fields.Len(); i++ {
+ names = append(names, fields.Get(i).Name())
+ if i > 5 {
+ names = append(names, "...")
+ break
+ }
+ }
+ return names
+}
+
+func getEnumValueNames(values protoreflect.EnumValueDescriptors) []protoreflect.Name {
+ names := make([]protoreflect.Name, 0, values.Len())
+ for i := 0; i < values.Len(); i++ {
+ names = append(names, values.Get(i).Name())
+ if i > 5 {
+ names = append(names, "...")
+ break
+ }
+ }
+ return names
+}
+
+func getNodeKind(kind yaml.Kind) string {
+ switch kind {
+ case yaml.DocumentNode:
+ return "document"
+ case yaml.SequenceNode:
+ return "sequence"
+ case yaml.MappingNode:
+ return "mapping"
+ case yaml.ScalarNode:
+ return "scalar"
+ case yaml.AliasNode:
+ return "alias"
+ }
+ return fmt.Sprintf("unknown(%d)", kind)
+}
+
+// Parses Octal, Hex, Binary, Decimal, and Unsigned Integer Float literals.
+//
+// Conversion through JSON/YAML may have converted integers into floats, including
+// exponential notation. This function will parse those values back into integers
+// if possible.
+func parseUintLiteral(value string) (uint64, error) {
+ base := 10
+ if len(value) >= 2 && strings.HasPrefix(value, "0") {
+ switch value[1] {
+ case 'x', 'X':
+ base = 16
+ value = value[2:]
+ case 'o', 'O':
+ base = 8
+ value = value[2:]
+ case 'b', 'B':
+ base = 2
+ value = value[2:]
+ }
+ }
+
+ parsed, err := strconv.ParseUint(value, base, 64)
+ if err != nil {
+ parsedFloat, floatErr := strconv.ParseFloat(value, 64)
+ if floatErr != nil || parsedFloat < 0 || math.IsInf(parsedFloat, 0) || math.IsNaN(parsedFloat) {
+ return 0, err
+ }
+ // See if it's actually an integer.
+ parsed = uint64(parsedFloat)
+ if float64(parsed) != parsedFloat || parsed >= (1<<53) {
+ return parsed, errors.New("precision loss")
+ }
+ }
+ return parsed, nil
+}
+
+type intLit struct {
+ negative bool
+ value uint64
+}
+
+func (lit intLit) checkI32(field protoreflect.FieldDescriptor) error {
+ switch {
+ case lit.negative && lit.value > 1<<31: // Underflow.
+ return fmt.Errorf("expected int32 for %v, got int64", field.FullName())
+ case !lit.negative && lit.value >= 1<<31: // Overflow.
+ return fmt.Errorf("expected int32 for %v, got int64", field.FullName())
+ }
+ return nil
+}
+
+func parseIntLiteral(value string) (intLit, error) {
+ var lit intLit
+ if strings.HasPrefix(value, "-") {
+ lit.negative = true
+ value = value[1:]
+ }
+ var err error
+ lit.value, err = parseUintLiteral(value)
+ return lit, err
+}
+
+func (u *unmarshaler) getResolver() protoResolver {
+ if u.options.Resolver != nil {
+ return u.options.Resolver
+ }
+ return protoregistry.GlobalTypes
+}
+
+// findField searches for the field with the given 'key' by extension type, JSONName, TextName,
+// and finally by Number.
+func (u *unmarshaler) findField(key string, msgDesc protoreflect.MessageDescriptor) (protoreflect.FieldDescriptor, error) {
+ fields := msgDesc.Fields()
+ if strings.HasPrefix(key, "[") && strings.HasSuffix(key, "]") {
+ extName := protoreflect.FullName(key[1 : len(key)-1])
+ extType, err := u.getResolver().FindExtensionByName(extName)
+ if err != nil {
+ return nil, err
+ }
+ result := extType.TypeDescriptor()
+ if !msgDesc.ExtensionRanges().Has(result.Number()) || result.ContainingMessage().FullName() != msgDesc.FullName() {
+ return nil, fmt.Errorf("message %v cannot be extended by %v", msgDesc.FullName(), result.FullName())
+ }
+ return result, nil
+ }
+ if field := fields.ByJSONName(key); field != nil {
+ return field, nil
+ }
+ if field := fields.ByTextName(key); field != nil {
+ return field, nil
+ }
+ num, err := strconv.ParseInt(key, 10, 32)
+ if err == nil && num > 0 && num <= math.MaxInt32 {
+ //nolint:gosec // we just checked on previous line so not overflow risk
+ if field := fields.ByNumber(protoreflect.FieldNumber(num)); field != nil {
+ return field, nil
+ }
+ }
+ return nil, protoregistry.NotFound
+}
+
+// Unmarshal a field, handling isList/isMap.
+func (u *unmarshaler) unmarshalField(node *yaml.Node, field protoreflect.FieldDescriptor, message proto.Message) {
+ if oneofDesc := field.ContainingOneof(); oneofDesc != nil && !oneofDesc.IsSynthetic() {
+ // Check if another field in the oneof is already set.
+ if whichOne := message.ProtoReflect().WhichOneof(oneofDesc); whichOne != nil {
+ u.addErrorf(node, "field %v is already set for oneof %v", whichOne.Name(), oneofDesc.Name())
+ return
+ }
+ }
+
+ switch {
+ case field.IsList():
+ u.unmarshalList(node, field, message.ProtoReflect().Mutable(field).List())
+ case field.IsMap():
+ u.unmarshalMap(node, field, message.ProtoReflect().Mutable(field).Map())
+ case field.Message() != nil:
+ u.unmarshalMessage(node, message.ProtoReflect().Mutable(field).Message().Interface(), false)
+ default:
+ if val, ok := u.unmarshalScalar(node, field, false); ok {
+ message.ProtoReflect().Set(field, val)
+ }
+ }
+}
+
+// Unmarshal the list, with explicit handling for lists of messages.
+func (u *unmarshaler) unmarshalList(node *yaml.Node, field protoreflect.FieldDescriptor, list protoreflect.List) {
+ if u.checkKind(node, yaml.SequenceNode) {
+ switch field.Kind() {
+ case protoreflect.MessageKind, protoreflect.GroupKind:
+ for _, itemNode := range node.Content {
+ msgVal := list.NewElement()
+ u.unmarshalMessage(itemNode, msgVal.Message().Interface(), false)
+ list.Append(msgVal)
+ }
+ default:
+ for _, itemNode := range node.Content {
+ val, ok := u.unmarshalScalar(itemNode, field, false)
+ if !ok {
+ continue
+ }
+ list.Append(val)
+ }
+ }
+ }
+}
+
+// Unmarshal the map, with explicit handling for maps to messages.
+func (u *unmarshaler) unmarshalMap(node *yaml.Node, field protoreflect.FieldDescriptor, mapVal protoreflect.Map) {
+ if !u.checkKind(node, yaml.MappingNode) {
+ return
+ }
+ mapKeyField := field.MapKey()
+ mapValueField := field.MapValue()
+ for i := 1; i < len(node.Content); i += 2 {
+ keyNode := node.Content[i-1]
+ valueNode := node.Content[i]
+ mapKey, ok := u.unmarshalScalar(keyNode, mapKeyField, true)
+ if !ok {
+ continue
+ }
+ switch mapValueField.Kind() {
+ case protoreflect.MessageKind, protoreflect.GroupKind:
+ mapValue := mapVal.NewValue()
+ u.unmarshalMessage(valueNode, mapValue.Message().Interface(), false)
+ mapVal.Set(mapKey.MapKey(), mapValue)
+ default:
+ val, ok := u.unmarshalScalar(valueNode, mapValueField, false)
+ if !ok {
+ continue
+ }
+ mapVal.Set(mapKey.MapKey(), val)
+ }
+ }
+}
+
+func isNull(node *yaml.Node) bool {
+ return node.Tag == "!!null"
+}
+
+// Resolve the node to be used with the custom unmarshaler. Returns nil if the
+// there was an error.
+func (u *unmarshaler) findNodeForCustom(node *yaml.Node, forAny bool) *yaml.Node {
+ if !forAny {
+ return node
+ }
+ if !u.checkKind(node, yaml.MappingNode) {
+ return nil
+ }
+ var valueNode *yaml.Node
+ for i := 1; i < len(node.Content); i += 2 {
+ keyNode := node.Content[i-1]
+ switch keyNode.Value {
+ case "value":
+ valueNode = node.Content[i]
+ case atTypeFieldName:
+ continue // Skip the @type field for Any messages
+ default:
+ u.addErrorf(keyNode, "unknown field %#v, expended one of %v", keyNode.Value, []string{"value", atTypeFieldName})
+ return nil
+ }
+ }
+ if valueNode == nil {
+ u.addErrorf(node, "missing \"value\" field")
+ }
+ return valueNode
+}
+
+// Unmarshal the given yaml node into the given proto.Message.
+func (u *unmarshaler) unmarshalMessage(node *yaml.Node, message proto.Message, forAny bool) {
+ // Check for a custom unmarshaler
+ if custom, ok := wktUnmarshalers[message.ProtoReflect().Descriptor().FullName()]; ok {
+ valueNode := u.findNodeForCustom(node, forAny)
+ if valueNode == nil {
+ return // Error already added.
+ } else if custom(u, valueNode, message) {
+ return // Custom unmarshaler handled the decoding.
+ }
+ }
+ if isNull(node) {
+ return // Null is always allowed for messages
+ }
+ if node.Kind != yaml.MappingNode {
+ u.addErrorf(node, "expected fields for %v, got %v",
+ message.ProtoReflect().Descriptor().FullName(), getNodeKind(node.Kind))
+ return
+ }
+ u.unmarshalMessageFields(node, message, forAny)
+}
+
+func (u *unmarshaler) unmarshalMessageFields(node *yaml.Node, message proto.Message, forAny bool) {
+ // Decode the fields
+ msgDesc := message.ProtoReflect().Descriptor()
+ for i := 0; i < len(node.Content); i += 2 {
+ keyNode := node.Content[i]
+ var key string
+ switch keyNode.Kind {
+ case yaml.ScalarNode:
+ key = keyNode.Value
+ case yaml.SequenceNode:
+ // Interpret single element sequences as extension field.
+ if len(keyNode.Content) == 1 && keyNode.Content[0].Kind == yaml.ScalarNode {
+ key = "[" + keyNode.Content[0].Value + "]"
+ break
+ }
+ fallthrough
+ default:
+ // Report an error for non-scalar keys (or sequences with multiple elements).
+ u.checkKind(keyNode, yaml.ScalarNode) // Always returns false.
+ continue
+ }
+
+ if forAny && key == atTypeFieldName {
+ continue // Skip the @type field for Any messages
+ }
+ field, err := u.findField(key, msgDesc)
+ switch {
+ case errors.Is(err, protoregistry.NotFound):
+ if !u.options.DiscardUnknown {
+ u.addErrorf(keyNode, "unknown field %#v, expected one of %v", key, getFieldNames(msgDesc.Fields()))
+ }
+ case err != nil:
+ u.addError(keyNode, err)
+ default:
+ valueNode := node.Content[i+1]
+ u.unmarshalField(valueNode, field, message)
+ }
+ }
+}
+
+type customUnmarshaler func(u *unmarshaler, node *yaml.Node, message proto.Message) bool
+
+func unmarshalAnyMsg(unm *unmarshaler, node *yaml.Node, message proto.Message) bool {
+ if node.Kind != yaml.MappingNode || len(node.Content) == 0 {
+ return false
+ }
+ anyVal, ok := message.(*anypb.Any)
+ if !ok {
+ anyVal = &anypb.Any{}
+ }
+
+ // Get the message type.
+ msgType, err := unm.findAnyType(node)
+ if err != nil {
+ unm.addError(node, err)
+ return true
+ }
+
+ protoVal := msgType.New()
+ unm.unmarshalMessage(node, protoVal.Interface(), true)
+ if err = anyVal.MarshalFrom(protoVal.Interface()); err != nil {
+ unm.addErrorf(node, "failed to marshal %v: %v", msgType.Descriptor().FullName(), err)
+ }
+
+ if !ok {
+ return setFieldByName(message, "type_url", protoreflect.ValueOfString(anyVal.GetTypeUrl())) &&
+ setFieldByName(message, "value", protoreflect.ValueOfBytes(anyVal.GetValue()))
+ }
+
+ return true
+}
+
+const (
+ maxTimestampSeconds = 253402300799
+ minTimestampSeconds = -62135596800
+)
+
+// Format is RFC3339Nano, limited to the range 0001-01-01T00:00:00Z to
+// 9999-12-31T23:59:59Z inclusive.
+func parseTimestamp(txt string, timestamp *timestamppb.Timestamp) error {
+ parsed, err := time.Parse(time.RFC3339Nano, txt)
+ if err != nil {
+ return err
+ }
+ // Validate seconds.
+ secs := parsed.Unix()
+ if secs < minTimestampSeconds {
+ return errors.New("before 0001-01-01T00:00:00Z")
+ } else if secs > maxTimestampSeconds {
+ return errors.New("after 9999-12-31T23:59:59Z")
+ }
+ // Validate nanos.
+ subsecond := strings.LastIndexByte(txt, '.')
+ timezone := strings.LastIndexAny(txt, "Z-+")
+ if subsecond >= 0 && timezone >= subsecond && timezone-subsecond > len(".999999999") {
+ return errors.New("too many fractional second digits")
+ }
+
+ timestamp.Seconds = secs
+ timestamp.Nanos = int32(parsed.Nanosecond()) //nolint:gosec // not an overflow risk; value is less than 2^30
+ return nil
+}
+
+func setFieldByName(message proto.Message, name string, value protoreflect.Value) bool {
+ field := message.ProtoReflect().Descriptor().Fields().ByName(protoreflect.Name(name))
+ if field == nil {
+ return false
+ }
+ message.ProtoReflect().Set(field, value)
+ return true
+}
+
+func unmarshalDurationMsg(unm *unmarshaler, node *yaml.Node, message proto.Message) bool {
+ if node.Kind != yaml.ScalarNode || len(node.Value) == 0 || isNull(node) {
+ return false
+ }
+ duration, err := ParseDuration(node.Value)
+ if err != nil {
+ unm.addError(node, err)
+ return true
+ }
+
+ if value, ok := message.(*durationpb.Duration); ok {
+ value.Seconds = duration.GetSeconds()
+ value.Nanos = duration.GetNanos()
+ return true
+ }
+
+ // Set the fields dynamically.
+ return setFieldByName(message, "seconds", protoreflect.ValueOfInt64(duration.GetSeconds())) &&
+ setFieldByName(message, "nanos", protoreflect.ValueOfInt32(duration.GetNanos()))
+}
+
+func unmarshalTimestampMsg(unm *unmarshaler, node *yaml.Node, message proto.Message) bool {
+ if node.Kind != yaml.ScalarNode || len(node.Value) == 0 || isNull(node) {
+ return false
+ }
+ timestamp, ok := message.(*timestamppb.Timestamp)
+ if !ok {
+ timestamp = ×tamppb.Timestamp{}
+ }
+ err := parseTimestamp(node.Value, timestamp)
+ if err != nil {
+ unm.addErrorf(node, "invalid timestamp: %v", err)
+ } else if !ok {
+ return setFieldByName(message, "seconds", protoreflect.ValueOfInt64(timestamp.GetSeconds())) &&
+ setFieldByName(message, "nanos", protoreflect.ValueOfInt32(timestamp.GetNanos()))
+ }
+ return true
+}
+
+// Forwards unmarshaling to the "value" field of the given wrapper message.
+func unmarshalWrapperMsg(unm *unmarshaler, node *yaml.Node, message proto.Message) bool {
+ valueField := message.ProtoReflect().Descriptor().Fields().ByName("value")
+ if node.Kind == yaml.MappingNode || valueField == nil {
+ return false
+ }
+ unm.unmarshalField(node, valueField, message)
+ return true
+}
+
+func dynSetValue(message proto.Message, value *structpb.Value) bool {
+ switch val := value.GetKind().(type) {
+ case *structpb.Value_NullValue:
+ return setFieldByName(message, "null_value", protoreflect.ValueOfEnum(protoreflect.EnumNumber(val.NullValue)))
+ case *structpb.Value_NumberValue:
+ return setFieldByName(message, "number_value", protoreflect.ValueOfFloat64(val.NumberValue))
+ case *structpb.Value_StringValue:
+ return setFieldByName(message, "string_value", protoreflect.ValueOfString(val.StringValue))
+ case *structpb.Value_BoolValue:
+ return setFieldByName(message, "bool_value", protoreflect.ValueOfBool(val.BoolValue))
+ case *structpb.Value_ListValue:
+ listFld := message.ProtoReflect().Descriptor().Fields().ByName("list_value")
+ if listFld == nil {
+ return false
+ }
+ listVal := message.ProtoReflect().Mutable(listFld).Message().Interface()
+ return dynSetListValue(listVal, val.ListValue)
+ case *structpb.Value_StructValue:
+ structFld := message.ProtoReflect().Descriptor().Fields().ByName("struct_value")
+ if structFld == nil {
+ return false
+ }
+ structVal := message.ProtoReflect().Mutable(structFld).Message().Interface()
+ return dynSetStruct(structVal, val.StructValue)
+ }
+ return false
+}
+
+func dynSetListValue(message proto.Message, list *structpb.ListValue) bool {
+ valuesFld := message.ProtoReflect().Descriptor().Fields().ByName("values")
+ if valuesFld == nil {
+ return false
+ }
+ values := message.ProtoReflect().Mutable(valuesFld).List()
+ for _, item := range list.GetValues() {
+ value := values.NewElement()
+ if !dynSetValue(value.Message().Interface(), item) {
+ return false
+ }
+ values.Append(value)
+ }
+ return true
+}
+
+func dynSetStruct(message proto.Message, structVal *structpb.Struct) bool {
+ fieldsFld := message.ProtoReflect().Descriptor().Fields().ByName("fields")
+ if fieldsFld == nil {
+ return false
+ }
+ fields := message.ProtoReflect().Mutable(fieldsFld).Map()
+ for key, item := range structVal.GetFields() {
+ value := fields.NewValue()
+ if !dynSetValue(value.Message().Interface(), item) {
+ return false
+ }
+ fields.Set(protoreflect.ValueOfString(key).MapKey(), value)
+ }
+ return true
+}
+
+func unmarshalValueMsg(unm *unmarshaler, node *yaml.Node, message proto.Message) bool {
+ value, ok := message.(*structpb.Value)
+ if !ok {
+ value = &structpb.Value{}
+ }
+ unm.unmarshalValue(node, value)
+ if !ok {
+ return dynSetValue(message, value)
+ }
+ return true
+}
+
+func unmarshalListValueMsg(unm *unmarshaler, node *yaml.Node, message proto.Message) bool {
+ if node.Kind != yaml.SequenceNode {
+ return false
+ }
+ listValue, ok := message.(*structpb.ListValue)
+ if !ok {
+ listValue = &structpb.ListValue{}
+ }
+ unm.unmarshalListValue(node, listValue)
+ if !ok {
+ return dynSetListValue(message, listValue)
+ }
+ return true
+}
+
+func unmarshalStructMsg(unm *unmarshaler, node *yaml.Node, message proto.Message) bool {
+ if node.Kind != yaml.MappingNode {
+ return false
+ }
+ structVal, ok := message.(*structpb.Struct)
+ if !ok {
+ structVal = &structpb.Struct{}
+ }
+ unm.unmarshalStruct(node, structVal)
+ if !ok {
+ return dynSetStruct(message, structVal)
+ }
+ return true
+}
+
+// Unmarshal the given yaml node into a structpb.Value, using the given
+// field descriptor to validate the type, if non-nil.
+func (u *unmarshaler) unmarshalValue(
+ node *yaml.Node,
+ value *structpb.Value,
+) {
+ // Unmarshal the value.
+ switch node.Kind {
+ case yaml.SequenceNode: // A list.
+ listValue := &structpb.ListValue{}
+ u.unmarshalListValue(node, listValue)
+ value.Kind = &structpb.Value_ListValue{ListValue: listValue}
+ case yaml.MappingNode: // A message or map.
+ structVal := &structpb.Struct{}
+ u.unmarshalStruct(node, structVal)
+ value.Kind = &structpb.Value_StructValue{StructValue: structVal}
+ case yaml.ScalarNode:
+ u.unmarshalScalarValue(node, value)
+ case 0:
+ value.Kind = &structpb.Value_NullValue{}
+ default:
+ u.addErrorf(node, "unimplemented value kind: %v", getNodeKind(node.Kind))
+ }
+}
+
+// Unmarshal the given yaml node into a structpb.ListValue, using the given field
+// descriptor to validate each item, if non-nil.
+func (u *unmarshaler) unmarshalListValue(
+ node *yaml.Node,
+ list *structpb.ListValue,
+) {
+ for _, itemNode := range node.Content {
+ itemValue := &structpb.Value{}
+ u.unmarshalValue(itemNode, itemValue)
+ list.Values = append(list.GetValues(), itemValue)
+ }
+}
+
+// Unmarshal the given yaml node into a structpb.Struct
+//
+// Structs can represent either a message or a map.
+// For messages, the message descriptor can be provided or inferred from the node.
+// For maps, the field descriptor can be provided to validate the map keys/values.
+func (u *unmarshaler) unmarshalStruct(
+ node *yaml.Node,
+ message *structpb.Struct,
+) {
+ for i := 1; i < len(node.Content); i += 2 {
+ keyNode := node.Content[i-1]
+ // Validate the key.
+ if !u.checkKind(keyNode, yaml.ScalarNode) {
+ continue
+ }
+
+ // Unmarshal the value.
+ valueNode := node.Content[i]
+ value := &structpb.Value{}
+ u.unmarshalValue(valueNode, value)
+ if message.GetFields() == nil {
+ message.Fields = make(map[string]*structpb.Value)
+ }
+ message.Fields[keyNode.Value] = value
+ }
+}
+
+func (u *unmarshaler) unmarshalScalarValue(node *yaml.Node, value *structpb.Value) {
+ switch node.Tag {
+ case "!!null":
+ value.Kind = &structpb.Value_NullValue{}
+ case "!!bool":
+ u.unmarshalScalarBool(node, value)
+ default:
+ u.unmarshalScalarString(node, value)
+ }
+}
+
+// bool, string, or bytes.
+func (u *unmarshaler) unmarshalScalarBool(node *yaml.Node, value *structpb.Value) {
+ switch node.Value {
+ case "true":
+ value.Kind = &structpb.Value_BoolValue{BoolValue: true}
+ case "false":
+ value.Kind = &structpb.Value_BoolValue{BoolValue: false}
+ default: // This is a string, not a bool.
+ value.Kind = &structpb.Value_StringValue{StringValue: node.Value}
+ }
+}
+
+// Can be string, bytes, float, or int.
+func (u *unmarshaler) unmarshalScalarString(node *yaml.Node, value *structpb.Value) {
+ floatVal, err := strconv.ParseFloat(node.Value, 64)
+ if err != nil {
+ value.Kind = &structpb.Value_StringValue{StringValue: node.Value}
+ return
+ }
+
+ if math.IsInf(floatVal, 0) || math.IsNaN(floatVal) {
+ // String or float.
+ value.Kind = &structpb.Value_StringValue{StringValue: node.Value}
+ return
+ }
+
+ // String, float, or int.
+ u.unmarshalScalarFloat(node, value, floatVal)
+}
+
+func (u *unmarshaler) unmarshalScalarFloat(node *yaml.Node, value *structpb.Value, floatVal float64) {
+ // Try to parse it as in integer, to see if the float representation is lossy.
+ lit, litErr := parseIntLiteral(node.Value)
+
+ // Check if we can represent this as a number.
+ floatUintVal := uint64(math.Abs(floatVal)) // The uint64 representation of the float.
+ if litErr != nil || floatUintVal == lit.value { // Safe to represent as a number.
+ value.Kind = &structpb.Value_NumberValue{NumberValue: floatVal}
+ } else { // Keep string representation.
+ value.Kind = &structpb.Value_StringValue{StringValue: node.Value}
+ }
+}
+
+// NodeClosestToPath returns the node closest to the given field path.
+//
+// If toKey is true, the key node is returned if the path points to a map entry.
+//
+// Example field paths:
+// - 'foo' -> the field foo
+// - 'foo[0]' -> the first element of the repeated field foo or the map entry with key '0'
+// - 'foo.bar' -> the field bar in the message field foo
+// - 'foo["bar"]' -> the map entry with key 'bar' in the map field foo
+func (u *unmarshaler) nodeClosestToPath(root *yaml.Node, msgDesc protoreflect.MessageDescriptor, path string, toKey bool) *yaml.Node {
+ parsedPath, err := parseFieldPath(path)
+ if err != nil {
+ return root
+ }
+ return u.findNodeByPath(root, msgDesc, parsedPath, toKey)
+}
+
+func parseFieldPath(path string) ([]string, error) {
+ if len(path) == 0 {
+ return nil, nil
+ }
+ next, path := parseNextFieldName(path)
+ result := []string{next}
+ for len(path) > 0 {
+ switch path[0] {
+ case '[': // Parse array index or map key.
+ next, path = parseNextValue(path[1:])
+ case '.': // Parse field name.
+ next, path = parseNextFieldName(path[1:])
+ default:
+ return nil, errors.New("invalid path")
+ }
+ result = append(result, next)
+ }
+ return result, nil
+}
+
+func parseNextFieldName(path string) (string, string) {
+ for i := 0; i < len(path); i++ {
+ switch path[i] {
+ case '.':
+ return path[:i], path[i:]
+ case '[':
+ return path[:i], path[i:]
+ }
+ }
+ return path, ""
+}
+
+func parseNextValue(path string) (string, string) {
+ if len(path) == 0 {
+ return "", ""
+ }
+ if path[0] == '"' {
+ // Parse string.
+ for i := 1; i < len(path); i++ {
+ if path[i] == '\\' {
+ i++ // Skip escaped character.
+ } else if path[i] == '"' {
+ result, err := strconv.Unquote(path[:i+1])
+ if err != nil {
+ return "", ""
+ }
+ return result, path[i+2:]
+ }
+ }
+ return path, ""
+ }
+ // Go til the trailing ']'
+ for i := 0; i < len(path); i++ {
+ if path[i] == ']' {
+ return path[:i], path[i+1:]
+ }
+ }
+ return path, ""
+}
+
+// Returns the node as close to the given path as possible.
+func (u *unmarshaler) findNodeByPath(root *yaml.Node, msgDesc protoreflect.MessageDescriptor, path []string, toKey bool) *yaml.Node {
+ cur := root
+ curMsg := msgDesc
+ var curMap protoreflect.FieldDescriptor
+ for i, key := range path {
+ switch cur.Kind {
+ case yaml.MappingNode:
+ if curMsg != nil {
+ field, err := u.findField(key, curMsg)
+ if err != nil {
+ return cur
+ }
+ var found bool
+ cur, found = findNodeByField(cur, field)
+ switch {
+ case !found:
+ return cur
+ case field.IsMap():
+ curMap = field
+ curMsg = nil
+ default:
+ curMap = nil
+ curMsg = field.Message()
+ }
+ } else if curMap != nil {
+ var found bool
+ var keyNode *yaml.Node
+ keyNode, cur, found = findEntryByKey(cur, key)
+ if !found {
+ return cur
+ }
+ if i == len(path)-1 && toKey {
+ return keyNode
+ }
+ curMsg = curMap.MapValue().Message()
+ curMap = nil
+ }
+ case yaml.SequenceNode:
+ idx, err := strconv.Atoi(key)
+ if err != nil || idx < 0 || idx >= len(cur.Content) {
+ return cur
+ }
+ cur = cur.Content[idx]
+ default:
+ return cur
+ }
+ }
+ return cur
+}
+
+func findNodeByField(cur *yaml.Node, field protoreflect.FieldDescriptor) (*yaml.Node, bool) {
+ fieldNum := fmt.Sprintf("%d", field.Number())
+ for i := 1; i < len(cur.Content); i += 2 {
+ keyNode := cur.Content[i-1]
+ if keyNode.Value == string(field.Name()) ||
+ keyNode.Value == field.JSONName() ||
+ keyNode.Value == fieldNum {
+ return cur.Content[i], true
+ }
+ }
+ return cur, false
+}
+
+func findEntryByKey(cur *yaml.Node, key string) (*yaml.Node, *yaml.Node, bool) {
+ for i := 1; i < len(cur.Content); i += 2 {
+ keyNode := cur.Content[i-1]
+ if keyNode.Value == key {
+ return keyNode, cur.Content[i], true
+ }
+ }
+ return nil, cur, false
+}
+
+// nanosPerSecond is the number of nanoseconds in a second.
+var nanosPerSecond = new(big.Int).SetUint64(uint64(time.Second / time.Nanosecond))
+
+// nanosMap is a map of time unit names to their duration in nanoseconds.
+var nanosMap = map[string]*big.Int{
+ "ns": new(big.Int).SetUint64(1), // Identity for nanos.
+ "us": new(big.Int).SetUint64(uint64(time.Microsecond / time.Nanosecond)),
+ "µs": new(big.Int).SetUint64(uint64(time.Microsecond / time.Nanosecond)), // U+00B5 = micro symbol
+ "μs": new(big.Int).SetUint64(uint64(time.Microsecond / time.Nanosecond)), // U+03BC = Greek letter mu
+ "ms": new(big.Int).SetUint64(uint64(time.Millisecond / time.Nanosecond)),
+ "s": nanosPerSecond,
+ "m": new(big.Int).SetUint64(uint64(time.Minute / time.Nanosecond)),
+ "h": new(big.Int).SetUint64(uint64(time.Hour / time.Nanosecond)),
+}
+
+// unitsNames is the (normalized) list of time unit names.
+var unitsNames = []string{"h", "m", "s", "ms", "us", "ns"}
+
+// parseDurationNest parses a single segment of the duration string.
+func parseDurationNext(str string, totalNanos *big.Int) (string, error) {
+ // The next character must be [0-9.]
+ if !(str[0] == '.' || '0' <= str[0] && str[0] <= '9') {
+ return "", errors.New("invalid duration")
+ }
+ var err error
+ var whole, frac uint64
+ var pre bool // Whether we have seen a digit before the dot.
+ whole, str, pre, err = leadingInt(str)
+ if err != nil {
+ return "", err
+ }
+ var scale *big.Int
+ var post bool // Whether we have seen a digit after the dot.
+ if str != "" && str[0] == '.' {
+ str = str[1:]
+ frac, scale, str, post = leadingFrac(str)
+ }
+ if !pre && !post {
+ return "", errors.New("invalid duration")
+ }
+
+ end := unitEnd(str)
+ if end == 0 {
+ return "", fmt.Errorf("invalid duration: missing unit, expected one of %v", unitsNames)
+ }
+ unitName := str[:end]
+ str = str[end:]
+ nanosPerUnit, ok := nanosMap[unitName]
+ if !ok {
+ return "", fmt.Errorf("invalid duration: unknown unit, expected one of %v", unitsNames)
+ }
+
+ // Convert to nanos and add to total.
+ // totalNanos += whole * nanosPerUnit + frac * nanosPerUnit / scale
+ if whole > 0 {
+ wholeNanos := &big.Int{}
+ wholeNanos.SetUint64(whole)
+ wholeNanos.Mul(wholeNanos, nanosPerUnit)
+ totalNanos.Add(totalNanos, wholeNanos)
+ }
+ if frac > 0 {
+ fracNanos := &big.Int{}
+ fracNanos.SetUint64(frac)
+ fracNanos.Mul(fracNanos, nanosPerUnit)
+ rem := &big.Int{}
+ fracNanos.QuoRem(fracNanos, scale, rem)
+ if rem.Uint64() > 0 {
+ return "", errors.New("invalid duration: fractional nanos")
+ }
+ totalNanos.Add(totalNanos, fracNanos)
+ }
+ return str, nil
+}
+
+func unitEnd(str string) int {
+ var i int
+ for ; i < len(str); i++ {
+ c := str[i]
+ if c == '.' || c == '-' || '0' <= c && c <= '9' {
+ return i
+ }
+ }
+ return i
+}
+
+func leadingFrac(str string) (result uint64, scale *big.Int, rem string, post bool) {
+ var i int
+ scale = big.NewInt(1)
+ big10 := big.NewInt(10)
+ var overflow bool
+ for ; i < len(str); i++ {
+ chr := str[i]
+ if chr < '0' || chr > '9' {
+ break
+ }
+ if overflow {
+ continue
+ }
+ if result > (1<<63-1)/10 {
+ overflow = true
+ continue
+ }
+ temp := result*10 + uint64(chr-'0')
+ if temp > 1<<63 {
+ overflow = true
+ continue
+ }
+ result = temp
+ scale.Mul(scale, big10)
+ }
+ return result, scale, str[i:], i > 0
+}
+
+func leadingInt(str string) (result uint64, rem string, pre bool, err error) {
+ var i int
+ for ; i < len(str); i++ {
+ c := str[i]
+ if c < '0' || c > '9' {
+ break
+ }
+ newResult := result*10 + uint64(c-'0')
+ if newResult < result {
+ return 0, str, i > 0, errors.New("integer overflow")
+ }
+ result = newResult
+ }
+ return result, str[i:], i > 0, nil
+}
+
+func init() { //nolint:gochecknoinits
+ wktUnmarshalers = map[protoreflect.FullName]customUnmarshaler{
+ "google.protobuf.Any": unmarshalAnyMsg,
+ "google.protobuf.Duration": unmarshalDurationMsg,
+ "google.protobuf.Timestamp": unmarshalTimestampMsg,
+ "google.protobuf.BoolValue": unmarshalWrapperMsg,
+ "google.protobuf.BytesValue": unmarshalWrapperMsg,
+ "google.protobuf.DoubleValue": unmarshalWrapperMsg,
+ "google.protobuf.FloatValue": unmarshalWrapperMsg,
+ "google.protobuf.Int32Value": unmarshalWrapperMsg,
+ "google.protobuf.Int64Value": unmarshalWrapperMsg,
+ "google.protobuf.UInt32Value": unmarshalWrapperMsg,
+ "google.protobuf.UInt64Value": unmarshalWrapperMsg,
+ "google.protobuf.StringValue": unmarshalWrapperMsg,
+ "google.protobuf.Value": unmarshalValueMsg,
+ "google.protobuf.ListValue": unmarshalListValueMsg,
+ "google.protobuf.Struct": unmarshalStructMsg,
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/encode.go b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/encode.go
new file mode 100644
index 0000000..0c4b519
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/encode.go
@@ -0,0 +1,115 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package protoyaml
+
+import (
+ "bytes"
+ "encoding/json"
+
+ "google.golang.org/protobuf/encoding/protojson"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoregistry"
+ "gopkg.in/yaml.v3"
+)
+
+// Marshal marshals the given message to YAML.
+func Marshal(message proto.Message) ([]byte, error) {
+ return MarshalOptions{}.Marshal(message)
+}
+
+// MarshalOptions is a configurable YAML format marshaller.
+//
+// It uses similar options to protojson.MarshalOptions.
+type MarshalOptions struct {
+ // The number of spaces to indent. Passed to yaml.Encoder.SetIndent.
+ // If 0, uses the default indent of yaml.v3.
+ Indent int
+ // AllowPartial allows messages that have missing required fields to marshal
+ // without returning an error.
+ AllowPartial bool
+ // UseProtoNames uses proto field name instead of lowerCamelCase name in YAML
+ // field names.
+ UseProtoNames bool
+ // UseEnumNumbers emits enum values as numbers.
+ UseEnumNumbers bool
+ // EmitUnpopulated specifies whether to emit unpopulated fields.
+ EmitUnpopulated bool
+ // Resolver is used for looking up types when expanding google.protobuf.Any
+ // messages. If nil, this defaults to using protoregistry.GlobalTypes.
+ Resolver interface {
+ protoregistry.ExtensionTypeResolver
+ protoregistry.MessageTypeResolver
+ }
+}
+
+// Marshal marshals the given message to YAML using the options in MarshalOptions.
+// Do not depend on the output to be stable across different versions.
+func (o MarshalOptions) Marshal(message proto.Message) ([]byte, error) {
+ data, err := protojson.MarshalOptions{
+ AllowPartial: o.AllowPartial,
+ UseProtoNames: o.UseProtoNames,
+ UseEnumNumbers: o.UseEnumNumbers,
+ EmitUnpopulated: o.EmitUnpopulated,
+ Resolver: o.Resolver,
+ }.Marshal(message)
+ if err != nil {
+ return nil, err
+ }
+ yamlVal, err := jsonDataToYAML(data)
+ if err != nil {
+ return nil, err
+ }
+
+ // Write the JSON back out as YAML
+ buffer := &bytes.Buffer{}
+ encoder := yaml.NewEncoder(buffer)
+ encoder.SetIndent(o.Indent)
+ if err := encoder.Encode(yamlVal); err != nil {
+ return nil, err
+ }
+ return buffer.Bytes(), nil
+}
+
+func jsonDataToYAML(data []byte) (interface{}, error) {
+ // YAML unmarshal preserves the order of fields, but is more restrictive than JSON.
+ // Prefer it if the data is valid YAML.
+ jsonNode := &yaml.Node{}
+ if err := yaml.Unmarshal(data, jsonNode); err == nil {
+ if jsonNode.Kind == yaml.DocumentNode {
+ jsonNode = jsonNode.Content[0]
+ }
+ clearStyle(jsonNode)
+ return jsonNode, nil
+ }
+
+ // If the data is not valid YAML (e.g. a string contains control characters),
+ // fall back to JSON unmarshal, which loses field order, but is more permissive.
+ var jsonValue interface{}
+ if err := json.Unmarshal(data, &jsonValue); err != nil {
+ return nil, err
+ }
+ return jsonValue, nil
+}
+
+// clearStyle removes all style information from the node and its children.
+//
+// Without this, the returned YAML will look exactly like the JSON input.
+// TODO: Allow yaml style information to be specified in proto.
+func clearStyle(node *yaml.Node) {
+ node.Style = 0
+ for _, child := range node.Content {
+ clearStyle(child)
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/errors.go b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/errors.go
new file mode 100644
index 0000000..4a616c7
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/buf.build/go/protoyaml/errors.go
@@ -0,0 +1,75 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package protoyaml
+
+import (
+ "fmt"
+ "strings"
+
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go"
+ "gopkg.in/yaml.v3"
+)
+
+// nodeError is an error that occurred while processing a specific yaml.Node.
+type nodeError struct {
+ Node *yaml.Node
+ Path string
+ line string
+ cause error
+}
+
+func (n *nodeError) Unwrap() error {
+ return n.cause
+}
+
+// DetailedError returns an error message that includes the path and a code snippet, if
+// the lines of the source code are provided.
+func (n *nodeError) Error() string {
+ var result strings.Builder
+ result.WriteString(fmt.Sprintf("%s:%d:%d %s\n", n.Path, n.Node.Line, n.Node.Column, n.Unwrap().Error()))
+ if n.line != "" {
+ lineNum := fmt.Sprintf("%4d", n.Node.Line)
+ result.WriteString(fmt.Sprintf("%s | %s\n", lineNum, n.line))
+ marker := strings.Repeat(".", n.Node.Column-1) + "^"
+ result.WriteString(fmt.Sprintf("%s | %s\n", lineNum, marker))
+ }
+ return result.String()
+}
+
+// violationError is singe validation violation.
+type violationError struct {
+ Violation *validate.Violation
+}
+
+// Error prints the field path, message, and constraint ID.
+func (v *violationError) Error() string {
+ return protovalidate.FieldPathString(v.Violation.GetField()) + ": " + v.Violation.GetMessage() + " (" + v.Violation.GetConstraintId() + ")"
+}
+
+// TODO: Use errors.Join instead, once we drop support for Go <1.21.
+type unmarshalErrors []error
+
+func (ue unmarshalErrors) Error() string {
+ errorStrings := make([]string, len(ue))
+ for i, err := range ue {
+ errorStrings[i] = err.Error()
+ }
+ return strings.Join(errorStrings, "\n")
+}
+
+func (ue unmarshalErrors) Unwrap() []error {
+ return ue
+}
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/.bazelversion b/.gear/predownloaded-development/vendor/cel.dev/expr/.bazelversion
new file mode 100644
index 0000000..26bc914
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/.bazelversion
@@ -0,0 +1,2 @@
+7.0.1
+# Keep this pinned version in parity with cel-go
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/.gitattributes b/.gear/predownloaded-development/vendor/cel.dev/expr/.gitattributes
new file mode 100644
index 0000000..3de1ec2
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/.gitattributes
@@ -0,0 +1,2 @@
+*.pb.go linguist-generated=true
+*.pb.go -diff -merge
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/.gitignore b/.gear/predownloaded-development/vendor/cel.dev/expr/.gitignore
new file mode 100644
index 0000000..0d4fed2
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/.gitignore
@@ -0,0 +1,2 @@
+bazel-*
+MODULE.bazel.lock
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/BUILD.bazel b/.gear/predownloaded-development/vendor/cel.dev/expr/BUILD.bazel
new file mode 100644
index 0000000..37d8adc
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/BUILD.bazel
@@ -0,0 +1,34 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"]) # Apache 2.0
+
+go_library(
+ name = "expr",
+ srcs = [
+ "checked.pb.go",
+ "eval.pb.go",
+ "explain.pb.go",
+ "syntax.pb.go",
+ "value.pb.go",
+ ],
+ importpath = "cel.dev/expr",
+ visibility = ["//visibility:public"],
+ deps = [
+ "@org_golang_google_genproto_googleapis_rpc//status:go_default_library",
+ "@org_golang_google_protobuf//reflect/protoreflect",
+ "@org_golang_google_protobuf//runtime/protoimpl",
+ "@org_golang_google_protobuf//types/known/anypb",
+ "@org_golang_google_protobuf//types/known/durationpb",
+ "@org_golang_google_protobuf//types/known/emptypb",
+ "@org_golang_google_protobuf//types/known/structpb",
+ "@org_golang_google_protobuf//types/known/timestamppb",
+ ],
+)
+
+alias(
+ name = "go_default_library",
+ actual = ":expr",
+ visibility = ["//visibility:public"],
+)
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/CODE_OF_CONDUCT.md b/.gear/predownloaded-development/vendor/cel.dev/expr/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..59908e2
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/CODE_OF_CONDUCT.md
@@ -0,0 +1,25 @@
+# Contributor Code of Conduct
+## Version 0.1.1 (adapted from 0.3b-angular)
+
+As contributors and maintainers of the Common Expression Language
+(CEL) project, we pledge to respect everyone who contributes by
+posting issues, updating documentation, submitting pull requests,
+providing feedback in comments, and any other activities.
+
+Communication through any of CEL's channels (GitHub, Gitter, IRC,
+mailing lists, Google+, Twitter, etc.) must be constructive and never
+resort to personal attacks, trolling, public or private harassment,
+insults, or other unprofessional conduct.
+
+We promise to extend courtesy and respect to everyone involved in this
+project regardless of gender, gender identity, sexual orientation,
+disability, age, race, ethnicity, religion, or level of experience. We
+expect anyone contributing to the project to do the same.
+
+If any member of the community violates this code of conduct, the
+maintainers of the CEL project may take action, removing issues,
+comments, and PRs or blocking accounts as deemed appropriate.
+
+If you are subject to or witness unacceptable behavior, or have any
+other concerns, please email us at
+[cel-conduct@google.com](mailto:cel-conduct@google.com).
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/CONTRIBUTING.md b/.gear/predownloaded-development/vendor/cel.dev/expr/CONTRIBUTING.md
new file mode 100644
index 0000000..8f5fd5c
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/CONTRIBUTING.md
@@ -0,0 +1,32 @@
+# How to Contribute
+
+We'd love to accept your patches and contributions to this project. There are a
+few guidelines you need to follow.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution,
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions, including submissions by project members, require review. We
+use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+## What to expect from maintainers
+
+Expect maintainers to respond to new issues or pull requests within a week.
+For outstanding and ongoing issues and particularly for long-running
+pull requests, expect the maintainers to review within a week of a
+contributor asking for a new review. There is no commitment to resolution --
+merging or closing a pull request, or fixing or closing an issue -- because some
+issues will require more discussion than others.
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/GOVERNANCE.md b/.gear/predownloaded-development/vendor/cel.dev/expr/GOVERNANCE.md
new file mode 100644
index 0000000..0a525bc
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/GOVERNANCE.md
@@ -0,0 +1,43 @@
+# Project Governance
+
+This document defines the governance process for the CEL language. CEL is
+Google-developed, but openly governed. Major contributors to the CEL
+specification and its corresponding implementations constitute the CEL
+Language Council. New members may be added by a unanimous vote of the
+Council.
+
+The MAINTAINERS.md file lists the members of the CEL Language Council, and
+unofficially indicates the "areas of expertise" of each member with respect
+to the publicly available CEL repos.
+
+## Code Changes
+
+Code changes must follow the standard pull request (PR) model documented in the
+CONTRIBUTING.md for each CEL repo. All fixes and features must be reviewed by a
+maintainer. The maintainer reserves the right to request that any feature
+request (FR) or PR be reviewed by the language council.
+
+## Syntax and Semantic Changes
+
+Syntactic and semantic changes must be reviewed by the CEL Language Council.
+Maintainers may also request language council review at their discretion.
+
+The review process is as follows:
+
+- Create a Feature Request in the CEL-Spec repo. The feature description will
+ serve as an abstract for the detailed design document.
+- Co-develop a design document with the Language Council.
+- Once the proposer gives the design document approval, the document will be
+ linked to the FR in the CEL-Spec repo and opened for comments to members of
+ the cel-lang-discuss@googlegroups.com.
+- The Language Council will review the design doc at the next council meeting
+ (once every three weeks) and the council decision included in the document.
+
+If the proposal is approved, the spec will be updated by a maintainer (if
+applicable) and a rationale will be included in the CEL-Spec wiki to ensure
+future developers may follow CEL's growth and direction over time.
+
+Approved proposals may be implemented by the proposer or by the maintainers as
+the parties see fit. At the discretion of the maintainer, changes from the
+approved design are permitted during implementation if they improve the user
+experience and clarity of the feature.
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/LICENSE b/.gear/predownloaded-development/vendor/cel.dev/expr/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/MAINTAINERS.md b/.gear/predownloaded-development/vendor/cel.dev/expr/MAINTAINERS.md
new file mode 100644
index 0000000..1ed2eb8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/MAINTAINERS.md
@@ -0,0 +1,13 @@
+# CEL Language Council
+
+| Name | Company | Area of Expertise |
+|-----------------|--------------|-------------------|
+| Alfred Fuller | Facebook | cel-cpp, cel-spec |
+| Jim Larson | Google | cel-go, cel-spec |
+| Matthais Blume | Google | cel-spec |
+| Tristan Swadell | Google | cel-go, cel-spec |
+
+## Emeritus
+
+* Sanjay Ghemawat (Google)
+* Wolfgang Grieskamp (Facebook)
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/MODULE.bazel b/.gear/predownloaded-development/vendor/cel.dev/expr/MODULE.bazel
new file mode 100644
index 0000000..9794266
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/MODULE.bazel
@@ -0,0 +1,70 @@
+module(
+ name = "cel-spec",
+)
+
+bazel_dep(
+ name = "bazel_skylib",
+ version = "1.7.1",
+)
+bazel_dep(
+ name = "gazelle",
+ version = "0.36.0",
+ repo_name = "bazel_gazelle",
+)
+bazel_dep(
+ name = "googleapis",
+ version = "0.0.0-20240819-fe8ba054a",
+ repo_name = "com_google_googleapis",
+)
+bazel_dep(
+ name = "protobuf",
+ version = "26.0",
+ repo_name = "com_google_protobuf",
+)
+bazel_dep(
+ name = "rules_cc",
+ version = "0.0.9",
+)
+bazel_dep(
+ name = "rules_go",
+ version = "0.49.0",
+ repo_name = "io_bazel_rules_go",
+)
+bazel_dep(
+ name = "rules_java",
+ version = "7.6.5",
+)
+bazel_dep(
+ name = "rules_proto",
+ version = "6.0.0",
+)
+bazel_dep(
+ name = "rules_python",
+ version = "0.35.0",
+)
+
+### PYTHON ###
+python = use_extension("@rules_python//python/extensions:python.bzl", "python")
+python.toolchain(
+ ignore_root_user_error = True,
+ python_version = "3.11",
+)
+
+switched_rules = use_extension("@com_google_googleapis//:extensions.bzl", "switched_rules")
+switched_rules.use_languages(
+ cc = True,
+ go = True,
+ java = True,
+)
+use_repo(switched_rules, "com_google_googleapis_imports")
+
+go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk")
+go_sdk.download(version = "1.21.1")
+
+go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps")
+go_deps.from_file(go_mod = "//:go.mod")
+use_repo(
+ go_deps,
+ "org_golang_google_genproto_googleapis_rpc",
+ "org_golang_google_protobuf",
+)
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/README.md b/.gear/predownloaded-development/vendor/cel.dev/expr/README.md
new file mode 100644
index 0000000..7930c0b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/README.md
@@ -0,0 +1,73 @@
+# Common Expression Language
+
+The Common Expression Language (CEL) implements common semantics for expression
+evaluation, enabling different applications to more easily interoperate.
+
+Key Applications
+
+* Security policy: organizations have complex infrastructure and need common
+ tooling to reason about the system as a whole
+* Protocols: expressions are a useful data type and require interoperability
+ across programming languages and platforms.
+
+
+Guiding philosophy:
+
+1. Keep it small & fast.
+ * CEL evaluates in linear time, is mutation free, and not Turing-complete.
+ This limitation is a feature of the language design, which allows the
+ implementation to evaluate orders of magnitude faster than equivalently
+ sandboxed JavaScript.
+2. Make it extensible.
+ * CEL is designed to be embedded in applications, and allows for
+ extensibility via its context which allows for functions and data to be
+ provided by the software that embeds it.
+3. Developer-friendly.
+ * The language is approachable to developers. The initial spec was based
+ on the experience of developing Firebase Rules and usability testing
+ many prior iterations.
+ * The library itself and accompanying toolings should be easy to adopt by
+ teams that seek to integrate CEL into their platforms.
+
+The required components of a system that supports CEL are:
+
+* The textual representation of an expression as written by a developer. It is
+ of similar syntax to expressions in C/C++/Java/JavaScript
+* A representation of the program's abstract syntax tree (AST).
+* A compiler library that converts the textual representation to the binary
+ representation. This can be done ahead of time (in the control plane) or
+ just before evaluation (in the data plane).
+* A context containing one or more typed variables, often protobuf messages.
+ Most use-cases will use `attribute_context.proto`
+* An evaluator library that takes the binary format in the context and
+ produces a result, usually a Boolean.
+
+For use cases which require persistence or cross-process communcation, it is
+highly recommended to serialize the type-checked expression as a protocol
+buffer. The CEL team will maintains canonical protocol buffers for ASTs and
+will keep these versions identical and wire-compatible in perpetuity:
+
+* [CEL canonical](https://github.com/google/cel-spec/tree/master/proto/cel/expr)
+* [CEL v1alpha1](https://github.com/googleapis/googleapis/tree/master/google/api/expr/v1alpha1)
+
+
+Example of boolean conditions and object construction:
+
+``` c
+// Condition
+account.balance >= transaction.withdrawal
+ || (account.overdraftProtection
+ && account.overdraftLimit >= transaction.withdrawal - account.balance)
+
+// Object construction
+common.GeoPoint{ latitude: 10.0, longitude: -5.5 }
+```
+
+For more detail, see:
+
+* [Introduction](doc/intro.md)
+* [Language Definition](doc/langdef.md)
+
+Released under the [Apache License](LICENSE).
+
+Disclaimer: This is not an official Google product.
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/WORKSPACE b/.gear/predownloaded-development/vendor/cel.dev/expr/WORKSPACE
new file mode 100644
index 0000000..b6dc9ed
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/WORKSPACE
@@ -0,0 +1,145 @@
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+http_archive(
+ name = "io_bazel_rules_go",
+ sha256 = "099a9fb96a376ccbbb7d291ed4ecbdfd42f6bc822ab77ae6f1b5cb9e914e94fa",
+ urls = [
+ "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.35.0/rules_go-v0.35.0.zip",
+ "https://github.com/bazelbuild/rules_go/releases/download/v0.35.0/rules_go-v0.35.0.zip",
+ ],
+)
+
+http_archive(
+ name = "bazel_gazelle",
+ sha256 = "ecba0f04f96b4960a5b250c8e8eeec42281035970aa8852dda73098274d14a1d",
+ urls = [
+ "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz",
+ "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.29.0/bazel-gazelle-v0.29.0.tar.gz",
+ ],
+)
+
+http_archive(
+ name = "rules_proto",
+ sha256 = "e017528fd1c91c5a33f15493e3a398181a9e821a804eb7ff5acdd1d2d6c2b18d",
+ strip_prefix = "rules_proto-4.0.0-3.20.0",
+ urls = [
+ "https://github.com/bazelbuild/rules_proto/archive/refs/tags/4.0.0-3.20.0.tar.gz",
+ ],
+)
+
+# googleapis as of 09/16/2024
+http_archive(
+ name = "com_google_googleapis",
+ strip_prefix = "googleapis-4082d5e51e8481f6ccc384cacd896f4e78f19dee",
+ sha256 = "57319889d47578b3c89bf1b3f34888d796a8913d63b32d750a4cd12ed303c4e8",
+ urls = [
+ "https://github.com/googleapis/googleapis/archive/4082d5e51e8481f6ccc384cacd896f4e78f19dee.tar.gz",
+ ],
+)
+
+# protobuf
+http_archive(
+ name = "com_google_protobuf",
+ sha256 = "8242327e5df8c80ba49e4165250b8f79a76bd11765facefaaecfca7747dc8da2",
+ strip_prefix = "protobuf-3.21.5",
+ urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.21.5.zip"],
+)
+
+# googletest
+http_archive(
+ name = "com_google_googletest",
+ urls = ["https://github.com/google/googletest/archive/master.zip"],
+ strip_prefix = "googletest-master",
+)
+
+# gflags
+http_archive(
+ name = "com_github_gflags_gflags",
+ sha256 = "6e16c8bc91b1310a44f3965e616383dbda48f83e8c1eaa2370a215057b00cabe",
+ strip_prefix = "gflags-77592648e3f3be87d6c7123eb81cbad75f9aef5a",
+ urls = [
+ "https://mirror.bazel.build/github.com/gflags/gflags/archive/77592648e3f3be87d6c7123eb81cbad75f9aef5a.tar.gz",
+ "https://github.com/gflags/gflags/archive/77592648e3f3be87d6c7123eb81cbad75f9aef5a.tar.gz",
+ ],
+)
+
+# glog
+http_archive(
+ name = "com_google_glog",
+ sha256 = "1ee310e5d0a19b9d584a855000434bb724aa744745d5b8ab1855c85bff8a8e21",
+ strip_prefix = "glog-028d37889a1e80e8a07da1b8945ac706259e5fd8",
+ urls = [
+ "https://mirror.bazel.build/github.com/google/glog/archive/028d37889a1e80e8a07da1b8945ac706259e5fd8.tar.gz",
+ "https://github.com/google/glog/archive/028d37889a1e80e8a07da1b8945ac706259e5fd8.tar.gz",
+ ],
+)
+
+# absl
+http_archive(
+ name = "com_google_absl",
+ strip_prefix = "abseil-cpp-master",
+ urls = ["https://github.com/abseil/abseil-cpp/archive/master.zip"],
+)
+
+load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
+load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
+load("@com_google_googleapis//:repository_rules.bzl", "switched_rules_by_language")
+load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
+load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
+
+switched_rules_by_language(
+ name = "com_google_googleapis_imports",
+ cc = True,
+)
+
+# Do *not* call *_dependencies(), etc, yet. See comment at the end.
+
+# Generated Google APIs protos for Golang
+# Generated Google APIs protos for Golang 08/26/2024
+go_repository(
+ name = "org_golang_google_genproto_googleapis_api",
+ build_file_proto_mode = "disable_global",
+ importpath = "google.golang.org/genproto/googleapis/api",
+ sum = "h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=",
+ version = "v0.0.0-20240826202546-f6391c0de4c7",
+)
+
+# Generated Google APIs protos for Golang 08/26/2024
+go_repository(
+ name = "org_golang_google_genproto_googleapis_rpc",
+ build_file_proto_mode = "disable_global",
+ importpath = "google.golang.org/genproto/googleapis/rpc",
+ sum = "h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=",
+ version = "v0.0.0-20240826202546-f6391c0de4c7",
+)
+
+# gRPC deps
+go_repository(
+ name = "org_golang_google_grpc",
+ build_file_proto_mode = "disable_global",
+ importpath = "google.golang.org/grpc",
+ tag = "v1.49.0",
+)
+
+go_repository(
+ name = "org_golang_x_net",
+ importpath = "golang.org/x/net",
+ sum = "h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=",
+ version = "v0.0.0-20190311183353-d8887717615a",
+)
+
+go_repository(
+ name = "org_golang_x_text",
+ importpath = "golang.org/x/text",
+ sum = "h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=",
+ version = "v0.3.2",
+)
+
+# Run the dependencies at the end. These will silently try to import some
+# of the above repositories but at different versions, so ours must come first.
+go_rules_dependencies()
+go_register_toolchains(version = "1.19.1")
+gazelle_dependencies()
+rules_proto_dependencies()
+rules_proto_toolchains()
+protobuf_deps()
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/WORKSPACE.bzlmod b/.gear/predownloaded-development/vendor/cel.dev/expr/WORKSPACE.bzlmod
new file mode 100644
index 0000000..e69de29
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/checked.pb.go b/.gear/predownloaded-development/vendor/cel.dev/expr/checked.pb.go
new file mode 100644
index 0000000..bb225c8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/checked.pb.go
@@ -0,0 +1,1432 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc v3.21.5
+// source: cel/expr/checked.proto
+
+package expr
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ emptypb "google.golang.org/protobuf/types/known/emptypb"
+ structpb "google.golang.org/protobuf/types/known/structpb"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Type_PrimitiveType int32
+
+const (
+ Type_PRIMITIVE_TYPE_UNSPECIFIED Type_PrimitiveType = 0
+ Type_BOOL Type_PrimitiveType = 1
+ Type_INT64 Type_PrimitiveType = 2
+ Type_UINT64 Type_PrimitiveType = 3
+ Type_DOUBLE Type_PrimitiveType = 4
+ Type_STRING Type_PrimitiveType = 5
+ Type_BYTES Type_PrimitiveType = 6
+)
+
+// Enum value maps for Type_PrimitiveType.
+var (
+ Type_PrimitiveType_name = map[int32]string{
+ 0: "PRIMITIVE_TYPE_UNSPECIFIED",
+ 1: "BOOL",
+ 2: "INT64",
+ 3: "UINT64",
+ 4: "DOUBLE",
+ 5: "STRING",
+ 6: "BYTES",
+ }
+ Type_PrimitiveType_value = map[string]int32{
+ "PRIMITIVE_TYPE_UNSPECIFIED": 0,
+ "BOOL": 1,
+ "INT64": 2,
+ "UINT64": 3,
+ "DOUBLE": 4,
+ "STRING": 5,
+ "BYTES": 6,
+ }
+)
+
+func (x Type_PrimitiveType) Enum() *Type_PrimitiveType {
+ p := new(Type_PrimitiveType)
+ *p = x
+ return p
+}
+
+func (x Type_PrimitiveType) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Type_PrimitiveType) Descriptor() protoreflect.EnumDescriptor {
+ return file_cel_expr_checked_proto_enumTypes[0].Descriptor()
+}
+
+func (Type_PrimitiveType) Type() protoreflect.EnumType {
+ return &file_cel_expr_checked_proto_enumTypes[0]
+}
+
+func (x Type_PrimitiveType) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Type_PrimitiveType.Descriptor instead.
+func (Type_PrimitiveType) EnumDescriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 0}
+}
+
+type Type_WellKnownType int32
+
+const (
+ Type_WELL_KNOWN_TYPE_UNSPECIFIED Type_WellKnownType = 0
+ Type_ANY Type_WellKnownType = 1
+ Type_TIMESTAMP Type_WellKnownType = 2
+ Type_DURATION Type_WellKnownType = 3
+)
+
+// Enum value maps for Type_WellKnownType.
+var (
+ Type_WellKnownType_name = map[int32]string{
+ 0: "WELL_KNOWN_TYPE_UNSPECIFIED",
+ 1: "ANY",
+ 2: "TIMESTAMP",
+ 3: "DURATION",
+ }
+ Type_WellKnownType_value = map[string]int32{
+ "WELL_KNOWN_TYPE_UNSPECIFIED": 0,
+ "ANY": 1,
+ "TIMESTAMP": 2,
+ "DURATION": 3,
+ }
+)
+
+func (x Type_WellKnownType) Enum() *Type_WellKnownType {
+ p := new(Type_WellKnownType)
+ *p = x
+ return p
+}
+
+func (x Type_WellKnownType) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Type_WellKnownType) Descriptor() protoreflect.EnumDescriptor {
+ return file_cel_expr_checked_proto_enumTypes[1].Descriptor()
+}
+
+func (Type_WellKnownType) Type() protoreflect.EnumType {
+ return &file_cel_expr_checked_proto_enumTypes[1]
+}
+
+func (x Type_WellKnownType) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use Type_WellKnownType.Descriptor instead.
+func (Type_WellKnownType) EnumDescriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 1}
+}
+
+type CheckedExpr struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ ReferenceMap map[int64]*Reference `protobuf:"bytes,2,rep,name=reference_map,json=referenceMap,proto3" json:"reference_map,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ TypeMap map[int64]*Type `protobuf:"bytes,3,rep,name=type_map,json=typeMap,proto3" json:"type_map,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ SourceInfo *SourceInfo `protobuf:"bytes,5,opt,name=source_info,json=sourceInfo,proto3" json:"source_info,omitempty"`
+ ExprVersion string `protobuf:"bytes,6,opt,name=expr_version,json=exprVersion,proto3" json:"expr_version,omitempty"`
+ Expr *Expr `protobuf:"bytes,4,opt,name=expr,proto3" json:"expr,omitempty"`
+}
+
+func (x *CheckedExpr) Reset() {
+ *x = CheckedExpr{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *CheckedExpr) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CheckedExpr) ProtoMessage() {}
+
+func (x *CheckedExpr) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use CheckedExpr.ProtoReflect.Descriptor instead.
+func (*CheckedExpr) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *CheckedExpr) GetReferenceMap() map[int64]*Reference {
+ if x != nil {
+ return x.ReferenceMap
+ }
+ return nil
+}
+
+func (x *CheckedExpr) GetTypeMap() map[int64]*Type {
+ if x != nil {
+ return x.TypeMap
+ }
+ return nil
+}
+
+func (x *CheckedExpr) GetSourceInfo() *SourceInfo {
+ if x != nil {
+ return x.SourceInfo
+ }
+ return nil
+}
+
+func (x *CheckedExpr) GetExprVersion() string {
+ if x != nil {
+ return x.ExprVersion
+ }
+ return ""
+}
+
+func (x *CheckedExpr) GetExpr() *Expr {
+ if x != nil {
+ return x.Expr
+ }
+ return nil
+}
+
+type Type struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Types that are assignable to TypeKind:
+ //
+ // *Type_Dyn
+ // *Type_Null
+ // *Type_Primitive
+ // *Type_Wrapper
+ // *Type_WellKnown
+ // *Type_ListType_
+ // *Type_MapType_
+ // *Type_Function
+ // *Type_MessageType
+ // *Type_TypeParam
+ // *Type_Type
+ // *Type_Error
+ // *Type_AbstractType_
+ TypeKind isType_TypeKind `protobuf_oneof:"type_kind"`
+}
+
+func (x *Type) Reset() {
+ *x = Type{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Type) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Type) ProtoMessage() {}
+
+func (x *Type) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Type.ProtoReflect.Descriptor instead.
+func (*Type) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{1}
+}
+
+func (m *Type) GetTypeKind() isType_TypeKind {
+ if m != nil {
+ return m.TypeKind
+ }
+ return nil
+}
+
+func (x *Type) GetDyn() *emptypb.Empty {
+ if x, ok := x.GetTypeKind().(*Type_Dyn); ok {
+ return x.Dyn
+ }
+ return nil
+}
+
+func (x *Type) GetNull() structpb.NullValue {
+ if x, ok := x.GetTypeKind().(*Type_Null); ok {
+ return x.Null
+ }
+ return structpb.NullValue(0)
+}
+
+func (x *Type) GetPrimitive() Type_PrimitiveType {
+ if x, ok := x.GetTypeKind().(*Type_Primitive); ok {
+ return x.Primitive
+ }
+ return Type_PRIMITIVE_TYPE_UNSPECIFIED
+}
+
+func (x *Type) GetWrapper() Type_PrimitiveType {
+ if x, ok := x.GetTypeKind().(*Type_Wrapper); ok {
+ return x.Wrapper
+ }
+ return Type_PRIMITIVE_TYPE_UNSPECIFIED
+}
+
+func (x *Type) GetWellKnown() Type_WellKnownType {
+ if x, ok := x.GetTypeKind().(*Type_WellKnown); ok {
+ return x.WellKnown
+ }
+ return Type_WELL_KNOWN_TYPE_UNSPECIFIED
+}
+
+func (x *Type) GetListType() *Type_ListType {
+ if x, ok := x.GetTypeKind().(*Type_ListType_); ok {
+ return x.ListType
+ }
+ return nil
+}
+
+func (x *Type) GetMapType() *Type_MapType {
+ if x, ok := x.GetTypeKind().(*Type_MapType_); ok {
+ return x.MapType
+ }
+ return nil
+}
+
+func (x *Type) GetFunction() *Type_FunctionType {
+ if x, ok := x.GetTypeKind().(*Type_Function); ok {
+ return x.Function
+ }
+ return nil
+}
+
+func (x *Type) GetMessageType() string {
+ if x, ok := x.GetTypeKind().(*Type_MessageType); ok {
+ return x.MessageType
+ }
+ return ""
+}
+
+func (x *Type) GetTypeParam() string {
+ if x, ok := x.GetTypeKind().(*Type_TypeParam); ok {
+ return x.TypeParam
+ }
+ return ""
+}
+
+func (x *Type) GetType() *Type {
+ if x, ok := x.GetTypeKind().(*Type_Type); ok {
+ return x.Type
+ }
+ return nil
+}
+
+func (x *Type) GetError() *emptypb.Empty {
+ if x, ok := x.GetTypeKind().(*Type_Error); ok {
+ return x.Error
+ }
+ return nil
+}
+
+func (x *Type) GetAbstractType() *Type_AbstractType {
+ if x, ok := x.GetTypeKind().(*Type_AbstractType_); ok {
+ return x.AbstractType
+ }
+ return nil
+}
+
+type isType_TypeKind interface {
+ isType_TypeKind()
+}
+
+type Type_Dyn struct {
+ Dyn *emptypb.Empty `protobuf:"bytes,1,opt,name=dyn,proto3,oneof"`
+}
+
+type Type_Null struct {
+ Null structpb.NullValue `protobuf:"varint,2,opt,name=null,proto3,enum=google.protobuf.NullValue,oneof"`
+}
+
+type Type_Primitive struct {
+ Primitive Type_PrimitiveType `protobuf:"varint,3,opt,name=primitive,proto3,enum=cel.expr.Type_PrimitiveType,oneof"`
+}
+
+type Type_Wrapper struct {
+ Wrapper Type_PrimitiveType `protobuf:"varint,4,opt,name=wrapper,proto3,enum=cel.expr.Type_PrimitiveType,oneof"`
+}
+
+type Type_WellKnown struct {
+ WellKnown Type_WellKnownType `protobuf:"varint,5,opt,name=well_known,json=wellKnown,proto3,enum=cel.expr.Type_WellKnownType,oneof"`
+}
+
+type Type_ListType_ struct {
+ ListType *Type_ListType `protobuf:"bytes,6,opt,name=list_type,json=listType,proto3,oneof"`
+}
+
+type Type_MapType_ struct {
+ MapType *Type_MapType `protobuf:"bytes,7,opt,name=map_type,json=mapType,proto3,oneof"`
+}
+
+type Type_Function struct {
+ Function *Type_FunctionType `protobuf:"bytes,8,opt,name=function,proto3,oneof"`
+}
+
+type Type_MessageType struct {
+ MessageType string `protobuf:"bytes,9,opt,name=message_type,json=messageType,proto3,oneof"`
+}
+
+type Type_TypeParam struct {
+ TypeParam string `protobuf:"bytes,10,opt,name=type_param,json=typeParam,proto3,oneof"`
+}
+
+type Type_Type struct {
+ Type *Type `protobuf:"bytes,11,opt,name=type,proto3,oneof"`
+}
+
+type Type_Error struct {
+ Error *emptypb.Empty `protobuf:"bytes,12,opt,name=error,proto3,oneof"`
+}
+
+type Type_AbstractType_ struct {
+ AbstractType *Type_AbstractType `protobuf:"bytes,14,opt,name=abstract_type,json=abstractType,proto3,oneof"`
+}
+
+func (*Type_Dyn) isType_TypeKind() {}
+
+func (*Type_Null) isType_TypeKind() {}
+
+func (*Type_Primitive) isType_TypeKind() {}
+
+func (*Type_Wrapper) isType_TypeKind() {}
+
+func (*Type_WellKnown) isType_TypeKind() {}
+
+func (*Type_ListType_) isType_TypeKind() {}
+
+func (*Type_MapType_) isType_TypeKind() {}
+
+func (*Type_Function) isType_TypeKind() {}
+
+func (*Type_MessageType) isType_TypeKind() {}
+
+func (*Type_TypeParam) isType_TypeKind() {}
+
+func (*Type_Type) isType_TypeKind() {}
+
+func (*Type_Error) isType_TypeKind() {}
+
+func (*Type_AbstractType_) isType_TypeKind() {}
+
+type Decl struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ // Types that are assignable to DeclKind:
+ //
+ // *Decl_Ident
+ // *Decl_Function
+ DeclKind isDecl_DeclKind `protobuf_oneof:"decl_kind"`
+}
+
+func (x *Decl) Reset() {
+ *x = Decl{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Decl) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Decl) ProtoMessage() {}
+
+func (x *Decl) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Decl.ProtoReflect.Descriptor instead.
+func (*Decl) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *Decl) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (m *Decl) GetDeclKind() isDecl_DeclKind {
+ if m != nil {
+ return m.DeclKind
+ }
+ return nil
+}
+
+func (x *Decl) GetIdent() *Decl_IdentDecl {
+ if x, ok := x.GetDeclKind().(*Decl_Ident); ok {
+ return x.Ident
+ }
+ return nil
+}
+
+func (x *Decl) GetFunction() *Decl_FunctionDecl {
+ if x, ok := x.GetDeclKind().(*Decl_Function); ok {
+ return x.Function
+ }
+ return nil
+}
+
+type isDecl_DeclKind interface {
+ isDecl_DeclKind()
+}
+
+type Decl_Ident struct {
+ Ident *Decl_IdentDecl `protobuf:"bytes,2,opt,name=ident,proto3,oneof"`
+}
+
+type Decl_Function struct {
+ Function *Decl_FunctionDecl `protobuf:"bytes,3,opt,name=function,proto3,oneof"`
+}
+
+func (*Decl_Ident) isDecl_DeclKind() {}
+
+func (*Decl_Function) isDecl_DeclKind() {}
+
+type Reference struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ OverloadId []string `protobuf:"bytes,3,rep,name=overload_id,json=overloadId,proto3" json:"overload_id,omitempty"`
+ Value *Constant `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *Reference) Reset() {
+ *x = Reference{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Reference) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Reference) ProtoMessage() {}
+
+func (x *Reference) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Reference.ProtoReflect.Descriptor instead.
+func (*Reference) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *Reference) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *Reference) GetOverloadId() []string {
+ if x != nil {
+ return x.OverloadId
+ }
+ return nil
+}
+
+func (x *Reference) GetValue() *Constant {
+ if x != nil {
+ return x.Value
+ }
+ return nil
+}
+
+type Type_ListType struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ ElemType *Type `protobuf:"bytes,1,opt,name=elem_type,json=elemType,proto3" json:"elem_type,omitempty"`
+}
+
+func (x *Type_ListType) Reset() {
+ *x = Type_ListType{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Type_ListType) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Type_ListType) ProtoMessage() {}
+
+func (x *Type_ListType) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Type_ListType.ProtoReflect.Descriptor instead.
+func (*Type_ListType) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 0}
+}
+
+func (x *Type_ListType) GetElemType() *Type {
+ if x != nil {
+ return x.ElemType
+ }
+ return nil
+}
+
+type Type_MapType struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ KeyType *Type `protobuf:"bytes,1,opt,name=key_type,json=keyType,proto3" json:"key_type,omitempty"`
+ ValueType *Type `protobuf:"bytes,2,opt,name=value_type,json=valueType,proto3" json:"value_type,omitempty"`
+}
+
+func (x *Type_MapType) Reset() {
+ *x = Type_MapType{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Type_MapType) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Type_MapType) ProtoMessage() {}
+
+func (x *Type_MapType) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Type_MapType.ProtoReflect.Descriptor instead.
+func (*Type_MapType) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 1}
+}
+
+func (x *Type_MapType) GetKeyType() *Type {
+ if x != nil {
+ return x.KeyType
+ }
+ return nil
+}
+
+func (x *Type_MapType) GetValueType() *Type {
+ if x != nil {
+ return x.ValueType
+ }
+ return nil
+}
+
+type Type_FunctionType struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ ResultType *Type `protobuf:"bytes,1,opt,name=result_type,json=resultType,proto3" json:"result_type,omitempty"`
+ ArgTypes []*Type `protobuf:"bytes,2,rep,name=arg_types,json=argTypes,proto3" json:"arg_types,omitempty"`
+}
+
+func (x *Type_FunctionType) Reset() {
+ *x = Type_FunctionType{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Type_FunctionType) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Type_FunctionType) ProtoMessage() {}
+
+func (x *Type_FunctionType) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[8]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Type_FunctionType.ProtoReflect.Descriptor instead.
+func (*Type_FunctionType) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 2}
+}
+
+func (x *Type_FunctionType) GetResultType() *Type {
+ if x != nil {
+ return x.ResultType
+ }
+ return nil
+}
+
+func (x *Type_FunctionType) GetArgTypes() []*Type {
+ if x != nil {
+ return x.ArgTypes
+ }
+ return nil
+}
+
+type Type_AbstractType struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ ParameterTypes []*Type `protobuf:"bytes,2,rep,name=parameter_types,json=parameterTypes,proto3" json:"parameter_types,omitempty"`
+}
+
+func (x *Type_AbstractType) Reset() {
+ *x = Type_AbstractType{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Type_AbstractType) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Type_AbstractType) ProtoMessage() {}
+
+func (x *Type_AbstractType) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[9]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Type_AbstractType.ProtoReflect.Descriptor instead.
+func (*Type_AbstractType) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{1, 3}
+}
+
+func (x *Type_AbstractType) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *Type_AbstractType) GetParameterTypes() []*Type {
+ if x != nil {
+ return x.ParameterTypes
+ }
+ return nil
+}
+
+type Decl_IdentDecl struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Type *Type `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
+ Value *Constant `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+ Doc string `protobuf:"bytes,3,opt,name=doc,proto3" json:"doc,omitempty"`
+}
+
+func (x *Decl_IdentDecl) Reset() {
+ *x = Decl_IdentDecl{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Decl_IdentDecl) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Decl_IdentDecl) ProtoMessage() {}
+
+func (x *Decl_IdentDecl) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[10]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Decl_IdentDecl.ProtoReflect.Descriptor instead.
+func (*Decl_IdentDecl) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 0}
+}
+
+func (x *Decl_IdentDecl) GetType() *Type {
+ if x != nil {
+ return x.Type
+ }
+ return nil
+}
+
+func (x *Decl_IdentDecl) GetValue() *Constant {
+ if x != nil {
+ return x.Value
+ }
+ return nil
+}
+
+func (x *Decl_IdentDecl) GetDoc() string {
+ if x != nil {
+ return x.Doc
+ }
+ return ""
+}
+
+type Decl_FunctionDecl struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Overloads []*Decl_FunctionDecl_Overload `protobuf:"bytes,1,rep,name=overloads,proto3" json:"overloads,omitempty"`
+}
+
+func (x *Decl_FunctionDecl) Reset() {
+ *x = Decl_FunctionDecl{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[11]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Decl_FunctionDecl) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Decl_FunctionDecl) ProtoMessage() {}
+
+func (x *Decl_FunctionDecl) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[11]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Decl_FunctionDecl.ProtoReflect.Descriptor instead.
+func (*Decl_FunctionDecl) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 1}
+}
+
+func (x *Decl_FunctionDecl) GetOverloads() []*Decl_FunctionDecl_Overload {
+ if x != nil {
+ return x.Overloads
+ }
+ return nil
+}
+
+type Decl_FunctionDecl_Overload struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ OverloadId string `protobuf:"bytes,1,opt,name=overload_id,json=overloadId,proto3" json:"overload_id,omitempty"`
+ Params []*Type `protobuf:"bytes,2,rep,name=params,proto3" json:"params,omitempty"`
+ TypeParams []string `protobuf:"bytes,3,rep,name=type_params,json=typeParams,proto3" json:"type_params,omitempty"`
+ ResultType *Type `protobuf:"bytes,4,opt,name=result_type,json=resultType,proto3" json:"result_type,omitempty"`
+ IsInstanceFunction bool `protobuf:"varint,5,opt,name=is_instance_function,json=isInstanceFunction,proto3" json:"is_instance_function,omitempty"`
+ Doc string `protobuf:"bytes,6,opt,name=doc,proto3" json:"doc,omitempty"`
+}
+
+func (x *Decl_FunctionDecl_Overload) Reset() {
+ *x = Decl_FunctionDecl_Overload{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_checked_proto_msgTypes[12]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Decl_FunctionDecl_Overload) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Decl_FunctionDecl_Overload) ProtoMessage() {}
+
+func (x *Decl_FunctionDecl_Overload) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_checked_proto_msgTypes[12]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Decl_FunctionDecl_Overload.ProtoReflect.Descriptor instead.
+func (*Decl_FunctionDecl_Overload) Descriptor() ([]byte, []int) {
+ return file_cel_expr_checked_proto_rawDescGZIP(), []int{2, 1, 0}
+}
+
+func (x *Decl_FunctionDecl_Overload) GetOverloadId() string {
+ if x != nil {
+ return x.OverloadId
+ }
+ return ""
+}
+
+func (x *Decl_FunctionDecl_Overload) GetParams() []*Type {
+ if x != nil {
+ return x.Params
+ }
+ return nil
+}
+
+func (x *Decl_FunctionDecl_Overload) GetTypeParams() []string {
+ if x != nil {
+ return x.TypeParams
+ }
+ return nil
+}
+
+func (x *Decl_FunctionDecl_Overload) GetResultType() *Type {
+ if x != nil {
+ return x.ResultType
+ }
+ return nil
+}
+
+func (x *Decl_FunctionDecl_Overload) GetIsInstanceFunction() bool {
+ if x != nil {
+ return x.IsInstanceFunction
+ }
+ return false
+}
+
+func (x *Decl_FunctionDecl_Overload) GetDoc() string {
+ if x != nil {
+ return x.Doc
+ }
+ return ""
+}
+
+var File_cel_expr_checked_proto protoreflect.FileDescriptor
+
+var file_cel_expr_checked_proto_rawDesc = []byte{
+ 0x0a, 0x16, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b,
+ 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78,
+ 0x70, 0x72, 0x1a, 0x15, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x73, 0x79, 0x6e,
+ 0x74, 0x61, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70,
+ 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xba, 0x03, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64,
+ 0x45, 0x78, 0x70, 0x72, 0x12, 0x4c, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+ 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x65,
+ 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x78,
+ 0x70, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x45,
+ 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4d,
+ 0x61, 0x70, 0x12, 0x3d, 0x0a, 0x08, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x03,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,
+ 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65,
+ 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x74, 0x79, 0x70, 0x65, 0x4d, 0x61,
+ 0x70, 0x12, 0x35, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,
+ 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, 0x70, 0x72,
+ 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
+ 0x65, 0x78, 0x70, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x04, 0x65,
+ 0x78, 0x70, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e,
+ 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x1a,
+ 0x54, 0x0a, 0x11, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x45,
+ 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72,
+ 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4a, 0x0a, 0x0c, 0x54, 0x79, 0x70, 0x65, 0x4d, 0x61, 0x70,
+ 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,
+ 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
+ 0x01, 0x22, 0xe6, 0x09, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x64, 0x79,
+ 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48,
+ 0x00, 0x52, 0x03, 0x64, 0x79, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x48, 0x00, 0x52, 0x04, 0x6e, 0x75, 0x6c, 0x6c, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6d,
+ 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x65,
+ 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6d,
+ 0x69, 0x74, 0x69, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x09, 0x70, 0x72, 0x69,
+ 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
+ 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78,
+ 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76,
+ 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72,
+ 0x12, 0x3d, 0x0a, 0x0a, 0x77, 0x65, 0x6c, 0x6c, 0x5f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,
+ 0x54, 0x79, 0x70, 0x65, 0x2e, 0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79,
+ 0x70, 0x65, 0x48, 0x00, 0x52, 0x09, 0x77, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x12,
+ 0x36, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79,
+ 0x70, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x6c,
+ 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x5f, 0x74,
+ 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x65, 0x6c, 0x2e,
+ 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70,
+ 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x08,
+ 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b,
+ 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x46,
+ 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x66,
+ 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61,
+ 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
+ 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0a,
+ 0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09,
+ 0x48, 0x00, 0x52, 0x09, 0x74, 0x79, 0x70, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x24, 0x0a,
+ 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65,
+ 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x04, 0x74,
+ 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f,
+ 0x74, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x6c,
+ 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x41, 0x62, 0x73, 0x74, 0x72,
+ 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x62, 0x73, 0x74, 0x72,
+ 0x61, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x37, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x54,
+ 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x65, 0x6c, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,
+ 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65,
+ 0x1a, 0x63, 0x0a, 0x07, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x6b,
+ 0x65, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,
+ 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x6b,
+ 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f,
+ 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c,
+ 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x6c, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f,
+ 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c,
+ 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75,
+ 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x5f, 0x74, 0x79,
+ 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e,
+ 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x61, 0x72, 0x67, 0x54, 0x79,
+ 0x70, 0x65, 0x73, 0x1a, 0x5b, 0x0a, 0x0c, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54,
+ 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d,
+ 0x65, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65,
+ 0x52, 0x0e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x73,
+ 0x22, 0x73, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x54, 0x79, 0x70,
+ 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x49, 0x4d, 0x49, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x54,
+ 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
+ 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x49,
+ 0x4e, 0x54, 0x36, 0x34, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34,
+ 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x0a,
+ 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x59,
+ 0x54, 0x45, 0x53, 0x10, 0x06, 0x22, 0x56, 0x0a, 0x0d, 0x57, 0x65, 0x6c, 0x6c, 0x4b, 0x6e, 0x6f,
+ 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x45, 0x4c, 0x4c, 0x5f, 0x4b,
+ 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
+ 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01,
+ 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x02, 0x12,
+ 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x42, 0x0b, 0x0a,
+ 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xc2, 0x04, 0x0a, 0x04, 0x44,
+ 0x65, 0x63, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,
+ 0x72, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x63, 0x6c,
+ 0x48, 0x00, 0x52, 0x05, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x66, 0x75, 0x6e,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65,
+ 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x46, 0x75, 0x6e, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x48, 0x00, 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63,
+ 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x6b, 0x0a, 0x09, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x63,
+ 0x6c, 0x12, 0x22, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52,
+ 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,
+ 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12,
+ 0x10, 0x0a, 0x03, 0x64, 0x6f, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x6f,
+ 0x63, 0x1a, 0xbe, 0x02, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65,
+ 0x63, 0x6c, 0x12, 0x42, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18,
+ 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72,
+ 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x2e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65,
+ 0x63, 0x6c, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x6f, 0x76, 0x65,
+ 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x1a, 0xe9, 0x01, 0x0a, 0x08, 0x4f, 0x76, 0x65, 0x72, 0x6c,
+ 0x6f, 0x61, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x5f,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f,
+ 0x61, 0x64, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,
+ 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1f, 0x0a, 0x0b,
+ 0x74, 0x79, 0x70, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
+ 0x09, 0x52, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2f, 0x0a,
+ 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x54, 0x79,
+ 0x70, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30,
+ 0x0a, 0x14, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x75,
+ 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x73,
+ 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+ 0x12, 0x10, 0x0a, 0x03, 0x64, 0x6f, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64,
+ 0x6f, 0x63, 0x42, 0x0b, 0x0a, 0x09, 0x64, 0x65, 0x63, 0x6c, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22,
+ 0x6a, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04,
+ 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
+ 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18,
+ 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x49,
+ 0x64, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73,
+ 0x74, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2c, 0x0a, 0x0c, 0x64,
+ 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x09, 0x44, 0x65, 0x63,
+ 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65,
+ 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x33,
+}
+
+var (
+ file_cel_expr_checked_proto_rawDescOnce sync.Once
+ file_cel_expr_checked_proto_rawDescData = file_cel_expr_checked_proto_rawDesc
+)
+
+func file_cel_expr_checked_proto_rawDescGZIP() []byte {
+ file_cel_expr_checked_proto_rawDescOnce.Do(func() {
+ file_cel_expr_checked_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_checked_proto_rawDescData)
+ })
+ return file_cel_expr_checked_proto_rawDescData
+}
+
+var file_cel_expr_checked_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_cel_expr_checked_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
+var file_cel_expr_checked_proto_goTypes = []interface{}{
+ (Type_PrimitiveType)(0), // 0: cel.expr.Type.PrimitiveType
+ (Type_WellKnownType)(0), // 1: cel.expr.Type.WellKnownType
+ (*CheckedExpr)(nil), // 2: cel.expr.CheckedExpr
+ (*Type)(nil), // 3: cel.expr.Type
+ (*Decl)(nil), // 4: cel.expr.Decl
+ (*Reference)(nil), // 5: cel.expr.Reference
+ nil, // 6: cel.expr.CheckedExpr.ReferenceMapEntry
+ nil, // 7: cel.expr.CheckedExpr.TypeMapEntry
+ (*Type_ListType)(nil), // 8: cel.expr.Type.ListType
+ (*Type_MapType)(nil), // 9: cel.expr.Type.MapType
+ (*Type_FunctionType)(nil), // 10: cel.expr.Type.FunctionType
+ (*Type_AbstractType)(nil), // 11: cel.expr.Type.AbstractType
+ (*Decl_IdentDecl)(nil), // 12: cel.expr.Decl.IdentDecl
+ (*Decl_FunctionDecl)(nil), // 13: cel.expr.Decl.FunctionDecl
+ (*Decl_FunctionDecl_Overload)(nil), // 14: cel.expr.Decl.FunctionDecl.Overload
+ (*SourceInfo)(nil), // 15: cel.expr.SourceInfo
+ (*Expr)(nil), // 16: cel.expr.Expr
+ (*emptypb.Empty)(nil), // 17: google.protobuf.Empty
+ (structpb.NullValue)(0), // 18: google.protobuf.NullValue
+ (*Constant)(nil), // 19: cel.expr.Constant
+}
+var file_cel_expr_checked_proto_depIdxs = []int32{
+ 6, // 0: cel.expr.CheckedExpr.reference_map:type_name -> cel.expr.CheckedExpr.ReferenceMapEntry
+ 7, // 1: cel.expr.CheckedExpr.type_map:type_name -> cel.expr.CheckedExpr.TypeMapEntry
+ 15, // 2: cel.expr.CheckedExpr.source_info:type_name -> cel.expr.SourceInfo
+ 16, // 3: cel.expr.CheckedExpr.expr:type_name -> cel.expr.Expr
+ 17, // 4: cel.expr.Type.dyn:type_name -> google.protobuf.Empty
+ 18, // 5: cel.expr.Type.null:type_name -> google.protobuf.NullValue
+ 0, // 6: cel.expr.Type.primitive:type_name -> cel.expr.Type.PrimitiveType
+ 0, // 7: cel.expr.Type.wrapper:type_name -> cel.expr.Type.PrimitiveType
+ 1, // 8: cel.expr.Type.well_known:type_name -> cel.expr.Type.WellKnownType
+ 8, // 9: cel.expr.Type.list_type:type_name -> cel.expr.Type.ListType
+ 9, // 10: cel.expr.Type.map_type:type_name -> cel.expr.Type.MapType
+ 10, // 11: cel.expr.Type.function:type_name -> cel.expr.Type.FunctionType
+ 3, // 12: cel.expr.Type.type:type_name -> cel.expr.Type
+ 17, // 13: cel.expr.Type.error:type_name -> google.protobuf.Empty
+ 11, // 14: cel.expr.Type.abstract_type:type_name -> cel.expr.Type.AbstractType
+ 12, // 15: cel.expr.Decl.ident:type_name -> cel.expr.Decl.IdentDecl
+ 13, // 16: cel.expr.Decl.function:type_name -> cel.expr.Decl.FunctionDecl
+ 19, // 17: cel.expr.Reference.value:type_name -> cel.expr.Constant
+ 5, // 18: cel.expr.CheckedExpr.ReferenceMapEntry.value:type_name -> cel.expr.Reference
+ 3, // 19: cel.expr.CheckedExpr.TypeMapEntry.value:type_name -> cel.expr.Type
+ 3, // 20: cel.expr.Type.ListType.elem_type:type_name -> cel.expr.Type
+ 3, // 21: cel.expr.Type.MapType.key_type:type_name -> cel.expr.Type
+ 3, // 22: cel.expr.Type.MapType.value_type:type_name -> cel.expr.Type
+ 3, // 23: cel.expr.Type.FunctionType.result_type:type_name -> cel.expr.Type
+ 3, // 24: cel.expr.Type.FunctionType.arg_types:type_name -> cel.expr.Type
+ 3, // 25: cel.expr.Type.AbstractType.parameter_types:type_name -> cel.expr.Type
+ 3, // 26: cel.expr.Decl.IdentDecl.type:type_name -> cel.expr.Type
+ 19, // 27: cel.expr.Decl.IdentDecl.value:type_name -> cel.expr.Constant
+ 14, // 28: cel.expr.Decl.FunctionDecl.overloads:type_name -> cel.expr.Decl.FunctionDecl.Overload
+ 3, // 29: cel.expr.Decl.FunctionDecl.Overload.params:type_name -> cel.expr.Type
+ 3, // 30: cel.expr.Decl.FunctionDecl.Overload.result_type:type_name -> cel.expr.Type
+ 31, // [31:31] is the sub-list for method output_type
+ 31, // [31:31] is the sub-list for method input_type
+ 31, // [31:31] is the sub-list for extension type_name
+ 31, // [31:31] is the sub-list for extension extendee
+ 0, // [0:31] is the sub-list for field type_name
+}
+
+func init() { file_cel_expr_checked_proto_init() }
+func file_cel_expr_checked_proto_init() {
+ if File_cel_expr_checked_proto != nil {
+ return
+ }
+ file_cel_expr_syntax_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_cel_expr_checked_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*CheckedExpr); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Type); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Decl); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Reference); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Type_ListType); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Type_MapType); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Type_FunctionType); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Type_AbstractType); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Decl_IdentDecl); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Decl_FunctionDecl); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Decl_FunctionDecl_Overload); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ file_cel_expr_checked_proto_msgTypes[1].OneofWrappers = []interface{}{
+ (*Type_Dyn)(nil),
+ (*Type_Null)(nil),
+ (*Type_Primitive)(nil),
+ (*Type_Wrapper)(nil),
+ (*Type_WellKnown)(nil),
+ (*Type_ListType_)(nil),
+ (*Type_MapType_)(nil),
+ (*Type_Function)(nil),
+ (*Type_MessageType)(nil),
+ (*Type_TypeParam)(nil),
+ (*Type_Type)(nil),
+ (*Type_Error)(nil),
+ (*Type_AbstractType_)(nil),
+ }
+ file_cel_expr_checked_proto_msgTypes[2].OneofWrappers = []interface{}{
+ (*Decl_Ident)(nil),
+ (*Decl_Function)(nil),
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_cel_expr_checked_proto_rawDesc,
+ NumEnums: 2,
+ NumMessages: 13,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_cel_expr_checked_proto_goTypes,
+ DependencyIndexes: file_cel_expr_checked_proto_depIdxs,
+ EnumInfos: file_cel_expr_checked_proto_enumTypes,
+ MessageInfos: file_cel_expr_checked_proto_msgTypes,
+ }.Build()
+ File_cel_expr_checked_proto = out.File
+ file_cel_expr_checked_proto_rawDesc = nil
+ file_cel_expr_checked_proto_goTypes = nil
+ file_cel_expr_checked_proto_depIdxs = nil
+}
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/cloudbuild.yaml b/.gear/predownloaded-development/vendor/cel.dev/expr/cloudbuild.yaml
new file mode 100644
index 0000000..c40881f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/cloudbuild.yaml
@@ -0,0 +1,9 @@
+steps:
+- name: 'gcr.io/cloud-builders/bazel:7.0.1'
+ entrypoint: bazel
+ args: ['build', '...']
+ id: bazel-build
+ waitFor: ['-']
+timeout: 15m
+options:
+ machineType: 'N1_HIGHCPU_32'
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/eval.pb.go b/.gear/predownloaded-development/vendor/cel.dev/expr/eval.pb.go
new file mode 100644
index 0000000..8f651f9
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/eval.pb.go
@@ -0,0 +1,490 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc v3.21.5
+// source: cel/expr/eval.proto
+
+package expr
+
+import (
+ status "google.golang.org/genproto/googleapis/rpc/status"
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type EvalState struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Values []*ExprValue `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"`
+ Results []*EvalState_Result `protobuf:"bytes,3,rep,name=results,proto3" json:"results,omitempty"`
+}
+
+func (x *EvalState) Reset() {
+ *x = EvalState{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_eval_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EvalState) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EvalState) ProtoMessage() {}
+
+func (x *EvalState) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_eval_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EvalState.ProtoReflect.Descriptor instead.
+func (*EvalState) Descriptor() ([]byte, []int) {
+ return file_cel_expr_eval_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *EvalState) GetValues() []*ExprValue {
+ if x != nil {
+ return x.Values
+ }
+ return nil
+}
+
+func (x *EvalState) GetResults() []*EvalState_Result {
+ if x != nil {
+ return x.Results
+ }
+ return nil
+}
+
+type ExprValue struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Types that are assignable to Kind:
+ //
+ // *ExprValue_Value
+ // *ExprValue_Error
+ // *ExprValue_Unknown
+ Kind isExprValue_Kind `protobuf_oneof:"kind"`
+}
+
+func (x *ExprValue) Reset() {
+ *x = ExprValue{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_eval_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ExprValue) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExprValue) ProtoMessage() {}
+
+func (x *ExprValue) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_eval_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExprValue.ProtoReflect.Descriptor instead.
+func (*ExprValue) Descriptor() ([]byte, []int) {
+ return file_cel_expr_eval_proto_rawDescGZIP(), []int{1}
+}
+
+func (m *ExprValue) GetKind() isExprValue_Kind {
+ if m != nil {
+ return m.Kind
+ }
+ return nil
+}
+
+func (x *ExprValue) GetValue() *Value {
+ if x, ok := x.GetKind().(*ExprValue_Value); ok {
+ return x.Value
+ }
+ return nil
+}
+
+func (x *ExprValue) GetError() *ErrorSet {
+ if x, ok := x.GetKind().(*ExprValue_Error); ok {
+ return x.Error
+ }
+ return nil
+}
+
+func (x *ExprValue) GetUnknown() *UnknownSet {
+ if x, ok := x.GetKind().(*ExprValue_Unknown); ok {
+ return x.Unknown
+ }
+ return nil
+}
+
+type isExprValue_Kind interface {
+ isExprValue_Kind()
+}
+
+type ExprValue_Value struct {
+ Value *Value `protobuf:"bytes,1,opt,name=value,proto3,oneof"`
+}
+
+type ExprValue_Error struct {
+ Error *ErrorSet `protobuf:"bytes,2,opt,name=error,proto3,oneof"`
+}
+
+type ExprValue_Unknown struct {
+ Unknown *UnknownSet `protobuf:"bytes,3,opt,name=unknown,proto3,oneof"`
+}
+
+func (*ExprValue_Value) isExprValue_Kind() {}
+
+func (*ExprValue_Error) isExprValue_Kind() {}
+
+func (*ExprValue_Unknown) isExprValue_Kind() {}
+
+type ErrorSet struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Errors []*status.Status `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"`
+}
+
+func (x *ErrorSet) Reset() {
+ *x = ErrorSet{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_eval_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ErrorSet) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ErrorSet) ProtoMessage() {}
+
+func (x *ErrorSet) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_eval_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ErrorSet.ProtoReflect.Descriptor instead.
+func (*ErrorSet) Descriptor() ([]byte, []int) {
+ return file_cel_expr_eval_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ErrorSet) GetErrors() []*status.Status {
+ if x != nil {
+ return x.Errors
+ }
+ return nil
+}
+
+type UnknownSet struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Exprs []int64 `protobuf:"varint,1,rep,packed,name=exprs,proto3" json:"exprs,omitempty"`
+}
+
+func (x *UnknownSet) Reset() {
+ *x = UnknownSet{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_eval_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *UnknownSet) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnknownSet) ProtoMessage() {}
+
+func (x *UnknownSet) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_eval_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use UnknownSet.ProtoReflect.Descriptor instead.
+func (*UnknownSet) Descriptor() ([]byte, []int) {
+ return file_cel_expr_eval_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *UnknownSet) GetExprs() []int64 {
+ if x != nil {
+ return x.Exprs
+ }
+ return nil
+}
+
+type EvalState_Result struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Expr int64 `protobuf:"varint,1,opt,name=expr,proto3" json:"expr,omitempty"`
+ Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *EvalState_Result) Reset() {
+ *x = EvalState_Result{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_eval_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EvalState_Result) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EvalState_Result) ProtoMessage() {}
+
+func (x *EvalState_Result) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_eval_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EvalState_Result.ProtoReflect.Descriptor instead.
+func (*EvalState_Result) Descriptor() ([]byte, []int) {
+ return file_cel_expr_eval_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *EvalState_Result) GetExpr() int64 {
+ if x != nil {
+ return x.Expr
+ }
+ return 0
+}
+
+func (x *EvalState_Result) GetValue() int64 {
+ if x != nil {
+ return x.Value
+ }
+ return 0
+}
+
+var File_cel_expr_eval_proto protoreflect.FileDescriptor
+
+var file_cel_expr_eval_proto_rawDesc = []byte{
+ 0x0a, 0x13, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x65, 0x76, 0x61, 0x6c, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x1a,
+ 0x14, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70,
+ 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2,
+ 0x01, 0x0a, 0x09, 0x45, 0x76, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x06,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63,
+ 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x72, 0x65, 0x73,
+ 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x65, 0x6c,
+ 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e,
+ 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a,
+ 0x32, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x78, 0x70,
+ 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x65, 0x78, 0x70, 0x72, 0x12, 0x14, 0x0a,
+ 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x09, 0x45, 0x78, 0x70, 0x72, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x72,
+ 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e,
+ 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52,
+ 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77,
+ 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78,
+ 0x70, 0x72, 0x2e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52,
+ 0x07, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64,
+ 0x22, 0x36, 0x0a, 0x08, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x06,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+ 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x22, 0x0a, 0x0a, 0x55, 0x6e, 0x6b, 0x6e,
+ 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x70, 0x72, 0x73, 0x18,
+ 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x05, 0x65, 0x78, 0x70, 0x72, 0x73, 0x42, 0x2c, 0x0a, 0x0c,
+ 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x09, 0x45, 0x76,
+ 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64,
+ 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x33,
+}
+
+var (
+ file_cel_expr_eval_proto_rawDescOnce sync.Once
+ file_cel_expr_eval_proto_rawDescData = file_cel_expr_eval_proto_rawDesc
+)
+
+func file_cel_expr_eval_proto_rawDescGZIP() []byte {
+ file_cel_expr_eval_proto_rawDescOnce.Do(func() {
+ file_cel_expr_eval_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_eval_proto_rawDescData)
+ })
+ return file_cel_expr_eval_proto_rawDescData
+}
+
+var file_cel_expr_eval_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_cel_expr_eval_proto_goTypes = []interface{}{
+ (*EvalState)(nil), // 0: cel.expr.EvalState
+ (*ExprValue)(nil), // 1: cel.expr.ExprValue
+ (*ErrorSet)(nil), // 2: cel.expr.ErrorSet
+ (*UnknownSet)(nil), // 3: cel.expr.UnknownSet
+ (*EvalState_Result)(nil), // 4: cel.expr.EvalState.Result
+ (*Value)(nil), // 5: cel.expr.Value
+ (*status.Status)(nil), // 6: google.rpc.Status
+}
+var file_cel_expr_eval_proto_depIdxs = []int32{
+ 1, // 0: cel.expr.EvalState.values:type_name -> cel.expr.ExprValue
+ 4, // 1: cel.expr.EvalState.results:type_name -> cel.expr.EvalState.Result
+ 5, // 2: cel.expr.ExprValue.value:type_name -> cel.expr.Value
+ 2, // 3: cel.expr.ExprValue.error:type_name -> cel.expr.ErrorSet
+ 3, // 4: cel.expr.ExprValue.unknown:type_name -> cel.expr.UnknownSet
+ 6, // 5: cel.expr.ErrorSet.errors:type_name -> google.rpc.Status
+ 6, // [6:6] is the sub-list for method output_type
+ 6, // [6:6] is the sub-list for method input_type
+ 6, // [6:6] is the sub-list for extension type_name
+ 6, // [6:6] is the sub-list for extension extendee
+ 0, // [0:6] is the sub-list for field type_name
+}
+
+func init() { file_cel_expr_eval_proto_init() }
+func file_cel_expr_eval_proto_init() {
+ if File_cel_expr_eval_proto != nil {
+ return
+ }
+ file_cel_expr_value_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_cel_expr_eval_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EvalState); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_eval_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ExprValue); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_eval_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ErrorSet); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_eval_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*UnknownSet); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_eval_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EvalState_Result); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ file_cel_expr_eval_proto_msgTypes[1].OneofWrappers = []interface{}{
+ (*ExprValue_Value)(nil),
+ (*ExprValue_Error)(nil),
+ (*ExprValue_Unknown)(nil),
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_cel_expr_eval_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 5,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_cel_expr_eval_proto_goTypes,
+ DependencyIndexes: file_cel_expr_eval_proto_depIdxs,
+ MessageInfos: file_cel_expr_eval_proto_msgTypes,
+ }.Build()
+ File_cel_expr_eval_proto = out.File
+ file_cel_expr_eval_proto_rawDesc = nil
+ file_cel_expr_eval_proto_goTypes = nil
+ file_cel_expr_eval_proto_depIdxs = nil
+}
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/explain.pb.go b/.gear/predownloaded-development/vendor/cel.dev/expr/explain.pb.go
new file mode 100644
index 0000000..79fd544
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/explain.pb.go
@@ -0,0 +1,236 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc v3.21.5
+// source: cel/expr/explain.proto
+
+package expr
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// Deprecated: Do not use.
+type Explain struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"`
+ ExprSteps []*Explain_ExprStep `protobuf:"bytes,2,rep,name=expr_steps,json=exprSteps,proto3" json:"expr_steps,omitempty"`
+}
+
+func (x *Explain) Reset() {
+ *x = Explain{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_explain_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Explain) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Explain) ProtoMessage() {}
+
+func (x *Explain) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_explain_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Explain.ProtoReflect.Descriptor instead.
+func (*Explain) Descriptor() ([]byte, []int) {
+ return file_cel_expr_explain_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *Explain) GetValues() []*Value {
+ if x != nil {
+ return x.Values
+ }
+ return nil
+}
+
+func (x *Explain) GetExprSteps() []*Explain_ExprStep {
+ if x != nil {
+ return x.ExprSteps
+ }
+ return nil
+}
+
+type Explain_ExprStep struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
+ ValueIndex int32 `protobuf:"varint,2,opt,name=value_index,json=valueIndex,proto3" json:"value_index,omitempty"`
+}
+
+func (x *Explain_ExprStep) Reset() {
+ *x = Explain_ExprStep{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_explain_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Explain_ExprStep) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Explain_ExprStep) ProtoMessage() {}
+
+func (x *Explain_ExprStep) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_explain_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Explain_ExprStep.ProtoReflect.Descriptor instead.
+func (*Explain_ExprStep) Descriptor() ([]byte, []int) {
+ return file_cel_expr_explain_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (x *Explain_ExprStep) GetId() int64 {
+ if x != nil {
+ return x.Id
+ }
+ return 0
+}
+
+func (x *Explain_ExprStep) GetValueIndex() int32 {
+ if x != nil {
+ return x.ValueIndex
+ }
+ return 0
+}
+
+var File_cel_expr_explain_proto protoreflect.FileDescriptor
+
+var file_cel_expr_explain_proto_rawDesc = []byte{
+ 0x0a, 0x16, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x65, 0x78, 0x70, 0x6c, 0x61,
+ 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78,
+ 0x70, 0x72, 0x1a, 0x14, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xae, 0x01, 0x0a, 0x07, 0x45, 0x78, 0x70,
+ 0x6c, 0x61, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,
+ 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x39, 0x0a,
+ 0x0a, 0x65, 0x78, 0x70, 0x72, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28,
+ 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70,
+ 0x6c, 0x61, 0x69, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x53, 0x74, 0x65, 0x70, 0x52, 0x09, 0x65,
+ 0x78, 0x70, 0x72, 0x53, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x08, 0x45, 0x78, 0x70, 0x72,
+ 0x53, 0x74, 0x65, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
+ 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x6e,
+ 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x49, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x2f, 0x0a, 0x0c, 0x64, 0x65, 0x76,
+ 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x0c, 0x45, 0x78, 0x70, 0x6c, 0x61,
+ 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64,
+ 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x33,
+}
+
+var (
+ file_cel_expr_explain_proto_rawDescOnce sync.Once
+ file_cel_expr_explain_proto_rawDescData = file_cel_expr_explain_proto_rawDesc
+)
+
+func file_cel_expr_explain_proto_rawDescGZIP() []byte {
+ file_cel_expr_explain_proto_rawDescOnce.Do(func() {
+ file_cel_expr_explain_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_explain_proto_rawDescData)
+ })
+ return file_cel_expr_explain_proto_rawDescData
+}
+
+var file_cel_expr_explain_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_cel_expr_explain_proto_goTypes = []interface{}{
+ (*Explain)(nil), // 0: cel.expr.Explain
+ (*Explain_ExprStep)(nil), // 1: cel.expr.Explain.ExprStep
+ (*Value)(nil), // 2: cel.expr.Value
+}
+var file_cel_expr_explain_proto_depIdxs = []int32{
+ 2, // 0: cel.expr.Explain.values:type_name -> cel.expr.Value
+ 1, // 1: cel.expr.Explain.expr_steps:type_name -> cel.expr.Explain.ExprStep
+ 2, // [2:2] is the sub-list for method output_type
+ 2, // [2:2] is the sub-list for method input_type
+ 2, // [2:2] is the sub-list for extension type_name
+ 2, // [2:2] is the sub-list for extension extendee
+ 0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_cel_expr_explain_proto_init() }
+func file_cel_expr_explain_proto_init() {
+ if File_cel_expr_explain_proto != nil {
+ return
+ }
+ file_cel_expr_value_proto_init()
+ if !protoimpl.UnsafeEnabled {
+ file_cel_expr_explain_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Explain); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_explain_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Explain_ExprStep); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_cel_expr_explain_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_cel_expr_explain_proto_goTypes,
+ DependencyIndexes: file_cel_expr_explain_proto_depIdxs,
+ MessageInfos: file_cel_expr_explain_proto_msgTypes,
+ }.Build()
+ File_cel_expr_explain_proto = out.File
+ file_cel_expr_explain_proto_rawDesc = nil
+ file_cel_expr_explain_proto_goTypes = nil
+ file_cel_expr_explain_proto_depIdxs = nil
+}
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/regen_go_proto.sh b/.gear/predownloaded-development/vendor/cel.dev/expr/regen_go_proto.sh
new file mode 100644
index 0000000..fdcbb3c
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/regen_go_proto.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+bazel build //proto/cel/expr/conformance/...
+files=($(bazel aquery 'kind(proto, //proto/cel/expr/conformance/...)' | grep Outputs | grep "[.]pb[.]go" | sed 's/Outputs: \[//' | sed 's/\]//' | tr "," "\n"))
+for src in ${files[@]};
+do
+ dst=$(echo $src | sed 's/\(.*\/cel.dev\/expr\/\(.*\)\)/\2/')
+ echo "copying $dst"
+ $(cp $src $dst)
+done
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/regen_go_proto_canonical_protos.sh b/.gear/predownloaded-development/vendor/cel.dev/expr/regen_go_proto_canonical_protos.sh
new file mode 100644
index 0000000..9a13479
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/regen_go_proto_canonical_protos.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+bazel build //proto/cel/expr:all
+
+rm -vf ./*.pb.go
+
+files=( $(bazel cquery //proto/cel/expr:expr_go_proto --output=starlark --starlark:expr="'\n'.join([f.path for f in target.output_groups.go_generated_srcs.to_list()])") )
+for src in "${files[@]}";
+do
+ cp -v "${src}" ./
+done
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/syntax.pb.go b/.gear/predownloaded-development/vendor/cel.dev/expr/syntax.pb.go
new file mode 100644
index 0000000..48a9528
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/syntax.pb.go
@@ -0,0 +1,1633 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc v3.21.5
+// source: cel/expr/syntax.proto
+
+package expr
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ durationpb "google.golang.org/protobuf/types/known/durationpb"
+ structpb "google.golang.org/protobuf/types/known/structpb"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type SourceInfo_Extension_Component int32
+
+const (
+ SourceInfo_Extension_COMPONENT_UNSPECIFIED SourceInfo_Extension_Component = 0
+ SourceInfo_Extension_COMPONENT_PARSER SourceInfo_Extension_Component = 1
+ SourceInfo_Extension_COMPONENT_TYPE_CHECKER SourceInfo_Extension_Component = 2
+ SourceInfo_Extension_COMPONENT_RUNTIME SourceInfo_Extension_Component = 3
+)
+
+// Enum value maps for SourceInfo_Extension_Component.
+var (
+ SourceInfo_Extension_Component_name = map[int32]string{
+ 0: "COMPONENT_UNSPECIFIED",
+ 1: "COMPONENT_PARSER",
+ 2: "COMPONENT_TYPE_CHECKER",
+ 3: "COMPONENT_RUNTIME",
+ }
+ SourceInfo_Extension_Component_value = map[string]int32{
+ "COMPONENT_UNSPECIFIED": 0,
+ "COMPONENT_PARSER": 1,
+ "COMPONENT_TYPE_CHECKER": 2,
+ "COMPONENT_RUNTIME": 3,
+ }
+)
+
+func (x SourceInfo_Extension_Component) Enum() *SourceInfo_Extension_Component {
+ p := new(SourceInfo_Extension_Component)
+ *p = x
+ return p
+}
+
+func (x SourceInfo_Extension_Component) String() string {
+ return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (SourceInfo_Extension_Component) Descriptor() protoreflect.EnumDescriptor {
+ return file_cel_expr_syntax_proto_enumTypes[0].Descriptor()
+}
+
+func (SourceInfo_Extension_Component) Type() protoreflect.EnumType {
+ return &file_cel_expr_syntax_proto_enumTypes[0]
+}
+
+func (x SourceInfo_Extension_Component) Number() protoreflect.EnumNumber {
+ return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use SourceInfo_Extension_Component.Descriptor instead.
+func (SourceInfo_Extension_Component) EnumDescriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2, 0}
+}
+
+type ParsedExpr struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Expr *Expr `protobuf:"bytes,2,opt,name=expr,proto3" json:"expr,omitempty"`
+ SourceInfo *SourceInfo `protobuf:"bytes,3,opt,name=source_info,json=sourceInfo,proto3" json:"source_info,omitempty"`
+}
+
+func (x *ParsedExpr) Reset() {
+ *x = ParsedExpr{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ParsedExpr) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ParsedExpr) ProtoMessage() {}
+
+func (x *ParsedExpr) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ParsedExpr.ProtoReflect.Descriptor instead.
+func (*ParsedExpr) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ParsedExpr) GetExpr() *Expr {
+ if x != nil {
+ return x.Expr
+ }
+ return nil
+}
+
+func (x *ParsedExpr) GetSourceInfo() *SourceInfo {
+ if x != nil {
+ return x.SourceInfo
+ }
+ return nil
+}
+
+type Expr struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id int64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"`
+ // Types that are assignable to ExprKind:
+ //
+ // *Expr_ConstExpr
+ // *Expr_IdentExpr
+ // *Expr_SelectExpr
+ // *Expr_CallExpr
+ // *Expr_ListExpr
+ // *Expr_StructExpr
+ // *Expr_ComprehensionExpr
+ ExprKind isExpr_ExprKind `protobuf_oneof:"expr_kind"`
+}
+
+func (x *Expr) Reset() {
+ *x = Expr{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Expr) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Expr) ProtoMessage() {}
+
+func (x *Expr) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Expr.ProtoReflect.Descriptor instead.
+func (*Expr) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *Expr) GetId() int64 {
+ if x != nil {
+ return x.Id
+ }
+ return 0
+}
+
+func (m *Expr) GetExprKind() isExpr_ExprKind {
+ if m != nil {
+ return m.ExprKind
+ }
+ return nil
+}
+
+func (x *Expr) GetConstExpr() *Constant {
+ if x, ok := x.GetExprKind().(*Expr_ConstExpr); ok {
+ return x.ConstExpr
+ }
+ return nil
+}
+
+func (x *Expr) GetIdentExpr() *Expr_Ident {
+ if x, ok := x.GetExprKind().(*Expr_IdentExpr); ok {
+ return x.IdentExpr
+ }
+ return nil
+}
+
+func (x *Expr) GetSelectExpr() *Expr_Select {
+ if x, ok := x.GetExprKind().(*Expr_SelectExpr); ok {
+ return x.SelectExpr
+ }
+ return nil
+}
+
+func (x *Expr) GetCallExpr() *Expr_Call {
+ if x, ok := x.GetExprKind().(*Expr_CallExpr); ok {
+ return x.CallExpr
+ }
+ return nil
+}
+
+func (x *Expr) GetListExpr() *Expr_CreateList {
+ if x, ok := x.GetExprKind().(*Expr_ListExpr); ok {
+ return x.ListExpr
+ }
+ return nil
+}
+
+func (x *Expr) GetStructExpr() *Expr_CreateStruct {
+ if x, ok := x.GetExprKind().(*Expr_StructExpr); ok {
+ return x.StructExpr
+ }
+ return nil
+}
+
+func (x *Expr) GetComprehensionExpr() *Expr_Comprehension {
+ if x, ok := x.GetExprKind().(*Expr_ComprehensionExpr); ok {
+ return x.ComprehensionExpr
+ }
+ return nil
+}
+
+type isExpr_ExprKind interface {
+ isExpr_ExprKind()
+}
+
+type Expr_ConstExpr struct {
+ ConstExpr *Constant `protobuf:"bytes,3,opt,name=const_expr,json=constExpr,proto3,oneof"`
+}
+
+type Expr_IdentExpr struct {
+ IdentExpr *Expr_Ident `protobuf:"bytes,4,opt,name=ident_expr,json=identExpr,proto3,oneof"`
+}
+
+type Expr_SelectExpr struct {
+ SelectExpr *Expr_Select `protobuf:"bytes,5,opt,name=select_expr,json=selectExpr,proto3,oneof"`
+}
+
+type Expr_CallExpr struct {
+ CallExpr *Expr_Call `protobuf:"bytes,6,opt,name=call_expr,json=callExpr,proto3,oneof"`
+}
+
+type Expr_ListExpr struct {
+ ListExpr *Expr_CreateList `protobuf:"bytes,7,opt,name=list_expr,json=listExpr,proto3,oneof"`
+}
+
+type Expr_StructExpr struct {
+ StructExpr *Expr_CreateStruct `protobuf:"bytes,8,opt,name=struct_expr,json=structExpr,proto3,oneof"`
+}
+
+type Expr_ComprehensionExpr struct {
+ ComprehensionExpr *Expr_Comprehension `protobuf:"bytes,9,opt,name=comprehension_expr,json=comprehensionExpr,proto3,oneof"`
+}
+
+func (*Expr_ConstExpr) isExpr_ExprKind() {}
+
+func (*Expr_IdentExpr) isExpr_ExprKind() {}
+
+func (*Expr_SelectExpr) isExpr_ExprKind() {}
+
+func (*Expr_CallExpr) isExpr_ExprKind() {}
+
+func (*Expr_ListExpr) isExpr_ExprKind() {}
+
+func (*Expr_StructExpr) isExpr_ExprKind() {}
+
+func (*Expr_ComprehensionExpr) isExpr_ExprKind() {}
+
+type Constant struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Types that are assignable to ConstantKind:
+ //
+ // *Constant_NullValue
+ // *Constant_BoolValue
+ // *Constant_Int64Value
+ // *Constant_Uint64Value
+ // *Constant_DoubleValue
+ // *Constant_StringValue
+ // *Constant_BytesValue
+ // *Constant_DurationValue
+ // *Constant_TimestampValue
+ ConstantKind isConstant_ConstantKind `protobuf_oneof:"constant_kind"`
+}
+
+func (x *Constant) Reset() {
+ *x = Constant{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Constant) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Constant) ProtoMessage() {}
+
+func (x *Constant) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Constant.ProtoReflect.Descriptor instead.
+func (*Constant) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{2}
+}
+
+func (m *Constant) GetConstantKind() isConstant_ConstantKind {
+ if m != nil {
+ return m.ConstantKind
+ }
+ return nil
+}
+
+func (x *Constant) GetNullValue() structpb.NullValue {
+ if x, ok := x.GetConstantKind().(*Constant_NullValue); ok {
+ return x.NullValue
+ }
+ return structpb.NullValue(0)
+}
+
+func (x *Constant) GetBoolValue() bool {
+ if x, ok := x.GetConstantKind().(*Constant_BoolValue); ok {
+ return x.BoolValue
+ }
+ return false
+}
+
+func (x *Constant) GetInt64Value() int64 {
+ if x, ok := x.GetConstantKind().(*Constant_Int64Value); ok {
+ return x.Int64Value
+ }
+ return 0
+}
+
+func (x *Constant) GetUint64Value() uint64 {
+ if x, ok := x.GetConstantKind().(*Constant_Uint64Value); ok {
+ return x.Uint64Value
+ }
+ return 0
+}
+
+func (x *Constant) GetDoubleValue() float64 {
+ if x, ok := x.GetConstantKind().(*Constant_DoubleValue); ok {
+ return x.DoubleValue
+ }
+ return 0
+}
+
+func (x *Constant) GetStringValue() string {
+ if x, ok := x.GetConstantKind().(*Constant_StringValue); ok {
+ return x.StringValue
+ }
+ return ""
+}
+
+func (x *Constant) GetBytesValue() []byte {
+ if x, ok := x.GetConstantKind().(*Constant_BytesValue); ok {
+ return x.BytesValue
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *Constant) GetDurationValue() *durationpb.Duration {
+ if x, ok := x.GetConstantKind().(*Constant_DurationValue); ok {
+ return x.DurationValue
+ }
+ return nil
+}
+
+// Deprecated: Do not use.
+func (x *Constant) GetTimestampValue() *timestamppb.Timestamp {
+ if x, ok := x.GetConstantKind().(*Constant_TimestampValue); ok {
+ return x.TimestampValue
+ }
+ return nil
+}
+
+type isConstant_ConstantKind interface {
+ isConstant_ConstantKind()
+}
+
+type Constant_NullValue struct {
+ NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"`
+}
+
+type Constant_BoolValue struct {
+ BoolValue bool `protobuf:"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof"`
+}
+
+type Constant_Int64Value struct {
+ Int64Value int64 `protobuf:"varint,3,opt,name=int64_value,json=int64Value,proto3,oneof"`
+}
+
+type Constant_Uint64Value struct {
+ Uint64Value uint64 `protobuf:"varint,4,opt,name=uint64_value,json=uint64Value,proto3,oneof"`
+}
+
+type Constant_DoubleValue struct {
+ DoubleValue float64 `protobuf:"fixed64,5,opt,name=double_value,json=doubleValue,proto3,oneof"`
+}
+
+type Constant_StringValue struct {
+ StringValue string `protobuf:"bytes,6,opt,name=string_value,json=stringValue,proto3,oneof"`
+}
+
+type Constant_BytesValue struct {
+ BytesValue []byte `protobuf:"bytes,7,opt,name=bytes_value,json=bytesValue,proto3,oneof"`
+}
+
+type Constant_DurationValue struct {
+ // Deprecated: Do not use.
+ DurationValue *durationpb.Duration `protobuf:"bytes,8,opt,name=duration_value,json=durationValue,proto3,oneof"`
+}
+
+type Constant_TimestampValue struct {
+ // Deprecated: Do not use.
+ TimestampValue *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=timestamp_value,json=timestampValue,proto3,oneof"`
+}
+
+func (*Constant_NullValue) isConstant_ConstantKind() {}
+
+func (*Constant_BoolValue) isConstant_ConstantKind() {}
+
+func (*Constant_Int64Value) isConstant_ConstantKind() {}
+
+func (*Constant_Uint64Value) isConstant_ConstantKind() {}
+
+func (*Constant_DoubleValue) isConstant_ConstantKind() {}
+
+func (*Constant_StringValue) isConstant_ConstantKind() {}
+
+func (*Constant_BytesValue) isConstant_ConstantKind() {}
+
+func (*Constant_DurationValue) isConstant_ConstantKind() {}
+
+func (*Constant_TimestampValue) isConstant_ConstantKind() {}
+
+type SourceInfo struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ SyntaxVersion string `protobuf:"bytes,1,opt,name=syntax_version,json=syntaxVersion,proto3" json:"syntax_version,omitempty"`
+ Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"`
+ LineOffsets []int32 `protobuf:"varint,3,rep,packed,name=line_offsets,json=lineOffsets,proto3" json:"line_offsets,omitempty"`
+ Positions map[int64]int32 `protobuf:"bytes,4,rep,name=positions,proto3" json:"positions,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
+ MacroCalls map[int64]*Expr `protobuf:"bytes,5,rep,name=macro_calls,json=macroCalls,proto3" json:"macro_calls,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ Extensions []*SourceInfo_Extension `protobuf:"bytes,6,rep,name=extensions,proto3" json:"extensions,omitempty"`
+}
+
+func (x *SourceInfo) Reset() {
+ *x = SourceInfo{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SourceInfo) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SourceInfo) ProtoMessage() {}
+
+func (x *SourceInfo) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SourceInfo.ProtoReflect.Descriptor instead.
+func (*SourceInfo) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *SourceInfo) GetSyntaxVersion() string {
+ if x != nil {
+ return x.SyntaxVersion
+ }
+ return ""
+}
+
+func (x *SourceInfo) GetLocation() string {
+ if x != nil {
+ return x.Location
+ }
+ return ""
+}
+
+func (x *SourceInfo) GetLineOffsets() []int32 {
+ if x != nil {
+ return x.LineOffsets
+ }
+ return nil
+}
+
+func (x *SourceInfo) GetPositions() map[int64]int32 {
+ if x != nil {
+ return x.Positions
+ }
+ return nil
+}
+
+func (x *SourceInfo) GetMacroCalls() map[int64]*Expr {
+ if x != nil {
+ return x.MacroCalls
+ }
+ return nil
+}
+
+func (x *SourceInfo) GetExtensions() []*SourceInfo_Extension {
+ if x != nil {
+ return x.Extensions
+ }
+ return nil
+}
+
+type Expr_Ident struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *Expr_Ident) Reset() {
+ *x = Expr_Ident{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Expr_Ident) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Expr_Ident) ProtoMessage() {}
+
+func (x *Expr_Ident) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Expr_Ident.ProtoReflect.Descriptor instead.
+func (*Expr_Ident) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 0}
+}
+
+func (x *Expr_Ident) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+type Expr_Select struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Operand *Expr `protobuf:"bytes,1,opt,name=operand,proto3" json:"operand,omitempty"`
+ Field string `protobuf:"bytes,2,opt,name=field,proto3" json:"field,omitempty"`
+ TestOnly bool `protobuf:"varint,3,opt,name=test_only,json=testOnly,proto3" json:"test_only,omitempty"`
+}
+
+func (x *Expr_Select) Reset() {
+ *x = Expr_Select{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Expr_Select) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Expr_Select) ProtoMessage() {}
+
+func (x *Expr_Select) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Expr_Select.ProtoReflect.Descriptor instead.
+func (*Expr_Select) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 1}
+}
+
+func (x *Expr_Select) GetOperand() *Expr {
+ if x != nil {
+ return x.Operand
+ }
+ return nil
+}
+
+func (x *Expr_Select) GetField() string {
+ if x != nil {
+ return x.Field
+ }
+ return ""
+}
+
+func (x *Expr_Select) GetTestOnly() bool {
+ if x != nil {
+ return x.TestOnly
+ }
+ return false
+}
+
+type Expr_Call struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Target *Expr `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"`
+ Function string `protobuf:"bytes,2,opt,name=function,proto3" json:"function,omitempty"`
+ Args []*Expr `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty"`
+}
+
+func (x *Expr_Call) Reset() {
+ *x = Expr_Call{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[6]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Expr_Call) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Expr_Call) ProtoMessage() {}
+
+func (x *Expr_Call) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[6]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Expr_Call.ProtoReflect.Descriptor instead.
+func (*Expr_Call) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 2}
+}
+
+func (x *Expr_Call) GetTarget() *Expr {
+ if x != nil {
+ return x.Target
+ }
+ return nil
+}
+
+func (x *Expr_Call) GetFunction() string {
+ if x != nil {
+ return x.Function
+ }
+ return ""
+}
+
+func (x *Expr_Call) GetArgs() []*Expr {
+ if x != nil {
+ return x.Args
+ }
+ return nil
+}
+
+type Expr_CreateList struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Elements []*Expr `protobuf:"bytes,1,rep,name=elements,proto3" json:"elements,omitempty"`
+ OptionalIndices []int32 `protobuf:"varint,2,rep,packed,name=optional_indices,json=optionalIndices,proto3" json:"optional_indices,omitempty"`
+}
+
+func (x *Expr_CreateList) Reset() {
+ *x = Expr_CreateList{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[7]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Expr_CreateList) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Expr_CreateList) ProtoMessage() {}
+
+func (x *Expr_CreateList) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[7]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Expr_CreateList.ProtoReflect.Descriptor instead.
+func (*Expr_CreateList) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 3}
+}
+
+func (x *Expr_CreateList) GetElements() []*Expr {
+ if x != nil {
+ return x.Elements
+ }
+ return nil
+}
+
+func (x *Expr_CreateList) GetOptionalIndices() []int32 {
+ if x != nil {
+ return x.OptionalIndices
+ }
+ return nil
+}
+
+type Expr_CreateStruct struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ MessageName string `protobuf:"bytes,1,opt,name=message_name,json=messageName,proto3" json:"message_name,omitempty"`
+ Entries []*Expr_CreateStruct_Entry `protobuf:"bytes,2,rep,name=entries,proto3" json:"entries,omitempty"`
+}
+
+func (x *Expr_CreateStruct) Reset() {
+ *x = Expr_CreateStruct{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[8]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Expr_CreateStruct) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Expr_CreateStruct) ProtoMessage() {}
+
+func (x *Expr_CreateStruct) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[8]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Expr_CreateStruct.ProtoReflect.Descriptor instead.
+func (*Expr_CreateStruct) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 4}
+}
+
+func (x *Expr_CreateStruct) GetMessageName() string {
+ if x != nil {
+ return x.MessageName
+ }
+ return ""
+}
+
+func (x *Expr_CreateStruct) GetEntries() []*Expr_CreateStruct_Entry {
+ if x != nil {
+ return x.Entries
+ }
+ return nil
+}
+
+type Expr_Comprehension struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ IterVar string `protobuf:"bytes,1,opt,name=iter_var,json=iterVar,proto3" json:"iter_var,omitempty"`
+ IterRange *Expr `protobuf:"bytes,2,opt,name=iter_range,json=iterRange,proto3" json:"iter_range,omitempty"`
+ AccuVar string `protobuf:"bytes,3,opt,name=accu_var,json=accuVar,proto3" json:"accu_var,omitempty"`
+ AccuInit *Expr `protobuf:"bytes,4,opt,name=accu_init,json=accuInit,proto3" json:"accu_init,omitempty"`
+ LoopCondition *Expr `protobuf:"bytes,5,opt,name=loop_condition,json=loopCondition,proto3" json:"loop_condition,omitempty"`
+ LoopStep *Expr `protobuf:"bytes,6,opt,name=loop_step,json=loopStep,proto3" json:"loop_step,omitempty"`
+ Result *Expr `protobuf:"bytes,7,opt,name=result,proto3" json:"result,omitempty"`
+}
+
+func (x *Expr_Comprehension) Reset() {
+ *x = Expr_Comprehension{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[9]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Expr_Comprehension) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Expr_Comprehension) ProtoMessage() {}
+
+func (x *Expr_Comprehension) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[9]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Expr_Comprehension.ProtoReflect.Descriptor instead.
+func (*Expr_Comprehension) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 5}
+}
+
+func (x *Expr_Comprehension) GetIterVar() string {
+ if x != nil {
+ return x.IterVar
+ }
+ return ""
+}
+
+func (x *Expr_Comprehension) GetIterRange() *Expr {
+ if x != nil {
+ return x.IterRange
+ }
+ return nil
+}
+
+func (x *Expr_Comprehension) GetAccuVar() string {
+ if x != nil {
+ return x.AccuVar
+ }
+ return ""
+}
+
+func (x *Expr_Comprehension) GetAccuInit() *Expr {
+ if x != nil {
+ return x.AccuInit
+ }
+ return nil
+}
+
+func (x *Expr_Comprehension) GetLoopCondition() *Expr {
+ if x != nil {
+ return x.LoopCondition
+ }
+ return nil
+}
+
+func (x *Expr_Comprehension) GetLoopStep() *Expr {
+ if x != nil {
+ return x.LoopStep
+ }
+ return nil
+}
+
+func (x *Expr_Comprehension) GetResult() *Expr {
+ if x != nil {
+ return x.Result
+ }
+ return nil
+}
+
+type Expr_CreateStruct_Entry struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
+ // Types that are assignable to KeyKind:
+ //
+ // *Expr_CreateStruct_Entry_FieldKey
+ // *Expr_CreateStruct_Entry_MapKey
+ KeyKind isExpr_CreateStruct_Entry_KeyKind `protobuf_oneof:"key_kind"`
+ Value *Expr `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
+ OptionalEntry bool `protobuf:"varint,5,opt,name=optional_entry,json=optionalEntry,proto3" json:"optional_entry,omitempty"`
+}
+
+func (x *Expr_CreateStruct_Entry) Reset() {
+ *x = Expr_CreateStruct_Entry{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[10]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Expr_CreateStruct_Entry) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Expr_CreateStruct_Entry) ProtoMessage() {}
+
+func (x *Expr_CreateStruct_Entry) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[10]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Expr_CreateStruct_Entry.ProtoReflect.Descriptor instead.
+func (*Expr_CreateStruct_Entry) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{1, 4, 0}
+}
+
+func (x *Expr_CreateStruct_Entry) GetId() int64 {
+ if x != nil {
+ return x.Id
+ }
+ return 0
+}
+
+func (m *Expr_CreateStruct_Entry) GetKeyKind() isExpr_CreateStruct_Entry_KeyKind {
+ if m != nil {
+ return m.KeyKind
+ }
+ return nil
+}
+
+func (x *Expr_CreateStruct_Entry) GetFieldKey() string {
+ if x, ok := x.GetKeyKind().(*Expr_CreateStruct_Entry_FieldKey); ok {
+ return x.FieldKey
+ }
+ return ""
+}
+
+func (x *Expr_CreateStruct_Entry) GetMapKey() *Expr {
+ if x, ok := x.GetKeyKind().(*Expr_CreateStruct_Entry_MapKey); ok {
+ return x.MapKey
+ }
+ return nil
+}
+
+func (x *Expr_CreateStruct_Entry) GetValue() *Expr {
+ if x != nil {
+ return x.Value
+ }
+ return nil
+}
+
+func (x *Expr_CreateStruct_Entry) GetOptionalEntry() bool {
+ if x != nil {
+ return x.OptionalEntry
+ }
+ return false
+}
+
+type isExpr_CreateStruct_Entry_KeyKind interface {
+ isExpr_CreateStruct_Entry_KeyKind()
+}
+
+type Expr_CreateStruct_Entry_FieldKey struct {
+ FieldKey string `protobuf:"bytes,2,opt,name=field_key,json=fieldKey,proto3,oneof"`
+}
+
+type Expr_CreateStruct_Entry_MapKey struct {
+ MapKey *Expr `protobuf:"bytes,3,opt,name=map_key,json=mapKey,proto3,oneof"`
+}
+
+func (*Expr_CreateStruct_Entry_FieldKey) isExpr_CreateStruct_Entry_KeyKind() {}
+
+func (*Expr_CreateStruct_Entry_MapKey) isExpr_CreateStruct_Entry_KeyKind() {}
+
+type SourceInfo_Extension struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ AffectedComponents []SourceInfo_Extension_Component `protobuf:"varint,2,rep,packed,name=affected_components,json=affectedComponents,proto3,enum=cel.expr.SourceInfo_Extension_Component" json:"affected_components,omitempty"`
+ Version *SourceInfo_Extension_Version `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
+}
+
+func (x *SourceInfo_Extension) Reset() {
+ *x = SourceInfo_Extension{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[13]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SourceInfo_Extension) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SourceInfo_Extension) ProtoMessage() {}
+
+func (x *SourceInfo_Extension) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[13]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SourceInfo_Extension.ProtoReflect.Descriptor instead.
+func (*SourceInfo_Extension) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2}
+}
+
+func (x *SourceInfo_Extension) GetId() string {
+ if x != nil {
+ return x.Id
+ }
+ return ""
+}
+
+func (x *SourceInfo_Extension) GetAffectedComponents() []SourceInfo_Extension_Component {
+ if x != nil {
+ return x.AffectedComponents
+ }
+ return nil
+}
+
+func (x *SourceInfo_Extension) GetVersion() *SourceInfo_Extension_Version {
+ if x != nil {
+ return x.Version
+ }
+ return nil
+}
+
+type SourceInfo_Extension_Version struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Major int64 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
+ Minor int64 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
+}
+
+func (x *SourceInfo_Extension_Version) Reset() {
+ *x = SourceInfo_Extension_Version{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_syntax_proto_msgTypes[14]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SourceInfo_Extension_Version) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SourceInfo_Extension_Version) ProtoMessage() {}
+
+func (x *SourceInfo_Extension_Version) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_syntax_proto_msgTypes[14]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SourceInfo_Extension_Version.ProtoReflect.Descriptor instead.
+func (*SourceInfo_Extension_Version) Descriptor() ([]byte, []int) {
+ return file_cel_expr_syntax_proto_rawDescGZIP(), []int{3, 2, 0}
+}
+
+func (x *SourceInfo_Extension_Version) GetMajor() int64 {
+ if x != nil {
+ return x.Major
+ }
+ return 0
+}
+
+func (x *SourceInfo_Extension_Version) GetMinor() int64 {
+ if x != nil {
+ return x.Minor
+ }
+ return 0
+}
+
+var File_cel_expr_syntax_proto protoreflect.FileDescriptor
+
+var file_cel_expr_syntax_proto_rawDesc = []byte{
+ 0x0a, 0x15, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x73, 0x79, 0x6e, 0x74, 0x61,
+ 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,
+ 0x72, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+ 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+ 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
+ 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
+ 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x22, 0x67, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x73, 0x65, 0x64, 0x45, 0x78, 0x70, 0x72, 0x12, 0x22,
+ 0x0a, 0x04, 0x65, 0x78, 0x70, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63,
+ 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x04, 0x65, 0x78,
+ 0x70, 0x72, 0x12, 0x35, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66,
+ 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78,
+ 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xfd, 0x0a, 0x0a, 0x04, 0x45, 0x78,
+ 0x70, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02,
+ 0x69, 0x64, 0x12, 0x33, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,
+ 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f,
+ 0x6e, 0x73, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74,
+ 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65,
+ 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x49, 0x64, 0x65, 0x6e,
+ 0x74, 0x48, 0x00, 0x52, 0x09, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x38,
+ 0x0a, 0x0b, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x05, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45,
+ 0x78, 0x70, 0x72, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x65,
+ 0x6c, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c,
+ 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65,
+ 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x61, 0x6c, 0x6c,
+ 0x48, 0x00, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x12, 0x38, 0x0a, 0x09,
+ 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x19, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x69,
+ 0x73, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
+ 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65,
+ 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x75,
+ 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x12, 0x4d, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65,
+ 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x09, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78,
+ 0x70, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+ 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+ 0x6e, 0x45, 0x78, 0x70, 0x72, 0x1a, 0x1b, 0x0a, 0x05, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x12,
+ 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x1a, 0x65, 0x0a, 0x06, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x28, 0x0a, 0x07,
+ 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,
+ 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x6f,
+ 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09,
+ 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
+ 0x08, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x1a, 0x6e, 0x0a, 0x04, 0x43, 0x61, 0x6c,
+ 0x6c, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70,
+ 0x72, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6e,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6e,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20,
+ 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45,
+ 0x78, 0x70, 0x72, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x1a, 0x63, 0x0a, 0x0a, 0x43, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e,
+ 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x65, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f,
+ 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0f, 0x6f,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x1a, 0xab,
+ 0x02, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x12,
+ 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4e, 0x61,
+ 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20,
+ 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45,
+ 0x78, 0x70, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74,
+ 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a,
+ 0xba, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x66, 0x69, 0x65,
+ 0x6c, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08,
+ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x5f,
+ 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e,
+ 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x61, 0x70,
+ 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78,
+ 0x70, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79,
+ 0x42, 0x0a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0xad, 0x02, 0x0a,
+ 0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19,
+ 0x0a, 0x08, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x07, 0x69, 0x74, 0x65, 0x72, 0x56, 0x61, 0x72, 0x12, 0x2d, 0x0a, 0x0a, 0x69, 0x74, 0x65,
+ 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e,
+ 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x09, 0x69,
+ 0x74, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x75,
+ 0x5f, 0x76, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x75,
+ 0x56, 0x61, 0x72, 0x12, 0x2b, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x75, 0x5f, 0x69, 0x6e, 0x69, 0x74,
+ 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70,
+ 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x61, 0x63, 0x63, 0x75, 0x49, 0x6e, 0x69, 0x74,
+ 0x12, 0x35, 0x0a, 0x0e, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65,
+ 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, 0x43, 0x6f,
+ 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x09, 0x6c, 0x6f, 0x6f, 0x70, 0x5f,
+ 0x73, 0x74, 0x65, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c,
+ 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x08, 0x6c, 0x6f, 0x6f, 0x70,
+ 0x53, 0x74, 0x65, 0x70, 0x12, 0x26, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,
+ 0x45, 0x78, 0x70, 0x72, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x0b, 0x0a, 0x09,
+ 0x65, 0x78, 0x70, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xc1, 0x03, 0x0a, 0x08, 0x43, 0x6f,
+ 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c,
+ 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56,
+ 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x74,
+ 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36,
+ 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52,
+ 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c,
+ 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e,
+ 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x62,
+ 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x64, 0x75, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01,
+ 0x48, 0x00, 0x52, 0x0d, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+ 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x69,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0f, 0x0a, 0x0d,
+ 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xac, 0x06,
+ 0x0a, 0x0a, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e,
+ 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x56, 0x65, 0x72, 0x73,
+ 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x18,
+ 0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65,
+ 0x74, 0x73, 0x12, 0x41, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+ 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72,
+ 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x6f, 0x73, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x5f, 0x63,
+ 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x6c,
+ 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f,
+ 0x2e, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+ 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x12, 0x3e, 0x0a, 0x0a,
+ 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x1e, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+ 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3c, 0x0a, 0x0e,
+ 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
+ 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79,
+ 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
+ 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4d, 0x0a, 0x0f, 0x4d, 0x61,
+ 0x63, 0x72, 0x6f, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a,
+ 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
+ 0x24, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e,
+ 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x05,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xe0, 0x02, 0x0a, 0x09, 0x45, 0x78,
+ 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x59, 0x0a, 0x13, 0x61, 0x66, 0x66, 0x65, 0x63,
+ 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02,
+ 0x20, 0x03, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,
+ 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e,
+ 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x12,
+ 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e,
+ 0x74, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x53,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72,
+ 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x35, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
+ 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05,
+ 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x09, 0x43,
+ 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x4f, 0x4d, 0x50,
+ 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
+ 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54,
+ 0x5f, 0x50, 0x41, 0x52, 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4d,
+ 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43,
+ 0x4b, 0x45, 0x52, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x4e, 0x45,
+ 0x4e, 0x54, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x42, 0x2e, 0x0a, 0x0c,
+ 0x64, 0x65, 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x0b, 0x53, 0x79,
+ 0x6e, 0x74, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c,
+ 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_cel_expr_syntax_proto_rawDescOnce sync.Once
+ file_cel_expr_syntax_proto_rawDescData = file_cel_expr_syntax_proto_rawDesc
+)
+
+func file_cel_expr_syntax_proto_rawDescGZIP() []byte {
+ file_cel_expr_syntax_proto_rawDescOnce.Do(func() {
+ file_cel_expr_syntax_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_syntax_proto_rawDescData)
+ })
+ return file_cel_expr_syntax_proto_rawDescData
+}
+
+var file_cel_expr_syntax_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_cel_expr_syntax_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_cel_expr_syntax_proto_goTypes = []interface{}{
+ (SourceInfo_Extension_Component)(0), // 0: cel.expr.SourceInfo.Extension.Component
+ (*ParsedExpr)(nil), // 1: cel.expr.ParsedExpr
+ (*Expr)(nil), // 2: cel.expr.Expr
+ (*Constant)(nil), // 3: cel.expr.Constant
+ (*SourceInfo)(nil), // 4: cel.expr.SourceInfo
+ (*Expr_Ident)(nil), // 5: cel.expr.Expr.Ident
+ (*Expr_Select)(nil), // 6: cel.expr.Expr.Select
+ (*Expr_Call)(nil), // 7: cel.expr.Expr.Call
+ (*Expr_CreateList)(nil), // 8: cel.expr.Expr.CreateList
+ (*Expr_CreateStruct)(nil), // 9: cel.expr.Expr.CreateStruct
+ (*Expr_Comprehension)(nil), // 10: cel.expr.Expr.Comprehension
+ (*Expr_CreateStruct_Entry)(nil), // 11: cel.expr.Expr.CreateStruct.Entry
+ nil, // 12: cel.expr.SourceInfo.PositionsEntry
+ nil, // 13: cel.expr.SourceInfo.MacroCallsEntry
+ (*SourceInfo_Extension)(nil), // 14: cel.expr.SourceInfo.Extension
+ (*SourceInfo_Extension_Version)(nil), // 15: cel.expr.SourceInfo.Extension.Version
+ (structpb.NullValue)(0), // 16: google.protobuf.NullValue
+ (*durationpb.Duration)(nil), // 17: google.protobuf.Duration
+ (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp
+}
+var file_cel_expr_syntax_proto_depIdxs = []int32{
+ 2, // 0: cel.expr.ParsedExpr.expr:type_name -> cel.expr.Expr
+ 4, // 1: cel.expr.ParsedExpr.source_info:type_name -> cel.expr.SourceInfo
+ 3, // 2: cel.expr.Expr.const_expr:type_name -> cel.expr.Constant
+ 5, // 3: cel.expr.Expr.ident_expr:type_name -> cel.expr.Expr.Ident
+ 6, // 4: cel.expr.Expr.select_expr:type_name -> cel.expr.Expr.Select
+ 7, // 5: cel.expr.Expr.call_expr:type_name -> cel.expr.Expr.Call
+ 8, // 6: cel.expr.Expr.list_expr:type_name -> cel.expr.Expr.CreateList
+ 9, // 7: cel.expr.Expr.struct_expr:type_name -> cel.expr.Expr.CreateStruct
+ 10, // 8: cel.expr.Expr.comprehension_expr:type_name -> cel.expr.Expr.Comprehension
+ 16, // 9: cel.expr.Constant.null_value:type_name -> google.protobuf.NullValue
+ 17, // 10: cel.expr.Constant.duration_value:type_name -> google.protobuf.Duration
+ 18, // 11: cel.expr.Constant.timestamp_value:type_name -> google.protobuf.Timestamp
+ 12, // 12: cel.expr.SourceInfo.positions:type_name -> cel.expr.SourceInfo.PositionsEntry
+ 13, // 13: cel.expr.SourceInfo.macro_calls:type_name -> cel.expr.SourceInfo.MacroCallsEntry
+ 14, // 14: cel.expr.SourceInfo.extensions:type_name -> cel.expr.SourceInfo.Extension
+ 2, // 15: cel.expr.Expr.Select.operand:type_name -> cel.expr.Expr
+ 2, // 16: cel.expr.Expr.Call.target:type_name -> cel.expr.Expr
+ 2, // 17: cel.expr.Expr.Call.args:type_name -> cel.expr.Expr
+ 2, // 18: cel.expr.Expr.CreateList.elements:type_name -> cel.expr.Expr
+ 11, // 19: cel.expr.Expr.CreateStruct.entries:type_name -> cel.expr.Expr.CreateStruct.Entry
+ 2, // 20: cel.expr.Expr.Comprehension.iter_range:type_name -> cel.expr.Expr
+ 2, // 21: cel.expr.Expr.Comprehension.accu_init:type_name -> cel.expr.Expr
+ 2, // 22: cel.expr.Expr.Comprehension.loop_condition:type_name -> cel.expr.Expr
+ 2, // 23: cel.expr.Expr.Comprehension.loop_step:type_name -> cel.expr.Expr
+ 2, // 24: cel.expr.Expr.Comprehension.result:type_name -> cel.expr.Expr
+ 2, // 25: cel.expr.Expr.CreateStruct.Entry.map_key:type_name -> cel.expr.Expr
+ 2, // 26: cel.expr.Expr.CreateStruct.Entry.value:type_name -> cel.expr.Expr
+ 2, // 27: cel.expr.SourceInfo.MacroCallsEntry.value:type_name -> cel.expr.Expr
+ 0, // 28: cel.expr.SourceInfo.Extension.affected_components:type_name -> cel.expr.SourceInfo.Extension.Component
+ 15, // 29: cel.expr.SourceInfo.Extension.version:type_name -> cel.expr.SourceInfo.Extension.Version
+ 30, // [30:30] is the sub-list for method output_type
+ 30, // [30:30] is the sub-list for method input_type
+ 30, // [30:30] is the sub-list for extension type_name
+ 30, // [30:30] is the sub-list for extension extendee
+ 0, // [0:30] is the sub-list for field type_name
+}
+
+func init() { file_cel_expr_syntax_proto_init() }
+func file_cel_expr_syntax_proto_init() {
+ if File_cel_expr_syntax_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_cel_expr_syntax_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ParsedExpr); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Expr); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Constant); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SourceInfo); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Expr_Ident); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Expr_Select); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Expr_Call); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Expr_CreateList); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Expr_CreateStruct); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Expr_Comprehension); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Expr_CreateStruct_Entry); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SourceInfo_Extension); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SourceInfo_Extension_Version); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ file_cel_expr_syntax_proto_msgTypes[1].OneofWrappers = []interface{}{
+ (*Expr_ConstExpr)(nil),
+ (*Expr_IdentExpr)(nil),
+ (*Expr_SelectExpr)(nil),
+ (*Expr_CallExpr)(nil),
+ (*Expr_ListExpr)(nil),
+ (*Expr_StructExpr)(nil),
+ (*Expr_ComprehensionExpr)(nil),
+ }
+ file_cel_expr_syntax_proto_msgTypes[2].OneofWrappers = []interface{}{
+ (*Constant_NullValue)(nil),
+ (*Constant_BoolValue)(nil),
+ (*Constant_Int64Value)(nil),
+ (*Constant_Uint64Value)(nil),
+ (*Constant_DoubleValue)(nil),
+ (*Constant_StringValue)(nil),
+ (*Constant_BytesValue)(nil),
+ (*Constant_DurationValue)(nil),
+ (*Constant_TimestampValue)(nil),
+ }
+ file_cel_expr_syntax_proto_msgTypes[10].OneofWrappers = []interface{}{
+ (*Expr_CreateStruct_Entry_FieldKey)(nil),
+ (*Expr_CreateStruct_Entry_MapKey)(nil),
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_cel_expr_syntax_proto_rawDesc,
+ NumEnums: 1,
+ NumMessages: 15,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_cel_expr_syntax_proto_goTypes,
+ DependencyIndexes: file_cel_expr_syntax_proto_depIdxs,
+ EnumInfos: file_cel_expr_syntax_proto_enumTypes,
+ MessageInfos: file_cel_expr_syntax_proto_msgTypes,
+ }.Build()
+ File_cel_expr_syntax_proto = out.File
+ file_cel_expr_syntax_proto_rawDesc = nil
+ file_cel_expr_syntax_proto_goTypes = nil
+ file_cel_expr_syntax_proto_depIdxs = nil
+}
diff --git a/.gear/predownloaded-development/vendor/cel.dev/expr/value.pb.go b/.gear/predownloaded-development/vendor/cel.dev/expr/value.pb.go
new file mode 100644
index 0000000..e5e2922
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/cel.dev/expr/value.pb.go
@@ -0,0 +1,653 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc v3.21.5
+// source: cel/expr/value.proto
+
+package expr
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ anypb "google.golang.org/protobuf/types/known/anypb"
+ structpb "google.golang.org/protobuf/types/known/structpb"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type Value struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // Types that are assignable to Kind:
+ //
+ // *Value_NullValue
+ // *Value_BoolValue
+ // *Value_Int64Value
+ // *Value_Uint64Value
+ // *Value_DoubleValue
+ // *Value_StringValue
+ // *Value_BytesValue
+ // *Value_EnumValue
+ // *Value_ObjectValue
+ // *Value_MapValue
+ // *Value_ListValue
+ // *Value_TypeValue
+ Kind isValue_Kind `protobuf_oneof:"kind"`
+}
+
+func (x *Value) Reset() {
+ *x = Value{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_value_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *Value) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Value) ProtoMessage() {}
+
+func (x *Value) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_value_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use Value.ProtoReflect.Descriptor instead.
+func (*Value) Descriptor() ([]byte, []int) {
+ return file_cel_expr_value_proto_rawDescGZIP(), []int{0}
+}
+
+func (m *Value) GetKind() isValue_Kind {
+ if m != nil {
+ return m.Kind
+ }
+ return nil
+}
+
+func (x *Value) GetNullValue() structpb.NullValue {
+ if x, ok := x.GetKind().(*Value_NullValue); ok {
+ return x.NullValue
+ }
+ return structpb.NullValue(0)
+}
+
+func (x *Value) GetBoolValue() bool {
+ if x, ok := x.GetKind().(*Value_BoolValue); ok {
+ return x.BoolValue
+ }
+ return false
+}
+
+func (x *Value) GetInt64Value() int64 {
+ if x, ok := x.GetKind().(*Value_Int64Value); ok {
+ return x.Int64Value
+ }
+ return 0
+}
+
+func (x *Value) GetUint64Value() uint64 {
+ if x, ok := x.GetKind().(*Value_Uint64Value); ok {
+ return x.Uint64Value
+ }
+ return 0
+}
+
+func (x *Value) GetDoubleValue() float64 {
+ if x, ok := x.GetKind().(*Value_DoubleValue); ok {
+ return x.DoubleValue
+ }
+ return 0
+}
+
+func (x *Value) GetStringValue() string {
+ if x, ok := x.GetKind().(*Value_StringValue); ok {
+ return x.StringValue
+ }
+ return ""
+}
+
+func (x *Value) GetBytesValue() []byte {
+ if x, ok := x.GetKind().(*Value_BytesValue); ok {
+ return x.BytesValue
+ }
+ return nil
+}
+
+func (x *Value) GetEnumValue() *EnumValue {
+ if x, ok := x.GetKind().(*Value_EnumValue); ok {
+ return x.EnumValue
+ }
+ return nil
+}
+
+func (x *Value) GetObjectValue() *anypb.Any {
+ if x, ok := x.GetKind().(*Value_ObjectValue); ok {
+ return x.ObjectValue
+ }
+ return nil
+}
+
+func (x *Value) GetMapValue() *MapValue {
+ if x, ok := x.GetKind().(*Value_MapValue); ok {
+ return x.MapValue
+ }
+ return nil
+}
+
+func (x *Value) GetListValue() *ListValue {
+ if x, ok := x.GetKind().(*Value_ListValue); ok {
+ return x.ListValue
+ }
+ return nil
+}
+
+func (x *Value) GetTypeValue() string {
+ if x, ok := x.GetKind().(*Value_TypeValue); ok {
+ return x.TypeValue
+ }
+ return ""
+}
+
+type isValue_Kind interface {
+ isValue_Kind()
+}
+
+type Value_NullValue struct {
+ NullValue structpb.NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,proto3,enum=google.protobuf.NullValue,oneof"`
+}
+
+type Value_BoolValue struct {
+ BoolValue bool `protobuf:"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof"`
+}
+
+type Value_Int64Value struct {
+ Int64Value int64 `protobuf:"varint,3,opt,name=int64_value,json=int64Value,proto3,oneof"`
+}
+
+type Value_Uint64Value struct {
+ Uint64Value uint64 `protobuf:"varint,4,opt,name=uint64_value,json=uint64Value,proto3,oneof"`
+}
+
+type Value_DoubleValue struct {
+ DoubleValue float64 `protobuf:"fixed64,5,opt,name=double_value,json=doubleValue,proto3,oneof"`
+}
+
+type Value_StringValue struct {
+ StringValue string `protobuf:"bytes,6,opt,name=string_value,json=stringValue,proto3,oneof"`
+}
+
+type Value_BytesValue struct {
+ BytesValue []byte `protobuf:"bytes,7,opt,name=bytes_value,json=bytesValue,proto3,oneof"`
+}
+
+type Value_EnumValue struct {
+ EnumValue *EnumValue `protobuf:"bytes,9,opt,name=enum_value,json=enumValue,proto3,oneof"`
+}
+
+type Value_ObjectValue struct {
+ ObjectValue *anypb.Any `protobuf:"bytes,10,opt,name=object_value,json=objectValue,proto3,oneof"`
+}
+
+type Value_MapValue struct {
+ MapValue *MapValue `protobuf:"bytes,11,opt,name=map_value,json=mapValue,proto3,oneof"`
+}
+
+type Value_ListValue struct {
+ ListValue *ListValue `protobuf:"bytes,12,opt,name=list_value,json=listValue,proto3,oneof"`
+}
+
+type Value_TypeValue struct {
+ TypeValue string `protobuf:"bytes,15,opt,name=type_value,json=typeValue,proto3,oneof"`
+}
+
+func (*Value_NullValue) isValue_Kind() {}
+
+func (*Value_BoolValue) isValue_Kind() {}
+
+func (*Value_Int64Value) isValue_Kind() {}
+
+func (*Value_Uint64Value) isValue_Kind() {}
+
+func (*Value_DoubleValue) isValue_Kind() {}
+
+func (*Value_StringValue) isValue_Kind() {}
+
+func (*Value_BytesValue) isValue_Kind() {}
+
+func (*Value_EnumValue) isValue_Kind() {}
+
+func (*Value_ObjectValue) isValue_Kind() {}
+
+func (*Value_MapValue) isValue_Kind() {}
+
+func (*Value_ListValue) isValue_Kind() {}
+
+func (*Value_TypeValue) isValue_Kind() {}
+
+type EnumValue struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
+ Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *EnumValue) Reset() {
+ *x = EnumValue{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_value_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *EnumValue) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*EnumValue) ProtoMessage() {}
+
+func (x *EnumValue) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_value_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use EnumValue.ProtoReflect.Descriptor instead.
+func (*EnumValue) Descriptor() ([]byte, []int) {
+ return file_cel_expr_value_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *EnumValue) GetType() string {
+ if x != nil {
+ return x.Type
+ }
+ return ""
+}
+
+func (x *EnumValue) GetValue() int32 {
+ if x != nil {
+ return x.Value
+ }
+ return 0
+}
+
+type ListValue struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"`
+}
+
+func (x *ListValue) Reset() {
+ *x = ListValue{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_value_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *ListValue) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ListValue) ProtoMessage() {}
+
+func (x *ListValue) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_value_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use ListValue.ProtoReflect.Descriptor instead.
+func (*ListValue) Descriptor() ([]byte, []int) {
+ return file_cel_expr_value_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ListValue) GetValues() []*Value {
+ if x != nil {
+ return x.Values
+ }
+ return nil
+}
+
+type MapValue struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Entries []*MapValue_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"`
+}
+
+func (x *MapValue) Reset() {
+ *x = MapValue{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_value_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *MapValue) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MapValue) ProtoMessage() {}
+
+func (x *MapValue) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_value_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MapValue.ProtoReflect.Descriptor instead.
+func (*MapValue) Descriptor() ([]byte, []int) {
+ return file_cel_expr_value_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *MapValue) GetEntries() []*MapValue_Entry {
+ if x != nil {
+ return x.Entries
+ }
+ return nil
+}
+
+type MapValue_Entry struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Key *Value `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+ Value *Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *MapValue_Entry) Reset() {
+ *x = MapValue_Entry{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_cel_expr_value_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *MapValue_Entry) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MapValue_Entry) ProtoMessage() {}
+
+func (x *MapValue_Entry) ProtoReflect() protoreflect.Message {
+ mi := &file_cel_expr_value_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use MapValue_Entry.ProtoReflect.Descriptor instead.
+func (*MapValue_Entry) Descriptor() ([]byte, []int) {
+ return file_cel_expr_value_proto_rawDescGZIP(), []int{3, 0}
+}
+
+func (x *MapValue_Entry) GetKey() *Value {
+ if x != nil {
+ return x.Key
+ }
+ return nil
+}
+
+func (x *MapValue_Entry) GetValue() *Value {
+ if x != nil {
+ return x.Value
+ }
+ return nil
+}
+
+var File_cel_expr_value_proto protoreflect.FileDescriptor
+
+var file_cel_expr_value_proto_rawDesc = []byte{
+ 0x0a, 0x14, 0x63, 0x65, 0x6c, 0x2f, 0x65, 0x78, 0x70, 0x72, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72,
+ 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+ 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72,
+ 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9d, 0x04, 0x0a, 0x05, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x6e, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56,
+ 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x69,
+ 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x64, 0x6f, 0x75,
+ 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48,
+ 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23,
+ 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06,
+ 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65,
+ 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x65, 0x6c,
+ 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48,
+ 0x00, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x0c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0a, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x6c,
+ 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x4d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00,
+ 0x52, 0x08, 0x6d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x6c, 0x69,
+ 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+ 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65,
+ 0x12, 0x1f, 0x0a, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0f,
+ 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x74, 0x79, 0x70, 0x65, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x35, 0x0a, 0x09, 0x45, 0x6e, 0x75,
+ 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x22, 0x34, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a,
+ 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e,
+ 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x08, 0x4d, 0x61, 0x70, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e,
+ 0x4d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07,
+ 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x51, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79,
+ 0x12, 0x21, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e,
+ 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03,
+ 0x6b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x2e, 0x56, 0x61,
+ 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2d, 0x0a, 0x0c, 0x64, 0x65,
+ 0x76, 0x2e, 0x63, 0x65, 0x6c, 0x2e, 0x65, 0x78, 0x70, 0x72, 0x42, 0x0a, 0x56, 0x61, 0x6c, 0x75,
+ 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x0c, 0x63, 0x65, 0x6c, 0x2e, 0x64, 0x65,
+ 0x76, 0x2f, 0x65, 0x78, 0x70, 0x72, 0xf8, 0x01, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x33,
+}
+
+var (
+ file_cel_expr_value_proto_rawDescOnce sync.Once
+ file_cel_expr_value_proto_rawDescData = file_cel_expr_value_proto_rawDesc
+)
+
+func file_cel_expr_value_proto_rawDescGZIP() []byte {
+ file_cel_expr_value_proto_rawDescOnce.Do(func() {
+ file_cel_expr_value_proto_rawDescData = protoimpl.X.CompressGZIP(file_cel_expr_value_proto_rawDescData)
+ })
+ return file_cel_expr_value_proto_rawDescData
+}
+
+var file_cel_expr_value_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_cel_expr_value_proto_goTypes = []interface{}{
+ (*Value)(nil), // 0: cel.expr.Value
+ (*EnumValue)(nil), // 1: cel.expr.EnumValue
+ (*ListValue)(nil), // 2: cel.expr.ListValue
+ (*MapValue)(nil), // 3: cel.expr.MapValue
+ (*MapValue_Entry)(nil), // 4: cel.expr.MapValue.Entry
+ (structpb.NullValue)(0), // 5: google.protobuf.NullValue
+ (*anypb.Any)(nil), // 6: google.protobuf.Any
+}
+var file_cel_expr_value_proto_depIdxs = []int32{
+ 5, // 0: cel.expr.Value.null_value:type_name -> google.protobuf.NullValue
+ 1, // 1: cel.expr.Value.enum_value:type_name -> cel.expr.EnumValue
+ 6, // 2: cel.expr.Value.object_value:type_name -> google.protobuf.Any
+ 3, // 3: cel.expr.Value.map_value:type_name -> cel.expr.MapValue
+ 2, // 4: cel.expr.Value.list_value:type_name -> cel.expr.ListValue
+ 0, // 5: cel.expr.ListValue.values:type_name -> cel.expr.Value
+ 4, // 6: cel.expr.MapValue.entries:type_name -> cel.expr.MapValue.Entry
+ 0, // 7: cel.expr.MapValue.Entry.key:type_name -> cel.expr.Value
+ 0, // 8: cel.expr.MapValue.Entry.value:type_name -> cel.expr.Value
+ 9, // [9:9] is the sub-list for method output_type
+ 9, // [9:9] is the sub-list for method input_type
+ 9, // [9:9] is the sub-list for extension type_name
+ 9, // [9:9] is the sub-list for extension extendee
+ 0, // [0:9] is the sub-list for field type_name
+}
+
+func init() { file_cel_expr_value_proto_init() }
+func file_cel_expr_value_proto_init() {
+ if File_cel_expr_value_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_cel_expr_value_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*Value); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_value_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*EnumValue); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_value_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*ListValue); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_value_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*MapValue); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_cel_expr_value_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*MapValue_Entry); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ file_cel_expr_value_proto_msgTypes[0].OneofWrappers = []interface{}{
+ (*Value_NullValue)(nil),
+ (*Value_BoolValue)(nil),
+ (*Value_Int64Value)(nil),
+ (*Value_Uint64Value)(nil),
+ (*Value_DoubleValue)(nil),
+ (*Value_StringValue)(nil),
+ (*Value_BytesValue)(nil),
+ (*Value_EnumValue)(nil),
+ (*Value_ObjectValue)(nil),
+ (*Value_MapValue)(nil),
+ (*Value_ListValue)(nil),
+ (*Value_TypeValue)(nil),
+ }
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_cel_expr_value_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 5,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_cel_expr_value_proto_goTypes,
+ DependencyIndexes: file_cel_expr_value_proto_depIdxs,
+ MessageInfos: file_cel_expr_value_proto_msgTypes,
+ }.Build()
+ File_cel_expr_value_proto = out.File
+ file_cel_expr_value_proto_rawDesc = nil
+ file_cel_expr_value_proto_goTypes = nil
+ file_cel_expr_value_proto_depIdxs = nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/.gitignore b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/.gitignore
new file mode 100644
index 0000000..38ea34f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/.gitignore
@@ -0,0 +1,18 @@
+### Go template
+
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, built with `go test -c`
+*.test
+
+
+# Go workspace file
+go.work
+
+# No Goland stuff in this repo
+.idea
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/LICENSE b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/LICENSE
new file mode 100644
index 0000000..a22292e
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2012-2023 The ANTLR Project. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+3. Neither name of copyright holders nor the names of its contributors
+may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/README.md b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/README.md
new file mode 100644
index 0000000..03e5b83
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/README.md
@@ -0,0 +1,54 @@
+[](https://goreportcard.com/report/github.com/antlr4-go/antlr)
+[](https://pkg.go.dev/github.com/antlr4-go/antlr)
+[](https://github.com/antlr4-go/antlr/releases/latest)
+[](https://github.com/antlr4-go/antlr/releases/latest)
+[](https://github.com/antlr4-go/antlr/commit-activity)
+[](https://opensource.org/licenses/BSD-3-Clause)
+[](https://GitHub.com/Naereen/StrapDown.js/stargazers/)
+# ANTLR4 Go Runtime Module Repo
+
+IMPORTANT: Please submit PRs via a clone of the https://github.com/antlr/antlr4 repo, and not here.
+
+ - Do not submit PRs or any change requests to this repo
+ - This repo is read only and is updated by the ANTLR team to create a new release of the Go Runtime for ANTLR
+ - This repo contains the Go runtime that your generated projects should import
+
+## Introduction
+
+This repo contains the official modules for the Go Runtime for ANTLR. It is a copy of the runtime maintained
+at: https://github.com/antlr/antlr4/tree/master/runtime/Go/antlr and is automatically updated by the ANTLR team to create
+the official Go runtime release only. No development work is carried out in this repo and PRs are not accepted here.
+
+The dev branch of this repo is kept in sync with the dev branch of the main ANTLR repo and is updated periodically.
+
+### Why?
+
+The `go get` command is unable to retrieve the Go runtime when it is embedded so
+deeply in the main repo. A `go get` against the `antlr/antlr4` repo, while retrieving the correct source code for the runtime,
+does not correctly resolve tags and will create a reference in your `go.mod` file that is unclear, will not upgrade smoothly and
+causes confusion.
+
+For instance, the current Go runtime release, which is tagged with v4.13.0 in `antlr/antlr4` is retrieved by go get as:
+
+```sh
+require (
+ github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230219212500-1f9a474cc2dc
+)
+```
+
+Where you would expect to see:
+
+```sh
+require (
+ github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.13.0
+)
+```
+
+The decision was taken to create a separate org in a separate repo to hold the official Go runtime for ANTLR and
+from whence users can expect `go get` to behave as expected.
+
+
+# Documentation
+Please read the official documentation at: https://github.com/antlr/antlr4/blob/master/doc/index.md for tips on
+migrating existing projects to use the new module location and for information on how to use the Go runtime in
+general.
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/antlrdoc.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/antlrdoc.go
new file mode 100644
index 0000000..3bb4fd7
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/antlrdoc.go
@@ -0,0 +1,102 @@
+/*
+Package antlr implements the Go version of the ANTLR 4 runtime.
+
+# The ANTLR Tool
+
+ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing,
+or translating structured text or binary files. It's widely used to build languages, tools, and frameworks.
+From a grammar, ANTLR generates a parser that can build parse trees and also generates a listener interface
+(or visitor) that makes it easy to respond to the recognition of phrases of interest.
+
+# Go Runtime
+
+At version 4.11.x and prior, the Go runtime was not properly versioned for go modules. After this point, the runtime
+source code to be imported was held in the `runtime/Go/antlr/v4` directory, and the go.mod file was updated to reflect the version of
+ANTLR4 that it is compatible with (I.E. uses the /v4 path).
+
+However, this was found to be problematic, as it meant that with the runtime embedded so far underneath the root
+of the repo, the `go get` and related commands could not properly resolve the location of the go runtime source code.
+This meant that the reference to the runtime in your `go.mod` file would refer to the correct source code, but would not
+list the release tag such as @4.12.0 - this was confusing, to say the least.
+
+As of 4.12.1, the runtime is now available as a go module in its own repo, and can be imported as `github.com/antlr4-go/antlr`
+(the go get command should also be used with this path). See the main documentation for the ANTLR4 project for more information,
+which is available at [ANTLR docs]. The documentation for using the Go runtime is available at [Go runtime docs].
+
+This means that if you are using the source code without modules, you should also use the source code in the [new repo].
+Though we highly recommend that you use go modules, as they are now idiomatic for Go.
+
+I am aware that this change will prove Hyrum's Law, but am prepared to live with it for the common good.
+
+Go runtime author: [Jim Idle] jimi@idle.ws
+
+# Code Generation
+
+ANTLR supports the generation of code in a number of [target languages], and the generated code is supported by a
+runtime library, written specifically to support the generated code in the target language. This library is the
+runtime for the Go target.
+
+To generate code for the go target, it is generally recommended to place the source grammar files in a package of
+their own, and use the `.sh` script method of generating code, using the go generate directive. In that same directory
+it is usual, though not required, to place the antlr tool that should be used to generate the code. That does mean
+that the antlr tool JAR file will be checked in to your source code control though, so you are, of course, free to use any other
+way of specifying the version of the ANTLR tool to use, such as aliasing in `.zshrc` or equivalent, or a profile in
+your IDE, or configuration in your CI system. Checking in the jar does mean that it is easy to reproduce the build as
+it was at any point in its history.
+
+Here is a general/recommended template for an ANTLR based recognizer in Go:
+
+ .
+ ├── parser
+ │ ├── mygrammar.g4
+ │ ├── antlr-4.12.1-complete.jar
+ │ ├── generate.go
+ │ └── generate.sh
+ ├── parsing - generated code goes here
+ │ └── error_listeners.go
+ ├── go.mod
+ ├── go.sum
+ ├── main.go
+ └── main_test.go
+
+Make sure that the package statement in your grammar file(s) reflects the go package the generated code will exist in.
+
+The generate.go file then looks like this:
+
+ package parser
+
+ //go:generate ./generate.sh
+
+And the generate.sh file will look similar to this:
+
+ #!/bin/sh
+
+ alias antlr4='java -Xmx500M -cp "./antlr4-4.12.1-complete.jar:$CLASSPATH" org.antlr.v4.Tool'
+ antlr4 -Dlanguage=Go -no-visitor -package parsing *.g4
+
+depending on whether you want visitors or listeners or any other ANTLR options. Not that another option here
+is to generate the code into a
+
+From the command line at the root of your source package (location of go.mo)d) you can then simply issue the command:
+
+ go generate ./...
+
+Which will generate the code for the parser, and place it in the parsing package. You can then use the generated code
+by importing the parsing package.
+
+There are no hard and fast rules on this. It is just a recommendation. You can generate the code in any way and to anywhere you like.
+
+# Copyright Notice
+
+Copyright (c) 2012-2023 The ANTLR Project. All rights reserved.
+
+Use of this file is governed by the BSD 3-clause license, which can be found in the [LICENSE.txt] file in the project root.
+
+[target languages]: https://github.com/antlr/antlr4/tree/master/runtime
+[LICENSE.txt]: https://github.com/antlr/antlr4/blob/master/LICENSE.txt
+[ANTLR docs]: https://github.com/antlr/antlr4/blob/master/doc/index.md
+[new repo]: https://github.com/antlr4-go/antlr
+[Jim Idle]: https://github.com/jimidle
+[Go runtime docs]: https://github.com/antlr/antlr4/blob/master/doc/go-target.md
+*/
+package antlr
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn.go
new file mode 100644
index 0000000..cdeefed
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn.go
@@ -0,0 +1,179 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import "sync"
+
+// ATNInvalidAltNumber is used to represent an ALT number that has yet to be calculated or
+// which is invalid for a particular struct such as [*antlr.BaseRuleContext]
+var ATNInvalidAltNumber int
+
+// ATN represents an “[Augmented Transition Network]”, though general in ANTLR the term
+// “Augmented Recursive Transition Network” though there are some descriptions of “[Recursive Transition Network]”
+// in existence.
+//
+// ATNs represent the main networks in the system and are serialized by the code generator and support [ALL(*)].
+//
+// [Augmented Transition Network]: https://en.wikipedia.org/wiki/Augmented_transition_network
+// [ALL(*)]: https://www.antlr.org/papers/allstar-techreport.pdf
+// [Recursive Transition Network]: https://en.wikipedia.org/wiki/Recursive_transition_network
+type ATN struct {
+
+ // DecisionToState is the decision points for all rules, sub-rules, optional
+ // blocks, ()+, ()*, etc. Each sub-rule/rule is a decision point, and we must track them, so we
+ // can go back later and build DFA predictors for them. This includes
+ // all the rules, sub-rules, optional blocks, ()+, ()* etc...
+ DecisionToState []DecisionState
+
+ // grammarType is the ATN type and is used for deserializing ATNs from strings.
+ grammarType int
+
+ // lexerActions is referenced by action transitions in the ATN for lexer ATNs.
+ lexerActions []LexerAction
+
+ // maxTokenType is the maximum value for any symbol recognized by a transition in the ATN.
+ maxTokenType int
+
+ modeNameToStartState map[string]*TokensStartState
+
+ modeToStartState []*TokensStartState
+
+ // ruleToStartState maps from rule index to starting state number.
+ ruleToStartState []*RuleStartState
+
+ // ruleToStopState maps from rule index to stop state number.
+ ruleToStopState []*RuleStopState
+
+ // ruleToTokenType maps the rule index to the resulting token type for lexer
+ // ATNs. For parser ATNs, it maps the rule index to the generated bypass token
+ // type if ATNDeserializationOptions.isGenerateRuleBypassTransitions was
+ // specified, and otherwise is nil.
+ ruleToTokenType []int
+
+ // ATNStates is a list of all states in the ATN, ordered by state number.
+ //
+ states []ATNState
+
+ mu sync.Mutex
+ stateMu sync.RWMutex
+ edgeMu sync.RWMutex
+}
+
+// NewATN returns a new ATN struct representing the given grammarType and is used
+// for runtime deserialization of ATNs from the code generated by the ANTLR tool
+func NewATN(grammarType int, maxTokenType int) *ATN {
+ return &ATN{
+ grammarType: grammarType,
+ maxTokenType: maxTokenType,
+ modeNameToStartState: make(map[string]*TokensStartState),
+ }
+}
+
+// NextTokensInContext computes and returns the set of valid tokens that can occur starting
+// in state s. If ctx is nil, the set of tokens will not include what can follow
+// the rule surrounding s. In other words, the set will be restricted to tokens
+// reachable staying within the rule of s.
+func (a *ATN) NextTokensInContext(s ATNState, ctx RuleContext) *IntervalSet {
+ return NewLL1Analyzer(a).Look(s, nil, ctx)
+}
+
+// NextTokensNoContext computes and returns the set of valid tokens that can occur starting
+// in state s and staying in same rule. [antlr.Token.EPSILON] is in set if we reach end of
+// rule.
+func (a *ATN) NextTokensNoContext(s ATNState) *IntervalSet {
+ a.mu.Lock()
+ defer a.mu.Unlock()
+ iset := s.GetNextTokenWithinRule()
+ if iset == nil {
+ iset = a.NextTokensInContext(s, nil)
+ iset.readOnly = true
+ s.SetNextTokenWithinRule(iset)
+ }
+ return iset
+}
+
+// NextTokens computes and returns the set of valid tokens starting in state s, by
+// calling either [NextTokensNoContext] (ctx == nil) or [NextTokensInContext] (ctx != nil).
+func (a *ATN) NextTokens(s ATNState, ctx RuleContext) *IntervalSet {
+ if ctx == nil {
+ return a.NextTokensNoContext(s)
+ }
+
+ return a.NextTokensInContext(s, ctx)
+}
+
+func (a *ATN) addState(state ATNState) {
+ if state != nil {
+ state.SetATN(a)
+ state.SetStateNumber(len(a.states))
+ }
+
+ a.states = append(a.states, state)
+}
+
+func (a *ATN) removeState(state ATNState) {
+ a.states[state.GetStateNumber()] = nil // Just free the memory; don't shift states in the slice
+}
+
+func (a *ATN) defineDecisionState(s DecisionState) int {
+ a.DecisionToState = append(a.DecisionToState, s)
+ s.setDecision(len(a.DecisionToState) - 1)
+
+ return s.getDecision()
+}
+
+func (a *ATN) getDecisionState(decision int) DecisionState {
+ if len(a.DecisionToState) == 0 {
+ return nil
+ }
+
+ return a.DecisionToState[decision]
+}
+
+// getExpectedTokens computes the set of input symbols which could follow ATN
+// state number stateNumber in the specified full parse context ctx and returns
+// the set of potentially valid input symbols which could follow the specified
+// state in the specified context. This method considers the complete parser
+// context, but does not evaluate semantic predicates (i.e. all predicates
+// encountered during the calculation are assumed true). If a path in the ATN
+// exists from the starting state to the RuleStopState of the outermost context
+// without Matching any symbols, Token.EOF is added to the returned set.
+//
+// A nil ctx defaults to ParserRuleContext.EMPTY.
+//
+// It panics if the ATN does not contain state stateNumber.
+func (a *ATN) getExpectedTokens(stateNumber int, ctx RuleContext) *IntervalSet {
+ if stateNumber < 0 || stateNumber >= len(a.states) {
+ panic("Invalid state number.")
+ }
+
+ s := a.states[stateNumber]
+ following := a.NextTokens(s, nil)
+
+ if !following.contains(TokenEpsilon) {
+ return following
+ }
+
+ expected := NewIntervalSet()
+
+ expected.addSet(following)
+ expected.removeOne(TokenEpsilon)
+
+ for ctx != nil && ctx.GetInvokingState() >= 0 && following.contains(TokenEpsilon) {
+ invokingState := a.states[ctx.GetInvokingState()]
+ rt := invokingState.GetTransitions()[0]
+
+ following = a.NextTokens(rt.(*RuleTransition).followState, nil)
+ expected.addSet(following)
+ expected.removeOne(TokenEpsilon)
+ ctx = ctx.GetParent().(RuleContext)
+ }
+
+ if following.contains(TokenEpsilon) {
+ expected.addOne(TokenEOF)
+ }
+
+ return expected
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_config.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_config.go
new file mode 100644
index 0000000..a83f25d
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_config.go
@@ -0,0 +1,335 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+)
+
+const (
+ lexerConfig = iota // Indicates that this ATNConfig is for a lexer
+ parserConfig // Indicates that this ATNConfig is for a parser
+)
+
+// ATNConfig is a tuple: (ATN state, predicted alt, syntactic, semantic
+// context). The syntactic context is a graph-structured stack node whose
+// path(s) to the root is the rule invocation(s) chain used to arrive in the
+// state. The semantic context is the tree of semantic predicates encountered
+// before reaching an ATN state.
+type ATNConfig struct {
+ precedenceFilterSuppressed bool
+ state ATNState
+ alt int
+ context *PredictionContext
+ semanticContext SemanticContext
+ reachesIntoOuterContext int
+ cType int // lexerConfig or parserConfig
+ lexerActionExecutor *LexerActionExecutor
+ passedThroughNonGreedyDecision bool
+}
+
+// NewATNConfig6 creates a new ATNConfig instance given a state, alt and context only
+func NewATNConfig6(state ATNState, alt int, context *PredictionContext) *ATNConfig {
+ return NewATNConfig5(state, alt, context, SemanticContextNone)
+}
+
+// NewATNConfig5 creates a new ATNConfig instance given a state, alt, context and semantic context
+func NewATNConfig5(state ATNState, alt int, context *PredictionContext, semanticContext SemanticContext) *ATNConfig {
+ if semanticContext == nil {
+ panic("semanticContext cannot be nil") // TODO: Necessary?
+ }
+
+ pac := &ATNConfig{}
+ pac.state = state
+ pac.alt = alt
+ pac.context = context
+ pac.semanticContext = semanticContext
+ pac.cType = parserConfig
+ return pac
+}
+
+// NewATNConfig4 creates a new ATNConfig instance given an existing config, and a state only
+func NewATNConfig4(c *ATNConfig, state ATNState) *ATNConfig {
+ return NewATNConfig(c, state, c.GetContext(), c.GetSemanticContext())
+}
+
+// NewATNConfig3 creates a new ATNConfig instance given an existing config, a state and a semantic context
+func NewATNConfig3(c *ATNConfig, state ATNState, semanticContext SemanticContext) *ATNConfig {
+ return NewATNConfig(c, state, c.GetContext(), semanticContext)
+}
+
+// NewATNConfig2 creates a new ATNConfig instance given an existing config, and a context only
+func NewATNConfig2(c *ATNConfig, semanticContext SemanticContext) *ATNConfig {
+ return NewATNConfig(c, c.GetState(), c.GetContext(), semanticContext)
+}
+
+// NewATNConfig1 creates a new ATNConfig instance given an existing config, a state, and a context only
+func NewATNConfig1(c *ATNConfig, state ATNState, context *PredictionContext) *ATNConfig {
+ return NewATNConfig(c, state, context, c.GetSemanticContext())
+}
+
+// NewATNConfig creates a new ATNConfig instance given an existing config, a state, a context and a semantic context, other 'constructors'
+// are just wrappers around this one.
+func NewATNConfig(c *ATNConfig, state ATNState, context *PredictionContext, semanticContext SemanticContext) *ATNConfig {
+ if semanticContext == nil {
+ panic("semanticContext cannot be nil") // TODO: Remove this - probably put here for some bug that is now fixed
+ }
+ b := &ATNConfig{}
+ b.InitATNConfig(c, state, c.GetAlt(), context, semanticContext)
+ b.cType = parserConfig
+ return b
+}
+
+func (a *ATNConfig) InitATNConfig(c *ATNConfig, state ATNState, alt int, context *PredictionContext, semanticContext SemanticContext) {
+
+ a.state = state
+ a.alt = alt
+ a.context = context
+ a.semanticContext = semanticContext
+ a.reachesIntoOuterContext = c.GetReachesIntoOuterContext()
+ a.precedenceFilterSuppressed = c.getPrecedenceFilterSuppressed()
+}
+
+func (a *ATNConfig) getPrecedenceFilterSuppressed() bool {
+ return a.precedenceFilterSuppressed
+}
+
+func (a *ATNConfig) setPrecedenceFilterSuppressed(v bool) {
+ a.precedenceFilterSuppressed = v
+}
+
+// GetState returns the ATN state associated with this configuration
+func (a *ATNConfig) GetState() ATNState {
+ return a.state
+}
+
+// GetAlt returns the alternative associated with this configuration
+func (a *ATNConfig) GetAlt() int {
+ return a.alt
+}
+
+// SetContext sets the rule invocation stack associated with this configuration
+func (a *ATNConfig) SetContext(v *PredictionContext) {
+ a.context = v
+}
+
+// GetContext returns the rule invocation stack associated with this configuration
+func (a *ATNConfig) GetContext() *PredictionContext {
+ return a.context
+}
+
+// GetSemanticContext returns the semantic context associated with this configuration
+func (a *ATNConfig) GetSemanticContext() SemanticContext {
+ return a.semanticContext
+}
+
+// GetReachesIntoOuterContext returns the count of references to an outer context from this configuration
+func (a *ATNConfig) GetReachesIntoOuterContext() int {
+ return a.reachesIntoOuterContext
+}
+
+// SetReachesIntoOuterContext sets the count of references to an outer context from this configuration
+func (a *ATNConfig) SetReachesIntoOuterContext(v int) {
+ a.reachesIntoOuterContext = v
+}
+
+// Equals is the default comparison function for an ATNConfig when no specialist implementation is required
+// for a collection.
+//
+// An ATN configuration is equal to another if both have the same state, they
+// predict the same alternative, and syntactic/semantic contexts are the same.
+func (a *ATNConfig) Equals(o Collectable[*ATNConfig]) bool {
+ switch a.cType {
+ case lexerConfig:
+ return a.LEquals(o)
+ case parserConfig:
+ return a.PEquals(o)
+ default:
+ panic("Invalid ATNConfig type")
+ }
+}
+
+// PEquals is the default comparison function for a Parser ATNConfig when no specialist implementation is required
+// for a collection.
+//
+// An ATN configuration is equal to another if both have the same state, they
+// predict the same alternative, and syntactic/semantic contexts are the same.
+func (a *ATNConfig) PEquals(o Collectable[*ATNConfig]) bool {
+ var other, ok = o.(*ATNConfig)
+
+ if !ok {
+ return false
+ }
+ if a == other {
+ return true
+ } else if other == nil {
+ return false
+ }
+
+ var equal bool
+
+ if a.context == nil {
+ equal = other.context == nil
+ } else {
+ equal = a.context.Equals(other.context)
+ }
+
+ var (
+ nums = a.state.GetStateNumber() == other.state.GetStateNumber()
+ alts = a.alt == other.alt
+ cons = a.semanticContext.Equals(other.semanticContext)
+ sups = a.precedenceFilterSuppressed == other.precedenceFilterSuppressed
+ )
+
+ return nums && alts && cons && sups && equal
+}
+
+// Hash is the default hash function for a parser ATNConfig, when no specialist hash function
+// is required for a collection
+func (a *ATNConfig) Hash() int {
+ switch a.cType {
+ case lexerConfig:
+ return a.LHash()
+ case parserConfig:
+ return a.PHash()
+ default:
+ panic("Invalid ATNConfig type")
+ }
+}
+
+// PHash is the default hash function for a parser ATNConfig, when no specialist hash function
+// is required for a collection
+func (a *ATNConfig) PHash() int {
+ var c int
+ if a.context != nil {
+ c = a.context.Hash()
+ }
+
+ h := murmurInit(7)
+ h = murmurUpdate(h, a.state.GetStateNumber())
+ h = murmurUpdate(h, a.alt)
+ h = murmurUpdate(h, c)
+ h = murmurUpdate(h, a.semanticContext.Hash())
+ return murmurFinish(h, 4)
+}
+
+// String returns a string representation of the ATNConfig, usually used for debugging purposes
+func (a *ATNConfig) String() string {
+ var s1, s2, s3 string
+
+ if a.context != nil {
+ s1 = ",[" + fmt.Sprint(a.context) + "]"
+ }
+
+ if a.semanticContext != SemanticContextNone {
+ s2 = "," + fmt.Sprint(a.semanticContext)
+ }
+
+ if a.reachesIntoOuterContext > 0 {
+ s3 = ",up=" + fmt.Sprint(a.reachesIntoOuterContext)
+ }
+
+ return fmt.Sprintf("(%v,%v%v%v%v)", a.state, a.alt, s1, s2, s3)
+}
+
+func NewLexerATNConfig6(state ATNState, alt int, context *PredictionContext) *ATNConfig {
+ lac := &ATNConfig{}
+ lac.state = state
+ lac.alt = alt
+ lac.context = context
+ lac.semanticContext = SemanticContextNone
+ lac.cType = lexerConfig
+ return lac
+}
+
+func NewLexerATNConfig4(c *ATNConfig, state ATNState) *ATNConfig {
+ lac := &ATNConfig{}
+ lac.lexerActionExecutor = c.lexerActionExecutor
+ lac.passedThroughNonGreedyDecision = checkNonGreedyDecision(c, state)
+ lac.InitATNConfig(c, state, c.GetAlt(), c.GetContext(), c.GetSemanticContext())
+ lac.cType = lexerConfig
+ return lac
+}
+
+func NewLexerATNConfig3(c *ATNConfig, state ATNState, lexerActionExecutor *LexerActionExecutor) *ATNConfig {
+ lac := &ATNConfig{}
+ lac.lexerActionExecutor = lexerActionExecutor
+ lac.passedThroughNonGreedyDecision = checkNonGreedyDecision(c, state)
+ lac.InitATNConfig(c, state, c.GetAlt(), c.GetContext(), c.GetSemanticContext())
+ lac.cType = lexerConfig
+ return lac
+}
+
+func NewLexerATNConfig2(c *ATNConfig, state ATNState, context *PredictionContext) *ATNConfig {
+ lac := &ATNConfig{}
+ lac.lexerActionExecutor = c.lexerActionExecutor
+ lac.passedThroughNonGreedyDecision = checkNonGreedyDecision(c, state)
+ lac.InitATNConfig(c, state, c.GetAlt(), context, c.GetSemanticContext())
+ lac.cType = lexerConfig
+ return lac
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func NewLexerATNConfig1(state ATNState, alt int, context *PredictionContext) *ATNConfig {
+ lac := &ATNConfig{}
+ lac.state = state
+ lac.alt = alt
+ lac.context = context
+ lac.semanticContext = SemanticContextNone
+ lac.cType = lexerConfig
+ return lac
+}
+
+// LHash is the default hash function for Lexer ATNConfig objects, it can be used directly or via
+// the default comparator [ObjEqComparator].
+func (a *ATNConfig) LHash() int {
+ var f int
+ if a.passedThroughNonGreedyDecision {
+ f = 1
+ } else {
+ f = 0
+ }
+ h := murmurInit(7)
+ h = murmurUpdate(h, a.state.GetStateNumber())
+ h = murmurUpdate(h, a.alt)
+ h = murmurUpdate(h, a.context.Hash())
+ h = murmurUpdate(h, a.semanticContext.Hash())
+ h = murmurUpdate(h, f)
+ h = murmurUpdate(h, a.lexerActionExecutor.Hash())
+ h = murmurFinish(h, 6)
+ return h
+}
+
+// LEquals is the default comparison function for Lexer ATNConfig objects, it can be used directly or via
+// the default comparator [ObjEqComparator].
+func (a *ATNConfig) LEquals(other Collectable[*ATNConfig]) bool {
+ var otherT, ok = other.(*ATNConfig)
+ if !ok {
+ return false
+ } else if a == otherT {
+ return true
+ } else if a.passedThroughNonGreedyDecision != otherT.passedThroughNonGreedyDecision {
+ return false
+ }
+
+ switch {
+ case a.lexerActionExecutor == nil && otherT.lexerActionExecutor == nil:
+ return true
+ case a.lexerActionExecutor != nil && otherT.lexerActionExecutor != nil:
+ if !a.lexerActionExecutor.Equals(otherT.lexerActionExecutor) {
+ return false
+ }
+ default:
+ return false // One but not both, are nil
+ }
+
+ return a.PEquals(otherT)
+}
+
+func checkNonGreedyDecision(source *ATNConfig, target ATNState) bool {
+ var ds, ok = target.(DecisionState)
+
+ return source.passedThroughNonGreedyDecision || (ok && ds.getNonGreedy())
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_config_set.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_config_set.go
new file mode 100644
index 0000000..52dbaf8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_config_set.go
@@ -0,0 +1,301 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+)
+
+// ATNConfigSet is a specialized set of ATNConfig that tracks information
+// about its elements and can combine similar configurations using a
+// graph-structured stack.
+type ATNConfigSet struct {
+ cachedHash int
+
+ // configLookup is used to determine whether two ATNConfigSets are equal. We
+ // need all configurations with the same (s, i, _, semctx) to be equal. A key
+ // effectively doubles the number of objects associated with ATNConfigs. All
+ // keys are hashed by (s, i, _, pi), not including the context. Wiped out when
+ // read-only because a set becomes a DFA state.
+ configLookup *JStore[*ATNConfig, Comparator[*ATNConfig]]
+
+ // configs is the added elements that did not match an existing key in configLookup
+ configs []*ATNConfig
+
+ // TODO: These fields make me pretty uncomfortable, but it is nice to pack up
+ // info together because it saves re-computation. Can we track conflicts as they
+ // are added to save scanning configs later?
+ conflictingAlts *BitSet
+
+ // dipsIntoOuterContext is used by parsers and lexers. In a lexer, it indicates
+ // we hit a pred while computing a closure operation. Do not make a DFA state
+ // from the ATNConfigSet in this case. TODO: How is this used by parsers?
+ dipsIntoOuterContext bool
+
+ // fullCtx is whether it is part of a full context LL prediction. Used to
+ // determine how to merge $. It is a wildcard with SLL, but not for an LL
+ // context merge.
+ fullCtx bool
+
+ // Used in parser and lexer. In lexer, it indicates we hit a pred
+ // while computing a closure operation. Don't make a DFA state from this set.
+ hasSemanticContext bool
+
+ // readOnly is whether it is read-only. Do not
+ // allow any code to manipulate the set if true because DFA states will point at
+ // sets and those must not change. It not, protect other fields; conflictingAlts
+ // in particular, which is assigned after readOnly.
+ readOnly bool
+
+ // TODO: These fields make me pretty uncomfortable, but it is nice to pack up
+ // info together because it saves re-computation. Can we track conflicts as they
+ // are added to save scanning configs later?
+ uniqueAlt int
+}
+
+// Alts returns the combined set of alts for all the configurations in this set.
+func (b *ATNConfigSet) Alts() *BitSet {
+ alts := NewBitSet()
+ for _, it := range b.configs {
+ alts.add(it.GetAlt())
+ }
+ return alts
+}
+
+// NewATNConfigSet creates a new ATNConfigSet instance.
+func NewATNConfigSet(fullCtx bool) *ATNConfigSet {
+ return &ATNConfigSet{
+ cachedHash: -1,
+ configLookup: NewJStore[*ATNConfig, Comparator[*ATNConfig]](aConfCompInst, ATNConfigLookupCollection, "NewATNConfigSet()"),
+ fullCtx: fullCtx,
+ }
+}
+
+// Add merges contexts with existing configs for (s, i, pi, _),
+// where 's' is the ATNConfig.state, 'i' is the ATNConfig.alt, and
+// 'pi' is the [ATNConfig].semanticContext.
+//
+// We use (s,i,pi) as the key.
+// Updates dipsIntoOuterContext and hasSemanticContext when necessary.
+func (b *ATNConfigSet) Add(config *ATNConfig, mergeCache *JPCMap) bool {
+ if b.readOnly {
+ panic("set is read-only")
+ }
+
+ if config.GetSemanticContext() != SemanticContextNone {
+ b.hasSemanticContext = true
+ }
+
+ if config.GetReachesIntoOuterContext() > 0 {
+ b.dipsIntoOuterContext = true
+ }
+
+ existing, present := b.configLookup.Put(config)
+
+ // The config was not already in the set
+ //
+ if !present {
+ b.cachedHash = -1
+ b.configs = append(b.configs, config) // Track order here
+ return true
+ }
+
+ // Merge a previous (s, i, pi, _) with it and save the result
+ rootIsWildcard := !b.fullCtx
+ merged := merge(existing.GetContext(), config.GetContext(), rootIsWildcard, mergeCache)
+
+ // No need to check for existing.context because config.context is in the cache,
+ // since the only way to create new graphs is the "call rule" and here. We cache
+ // at both places.
+ existing.SetReachesIntoOuterContext(intMax(existing.GetReachesIntoOuterContext(), config.GetReachesIntoOuterContext()))
+
+ // Preserve the precedence filter suppression during the merge
+ if config.getPrecedenceFilterSuppressed() {
+ existing.setPrecedenceFilterSuppressed(true)
+ }
+
+ // Replace the context because there is no need to do alt mapping
+ existing.SetContext(merged)
+
+ return true
+}
+
+// GetStates returns the set of states represented by all configurations in this config set
+func (b *ATNConfigSet) GetStates() *JStore[ATNState, Comparator[ATNState]] {
+
+ // states uses the standard comparator and Hash() provided by the ATNState instance
+ //
+ states := NewJStore[ATNState, Comparator[ATNState]](aStateEqInst, ATNStateCollection, "ATNConfigSet.GetStates()")
+
+ for i := 0; i < len(b.configs); i++ {
+ states.Put(b.configs[i].GetState())
+ }
+
+ return states
+}
+
+func (b *ATNConfigSet) GetPredicates() []SemanticContext {
+ predicates := make([]SemanticContext, 0)
+
+ for i := 0; i < len(b.configs); i++ {
+ c := b.configs[i].GetSemanticContext()
+
+ if c != SemanticContextNone {
+ predicates = append(predicates, c)
+ }
+ }
+
+ return predicates
+}
+
+func (b *ATNConfigSet) OptimizeConfigs(interpreter *BaseATNSimulator) {
+ if b.readOnly {
+ panic("set is read-only")
+ }
+
+ // Empty indicate no optimization is possible
+ if b.configLookup == nil || b.configLookup.Len() == 0 {
+ return
+ }
+
+ for i := 0; i < len(b.configs); i++ {
+ config := b.configs[i]
+ config.SetContext(interpreter.getCachedContext(config.GetContext()))
+ }
+}
+
+func (b *ATNConfigSet) AddAll(coll []*ATNConfig) bool {
+ for i := 0; i < len(coll); i++ {
+ b.Add(coll[i], nil)
+ }
+
+ return false
+}
+
+// Compare The configs are only equal if they are in the same order and their Equals function returns true.
+// Java uses ArrayList.equals(), which requires the same order.
+func (b *ATNConfigSet) Compare(bs *ATNConfigSet) bool {
+ if len(b.configs) != len(bs.configs) {
+ return false
+ }
+ for i := 0; i < len(b.configs); i++ {
+ if !b.configs[i].Equals(bs.configs[i]) {
+ return false
+ }
+ }
+
+ return true
+}
+
+func (b *ATNConfigSet) Equals(other Collectable[ATNConfig]) bool {
+ if b == other {
+ return true
+ } else if _, ok := other.(*ATNConfigSet); !ok {
+ return false
+ }
+
+ other2 := other.(*ATNConfigSet)
+ var eca bool
+ switch {
+ case b.conflictingAlts == nil && other2.conflictingAlts == nil:
+ eca = true
+ case b.conflictingAlts != nil && other2.conflictingAlts != nil:
+ eca = b.conflictingAlts.equals(other2.conflictingAlts)
+ }
+ return b.configs != nil &&
+ b.fullCtx == other2.fullCtx &&
+ b.uniqueAlt == other2.uniqueAlt &&
+ eca &&
+ b.hasSemanticContext == other2.hasSemanticContext &&
+ b.dipsIntoOuterContext == other2.dipsIntoOuterContext &&
+ b.Compare(other2)
+}
+
+func (b *ATNConfigSet) Hash() int {
+ if b.readOnly {
+ if b.cachedHash == -1 {
+ b.cachedHash = b.hashCodeConfigs()
+ }
+
+ return b.cachedHash
+ }
+
+ return b.hashCodeConfigs()
+}
+
+func (b *ATNConfigSet) hashCodeConfigs() int {
+ h := 1
+ for _, config := range b.configs {
+ h = 31*h + config.Hash()
+ }
+ return h
+}
+
+func (b *ATNConfigSet) Contains(item *ATNConfig) bool {
+ if b.readOnly {
+ panic("not implemented for read-only sets")
+ }
+ if b.configLookup == nil {
+ return false
+ }
+ return b.configLookup.Contains(item)
+}
+
+func (b *ATNConfigSet) ContainsFast(item *ATNConfig) bool {
+ return b.Contains(item)
+}
+
+func (b *ATNConfigSet) Clear() {
+ if b.readOnly {
+ panic("set is read-only")
+ }
+ b.configs = make([]*ATNConfig, 0)
+ b.cachedHash = -1
+ b.configLookup = NewJStore[*ATNConfig, Comparator[*ATNConfig]](aConfCompInst, ATNConfigLookupCollection, "NewATNConfigSet()")
+}
+
+func (b *ATNConfigSet) String() string {
+
+ s := "["
+
+ for i, c := range b.configs {
+ s += c.String()
+
+ if i != len(b.configs)-1 {
+ s += ", "
+ }
+ }
+
+ s += "]"
+
+ if b.hasSemanticContext {
+ s += ",hasSemanticContext=" + fmt.Sprint(b.hasSemanticContext)
+ }
+
+ if b.uniqueAlt != ATNInvalidAltNumber {
+ s += ",uniqueAlt=" + fmt.Sprint(b.uniqueAlt)
+ }
+
+ if b.conflictingAlts != nil {
+ s += ",conflictingAlts=" + b.conflictingAlts.String()
+ }
+
+ if b.dipsIntoOuterContext {
+ s += ",dipsIntoOuterContext"
+ }
+
+ return s
+}
+
+// NewOrderedATNConfigSet creates a config set with a slightly different Hash/Equal pair
+// for use in lexers.
+func NewOrderedATNConfigSet() *ATNConfigSet {
+ return &ATNConfigSet{
+ cachedHash: -1,
+ // This set uses the standard Hash() and Equals() from ATNConfig
+ configLookup: NewJStore[*ATNConfig, Comparator[*ATNConfig]](aConfEqInst, ATNConfigCollection, "ATNConfigSet.NewOrderedATNConfigSet()"),
+ fullCtx: false,
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_deserialization_options.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_deserialization_options.go
new file mode 100644
index 0000000..bdb30b3
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_deserialization_options.go
@@ -0,0 +1,62 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import "errors"
+
+var defaultATNDeserializationOptions = ATNDeserializationOptions{true, true, false}
+
+type ATNDeserializationOptions struct {
+ readOnly bool
+ verifyATN bool
+ generateRuleBypassTransitions bool
+}
+
+func (opts *ATNDeserializationOptions) ReadOnly() bool {
+ return opts.readOnly
+}
+
+func (opts *ATNDeserializationOptions) SetReadOnly(readOnly bool) {
+ if opts.readOnly {
+ panic(errors.New("cannot mutate read only ATNDeserializationOptions"))
+ }
+ opts.readOnly = readOnly
+}
+
+func (opts *ATNDeserializationOptions) VerifyATN() bool {
+ return opts.verifyATN
+}
+
+func (opts *ATNDeserializationOptions) SetVerifyATN(verifyATN bool) {
+ if opts.readOnly {
+ panic(errors.New("cannot mutate read only ATNDeserializationOptions"))
+ }
+ opts.verifyATN = verifyATN
+}
+
+func (opts *ATNDeserializationOptions) GenerateRuleBypassTransitions() bool {
+ return opts.generateRuleBypassTransitions
+}
+
+func (opts *ATNDeserializationOptions) SetGenerateRuleBypassTransitions(generateRuleBypassTransitions bool) {
+ if opts.readOnly {
+ panic(errors.New("cannot mutate read only ATNDeserializationOptions"))
+ }
+ opts.generateRuleBypassTransitions = generateRuleBypassTransitions
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func DefaultATNDeserializationOptions() *ATNDeserializationOptions {
+ return NewATNDeserializationOptions(&defaultATNDeserializationOptions)
+}
+
+func NewATNDeserializationOptions(other *ATNDeserializationOptions) *ATNDeserializationOptions {
+ o := new(ATNDeserializationOptions)
+ if other != nil {
+ *o = *other
+ o.readOnly = false
+ }
+ return o
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_deserializer.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_deserializer.go
new file mode 100644
index 0000000..2dcb9ae
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_deserializer.go
@@ -0,0 +1,684 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strconv"
+)
+
+const serializedVersion = 4
+
+type loopEndStateIntPair struct {
+ item0 *LoopEndState
+ item1 int
+}
+
+type blockStartStateIntPair struct {
+ item0 BlockStartState
+ item1 int
+}
+
+type ATNDeserializer struct {
+ options *ATNDeserializationOptions
+ data []int32
+ pos int
+}
+
+func NewATNDeserializer(options *ATNDeserializationOptions) *ATNDeserializer {
+ if options == nil {
+ options = &defaultATNDeserializationOptions
+ }
+
+ return &ATNDeserializer{options: options}
+}
+
+//goland:noinspection GoUnusedFunction
+func stringInSlice(a string, list []string) int {
+ for i, b := range list {
+ if b == a {
+ return i
+ }
+ }
+
+ return -1
+}
+
+func (a *ATNDeserializer) Deserialize(data []int32) *ATN {
+ a.data = data
+ a.pos = 0
+ a.checkVersion()
+
+ atn := a.readATN()
+
+ a.readStates(atn)
+ a.readRules(atn)
+ a.readModes(atn)
+
+ sets := a.readSets(atn, nil)
+
+ a.readEdges(atn, sets)
+ a.readDecisions(atn)
+ a.readLexerActions(atn)
+ a.markPrecedenceDecisions(atn)
+ a.verifyATN(atn)
+
+ if a.options.GenerateRuleBypassTransitions() && atn.grammarType == ATNTypeParser {
+ a.generateRuleBypassTransitions(atn)
+ // Re-verify after modification
+ a.verifyATN(atn)
+ }
+
+ return atn
+
+}
+
+func (a *ATNDeserializer) checkVersion() {
+ version := a.readInt()
+
+ if version != serializedVersion {
+ panic("Could not deserialize ATN with version " + strconv.Itoa(version) + " (expected " + strconv.Itoa(serializedVersion) + ").")
+ }
+}
+
+func (a *ATNDeserializer) readATN() *ATN {
+ grammarType := a.readInt()
+ maxTokenType := a.readInt()
+
+ return NewATN(grammarType, maxTokenType)
+}
+
+func (a *ATNDeserializer) readStates(atn *ATN) {
+ nstates := a.readInt()
+
+ // Allocate worst case size.
+ loopBackStateNumbers := make([]loopEndStateIntPair, 0, nstates)
+ endStateNumbers := make([]blockStartStateIntPair, 0, nstates)
+
+ // Preallocate states slice.
+ atn.states = make([]ATNState, 0, nstates)
+
+ for i := 0; i < nstates; i++ {
+ stype := a.readInt()
+
+ // Ignore bad types of states
+ if stype == ATNStateInvalidType {
+ atn.addState(nil)
+ continue
+ }
+
+ ruleIndex := a.readInt()
+
+ s := a.stateFactory(stype, ruleIndex)
+
+ if stype == ATNStateLoopEnd {
+ loopBackStateNumber := a.readInt()
+
+ loopBackStateNumbers = append(loopBackStateNumbers, loopEndStateIntPair{s.(*LoopEndState), loopBackStateNumber})
+ } else if s2, ok := s.(BlockStartState); ok {
+ endStateNumber := a.readInt()
+
+ endStateNumbers = append(endStateNumbers, blockStartStateIntPair{s2, endStateNumber})
+ }
+
+ atn.addState(s)
+ }
+
+ // Delay the assignment of loop back and end states until we know all the state
+ // instances have been initialized
+ for _, pair := range loopBackStateNumbers {
+ pair.item0.loopBackState = atn.states[pair.item1]
+ }
+
+ for _, pair := range endStateNumbers {
+ pair.item0.setEndState(atn.states[pair.item1].(*BlockEndState))
+ }
+
+ numNonGreedyStates := a.readInt()
+ for j := 0; j < numNonGreedyStates; j++ {
+ stateNumber := a.readInt()
+
+ atn.states[stateNumber].(DecisionState).setNonGreedy(true)
+ }
+
+ numPrecedenceStates := a.readInt()
+ for j := 0; j < numPrecedenceStates; j++ {
+ stateNumber := a.readInt()
+
+ atn.states[stateNumber].(*RuleStartState).isPrecedenceRule = true
+ }
+}
+
+func (a *ATNDeserializer) readRules(atn *ATN) {
+ nrules := a.readInt()
+
+ if atn.grammarType == ATNTypeLexer {
+ atn.ruleToTokenType = make([]int, nrules)
+ }
+
+ atn.ruleToStartState = make([]*RuleStartState, nrules)
+
+ for i := range atn.ruleToStartState {
+ s := a.readInt()
+ startState := atn.states[s].(*RuleStartState)
+
+ atn.ruleToStartState[i] = startState
+
+ if atn.grammarType == ATNTypeLexer {
+ tokenType := a.readInt()
+
+ atn.ruleToTokenType[i] = tokenType
+ }
+ }
+
+ atn.ruleToStopState = make([]*RuleStopState, nrules)
+
+ for _, state := range atn.states {
+ if s2, ok := state.(*RuleStopState); ok {
+ atn.ruleToStopState[s2.ruleIndex] = s2
+ atn.ruleToStartState[s2.ruleIndex].stopState = s2
+ }
+ }
+}
+
+func (a *ATNDeserializer) readModes(atn *ATN) {
+ nmodes := a.readInt()
+ atn.modeToStartState = make([]*TokensStartState, nmodes)
+
+ for i := range atn.modeToStartState {
+ s := a.readInt()
+
+ atn.modeToStartState[i] = atn.states[s].(*TokensStartState)
+ }
+}
+
+func (a *ATNDeserializer) readSets(_ *ATN, sets []*IntervalSet) []*IntervalSet {
+ m := a.readInt()
+
+ // Preallocate the needed capacity.
+ if cap(sets)-len(sets) < m {
+ isets := make([]*IntervalSet, len(sets), len(sets)+m)
+ copy(isets, sets)
+ sets = isets
+ }
+
+ for i := 0; i < m; i++ {
+ iset := NewIntervalSet()
+
+ sets = append(sets, iset)
+
+ n := a.readInt()
+ containsEOF := a.readInt()
+
+ if containsEOF != 0 {
+ iset.addOne(-1)
+ }
+
+ for j := 0; j < n; j++ {
+ i1 := a.readInt()
+ i2 := a.readInt()
+
+ iset.addRange(i1, i2)
+ }
+ }
+
+ return sets
+}
+
+func (a *ATNDeserializer) readEdges(atn *ATN, sets []*IntervalSet) {
+ nedges := a.readInt()
+
+ for i := 0; i < nedges; i++ {
+ var (
+ src = a.readInt()
+ trg = a.readInt()
+ ttype = a.readInt()
+ arg1 = a.readInt()
+ arg2 = a.readInt()
+ arg3 = a.readInt()
+ trans = a.edgeFactory(atn, ttype, src, trg, arg1, arg2, arg3, sets)
+ srcState = atn.states[src]
+ )
+
+ srcState.AddTransition(trans, -1)
+ }
+
+ // Edges for rule stop states can be derived, so they are not serialized
+ for _, state := range atn.states {
+ for _, t := range state.GetTransitions() {
+ var rt, ok = t.(*RuleTransition)
+
+ if !ok {
+ continue
+ }
+
+ outermostPrecedenceReturn := -1
+
+ if atn.ruleToStartState[rt.getTarget().GetRuleIndex()].isPrecedenceRule {
+ if rt.precedence == 0 {
+ outermostPrecedenceReturn = rt.getTarget().GetRuleIndex()
+ }
+ }
+
+ trans := NewEpsilonTransition(rt.followState, outermostPrecedenceReturn)
+
+ atn.ruleToStopState[rt.getTarget().GetRuleIndex()].AddTransition(trans, -1)
+ }
+ }
+
+ for _, state := range atn.states {
+ if s2, ok := state.(BlockStartState); ok {
+ // We need to know the end state to set its start state
+ if s2.getEndState() == nil {
+ panic("IllegalState")
+ }
+
+ // Block end states can only be associated to a single block start state
+ if s2.getEndState().startState != nil {
+ panic("IllegalState")
+ }
+
+ s2.getEndState().startState = state
+ }
+
+ if s2, ok := state.(*PlusLoopbackState); ok {
+ for _, t := range s2.GetTransitions() {
+ if t2, ok := t.getTarget().(*PlusBlockStartState); ok {
+ t2.loopBackState = state
+ }
+ }
+ } else if s2, ok := state.(*StarLoopbackState); ok {
+ for _, t := range s2.GetTransitions() {
+ if t2, ok := t.getTarget().(*StarLoopEntryState); ok {
+ t2.loopBackState = state
+ }
+ }
+ }
+ }
+}
+
+func (a *ATNDeserializer) readDecisions(atn *ATN) {
+ ndecisions := a.readInt()
+
+ for i := 0; i < ndecisions; i++ {
+ s := a.readInt()
+ decState := atn.states[s].(DecisionState)
+
+ atn.DecisionToState = append(atn.DecisionToState, decState)
+ decState.setDecision(i)
+ }
+}
+
+func (a *ATNDeserializer) readLexerActions(atn *ATN) {
+ if atn.grammarType == ATNTypeLexer {
+ count := a.readInt()
+
+ atn.lexerActions = make([]LexerAction, count)
+
+ for i := range atn.lexerActions {
+ actionType := a.readInt()
+ data1 := a.readInt()
+ data2 := a.readInt()
+ atn.lexerActions[i] = a.lexerActionFactory(actionType, data1, data2)
+ }
+ }
+}
+
+func (a *ATNDeserializer) generateRuleBypassTransitions(atn *ATN) {
+ count := len(atn.ruleToStartState)
+
+ for i := 0; i < count; i++ {
+ atn.ruleToTokenType[i] = atn.maxTokenType + i + 1
+ }
+
+ for i := 0; i < count; i++ {
+ a.generateRuleBypassTransition(atn, i)
+ }
+}
+
+func (a *ATNDeserializer) generateRuleBypassTransition(atn *ATN, idx int) {
+ bypassStart := NewBasicBlockStartState()
+
+ bypassStart.ruleIndex = idx
+ atn.addState(bypassStart)
+
+ bypassStop := NewBlockEndState()
+
+ bypassStop.ruleIndex = idx
+ atn.addState(bypassStop)
+
+ bypassStart.endState = bypassStop
+
+ atn.defineDecisionState(&bypassStart.BaseDecisionState)
+
+ bypassStop.startState = bypassStart
+
+ var excludeTransition Transition
+ var endState ATNState
+
+ if atn.ruleToStartState[idx].isPrecedenceRule {
+ // Wrap from the beginning of the rule to the StarLoopEntryState
+ endState = nil
+
+ for i := 0; i < len(atn.states); i++ {
+ state := atn.states[i]
+
+ if a.stateIsEndStateFor(state, idx) != nil {
+ endState = state
+ excludeTransition = state.(*StarLoopEntryState).loopBackState.GetTransitions()[0]
+
+ break
+ }
+ }
+
+ if excludeTransition == nil {
+ panic("Couldn't identify final state of the precedence rule prefix section.")
+ }
+ } else {
+ endState = atn.ruleToStopState[idx]
+ }
+
+ // All non-excluded transitions that currently target end state need to target
+ // blockEnd instead
+ for i := 0; i < len(atn.states); i++ {
+ state := atn.states[i]
+
+ for j := 0; j < len(state.GetTransitions()); j++ {
+ transition := state.GetTransitions()[j]
+
+ if transition == excludeTransition {
+ continue
+ }
+
+ if transition.getTarget() == endState {
+ transition.setTarget(bypassStop)
+ }
+ }
+ }
+
+ // All transitions leaving the rule start state need to leave blockStart instead
+ ruleToStartState := atn.ruleToStartState[idx]
+ count := len(ruleToStartState.GetTransitions())
+
+ for count > 0 {
+ bypassStart.AddTransition(ruleToStartState.GetTransitions()[count-1], -1)
+ ruleToStartState.SetTransitions([]Transition{ruleToStartState.GetTransitions()[len(ruleToStartState.GetTransitions())-1]})
+ }
+
+ // Link the new states
+ atn.ruleToStartState[idx].AddTransition(NewEpsilonTransition(bypassStart, -1), -1)
+ bypassStop.AddTransition(NewEpsilonTransition(endState, -1), -1)
+
+ MatchState := NewBasicState()
+
+ atn.addState(MatchState)
+ MatchState.AddTransition(NewAtomTransition(bypassStop, atn.ruleToTokenType[idx]), -1)
+ bypassStart.AddTransition(NewEpsilonTransition(MatchState, -1), -1)
+}
+
+func (a *ATNDeserializer) stateIsEndStateFor(state ATNState, idx int) ATNState {
+ if state.GetRuleIndex() != idx {
+ return nil
+ }
+
+ if _, ok := state.(*StarLoopEntryState); !ok {
+ return nil
+ }
+
+ maybeLoopEndState := state.GetTransitions()[len(state.GetTransitions())-1].getTarget()
+
+ if _, ok := maybeLoopEndState.(*LoopEndState); !ok {
+ return nil
+ }
+
+ var _, ok = maybeLoopEndState.GetTransitions()[0].getTarget().(*RuleStopState)
+
+ if maybeLoopEndState.(*LoopEndState).epsilonOnlyTransitions && ok {
+ return state
+ }
+
+ return nil
+}
+
+// markPrecedenceDecisions analyzes the StarLoopEntryState states in the
+// specified ATN to set the StarLoopEntryState.precedenceRuleDecision field to
+// the correct value.
+func (a *ATNDeserializer) markPrecedenceDecisions(atn *ATN) {
+ for _, state := range atn.states {
+ if _, ok := state.(*StarLoopEntryState); !ok {
+ continue
+ }
+
+ // We analyze the [ATN] to determine if an ATN decision state is the
+ // decision for the closure block that determines whether a
+ // precedence rule should continue or complete.
+ if atn.ruleToStartState[state.GetRuleIndex()].isPrecedenceRule {
+ maybeLoopEndState := state.GetTransitions()[len(state.GetTransitions())-1].getTarget()
+
+ if s3, ok := maybeLoopEndState.(*LoopEndState); ok {
+ var _, ok2 = maybeLoopEndState.GetTransitions()[0].getTarget().(*RuleStopState)
+
+ if s3.epsilonOnlyTransitions && ok2 {
+ state.(*StarLoopEntryState).precedenceRuleDecision = true
+ }
+ }
+ }
+ }
+}
+
+func (a *ATNDeserializer) verifyATN(atn *ATN) {
+ if !a.options.VerifyATN() {
+ return
+ }
+
+ // Verify assumptions
+ for _, state := range atn.states {
+ if state == nil {
+ continue
+ }
+
+ a.checkCondition(state.GetEpsilonOnlyTransitions() || len(state.GetTransitions()) <= 1, "")
+
+ switch s2 := state.(type) {
+ case *PlusBlockStartState:
+ a.checkCondition(s2.loopBackState != nil, "")
+
+ case *StarLoopEntryState:
+ a.checkCondition(s2.loopBackState != nil, "")
+ a.checkCondition(len(s2.GetTransitions()) == 2, "")
+
+ switch s2.transitions[0].getTarget().(type) {
+ case *StarBlockStartState:
+ _, ok := s2.transitions[1].getTarget().(*LoopEndState)
+
+ a.checkCondition(ok, "")
+ a.checkCondition(!s2.nonGreedy, "")
+
+ case *LoopEndState:
+ var _, ok = s2.transitions[1].getTarget().(*StarBlockStartState)
+
+ a.checkCondition(ok, "")
+ a.checkCondition(s2.nonGreedy, "")
+
+ default:
+ panic("IllegalState")
+ }
+
+ case *StarLoopbackState:
+ a.checkCondition(len(state.GetTransitions()) == 1, "")
+
+ var _, ok = state.GetTransitions()[0].getTarget().(*StarLoopEntryState)
+
+ a.checkCondition(ok, "")
+
+ case *LoopEndState:
+ a.checkCondition(s2.loopBackState != nil, "")
+
+ case *RuleStartState:
+ a.checkCondition(s2.stopState != nil, "")
+
+ case BlockStartState:
+ a.checkCondition(s2.getEndState() != nil, "")
+
+ case *BlockEndState:
+ a.checkCondition(s2.startState != nil, "")
+
+ case DecisionState:
+ a.checkCondition(len(s2.GetTransitions()) <= 1 || s2.getDecision() >= 0, "")
+
+ default:
+ var _, ok = s2.(*RuleStopState)
+
+ a.checkCondition(len(s2.GetTransitions()) <= 1 || ok, "")
+ }
+ }
+}
+
+func (a *ATNDeserializer) checkCondition(condition bool, message string) {
+ if !condition {
+ if message == "" {
+ message = "IllegalState"
+ }
+
+ panic(message)
+ }
+}
+
+func (a *ATNDeserializer) readInt() int {
+ v := a.data[a.pos]
+
+ a.pos++
+
+ return int(v) // data is 32 bits but int is at least that big
+}
+
+func (a *ATNDeserializer) edgeFactory(atn *ATN, typeIndex, _, trg, arg1, arg2, arg3 int, sets []*IntervalSet) Transition {
+ target := atn.states[trg]
+
+ switch typeIndex {
+ case TransitionEPSILON:
+ return NewEpsilonTransition(target, -1)
+
+ case TransitionRANGE:
+ if arg3 != 0 {
+ return NewRangeTransition(target, TokenEOF, arg2)
+ }
+
+ return NewRangeTransition(target, arg1, arg2)
+
+ case TransitionRULE:
+ return NewRuleTransition(atn.states[arg1], arg2, arg3, target)
+
+ case TransitionPREDICATE:
+ return NewPredicateTransition(target, arg1, arg2, arg3 != 0)
+
+ case TransitionPRECEDENCE:
+ return NewPrecedencePredicateTransition(target, arg1)
+
+ case TransitionATOM:
+ if arg3 != 0 {
+ return NewAtomTransition(target, TokenEOF)
+ }
+
+ return NewAtomTransition(target, arg1)
+
+ case TransitionACTION:
+ return NewActionTransition(target, arg1, arg2, arg3 != 0)
+
+ case TransitionSET:
+ return NewSetTransition(target, sets[arg1])
+
+ case TransitionNOTSET:
+ return NewNotSetTransition(target, sets[arg1])
+
+ case TransitionWILDCARD:
+ return NewWildcardTransition(target)
+ }
+
+ panic("The specified transition type is not valid.")
+}
+
+func (a *ATNDeserializer) stateFactory(typeIndex, ruleIndex int) ATNState {
+ var s ATNState
+
+ switch typeIndex {
+ case ATNStateInvalidType:
+ return nil
+
+ case ATNStateBasic:
+ s = NewBasicState()
+
+ case ATNStateRuleStart:
+ s = NewRuleStartState()
+
+ case ATNStateBlockStart:
+ s = NewBasicBlockStartState()
+
+ case ATNStatePlusBlockStart:
+ s = NewPlusBlockStartState()
+
+ case ATNStateStarBlockStart:
+ s = NewStarBlockStartState()
+
+ case ATNStateTokenStart:
+ s = NewTokensStartState()
+
+ case ATNStateRuleStop:
+ s = NewRuleStopState()
+
+ case ATNStateBlockEnd:
+ s = NewBlockEndState()
+
+ case ATNStateStarLoopBack:
+ s = NewStarLoopbackState()
+
+ case ATNStateStarLoopEntry:
+ s = NewStarLoopEntryState()
+
+ case ATNStatePlusLoopBack:
+ s = NewPlusLoopbackState()
+
+ case ATNStateLoopEnd:
+ s = NewLoopEndState()
+
+ default:
+ panic(fmt.Sprintf("state type %d is invalid", typeIndex))
+ }
+
+ s.SetRuleIndex(ruleIndex)
+
+ return s
+}
+
+func (a *ATNDeserializer) lexerActionFactory(typeIndex, data1, data2 int) LexerAction {
+ switch typeIndex {
+ case LexerActionTypeChannel:
+ return NewLexerChannelAction(data1)
+
+ case LexerActionTypeCustom:
+ return NewLexerCustomAction(data1, data2)
+
+ case LexerActionTypeMode:
+ return NewLexerModeAction(data1)
+
+ case LexerActionTypeMore:
+ return LexerMoreActionINSTANCE
+
+ case LexerActionTypePopMode:
+ return LexerPopModeActionINSTANCE
+
+ case LexerActionTypePushMode:
+ return NewLexerPushModeAction(data1)
+
+ case LexerActionTypeSkip:
+ return LexerSkipActionINSTANCE
+
+ case LexerActionTypeType:
+ return NewLexerTypeAction(data1)
+
+ default:
+ panic(fmt.Sprintf("lexer action %d is invalid", typeIndex))
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_simulator.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_simulator.go
new file mode 100644
index 0000000..afe6c9f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_simulator.go
@@ -0,0 +1,41 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+var ATNSimulatorError = NewDFAState(0x7FFFFFFF, NewATNConfigSet(false))
+
+type IATNSimulator interface {
+ SharedContextCache() *PredictionContextCache
+ ATN() *ATN
+ DecisionToDFA() []*DFA
+}
+
+type BaseATNSimulator struct {
+ atn *ATN
+ sharedContextCache *PredictionContextCache
+ decisionToDFA []*DFA
+}
+
+func (b *BaseATNSimulator) getCachedContext(context *PredictionContext) *PredictionContext {
+ if b.sharedContextCache == nil {
+ return context
+ }
+
+ //visited := NewJMap[*PredictionContext, *PredictionContext, Comparator[*PredictionContext]](pContextEqInst, PredictionVisitedCollection, "Visit map in getCachedContext()")
+ visited := NewVisitRecord()
+ return getCachedBasePredictionContext(context, b.sharedContextCache, visited)
+}
+
+func (b *BaseATNSimulator) SharedContextCache() *PredictionContextCache {
+ return b.sharedContextCache
+}
+
+func (b *BaseATNSimulator) ATN() *ATN {
+ return b.atn
+}
+
+func (b *BaseATNSimulator) DecisionToDFA() []*DFA {
+ return b.decisionToDFA
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_state.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_state.go
new file mode 100644
index 0000000..2ae5807
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_state.go
@@ -0,0 +1,461 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+)
+
+// Constants for serialization.
+const (
+ ATNStateInvalidType = 0
+ ATNStateBasic = 1
+ ATNStateRuleStart = 2
+ ATNStateBlockStart = 3
+ ATNStatePlusBlockStart = 4
+ ATNStateStarBlockStart = 5
+ ATNStateTokenStart = 6
+ ATNStateRuleStop = 7
+ ATNStateBlockEnd = 8
+ ATNStateStarLoopBack = 9
+ ATNStateStarLoopEntry = 10
+ ATNStatePlusLoopBack = 11
+ ATNStateLoopEnd = 12
+
+ ATNStateInvalidStateNumber = -1
+)
+
+//goland:noinspection GoUnusedGlobalVariable
+var ATNStateInitialNumTransitions = 4
+
+type ATNState interface {
+ GetEpsilonOnlyTransitions() bool
+
+ GetRuleIndex() int
+ SetRuleIndex(int)
+
+ GetNextTokenWithinRule() *IntervalSet
+ SetNextTokenWithinRule(*IntervalSet)
+
+ GetATN() *ATN
+ SetATN(*ATN)
+
+ GetStateType() int
+
+ GetStateNumber() int
+ SetStateNumber(int)
+
+ GetTransitions() []Transition
+ SetTransitions([]Transition)
+ AddTransition(Transition, int)
+
+ String() string
+ Hash() int
+ Equals(Collectable[ATNState]) bool
+}
+
+type BaseATNState struct {
+ // NextTokenWithinRule caches lookahead during parsing. Not used during construction.
+ NextTokenWithinRule *IntervalSet
+
+ // atn is the current ATN.
+ atn *ATN
+
+ epsilonOnlyTransitions bool
+
+ // ruleIndex tracks the Rule index because there are no Rule objects at runtime.
+ ruleIndex int
+
+ stateNumber int
+
+ stateType int
+
+ // Track the transitions emanating from this ATN state.
+ transitions []Transition
+}
+
+func NewATNState() *BaseATNState {
+ return &BaseATNState{stateNumber: ATNStateInvalidStateNumber, stateType: ATNStateInvalidType}
+}
+
+func (as *BaseATNState) GetRuleIndex() int {
+ return as.ruleIndex
+}
+
+func (as *BaseATNState) SetRuleIndex(v int) {
+ as.ruleIndex = v
+}
+func (as *BaseATNState) GetEpsilonOnlyTransitions() bool {
+ return as.epsilonOnlyTransitions
+}
+
+func (as *BaseATNState) GetATN() *ATN {
+ return as.atn
+}
+
+func (as *BaseATNState) SetATN(atn *ATN) {
+ as.atn = atn
+}
+
+func (as *BaseATNState) GetTransitions() []Transition {
+ return as.transitions
+}
+
+func (as *BaseATNState) SetTransitions(t []Transition) {
+ as.transitions = t
+}
+
+func (as *BaseATNState) GetStateType() int {
+ return as.stateType
+}
+
+func (as *BaseATNState) GetStateNumber() int {
+ return as.stateNumber
+}
+
+func (as *BaseATNState) SetStateNumber(stateNumber int) {
+ as.stateNumber = stateNumber
+}
+
+func (as *BaseATNState) GetNextTokenWithinRule() *IntervalSet {
+ return as.NextTokenWithinRule
+}
+
+func (as *BaseATNState) SetNextTokenWithinRule(v *IntervalSet) {
+ as.NextTokenWithinRule = v
+}
+
+func (as *BaseATNState) Hash() int {
+ return as.stateNumber
+}
+
+func (as *BaseATNState) String() string {
+ return strconv.Itoa(as.stateNumber)
+}
+
+func (as *BaseATNState) Equals(other Collectable[ATNState]) bool {
+ if ot, ok := other.(ATNState); ok {
+ return as.stateNumber == ot.GetStateNumber()
+ }
+
+ return false
+}
+
+func (as *BaseATNState) isNonGreedyExitState() bool {
+ return false
+}
+
+func (as *BaseATNState) AddTransition(trans Transition, index int) {
+ if len(as.transitions) == 0 {
+ as.epsilonOnlyTransitions = trans.getIsEpsilon()
+ } else if as.epsilonOnlyTransitions != trans.getIsEpsilon() {
+ _, _ = fmt.Fprintf(os.Stdin, "ATN state %d has both epsilon and non-epsilon transitions.\n", as.stateNumber)
+ as.epsilonOnlyTransitions = false
+ }
+
+ // TODO: Check code for already present compared to the Java equivalent
+ //alreadyPresent := false
+ //for _, t := range as.transitions {
+ // if t.getTarget().GetStateNumber() == trans.getTarget().GetStateNumber() {
+ // if t.getLabel() != nil && trans.getLabel() != nil && trans.getLabel().Equals(t.getLabel()) {
+ // alreadyPresent = true
+ // break
+ // }
+ // } else if t.getIsEpsilon() && trans.getIsEpsilon() {
+ // alreadyPresent = true
+ // break
+ // }
+ //}
+ //if !alreadyPresent {
+ if index == -1 {
+ as.transitions = append(as.transitions, trans)
+ } else {
+ as.transitions = append(as.transitions[:index], append([]Transition{trans}, as.transitions[index:]...)...)
+ // TODO: as.transitions.splice(index, 1, trans)
+ }
+ //} else {
+ // _, _ = fmt.Fprintf(os.Stderr, "Transition already present in state %d\n", as.stateNumber)
+ //}
+}
+
+type BasicState struct {
+ BaseATNState
+}
+
+func NewBasicState() *BasicState {
+ return &BasicState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateBasic,
+ },
+ }
+}
+
+type DecisionState interface {
+ ATNState
+
+ getDecision() int
+ setDecision(int)
+
+ getNonGreedy() bool
+ setNonGreedy(bool)
+}
+
+type BaseDecisionState struct {
+ BaseATNState
+ decision int
+ nonGreedy bool
+}
+
+func NewBaseDecisionState() *BaseDecisionState {
+ return &BaseDecisionState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateBasic,
+ },
+ decision: -1,
+ }
+}
+
+func (s *BaseDecisionState) getDecision() int {
+ return s.decision
+}
+
+func (s *BaseDecisionState) setDecision(b int) {
+ s.decision = b
+}
+
+func (s *BaseDecisionState) getNonGreedy() bool {
+ return s.nonGreedy
+}
+
+func (s *BaseDecisionState) setNonGreedy(b bool) {
+ s.nonGreedy = b
+}
+
+type BlockStartState interface {
+ DecisionState
+
+ getEndState() *BlockEndState
+ setEndState(*BlockEndState)
+}
+
+// BaseBlockStartState is the start of a regular (...) block.
+type BaseBlockStartState struct {
+ BaseDecisionState
+ endState *BlockEndState
+}
+
+func NewBlockStartState() *BaseBlockStartState {
+ return &BaseBlockStartState{
+ BaseDecisionState: BaseDecisionState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateBasic,
+ },
+ decision: -1,
+ },
+ }
+}
+
+func (s *BaseBlockStartState) getEndState() *BlockEndState {
+ return s.endState
+}
+
+func (s *BaseBlockStartState) setEndState(b *BlockEndState) {
+ s.endState = b
+}
+
+type BasicBlockStartState struct {
+ BaseBlockStartState
+}
+
+func NewBasicBlockStartState() *BasicBlockStartState {
+ return &BasicBlockStartState{
+ BaseBlockStartState: BaseBlockStartState{
+ BaseDecisionState: BaseDecisionState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateBlockStart,
+ },
+ },
+ },
+ }
+}
+
+var _ BlockStartState = &BasicBlockStartState{}
+
+// BlockEndState is a terminal node of a simple (a|b|c) block.
+type BlockEndState struct {
+ BaseATNState
+ startState ATNState
+}
+
+func NewBlockEndState() *BlockEndState {
+ return &BlockEndState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateBlockEnd,
+ },
+ startState: nil,
+ }
+}
+
+// RuleStopState is the last node in the ATN for a rule, unless that rule is the
+// start symbol. In that case, there is one transition to EOF. Later, we might
+// encode references to all calls to this rule to compute FOLLOW sets for error
+// handling.
+type RuleStopState struct {
+ BaseATNState
+}
+
+func NewRuleStopState() *RuleStopState {
+ return &RuleStopState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateRuleStop,
+ },
+ }
+}
+
+type RuleStartState struct {
+ BaseATNState
+ stopState ATNState
+ isPrecedenceRule bool
+}
+
+func NewRuleStartState() *RuleStartState {
+ return &RuleStartState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateRuleStart,
+ },
+ }
+}
+
+// PlusLoopbackState is a decision state for A+ and (A|B)+. It has two
+// transitions: one to the loop back to start of the block, and one to exit.
+type PlusLoopbackState struct {
+ BaseDecisionState
+}
+
+func NewPlusLoopbackState() *PlusLoopbackState {
+ return &PlusLoopbackState{
+ BaseDecisionState: BaseDecisionState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStatePlusLoopBack,
+ },
+ },
+ }
+}
+
+// PlusBlockStartState is the start of a (A|B|...)+ loop. Technically it is a
+// decision state; we don't use it for code generation. Somebody might need it,
+// it is included for completeness. In reality, PlusLoopbackState is the real
+// decision-making node for A+.
+type PlusBlockStartState struct {
+ BaseBlockStartState
+ loopBackState ATNState
+}
+
+func NewPlusBlockStartState() *PlusBlockStartState {
+ return &PlusBlockStartState{
+ BaseBlockStartState: BaseBlockStartState{
+ BaseDecisionState: BaseDecisionState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStatePlusBlockStart,
+ },
+ },
+ },
+ }
+}
+
+var _ BlockStartState = &PlusBlockStartState{}
+
+// StarBlockStartState is the block that begins a closure loop.
+type StarBlockStartState struct {
+ BaseBlockStartState
+}
+
+func NewStarBlockStartState() *StarBlockStartState {
+ return &StarBlockStartState{
+ BaseBlockStartState: BaseBlockStartState{
+ BaseDecisionState: BaseDecisionState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateStarBlockStart,
+ },
+ },
+ },
+ }
+}
+
+var _ BlockStartState = &StarBlockStartState{}
+
+type StarLoopbackState struct {
+ BaseATNState
+}
+
+func NewStarLoopbackState() *StarLoopbackState {
+ return &StarLoopbackState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateStarLoopBack,
+ },
+ }
+}
+
+type StarLoopEntryState struct {
+ BaseDecisionState
+ loopBackState ATNState
+ precedenceRuleDecision bool
+}
+
+func NewStarLoopEntryState() *StarLoopEntryState {
+ // False precedenceRuleDecision indicates whether s state can benefit from a precedence DFA during SLL decision making.
+ return &StarLoopEntryState{
+ BaseDecisionState: BaseDecisionState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateStarLoopEntry,
+ },
+ },
+ }
+}
+
+// LoopEndState marks the end of a * or + loop.
+type LoopEndState struct {
+ BaseATNState
+ loopBackState ATNState
+}
+
+func NewLoopEndState() *LoopEndState {
+ return &LoopEndState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateLoopEnd,
+ },
+ }
+}
+
+// TokensStartState is the Tokens rule start state linking to each lexer rule start state.
+type TokensStartState struct {
+ BaseDecisionState
+}
+
+func NewTokensStartState() *TokensStartState {
+ return &TokensStartState{
+ BaseDecisionState: BaseDecisionState{
+ BaseATNState: BaseATNState{
+ stateNumber: ATNStateInvalidStateNumber,
+ stateType: ATNStateTokenStart,
+ },
+ },
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_type.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_type.go
new file mode 100644
index 0000000..3a515a1
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/atn_type.go
@@ -0,0 +1,11 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+// Represent the type of recognizer an ATN applies to.
+const (
+ ATNTypeLexer = 0
+ ATNTypeParser = 1
+)
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/char_stream.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/char_stream.go
new file mode 100644
index 0000000..bd8127b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/char_stream.go
@@ -0,0 +1,12 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+type CharStream interface {
+ IntStream
+ GetText(int, int) string
+ GetTextFromTokens(start, end Token) string
+ GetTextFromInterval(Interval) string
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/common_token_factory.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/common_token_factory.go
new file mode 100644
index 0000000..1bb0314
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/common_token_factory.go
@@ -0,0 +1,56 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+// TokenFactory creates CommonToken objects.
+type TokenFactory interface {
+ Create(source *TokenSourceCharStreamPair, ttype int, text string, channel, start, stop, line, column int) Token
+}
+
+// CommonTokenFactory is the default TokenFactory implementation.
+type CommonTokenFactory struct {
+ // copyText indicates whether CommonToken.setText should be called after
+ // constructing tokens to explicitly set the text. This is useful for cases
+ // where the input stream might not be able to provide arbitrary substrings of
+ // text from the input after the lexer creates a token (e.g. the
+ // implementation of CharStream.GetText in UnbufferedCharStream panics an
+ // UnsupportedOperationException). Explicitly setting the token text allows
+ // Token.GetText to be called at any time regardless of the input stream
+ // implementation.
+ //
+ // The default value is false to avoid the performance and memory overhead of
+ // copying text for every token unless explicitly requested.
+ copyText bool
+}
+
+func NewCommonTokenFactory(copyText bool) *CommonTokenFactory {
+ return &CommonTokenFactory{copyText: copyText}
+}
+
+// CommonTokenFactoryDEFAULT is the default CommonTokenFactory. It does not
+// explicitly copy token text when constructing tokens.
+var CommonTokenFactoryDEFAULT = NewCommonTokenFactory(false)
+
+func (c *CommonTokenFactory) Create(source *TokenSourceCharStreamPair, ttype int, text string, channel, start, stop, line, column int) Token {
+ t := NewCommonToken(source, ttype, channel, start, stop)
+
+ t.line = line
+ t.column = column
+
+ if text != "" {
+ t.SetText(text)
+ } else if c.copyText && source.charStream != nil {
+ t.SetText(source.charStream.GetTextFromInterval(NewInterval(start, stop)))
+ }
+
+ return t
+}
+
+func (c *CommonTokenFactory) createThin(ttype int, text string) Token {
+ t := NewCommonToken(nil, ttype, TokenDefaultChannel, -1, -1)
+ t.SetText(text)
+
+ return t
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/common_token_stream.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/common_token_stream.go
new file mode 100644
index 0000000..b75da9d
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/common_token_stream.go
@@ -0,0 +1,450 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "strconv"
+)
+
+// CommonTokenStream is an implementation of TokenStream that loads tokens from
+// a TokenSource on-demand and places the tokens in a buffer to provide access
+// to any previous token by index. This token stream ignores the value of
+// Token.getChannel. If your parser requires the token stream filter tokens to
+// only those on a particular channel, such as Token.DEFAULT_CHANNEL or
+// Token.HIDDEN_CHANNEL, use a filtering token stream such a CommonTokenStream.
+type CommonTokenStream struct {
+ channel int
+
+ // fetchedEOF indicates whether the Token.EOF token has been fetched from
+ // tokenSource and added to tokens. This field improves performance for the
+ // following cases:
+ //
+ // consume: The lookahead check in consume to preven consuming the EOF symbol is
+ // optimized by checking the values of fetchedEOF and p instead of calling LA.
+ //
+ // fetch: The check to prevent adding multiple EOF symbols into tokens is
+ // trivial with bt field.
+ fetchedEOF bool
+
+ // index into [tokens] of the current token (next token to consume).
+ // tokens[p] should be LT(1). It is set to -1 when the stream is first
+ // constructed or when SetTokenSource is called, indicating that the first token
+ // has not yet been fetched from the token source. For additional information,
+ // see the documentation of [IntStream] for a description of initializing methods.
+ index int
+
+ // tokenSource is the [TokenSource] from which tokens for the bt stream are
+ // fetched.
+ tokenSource TokenSource
+
+ // tokens contains all tokens fetched from the token source. The list is considered a
+ // complete view of the input once fetchedEOF is set to true.
+ tokens []Token
+}
+
+// NewCommonTokenStream creates a new CommonTokenStream instance using the supplied lexer to produce
+// tokens and will pull tokens from the given lexer channel.
+func NewCommonTokenStream(lexer Lexer, channel int) *CommonTokenStream {
+ return &CommonTokenStream{
+ channel: channel,
+ index: -1,
+ tokenSource: lexer,
+ tokens: make([]Token, 0),
+ }
+}
+
+// GetAllTokens returns all tokens currently pulled from the token source.
+func (c *CommonTokenStream) GetAllTokens() []Token {
+ return c.tokens
+}
+
+func (c *CommonTokenStream) Mark() int {
+ return 0
+}
+
+func (c *CommonTokenStream) Release(_ int) {}
+
+func (c *CommonTokenStream) Reset() {
+ c.fetchedEOF = false
+ c.tokens = make([]Token, 0)
+ c.Seek(0)
+}
+
+func (c *CommonTokenStream) Seek(index int) {
+ c.lazyInit()
+ c.index = c.adjustSeekIndex(index)
+}
+
+func (c *CommonTokenStream) Get(index int) Token {
+ c.lazyInit()
+
+ return c.tokens[index]
+}
+
+func (c *CommonTokenStream) Consume() {
+ SkipEOFCheck := false
+
+ if c.index >= 0 {
+ if c.fetchedEOF {
+ // The last token in tokens is EOF. Skip the check if p indexes any fetched.
+ // token except the last.
+ SkipEOFCheck = c.index < len(c.tokens)-1
+ } else {
+ // No EOF token in tokens. Skip the check if p indexes a fetched token.
+ SkipEOFCheck = c.index < len(c.tokens)
+ }
+ } else {
+ // Not yet initialized
+ SkipEOFCheck = false
+ }
+
+ if !SkipEOFCheck && c.LA(1) == TokenEOF {
+ panic("cannot consume EOF")
+ }
+
+ if c.Sync(c.index + 1) {
+ c.index = c.adjustSeekIndex(c.index + 1)
+ }
+}
+
+// Sync makes sure index i in tokens has a token and returns true if a token is
+// located at index i and otherwise false.
+func (c *CommonTokenStream) Sync(i int) bool {
+ n := i - len(c.tokens) + 1 // How many more elements do we need?
+
+ if n > 0 {
+ fetched := c.fetch(n)
+ return fetched >= n
+ }
+
+ return true
+}
+
+// fetch adds n elements to buffer and returns the actual number of elements
+// added to the buffer.
+func (c *CommonTokenStream) fetch(n int) int {
+ if c.fetchedEOF {
+ return 0
+ }
+
+ for i := 0; i < n; i++ {
+ t := c.tokenSource.NextToken()
+
+ t.SetTokenIndex(len(c.tokens))
+ c.tokens = append(c.tokens, t)
+
+ if t.GetTokenType() == TokenEOF {
+ c.fetchedEOF = true
+
+ return i + 1
+ }
+ }
+
+ return n
+}
+
+// GetTokens gets all tokens from start to stop inclusive.
+func (c *CommonTokenStream) GetTokens(start int, stop int, types *IntervalSet) []Token {
+ if start < 0 || stop < 0 {
+ return nil
+ }
+
+ c.lazyInit()
+
+ subset := make([]Token, 0)
+
+ if stop >= len(c.tokens) {
+ stop = len(c.tokens) - 1
+ }
+
+ for i := start; i < stop; i++ {
+ t := c.tokens[i]
+
+ if t.GetTokenType() == TokenEOF {
+ break
+ }
+
+ if types == nil || types.contains(t.GetTokenType()) {
+ subset = append(subset, t)
+ }
+ }
+
+ return subset
+}
+
+func (c *CommonTokenStream) LA(i int) int {
+ return c.LT(i).GetTokenType()
+}
+
+func (c *CommonTokenStream) lazyInit() {
+ if c.index == -1 {
+ c.setup()
+ }
+}
+
+func (c *CommonTokenStream) setup() {
+ c.Sync(0)
+ c.index = c.adjustSeekIndex(0)
+}
+
+func (c *CommonTokenStream) GetTokenSource() TokenSource {
+ return c.tokenSource
+}
+
+// SetTokenSource resets the c token stream by setting its token source.
+func (c *CommonTokenStream) SetTokenSource(tokenSource TokenSource) {
+ c.tokenSource = tokenSource
+ c.tokens = make([]Token, 0)
+ c.index = -1
+ c.fetchedEOF = false
+}
+
+// NextTokenOnChannel returns the index of the next token on channel given a
+// starting index. Returns i if tokens[i] is on channel. Returns -1 if there are
+// no tokens on channel between 'i' and [TokenEOF].
+func (c *CommonTokenStream) NextTokenOnChannel(i, _ int) int {
+ c.Sync(i)
+
+ if i >= len(c.tokens) {
+ return -1
+ }
+
+ token := c.tokens[i]
+
+ for token.GetChannel() != c.channel {
+ if token.GetTokenType() == TokenEOF {
+ return -1
+ }
+
+ i++
+ c.Sync(i)
+ token = c.tokens[i]
+ }
+
+ return i
+}
+
+// previousTokenOnChannel returns the index of the previous token on channel
+// given a starting index. Returns i if tokens[i] is on channel. Returns -1 if
+// there are no tokens on channel between i and 0.
+func (c *CommonTokenStream) previousTokenOnChannel(i, channel int) int {
+ for i >= 0 && c.tokens[i].GetChannel() != channel {
+ i--
+ }
+
+ return i
+}
+
+// GetHiddenTokensToRight collects all tokens on a specified channel to the
+// right of the current token up until we see a token on DEFAULT_TOKEN_CHANNEL
+// or EOF. If channel is -1, it finds any non-default channel token.
+func (c *CommonTokenStream) GetHiddenTokensToRight(tokenIndex, channel int) []Token {
+ c.lazyInit()
+
+ if tokenIndex < 0 || tokenIndex >= len(c.tokens) {
+ panic(strconv.Itoa(tokenIndex) + " not in 0.." + strconv.Itoa(len(c.tokens)-1))
+ }
+
+ nextOnChannel := c.NextTokenOnChannel(tokenIndex+1, LexerDefaultTokenChannel)
+ from := tokenIndex + 1
+
+ // If no onChannel to the right, then nextOnChannel == -1, so set 'to' to the last token
+ var to int
+
+ if nextOnChannel == -1 {
+ to = len(c.tokens) - 1
+ } else {
+ to = nextOnChannel
+ }
+
+ return c.filterForChannel(from, to, channel)
+}
+
+// GetHiddenTokensToLeft collects all tokens on channel to the left of the
+// current token until we see a token on DEFAULT_TOKEN_CHANNEL. If channel is
+// -1, it finds any non default channel token.
+func (c *CommonTokenStream) GetHiddenTokensToLeft(tokenIndex, channel int) []Token {
+ c.lazyInit()
+
+ if tokenIndex < 0 || tokenIndex >= len(c.tokens) {
+ panic(strconv.Itoa(tokenIndex) + " not in 0.." + strconv.Itoa(len(c.tokens)-1))
+ }
+
+ prevOnChannel := c.previousTokenOnChannel(tokenIndex-1, LexerDefaultTokenChannel)
+
+ if prevOnChannel == tokenIndex-1 {
+ return nil
+ }
+
+ // If there are none on channel to the left and prevOnChannel == -1 then from = 0
+ from := prevOnChannel + 1
+ to := tokenIndex - 1
+
+ return c.filterForChannel(from, to, channel)
+}
+
+func (c *CommonTokenStream) filterForChannel(left, right, channel int) []Token {
+ hidden := make([]Token, 0)
+
+ for i := left; i < right+1; i++ {
+ t := c.tokens[i]
+
+ if channel == -1 {
+ if t.GetChannel() != LexerDefaultTokenChannel {
+ hidden = append(hidden, t)
+ }
+ } else if t.GetChannel() == channel {
+ hidden = append(hidden, t)
+ }
+ }
+
+ if len(hidden) == 0 {
+ return nil
+ }
+
+ return hidden
+}
+
+func (c *CommonTokenStream) GetSourceName() string {
+ return c.tokenSource.GetSourceName()
+}
+
+func (c *CommonTokenStream) Size() int {
+ return len(c.tokens)
+}
+
+func (c *CommonTokenStream) Index() int {
+ return c.index
+}
+
+func (c *CommonTokenStream) GetAllText() string {
+ c.Fill()
+ return c.GetTextFromInterval(NewInterval(0, len(c.tokens)-1))
+}
+
+func (c *CommonTokenStream) GetTextFromTokens(start, end Token) string {
+ if start == nil || end == nil {
+ return ""
+ }
+
+ return c.GetTextFromInterval(NewInterval(start.GetTokenIndex(), end.GetTokenIndex()))
+}
+
+func (c *CommonTokenStream) GetTextFromRuleContext(interval RuleContext) string {
+ return c.GetTextFromInterval(interval.GetSourceInterval())
+}
+
+func (c *CommonTokenStream) GetTextFromInterval(interval Interval) string {
+ c.lazyInit()
+ c.Sync(interval.Stop)
+
+ start := interval.Start
+ stop := interval.Stop
+
+ if start < 0 || stop < 0 {
+ return ""
+ }
+
+ if stop >= len(c.tokens) {
+ stop = len(c.tokens) - 1
+ }
+
+ s := ""
+
+ for i := start; i < stop+1; i++ {
+ t := c.tokens[i]
+
+ if t.GetTokenType() == TokenEOF {
+ break
+ }
+
+ s += t.GetText()
+ }
+
+ return s
+}
+
+// Fill gets all tokens from the lexer until EOF.
+func (c *CommonTokenStream) Fill() {
+ c.lazyInit()
+
+ for c.fetch(1000) == 1000 {
+ continue
+ }
+}
+
+func (c *CommonTokenStream) adjustSeekIndex(i int) int {
+ return c.NextTokenOnChannel(i, c.channel)
+}
+
+func (c *CommonTokenStream) LB(k int) Token {
+ if k == 0 || c.index-k < 0 {
+ return nil
+ }
+
+ i := c.index
+ n := 1
+
+ // Find k good tokens looking backward
+ for n <= k {
+ // Skip off-channel tokens
+ i = c.previousTokenOnChannel(i-1, c.channel)
+ n++
+ }
+
+ if i < 0 {
+ return nil
+ }
+
+ return c.tokens[i]
+}
+
+func (c *CommonTokenStream) LT(k int) Token {
+ c.lazyInit()
+
+ if k == 0 {
+ return nil
+ }
+
+ if k < 0 {
+ return c.LB(-k)
+ }
+
+ i := c.index
+ n := 1 // We know tokens[n] is valid
+
+ // Find k good tokens
+ for n < k {
+ // Skip off-channel tokens, but make sure to not look past EOF
+ if c.Sync(i + 1) {
+ i = c.NextTokenOnChannel(i+1, c.channel)
+ }
+
+ n++
+ }
+
+ return c.tokens[i]
+}
+
+// getNumberOfOnChannelTokens counts EOF once.
+func (c *CommonTokenStream) getNumberOfOnChannelTokens() int {
+ var n int
+
+ c.Fill()
+
+ for i := 0; i < len(c.tokens); i++ {
+ t := c.tokens[i]
+
+ if t.GetChannel() == c.channel {
+ n++
+ }
+
+ if t.GetTokenType() == TokenEOF {
+ break
+ }
+ }
+
+ return n
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/comparators.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/comparators.go
new file mode 100644
index 0000000..7467e9b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/comparators.go
@@ -0,0 +1,150 @@
+package antlr
+
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+// This file contains all the implementations of custom comparators used for generic collections when the
+// Hash() and Equals() funcs supplied by the struct objects themselves need to be overridden. Normally, we would
+// put the comparators in the source file for the struct themselves, but given the organization of this code is
+// sorta kinda based upon the Java code, I found it confusing trying to find out which comparator was where and used by
+// which instantiation of a collection. For instance, an Array2DHashSet in the Java source, when used with ATNConfig
+// collections requires three different comparators depending on what the collection is being used for. Collecting - pun intended -
+// all the comparators here, makes it much easier to see which implementation of hash and equals is used by which collection.
+// It also makes it easy to verify that the Hash() and Equals() functions marry up with the Java implementations.
+
+// ObjEqComparator is the equivalent of the Java ObjectEqualityComparator, which is the default instance of
+// Equality comparator. We do not have inheritance in Go, only interfaces, so we use generics to enforce some
+// type safety and avoid having to implement this for every type that we want to perform comparison on.
+//
+// This comparator works by using the standard Hash() and Equals() methods of the type T that is being compared. Which
+// allows us to use it in any collection instance that does not require a special hash or equals implementation.
+type ObjEqComparator[T Collectable[T]] struct{}
+
+var (
+ aStateEqInst = &ObjEqComparator[ATNState]{}
+ aConfEqInst = &ObjEqComparator[*ATNConfig]{}
+
+ // aConfCompInst is the comparator used for the ATNConfigSet for the configLookup cache
+ aConfCompInst = &ATNConfigComparator[*ATNConfig]{}
+ atnConfCompInst = &BaseATNConfigComparator[*ATNConfig]{}
+ dfaStateEqInst = &ObjEqComparator[*DFAState]{}
+ semctxEqInst = &ObjEqComparator[SemanticContext]{}
+ atnAltCfgEqInst = &ATNAltConfigComparator[*ATNConfig]{}
+ pContextEqInst = &ObjEqComparator[*PredictionContext]{}
+)
+
+// Equals2 delegates to the Equals() method of type T
+func (c *ObjEqComparator[T]) Equals2(o1, o2 T) bool {
+ return o1.Equals(o2)
+}
+
+// Hash1 delegates to the Hash() method of type T
+func (c *ObjEqComparator[T]) Hash1(o T) int {
+
+ return o.Hash()
+}
+
+type SemCComparator[T Collectable[T]] struct{}
+
+// ATNConfigComparator is used as the comparator for the configLookup field of an ATNConfigSet
+// and has a custom Equals() and Hash() implementation, because equality is not based on the
+// standard Hash() and Equals() methods of the ATNConfig type.
+type ATNConfigComparator[T Collectable[T]] struct {
+}
+
+// Equals2 is a custom comparator for ATNConfigs specifically for configLookup
+func (c *ATNConfigComparator[T]) Equals2(o1, o2 *ATNConfig) bool {
+
+ // Same pointer, must be equal, even if both nil
+ //
+ if o1 == o2 {
+ return true
+
+ }
+
+ // If either are nil, but not both, then the result is false
+ //
+ if o1 == nil || o2 == nil {
+ return false
+ }
+
+ return o1.GetState().GetStateNumber() == o2.GetState().GetStateNumber() &&
+ o1.GetAlt() == o2.GetAlt() &&
+ o1.GetSemanticContext().Equals(o2.GetSemanticContext())
+}
+
+// Hash1 is custom hash implementation for ATNConfigs specifically for configLookup
+func (c *ATNConfigComparator[T]) Hash1(o *ATNConfig) int {
+
+ hash := 7
+ hash = 31*hash + o.GetState().GetStateNumber()
+ hash = 31*hash + o.GetAlt()
+ hash = 31*hash + o.GetSemanticContext().Hash()
+ return hash
+}
+
+// ATNAltConfigComparator is used as the comparator for mapping configs to Alt Bitsets
+type ATNAltConfigComparator[T Collectable[T]] struct {
+}
+
+// Equals2 is a custom comparator for ATNConfigs specifically for configLookup
+func (c *ATNAltConfigComparator[T]) Equals2(o1, o2 *ATNConfig) bool {
+
+ // Same pointer, must be equal, even if both nil
+ //
+ if o1 == o2 {
+ return true
+
+ }
+
+ // If either are nil, but not both, then the result is false
+ //
+ if o1 == nil || o2 == nil {
+ return false
+ }
+
+ return o1.GetState().GetStateNumber() == o2.GetState().GetStateNumber() &&
+ o1.GetContext().Equals(o2.GetContext())
+}
+
+// Hash1 is custom hash implementation for ATNConfigs specifically for configLookup
+func (c *ATNAltConfigComparator[T]) Hash1(o *ATNConfig) int {
+ h := murmurInit(7)
+ h = murmurUpdate(h, o.GetState().GetStateNumber())
+ h = murmurUpdate(h, o.GetContext().Hash())
+ return murmurFinish(h, 2)
+}
+
+// BaseATNConfigComparator is used as the comparator for the configLookup field of a ATNConfigSet
+// and has a custom Equals() and Hash() implementation, because equality is not based on the
+// standard Hash() and Equals() methods of the ATNConfig type.
+type BaseATNConfigComparator[T Collectable[T]] struct {
+}
+
+// Equals2 is a custom comparator for ATNConfigs specifically for baseATNConfigSet
+func (c *BaseATNConfigComparator[T]) Equals2(o1, o2 *ATNConfig) bool {
+
+ // Same pointer, must be equal, even if both nil
+ //
+ if o1 == o2 {
+ return true
+
+ }
+
+ // If either are nil, but not both, then the result is false
+ //
+ if o1 == nil || o2 == nil {
+ return false
+ }
+
+ return o1.GetState().GetStateNumber() == o2.GetState().GetStateNumber() &&
+ o1.GetAlt() == o2.GetAlt() &&
+ o1.GetSemanticContext().Equals(o2.GetSemanticContext())
+}
+
+// Hash1 is custom hash implementation for ATNConfigs specifically for configLookup, but in fact just
+// delegates to the standard Hash() method of the ATNConfig type.
+func (c *BaseATNConfigComparator[T]) Hash1(o *ATNConfig) int {
+ return o.Hash()
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/configuration.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/configuration.go
new file mode 100644
index 0000000..c2b7245
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/configuration.go
@@ -0,0 +1,214 @@
+package antlr
+
+type runtimeConfiguration struct {
+ statsTraceStacks bool
+ lexerATNSimulatorDebug bool
+ lexerATNSimulatorDFADebug bool
+ parserATNSimulatorDebug bool
+ parserATNSimulatorTraceATNSim bool
+ parserATNSimulatorDFADebug bool
+ parserATNSimulatorRetryDebug bool
+ lRLoopEntryBranchOpt bool
+ memoryManager bool
+}
+
+// Global runtime configuration
+var runtimeConfig = runtimeConfiguration{
+ lRLoopEntryBranchOpt: true,
+}
+
+type runtimeOption func(*runtimeConfiguration) error
+
+// ConfigureRuntime allows the runtime to be configured globally setting things like trace and statistics options.
+// It uses the functional options pattern for go. This is a package global function as it operates on the runtime
+// configuration regardless of the instantiation of anything higher up such as a parser or lexer. Generally this is
+// used for debugging/tracing/statistics options, which are usually used by the runtime maintainers (or rather the
+// only maintainer). However, it is possible that you might want to use this to set a global option concerning the
+// memory allocation type used by the runtime such as sync.Pool or not.
+//
+// The options are applied in the order they are passed in, so the last option will override any previous options.
+//
+// For example, if you want to turn on the collection create point stack flag to true, you can do:
+//
+// antlr.ConfigureRuntime(antlr.WithStatsTraceStacks(true))
+//
+// If you want to turn it off, you can do:
+//
+// antlr.ConfigureRuntime(antlr.WithStatsTraceStacks(false))
+func ConfigureRuntime(options ...runtimeOption) error {
+ for _, option := range options {
+ err := option(&runtimeConfig)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// WithStatsTraceStacks sets the global flag indicating whether to collect stack traces at the create-point of
+// certain structs, such as collections, or the use point of certain methods such as Put().
+// Because this can be expensive, it is turned off by default. However, it
+// can be useful to track down exactly where memory is being created and used.
+//
+// Use:
+//
+// antlr.ConfigureRuntime(antlr.WithStatsTraceStacks(true))
+//
+// You can turn it off at any time using:
+//
+// antlr.ConfigureRuntime(antlr.WithStatsTraceStacks(false))
+func WithStatsTraceStacks(trace bool) runtimeOption {
+ return func(config *runtimeConfiguration) error {
+ config.statsTraceStacks = trace
+ return nil
+ }
+}
+
+// WithLexerATNSimulatorDebug sets the global flag indicating whether to log debug information from the lexer [ATN]
+// simulator. This is useful for debugging lexer issues by comparing the output with the Java runtime. Only useful
+// to the runtime maintainers.
+//
+// Use:
+//
+// antlr.ConfigureRuntime(antlr.WithLexerATNSimulatorDebug(true))
+//
+// You can turn it off at any time using:
+//
+// antlr.ConfigureRuntime(antlr.WithLexerATNSimulatorDebug(false))
+func WithLexerATNSimulatorDebug(debug bool) runtimeOption {
+ return func(config *runtimeConfiguration) error {
+ config.lexerATNSimulatorDebug = debug
+ return nil
+ }
+}
+
+// WithLexerATNSimulatorDFADebug sets the global flag indicating whether to log debug information from the lexer [ATN] [DFA]
+// simulator. This is useful for debugging lexer issues by comparing the output with the Java runtime. Only useful
+// to the runtime maintainers.
+//
+// Use:
+//
+// antlr.ConfigureRuntime(antlr.WithLexerATNSimulatorDFADebug(true))
+//
+// You can turn it off at any time using:
+//
+// antlr.ConfigureRuntime(antlr.WithLexerATNSimulatorDFADebug(false))
+func WithLexerATNSimulatorDFADebug(debug bool) runtimeOption {
+ return func(config *runtimeConfiguration) error {
+ config.lexerATNSimulatorDFADebug = debug
+ return nil
+ }
+}
+
+// WithParserATNSimulatorDebug sets the global flag indicating whether to log debug information from the parser [ATN]
+// simulator. This is useful for debugging parser issues by comparing the output with the Java runtime. Only useful
+// to the runtime maintainers.
+//
+// Use:
+//
+// antlr.ConfigureRuntime(antlr.WithParserATNSimulatorDebug(true))
+//
+// You can turn it off at any time using:
+//
+// antlr.ConfigureRuntime(antlr.WithParserATNSimulatorDebug(false))
+func WithParserATNSimulatorDebug(debug bool) runtimeOption {
+ return func(config *runtimeConfiguration) error {
+ config.parserATNSimulatorDebug = debug
+ return nil
+ }
+}
+
+// WithParserATNSimulatorTraceATNSim sets the global flag indicating whether to log trace information from the parser [ATN] simulator
+// [DFA]. This is useful for debugging parser issues by comparing the output with the Java runtime. Only useful
+// to the runtime maintainers.
+//
+// Use:
+//
+// antlr.ConfigureRuntime(antlr.WithParserATNSimulatorTraceATNSim(true))
+//
+// You can turn it off at any time using:
+//
+// antlr.ConfigureRuntime(antlr.WithParserATNSimulatorTraceATNSim(false))
+func WithParserATNSimulatorTraceATNSim(trace bool) runtimeOption {
+ return func(config *runtimeConfiguration) error {
+ config.parserATNSimulatorTraceATNSim = trace
+ return nil
+ }
+}
+
+// WithParserATNSimulatorDFADebug sets the global flag indicating whether to log debug information from the parser [ATN] [DFA]
+// simulator. This is useful for debugging parser issues by comparing the output with the Java runtime. Only useful
+// to the runtime maintainers.
+//
+// Use:
+//
+// antlr.ConfigureRuntime(antlr.WithParserATNSimulatorDFADebug(true))
+//
+// You can turn it off at any time using:
+//
+// antlr.ConfigureRuntime(antlr.WithParserATNSimulatorDFADebug(false))
+func WithParserATNSimulatorDFADebug(debug bool) runtimeOption {
+ return func(config *runtimeConfiguration) error {
+ config.parserATNSimulatorDFADebug = debug
+ return nil
+ }
+}
+
+// WithParserATNSimulatorRetryDebug sets the global flag indicating whether to log debug information from the parser [ATN] [DFA]
+// simulator when retrying a decision. This is useful for debugging parser issues by comparing the output with the Java runtime.
+// Only useful to the runtime maintainers.
+//
+// Use:
+//
+// antlr.ConfigureRuntime(antlr.WithParserATNSimulatorRetryDebug(true))
+//
+// You can turn it off at any time using:
+//
+// antlr.ConfigureRuntime(antlr.WithParserATNSimulatorRetryDebug(false))
+func WithParserATNSimulatorRetryDebug(debug bool) runtimeOption {
+ return func(config *runtimeConfiguration) error {
+ config.parserATNSimulatorRetryDebug = debug
+ return nil
+ }
+}
+
+// WithLRLoopEntryBranchOpt sets the global flag indicating whether let recursive loop operations should be
+// optimized or not. This is useful for debugging parser issues by comparing the output with the Java runtime.
+// It turns off the functionality of [canDropLoopEntryEdgeInLeftRecursiveRule] in [ParserATNSimulator].
+//
+// Note that default is to use this optimization.
+//
+// Use:
+//
+// antlr.ConfigureRuntime(antlr.WithLRLoopEntryBranchOpt(true))
+//
+// You can turn it off at any time using:
+//
+// antlr.ConfigureRuntime(antlr.WithLRLoopEntryBranchOpt(false))
+func WithLRLoopEntryBranchOpt(off bool) runtimeOption {
+ return func(config *runtimeConfiguration) error {
+ config.lRLoopEntryBranchOpt = off
+ return nil
+ }
+}
+
+// WithMemoryManager sets the global flag indicating whether to use the memory manager or not. This is useful
+// for poorly constructed grammars that create a lot of garbage. It turns on the functionality of [memoryManager], which
+// will intercept garbage collection and cause available memory to be reused. At the end of the day, this is no substitute
+// for fixing your grammar by ridding yourself of extreme ambiguity. BUt if you are just trying to reuse an opensource
+// grammar, this may help make it more practical.
+//
+// Note that default is to use normal Go memory allocation and not pool memory.
+//
+// Use:
+//
+// antlr.ConfigureRuntime(antlr.WithMemoryManager(true))
+//
+// Note that if you turn this on, you should probably leave it on. You should use only one memory strategy or the other
+// and should remember to nil out any references to the parser or lexer when you are done with them.
+func WithMemoryManager(use bool) runtimeOption {
+ return func(config *runtimeConfiguration) error {
+ config.memoryManager = use
+ return nil
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/dfa.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/dfa.go
new file mode 100644
index 0000000..6b63eb1
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/dfa.go
@@ -0,0 +1,175 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+// DFA represents the Deterministic Finite Automaton used by the recognizer, including all the states it can
+// reach and the transitions between them.
+type DFA struct {
+ // atnStartState is the ATN state in which this was created
+ atnStartState DecisionState
+
+ decision int
+
+ // states is all the DFA states. Use Map to get the old state back; Set can only
+ // indicate whether it is there. Go maps implement key hash collisions and so on and are very
+ // good, but the DFAState is an object and can't be used directly as the key as it can in say Java
+ // amd C#, whereby if the hashcode is the same for two objects, then Equals() is called against them
+ // to see if they really are the same object. Hence, we have our own map storage.
+ //
+ states *JStore[*DFAState, *ObjEqComparator[*DFAState]]
+
+ numstates int
+
+ s0 *DFAState
+
+ // precedenceDfa is the backing field for isPrecedenceDfa and setPrecedenceDfa.
+ // True if the DFA is for a precedence decision and false otherwise.
+ precedenceDfa bool
+}
+
+func NewDFA(atnStartState DecisionState, decision int) *DFA {
+ dfa := &DFA{
+ atnStartState: atnStartState,
+ decision: decision,
+ states: nil, // Lazy initialize
+ }
+ if s, ok := atnStartState.(*StarLoopEntryState); ok && s.precedenceRuleDecision {
+ dfa.precedenceDfa = true
+ dfa.s0 = NewDFAState(-1, NewATNConfigSet(false))
+ dfa.s0.isAcceptState = false
+ dfa.s0.requiresFullContext = false
+ }
+ return dfa
+}
+
+// getPrecedenceStartState gets the start state for the current precedence and
+// returns the start state corresponding to the specified precedence if a start
+// state exists for the specified precedence and nil otherwise. d must be a
+// precedence DFA. See also isPrecedenceDfa.
+func (d *DFA) getPrecedenceStartState(precedence int) *DFAState {
+ if !d.getPrecedenceDfa() {
+ panic("only precedence DFAs may contain a precedence start state")
+ }
+
+ // s0.edges is never nil for a precedence DFA
+ if precedence < 0 || precedence >= len(d.getS0().getEdges()) {
+ return nil
+ }
+
+ return d.getS0().getIthEdge(precedence)
+}
+
+// setPrecedenceStartState sets the start state for the current precedence. d
+// must be a precedence DFA. See also isPrecedenceDfa.
+func (d *DFA) setPrecedenceStartState(precedence int, startState *DFAState) {
+ if !d.getPrecedenceDfa() {
+ panic("only precedence DFAs may contain a precedence start state")
+ }
+
+ if precedence < 0 {
+ return
+ }
+
+ // Synchronization on s0 here is ok. When the DFA is turned into a
+ // precedence DFA, s0 will be initialized once and not updated again. s0.edges
+ // is never nil for a precedence DFA.
+ s0 := d.getS0()
+ if precedence >= s0.numEdges() {
+ edges := append(s0.getEdges(), make([]*DFAState, precedence+1-s0.numEdges())...)
+ s0.setEdges(edges)
+ d.setS0(s0)
+ }
+
+ s0.setIthEdge(precedence, startState)
+}
+
+func (d *DFA) getPrecedenceDfa() bool {
+ return d.precedenceDfa
+}
+
+// setPrecedenceDfa sets whether d is a precedence DFA. If precedenceDfa differs
+// from the current DFA configuration, then d.states is cleared, the initial
+// state s0 is set to a new DFAState with an empty outgoing DFAState.edges to
+// store the start states for individual precedence values if precedenceDfa is
+// true or nil otherwise, and d.precedenceDfa is updated.
+func (d *DFA) setPrecedenceDfa(precedenceDfa bool) {
+ if d.getPrecedenceDfa() != precedenceDfa {
+ d.states = nil // Lazy initialize
+ d.numstates = 0
+
+ if precedenceDfa {
+ precedenceState := NewDFAState(-1, NewATNConfigSet(false))
+ precedenceState.setEdges(make([]*DFAState, 0))
+ precedenceState.isAcceptState = false
+ precedenceState.requiresFullContext = false
+ d.setS0(precedenceState)
+ } else {
+ d.setS0(nil)
+ }
+
+ d.precedenceDfa = precedenceDfa
+ }
+}
+
+// Len returns the number of states in d. We use this instead of accessing states directly so that we can implement lazy
+// instantiation of the states JMap.
+func (d *DFA) Len() int {
+ if d.states == nil {
+ return 0
+ }
+ return d.states.Len()
+}
+
+// Get returns a state that matches s if it is present in the DFA state set. We defer to this
+// function instead of accessing states directly so that we can implement lazy instantiation of the states JMap.
+func (d *DFA) Get(s *DFAState) (*DFAState, bool) {
+ if d.states == nil {
+ return nil, false
+ }
+ return d.states.Get(s)
+}
+
+func (d *DFA) Put(s *DFAState) (*DFAState, bool) {
+ if d.states == nil {
+ d.states = NewJStore[*DFAState, *ObjEqComparator[*DFAState]](dfaStateEqInst, DFAStateCollection, "DFA via DFA.Put")
+ }
+ return d.states.Put(s)
+}
+
+func (d *DFA) getS0() *DFAState {
+ return d.s0
+}
+
+func (d *DFA) setS0(s *DFAState) {
+ d.s0 = s
+}
+
+// sortedStates returns the states in d sorted by their state number, or an empty set if d.states is nil.
+func (d *DFA) sortedStates() []*DFAState {
+ if d.states == nil {
+ return []*DFAState{}
+ }
+ vs := d.states.SortedSlice(func(i, j *DFAState) bool {
+ return i.stateNumber < j.stateNumber
+ })
+
+ return vs
+}
+
+func (d *DFA) String(literalNames []string, symbolicNames []string) string {
+ if d.getS0() == nil {
+ return ""
+ }
+
+ return NewDFASerializer(d, literalNames, symbolicNames).String()
+}
+
+func (d *DFA) ToLexerString() string {
+ if d.getS0() == nil {
+ return ""
+ }
+
+ return NewLexerDFASerializer(d).String()
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/dfa_serializer.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/dfa_serializer.go
new file mode 100644
index 0000000..0e11009
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/dfa_serializer.go
@@ -0,0 +1,158 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+// DFASerializer is a DFA walker that knows how to dump the DFA states to serialized
+// strings.
+type DFASerializer struct {
+ dfa *DFA
+ literalNames []string
+ symbolicNames []string
+}
+
+func NewDFASerializer(dfa *DFA, literalNames, symbolicNames []string) *DFASerializer {
+ if literalNames == nil {
+ literalNames = make([]string, 0)
+ }
+
+ if symbolicNames == nil {
+ symbolicNames = make([]string, 0)
+ }
+
+ return &DFASerializer{
+ dfa: dfa,
+ literalNames: literalNames,
+ symbolicNames: symbolicNames,
+ }
+}
+
+func (d *DFASerializer) String() string {
+ if d.dfa.getS0() == nil {
+ return ""
+ }
+
+ buf := ""
+ states := d.dfa.sortedStates()
+
+ for _, s := range states {
+ if s.edges != nil {
+ n := len(s.edges)
+
+ for j := 0; j < n; j++ {
+ t := s.edges[j]
+
+ if t != nil && t.stateNumber != 0x7FFFFFFF {
+ buf += d.GetStateString(s)
+ buf += "-"
+ buf += d.getEdgeLabel(j)
+ buf += "->"
+ buf += d.GetStateString(t)
+ buf += "\n"
+ }
+ }
+ }
+ }
+
+ if len(buf) == 0 {
+ return ""
+ }
+
+ return buf
+}
+
+func (d *DFASerializer) getEdgeLabel(i int) string {
+ if i == 0 {
+ return "EOF"
+ } else if d.literalNames != nil && i-1 < len(d.literalNames) {
+ return d.literalNames[i-1]
+ } else if d.symbolicNames != nil && i-1 < len(d.symbolicNames) {
+ return d.symbolicNames[i-1]
+ }
+
+ return strconv.Itoa(i - 1)
+}
+
+func (d *DFASerializer) GetStateString(s *DFAState) string {
+ var a, b string
+
+ if s.isAcceptState {
+ a = ":"
+ }
+
+ if s.requiresFullContext {
+ b = "^"
+ }
+
+ baseStateStr := a + "s" + strconv.Itoa(s.stateNumber) + b
+
+ if s.isAcceptState {
+ if s.predicates != nil {
+ return baseStateStr + "=>" + fmt.Sprint(s.predicates)
+ }
+
+ return baseStateStr + "=>" + fmt.Sprint(s.prediction)
+ }
+
+ return baseStateStr
+}
+
+type LexerDFASerializer struct {
+ *DFASerializer
+}
+
+func NewLexerDFASerializer(dfa *DFA) *LexerDFASerializer {
+ return &LexerDFASerializer{DFASerializer: NewDFASerializer(dfa, nil, nil)}
+}
+
+func (l *LexerDFASerializer) getEdgeLabel(i int) string {
+ var sb strings.Builder
+ sb.Grow(6)
+ sb.WriteByte('\'')
+ sb.WriteRune(rune(i))
+ sb.WriteByte('\'')
+ return sb.String()
+}
+
+func (l *LexerDFASerializer) String() string {
+ if l.dfa.getS0() == nil {
+ return ""
+ }
+
+ buf := ""
+ states := l.dfa.sortedStates()
+
+ for i := 0; i < len(states); i++ {
+ s := states[i]
+
+ if s.edges != nil {
+ n := len(s.edges)
+
+ for j := 0; j < n; j++ {
+ t := s.edges[j]
+
+ if t != nil && t.stateNumber != 0x7FFFFFFF {
+ buf += l.GetStateString(s)
+ buf += "-"
+ buf += l.getEdgeLabel(j)
+ buf += "->"
+ buf += l.GetStateString(t)
+ buf += "\n"
+ }
+ }
+ }
+ }
+
+ if len(buf) == 0 {
+ return ""
+ }
+
+ return buf
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/dfa_state.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/dfa_state.go
new file mode 100644
index 0000000..6541430
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/dfa_state.go
@@ -0,0 +1,170 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+)
+
+// PredPrediction maps a predicate to a predicted alternative.
+type PredPrediction struct {
+ alt int
+ pred SemanticContext
+}
+
+func NewPredPrediction(pred SemanticContext, alt int) *PredPrediction {
+ return &PredPrediction{alt: alt, pred: pred}
+}
+
+func (p *PredPrediction) String() string {
+ return "(" + fmt.Sprint(p.pred) + ", " + fmt.Sprint(p.alt) + ")"
+}
+
+// DFAState represents a set of possible [ATN] configurations. As Aho, Sethi,
+// Ullman p. 117 says: "The DFA uses its state to keep track of all possible
+// states the ATN can be in after reading each input symbol. That is to say,
+// after reading input a1, a2,..an, the DFA is in a state that represents the
+// subset T of the states of the ATN that are reachable from the ATN's start
+// state along some path labeled a1a2..an."
+//
+// In conventional NFA-to-DFA conversion, therefore, the subset T would be a bitset representing the set of
+// states the [ATN] could be in. We need to track the alt predicted by each state
+// as well, however. More importantly, we need to maintain a stack of states,
+// tracking the closure operations as they jump from rule to rule, emulating
+// rule invocations (method calls). I have to add a stack to simulate the proper
+// lookahead sequences for the underlying LL grammar from which the ATN was
+// derived.
+//
+// I use a set of [ATNConfig] objects, not simple states. An [ATNConfig] is both a
+// state (ala normal conversion) and a [RuleContext] describing the chain of rules
+// (if any) followed to arrive at that state.
+//
+// A [DFAState] may have multiple references to a particular state, but with
+// different [ATN] contexts (with same or different alts) meaning that state was
+// reached via a different set of rule invocations.
+type DFAState struct {
+ stateNumber int
+ configs *ATNConfigSet
+
+ // edges elements point to the target of the symbol. Shift up by 1 so (-1)
+ // Token.EOF maps to the first element.
+ edges []*DFAState
+
+ isAcceptState bool
+
+ // prediction is the 'ttype' we match or alt we predict if the state is 'accept'.
+ // Set to ATN.INVALID_ALT_NUMBER when predicates != nil or
+ // requiresFullContext.
+ prediction int
+
+ lexerActionExecutor *LexerActionExecutor
+
+ // requiresFullContext indicates it was created during an SLL prediction that
+ // discovered a conflict between the configurations in the state. Future
+ // ParserATNSimulator.execATN invocations immediately jump doing
+ // full context prediction if true.
+ requiresFullContext bool
+
+ // predicates is the predicates associated with the ATN configurations of the
+ // DFA state during SLL parsing. When we have predicates, requiresFullContext
+ // is false, since full context prediction evaluates predicates on-the-fly. If
+ // d is
+ // not nil, then prediction is ATN.INVALID_ALT_NUMBER.
+ //
+ // We only use these for non-requiresFullContext but conflicting states. That
+ // means we know from the context (it's $ or we don't dip into outer context)
+ // that it's an ambiguity not a conflict.
+ //
+ // This list is computed by
+ // ParserATNSimulator.predicateDFAState.
+ predicates []*PredPrediction
+}
+
+func NewDFAState(stateNumber int, configs *ATNConfigSet) *DFAState {
+ if configs == nil {
+ configs = NewATNConfigSet(false)
+ }
+
+ return &DFAState{configs: configs, stateNumber: stateNumber}
+}
+
+// GetAltSet gets the set of all alts mentioned by all ATN configurations in d.
+func (d *DFAState) GetAltSet() []int {
+ var alts []int
+
+ if d.configs != nil {
+ for _, c := range d.configs.configs {
+ alts = append(alts, c.GetAlt())
+ }
+ }
+
+ if len(alts) == 0 {
+ return nil
+ }
+
+ return alts
+}
+
+func (d *DFAState) getEdges() []*DFAState {
+ return d.edges
+}
+
+func (d *DFAState) numEdges() int {
+ return len(d.edges)
+}
+
+func (d *DFAState) getIthEdge(i int) *DFAState {
+ return d.edges[i]
+}
+
+func (d *DFAState) setEdges(newEdges []*DFAState) {
+ d.edges = newEdges
+}
+
+func (d *DFAState) setIthEdge(i int, edge *DFAState) {
+ d.edges[i] = edge
+}
+
+func (d *DFAState) setPrediction(v int) {
+ d.prediction = v
+}
+
+func (d *DFAState) String() string {
+ var s string
+ if d.isAcceptState {
+ if d.predicates != nil {
+ s = "=>" + fmt.Sprint(d.predicates)
+ } else {
+ s = "=>" + fmt.Sprint(d.prediction)
+ }
+ }
+
+ return fmt.Sprintf("%d:%s%s", d.stateNumber, fmt.Sprint(d.configs), s)
+}
+
+func (d *DFAState) Hash() int {
+ h := murmurInit(7)
+ h = murmurUpdate(h, d.configs.Hash())
+ return murmurFinish(h, 1)
+}
+
+// Equals returns whether d equals other. Two DFAStates are equal if their ATN
+// configuration sets are the same. This method is used to see if a state
+// already exists.
+//
+// Because the number of alternatives and number of ATN configurations are
+// finite, there is a finite number of DFA states that can be processed. This is
+// necessary to show that the algorithm terminates.
+//
+// Cannot test the DFA state numbers here because in
+// ParserATNSimulator.addDFAState we need to know if any other state exists that
+// has d exact set of ATN configurations. The stateNumber is irrelevant.
+func (d *DFAState) Equals(o Collectable[*DFAState]) bool {
+ if d == o {
+ return true
+ }
+
+ return d.configs.Equals(o.(*DFAState).configs)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/diagnostic_error_listener.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/diagnostic_error_listener.go
new file mode 100644
index 0000000..bd2cd8b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/diagnostic_error_listener.go
@@ -0,0 +1,110 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "strconv"
+)
+
+//
+// This implementation of {@link ANTLRErrorListener} can be used to identify
+// certain potential correctness and performance problems in grammars. "reports"
+// are made by calling {@link Parser//NotifyErrorListeners} with the appropriate
+// message.
+//
+//
+// - Ambiguities: These are cases where more than one path through the
+// grammar can Match the input.
+// - Weak context sensitivity: These are cases where full-context
+// prediction resolved an SLL conflict to a unique alternative which equaled the
+// minimum alternative of the SLL conflict.
+// - Strong (forced) context sensitivity: These are cases where the
+// full-context prediction resolved an SLL conflict to a unique alternative,
+// and the minimum alternative of the SLL conflict was found to not be
+// a truly viable alternative. Two-stage parsing cannot be used for inputs where
+// d situation occurs.
+//
+
+type DiagnosticErrorListener struct {
+ *DefaultErrorListener
+
+ exactOnly bool
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func NewDiagnosticErrorListener(exactOnly bool) *DiagnosticErrorListener {
+
+ n := new(DiagnosticErrorListener)
+
+ // whether all ambiguities or only exact ambiguities are Reported.
+ n.exactOnly = exactOnly
+ return n
+}
+
+func (d *DiagnosticErrorListener) ReportAmbiguity(recognizer Parser, dfa *DFA, startIndex, stopIndex int, exact bool, ambigAlts *BitSet, configs *ATNConfigSet) {
+ if d.exactOnly && !exact {
+ return
+ }
+ msg := "reportAmbiguity d=" +
+ d.getDecisionDescription(recognizer, dfa) +
+ ": ambigAlts=" +
+ d.getConflictingAlts(ambigAlts, configs).String() +
+ ", input='" +
+ recognizer.GetTokenStream().GetTextFromInterval(NewInterval(startIndex, stopIndex)) + "'"
+ recognizer.NotifyErrorListeners(msg, nil, nil)
+}
+
+func (d *DiagnosticErrorListener) ReportAttemptingFullContext(recognizer Parser, dfa *DFA, startIndex, stopIndex int, _ *BitSet, _ *ATNConfigSet) {
+
+ msg := "reportAttemptingFullContext d=" +
+ d.getDecisionDescription(recognizer, dfa) +
+ ", input='" +
+ recognizer.GetTokenStream().GetTextFromInterval(NewInterval(startIndex, stopIndex)) + "'"
+ recognizer.NotifyErrorListeners(msg, nil, nil)
+}
+
+func (d *DiagnosticErrorListener) ReportContextSensitivity(recognizer Parser, dfa *DFA, startIndex, stopIndex, _ int, _ *ATNConfigSet) {
+ msg := "reportContextSensitivity d=" +
+ d.getDecisionDescription(recognizer, dfa) +
+ ", input='" +
+ recognizer.GetTokenStream().GetTextFromInterval(NewInterval(startIndex, stopIndex)) + "'"
+ recognizer.NotifyErrorListeners(msg, nil, nil)
+}
+
+func (d *DiagnosticErrorListener) getDecisionDescription(recognizer Parser, dfa *DFA) string {
+ decision := dfa.decision
+ ruleIndex := dfa.atnStartState.GetRuleIndex()
+
+ ruleNames := recognizer.GetRuleNames()
+ if ruleIndex < 0 || ruleIndex >= len(ruleNames) {
+ return strconv.Itoa(decision)
+ }
+ ruleName := ruleNames[ruleIndex]
+ if ruleName == "" {
+ return strconv.Itoa(decision)
+ }
+ return strconv.Itoa(decision) + " (" + ruleName + ")"
+}
+
+// Computes the set of conflicting or ambiguous alternatives from a
+// configuration set, if that information was not already provided by the
+// parser.
+//
+// @param ReportedAlts The set of conflicting or ambiguous alternatives, as
+// Reported by the parser.
+// @param configs The conflicting or ambiguous configuration set.
+// @return Returns {@code ReportedAlts} if it is not {@code nil}, otherwise
+// returns the set of alternatives represented in {@code configs}.
+func (d *DiagnosticErrorListener) getConflictingAlts(ReportedAlts *BitSet, set *ATNConfigSet) *BitSet {
+ if ReportedAlts != nil {
+ return ReportedAlts
+ }
+ result := NewBitSet()
+ for _, c := range set.configs {
+ result.add(c.GetAlt())
+ }
+
+ return result
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/error_listener.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/error_listener.go
new file mode 100644
index 0000000..21a0216
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/error_listener.go
@@ -0,0 +1,100 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+)
+
+// Provides an empty default implementation of {@link ANTLRErrorListener}. The
+// default implementation of each method does nothing, but can be overridden as
+// necessary.
+
+type ErrorListener interface {
+ SyntaxError(recognizer Recognizer, offendingSymbol interface{}, line, column int, msg string, e RecognitionException)
+ ReportAmbiguity(recognizer Parser, dfa *DFA, startIndex, stopIndex int, exact bool, ambigAlts *BitSet, configs *ATNConfigSet)
+ ReportAttemptingFullContext(recognizer Parser, dfa *DFA, startIndex, stopIndex int, conflictingAlts *BitSet, configs *ATNConfigSet)
+ ReportContextSensitivity(recognizer Parser, dfa *DFA, startIndex, stopIndex, prediction int, configs *ATNConfigSet)
+}
+
+type DefaultErrorListener struct {
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func NewDefaultErrorListener() *DefaultErrorListener {
+ return new(DefaultErrorListener)
+}
+
+func (d *DefaultErrorListener) SyntaxError(_ Recognizer, _ interface{}, _, _ int, _ string, _ RecognitionException) {
+}
+
+func (d *DefaultErrorListener) ReportAmbiguity(_ Parser, _ *DFA, _, _ int, _ bool, _ *BitSet, _ *ATNConfigSet) {
+}
+
+func (d *DefaultErrorListener) ReportAttemptingFullContext(_ Parser, _ *DFA, _, _ int, _ *BitSet, _ *ATNConfigSet) {
+}
+
+func (d *DefaultErrorListener) ReportContextSensitivity(_ Parser, _ *DFA, _, _, _ int, _ *ATNConfigSet) {
+}
+
+type ConsoleErrorListener struct {
+ *DefaultErrorListener
+}
+
+func NewConsoleErrorListener() *ConsoleErrorListener {
+ return new(ConsoleErrorListener)
+}
+
+// ConsoleErrorListenerINSTANCE provides a default instance of {@link ConsoleErrorListener}.
+var ConsoleErrorListenerINSTANCE = NewConsoleErrorListener()
+
+// SyntaxError prints messages to System.err containing the
+// values of line, charPositionInLine, and msg using
+// the following format:
+//
+// line :
+func (c *ConsoleErrorListener) SyntaxError(_ Recognizer, _ interface{}, line, column int, msg string, _ RecognitionException) {
+ _, _ = fmt.Fprintln(os.Stderr, "line "+strconv.Itoa(line)+":"+strconv.Itoa(column)+" "+msg)
+}
+
+type ProxyErrorListener struct {
+ *DefaultErrorListener
+ delegates []ErrorListener
+}
+
+func NewProxyErrorListener(delegates []ErrorListener) *ProxyErrorListener {
+ if delegates == nil {
+ panic("delegates is not provided")
+ }
+ l := new(ProxyErrorListener)
+ l.delegates = delegates
+ return l
+}
+
+func (p *ProxyErrorListener) SyntaxError(recognizer Recognizer, offendingSymbol interface{}, line, column int, msg string, e RecognitionException) {
+ for _, d := range p.delegates {
+ d.SyntaxError(recognizer, offendingSymbol, line, column, msg, e)
+ }
+}
+
+func (p *ProxyErrorListener) ReportAmbiguity(recognizer Parser, dfa *DFA, startIndex, stopIndex int, exact bool, ambigAlts *BitSet, configs *ATNConfigSet) {
+ for _, d := range p.delegates {
+ d.ReportAmbiguity(recognizer, dfa, startIndex, stopIndex, exact, ambigAlts, configs)
+ }
+}
+
+func (p *ProxyErrorListener) ReportAttemptingFullContext(recognizer Parser, dfa *DFA, startIndex, stopIndex int, conflictingAlts *BitSet, configs *ATNConfigSet) {
+ for _, d := range p.delegates {
+ d.ReportAttemptingFullContext(recognizer, dfa, startIndex, stopIndex, conflictingAlts, configs)
+ }
+}
+
+func (p *ProxyErrorListener) ReportContextSensitivity(recognizer Parser, dfa *DFA, startIndex, stopIndex, prediction int, configs *ATNConfigSet) {
+ for _, d := range p.delegates {
+ d.ReportContextSensitivity(recognizer, dfa, startIndex, stopIndex, prediction, configs)
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/error_strategy.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/error_strategy.go
new file mode 100644
index 0000000..9db2be1
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/error_strategy.go
@@ -0,0 +1,702 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "reflect"
+ "strconv"
+ "strings"
+)
+
+type ErrorStrategy interface {
+ reset(Parser)
+ RecoverInline(Parser) Token
+ Recover(Parser, RecognitionException)
+ Sync(Parser)
+ InErrorRecoveryMode(Parser) bool
+ ReportError(Parser, RecognitionException)
+ ReportMatch(Parser)
+}
+
+// DefaultErrorStrategy is the default implementation of ANTLRErrorStrategy used for
+// error reporting and recovery in ANTLR parsers.
+type DefaultErrorStrategy struct {
+ errorRecoveryMode bool
+ lastErrorIndex int
+ lastErrorStates *IntervalSet
+}
+
+var _ ErrorStrategy = &DefaultErrorStrategy{}
+
+func NewDefaultErrorStrategy() *DefaultErrorStrategy {
+
+ d := new(DefaultErrorStrategy)
+
+ // Indicates whether the error strategy is currently "recovering from an
+ // error". This is used to suppress Reporting multiple error messages while
+ // attempting to recover from a detected syntax error.
+ //
+ // @see //InErrorRecoveryMode
+ //
+ d.errorRecoveryMode = false
+
+ // The index into the input stream where the last error occurred.
+ // This is used to prevent infinite loops where an error is found
+ // but no token is consumed during recovery...another error is found,
+ // ad nauseam. This is a failsafe mechanism to guarantee that at least
+ // one token/tree node is consumed for two errors.
+ //
+ d.lastErrorIndex = -1
+ d.lastErrorStates = nil
+ return d
+}
+
+// The default implementation simply calls {@link //endErrorCondition} to
+// ensure that the handler is not in error recovery mode.
+func (d *DefaultErrorStrategy) reset(recognizer Parser) {
+ d.endErrorCondition(recognizer)
+}
+
+// This method is called to enter error recovery mode when a recognition
+// exception is Reported.
+func (d *DefaultErrorStrategy) beginErrorCondition(_ Parser) {
+ d.errorRecoveryMode = true
+}
+
+func (d *DefaultErrorStrategy) InErrorRecoveryMode(_ Parser) bool {
+ return d.errorRecoveryMode
+}
+
+// This method is called to leave error recovery mode after recovering from
+// a recognition exception.
+func (d *DefaultErrorStrategy) endErrorCondition(_ Parser) {
+ d.errorRecoveryMode = false
+ d.lastErrorStates = nil
+ d.lastErrorIndex = -1
+}
+
+// ReportMatch is the default implementation of error matching and simply calls endErrorCondition.
+func (d *DefaultErrorStrategy) ReportMatch(recognizer Parser) {
+ d.endErrorCondition(recognizer)
+}
+
+// ReportError is the default implementation of error reporting.
+// It returns immediately if the handler is already
+// in error recovery mode. Otherwise, it calls [beginErrorCondition]
+// and dispatches the Reporting task based on the runtime type of e
+// according to the following table.
+//
+// [NoViableAltException] : Dispatches the call to [ReportNoViableAlternative]
+// [InputMisMatchException] : Dispatches the call to [ReportInputMisMatch]
+// [FailedPredicateException] : Dispatches the call to [ReportFailedPredicate]
+// All other types : Calls [NotifyErrorListeners] to Report the exception
+func (d *DefaultErrorStrategy) ReportError(recognizer Parser, e RecognitionException) {
+ // if we've already Reported an error and have not Matched a token
+ // yet successfully, don't Report any errors.
+ if d.InErrorRecoveryMode(recognizer) {
+ return // don't Report spurious errors
+ }
+ d.beginErrorCondition(recognizer)
+
+ switch t := e.(type) {
+ default:
+ fmt.Println("unknown recognition error type: " + reflect.TypeOf(e).Name())
+ // fmt.Println(e.stack)
+ recognizer.NotifyErrorListeners(e.GetMessage(), e.GetOffendingToken(), e)
+ case *NoViableAltException:
+ d.ReportNoViableAlternative(recognizer, t)
+ case *InputMisMatchException:
+ d.ReportInputMisMatch(recognizer, t)
+ case *FailedPredicateException:
+ d.ReportFailedPredicate(recognizer, t)
+ }
+}
+
+// Recover is the default recovery implementation.
+// It reSynchronizes the parser by consuming tokens until we find one in the reSynchronization set -
+// loosely the set of tokens that can follow the current rule.
+func (d *DefaultErrorStrategy) Recover(recognizer Parser, _ RecognitionException) {
+
+ if d.lastErrorIndex == recognizer.GetInputStream().Index() &&
+ d.lastErrorStates != nil && d.lastErrorStates.contains(recognizer.GetState()) {
+ // uh oh, another error at same token index and previously-Visited
+ // state in ATN must be a case where LT(1) is in the recovery
+ // token set so nothing got consumed. Consume a single token
+ // at least to prevent an infinite loop d is a failsafe.
+ recognizer.Consume()
+ }
+ d.lastErrorIndex = recognizer.GetInputStream().Index()
+ if d.lastErrorStates == nil {
+ d.lastErrorStates = NewIntervalSet()
+ }
+ d.lastErrorStates.addOne(recognizer.GetState())
+ followSet := d.GetErrorRecoverySet(recognizer)
+ d.consumeUntil(recognizer, followSet)
+}
+
+// Sync is the default implementation of error strategy synchronization.
+//
+// This Sync makes sure that the current lookahead symbol is consistent with what were expecting
+// at this point in the [ATN]. You can call this anytime but ANTLR only
+// generates code to check before sub-rules/loops and each iteration.
+//
+// Implements [Jim Idle]'s magic Sync mechanism in closures and optional
+// sub-rules. E.g.:
+//
+// a : Sync ( stuff Sync )*
+// Sync : {consume to what can follow Sync}
+//
+// At the start of a sub-rule upon error, Sync performs single
+// token deletion, if possible. If it can't do that, it bails on the current
+// rule and uses the default error recovery, which consumes until the
+// reSynchronization set of the current rule.
+//
+// If the sub-rule is optional
+//
+// ({@code (...)?}, {@code (...)*},
+//
+// or a block with an empty alternative), then the expected set includes what follows
+// the sub-rule.
+//
+// During loop iteration, it consumes until it sees a token that can start a
+// sub-rule or what follows loop. Yes, that is pretty aggressive. We opt to
+// stay in the loop as long as possible.
+//
+// # Origins
+//
+// Previous versions of ANTLR did a poor job of their recovery within loops.
+// A single mismatch token or missing token would force the parser to bail
+// out of the entire rules surrounding the loop. So, for rule:
+//
+// classfunc : 'class' ID '{' member* '}'
+//
+// input with an extra token between members would force the parser to
+// consume until it found the next class definition rather than the next
+// member definition of the current class.
+//
+// This functionality cost a bit of effort because the parser has to
+// compare the token set at the start of the loop and at each iteration. If for
+// some reason speed is suffering for you, you can turn off this
+// functionality by simply overriding this method as empty:
+//
+// { }
+//
+// [Jim Idle]: https://github.com/jimidle
+func (d *DefaultErrorStrategy) Sync(recognizer Parser) {
+ // If already recovering, don't try to Sync
+ if d.InErrorRecoveryMode(recognizer) {
+ return
+ }
+
+ s := recognizer.GetInterpreter().atn.states[recognizer.GetState()]
+ la := recognizer.GetTokenStream().LA(1)
+
+ // try cheaper subset first might get lucky. seems to shave a wee bit off
+ nextTokens := recognizer.GetATN().NextTokens(s, nil)
+ if nextTokens.contains(TokenEpsilon) || nextTokens.contains(la) {
+ return
+ }
+
+ switch s.GetStateType() {
+ case ATNStateBlockStart, ATNStateStarBlockStart, ATNStatePlusBlockStart, ATNStateStarLoopEntry:
+ // Report error and recover if possible
+ if d.SingleTokenDeletion(recognizer) != nil {
+ return
+ }
+ recognizer.SetError(NewInputMisMatchException(recognizer))
+ case ATNStatePlusLoopBack, ATNStateStarLoopBack:
+ d.ReportUnwantedToken(recognizer)
+ expecting := NewIntervalSet()
+ expecting.addSet(recognizer.GetExpectedTokens())
+ whatFollowsLoopIterationOrRule := expecting.addSet(d.GetErrorRecoverySet(recognizer))
+ d.consumeUntil(recognizer, whatFollowsLoopIterationOrRule)
+ default:
+ // do nothing if we can't identify the exact kind of ATN state
+ }
+}
+
+// ReportNoViableAlternative is called by [ReportError] when the exception is a [NoViableAltException].
+//
+// See also [ReportError]
+func (d *DefaultErrorStrategy) ReportNoViableAlternative(recognizer Parser, e *NoViableAltException) {
+ tokens := recognizer.GetTokenStream()
+ var input string
+ if tokens != nil {
+ if e.startToken.GetTokenType() == TokenEOF {
+ input = ""
+ } else {
+ input = tokens.GetTextFromTokens(e.startToken, e.offendingToken)
+ }
+ } else {
+ input = ""
+ }
+ msg := "no viable alternative at input " + d.escapeWSAndQuote(input)
+ recognizer.NotifyErrorListeners(msg, e.offendingToken, e)
+}
+
+// ReportInputMisMatch is called by [ReportError] when the exception is an [InputMisMatchException]
+//
+// See also: [ReportError]
+func (d *DefaultErrorStrategy) ReportInputMisMatch(recognizer Parser, e *InputMisMatchException) {
+ msg := "mismatched input " + d.GetTokenErrorDisplay(e.offendingToken) +
+ " expecting " + e.getExpectedTokens().StringVerbose(recognizer.GetLiteralNames(), recognizer.GetSymbolicNames(), false)
+ recognizer.NotifyErrorListeners(msg, e.offendingToken, e)
+}
+
+// ReportFailedPredicate is called by [ReportError] when the exception is a [FailedPredicateException].
+//
+// See also: [ReportError]
+func (d *DefaultErrorStrategy) ReportFailedPredicate(recognizer Parser, e *FailedPredicateException) {
+ ruleName := recognizer.GetRuleNames()[recognizer.GetParserRuleContext().GetRuleIndex()]
+ msg := "rule " + ruleName + " " + e.message
+ recognizer.NotifyErrorListeners(msg, e.offendingToken, e)
+}
+
+// ReportUnwantedToken is called to report a syntax error that requires the removal
+// of a token from the input stream. At the time d method is called, the
+// erroneous symbol is the current LT(1) symbol and has not yet been
+// removed from the input stream. When this method returns,
+// recognizer is in error recovery mode.
+//
+// This method is called when singleTokenDeletion identifies
+// single-token deletion as a viable recovery strategy for a mismatched
+// input error.
+//
+// The default implementation simply returns if the handler is already in
+// error recovery mode. Otherwise, it calls beginErrorCondition to
+// enter error recovery mode, followed by calling
+// [NotifyErrorListeners]
+func (d *DefaultErrorStrategy) ReportUnwantedToken(recognizer Parser) {
+ if d.InErrorRecoveryMode(recognizer) {
+ return
+ }
+ d.beginErrorCondition(recognizer)
+ t := recognizer.GetCurrentToken()
+ tokenName := d.GetTokenErrorDisplay(t)
+ expecting := d.GetExpectedTokens(recognizer)
+ msg := "extraneous input " + tokenName + " expecting " +
+ expecting.StringVerbose(recognizer.GetLiteralNames(), recognizer.GetSymbolicNames(), false)
+ recognizer.NotifyErrorListeners(msg, t, nil)
+}
+
+// ReportMissingToken is called to report a syntax error which requires the
+// insertion of a missing token into the input stream. At the time this
+// method is called, the missing token has not yet been inserted. When this
+// method returns, recognizer is in error recovery mode.
+//
+// This method is called when singleTokenInsertion identifies
+// single-token insertion as a viable recovery strategy for a mismatched
+// input error.
+//
+// The default implementation simply returns if the handler is already in
+// error recovery mode. Otherwise, it calls beginErrorCondition to
+// enter error recovery mode, followed by calling [NotifyErrorListeners]
+func (d *DefaultErrorStrategy) ReportMissingToken(recognizer Parser) {
+ if d.InErrorRecoveryMode(recognizer) {
+ return
+ }
+ d.beginErrorCondition(recognizer)
+ t := recognizer.GetCurrentToken()
+ expecting := d.GetExpectedTokens(recognizer)
+ msg := "missing " + expecting.StringVerbose(recognizer.GetLiteralNames(), recognizer.GetSymbolicNames(), false) +
+ " at " + d.GetTokenErrorDisplay(t)
+ recognizer.NotifyErrorListeners(msg, t, nil)
+}
+
+// The RecoverInline default implementation attempts to recover from the mismatched input
+// by using single token insertion and deletion as described below. If the
+// recovery attempt fails, this method panics with [InputMisMatchException}.
+// TODO: Not sure that panic() is the right thing to do here - JI
+//
+// # EXTRA TOKEN (single token deletion)
+//
+// LA(1) is not what we are looking for. If LA(2) has the
+// right token, however, then assume LA(1) is some extra spurious
+// token and delete it. Then consume and return the next token (which was
+// the LA(2) token) as the successful result of the Match operation.
+//
+// # This recovery strategy is implemented by singleTokenDeletion
+//
+// # MISSING TOKEN (single token insertion)
+//
+// If current token -at LA(1) - is consistent with what could come
+// after the expected LA(1) token, then assume the token is missing
+// and use the parser's [TokenFactory] to create it on the fly. The
+// “insertion” is performed by returning the created token as the successful
+// result of the Match operation.
+//
+// This recovery strategy is implemented by [SingleTokenInsertion].
+//
+// # Example
+//
+// For example, Input i=(3 is clearly missing the ')'. When
+// the parser returns from the nested call to expr, it will have
+// call the chain:
+//
+// stat → expr → atom
+//
+// and it will be trying to Match the ')' at this point in the
+// derivation:
+//
+// : ID '=' '(' INT ')' ('+' atom)* ';'
+// ^
+//
+// The attempt to [Match] ')' will fail when it sees ';' and
+// call [RecoverInline]. To recover, it sees that LA(1)==';'
+// is in the set of tokens that can follow the ')' token reference
+// in rule atom. It can assume that you forgot the ')'.
+func (d *DefaultErrorStrategy) RecoverInline(recognizer Parser) Token {
+ // SINGLE TOKEN DELETION
+ MatchedSymbol := d.SingleTokenDeletion(recognizer)
+ if MatchedSymbol != nil {
+ // we have deleted the extra token.
+ // now, move past ttype token as if all were ok
+ recognizer.Consume()
+ return MatchedSymbol
+ }
+ // SINGLE TOKEN INSERTION
+ if d.SingleTokenInsertion(recognizer) {
+ return d.GetMissingSymbol(recognizer)
+ }
+ // even that didn't work must panic the exception
+ recognizer.SetError(NewInputMisMatchException(recognizer))
+ return nil
+}
+
+// SingleTokenInsertion implements the single-token insertion inline error recovery
+// strategy. It is called by [RecoverInline] if the single-token
+// deletion strategy fails to recover from the mismatched input. If this
+// method returns {@code true}, {@code recognizer} will be in error recovery
+// mode.
+//
+// This method determines whether single-token insertion is viable by
+// checking if the LA(1) input symbol could be successfully Matched
+// if it were instead the LA(2) symbol. If this method returns
+// {@code true}, the caller is responsible for creating and inserting a
+// token with the correct type to produce this behavior.
+//
+// This func returns true if single-token insertion is a viable recovery
+// strategy for the current mismatched input.
+func (d *DefaultErrorStrategy) SingleTokenInsertion(recognizer Parser) bool {
+ currentSymbolType := recognizer.GetTokenStream().LA(1)
+ // if current token is consistent with what could come after current
+ // ATN state, then we know we're missing a token error recovery
+ // is free to conjure up and insert the missing token
+ atn := recognizer.GetInterpreter().atn
+ currentState := atn.states[recognizer.GetState()]
+ next := currentState.GetTransitions()[0].getTarget()
+ expectingAtLL2 := atn.NextTokens(next, recognizer.GetParserRuleContext())
+ if expectingAtLL2.contains(currentSymbolType) {
+ d.ReportMissingToken(recognizer)
+ return true
+ }
+
+ return false
+}
+
+// SingleTokenDeletion implements the single-token deletion inline error recovery
+// strategy. It is called by [RecoverInline] to attempt to recover
+// from mismatched input. If this method returns nil, the parser and error
+// handler state will not have changed. If this method returns non-nil,
+// recognizer will not be in error recovery mode since the
+// returned token was a successful Match.
+//
+// If the single-token deletion is successful, this method calls
+// [ReportUnwantedToken] to Report the error, followed by
+// [Consume] to actually “delete” the extraneous token. Then,
+// before returning, [ReportMatch] is called to signal a successful
+// Match.
+//
+// The func returns the successfully Matched [Token] instance if single-token
+// deletion successfully recovers from the mismatched input, otherwise nil.
+func (d *DefaultErrorStrategy) SingleTokenDeletion(recognizer Parser) Token {
+ NextTokenType := recognizer.GetTokenStream().LA(2)
+ expecting := d.GetExpectedTokens(recognizer)
+ if expecting.contains(NextTokenType) {
+ d.ReportUnwantedToken(recognizer)
+ // print("recoverFromMisMatchedToken deleting " \
+ // + str(recognizer.GetTokenStream().LT(1)) \
+ // + " since " + str(recognizer.GetTokenStream().LT(2)) \
+ // + " is what we want", file=sys.stderr)
+ recognizer.Consume() // simply delete extra token
+ // we want to return the token we're actually Matching
+ MatchedSymbol := recognizer.GetCurrentToken()
+ d.ReportMatch(recognizer) // we know current token is correct
+ return MatchedSymbol
+ }
+
+ return nil
+}
+
+// GetMissingSymbol conjures up a missing token during error recovery.
+//
+// The recognizer attempts to recover from single missing
+// symbols. But, actions might refer to that missing symbol.
+// For example:
+//
+// x=ID {f($x)}.
+//
+// The action clearly assumes
+// that there has been an identifier Matched previously and that
+// $x points at that token. If that token is missing, but
+// the next token in the stream is what we want we assume that
+// this token is missing, and we keep going. Because we
+// have to return some token to replace the missing token,
+// we have to conjure one up. This method gives the user control
+// over the tokens returned for missing tokens. Mostly,
+// you will want to create something special for identifier
+// tokens. For literals such as '{' and ',', the default
+// action in the parser or tree parser works. It simply creates
+// a [CommonToken] of the appropriate type. The text will be the token name.
+// If you need to change which tokens must be created by the lexer,
+// override this method to create the appropriate tokens.
+func (d *DefaultErrorStrategy) GetMissingSymbol(recognizer Parser) Token {
+ currentSymbol := recognizer.GetCurrentToken()
+ expecting := d.GetExpectedTokens(recognizer)
+ expectedTokenType := expecting.first()
+ var tokenText string
+
+ if expectedTokenType == TokenEOF {
+ tokenText = ""
+ } else {
+ ln := recognizer.GetLiteralNames()
+ if expectedTokenType > 0 && expectedTokenType < len(ln) {
+ tokenText = ""
+ } else {
+ tokenText = "" // TODO: matches the JS impl
+ }
+ }
+ current := currentSymbol
+ lookback := recognizer.GetTokenStream().LT(-1)
+ if current.GetTokenType() == TokenEOF && lookback != nil {
+ current = lookback
+ }
+
+ tf := recognizer.GetTokenFactory()
+
+ return tf.Create(current.GetSource(), expectedTokenType, tokenText, TokenDefaultChannel, -1, -1, current.GetLine(), current.GetColumn())
+}
+
+func (d *DefaultErrorStrategy) GetExpectedTokens(recognizer Parser) *IntervalSet {
+ return recognizer.GetExpectedTokens()
+}
+
+// GetTokenErrorDisplay determines how a token should be displayed in an error message.
+// The default is to display just the text, but during development you might
+// want to have a lot of information spit out. Override this func in that case
+// to use t.String() (which, for [CommonToken], dumps everything about
+// the token). This is better than forcing you to override a method in
+// your token objects because you don't have to go modify your lexer
+// so that it creates a new type.
+func (d *DefaultErrorStrategy) GetTokenErrorDisplay(t Token) string {
+ if t == nil {
+ return ""
+ }
+ s := t.GetText()
+ if s == "" {
+ if t.GetTokenType() == TokenEOF {
+ s = ""
+ } else {
+ s = "<" + strconv.Itoa(t.GetTokenType()) + ">"
+ }
+ }
+ return d.escapeWSAndQuote(s)
+}
+
+func (d *DefaultErrorStrategy) escapeWSAndQuote(s string) string {
+ s = strings.Replace(s, "\t", "\\t", -1)
+ s = strings.Replace(s, "\n", "\\n", -1)
+ s = strings.Replace(s, "\r", "\\r", -1)
+ return "'" + s + "'"
+}
+
+// GetErrorRecoverySet computes the error recovery set for the current rule. During
+// rule invocation, the parser pushes the set of tokens that can
+// follow that rule reference on the stack. This amounts to
+// computing FIRST of what follows the rule reference in the
+// enclosing rule. See LinearApproximator.FIRST().
+//
+// This local follow set only includes tokens
+// from within the rule i.e., the FIRST computation done by
+// ANTLR stops at the end of a rule.
+//
+// # Example
+//
+// When you find a "no viable alt exception", the input is not
+// consistent with any of the alternatives for rule r. The best
+// thing to do is to consume tokens until you see something that
+// can legally follow a call to r or any rule that called r.
+// You don't want the exact set of viable next tokens because the
+// input might just be missing a token--you might consume the
+// rest of the input looking for one of the missing tokens.
+//
+// Consider the grammar:
+//
+// a : '[' b ']'
+// | '(' b ')'
+// ;
+//
+// b : c '^' INT
+// ;
+//
+// c : ID
+// | INT
+// ;
+//
+// At each rule invocation, the set of tokens that could follow
+// that rule is pushed on a stack. Here are the various
+// context-sensitive follow sets:
+//
+// FOLLOW(b1_in_a) = FIRST(']') = ']'
+// FOLLOW(b2_in_a) = FIRST(')') = ')'
+// FOLLOW(c_in_b) = FIRST('^') = '^'
+//
+// Upon erroneous input “[]”, the call chain is
+//
+// a → b → c
+//
+// and, hence, the follow context stack is:
+//
+// Depth Follow set Start of rule execution
+// 0 a (from main())
+// 1 ']' b
+// 2 '^' c
+//
+// Notice that ')' is not included, because b would have to have
+// been called from a different context in rule a for ')' to be
+// included.
+//
+// For error recovery, we cannot consider FOLLOW(c)
+// (context-sensitive or otherwise). We need the combined set of
+// all context-sensitive FOLLOW sets - the set of all tokens that
+// could follow any reference in the call chain. We need to
+// reSync to one of those tokens. Note that FOLLOW(c)='^' and if
+// we reSync'd to that token, we'd consume until EOF. We need to
+// Sync to context-sensitive FOLLOWs for a, b, and c:
+//
+// {']','^'}
+//
+// In this case, for input "[]", LA(1) is ']' and in the set, so we would
+// not consume anything. After printing an error, rule c would
+// return normally. Rule b would not find the required '^' though.
+// At this point, it gets a mismatched token error and panics an
+// exception (since LA(1) is not in the viable following token
+// set). The rule exception handler tries to recover, but finds
+// the same recovery set and doesn't consume anything. Rule b
+// exits normally returning to rule a. Now it finds the ']' (and
+// with the successful Match exits errorRecovery mode).
+//
+// So, you can see that the parser walks up the call chain looking
+// for the token that was a member of the recovery set.
+//
+// Errors are not generated in errorRecovery mode.
+//
+// ANTLR's error recovery mechanism is based upon original ideas:
+//
+// [Algorithms + Data Structures = Programs] by Niklaus Wirth and
+// [A note on error recovery in recursive descent parsers].
+//
+// Later, Josef Grosch had some good ideas in [Efficient and Comfortable Error Recovery in Recursive Descent
+// Parsers]
+//
+// Like Grosch I implement context-sensitive FOLLOW sets that are combined at run-time upon error to avoid overhead
+// during parsing. Later, the runtime Sync was improved for loops/sub-rules see [Sync] docs
+//
+// [A note on error recovery in recursive descent parsers]: http://portal.acm.org/citation.cfm?id=947902.947905
+// [Algorithms + Data Structures = Programs]: https://t.ly/5QzgE
+// [Efficient and Comfortable Error Recovery in Recursive Descent Parsers]: ftp://www.cocolab.com/products/cocktail/doca4.ps/ell.ps.zip
+func (d *DefaultErrorStrategy) GetErrorRecoverySet(recognizer Parser) *IntervalSet {
+ atn := recognizer.GetInterpreter().atn
+ ctx := recognizer.GetParserRuleContext()
+ recoverSet := NewIntervalSet()
+ for ctx != nil && ctx.GetInvokingState() >= 0 {
+ // compute what follows who invoked us
+ invokingState := atn.states[ctx.GetInvokingState()]
+ rt := invokingState.GetTransitions()[0]
+ follow := atn.NextTokens(rt.(*RuleTransition).followState, nil)
+ recoverSet.addSet(follow)
+ ctx = ctx.GetParent().(ParserRuleContext)
+ }
+ recoverSet.removeOne(TokenEpsilon)
+ return recoverSet
+}
+
+// Consume tokens until one Matches the given token set.//
+func (d *DefaultErrorStrategy) consumeUntil(recognizer Parser, set *IntervalSet) {
+ ttype := recognizer.GetTokenStream().LA(1)
+ for ttype != TokenEOF && !set.contains(ttype) {
+ recognizer.Consume()
+ ttype = recognizer.GetTokenStream().LA(1)
+ }
+}
+
+// The BailErrorStrategy implementation of ANTLRErrorStrategy responds to syntax errors
+// by immediately canceling the parse operation with a
+// [ParseCancellationException]. The implementation ensures that the
+// [ParserRuleContext//exception] field is set for all parse tree nodes
+// that were not completed prior to encountering the error.
+//
+// This error strategy is useful in the following scenarios.
+//
+// - Two-stage parsing: This error strategy allows the first
+// stage of two-stage parsing to immediately terminate if an error is
+// encountered, and immediately fall back to the second stage. In addition to
+// avoiding wasted work by attempting to recover from errors here, the empty
+// implementation of [BailErrorStrategy.Sync] improves the performance of
+// the first stage.
+//
+// - Silent validation: When syntax errors are not being
+// Reported or logged, and the parse result is simply ignored if errors occur,
+// the [BailErrorStrategy] avoids wasting work on recovering from errors
+// when the result will be ignored either way.
+//
+// myparser.SetErrorHandler(NewBailErrorStrategy())
+//
+// See also: [Parser.SetErrorHandler(ANTLRErrorStrategy)]
+type BailErrorStrategy struct {
+ *DefaultErrorStrategy
+}
+
+var _ ErrorStrategy = &BailErrorStrategy{}
+
+//goland:noinspection GoUnusedExportedFunction
+func NewBailErrorStrategy() *BailErrorStrategy {
+
+ b := new(BailErrorStrategy)
+
+ b.DefaultErrorStrategy = NewDefaultErrorStrategy()
+
+ return b
+}
+
+// Recover Instead of recovering from exception e, re-panic it wrapped
+// in a [ParseCancellationException] so it is not caught by the
+// rule func catches. Use Exception.GetCause() to get the
+// original [RecognitionException].
+func (b *BailErrorStrategy) Recover(recognizer Parser, e RecognitionException) {
+ context := recognizer.GetParserRuleContext()
+ for context != nil {
+ context.SetException(e)
+ if parent, ok := context.GetParent().(ParserRuleContext); ok {
+ context = parent
+ } else {
+ context = nil
+ }
+ }
+ recognizer.SetError(NewParseCancellationException()) // TODO: we don't emit e properly
+}
+
+// RecoverInline makes sure we don't attempt to recover inline if the parser
+// successfully recovers, it won't panic an exception.
+func (b *BailErrorStrategy) RecoverInline(recognizer Parser) Token {
+ b.Recover(recognizer, NewInputMisMatchException(recognizer))
+
+ return nil
+}
+
+// Sync makes sure we don't attempt to recover from problems in sub-rules.
+func (b *BailErrorStrategy) Sync(_ Parser) {
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/errors.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/errors.go
new file mode 100644
index 0000000..8f0f2f6
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/errors.go
@@ -0,0 +1,259 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+// The root of the ANTLR exception hierarchy. In general, ANTLR tracks just
+// 3 kinds of errors: prediction errors, failed predicate errors, and
+// mismatched input errors. In each case, the parser knows where it is
+// in the input, where it is in the ATN, the rule invocation stack,
+// and what kind of problem occurred.
+
+type RecognitionException interface {
+ GetOffendingToken() Token
+ GetMessage() string
+ GetInputStream() IntStream
+}
+
+type BaseRecognitionException struct {
+ message string
+ recognizer Recognizer
+ offendingToken Token
+ offendingState int
+ ctx RuleContext
+ input IntStream
+}
+
+func NewBaseRecognitionException(message string, recognizer Recognizer, input IntStream, ctx RuleContext) *BaseRecognitionException {
+
+ // todo
+ // Error.call(this)
+ //
+ // if (!!Error.captureStackTrace) {
+ // Error.captureStackTrace(this, RecognitionException)
+ // } else {
+ // stack := NewError().stack
+ // }
+ // TODO: may be able to use - "runtime" func Stack(buf []byte, all bool) int
+
+ t := new(BaseRecognitionException)
+
+ t.message = message
+ t.recognizer = recognizer
+ t.input = input
+ t.ctx = ctx
+
+ // The current Token when an error occurred. Since not all streams
+ // support accessing symbols by index, we have to track the {@link Token}
+ // instance itself.
+ //
+ t.offendingToken = nil
+
+ // Get the ATN state number the parser was in at the time the error
+ // occurred. For NoViableAltException and LexerNoViableAltException exceptions, this is the
+ // DecisionState number. For others, it is the state whose outgoing edge we couldn't Match.
+ //
+ t.offendingState = -1
+ if t.recognizer != nil {
+ t.offendingState = t.recognizer.GetState()
+ }
+
+ return t
+}
+
+func (b *BaseRecognitionException) GetMessage() string {
+ return b.message
+}
+
+func (b *BaseRecognitionException) GetOffendingToken() Token {
+ return b.offendingToken
+}
+
+func (b *BaseRecognitionException) GetInputStream() IntStream {
+ return b.input
+}
+
+// If the state number is not known, b method returns -1.
+
+// getExpectedTokens gets the set of input symbols which could potentially follow the
+// previously Matched symbol at the time this exception was raised.
+//
+// If the set of expected tokens is not known and could not be computed,
+// this method returns nil.
+//
+// The func returns the set of token types that could potentially follow the current
+// state in the {ATN}, or nil if the information is not available.
+
+func (b *BaseRecognitionException) getExpectedTokens() *IntervalSet {
+ if b.recognizer != nil {
+ return b.recognizer.GetATN().getExpectedTokens(b.offendingState, b.ctx)
+ }
+
+ return nil
+}
+
+func (b *BaseRecognitionException) String() string {
+ return b.message
+}
+
+type LexerNoViableAltException struct {
+ *BaseRecognitionException
+
+ startIndex int
+ deadEndConfigs *ATNConfigSet
+}
+
+func NewLexerNoViableAltException(lexer Lexer, input CharStream, startIndex int, deadEndConfigs *ATNConfigSet) *LexerNoViableAltException {
+
+ l := new(LexerNoViableAltException)
+
+ l.BaseRecognitionException = NewBaseRecognitionException("", lexer, input, nil)
+
+ l.startIndex = startIndex
+ l.deadEndConfigs = deadEndConfigs
+
+ return l
+}
+
+func (l *LexerNoViableAltException) String() string {
+ symbol := ""
+ if l.startIndex >= 0 && l.startIndex < l.input.Size() {
+ symbol = l.input.(CharStream).GetTextFromInterval(NewInterval(l.startIndex, l.startIndex))
+ }
+ return "LexerNoViableAltException" + symbol
+}
+
+type NoViableAltException struct {
+ *BaseRecognitionException
+
+ startToken Token
+ offendingToken Token
+ ctx ParserRuleContext
+ deadEndConfigs *ATNConfigSet
+}
+
+// NewNoViableAltException creates an exception indicating that the parser could not decide which of two or more paths
+// to take based upon the remaining input. It tracks the starting token
+// of the offending input and also knows where the parser was
+// in the various paths when the error.
+//
+// Reported by [ReportNoViableAlternative]
+func NewNoViableAltException(recognizer Parser, input TokenStream, startToken Token, offendingToken Token, deadEndConfigs *ATNConfigSet, ctx ParserRuleContext) *NoViableAltException {
+
+ if ctx == nil {
+ ctx = recognizer.GetParserRuleContext()
+ }
+
+ if offendingToken == nil {
+ offendingToken = recognizer.GetCurrentToken()
+ }
+
+ if startToken == nil {
+ startToken = recognizer.GetCurrentToken()
+ }
+
+ if input == nil {
+ input = recognizer.GetInputStream().(TokenStream)
+ }
+
+ n := new(NoViableAltException)
+ n.BaseRecognitionException = NewBaseRecognitionException("", recognizer, input, ctx)
+
+ // Which configurations did we try at input.Index() that couldn't Match
+ // input.LT(1)
+ n.deadEndConfigs = deadEndConfigs
+
+ // The token object at the start index the input stream might
+ // not be buffering tokens so get a reference to it.
+ //
+ // At the time the error occurred, of course the stream needs to keep a
+ // buffer of all the tokens, but later we might not have access to those.
+ n.startToken = startToken
+ n.offendingToken = offendingToken
+
+ return n
+}
+
+type InputMisMatchException struct {
+ *BaseRecognitionException
+}
+
+// NewInputMisMatchException creates an exception that signifies any kind of mismatched input exceptions such as
+// when the current input does not Match the expected token.
+func NewInputMisMatchException(recognizer Parser) *InputMisMatchException {
+
+ i := new(InputMisMatchException)
+ i.BaseRecognitionException = NewBaseRecognitionException("", recognizer, recognizer.GetInputStream(), recognizer.GetParserRuleContext())
+
+ i.offendingToken = recognizer.GetCurrentToken()
+
+ return i
+
+}
+
+// FailedPredicateException indicates that a semantic predicate failed during validation. Validation of predicates
+// occurs when normally parsing the alternative just like Matching a token.
+// Disambiguating predicate evaluation occurs when we test a predicate during
+// prediction.
+type FailedPredicateException struct {
+ *BaseRecognitionException
+
+ ruleIndex int
+ predicateIndex int
+ predicate string
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func NewFailedPredicateException(recognizer Parser, predicate string, message string) *FailedPredicateException {
+
+ f := new(FailedPredicateException)
+
+ f.BaseRecognitionException = NewBaseRecognitionException(f.formatMessage(predicate, message), recognizer, recognizer.GetInputStream(), recognizer.GetParserRuleContext())
+
+ s := recognizer.GetInterpreter().atn.states[recognizer.GetState()]
+ trans := s.GetTransitions()[0]
+ if trans2, ok := trans.(*PredicateTransition); ok {
+ f.ruleIndex = trans2.ruleIndex
+ f.predicateIndex = trans2.predIndex
+ } else {
+ f.ruleIndex = 0
+ f.predicateIndex = 0
+ }
+ f.predicate = predicate
+ f.offendingToken = recognizer.GetCurrentToken()
+
+ return f
+}
+
+func (f *FailedPredicateException) formatMessage(predicate, message string) string {
+ if message != "" {
+ return message
+ }
+
+ return "failed predicate: {" + predicate + "}?"
+}
+
+type ParseCancellationException struct {
+}
+
+func (p ParseCancellationException) GetOffendingToken() Token {
+ //TODO implement me
+ panic("implement me")
+}
+
+func (p ParseCancellationException) GetMessage() string {
+ //TODO implement me
+ panic("implement me")
+}
+
+func (p ParseCancellationException) GetInputStream() IntStream {
+ //TODO implement me
+ panic("implement me")
+}
+
+func NewParseCancellationException() *ParseCancellationException {
+ // Error.call(this)
+ // Error.captureStackTrace(this, ParseCancellationException)
+ return new(ParseCancellationException)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/file_stream.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/file_stream.go
new file mode 100644
index 0000000..5f65f80
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/file_stream.go
@@ -0,0 +1,67 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "bufio"
+ "os"
+)
+
+// This is an InputStream that is loaded from a file all at once
+// when you construct the object.
+
+type FileStream struct {
+ InputStream
+ filename string
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func NewFileStream(fileName string) (*FileStream, error) {
+
+ f, err := os.Open(fileName)
+ if err != nil {
+ return nil, err
+ }
+
+ defer func(f *os.File) {
+ errF := f.Close()
+ if errF != nil {
+ }
+ }(f)
+
+ reader := bufio.NewReader(f)
+ fInfo, err := f.Stat()
+ if err != nil {
+ return nil, err
+ }
+
+ fs := &FileStream{
+ InputStream: InputStream{
+ index: 0,
+ name: fileName,
+ },
+ filename: fileName,
+ }
+
+ // Pre-build the buffer and read runes efficiently
+ //
+ fs.data = make([]rune, 0, fInfo.Size())
+ for {
+ r, _, err := reader.ReadRune()
+ if err != nil {
+ break
+ }
+ fs.data = append(fs.data, r)
+ }
+ fs.size = len(fs.data) // Size in runes
+
+ // All done.
+ //
+ return fs, nil
+}
+
+func (f *FileStream) GetSourceName() string {
+ return f.filename
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/input_stream.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/input_stream.go
new file mode 100644
index 0000000..b737fe8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/input_stream.go
@@ -0,0 +1,157 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "bufio"
+ "io"
+)
+
+type InputStream struct {
+ name string
+ index int
+ data []rune
+ size int
+}
+
+// NewIoStream creates a new input stream from the given io.Reader reader.
+// Note that the reader is read completely into memory and so it must actually
+// have a stopping point - you cannot pass in a reader on an open-ended source such
+// as a socket for instance.
+func NewIoStream(reader io.Reader) *InputStream {
+
+ rReader := bufio.NewReader(reader)
+
+ is := &InputStream{
+ name: "",
+ index: 0,
+ }
+
+ // Pre-build the buffer and read runes reasonably efficiently given that
+ // we don't exactly know how big the input is.
+ //
+ is.data = make([]rune, 0, 512)
+ for {
+ r, _, err := rReader.ReadRune()
+ if err != nil {
+ break
+ }
+ is.data = append(is.data, r)
+ }
+ is.size = len(is.data) // number of runes
+ return is
+}
+
+// NewInputStream creates a new input stream from the given string
+func NewInputStream(data string) *InputStream {
+
+ is := &InputStream{
+ name: "",
+ index: 0,
+ data: []rune(data), // This is actually the most efficient way
+ }
+ is.size = len(is.data) // number of runes, but we could also use len(data), which is efficient too
+ return is
+}
+
+func (is *InputStream) reset() {
+ is.index = 0
+}
+
+// Consume moves the input pointer to the next character in the input stream
+func (is *InputStream) Consume() {
+ if is.index >= is.size {
+ // assert is.LA(1) == TokenEOF
+ panic("cannot consume EOF")
+ }
+ is.index++
+}
+
+// LA returns the character at the given offset from the start of the input stream
+func (is *InputStream) LA(offset int) int {
+
+ if offset == 0 {
+ return 0 // nil
+ }
+ if offset < 0 {
+ offset++ // e.g., translate LA(-1) to use offset=0
+ }
+ pos := is.index + offset - 1
+
+ if pos < 0 || pos >= is.size { // invalid
+ return TokenEOF
+ }
+
+ return int(is.data[pos])
+}
+
+// LT returns the character at the given offset from the start of the input stream
+func (is *InputStream) LT(offset int) int {
+ return is.LA(offset)
+}
+
+// Index returns the current offset in to the input stream
+func (is *InputStream) Index() int {
+ return is.index
+}
+
+// Size returns the total number of characters in the input stream
+func (is *InputStream) Size() int {
+ return is.size
+}
+
+// Mark does nothing here as we have entire buffer
+func (is *InputStream) Mark() int {
+ return -1
+}
+
+// Release does nothing here as we have entire buffer
+func (is *InputStream) Release(_ int) {
+}
+
+// Seek the input point to the provided index offset
+func (is *InputStream) Seek(index int) {
+ if index <= is.index {
+ is.index = index // just jump don't update stream state (line,...)
+ return
+ }
+ // seek forward
+ is.index = intMin(index, is.size)
+}
+
+// GetText returns the text from the input stream from the start to the stop index
+func (is *InputStream) GetText(start int, stop int) string {
+ if stop >= is.size {
+ stop = is.size - 1
+ }
+ if start >= is.size {
+ return ""
+ }
+
+ return string(is.data[start : stop+1])
+}
+
+// GetTextFromTokens returns the text from the input stream from the first character of the start token to the last
+// character of the stop token
+func (is *InputStream) GetTextFromTokens(start, stop Token) string {
+ if start != nil && stop != nil {
+ return is.GetTextFromInterval(NewInterval(start.GetTokenIndex(), stop.GetTokenIndex()))
+ }
+
+ return ""
+}
+
+func (is *InputStream) GetTextFromInterval(i Interval) string {
+ return is.GetText(i.Start, i.Stop)
+}
+
+func (*InputStream) GetSourceName() string {
+ return ""
+}
+
+// String returns the entire input stream as a string
+func (is *InputStream) String() string {
+ return string(is.data)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/int_stream.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/int_stream.go
new file mode 100644
index 0000000..4778878
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/int_stream.go
@@ -0,0 +1,16 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+type IntStream interface {
+ Consume()
+ LA(int) int
+ Mark() int
+ Release(marker int)
+ Index() int
+ Seek(index int)
+ Size() int
+ GetSourceName() string
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/interval_set.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/interval_set.go
new file mode 100644
index 0000000..cc50660
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/interval_set.go
@@ -0,0 +1,330 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "strconv"
+ "strings"
+)
+
+type Interval struct {
+ Start int
+ Stop int
+}
+
+// NewInterval creates a new interval with the given start and stop values.
+func NewInterval(start, stop int) Interval {
+ return Interval{
+ Start: start,
+ Stop: stop,
+ }
+}
+
+// Contains returns true if the given item is contained within the interval.
+func (i Interval) Contains(item int) bool {
+ return item >= i.Start && item < i.Stop
+}
+
+// String generates a string representation of the interval.
+func (i Interval) String() string {
+ if i.Start == i.Stop-1 {
+ return strconv.Itoa(i.Start)
+ }
+
+ return strconv.Itoa(i.Start) + ".." + strconv.Itoa(i.Stop-1)
+}
+
+// Length returns the length of the interval.
+func (i Interval) Length() int {
+ return i.Stop - i.Start
+}
+
+// IntervalSet represents a collection of [Intervals], which may be read-only.
+type IntervalSet struct {
+ intervals []Interval
+ readOnly bool
+}
+
+// NewIntervalSet creates a new empty, writable, interval set.
+func NewIntervalSet() *IntervalSet {
+
+ i := new(IntervalSet)
+
+ i.intervals = nil
+ i.readOnly = false
+
+ return i
+}
+
+func (i *IntervalSet) Equals(other *IntervalSet) bool {
+ if len(i.intervals) != len(other.intervals) {
+ return false
+ }
+
+ for k, v := range i.intervals {
+ if v.Start != other.intervals[k].Start || v.Stop != other.intervals[k].Stop {
+ return false
+ }
+ }
+
+ return true
+}
+
+func (i *IntervalSet) first() int {
+ if len(i.intervals) == 0 {
+ return TokenInvalidType
+ }
+
+ return i.intervals[0].Start
+}
+
+func (i *IntervalSet) addOne(v int) {
+ i.addInterval(NewInterval(v, v+1))
+}
+
+func (i *IntervalSet) addRange(l, h int) {
+ i.addInterval(NewInterval(l, h+1))
+}
+
+func (i *IntervalSet) addInterval(v Interval) {
+ if i.intervals == nil {
+ i.intervals = make([]Interval, 0)
+ i.intervals = append(i.intervals, v)
+ } else {
+ // find insert pos
+ for k, interval := range i.intervals {
+ // distinct range -> insert
+ if v.Stop < interval.Start {
+ i.intervals = append(i.intervals[0:k], append([]Interval{v}, i.intervals[k:]...)...)
+ return
+ } else if v.Stop == interval.Start {
+ i.intervals[k].Start = v.Start
+ return
+ } else if v.Start <= interval.Stop {
+ i.intervals[k] = NewInterval(intMin(interval.Start, v.Start), intMax(interval.Stop, v.Stop))
+
+ // if not applying to end, merge potential overlaps
+ if k < len(i.intervals)-1 {
+ l := i.intervals[k]
+ r := i.intervals[k+1]
+ // if r contained in l
+ if l.Stop >= r.Stop {
+ i.intervals = append(i.intervals[0:k+1], i.intervals[k+2:]...)
+ } else if l.Stop >= r.Start { // partial overlap
+ i.intervals[k] = NewInterval(l.Start, r.Stop)
+ i.intervals = append(i.intervals[0:k+1], i.intervals[k+2:]...)
+ }
+ }
+ return
+ }
+ }
+ // greater than any exiting
+ i.intervals = append(i.intervals, v)
+ }
+}
+
+func (i *IntervalSet) addSet(other *IntervalSet) *IntervalSet {
+ if other.intervals != nil {
+ for k := 0; k < len(other.intervals); k++ {
+ i2 := other.intervals[k]
+ i.addInterval(NewInterval(i2.Start, i2.Stop))
+ }
+ }
+ return i
+}
+
+func (i *IntervalSet) complement(start int, stop int) *IntervalSet {
+ result := NewIntervalSet()
+ result.addInterval(NewInterval(start, stop+1))
+ for j := 0; j < len(i.intervals); j++ {
+ result.removeRange(i.intervals[j])
+ }
+ return result
+}
+
+func (i *IntervalSet) contains(item int) bool {
+ if i.intervals == nil {
+ return false
+ }
+ for k := 0; k < len(i.intervals); k++ {
+ if i.intervals[k].Contains(item) {
+ return true
+ }
+ }
+ return false
+}
+
+func (i *IntervalSet) length() int {
+ iLen := 0
+
+ for _, v := range i.intervals {
+ iLen += v.Length()
+ }
+
+ return iLen
+}
+
+func (i *IntervalSet) removeRange(v Interval) {
+ if v.Start == v.Stop-1 {
+ i.removeOne(v.Start)
+ } else if i.intervals != nil {
+ k := 0
+ for n := 0; n < len(i.intervals); n++ {
+ ni := i.intervals[k]
+ // intervals are ordered
+ if v.Stop <= ni.Start {
+ return
+ } else if v.Start > ni.Start && v.Stop < ni.Stop {
+ i.intervals[k] = NewInterval(ni.Start, v.Start)
+ x := NewInterval(v.Stop, ni.Stop)
+ // i.intervals.splice(k, 0, x)
+ i.intervals = append(i.intervals[0:k], append([]Interval{x}, i.intervals[k:]...)...)
+ return
+ } else if v.Start <= ni.Start && v.Stop >= ni.Stop {
+ // i.intervals.splice(k, 1)
+ i.intervals = append(i.intervals[0:k], i.intervals[k+1:]...)
+ k = k - 1 // need another pass
+ } else if v.Start < ni.Stop {
+ i.intervals[k] = NewInterval(ni.Start, v.Start)
+ } else if v.Stop < ni.Stop {
+ i.intervals[k] = NewInterval(v.Stop, ni.Stop)
+ }
+ k++
+ }
+ }
+}
+
+func (i *IntervalSet) removeOne(v int) {
+ if i.intervals != nil {
+ for k := 0; k < len(i.intervals); k++ {
+ ki := i.intervals[k]
+ // intervals i ordered
+ if v < ki.Start {
+ return
+ } else if v == ki.Start && v == ki.Stop-1 {
+ // i.intervals.splice(k, 1)
+ i.intervals = append(i.intervals[0:k], i.intervals[k+1:]...)
+ return
+ } else if v == ki.Start {
+ i.intervals[k] = NewInterval(ki.Start+1, ki.Stop)
+ return
+ } else if v == ki.Stop-1 {
+ i.intervals[k] = NewInterval(ki.Start, ki.Stop-1)
+ return
+ } else if v < ki.Stop-1 {
+ x := NewInterval(ki.Start, v)
+ ki.Start = v + 1
+ // i.intervals.splice(k, 0, x)
+ i.intervals = append(i.intervals[0:k], append([]Interval{x}, i.intervals[k:]...)...)
+ return
+ }
+ }
+ }
+}
+
+func (i *IntervalSet) String() string {
+ return i.StringVerbose(nil, nil, false)
+}
+
+func (i *IntervalSet) StringVerbose(literalNames []string, symbolicNames []string, elemsAreChar bool) string {
+
+ if i.intervals == nil {
+ return "{}"
+ } else if literalNames != nil || symbolicNames != nil {
+ return i.toTokenString(literalNames, symbolicNames)
+ } else if elemsAreChar {
+ return i.toCharString()
+ }
+
+ return i.toIndexString()
+}
+
+func (i *IntervalSet) GetIntervals() []Interval {
+ return i.intervals
+}
+
+func (i *IntervalSet) toCharString() string {
+ names := make([]string, len(i.intervals))
+
+ var sb strings.Builder
+
+ for j := 0; j < len(i.intervals); j++ {
+ v := i.intervals[j]
+ if v.Stop == v.Start+1 {
+ if v.Start == TokenEOF {
+ names = append(names, "")
+ } else {
+ sb.WriteByte('\'')
+ sb.WriteRune(rune(v.Start))
+ sb.WriteByte('\'')
+ names = append(names, sb.String())
+ sb.Reset()
+ }
+ } else {
+ sb.WriteByte('\'')
+ sb.WriteRune(rune(v.Start))
+ sb.WriteString("'..'")
+ sb.WriteRune(rune(v.Stop - 1))
+ sb.WriteByte('\'')
+ names = append(names, sb.String())
+ sb.Reset()
+ }
+ }
+ if len(names) > 1 {
+ return "{" + strings.Join(names, ", ") + "}"
+ }
+
+ return names[0]
+}
+
+func (i *IntervalSet) toIndexString() string {
+
+ names := make([]string, 0)
+ for j := 0; j < len(i.intervals); j++ {
+ v := i.intervals[j]
+ if v.Stop == v.Start+1 {
+ if v.Start == TokenEOF {
+ names = append(names, "")
+ } else {
+ names = append(names, strconv.Itoa(v.Start))
+ }
+ } else {
+ names = append(names, strconv.Itoa(v.Start)+".."+strconv.Itoa(v.Stop-1))
+ }
+ }
+ if len(names) > 1 {
+ return "{" + strings.Join(names, ", ") + "}"
+ }
+
+ return names[0]
+}
+
+func (i *IntervalSet) toTokenString(literalNames []string, symbolicNames []string) string {
+ names := make([]string, 0)
+ for _, v := range i.intervals {
+ for j := v.Start; j < v.Stop; j++ {
+ names = append(names, i.elementName(literalNames, symbolicNames, j))
+ }
+ }
+ if len(names) > 1 {
+ return "{" + strings.Join(names, ", ") + "}"
+ }
+
+ return names[0]
+}
+
+func (i *IntervalSet) elementName(literalNames []string, symbolicNames []string, a int) string {
+ if a == TokenEOF {
+ return ""
+ } else if a == TokenEpsilon {
+ return ""
+ } else {
+ if a < len(literalNames) && literalNames[a] != "" {
+ return literalNames[a]
+ }
+
+ return symbolicNames[a]
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/jcollect.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/jcollect.go
new file mode 100644
index 0000000..ceccd96
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/jcollect.go
@@ -0,0 +1,685 @@
+package antlr
+
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+import (
+ "container/list"
+ "runtime/debug"
+ "sort"
+ "sync"
+)
+
+// Collectable is an interface that a struct should implement if it is to be
+// usable as a key in these collections.
+type Collectable[T any] interface {
+ Hash() int
+ Equals(other Collectable[T]) bool
+}
+
+type Comparator[T any] interface {
+ Hash1(o T) int
+ Equals2(T, T) bool
+}
+
+type CollectionSource int
+type CollectionDescriptor struct {
+ SybolicName string
+ Description string
+}
+
+const (
+ UnknownCollection CollectionSource = iota
+ ATNConfigLookupCollection
+ ATNStateCollection
+ DFAStateCollection
+ ATNConfigCollection
+ PredictionContextCollection
+ SemanticContextCollection
+ ClosureBusyCollection
+ PredictionVisitedCollection
+ MergeCacheCollection
+ PredictionContextCacheCollection
+ AltSetCollection
+ ReachSetCollection
+)
+
+var CollectionDescriptors = map[CollectionSource]CollectionDescriptor{
+ UnknownCollection: {
+ SybolicName: "UnknownCollection",
+ Description: "Unknown collection type. Only used if the target author thought it was an unimportant collection.",
+ },
+ ATNConfigCollection: {
+ SybolicName: "ATNConfigCollection",
+ Description: "ATNConfig collection. Used to store the ATNConfigs for a particular state in the ATN." +
+ "For instance, it is used to store the results of the closure() operation in the ATN.",
+ },
+ ATNConfigLookupCollection: {
+ SybolicName: "ATNConfigLookupCollection",
+ Description: "ATNConfigLookup collection. Used to store the ATNConfigs for a particular state in the ATN." +
+ "This is used to prevent duplicating equivalent states in an ATNConfigurationSet.",
+ },
+ ATNStateCollection: {
+ SybolicName: "ATNStateCollection",
+ Description: "ATNState collection. This is used to store the states of the ATN.",
+ },
+ DFAStateCollection: {
+ SybolicName: "DFAStateCollection",
+ Description: "DFAState collection. This is used to store the states of the DFA.",
+ },
+ PredictionContextCollection: {
+ SybolicName: "PredictionContextCollection",
+ Description: "PredictionContext collection. This is used to store the prediction contexts of the ATN and cache computes.",
+ },
+ SemanticContextCollection: {
+ SybolicName: "SemanticContextCollection",
+ Description: "SemanticContext collection. This is used to store the semantic contexts of the ATN.",
+ },
+ ClosureBusyCollection: {
+ SybolicName: "ClosureBusyCollection",
+ Description: "ClosureBusy collection. This is used to check and prevent infinite recursion right recursive rules." +
+ "It stores ATNConfigs that are currently being processed in the closure() operation.",
+ },
+ PredictionVisitedCollection: {
+ SybolicName: "PredictionVisitedCollection",
+ Description: "A map that records whether we have visited a particular context when searching through cached entries.",
+ },
+ MergeCacheCollection: {
+ SybolicName: "MergeCacheCollection",
+ Description: "A map that records whether we have already merged two particular contexts and can save effort by not repeating it.",
+ },
+ PredictionContextCacheCollection: {
+ SybolicName: "PredictionContextCacheCollection",
+ Description: "A map that records whether we have already created a particular context and can save effort by not computing it again.",
+ },
+ AltSetCollection: {
+ SybolicName: "AltSetCollection",
+ Description: "Used to eliminate duplicate alternatives in an ATN config set.",
+ },
+ ReachSetCollection: {
+ SybolicName: "ReachSetCollection",
+ Description: "Used as merge cache to prevent us needing to compute the merge of two states if we have already done it.",
+ },
+}
+
+// JStore implements a container that allows the use of a struct to calculate the key
+// for a collection of values akin to map. This is not meant to be a full-blown HashMap but just
+// serve the needs of the ANTLR Go runtime.
+//
+// For ease of porting the logic of the runtime from the master target (Java), this collection
+// operates in a similar way to Java, in that it can use any struct that supplies a Hash() and Equals()
+// function as the key. The values are stored in a standard go map which internally is a form of hashmap
+// itself, the key for the go map is the hash supplied by the key object. The collection is able to deal with
+// hash conflicts by using a simple slice of values associated with the hash code indexed bucket. That isn't
+// particularly efficient, but it is simple, and it works. As this is specifically for the ANTLR runtime, and
+// we understand the requirements, then this is fine - this is not a general purpose collection.
+type JStore[T any, C Comparator[T]] struct {
+ store map[int][]T
+ len int
+ comparator Comparator[T]
+ stats *JStatRec
+}
+
+func NewJStore[T any, C Comparator[T]](comparator Comparator[T], cType CollectionSource, desc string) *JStore[T, C] {
+
+ if comparator == nil {
+ panic("comparator cannot be nil")
+ }
+
+ s := &JStore[T, C]{
+ store: make(map[int][]T, 1),
+ comparator: comparator,
+ }
+ if collectStats {
+ s.stats = &JStatRec{
+ Source: cType,
+ Description: desc,
+ }
+
+ // Track where we created it from if we are being asked to do so
+ if runtimeConfig.statsTraceStacks {
+ s.stats.CreateStack = debug.Stack()
+ }
+ Statistics.AddJStatRec(s.stats)
+ }
+ return s
+}
+
+// Put will store given value in the collection. Note that the key for storage is generated from
+// the value itself - this is specifically because that is what ANTLR needs - this would not be useful
+// as any kind of general collection.
+//
+// If the key has a hash conflict, then the value will be added to the slice of values associated with the
+// hash, unless the value is already in the slice, in which case the existing value is returned. Value equivalence is
+// tested by calling the equals() method on the key.
+//
+// # If the given value is already present in the store, then the existing value is returned as v and exists is set to true
+//
+// If the given value is not present in the store, then the value is added to the store and returned as v and exists is set to false.
+func (s *JStore[T, C]) Put(value T) (v T, exists bool) {
+
+ if collectStats {
+ s.stats.Puts++
+ }
+ kh := s.comparator.Hash1(value)
+
+ var hClash bool
+ for _, v1 := range s.store[kh] {
+ hClash = true
+ if s.comparator.Equals2(value, v1) {
+ if collectStats {
+ s.stats.PutHits++
+ s.stats.PutHashConflicts++
+ }
+ return v1, true
+ }
+ if collectStats {
+ s.stats.PutMisses++
+ }
+ }
+ if collectStats && hClash {
+ s.stats.PutHashConflicts++
+ }
+ s.store[kh] = append(s.store[kh], value)
+
+ if collectStats {
+ if len(s.store[kh]) > s.stats.MaxSlotSize {
+ s.stats.MaxSlotSize = len(s.store[kh])
+ }
+ }
+ s.len++
+ if collectStats {
+ s.stats.CurSize = s.len
+ if s.len > s.stats.MaxSize {
+ s.stats.MaxSize = s.len
+ }
+ }
+ return value, false
+}
+
+// Get will return the value associated with the key - the type of the key is the same type as the value
+// which would not generally be useful, but this is a specific thing for ANTLR where the key is
+// generated using the object we are going to store.
+func (s *JStore[T, C]) Get(key T) (T, bool) {
+ if collectStats {
+ s.stats.Gets++
+ }
+ kh := s.comparator.Hash1(key)
+ var hClash bool
+ for _, v := range s.store[kh] {
+ hClash = true
+ if s.comparator.Equals2(key, v) {
+ if collectStats {
+ s.stats.GetHits++
+ s.stats.GetHashConflicts++
+ }
+ return v, true
+ }
+ if collectStats {
+ s.stats.GetMisses++
+ }
+ }
+ if collectStats {
+ if hClash {
+ s.stats.GetHashConflicts++
+ }
+ s.stats.GetNoEnt++
+ }
+ return key, false
+}
+
+// Contains returns true if the given key is present in the store
+func (s *JStore[T, C]) Contains(key T) bool {
+ _, present := s.Get(key)
+ return present
+}
+
+func (s *JStore[T, C]) SortedSlice(less func(i, j T) bool) []T {
+ vs := make([]T, 0, len(s.store))
+ for _, v := range s.store {
+ vs = append(vs, v...)
+ }
+ sort.Slice(vs, func(i, j int) bool {
+ return less(vs[i], vs[j])
+ })
+
+ return vs
+}
+
+func (s *JStore[T, C]) Each(f func(T) bool) {
+ for _, e := range s.store {
+ for _, v := range e {
+ f(v)
+ }
+ }
+}
+
+func (s *JStore[T, C]) Len() int {
+ return s.len
+}
+
+func (s *JStore[T, C]) Values() []T {
+ vs := make([]T, 0, len(s.store))
+ for _, e := range s.store {
+ vs = append(vs, e...)
+ }
+ return vs
+}
+
+type entry[K, V any] struct {
+ key K
+ val V
+}
+
+type JMap[K, V any, C Comparator[K]] struct {
+ store map[int][]*entry[K, V]
+ len int
+ comparator Comparator[K]
+ stats *JStatRec
+}
+
+func NewJMap[K, V any, C Comparator[K]](comparator Comparator[K], cType CollectionSource, desc string) *JMap[K, V, C] {
+ m := &JMap[K, V, C]{
+ store: make(map[int][]*entry[K, V], 1),
+ comparator: comparator,
+ }
+ if collectStats {
+ m.stats = &JStatRec{
+ Source: cType,
+ Description: desc,
+ }
+ // Track where we created it from if we are being asked to do so
+ if runtimeConfig.statsTraceStacks {
+ m.stats.CreateStack = debug.Stack()
+ }
+ Statistics.AddJStatRec(m.stats)
+ }
+ return m
+}
+
+func (m *JMap[K, V, C]) Put(key K, val V) (V, bool) {
+ if collectStats {
+ m.stats.Puts++
+ }
+ kh := m.comparator.Hash1(key)
+
+ var hClash bool
+ for _, e := range m.store[kh] {
+ hClash = true
+ if m.comparator.Equals2(e.key, key) {
+ if collectStats {
+ m.stats.PutHits++
+ m.stats.PutHashConflicts++
+ }
+ return e.val, true
+ }
+ if collectStats {
+ m.stats.PutMisses++
+ }
+ }
+ if collectStats {
+ if hClash {
+ m.stats.PutHashConflicts++
+ }
+ }
+ m.store[kh] = append(m.store[kh], &entry[K, V]{key, val})
+ if collectStats {
+ if len(m.store[kh]) > m.stats.MaxSlotSize {
+ m.stats.MaxSlotSize = len(m.store[kh])
+ }
+ }
+ m.len++
+ if collectStats {
+ m.stats.CurSize = m.len
+ if m.len > m.stats.MaxSize {
+ m.stats.MaxSize = m.len
+ }
+ }
+ return val, false
+}
+
+func (m *JMap[K, V, C]) Values() []V {
+ vs := make([]V, 0, len(m.store))
+ for _, e := range m.store {
+ for _, v := range e {
+ vs = append(vs, v.val)
+ }
+ }
+ return vs
+}
+
+func (m *JMap[K, V, C]) Get(key K) (V, bool) {
+ if collectStats {
+ m.stats.Gets++
+ }
+ var none V
+ kh := m.comparator.Hash1(key)
+ var hClash bool
+ for _, e := range m.store[kh] {
+ hClash = true
+ if m.comparator.Equals2(e.key, key) {
+ if collectStats {
+ m.stats.GetHits++
+ m.stats.GetHashConflicts++
+ }
+ return e.val, true
+ }
+ if collectStats {
+ m.stats.GetMisses++
+ }
+ }
+ if collectStats {
+ if hClash {
+ m.stats.GetHashConflicts++
+ }
+ m.stats.GetNoEnt++
+ }
+ return none, false
+}
+
+func (m *JMap[K, V, C]) Len() int {
+ return m.len
+}
+
+func (m *JMap[K, V, C]) Delete(key K) {
+ kh := m.comparator.Hash1(key)
+ for i, e := range m.store[kh] {
+ if m.comparator.Equals2(e.key, key) {
+ m.store[kh] = append(m.store[kh][:i], m.store[kh][i+1:]...)
+ m.len--
+ return
+ }
+ }
+}
+
+func (m *JMap[K, V, C]) Clear() {
+ m.store = make(map[int][]*entry[K, V])
+}
+
+type JPCMap struct {
+ store *JMap[*PredictionContext, *JMap[*PredictionContext, *PredictionContext, *ObjEqComparator[*PredictionContext]], *ObjEqComparator[*PredictionContext]]
+ size int
+ stats *JStatRec
+}
+
+func NewJPCMap(cType CollectionSource, desc string) *JPCMap {
+ m := &JPCMap{
+ store: NewJMap[*PredictionContext, *JMap[*PredictionContext, *PredictionContext, *ObjEqComparator[*PredictionContext]], *ObjEqComparator[*PredictionContext]](pContextEqInst, cType, desc),
+ }
+ if collectStats {
+ m.stats = &JStatRec{
+ Source: cType,
+ Description: desc,
+ }
+ // Track where we created it from if we are being asked to do so
+ if runtimeConfig.statsTraceStacks {
+ m.stats.CreateStack = debug.Stack()
+ }
+ Statistics.AddJStatRec(m.stats)
+ }
+ return m
+}
+
+func (pcm *JPCMap) Get(k1, k2 *PredictionContext) (*PredictionContext, bool) {
+ if collectStats {
+ pcm.stats.Gets++
+ }
+ // Do we have a map stored by k1?
+ //
+ m2, present := pcm.store.Get(k1)
+ if present {
+ if collectStats {
+ pcm.stats.GetHits++
+ }
+ // We found a map of values corresponding to k1, so now we need to look up k2 in that map
+ //
+ return m2.Get(k2)
+ }
+ if collectStats {
+ pcm.stats.GetMisses++
+ }
+ return nil, false
+}
+
+func (pcm *JPCMap) Put(k1, k2, v *PredictionContext) {
+
+ if collectStats {
+ pcm.stats.Puts++
+ }
+ // First does a map already exist for k1?
+ //
+ if m2, present := pcm.store.Get(k1); present {
+ if collectStats {
+ pcm.stats.PutHits++
+ }
+ _, present = m2.Put(k2, v)
+ if !present {
+ pcm.size++
+ if collectStats {
+ pcm.stats.CurSize = pcm.size
+ if pcm.size > pcm.stats.MaxSize {
+ pcm.stats.MaxSize = pcm.size
+ }
+ }
+ }
+ } else {
+ // No map found for k1, so we create it, add in our value, then store is
+ //
+ if collectStats {
+ pcm.stats.PutMisses++
+ m2 = NewJMap[*PredictionContext, *PredictionContext, *ObjEqComparator[*PredictionContext]](pContextEqInst, pcm.stats.Source, pcm.stats.Description+" map entry")
+ } else {
+ m2 = NewJMap[*PredictionContext, *PredictionContext, *ObjEqComparator[*PredictionContext]](pContextEqInst, PredictionContextCacheCollection, "map entry")
+ }
+
+ m2.Put(k2, v)
+ pcm.store.Put(k1, m2)
+ pcm.size++
+ }
+}
+
+type JPCMap2 struct {
+ store map[int][]JPCEntry
+ size int
+ stats *JStatRec
+}
+
+type JPCEntry struct {
+ k1, k2, v *PredictionContext
+}
+
+func NewJPCMap2(cType CollectionSource, desc string) *JPCMap2 {
+ m := &JPCMap2{
+ store: make(map[int][]JPCEntry, 1000),
+ }
+ if collectStats {
+ m.stats = &JStatRec{
+ Source: cType,
+ Description: desc,
+ }
+ // Track where we created it from if we are being asked to do so
+ if runtimeConfig.statsTraceStacks {
+ m.stats.CreateStack = debug.Stack()
+ }
+ Statistics.AddJStatRec(m.stats)
+ }
+ return m
+}
+
+func dHash(k1, k2 *PredictionContext) int {
+ return k1.cachedHash*31 + k2.cachedHash
+}
+
+func (pcm *JPCMap2) Get(k1, k2 *PredictionContext) (*PredictionContext, bool) {
+ if collectStats {
+ pcm.stats.Gets++
+ }
+
+ h := dHash(k1, k2)
+ var hClash bool
+ for _, e := range pcm.store[h] {
+ hClash = true
+ if e.k1.Equals(k1) && e.k2.Equals(k2) {
+ if collectStats {
+ pcm.stats.GetHits++
+ pcm.stats.GetHashConflicts++
+ }
+ return e.v, true
+ }
+ if collectStats {
+ pcm.stats.GetMisses++
+ }
+ }
+ if collectStats {
+ if hClash {
+ pcm.stats.GetHashConflicts++
+ }
+ pcm.stats.GetNoEnt++
+ }
+ return nil, false
+}
+
+func (pcm *JPCMap2) Put(k1, k2, v *PredictionContext) (*PredictionContext, bool) {
+ if collectStats {
+ pcm.stats.Puts++
+ }
+ h := dHash(k1, k2)
+ var hClash bool
+ for _, e := range pcm.store[h] {
+ hClash = true
+ if e.k1.Equals(k1) && e.k2.Equals(k2) {
+ if collectStats {
+ pcm.stats.PutHits++
+ pcm.stats.PutHashConflicts++
+ }
+ return e.v, true
+ }
+ if collectStats {
+ pcm.stats.PutMisses++
+ }
+ }
+ if collectStats {
+ if hClash {
+ pcm.stats.PutHashConflicts++
+ }
+ }
+ pcm.store[h] = append(pcm.store[h], JPCEntry{k1, k2, v})
+ pcm.size++
+ if collectStats {
+ pcm.stats.CurSize = pcm.size
+ if pcm.size > pcm.stats.MaxSize {
+ pcm.stats.MaxSize = pcm.size
+ }
+ }
+ return nil, false
+}
+
+type VisitEntry struct {
+ k *PredictionContext
+ v *PredictionContext
+}
+type VisitRecord struct {
+ store map[*PredictionContext]*PredictionContext
+ len int
+ stats *JStatRec
+}
+
+type VisitList struct {
+ cache *list.List
+ lock sync.RWMutex
+}
+
+var visitListPool = VisitList{
+ cache: list.New(),
+ lock: sync.RWMutex{},
+}
+
+// NewVisitRecord returns a new VisitRecord instance from the pool if available.
+// Note that this "map" uses a pointer as a key because we are emulating the behavior of
+// IdentityHashMap in Java, which uses the `==` operator to compare whether the keys are equal,
+// which means is the key the same reference to an object rather than is it .equals() to another
+// object.
+func NewVisitRecord() *VisitRecord {
+ visitListPool.lock.Lock()
+ el := visitListPool.cache.Front()
+ defer visitListPool.lock.Unlock()
+ var vr *VisitRecord
+ if el == nil {
+ vr = &VisitRecord{
+ store: make(map[*PredictionContext]*PredictionContext),
+ }
+ if collectStats {
+ vr.stats = &JStatRec{
+ Source: PredictionContextCacheCollection,
+ Description: "VisitRecord",
+ }
+ // Track where we created it from if we are being asked to do so
+ if runtimeConfig.statsTraceStacks {
+ vr.stats.CreateStack = debug.Stack()
+ }
+ }
+ } else {
+ vr = el.Value.(*VisitRecord)
+ visitListPool.cache.Remove(el)
+ vr.store = make(map[*PredictionContext]*PredictionContext)
+ }
+ if collectStats {
+ Statistics.AddJStatRec(vr.stats)
+ }
+ return vr
+}
+
+func (vr *VisitRecord) Release() {
+ vr.len = 0
+ vr.store = nil
+ if collectStats {
+ vr.stats.MaxSize = 0
+ vr.stats.CurSize = 0
+ vr.stats.Gets = 0
+ vr.stats.GetHits = 0
+ vr.stats.GetMisses = 0
+ vr.stats.GetHashConflicts = 0
+ vr.stats.GetNoEnt = 0
+ vr.stats.Puts = 0
+ vr.stats.PutHits = 0
+ vr.stats.PutMisses = 0
+ vr.stats.PutHashConflicts = 0
+ vr.stats.MaxSlotSize = 0
+ }
+ visitListPool.lock.Lock()
+ visitListPool.cache.PushBack(vr)
+ visitListPool.lock.Unlock()
+}
+
+func (vr *VisitRecord) Get(k *PredictionContext) (*PredictionContext, bool) {
+ if collectStats {
+ vr.stats.Gets++
+ }
+ v := vr.store[k]
+ if v != nil {
+ if collectStats {
+ vr.stats.GetHits++
+ }
+ return v, true
+ }
+ if collectStats {
+ vr.stats.GetNoEnt++
+ }
+ return nil, false
+}
+
+func (vr *VisitRecord) Put(k, v *PredictionContext) (*PredictionContext, bool) {
+ if collectStats {
+ vr.stats.Puts++
+ }
+ vr.store[k] = v
+ vr.len++
+ if collectStats {
+ vr.stats.CurSize = vr.len
+ if vr.len > vr.stats.MaxSize {
+ vr.stats.MaxSize = vr.len
+ }
+ }
+ return v, false
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer.go
new file mode 100644
index 0000000..3c7896a
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer.go
@@ -0,0 +1,426 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strconv"
+)
+
+// A lexer is recognizer that draws input symbols from a character stream.
+// lexer grammars result in a subclass of this object. A Lexer object
+// uses simplified Match() and error recovery mechanisms in the interest
+// of speed.
+///
+
+type Lexer interface {
+ TokenSource
+ Recognizer
+
+ Emit() Token
+
+ SetChannel(int)
+ PushMode(int)
+ PopMode() int
+ SetType(int)
+ SetMode(int)
+}
+
+type BaseLexer struct {
+ *BaseRecognizer
+
+ Interpreter ILexerATNSimulator
+ TokenStartCharIndex int
+ TokenStartLine int
+ TokenStartColumn int
+ ActionType int
+ Virt Lexer // The most derived lexer implementation. Allows virtual method calls.
+
+ input CharStream
+ factory TokenFactory
+ tokenFactorySourcePair *TokenSourceCharStreamPair
+ token Token
+ hitEOF bool
+ channel int
+ thetype int
+ modeStack IntStack
+ mode int
+ text string
+}
+
+func NewBaseLexer(input CharStream) *BaseLexer {
+
+ lexer := new(BaseLexer)
+
+ lexer.BaseRecognizer = NewBaseRecognizer()
+
+ lexer.input = input
+ lexer.factory = CommonTokenFactoryDEFAULT
+ lexer.tokenFactorySourcePair = &TokenSourceCharStreamPair{lexer, input}
+
+ lexer.Virt = lexer
+
+ lexer.Interpreter = nil // child classes must populate it
+
+ // The goal of all lexer rules/methods is to create a token object.
+ // l is an instance variable as multiple rules may collaborate to
+ // create a single token. NextToken will return l object after
+ // Matching lexer rule(s). If you subclass to allow multiple token
+ // emissions, then set l to the last token to be Matched or
+ // something non nil so that the auto token emit mechanism will not
+ // emit another token.
+ lexer.token = nil
+
+ // What character index in the stream did the current token start at?
+ // Needed, for example, to get the text for current token. Set at
+ // the start of NextToken.
+ lexer.TokenStartCharIndex = -1
+
+ // The line on which the first character of the token resides///
+ lexer.TokenStartLine = -1
+
+ // The character position of first character within the line///
+ lexer.TokenStartColumn = -1
+
+ // Once we see EOF on char stream, next token will be EOF.
+ // If you have DONE : EOF then you see DONE EOF.
+ lexer.hitEOF = false
+
+ // The channel number for the current token///
+ lexer.channel = TokenDefaultChannel
+
+ // The token type for the current token///
+ lexer.thetype = TokenInvalidType
+
+ lexer.modeStack = make([]int, 0)
+ lexer.mode = LexerDefaultMode
+
+ // You can set the text for the current token to override what is in
+ // the input char buffer. Use setText() or can set l instance var.
+ // /
+ lexer.text = ""
+
+ return lexer
+}
+
+const (
+ LexerDefaultMode = 0
+ LexerMore = -2
+ LexerSkip = -3
+)
+
+//goland:noinspection GoUnusedConst
+const (
+ LexerDefaultTokenChannel = TokenDefaultChannel
+ LexerHidden = TokenHiddenChannel
+ LexerMinCharValue = 0x0000
+ LexerMaxCharValue = 0x10FFFF
+)
+
+func (b *BaseLexer) Reset() {
+ // wack Lexer state variables
+ if b.input != nil {
+ b.input.Seek(0) // rewind the input
+ }
+ b.token = nil
+ b.thetype = TokenInvalidType
+ b.channel = TokenDefaultChannel
+ b.TokenStartCharIndex = -1
+ b.TokenStartColumn = -1
+ b.TokenStartLine = -1
+ b.text = ""
+
+ b.hitEOF = false
+ b.mode = LexerDefaultMode
+ b.modeStack = make([]int, 0)
+
+ b.Interpreter.reset()
+}
+
+func (b *BaseLexer) GetInterpreter() ILexerATNSimulator {
+ return b.Interpreter
+}
+
+func (b *BaseLexer) GetInputStream() CharStream {
+ return b.input
+}
+
+func (b *BaseLexer) GetSourceName() string {
+ return b.GrammarFileName
+}
+
+func (b *BaseLexer) SetChannel(v int) {
+ b.channel = v
+}
+
+func (b *BaseLexer) GetTokenFactory() TokenFactory {
+ return b.factory
+}
+
+func (b *BaseLexer) setTokenFactory(f TokenFactory) {
+ b.factory = f
+}
+
+func (b *BaseLexer) safeMatch() (ret int) {
+ defer func() {
+ if e := recover(); e != nil {
+ if re, ok := e.(RecognitionException); ok {
+ b.notifyListeners(re) // Report error
+ b.Recover(re)
+ ret = LexerSkip // default
+ }
+ }
+ }()
+
+ return b.Interpreter.Match(b.input, b.mode)
+}
+
+// NextToken returns a token from the lexer input source i.e., Match a token on the source char stream.
+func (b *BaseLexer) NextToken() Token {
+ if b.input == nil {
+ panic("NextToken requires a non-nil input stream.")
+ }
+
+ tokenStartMarker := b.input.Mark()
+
+ // previously in finally block
+ defer func() {
+ // make sure we release marker after Match or
+ // unbuffered char stream will keep buffering
+ b.input.Release(tokenStartMarker)
+ }()
+
+ for {
+ if b.hitEOF {
+ b.EmitEOF()
+ return b.token
+ }
+ b.token = nil
+ b.channel = TokenDefaultChannel
+ b.TokenStartCharIndex = b.input.Index()
+ b.TokenStartColumn = b.Interpreter.GetCharPositionInLine()
+ b.TokenStartLine = b.Interpreter.GetLine()
+ b.text = ""
+ continueOuter := false
+ for {
+ b.thetype = TokenInvalidType
+
+ ttype := b.safeMatch()
+
+ if b.input.LA(1) == TokenEOF {
+ b.hitEOF = true
+ }
+ if b.thetype == TokenInvalidType {
+ b.thetype = ttype
+ }
+ if b.thetype == LexerSkip {
+ continueOuter = true
+ break
+ }
+ if b.thetype != LexerMore {
+ break
+ }
+ }
+
+ if continueOuter {
+ continue
+ }
+ if b.token == nil {
+ b.Virt.Emit()
+ }
+ return b.token
+ }
+}
+
+// Skip instructs the lexer to Skip creating a token for current lexer rule
+// and look for another token. [NextToken] knows to keep looking when
+// a lexer rule finishes with token set to [SKIPTOKEN]. Recall that
+// if token==nil at end of any token rule, it creates one for you
+// and emits it.
+func (b *BaseLexer) Skip() {
+ b.thetype = LexerSkip
+}
+
+func (b *BaseLexer) More() {
+ b.thetype = LexerMore
+}
+
+// SetMode changes the lexer to a new mode. The lexer will use this mode from hereon in and the rules for that mode
+// will be in force.
+func (b *BaseLexer) SetMode(m int) {
+ b.mode = m
+}
+
+// PushMode saves the current lexer mode so that it can be restored later. See [PopMode], then sets the
+// current lexer mode to the supplied mode m.
+func (b *BaseLexer) PushMode(m int) {
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Println("pushMode " + strconv.Itoa(m))
+ }
+ b.modeStack.Push(b.mode)
+ b.mode = m
+}
+
+// PopMode restores the lexer mode saved by a call to [PushMode]. It is a panic error if there is no saved mode to
+// return to.
+func (b *BaseLexer) PopMode() int {
+ if len(b.modeStack) == 0 {
+ panic("Empty Stack")
+ }
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Println("popMode back to " + fmt.Sprint(b.modeStack[0:len(b.modeStack)-1]))
+ }
+ i, _ := b.modeStack.Pop()
+ b.mode = i
+ return b.mode
+}
+
+func (b *BaseLexer) inputStream() CharStream {
+ return b.input
+}
+
+// SetInputStream resets the lexer input stream and associated lexer state.
+func (b *BaseLexer) SetInputStream(input CharStream) {
+ b.input = nil
+ b.tokenFactorySourcePair = &TokenSourceCharStreamPair{b, b.input}
+ b.Reset()
+ b.input = input
+ b.tokenFactorySourcePair = &TokenSourceCharStreamPair{b, b.input}
+}
+
+func (b *BaseLexer) GetTokenSourceCharStreamPair() *TokenSourceCharStreamPair {
+ return b.tokenFactorySourcePair
+}
+
+// EmitToken by default does not support multiple emits per [NextToken] invocation
+// for efficiency reasons. Subclass and override this func, [NextToken],
+// and [GetToken] (to push tokens into a list and pull from that list
+// rather than a single variable as this implementation does).
+func (b *BaseLexer) EmitToken(token Token) {
+ b.token = token
+}
+
+// Emit is the standard method called to automatically emit a token at the
+// outermost lexical rule. The token object should point into the
+// char buffer start..stop. If there is a text override in 'text',
+// use that to set the token's text. Override this method to emit
+// custom [Token] objects or provide a new factory.
+// /
+func (b *BaseLexer) Emit() Token {
+ t := b.factory.Create(b.tokenFactorySourcePair, b.thetype, b.text, b.channel, b.TokenStartCharIndex, b.GetCharIndex()-1, b.TokenStartLine, b.TokenStartColumn)
+ b.EmitToken(t)
+ return t
+}
+
+// EmitEOF emits an EOF token. By default, this is the last token emitted
+func (b *BaseLexer) EmitEOF() Token {
+ cpos := b.GetCharPositionInLine()
+ lpos := b.GetLine()
+ eof := b.factory.Create(b.tokenFactorySourcePair, TokenEOF, "", TokenDefaultChannel, b.input.Index(), b.input.Index()-1, lpos, cpos)
+ b.EmitToken(eof)
+ return eof
+}
+
+// GetCharPositionInLine returns the current position in the current line as far as the lexer is concerned.
+func (b *BaseLexer) GetCharPositionInLine() int {
+ return b.Interpreter.GetCharPositionInLine()
+}
+
+func (b *BaseLexer) GetLine() int {
+ return b.Interpreter.GetLine()
+}
+
+func (b *BaseLexer) GetType() int {
+ return b.thetype
+}
+
+func (b *BaseLexer) SetType(t int) {
+ b.thetype = t
+}
+
+// GetCharIndex returns the index of the current character of lookahead
+func (b *BaseLexer) GetCharIndex() int {
+ return b.input.Index()
+}
+
+// GetText returns the text Matched so far for the current token or any text override.
+func (b *BaseLexer) GetText() string {
+ if b.text != "" {
+ return b.text
+ }
+
+ return b.Interpreter.GetText(b.input)
+}
+
+// SetText sets the complete text of this token; it wipes any previous changes to the text.
+func (b *BaseLexer) SetText(text string) {
+ b.text = text
+}
+
+// GetATN returns the ATN used by the lexer.
+func (b *BaseLexer) GetATN() *ATN {
+ return b.Interpreter.ATN()
+}
+
+// GetAllTokens returns a list of all [Token] objects in input char stream.
+// Forces a load of all tokens that can be made from the input char stream.
+//
+// Does not include EOF token.
+func (b *BaseLexer) GetAllTokens() []Token {
+ vl := b.Virt
+ tokens := make([]Token, 0)
+ t := vl.NextToken()
+ for t.GetTokenType() != TokenEOF {
+ tokens = append(tokens, t)
+ t = vl.NextToken()
+ }
+ return tokens
+}
+
+func (b *BaseLexer) notifyListeners(e RecognitionException) {
+ start := b.TokenStartCharIndex
+ stop := b.input.Index()
+ text := b.input.GetTextFromInterval(NewInterval(start, stop))
+ msg := "token recognition error at: '" + text + "'"
+ listener := b.GetErrorListenerDispatch()
+ listener.SyntaxError(b, nil, b.TokenStartLine, b.TokenStartColumn, msg, e)
+}
+
+func (b *BaseLexer) getErrorDisplayForChar(c rune) string {
+ if c == TokenEOF {
+ return ""
+ } else if c == '\n' {
+ return "\\n"
+ } else if c == '\t' {
+ return "\\t"
+ } else if c == '\r' {
+ return "\\r"
+ } else {
+ return string(c)
+ }
+}
+
+func (b *BaseLexer) getCharErrorDisplay(c rune) string {
+ return "'" + b.getErrorDisplayForChar(c) + "'"
+}
+
+// Recover can normally Match any char in its vocabulary after Matching
+// a token, so here we do the easy thing and just kill a character and hope
+// it all works out. You can instead use the rule invocation stack
+// to do sophisticated error recovery if you are in a fragment rule.
+//
+// In general, lexers should not need to recover and should have rules that cover any eventuality, such as
+// a character that makes no sense to the recognizer.
+func (b *BaseLexer) Recover(re RecognitionException) {
+ if b.input.LA(1) != TokenEOF {
+ if _, ok := re.(*LexerNoViableAltException); ok {
+ // Skip a char and try again
+ b.Interpreter.Consume(b.input)
+ } else {
+ // TODO: Do we lose character or line position information?
+ b.input.Consume()
+ }
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer_action.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer_action.go
new file mode 100644
index 0000000..eaa7393
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer_action.go
@@ -0,0 +1,452 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import "strconv"
+
+const (
+ // LexerActionTypeChannel represents a [LexerChannelAction] action.
+ LexerActionTypeChannel = 0
+
+ // LexerActionTypeCustom represents a [LexerCustomAction] action.
+ LexerActionTypeCustom = 1
+
+ // LexerActionTypeMode represents a [LexerModeAction] action.
+ LexerActionTypeMode = 2
+
+ // LexerActionTypeMore represents a [LexerMoreAction] action.
+ LexerActionTypeMore = 3
+
+ // LexerActionTypePopMode represents a [LexerPopModeAction] action.
+ LexerActionTypePopMode = 4
+
+ // LexerActionTypePushMode represents a [LexerPushModeAction] action.
+ LexerActionTypePushMode = 5
+
+ // LexerActionTypeSkip represents a [LexerSkipAction] action.
+ LexerActionTypeSkip = 6
+
+ // LexerActionTypeType represents a [LexerTypeAction] action.
+ LexerActionTypeType = 7
+)
+
+type LexerAction interface {
+ getActionType() int
+ getIsPositionDependent() bool
+ execute(lexer Lexer)
+ Hash() int
+ Equals(other LexerAction) bool
+}
+
+type BaseLexerAction struct {
+ actionType int
+ isPositionDependent bool
+}
+
+func NewBaseLexerAction(action int) *BaseLexerAction {
+ la := new(BaseLexerAction)
+
+ la.actionType = action
+ la.isPositionDependent = false
+
+ return la
+}
+
+func (b *BaseLexerAction) execute(_ Lexer) {
+ panic("Not implemented")
+}
+
+func (b *BaseLexerAction) getActionType() int {
+ return b.actionType
+}
+
+func (b *BaseLexerAction) getIsPositionDependent() bool {
+ return b.isPositionDependent
+}
+
+func (b *BaseLexerAction) Hash() int {
+ h := murmurInit(0)
+ h = murmurUpdate(h, b.actionType)
+ return murmurFinish(h, 1)
+}
+
+func (b *BaseLexerAction) Equals(other LexerAction) bool {
+ return b.actionType == other.getActionType()
+}
+
+// LexerSkipAction implements the [BaseLexerAction.Skip] lexer action by calling [Lexer.Skip].
+//
+// The Skip command does not have any parameters, so this action is
+// implemented as a singleton instance exposed by the [LexerSkipActionINSTANCE].
+type LexerSkipAction struct {
+ *BaseLexerAction
+}
+
+func NewLexerSkipAction() *LexerSkipAction {
+ la := new(LexerSkipAction)
+ la.BaseLexerAction = NewBaseLexerAction(LexerActionTypeSkip)
+ return la
+}
+
+// LexerSkipActionINSTANCE provides a singleton instance of this parameterless lexer action.
+var LexerSkipActionINSTANCE = NewLexerSkipAction()
+
+func (l *LexerSkipAction) execute(lexer Lexer) {
+ lexer.Skip()
+}
+
+// String returns a string representation of the current [LexerSkipAction].
+func (l *LexerSkipAction) String() string {
+ return "skip"
+}
+
+func (b *LexerSkipAction) Equals(other LexerAction) bool {
+ return other.getActionType() == LexerActionTypeSkip
+}
+
+// Implements the {@code type} lexer action by calling {@link Lexer//setType}
+//
+// with the assigned type.
+type LexerTypeAction struct {
+ *BaseLexerAction
+
+ thetype int
+}
+
+func NewLexerTypeAction(thetype int) *LexerTypeAction {
+ l := new(LexerTypeAction)
+ l.BaseLexerAction = NewBaseLexerAction(LexerActionTypeType)
+ l.thetype = thetype
+ return l
+}
+
+func (l *LexerTypeAction) execute(lexer Lexer) {
+ lexer.SetType(l.thetype)
+}
+
+func (l *LexerTypeAction) Hash() int {
+ h := murmurInit(0)
+ h = murmurUpdate(h, l.actionType)
+ h = murmurUpdate(h, l.thetype)
+ return murmurFinish(h, 2)
+}
+
+func (l *LexerTypeAction) Equals(other LexerAction) bool {
+ if l == other {
+ return true
+ } else if _, ok := other.(*LexerTypeAction); !ok {
+ return false
+ } else {
+ return l.thetype == other.(*LexerTypeAction).thetype
+ }
+}
+
+func (l *LexerTypeAction) String() string {
+ return "actionType(" + strconv.Itoa(l.thetype) + ")"
+}
+
+// LexerPushModeAction implements the pushMode lexer action by calling
+// [Lexer.pushMode] with the assigned mode.
+type LexerPushModeAction struct {
+ *BaseLexerAction
+ mode int
+}
+
+func NewLexerPushModeAction(mode int) *LexerPushModeAction {
+
+ l := new(LexerPushModeAction)
+ l.BaseLexerAction = NewBaseLexerAction(LexerActionTypePushMode)
+
+ l.mode = mode
+ return l
+}
+
+// This action is implemented by calling {@link Lexer//pushMode} with the
+// value provided by {@link //getMode}.
+func (l *LexerPushModeAction) execute(lexer Lexer) {
+ lexer.PushMode(l.mode)
+}
+
+func (l *LexerPushModeAction) Hash() int {
+ h := murmurInit(0)
+ h = murmurUpdate(h, l.actionType)
+ h = murmurUpdate(h, l.mode)
+ return murmurFinish(h, 2)
+}
+
+func (l *LexerPushModeAction) Equals(other LexerAction) bool {
+ if l == other {
+ return true
+ } else if _, ok := other.(*LexerPushModeAction); !ok {
+ return false
+ } else {
+ return l.mode == other.(*LexerPushModeAction).mode
+ }
+}
+
+func (l *LexerPushModeAction) String() string {
+ return "pushMode(" + strconv.Itoa(l.mode) + ")"
+}
+
+// LexerPopModeAction implements the popMode lexer action by calling [Lexer.popMode].
+//
+// The popMode command does not have any parameters, so this action is
+// implemented as a singleton instance exposed by [LexerPopModeActionINSTANCE]
+type LexerPopModeAction struct {
+ *BaseLexerAction
+}
+
+func NewLexerPopModeAction() *LexerPopModeAction {
+
+ l := new(LexerPopModeAction)
+
+ l.BaseLexerAction = NewBaseLexerAction(LexerActionTypePopMode)
+
+ return l
+}
+
+var LexerPopModeActionINSTANCE = NewLexerPopModeAction()
+
+// This action is implemented by calling {@link Lexer//popMode}.
+func (l *LexerPopModeAction) execute(lexer Lexer) {
+ lexer.PopMode()
+}
+
+func (l *LexerPopModeAction) String() string {
+ return "popMode"
+}
+
+// Implements the {@code more} lexer action by calling {@link Lexer//more}.
+//
+// The {@code more} command does not have any parameters, so l action is
+// implemented as a singleton instance exposed by {@link //INSTANCE}.
+
+type LexerMoreAction struct {
+ *BaseLexerAction
+}
+
+func NewLexerMoreAction() *LexerMoreAction {
+ l := new(LexerMoreAction)
+ l.BaseLexerAction = NewBaseLexerAction(LexerActionTypeMore)
+
+ return l
+}
+
+var LexerMoreActionINSTANCE = NewLexerMoreAction()
+
+// This action is implemented by calling {@link Lexer//popMode}.
+func (l *LexerMoreAction) execute(lexer Lexer) {
+ lexer.More()
+}
+
+func (l *LexerMoreAction) String() string {
+ return "more"
+}
+
+// LexerModeAction implements the mode lexer action by calling [Lexer.mode] with
+// the assigned mode.
+type LexerModeAction struct {
+ *BaseLexerAction
+ mode int
+}
+
+func NewLexerModeAction(mode int) *LexerModeAction {
+ l := new(LexerModeAction)
+ l.BaseLexerAction = NewBaseLexerAction(LexerActionTypeMode)
+ l.mode = mode
+ return l
+}
+
+// This action is implemented by calling {@link Lexer//mode} with the
+// value provided by {@link //getMode}.
+func (l *LexerModeAction) execute(lexer Lexer) {
+ lexer.SetMode(l.mode)
+}
+
+func (l *LexerModeAction) Hash() int {
+ h := murmurInit(0)
+ h = murmurUpdate(h, l.actionType)
+ h = murmurUpdate(h, l.mode)
+ return murmurFinish(h, 2)
+}
+
+func (l *LexerModeAction) Equals(other LexerAction) bool {
+ if l == other {
+ return true
+ } else if _, ok := other.(*LexerModeAction); !ok {
+ return false
+ } else {
+ return l.mode == other.(*LexerModeAction).mode
+ }
+}
+
+func (l *LexerModeAction) String() string {
+ return "mode(" + strconv.Itoa(l.mode) + ")"
+}
+
+// Executes a custom lexer action by calling {@link Recognizer//action} with the
+// rule and action indexes assigned to the custom action. The implementation of
+// a custom action is added to the generated code for the lexer in an override
+// of {@link Recognizer//action} when the grammar is compiled.
+//
+// This class may represent embedded actions created with the {...}
+// syntax in ANTLR 4, as well as actions created for lexer commands where the
+// command argument could not be evaluated when the grammar was compiled.
+
+// Constructs a custom lexer action with the specified rule and action
+// indexes.
+//
+// @param ruleIndex The rule index to use for calls to
+// {@link Recognizer//action}.
+// @param actionIndex The action index to use for calls to
+// {@link Recognizer//action}.
+
+type LexerCustomAction struct {
+ *BaseLexerAction
+ ruleIndex, actionIndex int
+}
+
+func NewLexerCustomAction(ruleIndex, actionIndex int) *LexerCustomAction {
+ l := new(LexerCustomAction)
+ l.BaseLexerAction = NewBaseLexerAction(LexerActionTypeCustom)
+ l.ruleIndex = ruleIndex
+ l.actionIndex = actionIndex
+ l.isPositionDependent = true
+ return l
+}
+
+// Custom actions are implemented by calling {@link Lexer//action} with the
+// appropriate rule and action indexes.
+func (l *LexerCustomAction) execute(lexer Lexer) {
+ lexer.Action(nil, l.ruleIndex, l.actionIndex)
+}
+
+func (l *LexerCustomAction) Hash() int {
+ h := murmurInit(0)
+ h = murmurUpdate(h, l.actionType)
+ h = murmurUpdate(h, l.ruleIndex)
+ h = murmurUpdate(h, l.actionIndex)
+ return murmurFinish(h, 3)
+}
+
+func (l *LexerCustomAction) Equals(other LexerAction) bool {
+ if l == other {
+ return true
+ } else if _, ok := other.(*LexerCustomAction); !ok {
+ return false
+ } else {
+ return l.ruleIndex == other.(*LexerCustomAction).ruleIndex &&
+ l.actionIndex == other.(*LexerCustomAction).actionIndex
+ }
+}
+
+// LexerChannelAction implements the channel lexer action by calling
+// [Lexer.setChannel] with the assigned channel.
+//
+// Constructs a new channel action with the specified channel value.
+type LexerChannelAction struct {
+ *BaseLexerAction
+ channel int
+}
+
+// NewLexerChannelAction creates a channel lexer action by calling
+// [Lexer.setChannel] with the assigned channel.
+//
+// Constructs a new channel action with the specified channel value.
+func NewLexerChannelAction(channel int) *LexerChannelAction {
+ l := new(LexerChannelAction)
+ l.BaseLexerAction = NewBaseLexerAction(LexerActionTypeChannel)
+ l.channel = channel
+ return l
+}
+
+// This action is implemented by calling {@link Lexer//setChannel} with the
+// value provided by {@link //getChannel}.
+func (l *LexerChannelAction) execute(lexer Lexer) {
+ lexer.SetChannel(l.channel)
+}
+
+func (l *LexerChannelAction) Hash() int {
+ h := murmurInit(0)
+ h = murmurUpdate(h, l.actionType)
+ h = murmurUpdate(h, l.channel)
+ return murmurFinish(h, 2)
+}
+
+func (l *LexerChannelAction) Equals(other LexerAction) bool {
+ if l == other {
+ return true
+ } else if _, ok := other.(*LexerChannelAction); !ok {
+ return false
+ } else {
+ return l.channel == other.(*LexerChannelAction).channel
+ }
+}
+
+func (l *LexerChannelAction) String() string {
+ return "channel(" + strconv.Itoa(l.channel) + ")"
+}
+
+// This implementation of {@link LexerAction} is used for tracking input offsets
+// for position-dependent actions within a {@link LexerActionExecutor}.
+//
+// This action is not serialized as part of the ATN, and is only required for
+// position-dependent lexer actions which appear at a location other than the
+// end of a rule. For more information about DFA optimizations employed for
+// lexer actions, see {@link LexerActionExecutor//append} and
+// {@link LexerActionExecutor//fixOffsetBeforeMatch}.
+
+type LexerIndexedCustomAction struct {
+ *BaseLexerAction
+ offset int
+ lexerAction LexerAction
+ isPositionDependent bool
+}
+
+// NewLexerIndexedCustomAction constructs a new indexed custom action by associating a character offset
+// with a [LexerAction].
+//
+// Note: This class is only required for lexer actions for which
+// [LexerAction.isPositionDependent] returns true.
+//
+// The offset points into the input [CharStream], relative to
+// the token start index, at which the specified lexerAction should be
+// executed.
+func NewLexerIndexedCustomAction(offset int, lexerAction LexerAction) *LexerIndexedCustomAction {
+
+ l := new(LexerIndexedCustomAction)
+ l.BaseLexerAction = NewBaseLexerAction(lexerAction.getActionType())
+
+ l.offset = offset
+ l.lexerAction = lexerAction
+ l.isPositionDependent = true
+
+ return l
+}
+
+// This method calls {@link //execute} on the result of {@link //getAction}
+// using the provided {@code lexer}.
+func (l *LexerIndexedCustomAction) execute(lexer Lexer) {
+ // assume the input stream position was properly set by the calling code
+ l.lexerAction.execute(lexer)
+}
+
+func (l *LexerIndexedCustomAction) Hash() int {
+ h := murmurInit(0)
+ h = murmurUpdate(h, l.offset)
+ h = murmurUpdate(h, l.lexerAction.Hash())
+ return murmurFinish(h, 2)
+}
+
+func (l *LexerIndexedCustomAction) equals(other LexerAction) bool {
+ if l == other {
+ return true
+ } else if _, ok := other.(*LexerIndexedCustomAction); !ok {
+ return false
+ } else {
+ return l.offset == other.(*LexerIndexedCustomAction).offset &&
+ l.lexerAction.Equals(other.(*LexerIndexedCustomAction).lexerAction)
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer_action_executor.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer_action_executor.go
new file mode 100644
index 0000000..dfc28c3
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer_action_executor.go
@@ -0,0 +1,173 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import "golang.org/x/exp/slices"
+
+// Represents an executor for a sequence of lexer actions which traversed during
+// the Matching operation of a lexer rule (token).
+//
+// The executor tracks position information for position-dependent lexer actions
+// efficiently, ensuring that actions appearing only at the end of the rule do
+// not cause bloating of the {@link DFA} created for the lexer.
+
+type LexerActionExecutor struct {
+ lexerActions []LexerAction
+ cachedHash int
+}
+
+func NewLexerActionExecutor(lexerActions []LexerAction) *LexerActionExecutor {
+
+ if lexerActions == nil {
+ lexerActions = make([]LexerAction, 0)
+ }
+
+ l := new(LexerActionExecutor)
+
+ l.lexerActions = lexerActions
+
+ // Caches the result of {@link //hashCode} since the hash code is an element
+ // of the performance-critical {@link ATNConfig//hashCode} operation.
+ l.cachedHash = murmurInit(0)
+ for _, a := range lexerActions {
+ l.cachedHash = murmurUpdate(l.cachedHash, a.Hash())
+ }
+ l.cachedHash = murmurFinish(l.cachedHash, len(lexerActions))
+
+ return l
+}
+
+// LexerActionExecutorappend creates a [LexerActionExecutor] which executes the actions for
+// the input [LexerActionExecutor] followed by a specified
+// [LexerAction].
+// TODO: This does not match the Java code
+func LexerActionExecutorappend(lexerActionExecutor *LexerActionExecutor, lexerAction LexerAction) *LexerActionExecutor {
+ if lexerActionExecutor == nil {
+ return NewLexerActionExecutor([]LexerAction{lexerAction})
+ }
+
+ return NewLexerActionExecutor(append(lexerActionExecutor.lexerActions, lexerAction))
+}
+
+// fixOffsetBeforeMatch creates a [LexerActionExecutor] which encodes the current offset
+// for position-dependent lexer actions.
+//
+// Normally, when the executor encounters lexer actions where
+// [LexerAction.isPositionDependent] returns true, it calls
+// [IntStream.Seek] on the input [CharStream] to set the input
+// position to the end of the current token. This behavior provides
+// for efficient [DFA] representation of lexer actions which appear at the end
+// of a lexer rule, even when the lexer rule Matches a variable number of
+// characters.
+//
+// Prior to traversing a Match transition in the [ATN], the current offset
+// from the token start index is assigned to all position-dependent lexer
+// actions which have not already been assigned a fixed offset. By storing
+// the offsets relative to the token start index, the [DFA] representation of
+// lexer actions which appear in the middle of tokens remains efficient due
+// to sharing among tokens of the same Length, regardless of their absolute
+// position in the input stream.
+//
+// If the current executor already has offsets assigned to all
+// position-dependent lexer actions, the method returns this instance.
+//
+// The offset is assigned to all position-dependent
+// lexer actions which do not already have offsets assigned.
+//
+// The func returns a [LexerActionExecutor] that stores input stream offsets
+// for all position-dependent lexer actions.
+func (l *LexerActionExecutor) fixOffsetBeforeMatch(offset int) *LexerActionExecutor {
+ var updatedLexerActions []LexerAction
+ for i := 0; i < len(l.lexerActions); i++ {
+ _, ok := l.lexerActions[i].(*LexerIndexedCustomAction)
+ if l.lexerActions[i].getIsPositionDependent() && !ok {
+ if updatedLexerActions == nil {
+ updatedLexerActions = make([]LexerAction, 0, len(l.lexerActions))
+ updatedLexerActions = append(updatedLexerActions, l.lexerActions...)
+ }
+ updatedLexerActions[i] = NewLexerIndexedCustomAction(offset, l.lexerActions[i])
+ }
+ }
+ if updatedLexerActions == nil {
+ return l
+ }
+
+ return NewLexerActionExecutor(updatedLexerActions)
+}
+
+// Execute the actions encapsulated by l executor within the context of a
+// particular {@link Lexer}.
+//
+// This method calls {@link IntStream//seek} to set the position of the
+// {@code input} {@link CharStream} prior to calling
+// {@link LexerAction//execute} on a position-dependent action. Before the
+// method returns, the input position will be restored to the same position
+// it was in when the method was invoked.
+//
+// @param lexer The lexer instance.
+// @param input The input stream which is the source for the current token.
+// When l method is called, the current {@link IntStream//index} for
+// {@code input} should be the start of the following token, i.e. 1
+// character past the end of the current token.
+// @param startIndex The token start index. This value may be passed to
+// {@link IntStream//seek} to set the {@code input} position to the beginning
+// of the token.
+// /
+func (l *LexerActionExecutor) execute(lexer Lexer, input CharStream, startIndex int) {
+ requiresSeek := false
+ stopIndex := input.Index()
+
+ defer func() {
+ if requiresSeek {
+ input.Seek(stopIndex)
+ }
+ }()
+
+ for i := 0; i < len(l.lexerActions); i++ {
+ lexerAction := l.lexerActions[i]
+ if la, ok := lexerAction.(*LexerIndexedCustomAction); ok {
+ offset := la.offset
+ input.Seek(startIndex + offset)
+ lexerAction = la.lexerAction
+ requiresSeek = (startIndex + offset) != stopIndex
+ } else if lexerAction.getIsPositionDependent() {
+ input.Seek(stopIndex)
+ requiresSeek = false
+ }
+ lexerAction.execute(lexer)
+ }
+}
+
+func (l *LexerActionExecutor) Hash() int {
+ if l == nil {
+ // TODO: Why is this here? l should not be nil
+ return 61
+ }
+
+ // TODO: This is created from the action itself when the struct is created - will this be an issue at some point? Java uses the runtime assign hashcode
+ return l.cachedHash
+}
+
+func (l *LexerActionExecutor) Equals(other interface{}) bool {
+ if l == other {
+ return true
+ }
+ othert, ok := other.(*LexerActionExecutor)
+ if !ok {
+ return false
+ }
+ if othert == nil {
+ return false
+ }
+ if l.cachedHash != othert.cachedHash {
+ return false
+ }
+ if len(l.lexerActions) != len(othert.lexerActions) {
+ return false
+ }
+ return slices.EqualFunc(l.lexerActions, othert.lexerActions, func(i, j LexerAction) bool {
+ return i.Equals(j)
+ })
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer_atn_simulator.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer_atn_simulator.go
new file mode 100644
index 0000000..fe938b0
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/lexer_atn_simulator.go
@@ -0,0 +1,677 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+//goland:noinspection GoUnusedGlobalVariable
+var (
+ LexerATNSimulatorMinDFAEdge = 0
+ LexerATNSimulatorMaxDFAEdge = 127 // forces unicode to stay in ATN
+
+ LexerATNSimulatorMatchCalls = 0
+)
+
+type ILexerATNSimulator interface {
+ IATNSimulator
+
+ reset()
+ Match(input CharStream, mode int) int
+ GetCharPositionInLine() int
+ GetLine() int
+ GetText(input CharStream) string
+ Consume(input CharStream)
+}
+
+type LexerATNSimulator struct {
+ BaseATNSimulator
+
+ recog Lexer
+ predictionMode int
+ mergeCache *JPCMap2
+ startIndex int
+ Line int
+ CharPositionInLine int
+ mode int
+ prevAccept *SimState
+ MatchCalls int
+}
+
+func NewLexerATNSimulator(recog Lexer, atn *ATN, decisionToDFA []*DFA, sharedContextCache *PredictionContextCache) *LexerATNSimulator {
+ l := &LexerATNSimulator{
+ BaseATNSimulator: BaseATNSimulator{
+ atn: atn,
+ sharedContextCache: sharedContextCache,
+ },
+ }
+
+ l.decisionToDFA = decisionToDFA
+ l.recog = recog
+
+ // The current token's starting index into the character stream.
+ // Shared across DFA to ATN simulation in case the ATN fails and the
+ // DFA did not have a previous accept state. In l case, we use the
+ // ATN-generated exception object.
+ l.startIndex = -1
+
+ // line number 1..n within the input
+ l.Line = 1
+
+ // The index of the character relative to the beginning of the line
+ // 0..n-1
+ l.CharPositionInLine = 0
+
+ l.mode = LexerDefaultMode
+
+ // Used during DFA/ATN exec to record the most recent accept configuration
+ // info
+ l.prevAccept = NewSimState()
+
+ return l
+}
+
+func (l *LexerATNSimulator) copyState(simulator *LexerATNSimulator) {
+ l.CharPositionInLine = simulator.CharPositionInLine
+ l.Line = simulator.Line
+ l.mode = simulator.mode
+ l.startIndex = simulator.startIndex
+}
+
+func (l *LexerATNSimulator) Match(input CharStream, mode int) int {
+ l.MatchCalls++
+ l.mode = mode
+ mark := input.Mark()
+
+ defer func() {
+ input.Release(mark)
+ }()
+
+ l.startIndex = input.Index()
+ l.prevAccept.reset()
+
+ dfa := l.decisionToDFA[mode]
+
+ var s0 *DFAState
+ l.atn.stateMu.RLock()
+ s0 = dfa.getS0()
+ l.atn.stateMu.RUnlock()
+
+ if s0 == nil {
+ return l.MatchATN(input)
+ }
+
+ return l.execATN(input, s0)
+}
+
+func (l *LexerATNSimulator) reset() {
+ l.prevAccept.reset()
+ l.startIndex = -1
+ l.Line = 1
+ l.CharPositionInLine = 0
+ l.mode = LexerDefaultMode
+}
+
+func (l *LexerATNSimulator) MatchATN(input CharStream) int {
+ startState := l.atn.modeToStartState[l.mode]
+
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Println("MatchATN mode " + strconv.Itoa(l.mode) + " start: " + startState.String())
+ }
+ oldMode := l.mode
+ s0Closure := l.computeStartState(input, startState)
+ suppressEdge := s0Closure.hasSemanticContext
+ s0Closure.hasSemanticContext = false
+
+ next := l.addDFAState(s0Closure, suppressEdge)
+
+ predict := l.execATN(input, next)
+
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Println("DFA after MatchATN: " + l.decisionToDFA[oldMode].ToLexerString())
+ }
+ return predict
+}
+
+func (l *LexerATNSimulator) execATN(input CharStream, ds0 *DFAState) int {
+
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Println("start state closure=" + ds0.configs.String())
+ }
+ if ds0.isAcceptState {
+ // allow zero-Length tokens
+ l.captureSimState(l.prevAccept, input, ds0)
+ }
+ t := input.LA(1)
+ s := ds0 // s is current/from DFA state
+
+ for { // while more work
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Println("execATN loop starting closure: " + s.configs.String())
+ }
+
+ // As we move src->trg, src->trg, we keep track of the previous trg to
+ // avoid looking up the DFA state again, which is expensive.
+ // If the previous target was already part of the DFA, we might
+ // be able to avoid doing a reach operation upon t. If s!=nil,
+ // it means that semantic predicates didn't prevent us from
+ // creating a DFA state. Once we know s!=nil, we check to see if
+ // the DFA state has an edge already for t. If so, we can just reuse
+ // it's configuration set there's no point in re-computing it.
+ // This is kind of like doing DFA simulation within the ATN
+ // simulation because DFA simulation is really just a way to avoid
+ // computing reach/closure sets. Technically, once we know that
+ // we have a previously added DFA state, we could jump over to
+ // the DFA simulator. But, that would mean popping back and forth
+ // a lot and making things more complicated algorithmically.
+ // This optimization makes a lot of sense for loops within DFA.
+ // A character will take us back to an existing DFA state
+ // that already has lots of edges out of it. e.g., .* in comments.
+ target := l.getExistingTargetState(s, t)
+ if target == nil {
+ target = l.computeTargetState(input, s, t)
+ // print("Computed:" + str(target))
+ }
+ if target == ATNSimulatorError {
+ break
+ }
+ // If l is a consumable input element, make sure to consume before
+ // capturing the accept state so the input index, line, and char
+ // position accurately reflect the state of the interpreter at the
+ // end of the token.
+ if t != TokenEOF {
+ l.Consume(input)
+ }
+ if target.isAcceptState {
+ l.captureSimState(l.prevAccept, input, target)
+ if t == TokenEOF {
+ break
+ }
+ }
+ t = input.LA(1)
+ s = target // flip current DFA target becomes new src/from state
+ }
+
+ return l.failOrAccept(l.prevAccept, input, s.configs, t)
+}
+
+// Get an existing target state for an edge in the DFA. If the target state
+// for the edge has not yet been computed or is otherwise not available,
+// l method returns {@code nil}.
+//
+// @param s The current DFA state
+// @param t The next input symbol
+// @return The existing target DFA state for the given input symbol
+// {@code t}, or {@code nil} if the target state for l edge is not
+// already cached
+func (l *LexerATNSimulator) getExistingTargetState(s *DFAState, t int) *DFAState {
+ if t < LexerATNSimulatorMinDFAEdge || t > LexerATNSimulatorMaxDFAEdge {
+ return nil
+ }
+
+ l.atn.edgeMu.RLock()
+ defer l.atn.edgeMu.RUnlock()
+ if s.getEdges() == nil {
+ return nil
+ }
+ target := s.getIthEdge(t - LexerATNSimulatorMinDFAEdge)
+ if runtimeConfig.lexerATNSimulatorDebug && target != nil {
+ fmt.Println("reuse state " + strconv.Itoa(s.stateNumber) + " edge to " + strconv.Itoa(target.stateNumber))
+ }
+ return target
+}
+
+// computeTargetState computes a target state for an edge in the [DFA], and attempt to add the
+// computed state and corresponding edge to the [DFA].
+//
+// The func returns the computed target [DFA] state for the given input symbol t.
+// If this does not lead to a valid [DFA] state, this method
+// returns ATNSimulatorError.
+func (l *LexerATNSimulator) computeTargetState(input CharStream, s *DFAState, t int) *DFAState {
+ reach := NewOrderedATNConfigSet()
+
+ // if we don't find an existing DFA state
+ // Fill reach starting from closure, following t transitions
+ l.getReachableConfigSet(input, s.configs, reach, t)
+
+ if len(reach.configs) == 0 { // we got nowhere on t from s
+ if !reach.hasSemanticContext {
+ // we got nowhere on t, don't panic out l knowledge it'd
+ // cause a fail-over from DFA later.
+ l.addDFAEdge(s, t, ATNSimulatorError, nil)
+ }
+ // stop when we can't Match any more char
+ return ATNSimulatorError
+ }
+ // Add an edge from s to target DFA found/created for reach
+ return l.addDFAEdge(s, t, nil, reach)
+}
+
+func (l *LexerATNSimulator) failOrAccept(prevAccept *SimState, input CharStream, reach *ATNConfigSet, t int) int {
+ if l.prevAccept.dfaState != nil {
+ lexerActionExecutor := prevAccept.dfaState.lexerActionExecutor
+ l.accept(input, lexerActionExecutor, l.startIndex, prevAccept.index, prevAccept.line, prevAccept.column)
+ return prevAccept.dfaState.prediction
+ }
+
+ // if no accept and EOF is first char, return EOF
+ if t == TokenEOF && input.Index() == l.startIndex {
+ return TokenEOF
+ }
+
+ panic(NewLexerNoViableAltException(l.recog, input, l.startIndex, reach))
+}
+
+// getReachableConfigSet when given a starting configuration set, figures out all [ATN] configurations
+// we can reach upon input t.
+//
+// Parameter reach is a return parameter.
+func (l *LexerATNSimulator) getReachableConfigSet(input CharStream, closure *ATNConfigSet, reach *ATNConfigSet, t int) {
+ // l is used to Skip processing for configs which have a lower priority
+ // than a runtimeConfig that already reached an accept state for the same rule
+ SkipAlt := ATNInvalidAltNumber
+
+ for _, cfg := range closure.configs {
+ currentAltReachedAcceptState := cfg.GetAlt() == SkipAlt
+ if currentAltReachedAcceptState && cfg.passedThroughNonGreedyDecision {
+ continue
+ }
+
+ if runtimeConfig.lexerATNSimulatorDebug {
+
+ fmt.Printf("testing %s at %s\n", l.GetTokenName(t), cfg.String())
+ }
+
+ for _, trans := range cfg.GetState().GetTransitions() {
+ target := l.getReachableTarget(trans, t)
+ if target != nil {
+ lexerActionExecutor := cfg.lexerActionExecutor
+ if lexerActionExecutor != nil {
+ lexerActionExecutor = lexerActionExecutor.fixOffsetBeforeMatch(input.Index() - l.startIndex)
+ }
+ treatEOFAsEpsilon := t == TokenEOF
+ config := NewLexerATNConfig3(cfg, target, lexerActionExecutor)
+ if l.closure(input, config, reach,
+ currentAltReachedAcceptState, true, treatEOFAsEpsilon) {
+ // any remaining configs for l alt have a lower priority
+ // than the one that just reached an accept state.
+ SkipAlt = cfg.GetAlt()
+ }
+ }
+ }
+ }
+}
+
+func (l *LexerATNSimulator) accept(input CharStream, lexerActionExecutor *LexerActionExecutor, startIndex, index, line, charPos int) {
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Printf("ACTION %v\n", lexerActionExecutor)
+ }
+ // seek to after last char in token
+ input.Seek(index)
+ l.Line = line
+ l.CharPositionInLine = charPos
+ if lexerActionExecutor != nil && l.recog != nil {
+ lexerActionExecutor.execute(l.recog, input, startIndex)
+ }
+}
+
+func (l *LexerATNSimulator) getReachableTarget(trans Transition, t int) ATNState {
+ if trans.Matches(t, 0, LexerMaxCharValue) {
+ return trans.getTarget()
+ }
+
+ return nil
+}
+
+func (l *LexerATNSimulator) computeStartState(input CharStream, p ATNState) *ATNConfigSet {
+ configs := NewOrderedATNConfigSet()
+ for i := 0; i < len(p.GetTransitions()); i++ {
+ target := p.GetTransitions()[i].getTarget()
+ cfg := NewLexerATNConfig6(target, i+1, BasePredictionContextEMPTY)
+ l.closure(input, cfg, configs, false, false, false)
+ }
+
+ return configs
+}
+
+// closure since the alternatives within any lexer decision are ordered by
+// preference, this method stops pursuing the closure as soon as an accept
+// state is reached. After the first accept state is reached by depth-first
+// search from runtimeConfig, all other (potentially reachable) states for
+// this rule would have a lower priority.
+//
+// The func returns true if an accept state is reached.
+func (l *LexerATNSimulator) closure(input CharStream, config *ATNConfig, configs *ATNConfigSet,
+ currentAltReachedAcceptState, speculative, treatEOFAsEpsilon bool) bool {
+
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Println("closure(" + config.String() + ")")
+ }
+
+ _, ok := config.state.(*RuleStopState)
+ if ok {
+
+ if runtimeConfig.lexerATNSimulatorDebug {
+ if l.recog != nil {
+ fmt.Printf("closure at %s rule stop %s\n", l.recog.GetRuleNames()[config.state.GetRuleIndex()], config)
+ } else {
+ fmt.Printf("closure at rule stop %s\n", config)
+ }
+ }
+
+ if config.context == nil || config.context.hasEmptyPath() {
+ if config.context == nil || config.context.isEmpty() {
+ configs.Add(config, nil)
+ return true
+ }
+
+ configs.Add(NewLexerATNConfig2(config, config.state, BasePredictionContextEMPTY), nil)
+ currentAltReachedAcceptState = true
+ }
+ if config.context != nil && !config.context.isEmpty() {
+ for i := 0; i < config.context.length(); i++ {
+ if config.context.getReturnState(i) != BasePredictionContextEmptyReturnState {
+ newContext := config.context.GetParent(i) // "pop" return state
+ returnState := l.atn.states[config.context.getReturnState(i)]
+ cfg := NewLexerATNConfig2(config, returnState, newContext)
+ currentAltReachedAcceptState = l.closure(input, cfg, configs, currentAltReachedAcceptState, speculative, treatEOFAsEpsilon)
+ }
+ }
+ }
+ return currentAltReachedAcceptState
+ }
+ // optimization
+ if !config.state.GetEpsilonOnlyTransitions() {
+ if !currentAltReachedAcceptState || !config.passedThroughNonGreedyDecision {
+ configs.Add(config, nil)
+ }
+ }
+ for j := 0; j < len(config.state.GetTransitions()); j++ {
+ trans := config.state.GetTransitions()[j]
+ cfg := l.getEpsilonTarget(input, config, trans, configs, speculative, treatEOFAsEpsilon)
+ if cfg != nil {
+ currentAltReachedAcceptState = l.closure(input, cfg, configs,
+ currentAltReachedAcceptState, speculative, treatEOFAsEpsilon)
+ }
+ }
+ return currentAltReachedAcceptState
+}
+
+// side-effect: can alter configs.hasSemanticContext
+func (l *LexerATNSimulator) getEpsilonTarget(input CharStream, config *ATNConfig, trans Transition,
+ configs *ATNConfigSet, speculative, treatEOFAsEpsilon bool) *ATNConfig {
+
+ var cfg *ATNConfig
+
+ if trans.getSerializationType() == TransitionRULE {
+
+ rt := trans.(*RuleTransition)
+ newContext := SingletonBasePredictionContextCreate(config.context, rt.followState.GetStateNumber())
+ cfg = NewLexerATNConfig2(config, trans.getTarget(), newContext)
+
+ } else if trans.getSerializationType() == TransitionPRECEDENCE {
+ panic("Precedence predicates are not supported in lexers.")
+ } else if trans.getSerializationType() == TransitionPREDICATE {
+ // Track traversing semantic predicates. If we traverse,
+ // we cannot add a DFA state for l "reach" computation
+ // because the DFA would not test the predicate again in the
+ // future. Rather than creating collections of semantic predicates
+ // like v3 and testing them on prediction, v4 will test them on the
+ // fly all the time using the ATN not the DFA. This is slower but
+ // semantically it's not used that often. One of the key elements to
+ // l predicate mechanism is not adding DFA states that see
+ // predicates immediately afterwards in the ATN. For example,
+
+ // a : ID {p1}? | ID {p2}?
+
+ // should create the start state for rule 'a' (to save start state
+ // competition), but should not create target of ID state. The
+ // collection of ATN states the following ID references includes
+ // states reached by traversing predicates. Since l is when we
+ // test them, we cannot cash the DFA state target of ID.
+
+ pt := trans.(*PredicateTransition)
+
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Println("EVAL rule " + strconv.Itoa(trans.(*PredicateTransition).ruleIndex) + ":" + strconv.Itoa(pt.predIndex))
+ }
+ configs.hasSemanticContext = true
+ if l.evaluatePredicate(input, pt.ruleIndex, pt.predIndex, speculative) {
+ cfg = NewLexerATNConfig4(config, trans.getTarget())
+ }
+ } else if trans.getSerializationType() == TransitionACTION {
+ if config.context == nil || config.context.hasEmptyPath() {
+ // execute actions anywhere in the start rule for a token.
+ //
+ // TODO: if the entry rule is invoked recursively, some
+ // actions may be executed during the recursive call. The
+ // problem can appear when hasEmptyPath() is true but
+ // isEmpty() is false. In this case, the config needs to be
+ // split into two contexts - one with just the empty path
+ // and another with everything but the empty path.
+ // Unfortunately, the current algorithm does not allow
+ // getEpsilonTarget to return two configurations, so
+ // additional modifications are needed before we can support
+ // the split operation.
+ lexerActionExecutor := LexerActionExecutorappend(config.lexerActionExecutor, l.atn.lexerActions[trans.(*ActionTransition).actionIndex])
+ cfg = NewLexerATNConfig3(config, trans.getTarget(), lexerActionExecutor)
+ } else {
+ // ignore actions in referenced rules
+ cfg = NewLexerATNConfig4(config, trans.getTarget())
+ }
+ } else if trans.getSerializationType() == TransitionEPSILON {
+ cfg = NewLexerATNConfig4(config, trans.getTarget())
+ } else if trans.getSerializationType() == TransitionATOM ||
+ trans.getSerializationType() == TransitionRANGE ||
+ trans.getSerializationType() == TransitionSET {
+ if treatEOFAsEpsilon {
+ if trans.Matches(TokenEOF, 0, LexerMaxCharValue) {
+ cfg = NewLexerATNConfig4(config, trans.getTarget())
+ }
+ }
+ }
+ return cfg
+}
+
+// evaluatePredicate eEvaluates a predicate specified in the lexer.
+//
+// If speculative is true, this method was called before
+// [consume] for the Matched character. This method should call
+// [consume] before evaluating the predicate to ensure position
+// sensitive values, including [GetText], [GetLine],
+// and [GetColumn], properly reflect the current
+// lexer state. This method should restore input and the simulator
+// to the original state before returning, i.e. undo the actions made by the
+// call to [Consume].
+//
+// The func returns true if the specified predicate evaluates to true.
+func (l *LexerATNSimulator) evaluatePredicate(input CharStream, ruleIndex, predIndex int, speculative bool) bool {
+ // assume true if no recognizer was provided
+ if l.recog == nil {
+ return true
+ }
+ if !speculative {
+ return l.recog.Sempred(nil, ruleIndex, predIndex)
+ }
+ savedcolumn := l.CharPositionInLine
+ savedLine := l.Line
+ index := input.Index()
+ marker := input.Mark()
+
+ defer func() {
+ l.CharPositionInLine = savedcolumn
+ l.Line = savedLine
+ input.Seek(index)
+ input.Release(marker)
+ }()
+
+ l.Consume(input)
+ return l.recog.Sempred(nil, ruleIndex, predIndex)
+}
+
+func (l *LexerATNSimulator) captureSimState(settings *SimState, input CharStream, dfaState *DFAState) {
+ settings.index = input.Index()
+ settings.line = l.Line
+ settings.column = l.CharPositionInLine
+ settings.dfaState = dfaState
+}
+
+func (l *LexerATNSimulator) addDFAEdge(from *DFAState, tk int, to *DFAState, cfgs *ATNConfigSet) *DFAState {
+ if to == nil && cfgs != nil {
+ // leading to l call, ATNConfigSet.hasSemanticContext is used as a
+ // marker indicating dynamic predicate evaluation makes l edge
+ // dependent on the specific input sequence, so the static edge in the
+ // DFA should be omitted. The target DFAState is still created since
+ // execATN has the ability to reSynchronize with the DFA state cache
+ // following the predicate evaluation step.
+ //
+ // TJP notes: next time through the DFA, we see a pred again and eval.
+ // If that gets us to a previously created (but dangling) DFA
+ // state, we can continue in pure DFA mode from there.
+ //
+ suppressEdge := cfgs.hasSemanticContext
+ cfgs.hasSemanticContext = false
+ to = l.addDFAState(cfgs, true)
+
+ if suppressEdge {
+ return to
+ }
+ }
+ // add the edge
+ if tk < LexerATNSimulatorMinDFAEdge || tk > LexerATNSimulatorMaxDFAEdge {
+ // Only track edges within the DFA bounds
+ return to
+ }
+ if runtimeConfig.lexerATNSimulatorDebug {
+ fmt.Println("EDGE " + from.String() + " -> " + to.String() + " upon " + strconv.Itoa(tk))
+ }
+ l.atn.edgeMu.Lock()
+ defer l.atn.edgeMu.Unlock()
+ if from.getEdges() == nil {
+ // make room for tokens 1..n and -1 masquerading as index 0
+ from.setEdges(make([]*DFAState, LexerATNSimulatorMaxDFAEdge-LexerATNSimulatorMinDFAEdge+1))
+ }
+ from.setIthEdge(tk-LexerATNSimulatorMinDFAEdge, to) // connect
+
+ return to
+}
+
+// Add a NewDFA state if there isn't one with l set of
+// configurations already. This method also detects the first
+// configuration containing an ATN rule stop state. Later, when
+// traversing the DFA, we will know which rule to accept.
+func (l *LexerATNSimulator) addDFAState(configs *ATNConfigSet, suppressEdge bool) *DFAState {
+
+ proposed := NewDFAState(-1, configs)
+ var firstConfigWithRuleStopState *ATNConfig
+
+ for _, cfg := range configs.configs {
+ _, ok := cfg.GetState().(*RuleStopState)
+
+ if ok {
+ firstConfigWithRuleStopState = cfg
+ break
+ }
+ }
+ if firstConfigWithRuleStopState != nil {
+ proposed.isAcceptState = true
+ proposed.lexerActionExecutor = firstConfigWithRuleStopState.lexerActionExecutor
+ proposed.setPrediction(l.atn.ruleToTokenType[firstConfigWithRuleStopState.GetState().GetRuleIndex()])
+ }
+ dfa := l.decisionToDFA[l.mode]
+
+ l.atn.stateMu.Lock()
+ defer l.atn.stateMu.Unlock()
+ existing, present := dfa.Get(proposed)
+ if present {
+
+ // This state was already present, so just return it.
+ //
+ proposed = existing
+ } else {
+
+ // We need to add the new state
+ //
+ proposed.stateNumber = dfa.Len()
+ configs.readOnly = true
+ configs.configLookup = nil // Not needed now
+ proposed.configs = configs
+ dfa.Put(proposed)
+ }
+ if !suppressEdge {
+ dfa.setS0(proposed)
+ }
+ return proposed
+}
+
+func (l *LexerATNSimulator) getDFA(mode int) *DFA {
+ return l.decisionToDFA[mode]
+}
+
+// GetText returns the text [Match]ed so far for the current token.
+func (l *LexerATNSimulator) GetText(input CharStream) string {
+ // index is first lookahead char, don't include.
+ return input.GetTextFromInterval(NewInterval(l.startIndex, input.Index()-1))
+}
+
+func (l *LexerATNSimulator) Consume(input CharStream) {
+ curChar := input.LA(1)
+ if curChar == int('\n') {
+ l.Line++
+ l.CharPositionInLine = 0
+ } else {
+ l.CharPositionInLine++
+ }
+ input.Consume()
+}
+
+func (l *LexerATNSimulator) GetCharPositionInLine() int {
+ return l.CharPositionInLine
+}
+
+func (l *LexerATNSimulator) GetLine() int {
+ return l.Line
+}
+
+func (l *LexerATNSimulator) GetTokenName(tt int) string {
+ if tt == -1 {
+ return "EOF"
+ }
+
+ var sb strings.Builder
+ sb.Grow(6)
+ sb.WriteByte('\'')
+ sb.WriteRune(rune(tt))
+ sb.WriteByte('\'')
+
+ return sb.String()
+}
+
+func resetSimState(sim *SimState) {
+ sim.index = -1
+ sim.line = 0
+ sim.column = -1
+ sim.dfaState = nil
+}
+
+type SimState struct {
+ index int
+ line int
+ column int
+ dfaState *DFAState
+}
+
+func NewSimState() *SimState {
+ s := new(SimState)
+ resetSimState(s)
+ return s
+}
+
+func (s *SimState) reset() {
+ resetSimState(s)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/ll1_analyzer.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/ll1_analyzer.go
new file mode 100644
index 0000000..4955ac8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/ll1_analyzer.go
@@ -0,0 +1,218 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+type LL1Analyzer struct {
+ atn *ATN
+}
+
+func NewLL1Analyzer(atn *ATN) *LL1Analyzer {
+ la := new(LL1Analyzer)
+ la.atn = atn
+ return la
+}
+
+const (
+ // LL1AnalyzerHitPred is a special value added to the lookahead sets to indicate that we hit
+ // a predicate during analysis if
+ //
+ // seeThruPreds==false
+ LL1AnalyzerHitPred = TokenInvalidType
+)
+
+// *
+// Calculates the SLL(1) expected lookahead set for each outgoing transition
+// of an {@link ATNState}. The returned array has one element for each
+// outgoing transition in {@code s}. If the closure from transition
+// i leads to a semantic predicate before Matching a symbol, the
+// element at index i of the result will be {@code nil}.
+//
+// @param s the ATN state
+// @return the expected symbols for each outgoing transition of {@code s}.
+func (la *LL1Analyzer) getDecisionLookahead(s ATNState) []*IntervalSet {
+ if s == nil {
+ return nil
+ }
+ count := len(s.GetTransitions())
+ look := make([]*IntervalSet, count)
+ for alt := 0; alt < count; alt++ {
+
+ look[alt] = NewIntervalSet()
+ lookBusy := NewJStore[*ATNConfig, Comparator[*ATNConfig]](aConfEqInst, ClosureBusyCollection, "LL1Analyzer.getDecisionLookahead for lookBusy")
+ la.look1(s.GetTransitions()[alt].getTarget(), nil, BasePredictionContextEMPTY, look[alt], lookBusy, NewBitSet(), false, false)
+
+ // Wipe out lookahead for la alternative if we found nothing,
+ // or we had a predicate when we !seeThruPreds
+ if look[alt].length() == 0 || look[alt].contains(LL1AnalyzerHitPred) {
+ look[alt] = nil
+ }
+ }
+ return look
+}
+
+// Look computes the set of tokens that can follow s in the [ATN] in the
+// specified ctx.
+//
+// If ctx is nil and the end of the rule containing
+// s is reached, [EPSILON] is added to the result set.
+//
+// If ctx is not nil and the end of the outermost rule is
+// reached, [EOF] is added to the result set.
+//
+// Parameter s the ATN state, and stopState is the ATN state to stop at. This can be a
+// [BlockEndState] to detect epsilon paths through a closure.
+//
+// Parameter ctx is the complete parser context, or nil if the context
+// should be ignored
+//
+// The func returns the set of tokens that can follow s in the [ATN] in the
+// specified ctx.
+func (la *LL1Analyzer) Look(s, stopState ATNState, ctx RuleContext) *IntervalSet {
+ r := NewIntervalSet()
+ var lookContext *PredictionContext
+ if ctx != nil {
+ lookContext = predictionContextFromRuleContext(s.GetATN(), ctx)
+ }
+ la.look1(s, stopState, lookContext, r, NewJStore[*ATNConfig, Comparator[*ATNConfig]](aConfEqInst, ClosureBusyCollection, "LL1Analyzer.Look for la.look1()"),
+ NewBitSet(), true, true)
+ return r
+}
+
+//*
+// Compute set of tokens that can follow {@code s} in the ATN in the
+// specified {@code ctx}.
+//
+// If {@code ctx} is {@code nil} and {@code stopState} or the end of the
+// rule containing {@code s} is reached, {@link Token//EPSILON} is added to
+// the result set. If {@code ctx} is not {@code nil} and {@code addEOF} is
+// {@code true} and {@code stopState} or the end of the outermost rule is
+// reached, {@link Token//EOF} is added to the result set.
+//
+// @param s the ATN state.
+// @param stopState the ATN state to stop at. This can be a
+// {@link BlockEndState} to detect epsilon paths through a closure.
+// @param ctx The outer context, or {@code nil} if the outer context should
+// not be used.
+// @param look The result lookahead set.
+// @param lookBusy A set used for preventing epsilon closures in the ATN
+// from causing a stack overflow. Outside code should pass
+// {@code NewSet} for la argument.
+// @param calledRuleStack A set used for preventing left recursion in the
+// ATN from causing a stack overflow. Outside code should pass
+// {@code NewBitSet()} for la argument.
+// @param seeThruPreds {@code true} to true semantic predicates as
+// implicitly {@code true} and "see through them", otherwise {@code false}
+// to treat semantic predicates as opaque and add {@link //HitPred} to the
+// result if one is encountered.
+// @param addEOF Add {@link Token//EOF} to the result if the end of the
+// outermost context is reached. This parameter has no effect if {@code ctx}
+// is {@code nil}.
+
+func (la *LL1Analyzer) look2(_, stopState ATNState, ctx *PredictionContext, look *IntervalSet, lookBusy *JStore[*ATNConfig, Comparator[*ATNConfig]],
+ calledRuleStack *BitSet, seeThruPreds, addEOF bool, i int) {
+
+ returnState := la.atn.states[ctx.getReturnState(i)]
+ la.look1(returnState, stopState, ctx.GetParent(i), look, lookBusy, calledRuleStack, seeThruPreds, addEOF)
+
+}
+
+func (la *LL1Analyzer) look1(s, stopState ATNState, ctx *PredictionContext, look *IntervalSet, lookBusy *JStore[*ATNConfig, Comparator[*ATNConfig]], calledRuleStack *BitSet, seeThruPreds, addEOF bool) {
+
+ c := NewATNConfig6(s, 0, ctx)
+
+ if lookBusy.Contains(c) {
+ return
+ }
+
+ _, present := lookBusy.Put(c)
+ if present {
+ return
+
+ }
+ if s == stopState {
+ if ctx == nil {
+ look.addOne(TokenEpsilon)
+ return
+ } else if ctx.isEmpty() && addEOF {
+ look.addOne(TokenEOF)
+ return
+ }
+ }
+
+ _, ok := s.(*RuleStopState)
+
+ if ok {
+ if ctx == nil {
+ look.addOne(TokenEpsilon)
+ return
+ } else if ctx.isEmpty() && addEOF {
+ look.addOne(TokenEOF)
+ return
+ }
+
+ if ctx.pcType != PredictionContextEmpty {
+ removed := calledRuleStack.contains(s.GetRuleIndex())
+ defer func() {
+ if removed {
+ calledRuleStack.add(s.GetRuleIndex())
+ }
+ }()
+ calledRuleStack.remove(s.GetRuleIndex())
+ // run thru all possible stack tops in ctx
+ for i := 0; i < ctx.length(); i++ {
+ returnState := la.atn.states[ctx.getReturnState(i)]
+ la.look2(returnState, stopState, ctx, look, lookBusy, calledRuleStack, seeThruPreds, addEOF, i)
+ }
+ return
+ }
+ }
+
+ n := len(s.GetTransitions())
+
+ for i := 0; i < n; i++ {
+ t := s.GetTransitions()[i]
+
+ if t1, ok := t.(*RuleTransition); ok {
+ if calledRuleStack.contains(t1.getTarget().GetRuleIndex()) {
+ continue
+ }
+
+ newContext := SingletonBasePredictionContextCreate(ctx, t1.followState.GetStateNumber())
+ la.look3(stopState, newContext, look, lookBusy, calledRuleStack, seeThruPreds, addEOF, t1)
+ } else if t2, ok := t.(AbstractPredicateTransition); ok {
+ if seeThruPreds {
+ la.look1(t2.getTarget(), stopState, ctx, look, lookBusy, calledRuleStack, seeThruPreds, addEOF)
+ } else {
+ look.addOne(LL1AnalyzerHitPred)
+ }
+ } else if t.getIsEpsilon() {
+ la.look1(t.getTarget(), stopState, ctx, look, lookBusy, calledRuleStack, seeThruPreds, addEOF)
+ } else if _, ok := t.(*WildcardTransition); ok {
+ look.addRange(TokenMinUserTokenType, la.atn.maxTokenType)
+ } else {
+ set := t.getLabel()
+ if set != nil {
+ if _, ok := t.(*NotSetTransition); ok {
+ set = set.complement(TokenMinUserTokenType, la.atn.maxTokenType)
+ }
+ look.addSet(set)
+ }
+ }
+ }
+}
+
+func (la *LL1Analyzer) look3(stopState ATNState, ctx *PredictionContext, look *IntervalSet, lookBusy *JStore[*ATNConfig, Comparator[*ATNConfig]],
+ calledRuleStack *BitSet, seeThruPreds, addEOF bool, t1 *RuleTransition) {
+
+ newContext := SingletonBasePredictionContextCreate(ctx, t1.followState.GetStateNumber())
+
+ defer func() {
+ calledRuleStack.remove(t1.getTarget().GetRuleIndex())
+ }()
+
+ calledRuleStack.add(t1.getTarget().GetRuleIndex())
+ la.look1(t1.getTarget(), stopState, newContext, look, lookBusy, calledRuleStack, seeThruPreds, addEOF)
+
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/nostatistics.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/nostatistics.go
new file mode 100644
index 0000000..923c7b5
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/nostatistics.go
@@ -0,0 +1,47 @@
+//go:build !antlr.stats
+
+package antlr
+
+// This file is compiled when the build configuration antlr.stats is not enabled.
+// which then allows the compiler to optimize out all the code that is not used.
+const collectStats = false
+
+// goRunStats is a dummy struct used when build configuration antlr.stats is not enabled.
+type goRunStats struct {
+}
+
+var Statistics = &goRunStats{}
+
+func (s *goRunStats) AddJStatRec(_ *JStatRec) {
+ // Do nothing - compiler will optimize this out (hopefully)
+}
+
+func (s *goRunStats) CollectionAnomalies() {
+ // Do nothing - compiler will optimize this out (hopefully)
+}
+
+func (s *goRunStats) Reset() {
+ // Do nothing - compiler will optimize this out (hopefully)
+}
+
+func (s *goRunStats) Report(dir string, prefix string) error {
+ // Do nothing - compiler will optimize this out (hopefully)
+ return nil
+}
+
+func (s *goRunStats) Analyze() {
+ // Do nothing - compiler will optimize this out (hopefully)
+}
+
+type statsOption func(*goRunStats) error
+
+func (s *goRunStats) Configure(options ...statsOption) error {
+ // Do nothing - compiler will optimize this out (hopefully)
+ return nil
+}
+
+func WithTopN(topN int) statsOption {
+ return func(s *goRunStats) error {
+ return nil
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/parser.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/parser.go
new file mode 100644
index 0000000..fb57ac1
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/parser.go
@@ -0,0 +1,700 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strconv"
+)
+
+type Parser interface {
+ Recognizer
+
+ GetInterpreter() *ParserATNSimulator
+
+ GetTokenStream() TokenStream
+ GetTokenFactory() TokenFactory
+ GetParserRuleContext() ParserRuleContext
+ SetParserRuleContext(ParserRuleContext)
+ Consume() Token
+ GetParseListeners() []ParseTreeListener
+
+ GetErrorHandler() ErrorStrategy
+ SetErrorHandler(ErrorStrategy)
+ GetInputStream() IntStream
+ GetCurrentToken() Token
+ GetExpectedTokens() *IntervalSet
+ NotifyErrorListeners(string, Token, RecognitionException)
+ IsExpectedToken(int) bool
+ GetPrecedence() int
+ GetRuleInvocationStack(ParserRuleContext) []string
+}
+
+type BaseParser struct {
+ *BaseRecognizer
+
+ Interpreter *ParserATNSimulator
+ BuildParseTrees bool
+
+ input TokenStream
+ errHandler ErrorStrategy
+ precedenceStack IntStack
+ ctx ParserRuleContext
+
+ tracer *TraceListener
+ parseListeners []ParseTreeListener
+ _SyntaxErrors int
+}
+
+// NewBaseParser contains all the parsing support code to embed in parsers. Essentially most of it is error
+// recovery stuff.
+//
+//goland:noinspection GoUnusedExportedFunction
+func NewBaseParser(input TokenStream) *BaseParser {
+
+ p := new(BaseParser)
+
+ p.BaseRecognizer = NewBaseRecognizer()
+
+ // The input stream.
+ p.input = nil
+
+ // The error handling strategy for the parser. The default value is a new
+ // instance of {@link DefaultErrorStrategy}.
+ p.errHandler = NewDefaultErrorStrategy()
+ p.precedenceStack = make([]int, 0)
+ p.precedenceStack.Push(0)
+
+ // The ParserRuleContext object for the currently executing rule.
+ // p.is always non-nil during the parsing process.
+ p.ctx = nil
+
+ // Specifies whether the parser should construct a parse tree during
+ // the parsing process. The default value is {@code true}.
+ p.BuildParseTrees = true
+
+ // When setTrace(true) is called, a reference to the
+ // TraceListener is stored here, so it can be easily removed in a
+ // later call to setTrace(false). The listener itself is
+ // implemented as a parser listener so p.field is not directly used by
+ // other parser methods.
+ p.tracer = nil
+
+ // The list of ParseTreeListener listeners registered to receive
+ // events during the parse.
+ p.parseListeners = nil
+
+ // The number of syntax errors Reported during parsing. p.value is
+ // incremented each time NotifyErrorListeners is called.
+ p._SyntaxErrors = 0
+ p.SetInputStream(input)
+
+ return p
+}
+
+// This field maps from the serialized ATN string to the deserialized [ATN] with
+// bypass alternatives.
+//
+// [ATNDeserializationOptions.isGenerateRuleBypassTransitions]
+//
+//goland:noinspection GoUnusedGlobalVariable
+var bypassAltsAtnCache = make(map[string]int)
+
+// reset the parser's state//
+func (p *BaseParser) reset() {
+ if p.input != nil {
+ p.input.Seek(0)
+ }
+ p.errHandler.reset(p)
+ p.ctx = nil
+ p._SyntaxErrors = 0
+ p.SetTrace(nil)
+ p.precedenceStack = make([]int, 0)
+ p.precedenceStack.Push(0)
+ if p.Interpreter != nil {
+ p.Interpreter.reset()
+ }
+}
+
+func (p *BaseParser) GetErrorHandler() ErrorStrategy {
+ return p.errHandler
+}
+
+func (p *BaseParser) SetErrorHandler(e ErrorStrategy) {
+ p.errHandler = e
+}
+
+// Match current input symbol against {@code ttype}. If the symbol type
+// Matches, {@link ANTLRErrorStrategy//ReportMatch} and {@link //consume} are
+// called to complete the Match process.
+//
+// If the symbol type does not Match,
+// {@link ANTLRErrorStrategy//recoverInline} is called on the current error
+// strategy to attempt recovery. If {@link //getBuildParseTree} is
+// {@code true} and the token index of the symbol returned by
+// {@link ANTLRErrorStrategy//recoverInline} is -1, the symbol is added to
+// the parse tree by calling {@link ParserRuleContext//addErrorNode}.
+//
+// @param ttype the token type to Match
+// @return the Matched symbol
+// @panics RecognitionException if the current input symbol did not Match
+// {@code ttype} and the error strategy could not recover from the
+// mismatched symbol
+
+func (p *BaseParser) Match(ttype int) Token {
+
+ t := p.GetCurrentToken()
+
+ if t.GetTokenType() == ttype {
+ p.errHandler.ReportMatch(p)
+ p.Consume()
+ } else {
+ t = p.errHandler.RecoverInline(p)
+ if p.HasError() {
+ return nil
+ }
+ if p.BuildParseTrees && t.GetTokenIndex() == -1 {
+
+ // we must have conjured up a new token during single token
+ // insertion if it's not the current symbol
+ p.ctx.AddErrorNode(t)
+ }
+ }
+
+ return t
+}
+
+// Match current input symbol as a wildcard. If the symbol type Matches
+// (i.e. has a value greater than 0), {@link ANTLRErrorStrategy//ReportMatch}
+// and {@link //consume} are called to complete the Match process.
+//
+// If the symbol type does not Match,
+// {@link ANTLRErrorStrategy//recoverInline} is called on the current error
+// strategy to attempt recovery. If {@link //getBuildParseTree} is
+// {@code true} and the token index of the symbol returned by
+// {@link ANTLRErrorStrategy//recoverInline} is -1, the symbol is added to
+// the parse tree by calling {@link ParserRuleContext//addErrorNode}.
+//
+// @return the Matched symbol
+// @panics RecognitionException if the current input symbol did not Match
+// a wildcard and the error strategy could not recover from the mismatched
+// symbol
+
+func (p *BaseParser) MatchWildcard() Token {
+ t := p.GetCurrentToken()
+ if t.GetTokenType() > 0 {
+ p.errHandler.ReportMatch(p)
+ p.Consume()
+ } else {
+ t = p.errHandler.RecoverInline(p)
+ if p.BuildParseTrees && t.GetTokenIndex() == -1 {
+ // we must have conjured up a new token during single token
+ // insertion if it's not the current symbol
+ p.ctx.AddErrorNode(t)
+ }
+ }
+ return t
+}
+
+func (p *BaseParser) GetParserRuleContext() ParserRuleContext {
+ return p.ctx
+}
+
+func (p *BaseParser) SetParserRuleContext(v ParserRuleContext) {
+ p.ctx = v
+}
+
+func (p *BaseParser) GetParseListeners() []ParseTreeListener {
+ if p.parseListeners == nil {
+ return make([]ParseTreeListener, 0)
+ }
+ return p.parseListeners
+}
+
+// AddParseListener registers listener to receive events during the parsing process.
+//
+// To support output-preserving grammar transformations (including but not
+// limited to left-recursion removal, automated left-factoring, and
+// optimized code generation), calls to listener methods during the parse
+// may differ substantially from calls made by
+// [ParseTreeWalker.DEFAULT] used after the parse is complete. In
+// particular, rule entry and exit events may occur in a different order
+// during the parse than after the parser. In addition, calls to certain
+// rule entry methods may be omitted.
+//
+// With the following specific exceptions, calls to listener events are
+// deterministic, i.e. for identical input the calls to listener
+// methods will be the same.
+//
+// - Alterations to the grammar used to generate code may change the
+// behavior of the listener calls.
+// - Alterations to the command line options passed to ANTLR 4 when
+// generating the parser may change the behavior of the listener calls.
+// - Changing the version of the ANTLR Tool used to generate the parser
+// may change the behavior of the listener calls.
+func (p *BaseParser) AddParseListener(listener ParseTreeListener) {
+ if listener == nil {
+ panic("listener")
+ }
+ if p.parseListeners == nil {
+ p.parseListeners = make([]ParseTreeListener, 0)
+ }
+ p.parseListeners = append(p.parseListeners, listener)
+}
+
+// RemoveParseListener removes listener from the list of parse listeners.
+//
+// If listener is nil or has not been added as a parse
+// listener, this func does nothing.
+func (p *BaseParser) RemoveParseListener(listener ParseTreeListener) {
+
+ if p.parseListeners != nil {
+
+ idx := -1
+ for i, v := range p.parseListeners {
+ if v == listener {
+ idx = i
+ break
+ }
+ }
+
+ if idx == -1 {
+ return
+ }
+
+ // remove the listener from the slice
+ p.parseListeners = append(p.parseListeners[0:idx], p.parseListeners[idx+1:]...)
+
+ if len(p.parseListeners) == 0 {
+ p.parseListeners = nil
+ }
+ }
+}
+
+// Remove all parse listeners.
+func (p *BaseParser) removeParseListeners() {
+ p.parseListeners = nil
+}
+
+// TriggerEnterRuleEvent notifies all parse listeners of an enter rule event.
+func (p *BaseParser) TriggerEnterRuleEvent() {
+ if p.parseListeners != nil {
+ ctx := p.ctx
+ for _, listener := range p.parseListeners {
+ listener.EnterEveryRule(ctx)
+ ctx.EnterRule(listener)
+ }
+ }
+}
+
+// TriggerExitRuleEvent notifies any parse listeners of an exit rule event.
+func (p *BaseParser) TriggerExitRuleEvent() {
+ if p.parseListeners != nil {
+ // reverse order walk of listeners
+ ctx := p.ctx
+ l := len(p.parseListeners) - 1
+
+ for i := range p.parseListeners {
+ listener := p.parseListeners[l-i]
+ ctx.ExitRule(listener)
+ listener.ExitEveryRule(ctx)
+ }
+ }
+}
+
+func (p *BaseParser) GetInterpreter() *ParserATNSimulator {
+ return p.Interpreter
+}
+
+func (p *BaseParser) GetATN() *ATN {
+ return p.Interpreter.atn
+}
+
+func (p *BaseParser) GetTokenFactory() TokenFactory {
+ return p.input.GetTokenSource().GetTokenFactory()
+}
+
+// setTokenFactory is used to tell our token source and error strategy about a new way to create tokens.
+func (p *BaseParser) setTokenFactory(factory TokenFactory) {
+ p.input.GetTokenSource().setTokenFactory(factory)
+}
+
+// GetATNWithBypassAlts - the ATN with bypass alternatives is expensive to create, so we create it
+// lazily.
+func (p *BaseParser) GetATNWithBypassAlts() {
+
+ // TODO - Implement this?
+ panic("Not implemented!")
+
+ // serializedAtn := p.getSerializedATN()
+ // if (serializedAtn == nil) {
+ // panic("The current parser does not support an ATN with bypass alternatives.")
+ // }
+ // result := p.bypassAltsAtnCache[serializedAtn]
+ // if (result == nil) {
+ // deserializationOptions := NewATNDeserializationOptions(nil)
+ // deserializationOptions.generateRuleBypassTransitions = true
+ // result = NewATNDeserializer(deserializationOptions).deserialize(serializedAtn)
+ // p.bypassAltsAtnCache[serializedAtn] = result
+ // }
+ // return result
+}
+
+// The preferred method of getting a tree pattern. For example, here's a
+// sample use:
+//
+//
+// ParseTree t = parser.expr()
+// ParseTreePattern p = parser.compileParseTreePattern("<ID>+0",
+// MyParser.RULE_expr)
+// ParseTreeMatch m = p.Match(t)
+// String id = m.Get("ID")
+//
+
+//goland:noinspection GoUnusedParameter
+func (p *BaseParser) compileParseTreePattern(pattern, patternRuleIndex, lexer Lexer) {
+
+ panic("NewParseTreePatternMatcher not implemented!")
+ //
+ // if (lexer == nil) {
+ // if (p.GetTokenStream() != nil) {
+ // tokenSource := p.GetTokenStream().GetTokenSource()
+ // if _, ok := tokenSource.(ILexer); ok {
+ // lexer = tokenSource
+ // }
+ // }
+ // }
+ // if (lexer == nil) {
+ // panic("Parser can't discover a lexer to use")
+ // }
+
+ // m := NewParseTreePatternMatcher(lexer, p)
+ // return m.compile(pattern, patternRuleIndex)
+}
+
+func (p *BaseParser) GetInputStream() IntStream {
+ return p.GetTokenStream()
+}
+
+func (p *BaseParser) SetInputStream(input TokenStream) {
+ p.SetTokenStream(input)
+}
+
+func (p *BaseParser) GetTokenStream() TokenStream {
+ return p.input
+}
+
+// SetTokenStream installs input as the token stream and resets the parser.
+func (p *BaseParser) SetTokenStream(input TokenStream) {
+ p.input = nil
+ p.reset()
+ p.input = input
+}
+
+// GetCurrentToken returns the current token at LT(1).
+//
+// [Match] needs to return the current input symbol, which gets put
+// into the label for the associated token ref e.g., x=ID.
+func (p *BaseParser) GetCurrentToken() Token {
+ return p.input.LT(1)
+}
+
+func (p *BaseParser) NotifyErrorListeners(msg string, offendingToken Token, err RecognitionException) {
+ if offendingToken == nil {
+ offendingToken = p.GetCurrentToken()
+ }
+ p._SyntaxErrors++
+ line := offendingToken.GetLine()
+ column := offendingToken.GetColumn()
+ listener := p.GetErrorListenerDispatch()
+ listener.SyntaxError(p, offendingToken, line, column, msg, err)
+}
+
+func (p *BaseParser) Consume() Token {
+ o := p.GetCurrentToken()
+ if o.GetTokenType() != TokenEOF {
+ p.GetInputStream().Consume()
+ }
+ hasListener := p.parseListeners != nil && len(p.parseListeners) > 0
+ if p.BuildParseTrees || hasListener {
+ if p.errHandler.InErrorRecoveryMode(p) {
+ node := p.ctx.AddErrorNode(o)
+ if p.parseListeners != nil {
+ for _, l := range p.parseListeners {
+ l.VisitErrorNode(node)
+ }
+ }
+
+ } else {
+ node := p.ctx.AddTokenNode(o)
+ if p.parseListeners != nil {
+ for _, l := range p.parseListeners {
+ l.VisitTerminal(node)
+ }
+ }
+ }
+ // node.invokingState = p.state
+ }
+
+ return o
+}
+
+func (p *BaseParser) addContextToParseTree() {
+ // add current context to parent if we have a parent
+ if p.ctx.GetParent() != nil {
+ p.ctx.GetParent().(ParserRuleContext).AddChild(p.ctx)
+ }
+}
+
+func (p *BaseParser) EnterRule(localctx ParserRuleContext, state, _ int) {
+ p.SetState(state)
+ p.ctx = localctx
+ p.ctx.SetStart(p.input.LT(1))
+ if p.BuildParseTrees {
+ p.addContextToParseTree()
+ }
+ if p.parseListeners != nil {
+ p.TriggerEnterRuleEvent()
+ }
+}
+
+func (p *BaseParser) ExitRule() {
+ p.ctx.SetStop(p.input.LT(-1))
+ // trigger event on ctx, before it reverts to parent
+ if p.parseListeners != nil {
+ p.TriggerExitRuleEvent()
+ }
+ p.SetState(p.ctx.GetInvokingState())
+ if p.ctx.GetParent() != nil {
+ p.ctx = p.ctx.GetParent().(ParserRuleContext)
+ } else {
+ p.ctx = nil
+ }
+}
+
+func (p *BaseParser) EnterOuterAlt(localctx ParserRuleContext, altNum int) {
+ localctx.SetAltNumber(altNum)
+ // if we have a new localctx, make sure we replace existing ctx
+ // that is previous child of parse tree
+ if p.BuildParseTrees && p.ctx != localctx {
+ if p.ctx.GetParent() != nil {
+ p.ctx.GetParent().(ParserRuleContext).RemoveLastChild()
+ p.ctx.GetParent().(ParserRuleContext).AddChild(localctx)
+ }
+ }
+ p.ctx = localctx
+}
+
+// Get the precedence level for the top-most precedence rule.
+//
+// @return The precedence level for the top-most precedence rule, or -1 if
+// the parser context is not nested within a precedence rule.
+
+func (p *BaseParser) GetPrecedence() int {
+ if len(p.precedenceStack) == 0 {
+ return -1
+ }
+
+ return p.precedenceStack[len(p.precedenceStack)-1]
+}
+
+func (p *BaseParser) EnterRecursionRule(localctx ParserRuleContext, state, _, precedence int) {
+ p.SetState(state)
+ p.precedenceStack.Push(precedence)
+ p.ctx = localctx
+ p.ctx.SetStart(p.input.LT(1))
+ if p.parseListeners != nil {
+ p.TriggerEnterRuleEvent() // simulates rule entry for
+ // left-recursive rules
+ }
+}
+
+//
+// Like {@link //EnterRule} but for recursive rules.
+
+func (p *BaseParser) PushNewRecursionContext(localctx ParserRuleContext, state, _ int) {
+ previous := p.ctx
+ previous.SetParent(localctx)
+ previous.SetInvokingState(state)
+ previous.SetStop(p.input.LT(-1))
+
+ p.ctx = localctx
+ p.ctx.SetStart(previous.GetStart())
+ if p.BuildParseTrees {
+ p.ctx.AddChild(previous)
+ }
+ if p.parseListeners != nil {
+ p.TriggerEnterRuleEvent() // simulates rule entry for
+ // left-recursive rules
+ }
+}
+
+func (p *BaseParser) UnrollRecursionContexts(parentCtx ParserRuleContext) {
+ _, _ = p.precedenceStack.Pop()
+ p.ctx.SetStop(p.input.LT(-1))
+ retCtx := p.ctx // save current ctx (return value)
+ // unroll so ctx is as it was before call to recursive method
+ if p.parseListeners != nil {
+ for p.ctx != parentCtx {
+ p.TriggerExitRuleEvent()
+ p.ctx = p.ctx.GetParent().(ParserRuleContext)
+ }
+ } else {
+ p.ctx = parentCtx
+ }
+ // hook into tree
+ retCtx.SetParent(parentCtx)
+ if p.BuildParseTrees && parentCtx != nil {
+ // add return ctx into invoking rule's tree
+ parentCtx.AddChild(retCtx)
+ }
+}
+
+func (p *BaseParser) GetInvokingContext(ruleIndex int) ParserRuleContext {
+ ctx := p.ctx
+ for ctx != nil {
+ if ctx.GetRuleIndex() == ruleIndex {
+ return ctx
+ }
+ ctx = ctx.GetParent().(ParserRuleContext)
+ }
+ return nil
+}
+
+func (p *BaseParser) Precpred(_ RuleContext, precedence int) bool {
+ return precedence >= p.precedenceStack[len(p.precedenceStack)-1]
+}
+
+//goland:noinspection GoUnusedParameter
+func (p *BaseParser) inContext(context ParserRuleContext) bool {
+ // TODO: useful in parser?
+ return false
+}
+
+// IsExpectedToken checks whether symbol can follow the current state in the
+// {ATN}. The behavior of p.method is equivalent to the following, but is
+// implemented such that the complete context-sensitive follow set does not
+// need to be explicitly constructed.
+//
+// return getExpectedTokens().contains(symbol)
+func (p *BaseParser) IsExpectedToken(symbol int) bool {
+ atn := p.Interpreter.atn
+ ctx := p.ctx
+ s := atn.states[p.state]
+ following := atn.NextTokens(s, nil)
+ if following.contains(symbol) {
+ return true
+ }
+ if !following.contains(TokenEpsilon) {
+ return false
+ }
+ for ctx != nil && ctx.GetInvokingState() >= 0 && following.contains(TokenEpsilon) {
+ invokingState := atn.states[ctx.GetInvokingState()]
+ rt := invokingState.GetTransitions()[0]
+ following = atn.NextTokens(rt.(*RuleTransition).followState, nil)
+ if following.contains(symbol) {
+ return true
+ }
+ ctx = ctx.GetParent().(ParserRuleContext)
+ }
+ if following.contains(TokenEpsilon) && symbol == TokenEOF {
+ return true
+ }
+
+ return false
+}
+
+// GetExpectedTokens and returns the set of input symbols which could follow the current parser
+// state and context, as given by [GetState] and [GetContext],
+// respectively.
+func (p *BaseParser) GetExpectedTokens() *IntervalSet {
+ return p.Interpreter.atn.getExpectedTokens(p.state, p.ctx)
+}
+
+func (p *BaseParser) GetExpectedTokensWithinCurrentRule() *IntervalSet {
+ atn := p.Interpreter.atn
+ s := atn.states[p.state]
+ return atn.NextTokens(s, nil)
+}
+
+// GetRuleIndex get a rule's index (i.e., RULE_ruleName field) or -1 if not found.
+func (p *BaseParser) GetRuleIndex(ruleName string) int {
+ var ruleIndex, ok = p.GetRuleIndexMap()[ruleName]
+ if ok {
+ return ruleIndex
+ }
+
+ return -1
+}
+
+// GetRuleInvocationStack returns a list of the rule names in your parser instance
+// leading up to a call to the current rule. You could override if
+// you want more details such as the file/line info of where
+// in the ATN a rule is invoked.
+func (p *BaseParser) GetRuleInvocationStack(c ParserRuleContext) []string {
+ if c == nil {
+ c = p.ctx
+ }
+ stack := make([]string, 0)
+ for c != nil {
+ // compute what follows who invoked us
+ ruleIndex := c.GetRuleIndex()
+ if ruleIndex < 0 {
+ stack = append(stack, "n/a")
+ } else {
+ stack = append(stack, p.GetRuleNames()[ruleIndex])
+ }
+
+ vp := c.GetParent()
+
+ if vp == nil {
+ break
+ }
+
+ c = vp.(ParserRuleContext)
+ }
+ return stack
+}
+
+// GetDFAStrings returns a list of all DFA states used for debugging purposes
+func (p *BaseParser) GetDFAStrings() string {
+ return fmt.Sprint(p.Interpreter.decisionToDFA)
+}
+
+// DumpDFA prints the whole of the DFA for debugging
+func (p *BaseParser) DumpDFA() {
+ seenOne := false
+ for _, dfa := range p.Interpreter.decisionToDFA {
+ if dfa.Len() > 0 {
+ if seenOne {
+ fmt.Println()
+ }
+ fmt.Println("Decision " + strconv.Itoa(dfa.decision) + ":")
+ fmt.Print(dfa.String(p.LiteralNames, p.SymbolicNames))
+ seenOne = true
+ }
+ }
+}
+
+func (p *BaseParser) GetSourceName() string {
+ return p.GrammarFileName
+}
+
+// SetTrace installs a trace listener for the parse.
+//
+// During a parse it is sometimes useful to listen in on the rule entry and exit
+// events as well as token Matches. This is for quick and dirty debugging.
+func (p *BaseParser) SetTrace(trace *TraceListener) {
+ if trace == nil {
+ p.RemoveParseListener(p.tracer)
+ p.tracer = nil
+ } else {
+ if p.tracer != nil {
+ p.RemoveParseListener(p.tracer)
+ }
+ p.tracer = NewTraceListener(p)
+ p.AddParseListener(p.tracer)
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/parser_atn_simulator.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/parser_atn_simulator.go
new file mode 100644
index 0000000..ae28696
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/parser_atn_simulator.go
@@ -0,0 +1,1668 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+var ()
+
+// ClosureBusy is a store of ATNConfigs and is a tiny abstraction layer over
+// a standard JStore so that we can use Lazy instantiation of the JStore, mostly
+// to avoid polluting the stats module with a ton of JStore instances with nothing in them.
+type ClosureBusy struct {
+ bMap *JStore[*ATNConfig, Comparator[*ATNConfig]]
+ desc string
+}
+
+// NewClosureBusy creates a new ClosureBusy instance used to avoid infinite recursion for right-recursive rules
+func NewClosureBusy(desc string) *ClosureBusy {
+ return &ClosureBusy{
+ desc: desc,
+ }
+}
+
+func (c *ClosureBusy) Put(config *ATNConfig) (*ATNConfig, bool) {
+ if c.bMap == nil {
+ c.bMap = NewJStore[*ATNConfig, Comparator[*ATNConfig]](aConfEqInst, ClosureBusyCollection, c.desc)
+ }
+ return c.bMap.Put(config)
+}
+
+type ParserATNSimulator struct {
+ BaseATNSimulator
+
+ parser Parser
+ predictionMode int
+ input TokenStream
+ startIndex int
+ dfa *DFA
+ mergeCache *JPCMap
+ outerContext ParserRuleContext
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func NewParserATNSimulator(parser Parser, atn *ATN, decisionToDFA []*DFA, sharedContextCache *PredictionContextCache) *ParserATNSimulator {
+
+ p := &ParserATNSimulator{
+ BaseATNSimulator: BaseATNSimulator{
+ atn: atn,
+ sharedContextCache: sharedContextCache,
+ },
+ }
+
+ p.parser = parser
+ p.decisionToDFA = decisionToDFA
+ // SLL, LL, or LL + exact ambig detection?//
+ p.predictionMode = PredictionModeLL
+ // LAME globals to avoid parameters!!!!! I need these down deep in predTransition
+ p.input = nil
+ p.startIndex = 0
+ p.outerContext = nil
+ p.dfa = nil
+ // Each prediction operation uses a cache for merge of prediction contexts.
+ // Don't keep around as it wastes huge amounts of memory. [JPCMap]
+ // isn't Synchronized, but we're ok since two threads shouldn't reuse same
+ // parser/atn-simulator object because it can only handle one input at a time.
+ // This maps graphs a and b to merged result c. (a,b) -> c. We can avoid
+ // the merge if we ever see a and b again. Note that (b,a) -> c should
+ // also be examined during cache lookup.
+ //
+ p.mergeCache = nil
+
+ return p
+}
+
+func (p *ParserATNSimulator) GetPredictionMode() int {
+ return p.predictionMode
+}
+
+func (p *ParserATNSimulator) SetPredictionMode(v int) {
+ p.predictionMode = v
+}
+
+func (p *ParserATNSimulator) reset() {
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) AdaptivePredict(parser *BaseParser, input TokenStream, decision int, outerContext ParserRuleContext) int {
+ if runtimeConfig.parserATNSimulatorDebug || runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("adaptivePredict decision " + strconv.Itoa(decision) +
+ " exec LA(1)==" + p.getLookaheadName(input) +
+ " line " + strconv.Itoa(input.LT(1).GetLine()) + ":" +
+ strconv.Itoa(input.LT(1).GetColumn()))
+ }
+ p.input = input
+ p.startIndex = input.Index()
+ p.outerContext = outerContext
+
+ dfa := p.decisionToDFA[decision]
+ p.dfa = dfa
+ m := input.Mark()
+ index := input.Index()
+
+ defer func() {
+ p.dfa = nil
+ p.mergeCache = nil // whack cache after each prediction
+ // Do not attempt to run a GC now that we're done with the cache as makes the
+ // GC overhead terrible for badly formed grammars and has little effect on well formed
+ // grammars.
+ // I have made some extra effort to try and reduce memory pressure by reusing allocations when
+ // possible. However, it can only have a limited effect. The real solution is to encourage grammar
+ // authors to think more carefully about their grammar and to use the new antlr.stats tag to inspect
+ // what is happening at runtime, along with using the error listener to report ambiguities.
+
+ input.Seek(index)
+ input.Release(m)
+ }()
+
+ // Now we are certain to have a specific decision's DFA
+ // But, do we still need an initial state?
+ var s0 *DFAState
+ p.atn.stateMu.RLock()
+ if dfa.getPrecedenceDfa() {
+ p.atn.edgeMu.RLock()
+ // the start state for a precedence DFA depends on the current
+ // parser precedence, and is provided by a DFA method.
+ s0 = dfa.getPrecedenceStartState(p.parser.GetPrecedence())
+ p.atn.edgeMu.RUnlock()
+ } else {
+ // the start state for a "regular" DFA is just s0
+ s0 = dfa.getS0()
+ }
+ p.atn.stateMu.RUnlock()
+
+ if s0 == nil {
+ if outerContext == nil {
+ outerContext = ParserRuleContextEmpty
+ }
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("predictATN decision " + strconv.Itoa(dfa.decision) +
+ " exec LA(1)==" + p.getLookaheadName(input) +
+ ", outerContext=" + outerContext.String(p.parser.GetRuleNames(), nil))
+ }
+ fullCtx := false
+ s0Closure := p.computeStartState(dfa.atnStartState, ParserRuleContextEmpty, fullCtx)
+
+ p.atn.stateMu.Lock()
+ if dfa.getPrecedenceDfa() {
+ // If p is a precedence DFA, we use applyPrecedenceFilter
+ // to convert the computed start state to a precedence start
+ // state. We then use DFA.setPrecedenceStartState to set the
+ // appropriate start state for the precedence level rather
+ // than simply setting DFA.s0.
+ //
+ dfa.s0.configs = s0Closure
+ s0Closure = p.applyPrecedenceFilter(s0Closure)
+ s0 = p.addDFAState(dfa, NewDFAState(-1, s0Closure))
+ p.atn.edgeMu.Lock()
+ dfa.setPrecedenceStartState(p.parser.GetPrecedence(), s0)
+ p.atn.edgeMu.Unlock()
+ } else {
+ s0 = p.addDFAState(dfa, NewDFAState(-1, s0Closure))
+ dfa.setS0(s0)
+ }
+ p.atn.stateMu.Unlock()
+ }
+
+ alt, re := p.execATN(dfa, s0, input, index, outerContext)
+ parser.SetError(re)
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("DFA after predictATN: " + dfa.String(p.parser.GetLiteralNames(), nil))
+ }
+ return alt
+
+}
+
+// execATN performs ATN simulation to compute a predicted alternative based
+// upon the remaining input, but also updates the DFA cache to avoid
+// having to traverse the ATN again for the same input sequence.
+//
+// There are some key conditions we're looking for after computing a new
+// set of ATN configs (proposed DFA state):
+//
+// - If the set is empty, there is no viable alternative for current symbol
+// - Does the state uniquely predict an alternative?
+// - Does the state have a conflict that would prevent us from
+// putting it on the work list?
+//
+// We also have some key operations to do:
+//
+// - Add an edge from previous DFA state to potentially NewDFA state, D,
+// - Upon current symbol but only if adding to work list, which means in all
+// cases except no viable alternative (and possibly non-greedy decisions?)
+// - Collecting predicates and adding semantic context to DFA accept states
+// - adding rule context to context-sensitive DFA accept states
+// - Consuming an input symbol
+// - Reporting a conflict
+// - Reporting an ambiguity
+// - Reporting a context sensitivity
+// - Reporting insufficient predicates
+//
+// Cover these cases:
+//
+// - dead end
+// - single alt
+// - single alt + predicates
+// - conflict
+// - conflict + predicates
+//
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) execATN(dfa *DFA, s0 *DFAState, input TokenStream, startIndex int, outerContext ParserRuleContext) (int, RecognitionException) {
+
+ if runtimeConfig.parserATNSimulatorDebug || runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("execATN decision " + strconv.Itoa(dfa.decision) +
+ ", DFA state " + s0.String() +
+ ", LA(1)==" + p.getLookaheadName(input) +
+ " line " + strconv.Itoa(input.LT(1).GetLine()) + ":" + strconv.Itoa(input.LT(1).GetColumn()))
+ }
+
+ previousD := s0
+
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("s0 = " + s0.String())
+ }
+ t := input.LA(1)
+ for { // for more work
+ D := p.getExistingTargetState(previousD, t)
+ if D == nil {
+ D = p.computeTargetState(dfa, previousD, t)
+ }
+ if D == ATNSimulatorError {
+ // if any configs in previous dipped into outer context, that
+ // means that input up to t actually finished entry rule
+ // at least for SLL decision. Full LL doesn't dip into outer
+ // so don't need special case.
+ // We will get an error no matter what so delay until after
+ // decision better error message. Also, no reachable target
+ // ATN states in SLL implies LL will also get nowhere.
+ // If conflict in states that dip out, choose min since we
+ // will get error no matter what.
+ e := p.noViableAlt(input, outerContext, previousD.configs, startIndex)
+ input.Seek(startIndex)
+ alt := p.getSynValidOrSemInvalidAltThatFinishedDecisionEntryRule(previousD.configs, outerContext)
+ if alt != ATNInvalidAltNumber {
+ return alt, nil
+ }
+ p.parser.SetError(e)
+ return ATNInvalidAltNumber, e
+ }
+ if D.requiresFullContext && p.predictionMode != PredictionModeSLL {
+ // IF PREDS, MIGHT RESOLVE TO SINGLE ALT => SLL (or syntax error)
+ conflictingAlts := D.configs.conflictingAlts
+ if D.predicates != nil {
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("DFA state has preds in DFA sim LL fail-over")
+ }
+ conflictIndex := input.Index()
+ if conflictIndex != startIndex {
+ input.Seek(startIndex)
+ }
+ conflictingAlts = p.evalSemanticContext(D.predicates, outerContext, true)
+ if conflictingAlts.length() == 1 {
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("Full LL avoided")
+ }
+ return conflictingAlts.minValue(), nil
+ }
+ if conflictIndex != startIndex {
+ // restore the index so Reporting the fallback to full
+ // context occurs with the index at the correct spot
+ input.Seek(conflictIndex)
+ }
+ }
+ if runtimeConfig.parserATNSimulatorDFADebug {
+ fmt.Println("ctx sensitive state " + outerContext.String(nil, nil) + " in " + D.String())
+ }
+ fullCtx := true
+ s0Closure := p.computeStartState(dfa.atnStartState, outerContext, fullCtx)
+ p.ReportAttemptingFullContext(dfa, conflictingAlts, D.configs, startIndex, input.Index())
+ alt, re := p.execATNWithFullContext(dfa, D, s0Closure, input, startIndex, outerContext)
+ return alt, re
+ }
+ if D.isAcceptState {
+ if D.predicates == nil {
+ return D.prediction, nil
+ }
+ stopIndex := input.Index()
+ input.Seek(startIndex)
+ alts := p.evalSemanticContext(D.predicates, outerContext, true)
+
+ switch alts.length() {
+ case 0:
+ return ATNInvalidAltNumber, p.noViableAlt(input, outerContext, D.configs, startIndex)
+ case 1:
+ return alts.minValue(), nil
+ default:
+ // Report ambiguity after predicate evaluation to make sure the correct set of ambig alts is Reported.
+ p.ReportAmbiguity(dfa, D, startIndex, stopIndex, false, alts, D.configs)
+ return alts.minValue(), nil
+ }
+ }
+ previousD = D
+
+ if t != TokenEOF {
+ input.Consume()
+ t = input.LA(1)
+ }
+ }
+}
+
+// Get an existing target state for an edge in the DFA. If the target state
+// for the edge has not yet been computed or is otherwise not available,
+// p method returns {@code nil}.
+//
+// @param previousD The current DFA state
+// @param t The next input symbol
+// @return The existing target DFA state for the given input symbol
+// {@code t}, or {@code nil} if the target state for p edge is not
+// already cached
+
+func (p *ParserATNSimulator) getExistingTargetState(previousD *DFAState, t int) *DFAState {
+ if t+1 < 0 {
+ return nil
+ }
+
+ p.atn.edgeMu.RLock()
+ defer p.atn.edgeMu.RUnlock()
+ edges := previousD.getEdges()
+ if edges == nil || t+1 >= len(edges) {
+ return nil
+ }
+ return previousD.getIthEdge(t + 1)
+}
+
+// Compute a target state for an edge in the DFA, and attempt to add the
+// computed state and corresponding edge to the DFA.
+//
+// @param dfa The DFA
+// @param previousD The current DFA state
+// @param t The next input symbol
+//
+// @return The computed target DFA state for the given input symbol
+// {@code t}. If {@code t} does not lead to a valid DFA state, p method
+// returns {@link //ERROR}.
+//
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) computeTargetState(dfa *DFA, previousD *DFAState, t int) *DFAState {
+ reach := p.computeReachSet(previousD.configs, t, false)
+
+ if reach == nil {
+ p.addDFAEdge(dfa, previousD, t, ATNSimulatorError)
+ return ATNSimulatorError
+ }
+ // create new target state we'll add to DFA after it's complete
+ D := NewDFAState(-1, reach)
+
+ predictedAlt := p.getUniqueAlt(reach)
+
+ if runtimeConfig.parserATNSimulatorDebug {
+ altSubSets := PredictionModegetConflictingAltSubsets(reach)
+ fmt.Println("SLL altSubSets=" + fmt.Sprint(altSubSets) +
+ ", previous=" + previousD.configs.String() +
+ ", configs=" + reach.String() +
+ ", predict=" + strconv.Itoa(predictedAlt) +
+ ", allSubsetsConflict=" +
+ fmt.Sprint(PredictionModeallSubsetsConflict(altSubSets)) +
+ ", conflictingAlts=" + p.getConflictingAlts(reach).String())
+ }
+ if predictedAlt != ATNInvalidAltNumber {
+ // NO CONFLICT, UNIQUELY PREDICTED ALT
+ D.isAcceptState = true
+ D.configs.uniqueAlt = predictedAlt
+ D.setPrediction(predictedAlt)
+ } else if PredictionModehasSLLConflictTerminatingPrediction(p.predictionMode, reach) {
+ // MORE THAN ONE VIABLE ALTERNATIVE
+ D.configs.conflictingAlts = p.getConflictingAlts(reach)
+ D.requiresFullContext = true
+ // in SLL-only mode, we will stop at p state and return the minimum alt
+ D.isAcceptState = true
+ D.setPrediction(D.configs.conflictingAlts.minValue())
+ }
+ if D.isAcceptState && D.configs.hasSemanticContext {
+ p.predicateDFAState(D, p.atn.getDecisionState(dfa.decision))
+ if D.predicates != nil {
+ D.setPrediction(ATNInvalidAltNumber)
+ }
+ }
+ // all adds to dfa are done after we've created full D state
+ D = p.addDFAEdge(dfa, previousD, t, D)
+ return D
+}
+
+func (p *ParserATNSimulator) predicateDFAState(dfaState *DFAState, decisionState DecisionState) {
+ // We need to test all predicates, even in DFA states that
+ // uniquely predict alternative.
+ nalts := len(decisionState.GetTransitions())
+ // Update DFA so reach becomes accept state with (predicate,alt)
+ // pairs if preds found for conflicting alts
+ altsToCollectPredsFrom := p.getConflictingAltsOrUniqueAlt(dfaState.configs)
+ altToPred := p.getPredsForAmbigAlts(altsToCollectPredsFrom, dfaState.configs, nalts)
+ if altToPred != nil {
+ dfaState.predicates = p.getPredicatePredictions(altsToCollectPredsFrom, altToPred)
+ dfaState.setPrediction(ATNInvalidAltNumber) // make sure we use preds
+ } else {
+ // There are preds in configs but they might go away
+ // when OR'd together like {p}? || NONE == NONE. If neither
+ // alt has preds, resolve to min alt
+ dfaState.setPrediction(altsToCollectPredsFrom.minValue())
+ }
+}
+
+// comes back with reach.uniqueAlt set to a valid alt
+//
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) execATNWithFullContext(dfa *DFA, D *DFAState, s0 *ATNConfigSet, input TokenStream, startIndex int, outerContext ParserRuleContext) (int, RecognitionException) {
+
+ if runtimeConfig.parserATNSimulatorDebug || runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("execATNWithFullContext " + s0.String())
+ }
+
+ fullCtx := true
+ foundExactAmbig := false
+ var reach *ATNConfigSet
+ previous := s0
+ input.Seek(startIndex)
+ t := input.LA(1)
+ predictedAlt := -1
+
+ for { // for more work
+ reach = p.computeReachSet(previous, t, fullCtx)
+ if reach == nil {
+ // if any configs in previous dipped into outer context, that
+ // means that input up to t actually finished entry rule
+ // at least for LL decision. Full LL doesn't dip into outer
+ // so don't need special case.
+ // We will get an error no matter what so delay until after
+ // decision better error message. Also, no reachable target
+ // ATN states in SLL implies LL will also get nowhere.
+ // If conflict in states that dip out, choose min since we
+ // will get error no matter what.
+ input.Seek(startIndex)
+ alt := p.getSynValidOrSemInvalidAltThatFinishedDecisionEntryRule(previous, outerContext)
+ if alt != ATNInvalidAltNumber {
+ return alt, nil
+ }
+ return alt, p.noViableAlt(input, outerContext, previous, startIndex)
+ }
+ altSubSets := PredictionModegetConflictingAltSubsets(reach)
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("LL altSubSets=" + fmt.Sprint(altSubSets) + ", predict=" +
+ strconv.Itoa(PredictionModegetUniqueAlt(altSubSets)) + ", resolvesToJustOneViableAlt=" +
+ fmt.Sprint(PredictionModeresolvesToJustOneViableAlt(altSubSets)))
+ }
+ reach.uniqueAlt = p.getUniqueAlt(reach)
+ // unique prediction?
+ if reach.uniqueAlt != ATNInvalidAltNumber {
+ predictedAlt = reach.uniqueAlt
+ break
+ }
+ if p.predictionMode != PredictionModeLLExactAmbigDetection {
+ predictedAlt = PredictionModeresolvesToJustOneViableAlt(altSubSets)
+ if predictedAlt != ATNInvalidAltNumber {
+ break
+ }
+ } else {
+ // In exact ambiguity mode, we never try to terminate early.
+ // Just keeps scarfing until we know what the conflict is
+ if PredictionModeallSubsetsConflict(altSubSets) && PredictionModeallSubsetsEqual(altSubSets) {
+ foundExactAmbig = true
+ predictedAlt = PredictionModegetSingleViableAlt(altSubSets)
+ break
+ }
+ // else there are multiple non-conflicting subsets or
+ // we're not sure what the ambiguity is yet.
+ // So, keep going.
+ }
+ previous = reach
+ if t != TokenEOF {
+ input.Consume()
+ t = input.LA(1)
+ }
+ }
+ // If the configuration set uniquely predicts an alternative,
+ // without conflict, then we know that it's a full LL decision
+ // not SLL.
+ if reach.uniqueAlt != ATNInvalidAltNumber {
+ p.ReportContextSensitivity(dfa, predictedAlt, reach, startIndex, input.Index())
+ return predictedAlt, nil
+ }
+ // We do not check predicates here because we have checked them
+ // on-the-fly when doing full context prediction.
+
+ //
+ // In non-exact ambiguity detection mode, we might actually be able to
+ // detect an exact ambiguity, but I'm not going to spend the cycles
+ // needed to check. We only emit ambiguity warnings in exact ambiguity
+ // mode.
+ //
+ // For example, we might know that we have conflicting configurations.
+ // But, that does not mean that there is no way forward without a
+ // conflict. It's possible to have non-conflicting alt subsets as in:
+ //
+ // altSubSets=[{1, 2}, {1, 2}, {1}, {1, 2}]
+ //
+ // from
+ //
+ // [(17,1,[5 $]), (13,1,[5 10 $]), (21,1,[5 10 $]), (11,1,[$]),
+ // (13,2,[5 10 $]), (21,2,[5 10 $]), (11,2,[$])]
+ //
+ // In p case, (17,1,[5 $]) indicates there is some next sequence that
+ // would resolve p without conflict to alternative 1. Any other viable
+ // next sequence, however, is associated with a conflict. We stop
+ // looking for input because no amount of further lookahead will alter
+ // the fact that we should predict alternative 1. We just can't say for
+ // sure that there is an ambiguity without looking further.
+
+ p.ReportAmbiguity(dfa, D, startIndex, input.Index(), foundExactAmbig, reach.Alts(), reach)
+
+ return predictedAlt, nil
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) computeReachSet(closure *ATNConfigSet, t int, fullCtx bool) *ATNConfigSet {
+ if p.mergeCache == nil {
+ p.mergeCache = NewJPCMap(ReachSetCollection, "Merge cache for computeReachSet()")
+ }
+ intermediate := NewATNConfigSet(fullCtx)
+
+ // Configurations already in a rule stop state indicate reaching the end
+ // of the decision rule (local context) or end of the start rule (full
+ // context). Once reached, these configurations are never updated by a
+ // closure operation, so they are handled separately for the performance
+ // advantage of having a smaller intermediate set when calling closure.
+ //
+ // For full-context reach operations, separate handling is required to
+ // ensure that the alternative Matching the longest overall sequence is
+ // chosen when multiple such configurations can Match the input.
+
+ var skippedStopStates []*ATNConfig
+
+ // First figure out where we can reach on input t
+ for _, c := range closure.configs {
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("testing " + p.GetTokenName(t) + " at " + c.String())
+ }
+
+ if _, ok := c.GetState().(*RuleStopState); ok {
+ if fullCtx || t == TokenEOF {
+ skippedStopStates = append(skippedStopStates, c)
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("added " + c.String() + " to SkippedStopStates")
+ }
+ }
+ continue
+ }
+
+ for _, trans := range c.GetState().GetTransitions() {
+ target := p.getReachableTarget(trans, t)
+ if target != nil {
+ cfg := NewATNConfig4(c, target)
+ intermediate.Add(cfg, p.mergeCache)
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("added " + cfg.String() + " to intermediate")
+ }
+ }
+ }
+ }
+
+ // Now figure out where the reach operation can take us...
+ var reach *ATNConfigSet
+
+ // This block optimizes the reach operation for intermediate sets which
+ // trivially indicate a termination state for the overall
+ // AdaptivePredict operation.
+ //
+ // The conditions assume that intermediate
+ // contains all configurations relevant to the reach set, but p
+ // condition is not true when one or more configurations have been
+ // withheld in SkippedStopStates, or when the current symbol is EOF.
+ //
+ if skippedStopStates == nil && t != TokenEOF {
+ if len(intermediate.configs) == 1 {
+ // Don't pursue the closure if there is just one state.
+ // It can only have one alternative just add to result
+ // Also don't pursue the closure if there is unique alternative
+ // among the configurations.
+ reach = intermediate
+ } else if p.getUniqueAlt(intermediate) != ATNInvalidAltNumber {
+ // Also don't pursue the closure if there is unique alternative
+ // among the configurations.
+ reach = intermediate
+ }
+ }
+ // If the reach set could not be trivially determined, perform a closure
+ // operation on the intermediate set to compute its initial value.
+ //
+ if reach == nil {
+ reach = NewATNConfigSet(fullCtx)
+ closureBusy := NewClosureBusy("ParserATNSimulator.computeReachSet() make a closureBusy")
+ treatEOFAsEpsilon := t == TokenEOF
+ amount := len(intermediate.configs)
+ for k := 0; k < amount; k++ {
+ p.closure(intermediate.configs[k], reach, closureBusy, false, fullCtx, treatEOFAsEpsilon)
+ }
+ }
+ if t == TokenEOF {
+ // After consuming EOF no additional input is possible, so we are
+ // only interested in configurations which reached the end of the
+ // decision rule (local context) or end of the start rule (full
+ // context). Update reach to contain only these configurations. This
+ // handles both explicit EOF transitions in the grammar and implicit
+ // EOF transitions following the end of the decision or start rule.
+ //
+ // When reach==intermediate, no closure operation was performed. In
+ // p case, removeAllConfigsNotInRuleStopState needs to check for
+ // reachable rule stop states as well as configurations already in
+ // a rule stop state.
+ //
+ // This is handled before the configurations in SkippedStopStates,
+ // because any configurations potentially added from that list are
+ // already guaranteed to meet this condition whether it's
+ // required.
+ //
+ reach = p.removeAllConfigsNotInRuleStopState(reach, reach.Equals(intermediate))
+ }
+ // If SkippedStopStates!=nil, then it contains at least one
+ // configuration. For full-context reach operations, these
+ // configurations reached the end of the start rule, in which case we
+ // only add them back to reach if no configuration during the current
+ // closure operation reached such a state. This ensures AdaptivePredict
+ // chooses an alternative Matching the longest overall sequence when
+ // multiple alternatives are viable.
+ //
+ if skippedStopStates != nil && ((!fullCtx) || (!PredictionModehasConfigInRuleStopState(reach))) {
+ for l := 0; l < len(skippedStopStates); l++ {
+ reach.Add(skippedStopStates[l], p.mergeCache)
+ }
+ }
+
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("computeReachSet " + closure.String() + " -> " + reach.String())
+ }
+
+ if len(reach.configs) == 0 {
+ return nil
+ }
+
+ return reach
+}
+
+// removeAllConfigsNotInRuleStopState returns a configuration set containing only the configurations from
+// configs which are in a [RuleStopState]. If all
+// configurations in configs are already in a rule stop state, this
+// method simply returns configs.
+//
+// When lookToEndOfRule is true, this method uses
+// [ATN].[NextTokens] for each configuration in configs which is
+// not already in a rule stop state to see if a rule stop state is reachable
+// from the configuration via epsilon-only transitions.
+//
+// When lookToEndOfRule is true, this method checks for rule stop states
+// reachable by epsilon-only transitions from each configuration in
+// configs.
+//
+// The func returns configs if all configurations in configs are in a
+// rule stop state, otherwise it returns a new configuration set containing only
+// the configurations from configs which are in a rule stop state
+func (p *ParserATNSimulator) removeAllConfigsNotInRuleStopState(configs *ATNConfigSet, lookToEndOfRule bool) *ATNConfigSet {
+ if PredictionModeallConfigsInRuleStopStates(configs) {
+ return configs
+ }
+ result := NewATNConfigSet(configs.fullCtx)
+ for _, config := range configs.configs {
+ if _, ok := config.GetState().(*RuleStopState); ok {
+ result.Add(config, p.mergeCache)
+ continue
+ }
+ if lookToEndOfRule && config.GetState().GetEpsilonOnlyTransitions() {
+ NextTokens := p.atn.NextTokens(config.GetState(), nil)
+ if NextTokens.contains(TokenEpsilon) {
+ endOfRuleState := p.atn.ruleToStopState[config.GetState().GetRuleIndex()]
+ result.Add(NewATNConfig4(config, endOfRuleState), p.mergeCache)
+ }
+ }
+ }
+ return result
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) computeStartState(a ATNState, ctx RuleContext, fullCtx bool) *ATNConfigSet {
+ // always at least the implicit call to start rule
+ initialContext := predictionContextFromRuleContext(p.atn, ctx)
+ configs := NewATNConfigSet(fullCtx)
+ if runtimeConfig.parserATNSimulatorDebug || runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("computeStartState from ATN state " + a.String() +
+ " initialContext=" + initialContext.String())
+ }
+
+ for i := 0; i < len(a.GetTransitions()); i++ {
+ target := a.GetTransitions()[i].getTarget()
+ c := NewATNConfig6(target, i+1, initialContext)
+ closureBusy := NewClosureBusy("ParserATNSimulator.computeStartState() make a closureBusy")
+ p.closure(c, configs, closureBusy, true, fullCtx, false)
+ }
+ return configs
+}
+
+// applyPrecedenceFilter transforms the start state computed by
+// [computeStartState] to the special start state used by a
+// precedence [DFA] for a particular precedence value. The transformation
+// process applies the following changes to the start state's configuration
+// set.
+//
+// 1. Evaluate the precedence predicates for each configuration using
+// [SemanticContext].evalPrecedence.
+// 2. Remove all configurations which predict an alternative greater than
+// 1, for which another configuration that predicts alternative 1 is in the
+// same ATN state with the same prediction context.
+//
+// Transformation 2 is valid for the following reasons:
+//
+// - The closure block cannot contain any epsilon transitions which bypass
+// the body of the closure, so all states reachable via alternative 1 are
+// part of the precedence alternatives of the transformed left-recursive
+// rule.
+// - The "primary" portion of a left recursive rule cannot contain an
+// epsilon transition, so the only way an alternative other than 1 can exist
+// in a state that is also reachable via alternative 1 is by nesting calls
+// to the left-recursive rule, with the outer calls not being at the
+// preferred precedence level.
+//
+// The prediction context must be considered by this filter to address
+// situations like the following:
+//
+// grammar TA
+// prog: statement* EOF
+// statement: letterA | statement letterA 'b'
+// letterA: 'a'
+//
+// In the above grammar, the [ATN] state immediately before the token
+// reference 'a' in letterA is reachable from the left edge
+// of both the primary and closure blocks of the left-recursive rule
+// statement. The prediction context associated with each of these
+// configurations distinguishes between them, and prevents the alternative
+// which stepped out to prog, and then back in to statement
+// from being eliminated by the filter.
+//
+// The func returns the transformed configuration set representing the start state
+// for a precedence [DFA] at a particular precedence level (determined by
+// calling [Parser].getPrecedence).
+func (p *ParserATNSimulator) applyPrecedenceFilter(configs *ATNConfigSet) *ATNConfigSet {
+
+ statesFromAlt1 := make(map[int]*PredictionContext)
+ configSet := NewATNConfigSet(configs.fullCtx)
+
+ for _, config := range configs.configs {
+ // handle alt 1 first
+ if config.GetAlt() != 1 {
+ continue
+ }
+ updatedContext := config.GetSemanticContext().evalPrecedence(p.parser, p.outerContext)
+ if updatedContext == nil {
+ // the configuration was eliminated
+ continue
+ }
+ statesFromAlt1[config.GetState().GetStateNumber()] = config.GetContext()
+ if updatedContext != config.GetSemanticContext() {
+ configSet.Add(NewATNConfig2(config, updatedContext), p.mergeCache)
+ } else {
+ configSet.Add(config, p.mergeCache)
+ }
+ }
+ for _, config := range configs.configs {
+
+ if config.GetAlt() == 1 {
+ // already handled
+ continue
+ }
+ // In the future, p elimination step could be updated to also
+ // filter the prediction context for alternatives predicting alt>1
+ // (basically a graph subtraction algorithm).
+ if !config.getPrecedenceFilterSuppressed() {
+ context := statesFromAlt1[config.GetState().GetStateNumber()]
+ if context != nil && context.Equals(config.GetContext()) {
+ // eliminated
+ continue
+ }
+ }
+ configSet.Add(config, p.mergeCache)
+ }
+ return configSet
+}
+
+func (p *ParserATNSimulator) getReachableTarget(trans Transition, ttype int) ATNState {
+ if trans.Matches(ttype, 0, p.atn.maxTokenType) {
+ return trans.getTarget()
+ }
+
+ return nil
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) getPredsForAmbigAlts(ambigAlts *BitSet, configs *ATNConfigSet, nalts int) []SemanticContext {
+
+ altToPred := make([]SemanticContext, nalts+1)
+ for _, c := range configs.configs {
+ if ambigAlts.contains(c.GetAlt()) {
+ altToPred[c.GetAlt()] = SemanticContextorContext(altToPred[c.GetAlt()], c.GetSemanticContext())
+ }
+ }
+ nPredAlts := 0
+ for i := 1; i <= nalts; i++ {
+ pred := altToPred[i]
+ if pred == nil {
+ altToPred[i] = SemanticContextNone
+ } else if pred != SemanticContextNone {
+ nPredAlts++
+ }
+ }
+ // unambiguous alts are nil in altToPred
+ if nPredAlts == 0 {
+ altToPred = nil
+ }
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("getPredsForAmbigAlts result " + fmt.Sprint(altToPred))
+ }
+ return altToPred
+}
+
+func (p *ParserATNSimulator) getPredicatePredictions(ambigAlts *BitSet, altToPred []SemanticContext) []*PredPrediction {
+ pairs := make([]*PredPrediction, 0)
+ containsPredicate := false
+ for i := 1; i < len(altToPred); i++ {
+ pred := altToPred[i]
+ // un-predicated is indicated by SemanticContextNONE
+ if ambigAlts != nil && ambigAlts.contains(i) {
+ pairs = append(pairs, NewPredPrediction(pred, i))
+ }
+ if pred != SemanticContextNone {
+ containsPredicate = true
+ }
+ }
+ if !containsPredicate {
+ return nil
+ }
+ return pairs
+}
+
+// getSynValidOrSemInvalidAltThatFinishedDecisionEntryRule is used to improve the localization of error messages by
+// choosing an alternative rather than panic a NoViableAltException in particular prediction scenarios where the
+// Error state was reached during [ATN] simulation.
+//
+// The default implementation of this method uses the following
+// algorithm to identify an [ATN] configuration which successfully parsed the
+// decision entry rule. Choosing such an alternative ensures that the
+// [ParserRuleContext] returned by the calling rule will be complete
+// and valid, and the syntax error will be Reported later at a more
+// localized location.
+//
+// - If a syntactically valid path or paths reach the end of the decision rule, and
+// they are semantically valid if predicated, return the min associated alt.
+// - Else, if a semantically invalid but syntactically valid path exist
+// or paths exist, return the minimum associated alt.
+// - Otherwise, return [ATNInvalidAltNumber].
+//
+// In some scenarios, the algorithm described above could predict an
+// alternative which will result in a [FailedPredicateException] in
+// the parser. Specifically, this could occur if the only configuration
+// capable of successfully parsing to the end of the decision rule is
+// blocked by a semantic predicate. By choosing this alternative within
+// [AdaptivePredict] instead of panic a [NoViableAltException], the resulting
+// [FailedPredicateException] in the parser will identify the specific
+// predicate which is preventing the parser from successfully parsing the
+// decision rule, which helps developers identify and correct logic errors
+// in semantic predicates.
+//
+// pass in the configs holding ATN configurations which were valid immediately before
+// the ERROR state was reached, outerContext as the initial parser context from the paper
+// or the parser stack at the instant before prediction commences.
+//
+// Teh func returns the value to return from [AdaptivePredict], or
+// [ATNInvalidAltNumber] if a suitable alternative was not
+// identified and [AdaptivePredict] should report an error instead.
+func (p *ParserATNSimulator) getSynValidOrSemInvalidAltThatFinishedDecisionEntryRule(configs *ATNConfigSet, outerContext ParserRuleContext) int {
+ cfgs := p.splitAccordingToSemanticValidity(configs, outerContext)
+ semValidConfigs := cfgs[0]
+ semInvalidConfigs := cfgs[1]
+ alt := p.GetAltThatFinishedDecisionEntryRule(semValidConfigs)
+ if alt != ATNInvalidAltNumber { // semantically/syntactically viable path exists
+ return alt
+ }
+ // Is there a syntactically valid path with a failed pred?
+ if len(semInvalidConfigs.configs) > 0 {
+ alt = p.GetAltThatFinishedDecisionEntryRule(semInvalidConfigs)
+ if alt != ATNInvalidAltNumber { // syntactically viable path exists
+ return alt
+ }
+ }
+ return ATNInvalidAltNumber
+}
+
+func (p *ParserATNSimulator) GetAltThatFinishedDecisionEntryRule(configs *ATNConfigSet) int {
+ alts := NewIntervalSet()
+
+ for _, c := range configs.configs {
+ _, ok := c.GetState().(*RuleStopState)
+
+ if c.GetReachesIntoOuterContext() > 0 || (ok && c.GetContext().hasEmptyPath()) {
+ alts.addOne(c.GetAlt())
+ }
+ }
+ if alts.length() == 0 {
+ return ATNInvalidAltNumber
+ }
+
+ return alts.first()
+}
+
+// Walk the list of configurations and split them according to
+// those that have preds evaluating to true/false. If no pred, assume
+// true pred and include in succeeded set. Returns Pair of sets.
+//
+// Create a NewSet so as not to alter the incoming parameter.
+//
+// Assumption: the input stream has been restored to the starting point
+// prediction, which is where predicates need to evaluate.
+
+type ATNConfigSetPair struct {
+ item0, item1 *ATNConfigSet
+}
+
+func (p *ParserATNSimulator) splitAccordingToSemanticValidity(configs *ATNConfigSet, outerContext ParserRuleContext) []*ATNConfigSet {
+ succeeded := NewATNConfigSet(configs.fullCtx)
+ failed := NewATNConfigSet(configs.fullCtx)
+
+ for _, c := range configs.configs {
+ if c.GetSemanticContext() != SemanticContextNone {
+ predicateEvaluationResult := c.GetSemanticContext().evaluate(p.parser, outerContext)
+ if predicateEvaluationResult {
+ succeeded.Add(c, nil)
+ } else {
+ failed.Add(c, nil)
+ }
+ } else {
+ succeeded.Add(c, nil)
+ }
+ }
+ return []*ATNConfigSet{succeeded, failed}
+}
+
+// evalSemanticContext looks through a list of predicate/alt pairs, returning alts for the
+// pairs that win. A [SemanticContextNone] predicate indicates an alt containing an
+// un-predicated runtimeConfig which behaves as "always true." If !complete
+// then we stop at the first predicate that evaluates to true. This
+// includes pairs with nil predicates.
+//
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) evalSemanticContext(predPredictions []*PredPrediction, outerContext ParserRuleContext, complete bool) *BitSet {
+ predictions := NewBitSet()
+ for i := 0; i < len(predPredictions); i++ {
+ pair := predPredictions[i]
+ if pair.pred == SemanticContextNone {
+ predictions.add(pair.alt)
+ if !complete {
+ break
+ }
+ continue
+ }
+
+ predicateEvaluationResult := pair.pred.evaluate(p.parser, outerContext)
+ if runtimeConfig.parserATNSimulatorDebug || runtimeConfig.parserATNSimulatorDFADebug {
+ fmt.Println("eval pred " + pair.String() + "=" + fmt.Sprint(predicateEvaluationResult))
+ }
+ if predicateEvaluationResult {
+ if runtimeConfig.parserATNSimulatorDebug || runtimeConfig.parserATNSimulatorDFADebug {
+ fmt.Println("PREDICT " + fmt.Sprint(pair.alt))
+ }
+ predictions.add(pair.alt)
+ if !complete {
+ break
+ }
+ }
+ }
+ return predictions
+}
+
+func (p *ParserATNSimulator) closure(config *ATNConfig, configs *ATNConfigSet, closureBusy *ClosureBusy, collectPredicates, fullCtx, treatEOFAsEpsilon bool) {
+ initialDepth := 0
+ p.closureCheckingStopState(config, configs, closureBusy, collectPredicates,
+ fullCtx, initialDepth, treatEOFAsEpsilon)
+}
+
+func (p *ParserATNSimulator) closureCheckingStopState(config *ATNConfig, configs *ATNConfigSet, closureBusy *ClosureBusy, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) {
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("closure(" + config.String() + ")")
+ }
+
+ var stack []*ATNConfig
+ visited := make(map[*ATNConfig]bool)
+
+ stack = append(stack, config)
+
+ for len(stack) > 0 {
+ currConfig := stack[len(stack)-1]
+ stack = stack[:len(stack)-1]
+
+ if _, ok := visited[currConfig]; ok {
+ continue
+ }
+ visited[currConfig] = true
+
+ if _, ok := currConfig.GetState().(*RuleStopState); ok {
+ // We hit rule end. If we have context info, use it
+ // run thru all possible stack tops in ctx
+ if !currConfig.GetContext().isEmpty() {
+ for i := 0; i < currConfig.GetContext().length(); i++ {
+ if currConfig.GetContext().getReturnState(i) == BasePredictionContextEmptyReturnState {
+ if fullCtx {
+ nb := NewATNConfig1(currConfig, currConfig.GetState(), BasePredictionContextEMPTY)
+ configs.Add(nb, p.mergeCache)
+ continue
+ } else {
+ // we have no context info, just chase follow links (if greedy)
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("FALLING off rule " + p.getRuleName(currConfig.GetState().GetRuleIndex()))
+ }
+ p.closureWork(currConfig, configs, closureBusy, collectPredicates, fullCtx, depth, treatEOFAsEpsilon)
+ }
+ continue
+ }
+ returnState := p.atn.states[currConfig.GetContext().getReturnState(i)]
+ newContext := currConfig.GetContext().GetParent(i) // "pop" return state
+
+ c := NewATNConfig5(returnState, currConfig.GetAlt(), newContext, currConfig.GetSemanticContext())
+ // While we have context to pop back from, we may have
+ // gotten that context AFTER having falling off a rule.
+ // Make sure we track that we are now out of context.
+ c.SetReachesIntoOuterContext(currConfig.GetReachesIntoOuterContext())
+
+ stack = append(stack, c)
+ }
+ continue
+ } else if fullCtx {
+ // reached end of start rule
+ configs.Add(currConfig, p.mergeCache)
+ continue
+ } else {
+ // else if we have no context info, just chase follow links (if greedy)
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("FALLING off rule " + p.getRuleName(currConfig.GetState().GetRuleIndex()))
+ }
+ }
+ }
+
+ p.closureWork(currConfig, configs, closureBusy, collectPredicates, fullCtx, depth, treatEOFAsEpsilon)
+ }
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) closureCheckingStopStateRecursive(config *ATNConfig, configs *ATNConfigSet, closureBusy *ClosureBusy, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) {
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("closure(" + config.String() + ")")
+ }
+
+ if _, ok := config.GetState().(*RuleStopState); ok {
+ // We hit rule end. If we have context info, use it
+ // run thru all possible stack tops in ctx
+ if !config.GetContext().isEmpty() {
+ for i := 0; i < config.GetContext().length(); i++ {
+ if config.GetContext().getReturnState(i) == BasePredictionContextEmptyReturnState {
+ if fullCtx {
+ nb := NewATNConfig1(config, config.GetState(), BasePredictionContextEMPTY)
+ configs.Add(nb, p.mergeCache)
+ continue
+ } else {
+ // we have no context info, just chase follow links (if greedy)
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("FALLING off rule " + p.getRuleName(config.GetState().GetRuleIndex()))
+ }
+ p.closureWork(config, configs, closureBusy, collectPredicates, fullCtx, depth, treatEOFAsEpsilon)
+ }
+ continue
+ }
+ returnState := p.atn.states[config.GetContext().getReturnState(i)]
+ newContext := config.GetContext().GetParent(i) // "pop" return state
+
+ c := NewATNConfig5(returnState, config.GetAlt(), newContext, config.GetSemanticContext())
+ // While we have context to pop back from, we may have
+ // gotten that context AFTER having falling off a rule.
+ // Make sure we track that we are now out of context.
+ c.SetReachesIntoOuterContext(config.GetReachesIntoOuterContext())
+ p.closureCheckingStopState(c, configs, closureBusy, collectPredicates, fullCtx, depth-1, treatEOFAsEpsilon)
+ }
+ return
+ } else if fullCtx {
+ // reached end of start rule
+ configs.Add(config, p.mergeCache)
+ return
+ } else {
+ // else if we have no context info, just chase follow links (if greedy)
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("FALLING off rule " + p.getRuleName(config.GetState().GetRuleIndex()))
+ }
+ }
+ }
+ p.closureWork(config, configs, closureBusy, collectPredicates, fullCtx, depth, treatEOFAsEpsilon)
+}
+
+// Do the actual work of walking epsilon edges
+//
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) closureWork(config *ATNConfig, configs *ATNConfigSet, closureBusy *ClosureBusy, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) {
+ state := config.GetState()
+ // optimization
+ if !state.GetEpsilonOnlyTransitions() {
+ configs.Add(config, p.mergeCache)
+ // make sure to not return here, because EOF transitions can act as
+ // both epsilon transitions and non-epsilon transitions.
+ }
+ for i := 0; i < len(state.GetTransitions()); i++ {
+ if i == 0 && p.canDropLoopEntryEdgeInLeftRecursiveRule(config) {
+ continue
+ }
+
+ t := state.GetTransitions()[i]
+ _, ok := t.(*ActionTransition)
+ continueCollecting := collectPredicates && !ok
+ c := p.getEpsilonTarget(config, t, continueCollecting, depth == 0, fullCtx, treatEOFAsEpsilon)
+ if c != nil {
+ newDepth := depth
+
+ if _, ok := config.GetState().(*RuleStopState); ok {
+ // target fell off end of rule mark resulting c as having dipped into outer context
+ // We can't get here if incoming config was rule stop and we had context
+ // track how far we dip into outer context. Might
+ // come in handy and we avoid evaluating context dependent
+ // preds if this is > 0.
+
+ if p.dfa != nil && p.dfa.getPrecedenceDfa() {
+ if t.(*EpsilonTransition).outermostPrecedenceReturn == p.dfa.atnStartState.GetRuleIndex() {
+ c.setPrecedenceFilterSuppressed(true)
+ }
+ }
+
+ c.SetReachesIntoOuterContext(c.GetReachesIntoOuterContext() + 1)
+
+ _, present := closureBusy.Put(c)
+ if present {
+ // avoid infinite recursion for right-recursive rules
+ continue
+ }
+
+ configs.dipsIntoOuterContext = true // TODO: can remove? only care when we add to set per middle of this method
+ newDepth--
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("dips into outer ctx: " + c.String())
+ }
+ } else {
+
+ if !t.getIsEpsilon() {
+ _, present := closureBusy.Put(c)
+ if present {
+ // avoid infinite recursion for EOF* and EOF+
+ continue
+ }
+ }
+ if _, ok := t.(*RuleTransition); ok {
+ // latch when newDepth goes negative - once we step out of the entry context we can't return
+ if newDepth >= 0 {
+ newDepth++
+ }
+ }
+ }
+ p.closureCheckingStopState(c, configs, closureBusy, continueCollecting, fullCtx, newDepth, treatEOFAsEpsilon)
+ }
+ }
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) canDropLoopEntryEdgeInLeftRecursiveRule(config *ATNConfig) bool {
+ if !runtimeConfig.lRLoopEntryBranchOpt {
+ return false
+ }
+
+ _p := config.GetState()
+
+ // First check to see if we are in StarLoopEntryState generated during
+ // left-recursion elimination. For efficiency, also check if
+ // the context has an empty stack case. If so, it would mean
+ // global FOLLOW so we can't perform optimization
+ if _p.GetStateType() != ATNStateStarLoopEntry {
+ return false
+ }
+ startLoop, ok := _p.(*StarLoopEntryState)
+ if !ok {
+ return false
+ }
+ if !startLoop.precedenceRuleDecision ||
+ config.GetContext().isEmpty() ||
+ config.GetContext().hasEmptyPath() {
+ return false
+ }
+
+ // Require all return states to return back to the same rule
+ // that p is in.
+ numCtxs := config.GetContext().length()
+ for i := 0; i < numCtxs; i++ {
+ returnState := p.atn.states[config.GetContext().getReturnState(i)]
+ if returnState.GetRuleIndex() != _p.GetRuleIndex() {
+ return false
+ }
+ }
+ x := _p.GetTransitions()[0].getTarget()
+ decisionStartState := x.(BlockStartState)
+ blockEndStateNum := decisionStartState.getEndState().stateNumber
+ blockEndState := p.atn.states[blockEndStateNum].(*BlockEndState)
+
+ // Verify that the top of each stack context leads to loop entry/exit
+ // state through epsilon edges and w/o leaving rule.
+
+ for i := 0; i < numCtxs; i++ { // for each stack context
+ returnStateNumber := config.GetContext().getReturnState(i)
+ returnState := p.atn.states[returnStateNumber]
+
+ // all states must have single outgoing epsilon edge
+ if len(returnState.GetTransitions()) != 1 || !returnState.GetTransitions()[0].getIsEpsilon() {
+ return false
+ }
+
+ // Look for prefix op case like 'not expr', (' type ')' expr
+ returnStateTarget := returnState.GetTransitions()[0].getTarget()
+ if returnState.GetStateType() == ATNStateBlockEnd && returnStateTarget == _p {
+ continue
+ }
+
+ // Look for 'expr op expr' or case where expr's return state is block end
+ // of (...)* internal block; the block end points to loop back
+ // which points to p but we don't need to check that
+ if returnState == blockEndState {
+ continue
+ }
+
+ // Look for ternary expr ? expr : expr. The return state points at block end,
+ // which points at loop entry state
+ if returnStateTarget == blockEndState {
+ continue
+ }
+
+ // Look for complex prefix 'between expr and expr' case where 2nd expr's
+ // return state points at block end state of (...)* internal block
+ if returnStateTarget.GetStateType() == ATNStateBlockEnd &&
+ len(returnStateTarget.GetTransitions()) == 1 &&
+ returnStateTarget.GetTransitions()[0].getIsEpsilon() &&
+ returnStateTarget.GetTransitions()[0].getTarget() == _p {
+ continue
+ }
+
+ // anything else ain't conforming
+ return false
+ }
+
+ return true
+}
+
+func (p *ParserATNSimulator) getRuleName(index int) string {
+ if p.parser != nil && index >= 0 {
+ return p.parser.GetRuleNames()[index]
+ }
+ var sb strings.Builder
+ sb.Grow(32)
+
+ sb.WriteString("')
+ return sb.String()
+}
+
+func (p *ParserATNSimulator) getEpsilonTarget(config *ATNConfig, t Transition, collectPredicates, inContext, fullCtx, treatEOFAsEpsilon bool) *ATNConfig {
+
+ switch t.getSerializationType() {
+ case TransitionRULE:
+ return p.ruleTransition(config, t.(*RuleTransition))
+ case TransitionPRECEDENCE:
+ return p.precedenceTransition(config, t.(*PrecedencePredicateTransition), collectPredicates, inContext, fullCtx)
+ case TransitionPREDICATE:
+ return p.predTransition(config, t.(*PredicateTransition), collectPredicates, inContext, fullCtx)
+ case TransitionACTION:
+ return p.actionTransition(config, t.(*ActionTransition))
+ case TransitionEPSILON:
+ return NewATNConfig4(config, t.getTarget())
+ case TransitionATOM, TransitionRANGE, TransitionSET:
+ // EOF transitions act like epsilon transitions after the first EOF
+ // transition is traversed
+ if treatEOFAsEpsilon {
+ if t.Matches(TokenEOF, 0, 1) {
+ return NewATNConfig4(config, t.getTarget())
+ }
+ }
+ return nil
+ default:
+ return nil
+ }
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) actionTransition(config *ATNConfig, t *ActionTransition) *ATNConfig {
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("ACTION edge " + strconv.Itoa(t.ruleIndex) + ":" + strconv.Itoa(t.actionIndex))
+ }
+ return NewATNConfig4(config, t.getTarget())
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) precedenceTransition(config *ATNConfig,
+ pt *PrecedencePredicateTransition, collectPredicates, inContext, fullCtx bool) *ATNConfig {
+
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("PRED (collectPredicates=" + fmt.Sprint(collectPredicates) + ") " +
+ strconv.Itoa(pt.precedence) + ">=_p, ctx dependent=true")
+ if p.parser != nil {
+ fmt.Println("context surrounding pred is " + fmt.Sprint(p.parser.GetRuleInvocationStack(nil)))
+ }
+ }
+ var c *ATNConfig
+ if collectPredicates && inContext {
+ if fullCtx {
+ // In full context mode, we can evaluate predicates on-the-fly
+ // during closure, which dramatically reduces the size of
+ // the runtimeConfig sets. It also obviates the need to test predicates
+ // later during conflict resolution.
+ currentPosition := p.input.Index()
+ p.input.Seek(p.startIndex)
+ predSucceeds := pt.getPredicate().evaluate(p.parser, p.outerContext)
+ p.input.Seek(currentPosition)
+ if predSucceeds {
+ c = NewATNConfig4(config, pt.getTarget()) // no pred context
+ }
+ } else {
+ newSemCtx := SemanticContextandContext(config.GetSemanticContext(), pt.getPredicate())
+ c = NewATNConfig3(config, pt.getTarget(), newSemCtx)
+ }
+ } else {
+ c = NewATNConfig4(config, pt.getTarget())
+ }
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("runtimeConfig from pred transition=" + c.String())
+ }
+ return c
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) predTransition(config *ATNConfig, pt *PredicateTransition, collectPredicates, inContext, fullCtx bool) *ATNConfig {
+
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("PRED (collectPredicates=" + fmt.Sprint(collectPredicates) + ") " + strconv.Itoa(pt.ruleIndex) +
+ ":" + strconv.Itoa(pt.predIndex) + ", ctx dependent=" + fmt.Sprint(pt.isCtxDependent))
+ if p.parser != nil {
+ fmt.Println("context surrounding pred is " + fmt.Sprint(p.parser.GetRuleInvocationStack(nil)))
+ }
+ }
+ var c *ATNConfig
+ if collectPredicates && (!pt.isCtxDependent || inContext) {
+ if fullCtx {
+ // In full context mode, we can evaluate predicates on-the-fly
+ // during closure, which dramatically reduces the size of
+ // the config sets. It also obviates the need to test predicates
+ // later during conflict resolution.
+ currentPosition := p.input.Index()
+ p.input.Seek(p.startIndex)
+ predSucceeds := pt.getPredicate().evaluate(p.parser, p.outerContext)
+ p.input.Seek(currentPosition)
+ if predSucceeds {
+ c = NewATNConfig4(config, pt.getTarget()) // no pred context
+ }
+ } else {
+ newSemCtx := SemanticContextandContext(config.GetSemanticContext(), pt.getPredicate())
+ c = NewATNConfig3(config, pt.getTarget(), newSemCtx)
+ }
+ } else {
+ c = NewATNConfig4(config, pt.getTarget())
+ }
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("config from pred transition=" + c.String())
+ }
+ return c
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) ruleTransition(config *ATNConfig, t *RuleTransition) *ATNConfig {
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("CALL rule " + p.getRuleName(t.getTarget().GetRuleIndex()) + ", ctx=" + config.GetContext().String())
+ }
+ returnState := t.followState
+ newContext := SingletonBasePredictionContextCreate(config.GetContext(), returnState.GetStateNumber())
+ return NewATNConfig1(config, t.getTarget(), newContext)
+}
+
+func (p *ParserATNSimulator) getConflictingAlts(configs *ATNConfigSet) *BitSet {
+ altsets := PredictionModegetConflictingAltSubsets(configs)
+ return PredictionModeGetAlts(altsets)
+}
+
+// getConflictingAltsOrUniqueAlt Sam pointed out a problem with the previous definition, v3, of
+// ambiguous states. If we have another state associated with conflicting
+// alternatives, we should keep going. For example, the following grammar
+//
+// s : (ID | ID ID?) ;
+//
+// When the [ATN] simulation reaches the state before ;, it has a [DFA]
+// state that looks like:
+//
+// [12|1|[], 6|2|[], 12|2|[]].
+//
+// Naturally
+//
+// 12|1|[] and 12|2|[]
+//
+// conflict, but we cannot stop processing this node
+// because alternative to has another way to continue, via
+//
+// [6|2|[]].
+//
+// The key is that we have a single state that has config's only associated
+// with a single alternative, 2, and crucially the state transitions
+// among the configurations are all non-epsilon transitions. That means
+// we don't consider any conflicts that include alternative 2. So, we
+// ignore the conflict between alts 1 and 2. We ignore a set of
+// conflicting alts when there is an intersection with an alternative
+// associated with a single alt state in the state config-list map.
+//
+// It's also the case that we might have two conflicting configurations but
+// also a 3rd non-conflicting configuration for a different alternative:
+//
+// [1|1|[], 1|2|[], 8|3|[]].
+//
+// This can come about from grammar:
+//
+// a : A | A | A B
+//
+// After Matching input A, we reach the stop state for rule A, state 1.
+// State 8 is the state right before B. Clearly alternatives 1 and 2
+// conflict and no amount of further lookahead will separate the two.
+// However, alternative 3 will be able to continue, so we do not
+// stop working on this state.
+//
+// In the previous example, we're concerned
+// with states associated with the conflicting alternatives. Here alt
+// 3 is not associated with the conflicting configs, but since we can continue
+// looking for input reasonably, I don't declare the state done. We
+// ignore a set of conflicting alts when we have an alternative
+// that we still need to pursue.
+func (p *ParserATNSimulator) getConflictingAltsOrUniqueAlt(configs *ATNConfigSet) *BitSet {
+ var conflictingAlts *BitSet
+ if configs.uniqueAlt != ATNInvalidAltNumber {
+ conflictingAlts = NewBitSet()
+ conflictingAlts.add(configs.uniqueAlt)
+ } else {
+ conflictingAlts = configs.conflictingAlts
+ }
+ return conflictingAlts
+}
+
+func (p *ParserATNSimulator) GetTokenName(t int) string {
+ if t == TokenEOF {
+ return "EOF"
+ }
+
+ if p.parser != nil && p.parser.GetLiteralNames() != nil && t < len(p.parser.GetLiteralNames()) {
+ return p.parser.GetLiteralNames()[t] + "<" + strconv.Itoa(t) + ">"
+ }
+
+ if p.parser != nil && p.parser.GetLiteralNames() != nil && t < len(p.parser.GetSymbolicNames()) {
+ return p.parser.GetSymbolicNames()[t] + "<" + strconv.Itoa(t) + ">"
+ }
+
+ return strconv.Itoa(t)
+}
+
+func (p *ParserATNSimulator) getLookaheadName(input TokenStream) string {
+ return p.GetTokenName(input.LA(1))
+}
+
+// Used for debugging in [AdaptivePredict] around [execATN], but I cut
+// it out for clarity now that alg. works well. We can leave this
+// "dead" code for a bit.
+func (p *ParserATNSimulator) dumpDeadEndConfigs(_ *NoViableAltException) {
+
+ panic("Not implemented")
+
+ // fmt.Println("dead end configs: ")
+ // var decs = nvae.deadEndConfigs
+ //
+ // for i:=0; i0) {
+ // var t = c.state.GetTransitions()[0]
+ // if t2, ok := t.(*AtomTransition); ok {
+ // trans = "Atom "+ p.GetTokenName(t2.label)
+ // } else if t3, ok := t.(SetTransition); ok {
+ // _, ok := t.(*NotSetTransition)
+ //
+ // var s string
+ // if (ok){
+ // s = "~"
+ // }
+ //
+ // trans = s + "Set " + t3.set
+ // }
+ // }
+ // fmt.Errorf(c.String(p.parser, true) + ":" + trans)
+ // }
+}
+
+func (p *ParserATNSimulator) noViableAlt(input TokenStream, outerContext ParserRuleContext, configs *ATNConfigSet, startIndex int) *NoViableAltException {
+ return NewNoViableAltException(p.parser, input, input.Get(startIndex), input.LT(1), configs, outerContext)
+}
+
+func (p *ParserATNSimulator) getUniqueAlt(configs *ATNConfigSet) int {
+ alt := ATNInvalidAltNumber
+ for _, c := range configs.configs {
+ if alt == ATNInvalidAltNumber {
+ alt = c.GetAlt() // found first alt
+ } else if c.GetAlt() != alt {
+ return ATNInvalidAltNumber
+ }
+ }
+ return alt
+}
+
+// Add an edge to the DFA, if possible. This method calls
+// {@link //addDFAState} to ensure the {@code to} state is present in the
+// DFA. If {@code from} is {@code nil}, or if {@code t} is outside the
+// range of edges that can be represented in the DFA tables, p method
+// returns without adding the edge to the DFA.
+//
+// If {@code to} is {@code nil}, p method returns {@code nil}.
+// Otherwise, p method returns the {@link DFAState} returned by calling
+// {@link //addDFAState} for the {@code to} state.
+//
+// @param dfa The DFA
+// @param from The source state for the edge
+// @param t The input symbol
+// @param to The target state for the edge
+//
+// @return If {@code to} is {@code nil}, p method returns {@code nil}
+// otherwise p method returns the result of calling {@link //addDFAState}
+// on {@code to}
+//
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) addDFAEdge(dfa *DFA, from *DFAState, t int, to *DFAState) *DFAState {
+ if runtimeConfig.parserATNSimulatorDebug {
+ fmt.Println("EDGE " + from.String() + " -> " + to.String() + " upon " + p.GetTokenName(t))
+ }
+ if to == nil {
+ return nil
+ }
+ p.atn.stateMu.Lock()
+ to = p.addDFAState(dfa, to) // used existing if possible not incoming
+ p.atn.stateMu.Unlock()
+ if from == nil || t < -1 || t > p.atn.maxTokenType {
+ return to
+ }
+ p.atn.edgeMu.Lock()
+ if from.getEdges() == nil {
+ from.setEdges(make([]*DFAState, p.atn.maxTokenType+1+1))
+ }
+ from.setIthEdge(t+1, to) // connect
+ p.atn.edgeMu.Unlock()
+
+ if runtimeConfig.parserATNSimulatorDebug {
+ var names []string
+ if p.parser != nil {
+ names = p.parser.GetLiteralNames()
+ }
+
+ fmt.Println("DFA=\n" + dfa.String(names, nil))
+ }
+ return to
+}
+
+// addDFAState adds state D to the [DFA] if it is not already present, and returns
+// the actual instance stored in the [DFA]. If a state equivalent to D
+// is already in the [DFA], the existing state is returned. Otherwise, this
+// method returns D after adding it to the [DFA].
+//
+// If D is [ATNSimulatorError], this method returns [ATNSimulatorError] and
+// does not change the DFA.
+//
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) addDFAState(dfa *DFA, d *DFAState) *DFAState {
+ if d == ATNSimulatorError {
+ return d
+ }
+
+ existing, present := dfa.Get(d)
+ if present {
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Print("addDFAState " + d.String() + " exists")
+ }
+ return existing
+ }
+
+ // The state will be added if not already there or we will be given back the existing state struct
+ // if it is present.
+ //
+ d.stateNumber = dfa.Len()
+ if !d.configs.readOnly {
+ d.configs.OptimizeConfigs(&p.BaseATNSimulator)
+ d.configs.readOnly = true
+ d.configs.configLookup = nil
+ }
+ dfa.Put(d)
+
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("addDFAState new " + d.String())
+ }
+
+ return d
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) ReportAttemptingFullContext(dfa *DFA, conflictingAlts *BitSet, configs *ATNConfigSet, startIndex, stopIndex int) {
+ if runtimeConfig.parserATNSimulatorDebug || runtimeConfig.parserATNSimulatorRetryDebug {
+ interval := NewInterval(startIndex, stopIndex+1)
+ fmt.Println("ReportAttemptingFullContext decision=" + strconv.Itoa(dfa.decision) + ":" + configs.String() +
+ ", input=" + p.parser.GetTokenStream().GetTextFromInterval(interval))
+ }
+ if p.parser != nil {
+ p.parser.GetErrorListenerDispatch().ReportAttemptingFullContext(p.parser, dfa, startIndex, stopIndex, conflictingAlts, configs)
+ }
+}
+
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) ReportContextSensitivity(dfa *DFA, prediction int, configs *ATNConfigSet, startIndex, stopIndex int) {
+ if runtimeConfig.parserATNSimulatorDebug || runtimeConfig.parserATNSimulatorRetryDebug {
+ interval := NewInterval(startIndex, stopIndex+1)
+ fmt.Println("ReportContextSensitivity decision=" + strconv.Itoa(dfa.decision) + ":" + configs.String() +
+ ", input=" + p.parser.GetTokenStream().GetTextFromInterval(interval))
+ }
+ if p.parser != nil {
+ p.parser.GetErrorListenerDispatch().ReportContextSensitivity(p.parser, dfa, startIndex, stopIndex, prediction, configs)
+ }
+}
+
+// ReportAmbiguity reports and ambiguity in the parse, which shows that the parser will explore a different route.
+//
+// If context-sensitive parsing, we know it's an ambiguity not a conflict or error, but we can report it to the developer
+// so that they can see that this is happening and can take action if they want to.
+//
+//goland:noinspection GoBoolExpressions
+func (p *ParserATNSimulator) ReportAmbiguity(dfa *DFA, _ *DFAState, startIndex, stopIndex int,
+ exact bool, ambigAlts *BitSet, configs *ATNConfigSet) {
+ if runtimeConfig.parserATNSimulatorDebug || runtimeConfig.parserATNSimulatorRetryDebug {
+ interval := NewInterval(startIndex, stopIndex+1)
+ fmt.Println("ReportAmbiguity " + ambigAlts.String() + ":" + configs.String() +
+ ", input=" + p.parser.GetTokenStream().GetTextFromInterval(interval))
+ }
+ if p.parser != nil {
+ p.parser.GetErrorListenerDispatch().ReportAmbiguity(p.parser, dfa, startIndex, stopIndex, exact, ambigAlts, configs)
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/parser_rule_context.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/parser_rule_context.go
new file mode 100644
index 0000000..c249bc1
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/parser_rule_context.go
@@ -0,0 +1,421 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "reflect"
+ "strconv"
+)
+
+type ParserRuleContext interface {
+ RuleContext
+
+ SetException(RecognitionException)
+
+ AddTokenNode(token Token) *TerminalNodeImpl
+ AddErrorNode(badToken Token) *ErrorNodeImpl
+
+ EnterRule(listener ParseTreeListener)
+ ExitRule(listener ParseTreeListener)
+
+ SetStart(Token)
+ GetStart() Token
+
+ SetStop(Token)
+ GetStop() Token
+
+ AddChild(child RuleContext) RuleContext
+ RemoveLastChild()
+}
+
+type BaseParserRuleContext struct {
+ parentCtx RuleContext
+ invokingState int
+ RuleIndex int
+
+ start, stop Token
+ exception RecognitionException
+ children []Tree
+}
+
+func NewBaseParserRuleContext(parent ParserRuleContext, invokingStateNumber int) *BaseParserRuleContext {
+ prc := new(BaseParserRuleContext)
+ InitBaseParserRuleContext(prc, parent, invokingStateNumber)
+ return prc
+}
+
+func InitBaseParserRuleContext(prc *BaseParserRuleContext, parent ParserRuleContext, invokingStateNumber int) {
+ // What context invoked b rule?
+ prc.parentCtx = parent
+
+ // What state invoked the rule associated with b context?
+ // The "return address" is the followState of invokingState
+ // If parent is nil, b should be -1.
+ if parent == nil {
+ prc.invokingState = -1
+ } else {
+ prc.invokingState = invokingStateNumber
+ }
+
+ prc.RuleIndex = -1
+ // * If we are debugging or building a parse tree for a Visitor,
+ // we need to track all of the tokens and rule invocations associated
+ // with prc rule's context. This is empty for parsing w/o tree constr.
+ // operation because we don't the need to track the details about
+ // how we parse prc rule.
+ // /
+ prc.children = nil
+ prc.start = nil
+ prc.stop = nil
+ // The exception that forced prc rule to return. If the rule successfully
+ // completed, prc is {@code nil}.
+ prc.exception = nil
+}
+
+func (prc *BaseParserRuleContext) SetException(e RecognitionException) {
+ prc.exception = e
+}
+
+func (prc *BaseParserRuleContext) GetChildren() []Tree {
+ return prc.children
+}
+
+func (prc *BaseParserRuleContext) CopyFrom(ctx *BaseParserRuleContext) {
+ // from RuleContext
+ prc.parentCtx = ctx.parentCtx
+ prc.invokingState = ctx.invokingState
+ prc.children = nil
+ prc.start = ctx.start
+ prc.stop = ctx.stop
+}
+
+func (prc *BaseParserRuleContext) GetText() string {
+ if prc.GetChildCount() == 0 {
+ return ""
+ }
+
+ var s string
+ for _, child := range prc.children {
+ s += child.(ParseTree).GetText()
+ }
+
+ return s
+}
+
+// EnterRule is called when any rule is entered.
+func (prc *BaseParserRuleContext) EnterRule(_ ParseTreeListener) {
+}
+
+// ExitRule is called when any rule is exited.
+func (prc *BaseParserRuleContext) ExitRule(_ ParseTreeListener) {
+}
+
+// * Does not set parent link other add methods do that
+func (prc *BaseParserRuleContext) addTerminalNodeChild(child TerminalNode) TerminalNode {
+ if prc.children == nil {
+ prc.children = make([]Tree, 0)
+ }
+ if child == nil {
+ panic("Child may not be null")
+ }
+ prc.children = append(prc.children, child)
+ return child
+}
+
+func (prc *BaseParserRuleContext) AddChild(child RuleContext) RuleContext {
+ if prc.children == nil {
+ prc.children = make([]Tree, 0)
+ }
+ if child == nil {
+ panic("Child may not be null")
+ }
+ prc.children = append(prc.children, child)
+ return child
+}
+
+// RemoveLastChild is used by [EnterOuterAlt] to toss out a [RuleContext] previously added as
+// we entered a rule. If we have a label, we will need to remove
+// the generic ruleContext object.
+func (prc *BaseParserRuleContext) RemoveLastChild() {
+ if prc.children != nil && len(prc.children) > 0 {
+ prc.children = prc.children[0 : len(prc.children)-1]
+ }
+}
+
+func (prc *BaseParserRuleContext) AddTokenNode(token Token) *TerminalNodeImpl {
+
+ node := NewTerminalNodeImpl(token)
+ prc.addTerminalNodeChild(node)
+ node.parentCtx = prc
+ return node
+
+}
+
+func (prc *BaseParserRuleContext) AddErrorNode(badToken Token) *ErrorNodeImpl {
+ node := NewErrorNodeImpl(badToken)
+ prc.addTerminalNodeChild(node)
+ node.parentCtx = prc
+ return node
+}
+
+func (prc *BaseParserRuleContext) GetChild(i int) Tree {
+ if prc.children != nil && len(prc.children) >= i {
+ return prc.children[i]
+ }
+
+ return nil
+}
+
+func (prc *BaseParserRuleContext) GetChildOfType(i int, childType reflect.Type) RuleContext {
+ if childType == nil {
+ return prc.GetChild(i).(RuleContext)
+ }
+
+ for j := 0; j < len(prc.children); j++ {
+ child := prc.children[j]
+ if reflect.TypeOf(child) == childType {
+ if i == 0 {
+ return child.(RuleContext)
+ }
+
+ i--
+ }
+ }
+
+ return nil
+}
+
+func (prc *BaseParserRuleContext) ToStringTree(ruleNames []string, recog Recognizer) string {
+ return TreesStringTree(prc, ruleNames, recog)
+}
+
+func (prc *BaseParserRuleContext) GetRuleContext() RuleContext {
+ return prc
+}
+
+func (prc *BaseParserRuleContext) Accept(visitor ParseTreeVisitor) interface{} {
+ return visitor.VisitChildren(prc)
+}
+
+func (prc *BaseParserRuleContext) SetStart(t Token) {
+ prc.start = t
+}
+
+func (prc *BaseParserRuleContext) GetStart() Token {
+ return prc.start
+}
+
+func (prc *BaseParserRuleContext) SetStop(t Token) {
+ prc.stop = t
+}
+
+func (prc *BaseParserRuleContext) GetStop() Token {
+ return prc.stop
+}
+
+func (prc *BaseParserRuleContext) GetToken(ttype int, i int) TerminalNode {
+
+ for j := 0; j < len(prc.children); j++ {
+ child := prc.children[j]
+ if c2, ok := child.(TerminalNode); ok {
+ if c2.GetSymbol().GetTokenType() == ttype {
+ if i == 0 {
+ return c2
+ }
+
+ i--
+ }
+ }
+ }
+ return nil
+}
+
+func (prc *BaseParserRuleContext) GetTokens(ttype int) []TerminalNode {
+ if prc.children == nil {
+ return make([]TerminalNode, 0)
+ }
+
+ tokens := make([]TerminalNode, 0)
+
+ for j := 0; j < len(prc.children); j++ {
+ child := prc.children[j]
+ if tchild, ok := child.(TerminalNode); ok {
+ if tchild.GetSymbol().GetTokenType() == ttype {
+ tokens = append(tokens, tchild)
+ }
+ }
+ }
+
+ return tokens
+}
+
+func (prc *BaseParserRuleContext) GetPayload() interface{} {
+ return prc
+}
+
+func (prc *BaseParserRuleContext) getChild(ctxType reflect.Type, i int) RuleContext {
+ if prc.children == nil || i < 0 || i >= len(prc.children) {
+ return nil
+ }
+
+ j := -1 // what element have we found with ctxType?
+ for _, o := range prc.children {
+
+ childType := reflect.TypeOf(o)
+
+ if childType.Implements(ctxType) {
+ j++
+ if j == i {
+ return o.(RuleContext)
+ }
+ }
+ }
+ return nil
+}
+
+// Go lacks generics, so it's not possible for us to return the child with the correct type, but we do
+// check for convertibility
+
+func (prc *BaseParserRuleContext) GetTypedRuleContext(ctxType reflect.Type, i int) RuleContext {
+ return prc.getChild(ctxType, i)
+}
+
+func (prc *BaseParserRuleContext) GetTypedRuleContexts(ctxType reflect.Type) []RuleContext {
+ if prc.children == nil {
+ return make([]RuleContext, 0)
+ }
+
+ contexts := make([]RuleContext, 0)
+
+ for _, child := range prc.children {
+ childType := reflect.TypeOf(child)
+
+ if childType.ConvertibleTo(ctxType) {
+ contexts = append(contexts, child.(RuleContext))
+ }
+ }
+ return contexts
+}
+
+func (prc *BaseParserRuleContext) GetChildCount() int {
+ if prc.children == nil {
+ return 0
+ }
+
+ return len(prc.children)
+}
+
+func (prc *BaseParserRuleContext) GetSourceInterval() Interval {
+ if prc.start == nil || prc.stop == nil {
+ return TreeInvalidInterval
+ }
+
+ return NewInterval(prc.start.GetTokenIndex(), prc.stop.GetTokenIndex())
+}
+
+//need to manage circular dependencies, so export now
+
+// Print out a whole tree, not just a node, in LISP format
+// (root child1 .. childN). Print just a node if b is a leaf.
+//
+
+func (prc *BaseParserRuleContext) String(ruleNames []string, stop RuleContext) string {
+
+ var p ParserRuleContext = prc
+ s := "["
+ for p != nil && p != stop {
+ if ruleNames == nil {
+ if !p.IsEmpty() {
+ s += strconv.Itoa(p.GetInvokingState())
+ }
+ } else {
+ ri := p.GetRuleIndex()
+ var ruleName string
+ if ri >= 0 && ri < len(ruleNames) {
+ ruleName = ruleNames[ri]
+ } else {
+ ruleName = strconv.Itoa(ri)
+ }
+ s += ruleName
+ }
+ if p.GetParent() != nil && (ruleNames != nil || !p.GetParent().(ParserRuleContext).IsEmpty()) {
+ s += " "
+ }
+ pi := p.GetParent()
+ if pi != nil {
+ p = pi.(ParserRuleContext)
+ } else {
+ p = nil
+ }
+ }
+ s += "]"
+ return s
+}
+
+func (prc *BaseParserRuleContext) SetParent(v Tree) {
+ if v == nil {
+ prc.parentCtx = nil
+ } else {
+ prc.parentCtx = v.(RuleContext)
+ }
+}
+
+func (prc *BaseParserRuleContext) GetInvokingState() int {
+ return prc.invokingState
+}
+
+func (prc *BaseParserRuleContext) SetInvokingState(t int) {
+ prc.invokingState = t
+}
+
+func (prc *BaseParserRuleContext) GetRuleIndex() int {
+ return prc.RuleIndex
+}
+
+func (prc *BaseParserRuleContext) GetAltNumber() int {
+ return ATNInvalidAltNumber
+}
+
+func (prc *BaseParserRuleContext) SetAltNumber(_ int) {}
+
+// IsEmpty returns true if the context of b is empty.
+//
+// A context is empty if there is no invoking state, meaning nobody calls
+// current context.
+func (prc *BaseParserRuleContext) IsEmpty() bool {
+ return prc.invokingState == -1
+}
+
+// GetParent returns the combined text of all child nodes. This method only considers
+// tokens which have been added to the parse tree.
+//
+// Since tokens on hidden channels (e.g. whitespace or comments) are not
+// added to the parse trees, they will not appear in the output of this
+// method.
+func (prc *BaseParserRuleContext) GetParent() Tree {
+ return prc.parentCtx
+}
+
+var ParserRuleContextEmpty = NewBaseParserRuleContext(nil, -1)
+
+type InterpreterRuleContext interface {
+ ParserRuleContext
+}
+
+type BaseInterpreterRuleContext struct {
+ *BaseParserRuleContext
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func NewBaseInterpreterRuleContext(parent BaseInterpreterRuleContext, invokingStateNumber, ruleIndex int) *BaseInterpreterRuleContext {
+
+ prc := new(BaseInterpreterRuleContext)
+
+ prc.BaseParserRuleContext = NewBaseParserRuleContext(parent, invokingStateNumber)
+
+ prc.RuleIndex = ruleIndex
+
+ return prc
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/prediction_context.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/prediction_context.go
new file mode 100644
index 0000000..c1b80cc
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/prediction_context.go
@@ -0,0 +1,727 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "golang.org/x/exp/slices"
+ "strconv"
+)
+
+var _emptyPredictionContextHash int
+
+func init() {
+ _emptyPredictionContextHash = murmurInit(1)
+ _emptyPredictionContextHash = murmurFinish(_emptyPredictionContextHash, 0)
+}
+
+func calculateEmptyHash() int {
+ return _emptyPredictionContextHash
+}
+
+const (
+ // BasePredictionContextEmptyReturnState represents {@code $} in an array in full context mode, $
+ // doesn't mean wildcard:
+ //
+ // $ + x = [$,x]
+ //
+ // Here,
+ //
+ // $ = EmptyReturnState
+ BasePredictionContextEmptyReturnState = 0x7FFFFFFF
+)
+
+// TODO: JI These are meant to be atomics - this does not seem to match the Java runtime here
+//
+//goland:noinspection GoUnusedGlobalVariable
+var (
+ BasePredictionContextglobalNodeCount = 1
+ BasePredictionContextid = BasePredictionContextglobalNodeCount
+)
+
+const (
+ PredictionContextEmpty = iota
+ PredictionContextSingleton
+ PredictionContextArray
+)
+
+// PredictionContext is a go idiomatic implementation of PredictionContext that does not rty to
+// emulate inheritance from Java, and can be used without an interface definition. An interface
+// is not required because no user code will ever need to implement this interface.
+type PredictionContext struct {
+ cachedHash int
+ pcType int
+ parentCtx *PredictionContext
+ returnState int
+ parents []*PredictionContext
+ returnStates []int
+}
+
+func NewEmptyPredictionContext() *PredictionContext {
+ nep := &PredictionContext{}
+ nep.cachedHash = calculateEmptyHash()
+ nep.pcType = PredictionContextEmpty
+ nep.returnState = BasePredictionContextEmptyReturnState
+ return nep
+}
+
+func NewBaseSingletonPredictionContext(parent *PredictionContext, returnState int) *PredictionContext {
+ pc := &PredictionContext{}
+ pc.pcType = PredictionContextSingleton
+ pc.returnState = returnState
+ pc.parentCtx = parent
+ if parent != nil {
+ pc.cachedHash = calculateHash(parent, returnState)
+ } else {
+ pc.cachedHash = calculateEmptyHash()
+ }
+ return pc
+}
+
+func SingletonBasePredictionContextCreate(parent *PredictionContext, returnState int) *PredictionContext {
+ if returnState == BasePredictionContextEmptyReturnState && parent == nil {
+ // someone can pass in the bits of an array ctx that mean $
+ return BasePredictionContextEMPTY
+ }
+ return NewBaseSingletonPredictionContext(parent, returnState)
+}
+
+func NewArrayPredictionContext(parents []*PredictionContext, returnStates []int) *PredictionContext {
+ // Parent can be nil only if full ctx mode and we make an array
+ // from {@link //EMPTY} and non-empty. We merge {@link //EMPTY} by using
+ // nil parent and
+ // returnState == {@link //EmptyReturnState}.
+ hash := murmurInit(1)
+ for _, parent := range parents {
+ hash = murmurUpdate(hash, parent.Hash())
+ }
+ for _, returnState := range returnStates {
+ hash = murmurUpdate(hash, returnState)
+ }
+ hash = murmurFinish(hash, len(parents)<<1)
+
+ nec := &PredictionContext{}
+ nec.cachedHash = hash
+ nec.pcType = PredictionContextArray
+ nec.parents = parents
+ nec.returnStates = returnStates
+ return nec
+}
+
+func (p *PredictionContext) Hash() int {
+ return p.cachedHash
+}
+
+func (p *PredictionContext) Equals(other Collectable[*PredictionContext]) bool {
+ switch p.pcType {
+ case PredictionContextEmpty:
+ otherP := other.(*PredictionContext)
+ return other == nil || otherP == nil || otherP.isEmpty()
+ case PredictionContextSingleton:
+ return p.SingletonEquals(other)
+ case PredictionContextArray:
+ return p.ArrayEquals(other)
+ }
+ return false
+}
+
+func (p *PredictionContext) ArrayEquals(o Collectable[*PredictionContext]) bool {
+ if o == nil {
+ return false
+ }
+ other := o.(*PredictionContext)
+ if other == nil || other.pcType != PredictionContextArray {
+ return false
+ }
+ if p.cachedHash != other.Hash() {
+ return false // can't be same if hash is different
+ }
+
+ // Must compare the actual array elements and not just the array address
+ //
+ return slices.Equal(p.returnStates, other.returnStates) &&
+ slices.EqualFunc(p.parents, other.parents, func(x, y *PredictionContext) bool {
+ return x.Equals(y)
+ })
+}
+
+func (p *PredictionContext) SingletonEquals(other Collectable[*PredictionContext]) bool {
+ if other == nil {
+ return false
+ }
+ otherP := other.(*PredictionContext)
+ if otherP == nil {
+ return false
+ }
+
+ if p.cachedHash != otherP.Hash() {
+ return false // Can't be same if hash is different
+ }
+
+ if p.returnState != otherP.getReturnState(0) {
+ return false
+ }
+
+ // Both parents must be nil if one is
+ if p.parentCtx == nil {
+ return otherP.parentCtx == nil
+ }
+
+ return p.parentCtx.Equals(otherP.parentCtx)
+}
+
+func (p *PredictionContext) GetParent(i int) *PredictionContext {
+ switch p.pcType {
+ case PredictionContextEmpty:
+ return nil
+ case PredictionContextSingleton:
+ return p.parentCtx
+ case PredictionContextArray:
+ return p.parents[i]
+ }
+ return nil
+}
+
+func (p *PredictionContext) getReturnState(i int) int {
+ switch p.pcType {
+ case PredictionContextArray:
+ return p.returnStates[i]
+ default:
+ return p.returnState
+ }
+}
+
+func (p *PredictionContext) GetReturnStates() []int {
+ switch p.pcType {
+ case PredictionContextArray:
+ return p.returnStates
+ default:
+ return []int{p.returnState}
+ }
+}
+
+func (p *PredictionContext) length() int {
+ switch p.pcType {
+ case PredictionContextArray:
+ return len(p.returnStates)
+ default:
+ return 1
+ }
+}
+
+func (p *PredictionContext) hasEmptyPath() bool {
+ switch p.pcType {
+ case PredictionContextSingleton:
+ return p.returnState == BasePredictionContextEmptyReturnState
+ }
+ return p.getReturnState(p.length()-1) == BasePredictionContextEmptyReturnState
+}
+
+func (p *PredictionContext) String() string {
+ switch p.pcType {
+ case PredictionContextEmpty:
+ return "$"
+ case PredictionContextSingleton:
+ var up string
+
+ if p.parentCtx == nil {
+ up = ""
+ } else {
+ up = p.parentCtx.String()
+ }
+
+ if len(up) == 0 {
+ if p.returnState == BasePredictionContextEmptyReturnState {
+ return "$"
+ }
+
+ return strconv.Itoa(p.returnState)
+ }
+
+ return strconv.Itoa(p.returnState) + " " + up
+ case PredictionContextArray:
+ if p.isEmpty() {
+ return "[]"
+ }
+
+ s := "["
+ for i := 0; i < len(p.returnStates); i++ {
+ if i > 0 {
+ s = s + ", "
+ }
+ if p.returnStates[i] == BasePredictionContextEmptyReturnState {
+ s = s + "$"
+ continue
+ }
+ s = s + strconv.Itoa(p.returnStates[i])
+ if !p.parents[i].isEmpty() {
+ s = s + " " + p.parents[i].String()
+ } else {
+ s = s + "nil"
+ }
+ }
+ return s + "]"
+
+ default:
+ return "unknown"
+ }
+}
+
+func (p *PredictionContext) isEmpty() bool {
+ switch p.pcType {
+ case PredictionContextEmpty:
+ return true
+ case PredictionContextArray:
+ // since EmptyReturnState can only appear in the last position, we
+ // don't need to verify that size==1
+ return p.returnStates[0] == BasePredictionContextEmptyReturnState
+ default:
+ return false
+ }
+}
+
+func (p *PredictionContext) Type() int {
+ return p.pcType
+}
+
+func calculateHash(parent *PredictionContext, returnState int) int {
+ h := murmurInit(1)
+ h = murmurUpdate(h, parent.Hash())
+ h = murmurUpdate(h, returnState)
+ return murmurFinish(h, 2)
+}
+
+// Convert a {@link RuleContext} tree to a {@link BasePredictionContext} graph.
+// Return {@link //EMPTY} if {@code outerContext} is empty or nil.
+// /
+func predictionContextFromRuleContext(a *ATN, outerContext RuleContext) *PredictionContext {
+ if outerContext == nil {
+ outerContext = ParserRuleContextEmpty
+ }
+ // if we are in RuleContext of start rule, s, then BasePredictionContext
+ // is EMPTY. Nobody called us. (if we are empty, return empty)
+ if outerContext.GetParent() == nil || outerContext == ParserRuleContextEmpty {
+ return BasePredictionContextEMPTY
+ }
+ // If we have a parent, convert it to a BasePredictionContext graph
+ parent := predictionContextFromRuleContext(a, outerContext.GetParent().(RuleContext))
+ state := a.states[outerContext.GetInvokingState()]
+ transition := state.GetTransitions()[0]
+
+ return SingletonBasePredictionContextCreate(parent, transition.(*RuleTransition).followState.GetStateNumber())
+}
+
+func merge(a, b *PredictionContext, rootIsWildcard bool, mergeCache *JPCMap) *PredictionContext {
+
+ // Share same graph if both same
+ //
+ if a == b || a.Equals(b) {
+ return a
+ }
+
+ if a.pcType == PredictionContextSingleton && b.pcType == PredictionContextSingleton {
+ return mergeSingletons(a, b, rootIsWildcard, mergeCache)
+ }
+ // At least one of a or b is array
+ // If one is $ and rootIsWildcard, return $ as wildcard
+ if rootIsWildcard {
+ if a.isEmpty() {
+ return a
+ }
+ if b.isEmpty() {
+ return b
+ }
+ }
+
+ // Convert either Singleton or Empty to arrays, so that we can merge them
+ //
+ ara := convertToArray(a)
+ arb := convertToArray(b)
+ return mergeArrays(ara, arb, rootIsWildcard, mergeCache)
+}
+
+func convertToArray(pc *PredictionContext) *PredictionContext {
+ switch pc.Type() {
+ case PredictionContextEmpty:
+ return NewArrayPredictionContext([]*PredictionContext{}, []int{})
+ case PredictionContextSingleton:
+ return NewArrayPredictionContext([]*PredictionContext{pc.GetParent(0)}, []int{pc.getReturnState(0)})
+ default:
+ // Already an array
+ }
+ return pc
+}
+
+// mergeSingletons merges two Singleton [PredictionContext] instances.
+//
+// Stack tops equal, parents merge is same return left graph.
+//
+//
+// Same stack top, parents differ merge parents giving array node, then
+// remainders of those graphs. A new root node is created to point to the
+// merged parents.
+//
+//
+// Different stack tops pointing to same parent. Make array node for the
+// root where both element in the root point to the same (original)
+// parent.
+//
+//
+// Different stack tops pointing to different parents. Make array node for
+// the root where each element points to the corresponding original
+// parent.
+//
+//
+// @param a the first {@link SingletonBasePredictionContext}
+// @param b the second {@link SingletonBasePredictionContext}
+// @param rootIsWildcard {@code true} if this is a local-context merge,
+// otherwise false to indicate a full-context merge
+// @param mergeCache
+// /
+func mergeSingletons(a, b *PredictionContext, rootIsWildcard bool, mergeCache *JPCMap) *PredictionContext {
+ if mergeCache != nil {
+ previous, present := mergeCache.Get(a, b)
+ if present {
+ return previous
+ }
+ previous, present = mergeCache.Get(b, a)
+ if present {
+ return previous
+ }
+ }
+
+ rootMerge := mergeRoot(a, b, rootIsWildcard)
+ if rootMerge != nil {
+ if mergeCache != nil {
+ mergeCache.Put(a, b, rootMerge)
+ }
+ return rootMerge
+ }
+ if a.returnState == b.returnState {
+ parent := merge(a.parentCtx, b.parentCtx, rootIsWildcard, mergeCache)
+ // if parent is same as existing a or b parent or reduced to a parent,
+ // return it
+ if parent.Equals(a.parentCtx) {
+ return a // ax + bx = ax, if a=b
+ }
+ if parent.Equals(b.parentCtx) {
+ return b // ax + bx = bx, if a=b
+ }
+ // else: ax + ay = a'[x,y]
+ // merge parents x and y, giving array node with x,y then remainders
+ // of those graphs. dup a, a' points at merged array.
+ // New joined parent so create a new singleton pointing to it, a'
+ spc := SingletonBasePredictionContextCreate(parent, a.returnState)
+ if mergeCache != nil {
+ mergeCache.Put(a, b, spc)
+ }
+ return spc
+ }
+ // a != b payloads differ
+ // see if we can collapse parents due to $+x parents if local ctx
+ var singleParent *PredictionContext
+ if a.Equals(b) || (a.parentCtx != nil && a.parentCtx.Equals(b.parentCtx)) { // ax +
+ // bx =
+ // [a,b]x
+ singleParent = a.parentCtx
+ }
+ if singleParent != nil { // parents are same
+ // sort payloads and use same parent
+ payloads := []int{a.returnState, b.returnState}
+ if a.returnState > b.returnState {
+ payloads[0] = b.returnState
+ payloads[1] = a.returnState
+ }
+ parents := []*PredictionContext{singleParent, singleParent}
+ apc := NewArrayPredictionContext(parents, payloads)
+ if mergeCache != nil {
+ mergeCache.Put(a, b, apc)
+ }
+ return apc
+ }
+ // parents differ and can't merge them. Just pack together
+ // into array can't merge.
+ // ax + by = [ax,by]
+ payloads := []int{a.returnState, b.returnState}
+ parents := []*PredictionContext{a.parentCtx, b.parentCtx}
+ if a.returnState > b.returnState { // sort by payload
+ payloads[0] = b.returnState
+ payloads[1] = a.returnState
+ parents = []*PredictionContext{b.parentCtx, a.parentCtx}
+ }
+ apc := NewArrayPredictionContext(parents, payloads)
+ if mergeCache != nil {
+ mergeCache.Put(a, b, apc)
+ }
+ return apc
+}
+
+// Handle case where at least one of {@code a} or {@code b} is
+// {@link //EMPTY}. In the following diagrams, the symbol {@code $} is used
+// to represent {@link //EMPTY}.
+//
+// Local-Context Merges
+//
+// These local-context merge operations are used when {@code rootIsWildcard}
+// is true.
+//
+// {@link //EMPTY} is superset of any graph return {@link //EMPTY}.
+//
+//
+// {@link //EMPTY} and anything is {@code //EMPTY}, so merged parent is
+// {@code //EMPTY} return left graph.
+//
+//
+// Special case of last merge if local context.
+//
+//
+// Full-Context Merges
+//
+// These full-context merge operations are used when {@code rootIsWildcard}
+// is false.
+//
+//
+//
+// Must keep all contexts {@link //EMPTY} in array is a special value (and
+// nil parent).
+//
+//
+//
+//
+// @param a the first {@link SingletonBasePredictionContext}
+// @param b the second {@link SingletonBasePredictionContext}
+// @param rootIsWildcard {@code true} if this is a local-context merge,
+// otherwise false to indicate a full-context merge
+// /
+func mergeRoot(a, b *PredictionContext, rootIsWildcard bool) *PredictionContext {
+ if rootIsWildcard {
+ if a.pcType == PredictionContextEmpty {
+ return BasePredictionContextEMPTY // // + b =//
+ }
+ if b.pcType == PredictionContextEmpty {
+ return BasePredictionContextEMPTY // a +// =//
+ }
+ } else {
+ if a.isEmpty() && b.isEmpty() {
+ return BasePredictionContextEMPTY // $ + $ = $
+ } else if a.isEmpty() { // $ + x = [$,x]
+ payloads := []int{b.getReturnState(-1), BasePredictionContextEmptyReturnState}
+ parents := []*PredictionContext{b.GetParent(-1), nil}
+ return NewArrayPredictionContext(parents, payloads)
+ } else if b.isEmpty() { // x + $ = [$,x] ($ is always first if present)
+ payloads := []int{a.getReturnState(-1), BasePredictionContextEmptyReturnState}
+ parents := []*PredictionContext{a.GetParent(-1), nil}
+ return NewArrayPredictionContext(parents, payloads)
+ }
+ }
+ return nil
+}
+
+// Merge two {@link ArrayBasePredictionContext} instances.
+//
+// Different tops, different parents.
+//
+//
+// Shared top, same parents.
+//
+//
+// Shared top, different parents.
+//
+//
+// Shared top, all shared parents.
+//
+//
+// Equal tops, merge parents and reduce top to
+// {@link SingletonBasePredictionContext}.
+//
+//
+//goland:noinspection GoBoolExpressions
+func mergeArrays(a, b *PredictionContext, rootIsWildcard bool, mergeCache *JPCMap) *PredictionContext {
+ if mergeCache != nil {
+ previous, present := mergeCache.Get(a, b)
+ if present {
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> previous")
+ }
+ return previous
+ }
+ previous, present = mergeCache.Get(b, a)
+ if present {
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> previous")
+ }
+ return previous
+ }
+ }
+ // merge sorted payloads a + b => M
+ i := 0 // walks a
+ j := 0 // walks b
+ k := 0 // walks target M array
+
+ mergedReturnStates := make([]int, len(a.returnStates)+len(b.returnStates))
+ mergedParents := make([]*PredictionContext, len(a.returnStates)+len(b.returnStates))
+ // walk and merge to yield mergedParents, mergedReturnStates
+ for i < len(a.returnStates) && j < len(b.returnStates) {
+ aParent := a.parents[i]
+ bParent := b.parents[j]
+ if a.returnStates[i] == b.returnStates[j] {
+ // same payload (stack tops are equal), must yield merged singleton
+ payload := a.returnStates[i]
+ // $+$ = $
+ bothDollars := payload == BasePredictionContextEmptyReturnState && aParent == nil && bParent == nil
+ axAX := aParent != nil && bParent != nil && aParent.Equals(bParent) // ax+ax
+ // ->
+ // ax
+ if bothDollars || axAX {
+ mergedParents[k] = aParent // choose left
+ mergedReturnStates[k] = payload
+ } else { // ax+ay -> a'[x,y]
+ mergedParent := merge(aParent, bParent, rootIsWildcard, mergeCache)
+ mergedParents[k] = mergedParent
+ mergedReturnStates[k] = payload
+ }
+ i++ // hop over left one as usual
+ j++ // but also Skip one in right side since we merge
+ } else if a.returnStates[i] < b.returnStates[j] { // copy a[i] to M
+ mergedParents[k] = aParent
+ mergedReturnStates[k] = a.returnStates[i]
+ i++
+ } else { // b > a, copy b[j] to M
+ mergedParents[k] = bParent
+ mergedReturnStates[k] = b.returnStates[j]
+ j++
+ }
+ k++
+ }
+ // copy over any payloads remaining in either array
+ if i < len(a.returnStates) {
+ for p := i; p < len(a.returnStates); p++ {
+ mergedParents[k] = a.parents[p]
+ mergedReturnStates[k] = a.returnStates[p]
+ k++
+ }
+ } else {
+ for p := j; p < len(b.returnStates); p++ {
+ mergedParents[k] = b.parents[p]
+ mergedReturnStates[k] = b.returnStates[p]
+ k++
+ }
+ }
+ // trim merged if we combined a few that had same stack tops
+ if k < len(mergedParents) { // write index < last position trim
+ if k == 1 { // for just one merged element, return singleton top
+ pc := SingletonBasePredictionContextCreate(mergedParents[0], mergedReturnStates[0])
+ if mergeCache != nil {
+ mergeCache.Put(a, b, pc)
+ }
+ return pc
+ }
+ mergedParents = mergedParents[0:k]
+ mergedReturnStates = mergedReturnStates[0:k]
+ }
+
+ M := NewArrayPredictionContext(mergedParents, mergedReturnStates)
+
+ // if we created same array as a or b, return that instead
+ // TODO: JI track whether this is possible above during merge sort for speed and possibly avoid an allocation
+ if M.Equals(a) {
+ if mergeCache != nil {
+ mergeCache.Put(a, b, a)
+ }
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> a")
+ }
+ return a
+ }
+ if M.Equals(b) {
+ if mergeCache != nil {
+ mergeCache.Put(a, b, b)
+ }
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> b")
+ }
+ return b
+ }
+ combineCommonParents(&mergedParents)
+
+ if mergeCache != nil {
+ mergeCache.Put(a, b, M)
+ }
+ if runtimeConfig.parserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> " + M.String())
+ }
+ return M
+}
+
+// Make pass over all M parents and merge any Equals() ones.
+// Note that we pass a pointer to the slice as we want to modify it in place.
+//
+//goland:noinspection GoUnusedFunction
+func combineCommonParents(parents *[]*PredictionContext) {
+ uniqueParents := NewJStore[*PredictionContext, Comparator[*PredictionContext]](pContextEqInst, PredictionContextCollection, "combineCommonParents for PredictionContext")
+
+ for p := 0; p < len(*parents); p++ {
+ parent := (*parents)[p]
+ _, _ = uniqueParents.Put(parent)
+ }
+ for q := 0; q < len(*parents); q++ {
+ pc, _ := uniqueParents.Get((*parents)[q])
+ (*parents)[q] = pc
+ }
+}
+
+func getCachedBasePredictionContext(context *PredictionContext, contextCache *PredictionContextCache, visited *VisitRecord) *PredictionContext {
+ if context.isEmpty() {
+ return context
+ }
+ existing, present := visited.Get(context)
+ if present {
+ return existing
+ }
+
+ existing, present = contextCache.Get(context)
+ if present {
+ visited.Put(context, existing)
+ return existing
+ }
+ changed := false
+ parents := make([]*PredictionContext, context.length())
+ for i := 0; i < len(parents); i++ {
+ parent := getCachedBasePredictionContext(context.GetParent(i), contextCache, visited)
+ if changed || !parent.Equals(context.GetParent(i)) {
+ if !changed {
+ parents = make([]*PredictionContext, context.length())
+ for j := 0; j < context.length(); j++ {
+ parents[j] = context.GetParent(j)
+ }
+ changed = true
+ }
+ parents[i] = parent
+ }
+ }
+ if !changed {
+ contextCache.add(context)
+ visited.Put(context, context)
+ return context
+ }
+ var updated *PredictionContext
+ if len(parents) == 0 {
+ updated = BasePredictionContextEMPTY
+ } else if len(parents) == 1 {
+ updated = SingletonBasePredictionContextCreate(parents[0], context.getReturnState(0))
+ } else {
+ updated = NewArrayPredictionContext(parents, context.GetReturnStates())
+ }
+ contextCache.add(updated)
+ visited.Put(updated, updated)
+ visited.Put(context, updated)
+
+ return updated
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/prediction_context_cache.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/prediction_context_cache.go
new file mode 100644
index 0000000..25dfb11
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/prediction_context_cache.go
@@ -0,0 +1,48 @@
+package antlr
+
+var BasePredictionContextEMPTY = &PredictionContext{
+ cachedHash: calculateEmptyHash(),
+ pcType: PredictionContextEmpty,
+ returnState: BasePredictionContextEmptyReturnState,
+}
+
+// PredictionContextCache is Used to cache [PredictionContext] objects. It is used for the shared
+// context cash associated with contexts in DFA states. This cache
+// can be used for both lexers and parsers.
+type PredictionContextCache struct {
+ cache *JMap[*PredictionContext, *PredictionContext, Comparator[*PredictionContext]]
+}
+
+func NewPredictionContextCache() *PredictionContextCache {
+ return &PredictionContextCache{
+ cache: NewJMap[*PredictionContext, *PredictionContext, Comparator[*PredictionContext]](pContextEqInst, PredictionContextCacheCollection, "NewPredictionContextCache()"),
+ }
+}
+
+// Add a context to the cache and return it. If the context already exists,
+// return that one instead and do not add a new context to the cache.
+// Protect shared cache from unsafe thread access.
+func (p *PredictionContextCache) add(ctx *PredictionContext) *PredictionContext {
+ if ctx.isEmpty() {
+ return BasePredictionContextEMPTY
+ }
+
+ // Put will return the existing entry if it is present (note this is done via Equals, not whether it is
+ // the same pointer), otherwise it will add the new entry and return that.
+ //
+ existing, present := p.cache.Get(ctx)
+ if present {
+ return existing
+ }
+ p.cache.Put(ctx, ctx)
+ return ctx
+}
+
+func (p *PredictionContextCache) Get(ctx *PredictionContext) (*PredictionContext, bool) {
+ pc, exists := p.cache.Get(ctx)
+ return pc, exists
+}
+
+func (p *PredictionContextCache) length() int {
+ return p.cache.Len()
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/prediction_mode.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/prediction_mode.go
new file mode 100644
index 0000000..3f85a6a
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/prediction_mode.go
@@ -0,0 +1,536 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+// This enumeration defines the prediction modes available in ANTLR 4 along with
+// utility methods for analyzing configuration sets for conflicts and/or
+// ambiguities.
+
+const (
+ // PredictionModeSLL represents the SLL(*) prediction mode.
+ // This prediction mode ignores the current
+ // parser context when making predictions. This is the fastest prediction
+ // mode, and provides correct results for many grammars. This prediction
+ // mode is more powerful than the prediction mode provided by ANTLR 3, but
+ // may result in syntax errors for grammar and input combinations which are
+ // not SLL.
+ //
+ // When using this prediction mode, the parser will either return a correct
+ // parse tree (i.e. the same parse tree that would be returned with the
+ // [PredictionModeLL] prediction mode), or it will Report a syntax error. If a
+ // syntax error is encountered when using the SLL prediction mode,
+ // it may be due to either an actual syntax error in the input or indicate
+ // that the particular combination of grammar and input requires the more
+ // powerful LL prediction abilities to complete successfully.
+ //
+ // This prediction mode does not provide any guarantees for prediction
+ // behavior for syntactically-incorrect inputs.
+ //
+ PredictionModeSLL = 0
+
+ // PredictionModeLL represents the LL(*) prediction mode.
+ // This prediction mode allows the current parser
+ // context to be used for resolving SLL conflicts that occur during
+ // prediction. This is the fastest prediction mode that guarantees correct
+ // parse results for all combinations of grammars with syntactically correct
+ // inputs.
+ //
+ // When using this prediction mode, the parser will make correct decisions
+ // for all syntactically-correct grammar and input combinations. However, in
+ // cases where the grammar is truly ambiguous this prediction mode might not
+ // report a precise answer for exactly which alternatives are
+ // ambiguous.
+ //
+ // This prediction mode does not provide any guarantees for prediction
+ // behavior for syntactically-incorrect inputs.
+ //
+ PredictionModeLL = 1
+
+ // PredictionModeLLExactAmbigDetection represents the LL(*) prediction mode
+ // with exact ambiguity detection.
+ //
+ // In addition to the correctness guarantees provided by the [PredictionModeLL] prediction mode,
+ // this prediction mode instructs the prediction algorithm to determine the
+ // complete and exact set of ambiguous alternatives for every ambiguous
+ // decision encountered while parsing.
+ //
+ // This prediction mode may be used for diagnosing ambiguities during
+ // grammar development. Due to the performance overhead of calculating sets
+ // of ambiguous alternatives, this prediction mode should be avoided when
+ // the exact results are not necessary.
+ //
+ // This prediction mode does not provide any guarantees for prediction
+ // behavior for syntactically-incorrect inputs.
+ //
+ PredictionModeLLExactAmbigDetection = 2
+)
+
+// PredictionModehasSLLConflictTerminatingPrediction computes the SLL prediction termination condition.
+//
+// This method computes the SLL prediction termination condition for both of
+// the following cases:
+//
+// - The usual SLL+LL fallback upon SLL conflict
+// - Pure SLL without LL fallback
+//
+// # Combined SLL+LL Parsing
+//
+// When LL-fallback is enabled upon SLL conflict, correct predictions are
+// ensured regardless of how the termination condition is computed by this
+// method. Due to the substantially higher cost of LL prediction, the
+// prediction should only fall back to LL when the additional lookahead
+// cannot lead to a unique SLL prediction.
+//
+// Assuming combined SLL+LL parsing, an SLL configuration set with only
+// conflicting subsets should fall back to full LL, even if the
+// configuration sets don't resolve to the same alternative, e.g.
+//
+// {1,2} and {3,4}
+//
+// If there is at least one non-conflicting
+// configuration, SLL could continue with the hopes that more lookahead will
+// resolve via one of those non-conflicting configurations.
+//
+// Here's the prediction termination rule them: SLL (for SLL+LL parsing)
+// stops when it sees only conflicting configuration subsets. In contrast,
+// full LL keeps going when there is uncertainty.
+//
+// # Heuristic
+//
+// As a heuristic, we stop prediction when we see any conflicting subset
+// unless we see a state that only has one alternative associated with it.
+// The single-alt-state thing lets prediction continue upon rules like
+// (otherwise, it would admit defeat too soon):
+//
+// [12|1|[], 6|2|[], 12|2|[]]. s : (ID | ID ID?) ;
+//
+// When the [ATN] simulation reaches the state before ';', it has a
+// [DFA] state that looks like:
+//
+// [12|1|[], 6|2|[], 12|2|[]]
+//
+// Naturally
+//
+// 12|1|[] and 12|2|[]
+//
+// conflict, but we cannot stop processing this node because alternative to has another way to continue,
+// via
+//
+// [6|2|[]]
+//
+// It also let's us continue for this rule:
+//
+// [1|1|[], 1|2|[], 8|3|[]] a : A | A | A B ;
+//
+// After Matching input A, we reach the stop state for rule A, state 1.
+// State 8 is the state immediately before B. Clearly alternatives 1 and 2
+// conflict and no amount of further lookahead will separate the two.
+// However, alternative 3 will be able to continue, and so we do not stop
+// working on this state. In the previous example, we're concerned with
+// states associated with the conflicting alternatives. Here alt 3 is not
+// associated with the conflicting configs, but since we can continue
+// looking for input reasonably, don't declare the state done.
+//
+// # Pure SLL Parsing
+//
+// To handle pure SLL parsing, all we have to do is make sure that we
+// combine stack contexts for configurations that differ only by semantic
+// predicate. From there, we can do the usual SLL termination heuristic.
+//
+// # Predicates in SLL+LL Parsing
+//
+// SLL decisions don't evaluate predicates until after they reach [DFA] stop
+// states because they need to create the [DFA] cache that works in all
+// semantic situations. In contrast, full LL evaluates predicates collected
+// during start state computation, so it can ignore predicates thereafter.
+// This means that SLL termination detection can totally ignore semantic
+// predicates.
+//
+// Implementation-wise, [ATNConfigSet] combines stack contexts but not
+// semantic predicate contexts, so we might see two configurations like the
+// following:
+//
+// (s, 1, x, {}), (s, 1, x', {p})
+//
+// Before testing these configurations against others, we have to merge
+// x and x' (without modifying the existing configurations).
+// For example, we test (x+x')==x” when looking for conflicts in
+// the following configurations:
+//
+// (s, 1, x, {}), (s, 1, x', {p}), (s, 2, x”, {})
+//
+// If the configuration set has predicates (as indicated by
+// [ATNConfigSet.hasSemanticContext]), this algorithm makes a copy of
+// the configurations to strip out all the predicates so that a standard
+// [ATNConfigSet] will merge everything ignoring predicates.
+func PredictionModehasSLLConflictTerminatingPrediction(mode int, configs *ATNConfigSet) bool {
+
+ // Configs in rule stop states indicate reaching the end of the decision
+ // rule (local context) or end of start rule (full context). If all
+ // configs meet this condition, then none of the configurations is able
+ // to Match additional input, so we terminate prediction.
+ //
+ if PredictionModeallConfigsInRuleStopStates(configs) {
+ return true
+ }
+
+ // pure SLL mode parsing
+ if mode == PredictionModeSLL {
+ // Don't bother with combining configs from different semantic
+ // contexts if we can fail over to full LL costs more time
+ // since we'll often fail over anyway.
+ if configs.hasSemanticContext {
+ // dup configs, tossing out semantic predicates
+ dup := NewATNConfigSet(false)
+ for _, c := range configs.configs {
+
+ // NewATNConfig({semanticContext:}, c)
+ c = NewATNConfig2(c, SemanticContextNone)
+ dup.Add(c, nil)
+ }
+ configs = dup
+ }
+ // now we have combined contexts for configs with dissimilar predicates
+ }
+ // pure SLL or combined SLL+LL mode parsing
+ altsets := PredictionModegetConflictingAltSubsets(configs)
+ return PredictionModehasConflictingAltSet(altsets) && !PredictionModehasStateAssociatedWithOneAlt(configs)
+}
+
+// PredictionModehasConfigInRuleStopState checks if any configuration in the given configs is in a
+// [RuleStopState]. Configurations meeting this condition have reached
+// the end of the decision rule (local context) or end of start rule (full
+// context).
+//
+// The func returns true if any configuration in the supplied configs is in a [RuleStopState]
+func PredictionModehasConfigInRuleStopState(configs *ATNConfigSet) bool {
+ for _, c := range configs.configs {
+ if _, ok := c.GetState().(*RuleStopState); ok {
+ return true
+ }
+ }
+ return false
+}
+
+// PredictionModeallConfigsInRuleStopStates checks if all configurations in configs are in a
+// [RuleStopState]. Configurations meeting this condition have reached
+// the end of the decision rule (local context) or end of start rule (full
+// context).
+//
+// the func returns true if all configurations in configs are in a
+// [RuleStopState]
+func PredictionModeallConfigsInRuleStopStates(configs *ATNConfigSet) bool {
+
+ for _, c := range configs.configs {
+ if _, ok := c.GetState().(*RuleStopState); !ok {
+ return false
+ }
+ }
+ return true
+}
+
+// PredictionModeresolvesToJustOneViableAlt checks full LL prediction termination.
+//
+// Can we stop looking ahead during [ATN] simulation or is there some
+// uncertainty as to which alternative we will ultimately pick, after
+// consuming more input? Even if there are partial conflicts, we might know
+// that everything is going to resolve to the same minimum alternative. That
+// means we can stop since no more lookahead will change that fact. On the
+// other hand, there might be multiple conflicts that resolve to different
+// minimums. That means we need more look ahead to decide which of those
+// alternatives we should predict.
+//
+// The basic idea is to split the set of configurations 'C', into
+// conflicting subsets (s, _, ctx, _) and singleton subsets with
+// non-conflicting configurations. Two configurations conflict if they have
+// identical [ATNConfig].state and [ATNConfig].context values
+// but a different [ATNConfig].alt value, e.g.
+//
+// (s, i, ctx, _)
+//
+// and
+//
+// (s, j, ctx, _) ; for i != j
+//
+// Reduce these configuration subsets to the set of possible alternatives.
+// You can compute the alternative subsets in one pass as follows:
+//
+// A_s,ctx = {i | (s, i, ctx, _)}
+//
+// for each configuration in C holding s and ctx fixed.
+//
+// Or in pseudo-code:
+//
+// for each configuration c in C:
+// map[c] U = c.ATNConfig.alt alt // map hash/equals uses s and x, not alt and not pred
+//
+// The values in map are the set of
+//
+// A_s,ctx
+//
+// sets.
+//
+// If
+//
+// |A_s,ctx| = 1
+//
+// then there is no conflict associated with s and ctx.
+//
+// Reduce the subsets to singletons by choosing a minimum of each subset. If
+// the union of these alternative subsets is a singleton, then no amount of
+// further lookahead will help us. We will always pick that alternative. If,
+// however, there is more than one alternative, then we are uncertain which
+// alternative to predict and must continue looking for resolution. We may
+// or may not discover an ambiguity in the future, even if there are no
+// conflicting subsets this round.
+//
+// The biggest sin is to terminate early because it means we've made a
+// decision but were uncertain as to the eventual outcome. We haven't used
+// enough lookahead. On the other hand, announcing a conflict too late is no
+// big deal; you will still have the conflict. It's just inefficient. It
+// might even look until the end of file.
+//
+// No special consideration for semantic predicates is required because
+// predicates are evaluated on-the-fly for full LL prediction, ensuring that
+// no configuration contains a semantic context during the termination
+// check.
+//
+// # Conflicting Configs
+//
+// Two configurations:
+//
+// (s, i, x) and (s, j, x')
+//
+// conflict when i != j but x = x'. Because we merge all
+// (s, i, _) configurations together, that means that there are at
+// most n configurations associated with state s for
+// n possible alternatives in the decision. The merged stacks
+// complicate the comparison of configuration contexts x and x'.
+//
+// Sam checks to see if one is a subset of the other by calling
+// merge and checking to see if the merged result is either x or x'.
+// If the x associated with lowest alternative i
+// is the superset, then i is the only possible prediction since the
+// others resolve to min(i) as well. However, if x is
+// associated with j > i then at least one stack configuration for
+// j is not in conflict with alternative i. The algorithm
+// should keep going, looking for more lookahead due to the uncertainty.
+//
+// For simplicity, I'm doing an equality check between x and
+// x', which lets the algorithm continue to consume lookahead longer
+// than necessary. The reason I like the equality is of course the
+// simplicity but also because that is the test you need to detect the
+// alternatives that are actually in conflict.
+//
+// # Continue/Stop Rule
+//
+// Continue if the union of resolved alternative sets from non-conflicting and
+// conflicting alternative subsets has more than one alternative. We are
+// uncertain about which alternative to predict.
+//
+// The complete set of alternatives,
+//
+// [i for (_, i, _)]
+//
+// tells us which alternatives are still in the running for the amount of input we've
+// consumed at this point. The conflicting sets let us to strip away
+// configurations that won't lead to more states because we resolve
+// conflicts to the configuration with a minimum alternate for the
+// conflicting set.
+//
+// Cases
+//
+// - no conflicts and more than 1 alternative in set => continue
+// - (s, 1, x), (s, 2, x), (s, 3, z), (s', 1, y), (s', 2, y) yields non-conflicting set
+// {3} ∪ conflicting sets min({1,2}) ∪ min({1,2}) = {1,3} => continue
+// - (s, 1, x), (s, 2, x), (s', 1, y), (s', 2, y), (s”, 1, z) yields non-conflicting set
+// {1} ∪ conflicting sets min({1,2}) ∪ min({1,2}) = {1} => stop and predict 1
+// - (s, 1, x), (s, 2, x), (s', 1, y), (s', 2, y) yields conflicting, reduced sets
+// {1} ∪ {1} = {1} => stop and predict 1, can announce ambiguity {1,2}
+// - (s, 1, x), (s, 2, x), (s', 2, y), (s', 3, y) yields conflicting, reduced sets
+// {1} ∪ {2} = {1,2} => continue
+// - (s, 1, x), (s, 2, x), (s', 2, y), (s', 3, y) yields conflicting, reduced sets
+// {1} ∪ {2} = {1,2} => continue
+// - (s, 1, x), (s, 2, x), (s', 3, y), (s', 4, y) yields conflicting, reduced sets
+// {1} ∪ {3} = {1,3} => continue
+//
+// # Exact Ambiguity Detection
+//
+// If all states report the same conflicting set of alternatives, then we
+// know we have the exact ambiguity set:
+//
+// |A_i| > 1
+//
+// and
+//
+// A_i = A_j ; for all i, j
+//
+// In other words, we continue examining lookahead until all A_i
+// have more than one alternative and all A_i are the same. If
+//
+// A={{1,2}, {1,3}}
+//
+// then regular LL prediction would terminate because the resolved set is {1}.
+// To determine what the real ambiguity is, we have to know whether the ambiguity is between one and
+// two or one and three so we keep going. We can only stop prediction when
+// we need exact ambiguity detection when the sets look like:
+//
+// A={{1,2}}
+//
+// or
+//
+// {{1,2},{1,2}}, etc...
+func PredictionModeresolvesToJustOneViableAlt(altsets []*BitSet) int {
+ return PredictionModegetSingleViableAlt(altsets)
+}
+
+// PredictionModeallSubsetsConflict determines if every alternative subset in altsets contains more
+// than one alternative.
+//
+// The func returns true if every [BitSet] in altsets has
+// [BitSet].cardinality cardinality > 1
+func PredictionModeallSubsetsConflict(altsets []*BitSet) bool {
+ return !PredictionModehasNonConflictingAltSet(altsets)
+}
+
+// PredictionModehasNonConflictingAltSet determines if any single alternative subset in altsets contains
+// exactly one alternative.
+//
+// The func returns true if altsets contains at least one [BitSet] with
+// [BitSet].cardinality cardinality 1
+func PredictionModehasNonConflictingAltSet(altsets []*BitSet) bool {
+ for i := 0; i < len(altsets); i++ {
+ alts := altsets[i]
+ if alts.length() == 1 {
+ return true
+ }
+ }
+ return false
+}
+
+// PredictionModehasConflictingAltSet determines if any single alternative subset in altsets contains
+// more than one alternative.
+//
+// The func returns true if altsets contains a [BitSet] with
+// [BitSet].cardinality cardinality > 1, otherwise false
+func PredictionModehasConflictingAltSet(altsets []*BitSet) bool {
+ for i := 0; i < len(altsets); i++ {
+ alts := altsets[i]
+ if alts.length() > 1 {
+ return true
+ }
+ }
+ return false
+}
+
+// PredictionModeallSubsetsEqual determines if every alternative subset in altsets is equivalent.
+//
+// The func returns true if every member of altsets is equal to the others.
+func PredictionModeallSubsetsEqual(altsets []*BitSet) bool {
+ var first *BitSet
+
+ for i := 0; i < len(altsets); i++ {
+ alts := altsets[i]
+ if first == nil {
+ first = alts
+ } else if alts != first {
+ return false
+ }
+ }
+
+ return true
+}
+
+// PredictionModegetUniqueAlt returns the unique alternative predicted by all alternative subsets in
+// altsets. If no such alternative exists, this method returns
+// [ATNInvalidAltNumber].
+//
+// @param altsets a collection of alternative subsets
+func PredictionModegetUniqueAlt(altsets []*BitSet) int {
+ all := PredictionModeGetAlts(altsets)
+ if all.length() == 1 {
+ return all.minValue()
+ }
+
+ return ATNInvalidAltNumber
+}
+
+// PredictionModeGetAlts returns the complete set of represented alternatives for a collection of
+// alternative subsets. This method returns the union of each [BitSet]
+// in altsets, being the set of represented alternatives in altsets.
+func PredictionModeGetAlts(altsets []*BitSet) *BitSet {
+ all := NewBitSet()
+ for _, alts := range altsets {
+ all.or(alts)
+ }
+ return all
+}
+
+// PredictionModegetConflictingAltSubsets gets the conflicting alt subsets from a configuration set.
+//
+// for each configuration c in configs:
+// map[c] U= c.ATNConfig.alt // map hash/equals uses s and x, not alt and not pred
+func PredictionModegetConflictingAltSubsets(configs *ATNConfigSet) []*BitSet {
+ configToAlts := NewJMap[*ATNConfig, *BitSet, *ATNAltConfigComparator[*ATNConfig]](atnAltCfgEqInst, AltSetCollection, "PredictionModegetConflictingAltSubsets()")
+
+ for _, c := range configs.configs {
+
+ alts, ok := configToAlts.Get(c)
+ if !ok {
+ alts = NewBitSet()
+ configToAlts.Put(c, alts)
+ }
+ alts.add(c.GetAlt())
+ }
+
+ return configToAlts.Values()
+}
+
+// PredictionModeGetStateToAltMap gets a map from state to alt subset from a configuration set.
+//
+// for each configuration c in configs:
+// map[c.ATNConfig.state] U= c.ATNConfig.alt}
+func PredictionModeGetStateToAltMap(configs *ATNConfigSet) *AltDict {
+ m := NewAltDict()
+
+ for _, c := range configs.configs {
+ alts := m.Get(c.GetState().String())
+ if alts == nil {
+ alts = NewBitSet()
+ m.put(c.GetState().String(), alts)
+ }
+ alts.(*BitSet).add(c.GetAlt())
+ }
+ return m
+}
+
+func PredictionModehasStateAssociatedWithOneAlt(configs *ATNConfigSet) bool {
+ values := PredictionModeGetStateToAltMap(configs).values()
+ for i := 0; i < len(values); i++ {
+ if values[i].(*BitSet).length() == 1 {
+ return true
+ }
+ }
+ return false
+}
+
+// PredictionModegetSingleViableAlt gets the single alternative predicted by all alternative subsets in altsets
+// if there is one.
+//
+// TODO: JI - Review this code - it does not seem to do the same thing as the Java code - maybe because [BitSet] is not like the Java utils BitSet
+func PredictionModegetSingleViableAlt(altsets []*BitSet) int {
+ result := ATNInvalidAltNumber
+
+ for i := 0; i < len(altsets); i++ {
+ alts := altsets[i]
+ minAlt := alts.minValue()
+ if result == ATNInvalidAltNumber {
+ result = minAlt
+ } else if result != minAlt { // more than 1 viable alt
+ return ATNInvalidAltNumber
+ }
+ }
+ return result
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/recognizer.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/recognizer.go
new file mode 100644
index 0000000..2e0b504
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/recognizer.go
@@ -0,0 +1,241 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strings"
+
+ "strconv"
+)
+
+type Recognizer interface {
+ GetLiteralNames() []string
+ GetSymbolicNames() []string
+ GetRuleNames() []string
+
+ Sempred(RuleContext, int, int) bool
+ Precpred(RuleContext, int) bool
+
+ GetState() int
+ SetState(int)
+ Action(RuleContext, int, int)
+ AddErrorListener(ErrorListener)
+ RemoveErrorListeners()
+ GetATN() *ATN
+ GetErrorListenerDispatch() ErrorListener
+ HasError() bool
+ GetError() RecognitionException
+ SetError(RecognitionException)
+}
+
+type BaseRecognizer struct {
+ listeners []ErrorListener
+ state int
+
+ RuleNames []string
+ LiteralNames []string
+ SymbolicNames []string
+ GrammarFileName string
+ SynErr RecognitionException
+}
+
+func NewBaseRecognizer() *BaseRecognizer {
+ rec := new(BaseRecognizer)
+ rec.listeners = []ErrorListener{ConsoleErrorListenerINSTANCE}
+ rec.state = -1
+ return rec
+}
+
+//goland:noinspection GoUnusedGlobalVariable
+var tokenTypeMapCache = make(map[string]int)
+
+//goland:noinspection GoUnusedGlobalVariable
+var ruleIndexMapCache = make(map[string]int)
+
+func (b *BaseRecognizer) checkVersion(toolVersion string) {
+ runtimeVersion := "4.12.0"
+ if runtimeVersion != toolVersion {
+ fmt.Println("ANTLR runtime and generated code versions disagree: " + runtimeVersion + "!=" + toolVersion)
+ }
+}
+
+func (b *BaseRecognizer) SetError(err RecognitionException) {
+ b.SynErr = err
+}
+
+func (b *BaseRecognizer) HasError() bool {
+ return b.SynErr != nil
+}
+
+func (b *BaseRecognizer) GetError() RecognitionException {
+ return b.SynErr
+}
+
+func (b *BaseRecognizer) Action(_ RuleContext, _, _ int) {
+ panic("action not implemented on Recognizer!")
+}
+
+func (b *BaseRecognizer) AddErrorListener(listener ErrorListener) {
+ b.listeners = append(b.listeners, listener)
+}
+
+func (b *BaseRecognizer) RemoveErrorListeners() {
+ b.listeners = make([]ErrorListener, 0)
+}
+
+func (b *BaseRecognizer) GetRuleNames() []string {
+ return b.RuleNames
+}
+
+func (b *BaseRecognizer) GetTokenNames() []string {
+ return b.LiteralNames
+}
+
+func (b *BaseRecognizer) GetSymbolicNames() []string {
+ return b.SymbolicNames
+}
+
+func (b *BaseRecognizer) GetLiteralNames() []string {
+ return b.LiteralNames
+}
+
+func (b *BaseRecognizer) GetState() int {
+ return b.state
+}
+
+func (b *BaseRecognizer) SetState(v int) {
+ b.state = v
+}
+
+//func (b *Recognizer) GetTokenTypeMap() {
+// var tokenNames = b.GetTokenNames()
+// if (tokenNames==nil) {
+// panic("The current recognizer does not provide a list of token names.")
+// }
+// var result = tokenTypeMapCache[tokenNames]
+// if(result==nil) {
+// result = tokenNames.reduce(function(o, k, i) { o[k] = i })
+// result.EOF = TokenEOF
+// tokenTypeMapCache[tokenNames] = result
+// }
+// return result
+//}
+
+// GetRuleIndexMap Get a map from rule names to rule indexes.
+//
+// Used for XPath and tree pattern compilation.
+//
+// TODO: JI This is not yet implemented in the Go runtime. Maybe not needed.
+func (b *BaseRecognizer) GetRuleIndexMap() map[string]int {
+
+ panic("Method not defined!")
+ // var ruleNames = b.GetRuleNames()
+ // if (ruleNames==nil) {
+ // panic("The current recognizer does not provide a list of rule names.")
+ // }
+ //
+ // var result = ruleIndexMapCache[ruleNames]
+ // if(result==nil) {
+ // result = ruleNames.reduce(function(o, k, i) { o[k] = i })
+ // ruleIndexMapCache[ruleNames] = result
+ // }
+ // return result
+}
+
+// GetTokenType get the token type based upon its name
+func (b *BaseRecognizer) GetTokenType(_ string) int {
+ panic("Method not defined!")
+ // var ttype = b.GetTokenTypeMap()[tokenName]
+ // if (ttype !=nil) {
+ // return ttype
+ // } else {
+ // return TokenInvalidType
+ // }
+}
+
+//func (b *Recognizer) GetTokenTypeMap() map[string]int {
+// Vocabulary vocabulary = getVocabulary()
+//
+// Synchronized (tokenTypeMapCache) {
+// Map result = tokenTypeMapCache.Get(vocabulary)
+// if (result == null) {
+// result = new HashMap()
+// for (int i = 0; i < GetATN().maxTokenType; i++) {
+// String literalName = vocabulary.getLiteralName(i)
+// if (literalName != null) {
+// result.put(literalName, i)
+// }
+//
+// String symbolicName = vocabulary.GetSymbolicName(i)
+// if (symbolicName != null) {
+// result.put(symbolicName, i)
+// }
+// }
+//
+// result.put("EOF", Token.EOF)
+// result = Collections.unmodifiableMap(result)
+// tokenTypeMapCache.put(vocabulary, result)
+// }
+//
+// return result
+// }
+//}
+
+// GetErrorHeader returns the error header, normally line/character position information.
+//
+// Can be overridden in sub structs embedding BaseRecognizer.
+func (b *BaseRecognizer) GetErrorHeader(e RecognitionException) string {
+ line := e.GetOffendingToken().GetLine()
+ column := e.GetOffendingToken().GetColumn()
+ return "line " + strconv.Itoa(line) + ":" + strconv.Itoa(column)
+}
+
+// GetTokenErrorDisplay shows how a token should be displayed in an error message.
+//
+// The default is to display just the text, but during development you might
+// want to have a lot of information spit out. Override in that case
+// to use t.String() (which, for CommonToken, dumps everything about
+// the token). This is better than forcing you to override a method in
+// your token objects because you don't have to go modify your lexer
+// so that it creates a NewJava type.
+//
+// Deprecated: This method is not called by the ANTLR 4 Runtime. Specific
+// implementations of [ANTLRErrorStrategy] may provide a similar
+// feature when necessary. For example, see [DefaultErrorStrategy].GetTokenErrorDisplay()
+func (b *BaseRecognizer) GetTokenErrorDisplay(t Token) string {
+ if t == nil {
+ return ""
+ }
+ s := t.GetText()
+ if s == "" {
+ if t.GetTokenType() == TokenEOF {
+ s = ""
+ } else {
+ s = "<" + strconv.Itoa(t.GetTokenType()) + ">"
+ }
+ }
+ s = strings.Replace(s, "\t", "\\t", -1)
+ s = strings.Replace(s, "\n", "\\n", -1)
+ s = strings.Replace(s, "\r", "\\r", -1)
+
+ return "'" + s + "'"
+}
+
+func (b *BaseRecognizer) GetErrorListenerDispatch() ErrorListener {
+ return NewProxyErrorListener(b.listeners)
+}
+
+// Sempred embedding structs need to override this if there are sempreds or actions
+// that the ATN interpreter needs to execute
+func (b *BaseRecognizer) Sempred(_ RuleContext, _ int, _ int) bool {
+ return true
+}
+
+// Precpred embedding structs need to override this if there are preceding predicates
+// that the ATN interpreter needs to execute
+func (b *BaseRecognizer) Precpred(_ RuleContext, _ int) bool {
+ return true
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/rule_context.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/rule_context.go
new file mode 100644
index 0000000..f2ad047
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/rule_context.go
@@ -0,0 +1,40 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+// RuleContext is a record of a single rule invocation. It knows
+// which context invoked it, if any. If there is no parent context, then
+// naturally the invoking state is not valid. The parent link
+// provides a chain upwards from the current rule invocation to the root
+// of the invocation tree, forming a stack.
+//
+// We actually carry no information about the rule associated with this context (except
+// when parsing). We keep only the state number of the invoking state from
+// the [ATN] submachine that invoked this. Contrast this with the s
+// pointer inside [ParserRuleContext] that tracks the current state
+// being "executed" for the current rule.
+//
+// The parent contexts are useful for computing lookahead sets and
+// getting error information.
+//
+// These objects are used during parsing and prediction.
+// For the special case of parsers, we use the struct
+// [ParserRuleContext], which embeds a RuleContext.
+//
+// @see ParserRuleContext
+type RuleContext interface {
+ RuleNode
+
+ GetInvokingState() int
+ SetInvokingState(int)
+
+ GetRuleIndex() int
+ IsEmpty() bool
+
+ GetAltNumber() int
+ SetAltNumber(altNumber int)
+
+ String([]string, RuleContext) string
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/semantic_context.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/semantic_context.go
new file mode 100644
index 0000000..68cb906
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/semantic_context.go
@@ -0,0 +1,464 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strconv"
+)
+
+// SemanticContext is a tree structure used to record the semantic context in which
+//
+// an ATN configuration is valid. It's either a single predicate,
+// a conjunction p1 && p2, or a sum of products p1 || p2.
+//
+// I have scoped the AND, OR, and Predicate subclasses of
+// [SemanticContext] within the scope of this outer ``class''
+type SemanticContext interface {
+ Equals(other Collectable[SemanticContext]) bool
+ Hash() int
+
+ evaluate(parser Recognizer, outerContext RuleContext) bool
+ evalPrecedence(parser Recognizer, outerContext RuleContext) SemanticContext
+
+ String() string
+}
+
+func SemanticContextandContext(a, b SemanticContext) SemanticContext {
+ if a == nil || a == SemanticContextNone {
+ return b
+ }
+ if b == nil || b == SemanticContextNone {
+ return a
+ }
+ result := NewAND(a, b)
+ if len(result.opnds) == 1 {
+ return result.opnds[0]
+ }
+
+ return result
+}
+
+func SemanticContextorContext(a, b SemanticContext) SemanticContext {
+ if a == nil {
+ return b
+ }
+ if b == nil {
+ return a
+ }
+ if a == SemanticContextNone || b == SemanticContextNone {
+ return SemanticContextNone
+ }
+ result := NewOR(a, b)
+ if len(result.opnds) == 1 {
+ return result.opnds[0]
+ }
+
+ return result
+}
+
+type Predicate struct {
+ ruleIndex int
+ predIndex int
+ isCtxDependent bool
+}
+
+func NewPredicate(ruleIndex, predIndex int, isCtxDependent bool) *Predicate {
+ p := new(Predicate)
+
+ p.ruleIndex = ruleIndex
+ p.predIndex = predIndex
+ p.isCtxDependent = isCtxDependent // e.g., $i ref in pred
+ return p
+}
+
+//The default {@link SemanticContext}, which is semantically equivalent to
+//a predicate of the form {@code {true}?}.
+
+var SemanticContextNone = NewPredicate(-1, -1, false)
+
+func (p *Predicate) evalPrecedence(_ Recognizer, _ RuleContext) SemanticContext {
+ return p
+}
+
+func (p *Predicate) evaluate(parser Recognizer, outerContext RuleContext) bool {
+
+ var localctx RuleContext
+
+ if p.isCtxDependent {
+ localctx = outerContext
+ }
+
+ return parser.Sempred(localctx, p.ruleIndex, p.predIndex)
+}
+
+func (p *Predicate) Equals(other Collectable[SemanticContext]) bool {
+ if p == other {
+ return true
+ } else if _, ok := other.(*Predicate); !ok {
+ return false
+ } else {
+ return p.ruleIndex == other.(*Predicate).ruleIndex &&
+ p.predIndex == other.(*Predicate).predIndex &&
+ p.isCtxDependent == other.(*Predicate).isCtxDependent
+ }
+}
+
+func (p *Predicate) Hash() int {
+ h := murmurInit(0)
+ h = murmurUpdate(h, p.ruleIndex)
+ h = murmurUpdate(h, p.predIndex)
+ if p.isCtxDependent {
+ h = murmurUpdate(h, 1)
+ } else {
+ h = murmurUpdate(h, 0)
+ }
+ return murmurFinish(h, 3)
+}
+
+func (p *Predicate) String() string {
+ return "{" + strconv.Itoa(p.ruleIndex) + ":" + strconv.Itoa(p.predIndex) + "}?"
+}
+
+type PrecedencePredicate struct {
+ precedence int
+}
+
+func NewPrecedencePredicate(precedence int) *PrecedencePredicate {
+
+ p := new(PrecedencePredicate)
+ p.precedence = precedence
+
+ return p
+}
+
+func (p *PrecedencePredicate) evaluate(parser Recognizer, outerContext RuleContext) bool {
+ return parser.Precpred(outerContext, p.precedence)
+}
+
+func (p *PrecedencePredicate) evalPrecedence(parser Recognizer, outerContext RuleContext) SemanticContext {
+ if parser.Precpred(outerContext, p.precedence) {
+ return SemanticContextNone
+ }
+
+ return nil
+}
+
+func (p *PrecedencePredicate) compareTo(other *PrecedencePredicate) int {
+ return p.precedence - other.precedence
+}
+
+func (p *PrecedencePredicate) Equals(other Collectable[SemanticContext]) bool {
+
+ var op *PrecedencePredicate
+ var ok bool
+ if op, ok = other.(*PrecedencePredicate); !ok {
+ return false
+ }
+
+ if p == op {
+ return true
+ }
+
+ return p.precedence == other.(*PrecedencePredicate).precedence
+}
+
+func (p *PrecedencePredicate) Hash() int {
+ h := uint32(1)
+ h = 31*h + uint32(p.precedence)
+ return int(h)
+}
+
+func (p *PrecedencePredicate) String() string {
+ return "{" + strconv.Itoa(p.precedence) + ">=prec}?"
+}
+
+func PrecedencePredicatefilterPrecedencePredicates(set *JStore[SemanticContext, Comparator[SemanticContext]]) []*PrecedencePredicate {
+ result := make([]*PrecedencePredicate, 0)
+
+ set.Each(func(v SemanticContext) bool {
+ if c2, ok := v.(*PrecedencePredicate); ok {
+ result = append(result, c2)
+ }
+ return true
+ })
+
+ return result
+}
+
+// A semantic context which is true whenever none of the contained contexts
+// is false.`
+
+type AND struct {
+ opnds []SemanticContext
+}
+
+func NewAND(a, b SemanticContext) *AND {
+
+ operands := NewJStore[SemanticContext, Comparator[SemanticContext]](semctxEqInst, SemanticContextCollection, "NewAND() operands")
+ if aa, ok := a.(*AND); ok {
+ for _, o := range aa.opnds {
+ operands.Put(o)
+ }
+ } else {
+ operands.Put(a)
+ }
+
+ if ba, ok := b.(*AND); ok {
+ for _, o := range ba.opnds {
+ operands.Put(o)
+ }
+ } else {
+ operands.Put(b)
+ }
+ precedencePredicates := PrecedencePredicatefilterPrecedencePredicates(operands)
+ if len(precedencePredicates) > 0 {
+ // interested in the transition with the lowest precedence
+ var reduced *PrecedencePredicate
+
+ for _, p := range precedencePredicates {
+ if reduced == nil || p.precedence < reduced.precedence {
+ reduced = p
+ }
+ }
+
+ operands.Put(reduced)
+ }
+
+ vs := operands.Values()
+ opnds := make([]SemanticContext, len(vs))
+ copy(opnds, vs)
+
+ and := new(AND)
+ and.opnds = opnds
+
+ return and
+}
+
+func (a *AND) Equals(other Collectable[SemanticContext]) bool {
+ if a == other {
+ return true
+ }
+ if _, ok := other.(*AND); !ok {
+ return false
+ } else {
+ for i, v := range other.(*AND).opnds {
+ if !a.opnds[i].Equals(v) {
+ return false
+ }
+ }
+ return true
+ }
+}
+
+// {@inheritDoc}
+//
+//
+// The evaluation of predicates by a context is short-circuiting, but
+// unordered.
+func (a *AND) evaluate(parser Recognizer, outerContext RuleContext) bool {
+ for i := 0; i < len(a.opnds); i++ {
+ if !a.opnds[i].evaluate(parser, outerContext) {
+ return false
+ }
+ }
+ return true
+}
+
+func (a *AND) evalPrecedence(parser Recognizer, outerContext RuleContext) SemanticContext {
+ differs := false
+ operands := make([]SemanticContext, 0)
+
+ for i := 0; i < len(a.opnds); i++ {
+ context := a.opnds[i]
+ evaluated := context.evalPrecedence(parser, outerContext)
+ differs = differs || (evaluated != context)
+ if evaluated == nil {
+ // The AND context is false if any element is false
+ return nil
+ } else if evaluated != SemanticContextNone {
+ // Reduce the result by Skipping true elements
+ operands = append(operands, evaluated)
+ }
+ }
+ if !differs {
+ return a
+ }
+
+ if len(operands) == 0 {
+ // all elements were true, so the AND context is true
+ return SemanticContextNone
+ }
+
+ var result SemanticContext
+
+ for _, o := range operands {
+ if result == nil {
+ result = o
+ } else {
+ result = SemanticContextandContext(result, o)
+ }
+ }
+
+ return result
+}
+
+func (a *AND) Hash() int {
+ h := murmurInit(37) // Init with a value different from OR
+ for _, op := range a.opnds {
+ h = murmurUpdate(h, op.Hash())
+ }
+ return murmurFinish(h, len(a.opnds))
+}
+
+func (o *OR) Hash() int {
+ h := murmurInit(41) // Init with o value different from AND
+ for _, op := range o.opnds {
+ h = murmurUpdate(h, op.Hash())
+ }
+ return murmurFinish(h, len(o.opnds))
+}
+
+func (a *AND) String() string {
+ s := ""
+
+ for _, o := range a.opnds {
+ s += "&& " + fmt.Sprint(o)
+ }
+
+ if len(s) > 3 {
+ return s[0:3]
+ }
+
+ return s
+}
+
+//
+// A semantic context which is true whenever at least one of the contained
+// contexts is true.
+//
+
+type OR struct {
+ opnds []SemanticContext
+}
+
+func NewOR(a, b SemanticContext) *OR {
+
+ operands := NewJStore[SemanticContext, Comparator[SemanticContext]](semctxEqInst, SemanticContextCollection, "NewOR() operands")
+ if aa, ok := a.(*OR); ok {
+ for _, o := range aa.opnds {
+ operands.Put(o)
+ }
+ } else {
+ operands.Put(a)
+ }
+
+ if ba, ok := b.(*OR); ok {
+ for _, o := range ba.opnds {
+ operands.Put(o)
+ }
+ } else {
+ operands.Put(b)
+ }
+ precedencePredicates := PrecedencePredicatefilterPrecedencePredicates(operands)
+ if len(precedencePredicates) > 0 {
+ // interested in the transition with the lowest precedence
+ var reduced *PrecedencePredicate
+
+ for _, p := range precedencePredicates {
+ if reduced == nil || p.precedence > reduced.precedence {
+ reduced = p
+ }
+ }
+
+ operands.Put(reduced)
+ }
+
+ vs := operands.Values()
+
+ opnds := make([]SemanticContext, len(vs))
+ copy(opnds, vs)
+
+ o := new(OR)
+ o.opnds = opnds
+
+ return o
+}
+
+func (o *OR) Equals(other Collectable[SemanticContext]) bool {
+ if o == other {
+ return true
+ } else if _, ok := other.(*OR); !ok {
+ return false
+ } else {
+ for i, v := range other.(*OR).opnds {
+ if !o.opnds[i].Equals(v) {
+ return false
+ }
+ }
+ return true
+ }
+}
+
+//
+// The evaluation of predicates by o context is short-circuiting, but
+// unordered.
+func (o *OR) evaluate(parser Recognizer, outerContext RuleContext) bool {
+ for i := 0; i < len(o.opnds); i++ {
+ if o.opnds[i].evaluate(parser, outerContext) {
+ return true
+ }
+ }
+ return false
+}
+
+func (o *OR) evalPrecedence(parser Recognizer, outerContext RuleContext) SemanticContext {
+ differs := false
+ operands := make([]SemanticContext, 0)
+ for i := 0; i < len(o.opnds); i++ {
+ context := o.opnds[i]
+ evaluated := context.evalPrecedence(parser, outerContext)
+ differs = differs || (evaluated != context)
+ if evaluated == SemanticContextNone {
+ // The OR context is true if any element is true
+ return SemanticContextNone
+ } else if evaluated != nil {
+ // Reduce the result by Skipping false elements
+ operands = append(operands, evaluated)
+ }
+ }
+ if !differs {
+ return o
+ }
+ if len(operands) == 0 {
+ // all elements were false, so the OR context is false
+ return nil
+ }
+ var result SemanticContext
+
+ for _, o := range operands {
+ if result == nil {
+ result = o
+ } else {
+ result = SemanticContextorContext(result, o)
+ }
+ }
+
+ return result
+}
+
+func (o *OR) String() string {
+ s := ""
+
+ for _, o := range o.opnds {
+ s += "|| " + fmt.Sprint(o)
+ }
+
+ if len(s) > 3 {
+ return s[0:3]
+ }
+
+ return s
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/statistics.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/statistics.go
new file mode 100644
index 0000000..70c0673
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/statistics.go
@@ -0,0 +1,281 @@
+//go:build antlr.stats
+
+package antlr
+
+import (
+ "fmt"
+ "log"
+ "os"
+ "path/filepath"
+ "sort"
+ "strconv"
+ "sync"
+)
+
+// This file allows the user to collect statistics about the runtime of the ANTLR runtime. It is not enabled by default
+// and so incurs no time penalty. To enable it, you must build the runtime with the antlr.stats build tag.
+//
+
+// Tells various components to collect statistics - because it is only true when this file is included, it will
+// allow the compiler to completely eliminate all the code that is only used when collecting statistics.
+const collectStats = true
+
+// goRunStats is a collection of all the various data the ANTLR runtime has collected about a particular run.
+// It is exported so that it can be used by others to look for things that are not already looked for in the
+// runtime statistics.
+type goRunStats struct {
+
+ // jStats is a slice of all the [JStatRec] records that have been created, which is one for EVERY collection created
+ // during a run. It is exported so that it can be used by others to look for things that are not already looked for
+ // within this package.
+ //
+ jStats []*JStatRec
+ jStatsLock sync.RWMutex
+ topN int
+ topNByMax []*JStatRec
+ topNByUsed []*JStatRec
+ unusedCollections map[CollectionSource]int
+ counts map[CollectionSource]int
+}
+
+const (
+ collectionsFile = "collections"
+)
+
+var (
+ Statistics = &goRunStats{
+ topN: 10,
+ }
+)
+
+type statsOption func(*goRunStats) error
+
+// Configure allows the statistics system to be configured as the user wants and override the defaults
+func (s *goRunStats) Configure(options ...statsOption) error {
+ for _, option := range options {
+ err := option(s)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// WithTopN sets the number of things to list in the report when we are concerned with the top N things.
+//
+// For example, if you want to see the top 20 collections by size, you can do:
+//
+// antlr.Statistics.Configure(antlr.WithTopN(20))
+func WithTopN(topN int) statsOption {
+ return func(s *goRunStats) error {
+ s.topN = topN
+ return nil
+ }
+}
+
+// Analyze looks through all the statistical records and computes all the outputs that might be useful to the user.
+//
+// The function gathers and analyzes a number of statistics about any particular run of
+// an ANTLR generated recognizer. In the vast majority of cases, the statistics are only
+// useful to maintainers of ANTLR itself, but they can be useful to users as well. They may be
+// especially useful in tracking down bugs or performance problems when an ANTLR user could
+// supply the output from this package, but cannot supply the grammar file(s) they are using, even
+// privately to the maintainers.
+//
+// The statistics are gathered by the runtime itself, and are not gathered by the parser or lexer, but the user
+// must call this function their selves to analyze the statistics. This is because none of the infrastructure is
+// extant unless the calling program is built with the antlr.stats tag like so:
+//
+// go build -tags antlr.stats .
+//
+// When a program is built with the antlr.stats tag, the Statistics object is created and available outside
+// the package. The user can then call the [Statistics.Analyze] function to analyze the statistics and then call the
+// [Statistics.Report] function to report the statistics.
+//
+// Please forward any questions about this package to the ANTLR discussion groups on GitHub or send to them to
+// me [Jim Idle] directly at jimi@idle.ws
+//
+// [Jim Idle]: https:://github.com/jim-idle
+func (s *goRunStats) Analyze() {
+
+ // Look for anything that looks strange and record it in our local maps etc for the report to present it
+ //
+ s.CollectionAnomalies()
+ s.TopNCollections()
+}
+
+// TopNCollections looks through all the statistical records and gathers the top ten collections by size.
+func (s *goRunStats) TopNCollections() {
+
+ // Let's sort the stat records by MaxSize
+ //
+ sort.Slice(s.jStats, func(i, j int) bool {
+ return s.jStats[i].MaxSize > s.jStats[j].MaxSize
+ })
+
+ for i := 0; i < len(s.jStats) && i < s.topN; i++ {
+ s.topNByMax = append(s.topNByMax, s.jStats[i])
+ }
+
+ // Sort by the number of times used
+ //
+ sort.Slice(s.jStats, func(i, j int) bool {
+ return s.jStats[i].Gets+s.jStats[i].Puts > s.jStats[j].Gets+s.jStats[j].Puts
+ })
+ for i := 0; i < len(s.jStats) && i < s.topN; i++ {
+ s.topNByUsed = append(s.topNByUsed, s.jStats[i])
+ }
+}
+
+// Report dumps a markdown formatted report of all the statistics collected during a run to the given dir output
+// path, which should represent a directory. Generated files will be prefixed with the given prefix and will be
+// given a type name such as `anomalies` and a time stamp such as `2021-09-01T12:34:56` and a .md suffix.
+func (s *goRunStats) Report(dir string, prefix string) error {
+
+ isDir, err := isDirectory(dir)
+ switch {
+ case err != nil:
+ return err
+ case !isDir:
+ return fmt.Errorf("output directory `%s` is not a directory", dir)
+ }
+ s.reportCollections(dir, prefix)
+
+ // Clean out any old data in case the user forgets
+ //
+ s.Reset()
+ return nil
+}
+
+func (s *goRunStats) Reset() {
+ s.jStats = nil
+ s.topNByUsed = nil
+ s.topNByMax = nil
+}
+
+func (s *goRunStats) reportCollections(dir, prefix string) {
+ cname := filepath.Join(dir, ".asciidoctor")
+ // If the file doesn't exist, create it, or append to the file
+ f, err := os.OpenFile(cname, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
+ if err != nil {
+ log.Fatal(err)
+ }
+ _, _ = f.WriteString(`// .asciidoctorconfig
+++++
+
+++++`)
+ _ = f.Close()
+
+ fname := filepath.Join(dir, prefix+"_"+"_"+collectionsFile+"_"+".adoc")
+ // If the file doesn't exist, create it, or append to the file
+ f, err = os.OpenFile(fname, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer func(f *os.File) {
+ err := f.Close()
+ if err != nil {
+ log.Fatal(err)
+ }
+ }(f)
+ _, _ = f.WriteString("= Collections for " + prefix + "\n\n")
+
+ _, _ = f.WriteString("== Summary\n")
+
+ if s.unusedCollections != nil {
+ _, _ = f.WriteString("=== Unused Collections\n")
+ _, _ = f.WriteString("Unused collections incur a penalty for allocation that makes them a candidate for either\n")
+ _, _ = f.WriteString(" removal or optimization. If you are using a collection that is not used, you should\n")
+ _, _ = f.WriteString(" consider removing it. If you are using a collection that is used, but not very often,\n")
+ _, _ = f.WriteString(" you should consider using lazy initialization to defer the allocation until it is\n")
+ _, _ = f.WriteString(" actually needed.\n\n")
+
+ _, _ = f.WriteString("\n.Unused collections\n")
+ _, _ = f.WriteString(`[cols="<3,>1"]` + "\n\n")
+ _, _ = f.WriteString("|===\n")
+ _, _ = f.WriteString("| Type | Count\n")
+
+ for k, v := range s.unusedCollections {
+ _, _ = f.WriteString("| " + CollectionDescriptors[k].SybolicName + " | " + strconv.Itoa(v) + "\n")
+ }
+ f.WriteString("|===\n\n")
+ }
+
+ _, _ = f.WriteString("\n.Summary of Collections\n")
+ _, _ = f.WriteString(`[cols="<3,>1"]` + "\n\n")
+ _, _ = f.WriteString("|===\n")
+ _, _ = f.WriteString("| Type | Count\n")
+ for k, v := range s.counts {
+ _, _ = f.WriteString("| " + CollectionDescriptors[k].SybolicName + " | " + strconv.Itoa(v) + "\n")
+ }
+ _, _ = f.WriteString("| Total | " + strconv.Itoa(len(s.jStats)) + "\n")
+ _, _ = f.WriteString("|===\n\n")
+
+ _, _ = f.WriteString("\n.Summary of Top " + strconv.Itoa(s.topN) + " Collections by MaxSize\n")
+ _, _ = f.WriteString(`[cols="<1,<3,>1,>1,>1,>1"]` + "\n\n")
+ _, _ = f.WriteString("|===\n")
+ _, _ = f.WriteString("| Source | Description | MaxSize | EndSize | Puts | Gets\n")
+ for _, c := range s.topNByMax {
+ _, _ = f.WriteString("| " + CollectionDescriptors[c.Source].SybolicName + "\n")
+ _, _ = f.WriteString("| " + c.Description + "\n")
+ _, _ = f.WriteString("| " + strconv.Itoa(c.MaxSize) + "\n")
+ _, _ = f.WriteString("| " + strconv.Itoa(c.CurSize) + "\n")
+ _, _ = f.WriteString("| " + strconv.Itoa(c.Puts) + "\n")
+ _, _ = f.WriteString("| " + strconv.Itoa(c.Gets) + "\n")
+ _, _ = f.WriteString("\n")
+ }
+ _, _ = f.WriteString("|===\n\n")
+
+ _, _ = f.WriteString("\n.Summary of Top " + strconv.Itoa(s.topN) + " Collections by Access\n")
+ _, _ = f.WriteString(`[cols="<1,<3,>1,>1,>1,>1,>1"]` + "\n\n")
+ _, _ = f.WriteString("|===\n")
+ _, _ = f.WriteString("| Source | Description | MaxSize | EndSize | Puts | Gets | P+G\n")
+ for _, c := range s.topNByUsed {
+ _, _ = f.WriteString("| " + CollectionDescriptors[c.Source].SybolicName + "\n")
+ _, _ = f.WriteString("| " + c.Description + "\n")
+ _, _ = f.WriteString("| " + strconv.Itoa(c.MaxSize) + "\n")
+ _, _ = f.WriteString("| " + strconv.Itoa(c.CurSize) + "\n")
+ _, _ = f.WriteString("| " + strconv.Itoa(c.Puts) + "\n")
+ _, _ = f.WriteString("| " + strconv.Itoa(c.Gets) + "\n")
+ _, _ = f.WriteString("| " + strconv.Itoa(c.Gets+c.Puts) + "\n")
+ _, _ = f.WriteString("\n")
+ }
+ _, _ = f.WriteString("|===\n\n")
+}
+
+// AddJStatRec adds a [JStatRec] record to the [goRunStats] collection when build runtimeConfig antlr.stats is enabled.
+func (s *goRunStats) AddJStatRec(rec *JStatRec) {
+ s.jStatsLock.Lock()
+ defer s.jStatsLock.Unlock()
+ s.jStats = append(s.jStats, rec)
+}
+
+// CollectionAnomalies looks through all the statistical records and gathers any anomalies that have been found.
+func (s *goRunStats) CollectionAnomalies() {
+ s.jStatsLock.RLock()
+ defer s.jStatsLock.RUnlock()
+ s.counts = make(map[CollectionSource]int, len(s.jStats))
+ for _, c := range s.jStats {
+
+ // Accumlate raw counts
+ //
+ s.counts[c.Source]++
+
+ // Look for allocated but unused collections and count them
+ if c.MaxSize == 0 && c.Puts == 0 {
+ if s.unusedCollections == nil {
+ s.unusedCollections = make(map[CollectionSource]int)
+ }
+ s.unusedCollections[c.Source]++
+ }
+ if c.MaxSize > 6000 {
+ fmt.Println("Collection ", c.Description, "accumulated a max size of ", c.MaxSize, " - this is probably too large and indicates a poorly formed grammar")
+ }
+ }
+
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/stats_data.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/stats_data.go
new file mode 100644
index 0000000..4d9eb94
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/stats_data.go
@@ -0,0 +1,23 @@
+package antlr
+
+// A JStatRec is a record of a particular use of a [JStore], [JMap] or JPCMap] collection. Typically, it will be
+// used to look for unused collections that wre allocated anyway, problems with hash bucket clashes, and anomalies
+// such as huge numbers of Gets with no entries found GetNoEnt. You can refer to the CollectionAnomalies() function
+// for ideas on what can be gleaned from these statistics about collections.
+type JStatRec struct {
+ Source CollectionSource
+ MaxSize int
+ CurSize int
+ Gets int
+ GetHits int
+ GetMisses int
+ GetHashConflicts int
+ GetNoEnt int
+ Puts int
+ PutHits int
+ PutMisses int
+ PutHashConflicts int
+ MaxSlotSize int
+ Description string
+ CreateStack []byte
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/token.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/token.go
new file mode 100644
index 0000000..9670efb
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/token.go
@@ -0,0 +1,213 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "strconv"
+ "strings"
+)
+
+type TokenSourceCharStreamPair struct {
+ tokenSource TokenSource
+ charStream CharStream
+}
+
+// A token has properties: text, type, line, character position in the line
+// (so we can ignore tabs), token channel, index, and source from which
+// we obtained this token.
+
+type Token interface {
+ GetSource() *TokenSourceCharStreamPair
+ GetTokenType() int
+ GetChannel() int
+ GetStart() int
+ GetStop() int
+ GetLine() int
+ GetColumn() int
+
+ GetText() string
+ SetText(s string)
+
+ GetTokenIndex() int
+ SetTokenIndex(v int)
+
+ GetTokenSource() TokenSource
+ GetInputStream() CharStream
+
+ String() string
+}
+
+type BaseToken struct {
+ source *TokenSourceCharStreamPair
+ tokenType int // token type of the token
+ channel int // The parser ignores everything not on DEFAULT_CHANNEL
+ start int // optional return -1 if not implemented.
+ stop int // optional return -1 if not implemented.
+ tokenIndex int // from 0..n-1 of the token object in the input stream
+ line int // line=1..n of the 1st character
+ column int // beginning of the line at which it occurs, 0..n-1
+ text string // text of the token.
+ readOnly bool
+}
+
+const (
+ TokenInvalidType = 0
+
+ // TokenEpsilon - during lookahead operations, this "token" signifies we hit the rule end [ATN] state
+ // and did not follow it despite needing to.
+ TokenEpsilon = -2
+
+ TokenMinUserTokenType = 1
+
+ TokenEOF = -1
+
+ // TokenDefaultChannel is the default channel upon which tokens are sent to the parser.
+ //
+ // All tokens go to the parser (unless [Skip] is called in the lexer rule)
+ // on a particular "channel". The parser tunes to a particular channel
+ // so that whitespace etc... can go to the parser on a "hidden" channel.
+ TokenDefaultChannel = 0
+
+ // TokenHiddenChannel defines the normal hidden channel - the parser wil not see tokens that are not on [TokenDefaultChannel].
+ //
+ // Anything on a different channel than TokenDefaultChannel is not parsed by parser.
+ TokenHiddenChannel = 1
+)
+
+func (b *BaseToken) GetChannel() int {
+ return b.channel
+}
+
+func (b *BaseToken) GetStart() int {
+ return b.start
+}
+
+func (b *BaseToken) GetStop() int {
+ return b.stop
+}
+
+func (b *BaseToken) GetLine() int {
+ return b.line
+}
+
+func (b *BaseToken) GetColumn() int {
+ return b.column
+}
+
+func (b *BaseToken) GetTokenType() int {
+ return b.tokenType
+}
+
+func (b *BaseToken) GetSource() *TokenSourceCharStreamPair {
+ return b.source
+}
+
+func (b *BaseToken) GetTokenIndex() int {
+ return b.tokenIndex
+}
+
+func (b *BaseToken) SetTokenIndex(v int) {
+ b.tokenIndex = v
+}
+
+func (b *BaseToken) GetTokenSource() TokenSource {
+ return b.source.tokenSource
+}
+
+func (b *BaseToken) GetInputStream() CharStream {
+ return b.source.charStream
+}
+
+type CommonToken struct {
+ BaseToken
+}
+
+func NewCommonToken(source *TokenSourceCharStreamPair, tokenType, channel, start, stop int) *CommonToken {
+
+ t := &CommonToken{
+ BaseToken: BaseToken{
+ source: source,
+ tokenType: tokenType,
+ channel: channel,
+ start: start,
+ stop: stop,
+ tokenIndex: -1,
+ },
+ }
+
+ if t.source.tokenSource != nil {
+ t.line = source.tokenSource.GetLine()
+ t.column = source.tokenSource.GetCharPositionInLine()
+ } else {
+ t.column = -1
+ }
+ return t
+}
+
+// An empty {@link Pair} which is used as the default value of
+// {@link //source} for tokens that do not have a source.
+
+//CommonToken.EMPTY_SOURCE = [ nil, nil ]
+
+// Constructs a New{@link CommonToken} as a copy of another {@link Token}.
+//
+//
+// If {@code oldToken} is also a {@link CommonToken} instance, the newly
+// constructed token will share a reference to the {@link //text} field and
+// the {@link Pair} stored in {@link //source}. Otherwise, {@link //text} will
+// be assigned the result of calling {@link //GetText}, and {@link //source}
+// will be constructed from the result of {@link Token//GetTokenSource} and
+// {@link Token//GetInputStream}.
+//
+// @param oldToken The token to copy.
+func (c *CommonToken) clone() *CommonToken {
+ t := NewCommonToken(c.source, c.tokenType, c.channel, c.start, c.stop)
+ t.tokenIndex = c.GetTokenIndex()
+ t.line = c.GetLine()
+ t.column = c.GetColumn()
+ t.text = c.GetText()
+ return t
+}
+
+func (c *CommonToken) GetText() string {
+ if c.text != "" {
+ return c.text
+ }
+ input := c.GetInputStream()
+ if input == nil {
+ return ""
+ }
+ n := input.Size()
+ if c.start < n && c.stop < n {
+ return input.GetTextFromInterval(NewInterval(c.start, c.stop))
+ }
+ return ""
+}
+
+func (c *CommonToken) SetText(text string) {
+ c.text = text
+}
+
+func (c *CommonToken) String() string {
+ txt := c.GetText()
+ if txt != "" {
+ txt = strings.Replace(txt, "\n", "\\n", -1)
+ txt = strings.Replace(txt, "\r", "\\r", -1)
+ txt = strings.Replace(txt, "\t", "\\t", -1)
+ } else {
+ txt = ""
+ }
+
+ var ch string
+ if c.channel > 0 {
+ ch = ",channel=" + strconv.Itoa(c.channel)
+ } else {
+ ch = ""
+ }
+
+ return "[@" + strconv.Itoa(c.tokenIndex) + "," + strconv.Itoa(c.start) + ":" + strconv.Itoa(c.stop) + "='" +
+ txt + "',<" + strconv.Itoa(c.tokenType) + ">" +
+ ch + "," + strconv.Itoa(c.line) + ":" + strconv.Itoa(c.column) + "]"
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/token_source.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/token_source.go
new file mode 100644
index 0000000..a3f36ea
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/token_source.go
@@ -0,0 +1,17 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+type TokenSource interface {
+ NextToken() Token
+ Skip()
+ More()
+ GetLine() int
+ GetCharPositionInLine() int
+ GetInputStream() CharStream
+ GetSourceName() string
+ setTokenFactory(factory TokenFactory)
+ GetTokenFactory() TokenFactory
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/token_stream.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/token_stream.go
new file mode 100644
index 0000000..bf4ff66
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/token_stream.go
@@ -0,0 +1,21 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+type TokenStream interface {
+ IntStream
+
+ LT(k int) Token
+ Reset()
+
+ Get(index int) Token
+ GetTokenSource() TokenSource
+ SetTokenSource(TokenSource)
+
+ GetAllText() string
+ GetTextFromInterval(Interval) string
+ GetTextFromRuleContext(RuleContext) string
+ GetTextFromTokens(Token, Token) string
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/tokenstream_rewriter.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/tokenstream_rewriter.go
new file mode 100644
index 0000000..ccf59b4
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/tokenstream_rewriter.go
@@ -0,0 +1,662 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "bytes"
+ "fmt"
+)
+
+//
+// Useful for rewriting out a buffered input token stream after doing some
+// augmentation or other manipulations on it.
+
+//
+// You can insert stuff, replace, and delete chunks. Note that the operations
+// are done lazily--only if you convert the buffer to a {@link String} with
+// {@link TokenStream#getText()}. This is very efficient because you are not
+// moving data around all the time. As the buffer of tokens is converted to
+// strings, the {@link #getText()} method(s) scan the input token stream and
+// check to see if there is an operation at the current index. If so, the
+// operation is done and then normal {@link String} rendering continues on the
+// buffer. This is like having multiple Turing machine instruction streams
+// (programs) operating on a single input tape. :)
+//
+
+// This rewriter makes no modifications to the token stream. It does not ask the
+// stream to fill itself up nor does it advance the input cursor. The token
+// stream {@link TokenStream#index()} will return the same value before and
+// after any {@link #getText()} call.
+
+//
+// The rewriter only works on tokens that you have in the buffer and ignores the
+// current input cursor. If you are buffering tokens on-demand, calling
+// {@link #getText()} halfway through the input will only do rewrites for those
+// tokens in the first half of the file.
+
+//
+// Since the operations are done lazily at {@link #getText}-time, operations do
+// not screw up the token index values. That is, an insert operation at token
+// index {@code i} does not change the index values for tokens
+// {@code i}+1..n-1.
+
+//
+// Because operations never actually alter the buffer, you may always get the
+// original token stream back without undoing anything. Since the instructions
+// are queued up, you can easily simulate transactions and roll back any changes
+// if there is an error just by removing instructions. For example,
+
+//
+// CharStream input = new ANTLRFileStream("input");
+// TLexer lex = new TLexer(input);
+// CommonTokenStream tokens = new CommonTokenStream(lex);
+// T parser = new T(tokens);
+// TokenStreamRewriter rewriter = new TokenStreamRewriter(tokens);
+// parser.startRule();
+//
+
+//
+// Then in the rules, you can execute (assuming rewriter is visible):
+
+//
+// Token t,u;
+// ...
+// rewriter.insertAfter(t, "text to put after t");}
+// rewriter.insertAfter(u, "text after u");}
+// System.out.println(rewriter.getText());
+//
+
+//
+// You can also have multiple "instruction streams" and get multiple rewrites
+// from a single pass over the input. Just name the instruction streams and use
+// that name again when printing the buffer. This could be useful for generating
+// a C file and also its header file--all from the same buffer:
+
+//
+// rewriter.insertAfter("pass1", t, "text to put after t");}
+// rewriter.insertAfter("pass2", u, "text after u");}
+// System.out.println(rewriter.getText("pass1"));
+// System.out.println(rewriter.getText("pass2"));
+//
+
+//
+// If you don't use named rewrite streams, a "default" stream is used as the
+// first example shows.
+
+const (
+ DefaultProgramName = "default"
+ ProgramInitSize = 100
+ MinTokenIndex = 0
+)
+
+// Define the rewrite operation hierarchy
+
+type RewriteOperation interface {
+
+ // Execute the rewrite operation by possibly adding to the buffer.
+ // Return the index of the next token to operate on.
+ Execute(buffer *bytes.Buffer) int
+ String() string
+ GetInstructionIndex() int
+ GetIndex() int
+ GetText() string
+ GetOpName() string
+ GetTokens() TokenStream
+ SetInstructionIndex(val int)
+ SetIndex(int)
+ SetText(string)
+ SetOpName(string)
+ SetTokens(TokenStream)
+}
+
+type BaseRewriteOperation struct {
+ //Current index of rewrites list
+ instructionIndex int
+ //Token buffer index
+ index int
+ //Substitution text
+ text string
+ //Actual operation name
+ opName string
+ //Pointer to token steam
+ tokens TokenStream
+}
+
+func (op *BaseRewriteOperation) GetInstructionIndex() int {
+ return op.instructionIndex
+}
+
+func (op *BaseRewriteOperation) GetIndex() int {
+ return op.index
+}
+
+func (op *BaseRewriteOperation) GetText() string {
+ return op.text
+}
+
+func (op *BaseRewriteOperation) GetOpName() string {
+ return op.opName
+}
+
+func (op *BaseRewriteOperation) GetTokens() TokenStream {
+ return op.tokens
+}
+
+func (op *BaseRewriteOperation) SetInstructionIndex(val int) {
+ op.instructionIndex = val
+}
+
+func (op *BaseRewriteOperation) SetIndex(val int) {
+ op.index = val
+}
+
+func (op *BaseRewriteOperation) SetText(val string) {
+ op.text = val
+}
+
+func (op *BaseRewriteOperation) SetOpName(val string) {
+ op.opName = val
+}
+
+func (op *BaseRewriteOperation) SetTokens(val TokenStream) {
+ op.tokens = val
+}
+
+func (op *BaseRewriteOperation) Execute(_ *bytes.Buffer) int {
+ return op.index
+}
+
+func (op *BaseRewriteOperation) String() string {
+ return fmt.Sprintf("<%s@%d:\"%s\">",
+ op.opName,
+ op.tokens.Get(op.GetIndex()),
+ op.text,
+ )
+
+}
+
+type InsertBeforeOp struct {
+ BaseRewriteOperation
+}
+
+func NewInsertBeforeOp(index int, text string, stream TokenStream) *InsertBeforeOp {
+ return &InsertBeforeOp{BaseRewriteOperation: BaseRewriteOperation{
+ index: index,
+ text: text,
+ opName: "InsertBeforeOp",
+ tokens: stream,
+ }}
+}
+
+func (op *InsertBeforeOp) Execute(buffer *bytes.Buffer) int {
+ buffer.WriteString(op.text)
+ if op.tokens.Get(op.index).GetTokenType() != TokenEOF {
+ buffer.WriteString(op.tokens.Get(op.index).GetText())
+ }
+ return op.index + 1
+}
+
+func (op *InsertBeforeOp) String() string {
+ return op.BaseRewriteOperation.String()
+}
+
+// InsertAfterOp distinguishes between insert after/before to do the "insert after" instructions
+// first and then the "insert before" instructions at same index. Implementation
+// of "insert after" is "insert before index+1".
+type InsertAfterOp struct {
+ BaseRewriteOperation
+}
+
+func NewInsertAfterOp(index int, text string, stream TokenStream) *InsertAfterOp {
+ return &InsertAfterOp{
+ BaseRewriteOperation: BaseRewriteOperation{
+ index: index + 1,
+ text: text,
+ tokens: stream,
+ },
+ }
+}
+
+func (op *InsertAfterOp) Execute(buffer *bytes.Buffer) int {
+ buffer.WriteString(op.text)
+ if op.tokens.Get(op.index).GetTokenType() != TokenEOF {
+ buffer.WriteString(op.tokens.Get(op.index).GetText())
+ }
+ return op.index + 1
+}
+
+func (op *InsertAfterOp) String() string {
+ return op.BaseRewriteOperation.String()
+}
+
+// ReplaceOp tries to replace range from x..y with (y-x)+1 ReplaceOp
+// instructions.
+type ReplaceOp struct {
+ BaseRewriteOperation
+ LastIndex int
+}
+
+func NewReplaceOp(from, to int, text string, stream TokenStream) *ReplaceOp {
+ return &ReplaceOp{
+ BaseRewriteOperation: BaseRewriteOperation{
+ index: from,
+ text: text,
+ opName: "ReplaceOp",
+ tokens: stream,
+ },
+ LastIndex: to,
+ }
+}
+
+func (op *ReplaceOp) Execute(buffer *bytes.Buffer) int {
+ if op.text != "" {
+ buffer.WriteString(op.text)
+ }
+ return op.LastIndex + 1
+}
+
+func (op *ReplaceOp) String() string {
+ if op.text == "" {
+ return fmt.Sprintf("",
+ op.tokens.Get(op.index), op.tokens.Get(op.LastIndex))
+ }
+ return fmt.Sprintf("",
+ op.tokens.Get(op.index), op.tokens.Get(op.LastIndex), op.text)
+}
+
+type TokenStreamRewriter struct {
+ //Our source stream
+ tokens TokenStream
+ // You may have multiple, named streams of rewrite operations.
+ // I'm calling these things "programs."
+ // Maps String (name) → rewrite (List)
+ programs map[string][]RewriteOperation
+ lastRewriteTokenIndexes map[string]int
+}
+
+func NewTokenStreamRewriter(tokens TokenStream) *TokenStreamRewriter {
+ return &TokenStreamRewriter{
+ tokens: tokens,
+ programs: map[string][]RewriteOperation{
+ DefaultProgramName: make([]RewriteOperation, 0, ProgramInitSize),
+ },
+ lastRewriteTokenIndexes: map[string]int{},
+ }
+}
+
+func (tsr *TokenStreamRewriter) GetTokenStream() TokenStream {
+ return tsr.tokens
+}
+
+// Rollback the instruction stream for a program so that
+// the indicated instruction (via instructionIndex) is no
+// longer in the stream. UNTESTED!
+func (tsr *TokenStreamRewriter) Rollback(programName string, instructionIndex int) {
+ is, ok := tsr.programs[programName]
+ if ok {
+ tsr.programs[programName] = is[MinTokenIndex:instructionIndex]
+ }
+}
+
+func (tsr *TokenStreamRewriter) RollbackDefault(instructionIndex int) {
+ tsr.Rollback(DefaultProgramName, instructionIndex)
+}
+
+// DeleteProgram Reset the program so that no instructions exist
+func (tsr *TokenStreamRewriter) DeleteProgram(programName string) {
+ tsr.Rollback(programName, MinTokenIndex) //TODO: double test on that cause lower bound is not included
+}
+
+func (tsr *TokenStreamRewriter) DeleteProgramDefault() {
+ tsr.DeleteProgram(DefaultProgramName)
+}
+
+func (tsr *TokenStreamRewriter) InsertAfter(programName string, index int, text string) {
+ // to insert after, just insert before next index (even if past end)
+ var op RewriteOperation = NewInsertAfterOp(index, text, tsr.tokens)
+ rewrites := tsr.GetProgram(programName)
+ op.SetInstructionIndex(len(rewrites))
+ tsr.AddToProgram(programName, op)
+}
+
+func (tsr *TokenStreamRewriter) InsertAfterDefault(index int, text string) {
+ tsr.InsertAfter(DefaultProgramName, index, text)
+}
+
+func (tsr *TokenStreamRewriter) InsertAfterToken(programName string, token Token, text string) {
+ tsr.InsertAfter(programName, token.GetTokenIndex(), text)
+}
+
+func (tsr *TokenStreamRewriter) InsertBefore(programName string, index int, text string) {
+ var op RewriteOperation = NewInsertBeforeOp(index, text, tsr.tokens)
+ rewrites := tsr.GetProgram(programName)
+ op.SetInstructionIndex(len(rewrites))
+ tsr.AddToProgram(programName, op)
+}
+
+func (tsr *TokenStreamRewriter) InsertBeforeDefault(index int, text string) {
+ tsr.InsertBefore(DefaultProgramName, index, text)
+}
+
+func (tsr *TokenStreamRewriter) InsertBeforeToken(programName string, token Token, text string) {
+ tsr.InsertBefore(programName, token.GetTokenIndex(), text)
+}
+
+func (tsr *TokenStreamRewriter) Replace(programName string, from, to int, text string) {
+ if from > to || from < 0 || to < 0 || to >= tsr.tokens.Size() {
+ panic(fmt.Sprintf("replace: range invalid: %d..%d(size=%d)",
+ from, to, tsr.tokens.Size()))
+ }
+ var op RewriteOperation = NewReplaceOp(from, to, text, tsr.tokens)
+ rewrites := tsr.GetProgram(programName)
+ op.SetInstructionIndex(len(rewrites))
+ tsr.AddToProgram(programName, op)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceDefault(from, to int, text string) {
+ tsr.Replace(DefaultProgramName, from, to, text)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceDefaultPos(index int, text string) {
+ tsr.ReplaceDefault(index, index, text)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceToken(programName string, from, to Token, text string) {
+ tsr.Replace(programName, from.GetTokenIndex(), to.GetTokenIndex(), text)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceTokenDefault(from, to Token, text string) {
+ tsr.ReplaceToken(DefaultProgramName, from, to, text)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceTokenDefaultPos(index Token, text string) {
+ tsr.ReplaceTokenDefault(index, index, text)
+}
+
+func (tsr *TokenStreamRewriter) Delete(programName string, from, to int) {
+ tsr.Replace(programName, from, to, "")
+}
+
+func (tsr *TokenStreamRewriter) DeleteDefault(from, to int) {
+ tsr.Delete(DefaultProgramName, from, to)
+}
+
+func (tsr *TokenStreamRewriter) DeleteDefaultPos(index int) {
+ tsr.DeleteDefault(index, index)
+}
+
+func (tsr *TokenStreamRewriter) DeleteToken(programName string, from, to Token) {
+ tsr.ReplaceToken(programName, from, to, "")
+}
+
+func (tsr *TokenStreamRewriter) DeleteTokenDefault(from, to Token) {
+ tsr.DeleteToken(DefaultProgramName, from, to)
+}
+
+func (tsr *TokenStreamRewriter) GetLastRewriteTokenIndex(programName string) int {
+ i, ok := tsr.lastRewriteTokenIndexes[programName]
+ if !ok {
+ return -1
+ }
+ return i
+}
+
+func (tsr *TokenStreamRewriter) GetLastRewriteTokenIndexDefault() int {
+ return tsr.GetLastRewriteTokenIndex(DefaultProgramName)
+}
+
+func (tsr *TokenStreamRewriter) SetLastRewriteTokenIndex(programName string, i int) {
+ tsr.lastRewriteTokenIndexes[programName] = i
+}
+
+func (tsr *TokenStreamRewriter) InitializeProgram(name string) []RewriteOperation {
+ is := make([]RewriteOperation, 0, ProgramInitSize)
+ tsr.programs[name] = is
+ return is
+}
+
+func (tsr *TokenStreamRewriter) AddToProgram(name string, op RewriteOperation) {
+ is := tsr.GetProgram(name)
+ is = append(is, op)
+ tsr.programs[name] = is
+}
+
+func (tsr *TokenStreamRewriter) GetProgram(name string) []RewriteOperation {
+ is, ok := tsr.programs[name]
+ if !ok {
+ is = tsr.InitializeProgram(name)
+ }
+ return is
+}
+
+// GetTextDefault returns the text from the original tokens altered per the
+// instructions given to this rewriter.
+func (tsr *TokenStreamRewriter) GetTextDefault() string {
+ return tsr.GetText(
+ DefaultProgramName,
+ NewInterval(0, tsr.tokens.Size()-1))
+}
+
+// GetText returns the text from the original tokens altered per the
+// instructions given to this rewriter.
+func (tsr *TokenStreamRewriter) GetText(programName string, interval Interval) string {
+ rewrites := tsr.programs[programName]
+ start := interval.Start
+ stop := interval.Stop
+ // ensure start/end are in range
+ stop = min(stop, tsr.tokens.Size()-1)
+ start = max(start, 0)
+ if len(rewrites) == 0 {
+ return tsr.tokens.GetTextFromInterval(interval) // no instructions to execute
+ }
+ buf := bytes.Buffer{}
+ // First, optimize instruction stream
+ indexToOp := reduceToSingleOperationPerIndex(rewrites)
+ // Walk buffer, executing instructions and emitting tokens
+ for i := start; i <= stop && i < tsr.tokens.Size(); {
+ op := indexToOp[i]
+ delete(indexToOp, i) // remove so any left have index size-1
+ t := tsr.tokens.Get(i)
+ if op == nil {
+ // no operation at that index, just dump token
+ if t.GetTokenType() != TokenEOF {
+ buf.WriteString(t.GetText())
+ }
+ i++ // move to next token
+ } else {
+ i = op.Execute(&buf) // execute operation and skip
+ }
+ }
+ // include stuff after end if it's last index in buffer
+ // So, if they did an insertAfter(lastValidIndex, "foo"), include
+ // foo if end==lastValidIndex.
+ if stop == tsr.tokens.Size()-1 {
+ // Scan any remaining operations after last token
+ // should be included (they will be inserts).
+ for _, op := range indexToOp {
+ if op.GetIndex() >= tsr.tokens.Size()-1 {
+ buf.WriteString(op.GetText())
+ }
+ }
+ }
+ return buf.String()
+}
+
+// reduceToSingleOperationPerIndex combines operations and report invalid operations (like
+// overlapping replaces that are not completed nested). Inserts to
+// same index need to be combined etc...
+//
+// Here are the cases:
+//
+// I.i.u I.j.v leave alone, non-overlapping
+// I.i.u I.i.v combine: Iivu
+//
+// R.i-j.u R.x-y.v | i-j in x-y delete first R
+// R.i-j.u R.i-j.v delete first R
+// R.i-j.u R.x-y.v | x-y in i-j ERROR
+// R.i-j.u R.x-y.v | boundaries overlap ERROR
+//
+// Delete special case of replace (text==null):
+// D.i-j.u D.x-y.v | boundaries overlap combine to max(min)..max(right)
+//
+// I.i.u R.x-y.v | i in (x+1)-y delete I (since insert before
+// we're not deleting i)
+// I.i.u R.x-y.v | i not in (x+1)-y leave alone, non-overlapping
+// R.x-y.v I.i.u | i in x-y ERROR
+// R.x-y.v I.x.u R.x-y.uv (combine, delete I)
+// R.x-y.v I.i.u | i not in x-y leave alone, non-overlapping
+//
+// I.i.u = insert u before op @ index i
+// R.x-y.u = replace x-y indexed tokens with u
+//
+// First we need to examine replaces. For any replace op:
+//
+// 1. wipe out any insertions before op within that range.
+// 2. Drop any replace op before that is contained completely within
+// that range.
+// 3. Throw exception upon boundary overlap with any previous replace.
+//
+// Then we can deal with inserts:
+//
+// 1. for any inserts to same index, combine even if not adjacent.
+// 2. for any prior replace with same left boundary, combine this
+// insert with replace and delete this 'replace'.
+// 3. throw exception if index in same range as previous replace
+//
+// Don't actually delete; make op null in list. Easier to walk list.
+// Later we can throw as we add to index → op map.
+//
+// Note that I.2 R.2-2 will wipe out I.2 even though, technically, the
+// inserted stuff would be before the 'replace' range. But, if you
+// add tokens in front of a method body '{' and then delete the method
+// body, I think the stuff before the '{' you added should disappear too.
+//
+// The func returns a map from token index to operation.
+func reduceToSingleOperationPerIndex(rewrites []RewriteOperation) map[int]RewriteOperation {
+ // WALK REPLACES
+ for i := 0; i < len(rewrites); i++ {
+ op := rewrites[i]
+ if op == nil {
+ continue
+ }
+ rop, ok := op.(*ReplaceOp)
+ if !ok {
+ continue
+ }
+ // Wipe prior inserts within range
+ for j := 0; j < i && j < len(rewrites); j++ {
+ if iop, ok := rewrites[j].(*InsertBeforeOp); ok {
+ if iop.index == rop.index {
+ // E.g., insert before 2, delete 2..2; update replace
+ // text to include insert before, kill insert
+ rewrites[iop.instructionIndex] = nil
+ if rop.text != "" {
+ rop.text = iop.text + rop.text
+ } else {
+ rop.text = iop.text
+ }
+ } else if iop.index > rop.index && iop.index <= rop.LastIndex {
+ // delete insert as it's a no-op.
+ rewrites[iop.instructionIndex] = nil
+ }
+ }
+ }
+ // Drop any prior replaces contained within
+ for j := 0; j < i && j < len(rewrites); j++ {
+ if prevop, ok := rewrites[j].(*ReplaceOp); ok {
+ if prevop.index >= rop.index && prevop.LastIndex <= rop.LastIndex {
+ // delete replace as it's a no-op.
+ rewrites[prevop.instructionIndex] = nil
+ continue
+ }
+ // throw exception unless disjoint or identical
+ disjoint := prevop.LastIndex < rop.index || prevop.index > rop.LastIndex
+ // Delete special case of replace (text==null):
+ // D.i-j.u D.x-y.v | boundaries overlap combine to max(min)..max(right)
+ if prevop.text == "" && rop.text == "" && !disjoint {
+ rewrites[prevop.instructionIndex] = nil
+ rop.index = min(prevop.index, rop.index)
+ rop.LastIndex = max(prevop.LastIndex, rop.LastIndex)
+ } else if !disjoint {
+ panic("replace op boundaries of " + rop.String() + " overlap with previous " + prevop.String())
+ }
+ }
+ }
+ }
+ // WALK INSERTS
+ for i := 0; i < len(rewrites); i++ {
+ op := rewrites[i]
+ if op == nil {
+ continue
+ }
+ //hack to replicate inheritance in composition
+ _, iok := rewrites[i].(*InsertBeforeOp)
+ _, aok := rewrites[i].(*InsertAfterOp)
+ if !iok && !aok {
+ continue
+ }
+ iop := rewrites[i]
+ // combine current insert with prior if any at same index
+ // deviating a bit from TokenStreamRewriter.java - hard to incorporate inheritance logic
+ for j := 0; j < i && j < len(rewrites); j++ {
+ if nextIop, ok := rewrites[j].(*InsertAfterOp); ok {
+ if nextIop.index == iop.GetIndex() {
+ iop.SetText(nextIop.text + iop.GetText())
+ rewrites[j] = nil
+ }
+ }
+ if prevIop, ok := rewrites[j].(*InsertBeforeOp); ok {
+ if prevIop.index == iop.GetIndex() {
+ iop.SetText(iop.GetText() + prevIop.text)
+ rewrites[prevIop.instructionIndex] = nil
+ }
+ }
+ }
+ // look for replaces where iop.index is in range; error
+ for j := 0; j < i && j < len(rewrites); j++ {
+ if rop, ok := rewrites[j].(*ReplaceOp); ok {
+ if iop.GetIndex() == rop.index {
+ rop.text = iop.GetText() + rop.text
+ rewrites[i] = nil
+ continue
+ }
+ if iop.GetIndex() >= rop.index && iop.GetIndex() <= rop.LastIndex {
+ panic("insert op " + iop.String() + " within boundaries of previous " + rop.String())
+ }
+ }
+ }
+ }
+ m := map[int]RewriteOperation{}
+ for i := 0; i < len(rewrites); i++ {
+ op := rewrites[i]
+ if op == nil {
+ continue
+ }
+ if _, ok := m[op.GetIndex()]; ok {
+ panic("should only be one op per index")
+ }
+ m[op.GetIndex()] = op
+ }
+ return m
+}
+
+/*
+ Quick fixing Go lack of overloads
+*/
+
+func max(a, b int) int {
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
+func min(a, b int) int {
+ if a < b {
+ return a
+ } else {
+ return b
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/trace_listener.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/trace_listener.go
new file mode 100644
index 0000000..7b663bf
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/trace_listener.go
@@ -0,0 +1,32 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import "fmt"
+
+type TraceListener struct {
+ parser *BaseParser
+}
+
+func NewTraceListener(parser *BaseParser) *TraceListener {
+ tl := new(TraceListener)
+ tl.parser = parser
+ return tl
+}
+
+func (t *TraceListener) VisitErrorNode(_ ErrorNode) {
+}
+
+func (t *TraceListener) EnterEveryRule(ctx ParserRuleContext) {
+ fmt.Println("enter " + t.parser.GetRuleNames()[ctx.GetRuleIndex()] + ", LT(1)=" + t.parser.input.LT(1).GetText())
+}
+
+func (t *TraceListener) VisitTerminal(node TerminalNode) {
+ fmt.Println("consume " + fmt.Sprint(node.GetSymbol()) + " rule " + t.parser.GetRuleNames()[t.parser.ctx.GetRuleIndex()])
+}
+
+func (t *TraceListener) ExitEveryRule(ctx ParserRuleContext) {
+ fmt.Println("exit " + t.parser.GetRuleNames()[ctx.GetRuleIndex()] + ", LT(1)=" + t.parser.input.LT(1).GetText())
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/transition.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/transition.go
new file mode 100644
index 0000000..313b0fc
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/transition.go
@@ -0,0 +1,439 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+// atom, set, epsilon, action, predicate, rule transitions.
+//
+// This is a one way link. It emanates from a state (usually via a list of
+// transitions) and has a target state.
+//
+// Since we never have to change the ATN transitions once we construct it,
+// the states. We'll use the term Edge for the DFA to distinguish them from
+// ATN transitions.
+
+type Transition interface {
+ getTarget() ATNState
+ setTarget(ATNState)
+ getIsEpsilon() bool
+ getLabel() *IntervalSet
+ getSerializationType() int
+ Matches(int, int, int) bool
+}
+
+type BaseTransition struct {
+ target ATNState
+ isEpsilon bool
+ label int
+ intervalSet *IntervalSet
+ serializationType int
+}
+
+func NewBaseTransition(target ATNState) *BaseTransition {
+
+ if target == nil {
+ panic("target cannot be nil.")
+ }
+
+ t := new(BaseTransition)
+
+ t.target = target
+ // Are we epsilon, action, sempred?
+ t.isEpsilon = false
+ t.intervalSet = nil
+
+ return t
+}
+
+func (t *BaseTransition) getTarget() ATNState {
+ return t.target
+}
+
+func (t *BaseTransition) setTarget(s ATNState) {
+ t.target = s
+}
+
+func (t *BaseTransition) getIsEpsilon() bool {
+ return t.isEpsilon
+}
+
+func (t *BaseTransition) getLabel() *IntervalSet {
+ return t.intervalSet
+}
+
+func (t *BaseTransition) getSerializationType() int {
+ return t.serializationType
+}
+
+func (t *BaseTransition) Matches(_, _, _ int) bool {
+ panic("Not implemented")
+}
+
+const (
+ TransitionEPSILON = 1
+ TransitionRANGE = 2
+ TransitionRULE = 3
+ TransitionPREDICATE = 4 // e.g., {isType(input.LT(1))}?
+ TransitionATOM = 5
+ TransitionACTION = 6
+ TransitionSET = 7 // ~(A|B) or ~atom, wildcard, which convert to next 2
+ TransitionNOTSET = 8
+ TransitionWILDCARD = 9
+ TransitionPRECEDENCE = 10
+)
+
+//goland:noinspection GoUnusedGlobalVariable
+var TransitionserializationNames = []string{
+ "INVALID",
+ "EPSILON",
+ "RANGE",
+ "RULE",
+ "PREDICATE",
+ "ATOM",
+ "ACTION",
+ "SET",
+ "NOT_SET",
+ "WILDCARD",
+ "PRECEDENCE",
+}
+
+//var TransitionserializationTypes struct {
+// EpsilonTransition int
+// RangeTransition int
+// RuleTransition int
+// PredicateTransition int
+// AtomTransition int
+// ActionTransition int
+// SetTransition int
+// NotSetTransition int
+// WildcardTransition int
+// PrecedencePredicateTransition int
+//}{
+// TransitionEPSILON,
+// TransitionRANGE,
+// TransitionRULE,
+// TransitionPREDICATE,
+// TransitionATOM,
+// TransitionACTION,
+// TransitionSET,
+// TransitionNOTSET,
+// TransitionWILDCARD,
+// TransitionPRECEDENCE
+//}
+
+// AtomTransition
+// TODO: make all transitions sets? no, should remove set edges
+type AtomTransition struct {
+ BaseTransition
+}
+
+func NewAtomTransition(target ATNState, intervalSet int) *AtomTransition {
+ t := &AtomTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ serializationType: TransitionATOM,
+ label: intervalSet,
+ isEpsilon: false,
+ },
+ }
+ t.intervalSet = t.makeLabel()
+
+ return t
+}
+
+func (t *AtomTransition) makeLabel() *IntervalSet {
+ s := NewIntervalSet()
+ s.addOne(t.label)
+ return s
+}
+
+func (t *AtomTransition) Matches(symbol, _, _ int) bool {
+ return t.label == symbol
+}
+
+func (t *AtomTransition) String() string {
+ return strconv.Itoa(t.label)
+}
+
+type RuleTransition struct {
+ BaseTransition
+ followState ATNState
+ ruleIndex, precedence int
+}
+
+func NewRuleTransition(ruleStart ATNState, ruleIndex, precedence int, followState ATNState) *RuleTransition {
+ return &RuleTransition{
+ BaseTransition: BaseTransition{
+ target: ruleStart,
+ isEpsilon: true,
+ serializationType: TransitionRULE,
+ },
+ ruleIndex: ruleIndex,
+ precedence: precedence,
+ followState: followState,
+ }
+}
+
+func (t *RuleTransition) Matches(_, _, _ int) bool {
+ return false
+}
+
+type EpsilonTransition struct {
+ BaseTransition
+ outermostPrecedenceReturn int
+}
+
+func NewEpsilonTransition(target ATNState, outermostPrecedenceReturn int) *EpsilonTransition {
+ return &EpsilonTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ serializationType: TransitionEPSILON,
+ isEpsilon: true,
+ },
+ outermostPrecedenceReturn: outermostPrecedenceReturn,
+ }
+}
+
+func (t *EpsilonTransition) Matches(_, _, _ int) bool {
+ return false
+}
+
+func (t *EpsilonTransition) String() string {
+ return "epsilon"
+}
+
+type RangeTransition struct {
+ BaseTransition
+ start, stop int
+}
+
+func NewRangeTransition(target ATNState, start, stop int) *RangeTransition {
+ t := &RangeTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ serializationType: TransitionRANGE,
+ isEpsilon: false,
+ },
+ start: start,
+ stop: stop,
+ }
+ t.intervalSet = t.makeLabel()
+ return t
+}
+
+func (t *RangeTransition) makeLabel() *IntervalSet {
+ s := NewIntervalSet()
+ s.addRange(t.start, t.stop)
+ return s
+}
+
+func (t *RangeTransition) Matches(symbol, _, _ int) bool {
+ return symbol >= t.start && symbol <= t.stop
+}
+
+func (t *RangeTransition) String() string {
+ var sb strings.Builder
+ sb.WriteByte('\'')
+ sb.WriteRune(rune(t.start))
+ sb.WriteString("'..'")
+ sb.WriteRune(rune(t.stop))
+ sb.WriteByte('\'')
+ return sb.String()
+}
+
+type AbstractPredicateTransition interface {
+ Transition
+ IAbstractPredicateTransitionFoo()
+}
+
+type BaseAbstractPredicateTransition struct {
+ BaseTransition
+}
+
+func NewBasePredicateTransition(target ATNState) *BaseAbstractPredicateTransition {
+ return &BaseAbstractPredicateTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ },
+ }
+}
+
+func (a *BaseAbstractPredicateTransition) IAbstractPredicateTransitionFoo() {}
+
+type PredicateTransition struct {
+ BaseAbstractPredicateTransition
+ isCtxDependent bool
+ ruleIndex, predIndex int
+}
+
+func NewPredicateTransition(target ATNState, ruleIndex, predIndex int, isCtxDependent bool) *PredicateTransition {
+ return &PredicateTransition{
+ BaseAbstractPredicateTransition: BaseAbstractPredicateTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ serializationType: TransitionPREDICATE,
+ isEpsilon: true,
+ },
+ },
+ isCtxDependent: isCtxDependent,
+ ruleIndex: ruleIndex,
+ predIndex: predIndex,
+ }
+}
+
+func (t *PredicateTransition) Matches(_, _, _ int) bool {
+ return false
+}
+
+func (t *PredicateTransition) getPredicate() *Predicate {
+ return NewPredicate(t.ruleIndex, t.predIndex, t.isCtxDependent)
+}
+
+func (t *PredicateTransition) String() string {
+ return "pred_" + strconv.Itoa(t.ruleIndex) + ":" + strconv.Itoa(t.predIndex)
+}
+
+type ActionTransition struct {
+ BaseTransition
+ isCtxDependent bool
+ ruleIndex, actionIndex, predIndex int
+}
+
+func NewActionTransition(target ATNState, ruleIndex, actionIndex int, isCtxDependent bool) *ActionTransition {
+ return &ActionTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ serializationType: TransitionACTION,
+ isEpsilon: true,
+ },
+ isCtxDependent: isCtxDependent,
+ ruleIndex: ruleIndex,
+ actionIndex: actionIndex,
+ }
+}
+
+func (t *ActionTransition) Matches(_, _, _ int) bool {
+ return false
+}
+
+func (t *ActionTransition) String() string {
+ return "action_" + strconv.Itoa(t.ruleIndex) + ":" + strconv.Itoa(t.actionIndex)
+}
+
+type SetTransition struct {
+ BaseTransition
+}
+
+func NewSetTransition(target ATNState, set *IntervalSet) *SetTransition {
+ t := &SetTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ serializationType: TransitionSET,
+ },
+ }
+
+ if set != nil {
+ t.intervalSet = set
+ } else {
+ t.intervalSet = NewIntervalSet()
+ t.intervalSet.addOne(TokenInvalidType)
+ }
+ return t
+}
+
+func (t *SetTransition) Matches(symbol, _, _ int) bool {
+ return t.intervalSet.contains(symbol)
+}
+
+func (t *SetTransition) String() string {
+ return t.intervalSet.String()
+}
+
+type NotSetTransition struct {
+ SetTransition
+}
+
+func NewNotSetTransition(target ATNState, set *IntervalSet) *NotSetTransition {
+ t := &NotSetTransition{
+ SetTransition: SetTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ serializationType: TransitionNOTSET,
+ },
+ },
+ }
+ if set != nil {
+ t.intervalSet = set
+ } else {
+ t.intervalSet = NewIntervalSet()
+ t.intervalSet.addOne(TokenInvalidType)
+ }
+
+ return t
+}
+
+func (t *NotSetTransition) Matches(symbol, minVocabSymbol, maxVocabSymbol int) bool {
+ return symbol >= minVocabSymbol && symbol <= maxVocabSymbol && !t.intervalSet.contains(symbol)
+}
+
+func (t *NotSetTransition) String() string {
+ return "~" + t.intervalSet.String()
+}
+
+type WildcardTransition struct {
+ BaseTransition
+}
+
+func NewWildcardTransition(target ATNState) *WildcardTransition {
+ return &WildcardTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ serializationType: TransitionWILDCARD,
+ },
+ }
+}
+
+func (t *WildcardTransition) Matches(symbol, minVocabSymbol, maxVocabSymbol int) bool {
+ return symbol >= minVocabSymbol && symbol <= maxVocabSymbol
+}
+
+func (t *WildcardTransition) String() string {
+ return "."
+}
+
+type PrecedencePredicateTransition struct {
+ BaseAbstractPredicateTransition
+ precedence int
+}
+
+func NewPrecedencePredicateTransition(target ATNState, precedence int) *PrecedencePredicateTransition {
+ return &PrecedencePredicateTransition{
+ BaseAbstractPredicateTransition: BaseAbstractPredicateTransition{
+ BaseTransition: BaseTransition{
+ target: target,
+ serializationType: TransitionPRECEDENCE,
+ isEpsilon: true,
+ },
+ },
+ precedence: precedence,
+ }
+}
+
+func (t *PrecedencePredicateTransition) Matches(_, _, _ int) bool {
+ return false
+}
+
+func (t *PrecedencePredicateTransition) getPredicate() *PrecedencePredicate {
+ return NewPrecedencePredicate(t.precedence)
+}
+
+func (t *PrecedencePredicateTransition) String() string {
+ return fmt.Sprint(t.precedence) + " >= _p"
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/tree.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/tree.go
new file mode 100644
index 0000000..c288420
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/tree.go
@@ -0,0 +1,304 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+// The basic notion of a tree has a parent, a payload, and a list of children.
+// It is the most abstract interface for all the trees used by ANTLR.
+///
+
+var TreeInvalidInterval = NewInterval(-1, -2)
+
+type Tree interface {
+ GetParent() Tree
+ SetParent(Tree)
+ GetPayload() interface{}
+ GetChild(i int) Tree
+ GetChildCount() int
+ GetChildren() []Tree
+}
+
+type SyntaxTree interface {
+ Tree
+ GetSourceInterval() Interval
+}
+
+type ParseTree interface {
+ SyntaxTree
+ Accept(Visitor ParseTreeVisitor) interface{}
+ GetText() string
+ ToStringTree([]string, Recognizer) string
+}
+
+type RuleNode interface {
+ ParseTree
+ GetRuleContext() RuleContext
+}
+
+type TerminalNode interface {
+ ParseTree
+ GetSymbol() Token
+}
+
+type ErrorNode interface {
+ TerminalNode
+
+ errorNode()
+}
+
+type ParseTreeVisitor interface {
+ Visit(tree ParseTree) interface{}
+ VisitChildren(node RuleNode) interface{}
+ VisitTerminal(node TerminalNode) interface{}
+ VisitErrorNode(node ErrorNode) interface{}
+}
+
+type BaseParseTreeVisitor struct{}
+
+var _ ParseTreeVisitor = &BaseParseTreeVisitor{}
+
+func (v *BaseParseTreeVisitor) Visit(tree ParseTree) interface{} { return tree.Accept(v) }
+func (v *BaseParseTreeVisitor) VisitChildren(_ RuleNode) interface{} { return nil }
+func (v *BaseParseTreeVisitor) VisitTerminal(_ TerminalNode) interface{} { return nil }
+func (v *BaseParseTreeVisitor) VisitErrorNode(_ ErrorNode) interface{} { return nil }
+
+// TODO: Implement this?
+//func (this ParseTreeVisitor) Visit(ctx) {
+// if (Utils.isArray(ctx)) {
+// self := this
+// return ctx.map(function(child) { return VisitAtom(self, child)})
+// } else {
+// return VisitAtom(this, ctx)
+// }
+//}
+//
+//func VisitAtom(Visitor, ctx) {
+// if (ctx.parser == nil) { //is terminal
+// return
+// }
+//
+// name := ctx.parser.ruleNames[ctx.ruleIndex]
+// funcName := "Visit" + Utils.titleCase(name)
+//
+// return Visitor[funcName](ctx)
+//}
+
+type ParseTreeListener interface {
+ VisitTerminal(node TerminalNode)
+ VisitErrorNode(node ErrorNode)
+ EnterEveryRule(ctx ParserRuleContext)
+ ExitEveryRule(ctx ParserRuleContext)
+}
+
+type BaseParseTreeListener struct{}
+
+var _ ParseTreeListener = &BaseParseTreeListener{}
+
+func (l *BaseParseTreeListener) VisitTerminal(_ TerminalNode) {}
+func (l *BaseParseTreeListener) VisitErrorNode(_ ErrorNode) {}
+func (l *BaseParseTreeListener) EnterEveryRule(_ ParserRuleContext) {}
+func (l *BaseParseTreeListener) ExitEveryRule(_ ParserRuleContext) {}
+
+type TerminalNodeImpl struct {
+ parentCtx RuleContext
+ symbol Token
+}
+
+var _ TerminalNode = &TerminalNodeImpl{}
+
+func NewTerminalNodeImpl(symbol Token) *TerminalNodeImpl {
+ tn := new(TerminalNodeImpl)
+
+ tn.parentCtx = nil
+ tn.symbol = symbol
+
+ return tn
+}
+
+func (t *TerminalNodeImpl) GetChild(_ int) Tree {
+ return nil
+}
+
+func (t *TerminalNodeImpl) GetChildren() []Tree {
+ return nil
+}
+
+func (t *TerminalNodeImpl) SetChildren(_ []Tree) {
+ panic("Cannot set children on terminal node")
+}
+
+func (t *TerminalNodeImpl) GetSymbol() Token {
+ return t.symbol
+}
+
+func (t *TerminalNodeImpl) GetParent() Tree {
+ return t.parentCtx
+}
+
+func (t *TerminalNodeImpl) SetParent(tree Tree) {
+ t.parentCtx = tree.(RuleContext)
+}
+
+func (t *TerminalNodeImpl) GetPayload() interface{} {
+ return t.symbol
+}
+
+func (t *TerminalNodeImpl) GetSourceInterval() Interval {
+ if t.symbol == nil {
+ return TreeInvalidInterval
+ }
+ tokenIndex := t.symbol.GetTokenIndex()
+ return NewInterval(tokenIndex, tokenIndex)
+}
+
+func (t *TerminalNodeImpl) GetChildCount() int {
+ return 0
+}
+
+func (t *TerminalNodeImpl) Accept(v ParseTreeVisitor) interface{} {
+ return v.VisitTerminal(t)
+}
+
+func (t *TerminalNodeImpl) GetText() string {
+ return t.symbol.GetText()
+}
+
+func (t *TerminalNodeImpl) String() string {
+ if t.symbol.GetTokenType() == TokenEOF {
+ return ""
+ }
+
+ return t.symbol.GetText()
+}
+
+func (t *TerminalNodeImpl) ToStringTree(_ []string, _ Recognizer) string {
+ return t.String()
+}
+
+// Represents a token that was consumed during reSynchronization
+// rather than during a valid Match operation. For example,
+// we will create this kind of a node during single token insertion
+// and deletion as well as during "consume until error recovery set"
+// upon no viable alternative exceptions.
+
+type ErrorNodeImpl struct {
+ *TerminalNodeImpl
+}
+
+var _ ErrorNode = &ErrorNodeImpl{}
+
+func NewErrorNodeImpl(token Token) *ErrorNodeImpl {
+ en := new(ErrorNodeImpl)
+ en.TerminalNodeImpl = NewTerminalNodeImpl(token)
+ return en
+}
+
+func (e *ErrorNodeImpl) errorNode() {}
+
+func (e *ErrorNodeImpl) Accept(v ParseTreeVisitor) interface{} {
+ return v.VisitErrorNode(e)
+}
+
+type ParseTreeWalker struct {
+}
+
+func NewParseTreeWalker() *ParseTreeWalker {
+ return new(ParseTreeWalker)
+}
+
+// Walk performs a walk on the given parse tree starting at the root and going down recursively
+// with depth-first search. On each node, [EnterRule] is called before
+// recursively walking down into child nodes, then [ExitRule] is called after the recursive call to wind up.
+func (p *ParseTreeWalker) Walk(listener ParseTreeListener, t Tree) {
+ switch tt := t.(type) {
+ case ErrorNode:
+ listener.VisitErrorNode(tt)
+ case TerminalNode:
+ listener.VisitTerminal(tt)
+ default:
+ p.EnterRule(listener, t.(RuleNode))
+ for i := 0; i < t.GetChildCount(); i++ {
+ child := t.GetChild(i)
+ p.Walk(listener, child)
+ }
+ p.ExitRule(listener, t.(RuleNode))
+ }
+}
+
+// EnterRule enters a grammar rule by first triggering the generic event [ParseTreeListener].[EnterEveryRule]
+// then by triggering the event specific to the given parse tree node
+func (p *ParseTreeWalker) EnterRule(listener ParseTreeListener, r RuleNode) {
+ ctx := r.GetRuleContext().(ParserRuleContext)
+ listener.EnterEveryRule(ctx)
+ ctx.EnterRule(listener)
+}
+
+// ExitRule exits a grammar rule by first triggering the event specific to the given parse tree node
+// then by triggering the generic event [ParseTreeListener].ExitEveryRule
+func (p *ParseTreeWalker) ExitRule(listener ParseTreeListener, r RuleNode) {
+ ctx := r.GetRuleContext().(ParserRuleContext)
+ ctx.ExitRule(listener)
+ listener.ExitEveryRule(ctx)
+}
+
+//goland:noinspection GoUnusedGlobalVariable
+var ParseTreeWalkerDefault = NewParseTreeWalker()
+
+type IterativeParseTreeWalker struct {
+ *ParseTreeWalker
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func NewIterativeParseTreeWalker() *IterativeParseTreeWalker {
+ return new(IterativeParseTreeWalker)
+}
+
+func (i *IterativeParseTreeWalker) Walk(listener ParseTreeListener, t Tree) {
+ var stack []Tree
+ var indexStack []int
+ currentNode := t
+ currentIndex := 0
+
+ for currentNode != nil {
+ // pre-order visit
+ switch tt := currentNode.(type) {
+ case ErrorNode:
+ listener.VisitErrorNode(tt)
+ case TerminalNode:
+ listener.VisitTerminal(tt)
+ default:
+ i.EnterRule(listener, currentNode.(RuleNode))
+ }
+ // Move down to first child, if exists
+ if currentNode.GetChildCount() > 0 {
+ stack = append(stack, currentNode)
+ indexStack = append(indexStack, currentIndex)
+ currentIndex = 0
+ currentNode = currentNode.GetChild(0)
+ continue
+ }
+
+ for {
+ // post-order visit
+ if ruleNode, ok := currentNode.(RuleNode); ok {
+ i.ExitRule(listener, ruleNode)
+ }
+ // No parent, so no siblings
+ if len(stack) == 0 {
+ currentNode = nil
+ currentIndex = 0
+ break
+ }
+ // Move to next sibling if possible
+ currentIndex++
+ if stack[len(stack)-1].GetChildCount() > currentIndex {
+ currentNode = stack[len(stack)-1].GetChild(currentIndex)
+ break
+ }
+ // No next, sibling, so move up
+ currentNode, stack = stack[len(stack)-1], stack[:len(stack)-1]
+ currentIndex, indexStack = indexStack[len(indexStack)-1], indexStack[:len(indexStack)-1]
+ }
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/trees.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/trees.go
new file mode 100644
index 0000000..f44c05d
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/trees.go
@@ -0,0 +1,142 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import "fmt"
+
+/** A set of utility routines useful for all kinds of ANTLR trees. */
+
+// TreesStringTree prints out a whole tree in LISP form. [getNodeText] is used on the
+// node payloads to get the text for the nodes. Detects parse trees and extracts data appropriately.
+func TreesStringTree(tree Tree, ruleNames []string, recog Recognizer) string {
+
+ if recog != nil {
+ ruleNames = recog.GetRuleNames()
+ }
+
+ s := TreesGetNodeText(tree, ruleNames, nil)
+
+ s = EscapeWhitespace(s, false)
+ c := tree.GetChildCount()
+ if c == 0 {
+ return s
+ }
+ res := "(" + s + " "
+ if c > 0 {
+ s = TreesStringTree(tree.GetChild(0), ruleNames, nil)
+ res += s
+ }
+ for i := 1; i < c; i++ {
+ s = TreesStringTree(tree.GetChild(i), ruleNames, nil)
+ res += " " + s
+ }
+ res += ")"
+ return res
+}
+
+func TreesGetNodeText(t Tree, ruleNames []string, recog Parser) string {
+ if recog != nil {
+ ruleNames = recog.GetRuleNames()
+ }
+
+ if ruleNames != nil {
+ switch t2 := t.(type) {
+ case RuleNode:
+ t3 := t2.GetRuleContext()
+ altNumber := t3.GetAltNumber()
+
+ if altNumber != ATNInvalidAltNumber {
+ return fmt.Sprintf("%s:%d", ruleNames[t3.GetRuleIndex()], altNumber)
+ }
+ return ruleNames[t3.GetRuleIndex()]
+ case ErrorNode:
+ return fmt.Sprint(t2)
+ case TerminalNode:
+ if t2.GetSymbol() != nil {
+ return t2.GetSymbol().GetText()
+ }
+ }
+ }
+
+ // no recognition for rule names
+ payload := t.GetPayload()
+ if p2, ok := payload.(Token); ok {
+ return p2.GetText()
+ }
+
+ return fmt.Sprint(t.GetPayload())
+}
+
+// TreesGetChildren returns am ordered list of all children of this node
+//
+//goland:noinspection GoUnusedExportedFunction
+func TreesGetChildren(t Tree) []Tree {
+ list := make([]Tree, 0)
+ for i := 0; i < t.GetChildCount(); i++ {
+ list = append(list, t.GetChild(i))
+ }
+ return list
+}
+
+// TreesgetAncestors returns a list of all ancestors of this node. The first node of list is the root
+// and the last node is the parent of this node.
+//
+//goland:noinspection GoUnusedExportedFunction
+func TreesgetAncestors(t Tree) []Tree {
+ ancestors := make([]Tree, 0)
+ t = t.GetParent()
+ for t != nil {
+ f := []Tree{t}
+ ancestors = append(f, ancestors...)
+ t = t.GetParent()
+ }
+ return ancestors
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func TreesFindAllTokenNodes(t ParseTree, ttype int) []ParseTree {
+ return TreesfindAllNodes(t, ttype, true)
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func TreesfindAllRuleNodes(t ParseTree, ruleIndex int) []ParseTree {
+ return TreesfindAllNodes(t, ruleIndex, false)
+}
+
+func TreesfindAllNodes(t ParseTree, index int, findTokens bool) []ParseTree {
+ nodes := make([]ParseTree, 0)
+ treesFindAllNodes(t, index, findTokens, &nodes)
+ return nodes
+}
+
+func treesFindAllNodes(t ParseTree, index int, findTokens bool, nodes *[]ParseTree) {
+ // check this node (the root) first
+
+ t2, ok := t.(TerminalNode)
+ t3, ok2 := t.(ParserRuleContext)
+
+ if findTokens && ok {
+ if t2.GetSymbol().GetTokenType() == index {
+ *nodes = append(*nodes, t2)
+ }
+ } else if !findTokens && ok2 {
+ if t3.GetRuleIndex() == index {
+ *nodes = append(*nodes, t3)
+ }
+ }
+ // check children
+ for i := 0; i < t.GetChildCount(); i++ {
+ treesFindAllNodes(t.GetChild(i).(ParseTree), index, findTokens, nodes)
+ }
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func TreesDescendants(t ParseTree) []ParseTree {
+ nodes := []ParseTree{t}
+ for i := 0; i < t.GetChildCount(); i++ {
+ nodes = append(nodes, TreesDescendants(t.GetChild(i).(ParseTree))...)
+ }
+ return nodes
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/utils.go b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/utils.go
new file mode 100644
index 0000000..733d7df
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/antlr4-go/antlr/v4/utils.go
@@ -0,0 +1,328 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "math/bits"
+ "os"
+ "strconv"
+ "strings"
+ "syscall"
+)
+
+func intMin(a, b int) int {
+ if a < b {
+ return a
+ }
+ return b
+}
+
+func intMax(a, b int) int {
+ if a > b {
+ return a
+ }
+ return b
+}
+
+// A simple integer stack
+
+type IntStack []int
+
+var ErrEmptyStack = errors.New("stack is empty")
+
+func (s *IntStack) Pop() (int, error) {
+ l := len(*s) - 1
+ if l < 0 {
+ return 0, ErrEmptyStack
+ }
+ v := (*s)[l]
+ *s = (*s)[0:l]
+ return v, nil
+}
+
+func (s *IntStack) Push(e int) {
+ *s = append(*s, e)
+}
+
+const bitsPerWord = 64
+
+func indexForBit(bit int) int {
+ return bit / bitsPerWord
+}
+
+//goland:noinspection GoUnusedExportedFunction,GoUnusedFunction
+func wordForBit(data []uint64, bit int) uint64 {
+ idx := indexForBit(bit)
+ if idx >= len(data) {
+ return 0
+ }
+ return data[idx]
+}
+
+func maskForBit(bit int) uint64 {
+ return uint64(1) << (bit % bitsPerWord)
+}
+
+func wordsNeeded(bit int) int {
+ return indexForBit(bit) + 1
+}
+
+type BitSet struct {
+ data []uint64
+}
+
+// NewBitSet creates a new bitwise set
+// TODO: See if we can replace with the standard library's BitSet
+func NewBitSet() *BitSet {
+ return &BitSet{}
+}
+
+func (b *BitSet) add(value int) {
+ idx := indexForBit(value)
+ if idx >= len(b.data) {
+ size := wordsNeeded(value)
+ data := make([]uint64, size)
+ copy(data, b.data)
+ b.data = data
+ }
+ b.data[idx] |= maskForBit(value)
+}
+
+func (b *BitSet) clear(index int) {
+ idx := indexForBit(index)
+ if idx >= len(b.data) {
+ return
+ }
+ b.data[idx] &= ^maskForBit(index)
+}
+
+func (b *BitSet) or(set *BitSet) {
+ // Get min size necessary to represent the bits in both sets.
+ bLen := b.minLen()
+ setLen := set.minLen()
+ maxLen := intMax(bLen, setLen)
+ if maxLen > len(b.data) {
+ // Increase the size of len(b.data) to represent the bits in both sets.
+ data := make([]uint64, maxLen)
+ copy(data, b.data)
+ b.data = data
+ }
+ // len(b.data) is at least setLen.
+ for i := 0; i < setLen; i++ {
+ b.data[i] |= set.data[i]
+ }
+}
+
+func (b *BitSet) remove(value int) {
+ b.clear(value)
+}
+
+func (b *BitSet) contains(value int) bool {
+ idx := indexForBit(value)
+ if idx >= len(b.data) {
+ return false
+ }
+ return (b.data[idx] & maskForBit(value)) != 0
+}
+
+func (b *BitSet) minValue() int {
+ for i, v := range b.data {
+ if v == 0 {
+ continue
+ }
+ return i*bitsPerWord + bits.TrailingZeros64(v)
+ }
+ return 2147483647
+}
+
+func (b *BitSet) equals(other interface{}) bool {
+ otherBitSet, ok := other.(*BitSet)
+ if !ok {
+ return false
+ }
+
+ if b == otherBitSet {
+ return true
+ }
+
+ // We only compare set bits, so we cannot rely on the two slices having the same size. Its
+ // possible for two BitSets to have different slice lengths but the same set bits. So we only
+ // compare the relevant words and ignore the trailing zeros.
+ bLen := b.minLen()
+ otherLen := otherBitSet.minLen()
+
+ if bLen != otherLen {
+ return false
+ }
+
+ for i := 0; i < bLen; i++ {
+ if b.data[i] != otherBitSet.data[i] {
+ return false
+ }
+ }
+
+ return true
+}
+
+func (b *BitSet) minLen() int {
+ for i := len(b.data); i > 0; i-- {
+ if b.data[i-1] != 0 {
+ return i
+ }
+ }
+ return 0
+}
+
+func (b *BitSet) length() int {
+ cnt := 0
+ for _, val := range b.data {
+ cnt += bits.OnesCount64(val)
+ }
+ return cnt
+}
+
+func (b *BitSet) String() string {
+ vals := make([]string, 0, b.length())
+
+ for i, v := range b.data {
+ for v != 0 {
+ n := bits.TrailingZeros64(v)
+ vals = append(vals, strconv.Itoa(i*bitsPerWord+n))
+ v &= ^(uint64(1) << n)
+ }
+ }
+
+ return "{" + strings.Join(vals, ", ") + "}"
+}
+
+type AltDict struct {
+ data map[string]interface{}
+}
+
+func NewAltDict() *AltDict {
+ d := new(AltDict)
+ d.data = make(map[string]interface{})
+ return d
+}
+
+func (a *AltDict) Get(key string) interface{} {
+ key = "k-" + key
+ return a.data[key]
+}
+
+func (a *AltDict) put(key string, value interface{}) {
+ key = "k-" + key
+ a.data[key] = value
+}
+
+func (a *AltDict) values() []interface{} {
+ vs := make([]interface{}, len(a.data))
+ i := 0
+ for _, v := range a.data {
+ vs[i] = v
+ i++
+ }
+ return vs
+}
+
+func EscapeWhitespace(s string, escapeSpaces bool) string {
+
+ s = strings.Replace(s, "\t", "\\t", -1)
+ s = strings.Replace(s, "\n", "\\n", -1)
+ s = strings.Replace(s, "\r", "\\r", -1)
+ if escapeSpaces {
+ s = strings.Replace(s, " ", "\u00B7", -1)
+ }
+ return s
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func TerminalNodeToStringArray(sa []TerminalNode) []string {
+ st := make([]string, len(sa))
+
+ for i, s := range sa {
+ st[i] = fmt.Sprintf("%v", s)
+ }
+
+ return st
+}
+
+//goland:noinspection GoUnusedExportedFunction
+func PrintArrayJavaStyle(sa []string) string {
+ var buffer bytes.Buffer
+
+ buffer.WriteString("[")
+
+ for i, s := range sa {
+ buffer.WriteString(s)
+ if i != len(sa)-1 {
+ buffer.WriteString(", ")
+ }
+ }
+
+ buffer.WriteString("]")
+
+ return buffer.String()
+}
+
+// murmur hash
+func murmurInit(seed int) int {
+ return seed
+}
+
+func murmurUpdate(h int, value int) int {
+ const c1 uint32 = 0xCC9E2D51
+ const c2 uint32 = 0x1B873593
+ const r1 uint32 = 15
+ const r2 uint32 = 13
+ const m uint32 = 5
+ const n uint32 = 0xE6546B64
+
+ k := uint32(value)
+ k *= c1
+ k = (k << r1) | (k >> (32 - r1))
+ k *= c2
+
+ hash := uint32(h) ^ k
+ hash = (hash << r2) | (hash >> (32 - r2))
+ hash = hash*m + n
+ return int(hash)
+}
+
+func murmurFinish(h int, numberOfWords int) int {
+ var hash = uint32(h)
+ hash ^= uint32(numberOfWords) << 2
+ hash ^= hash >> 16
+ hash *= 0x85ebca6b
+ hash ^= hash >> 13
+ hash *= 0xc2b2ae35
+ hash ^= hash >> 16
+
+ return int(hash)
+}
+
+func isDirectory(dir string) (bool, error) {
+ fileInfo, err := os.Stat(dir)
+ if err != nil {
+ switch {
+ case errors.Is(err, syscall.ENOENT):
+ // The given directory does not exist, so we will try to create it
+ //
+ err = os.MkdirAll(dir, 0755)
+ if err != nil {
+ return false, err
+ }
+
+ return true, nil
+ case err != nil:
+ return false, err
+ default:
+ }
+ }
+ return fileInfo.IsDir(), err
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/LICENSE b/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/LICENSE
new file mode 100644
index 0000000..ce212cb
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Ben Johnson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/README.md b/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/README.md
new file mode 100644
index 0000000..4f1f82f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/README.md
@@ -0,0 +1,105 @@
+clock
+=====
+
+[](https://pkg.go.dev/mod/github.com/benbjohnson/clock)
+
+Clock is a small library for mocking time in Go. It provides an interface
+around the standard library's [`time`][time] package so that the application
+can use the realtime clock while tests can use the mock clock.
+
+The module is currently maintained by @djmitche.
+
+[time]: https://pkg.go.dev/github.com/benbjohnson/clock
+
+## Usage
+
+### Realtime Clock
+
+Your application can maintain a `Clock` variable that will allow realtime and
+mock clocks to be interchangeable. For example, if you had an `Application` type:
+
+```go
+import "github.com/benbjohnson/clock"
+
+type Application struct {
+ Clock clock.Clock
+}
+```
+
+You could initialize it to use the realtime clock like this:
+
+```go
+var app Application
+app.Clock = clock.New()
+...
+```
+
+Then all timers and time-related functionality should be performed from the
+`Clock` variable.
+
+
+### Mocking time
+
+In your tests, you will want to use a `Mock` clock:
+
+```go
+import (
+ "testing"
+
+ "github.com/benbjohnson/clock"
+)
+
+func TestApplication_DoSomething(t *testing.T) {
+ mock := clock.NewMock()
+ app := Application{Clock: mock}
+ ...
+}
+```
+
+Now that you've initialized your application to use the mock clock, you can
+adjust the time programmatically. The mock clock always starts from the Unix
+epoch (midnight UTC on Jan 1, 1970).
+
+
+### Controlling time
+
+The mock clock provides the same functions that the standard library's `time`
+package provides. For example, to find the current time, you use the `Now()`
+function:
+
+```go
+mock := clock.NewMock()
+
+// Find the current time.
+mock.Now().UTC() // 1970-01-01 00:00:00 +0000 UTC
+
+// Move the clock forward.
+mock.Add(2 * time.Hour)
+
+// Check the time again. It's 2 hours later!
+mock.Now().UTC() // 1970-01-01 02:00:00 +0000 UTC
+```
+
+Timers and Tickers are also controlled by this same mock clock. They will only
+execute when the clock is moved forward:
+
+```go
+mock := clock.NewMock()
+count := 0
+
+// Kick off a timer to increment every 1 mock second.
+go func() {
+ ticker := mock.Ticker(1 * time.Second)
+ for {
+ <-ticker.C
+ count++
+ }
+}()
+runtime.Gosched()
+
+// Move the clock forward 10 seconds.
+mock.Add(10 * time.Second)
+
+// This prints 10.
+fmt.Println(count)
+```
diff --git a/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/clock.go b/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/clock.go
new file mode 100644
index 0000000..14ddc07
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/clock.go
@@ -0,0 +1,422 @@
+package clock
+
+import (
+ "context"
+ "sort"
+ "sync"
+ "time"
+)
+
+// Re-export of time.Duration
+type Duration = time.Duration
+
+// Clock represents an interface to the functions in the standard library time
+// package. Two implementations are available in the clock package. The first
+// is a real-time clock which simply wraps the time package's functions. The
+// second is a mock clock which will only change when
+// programmatically adjusted.
+type Clock interface {
+ After(d time.Duration) <-chan time.Time
+ AfterFunc(d time.Duration, f func()) *Timer
+ Now() time.Time
+ Since(t time.Time) time.Duration
+ Until(t time.Time) time.Duration
+ Sleep(d time.Duration)
+ Tick(d time.Duration) <-chan time.Time
+ Ticker(d time.Duration) *Ticker
+ Timer(d time.Duration) *Timer
+ WithDeadline(parent context.Context, d time.Time) (context.Context, context.CancelFunc)
+ WithTimeout(parent context.Context, t time.Duration) (context.Context, context.CancelFunc)
+}
+
+// New returns an instance of a real-time clock.
+func New() Clock {
+ return &clock{}
+}
+
+// clock implements a real-time clock by simply wrapping the time package functions.
+type clock struct{}
+
+func (c *clock) After(d time.Duration) <-chan time.Time { return time.After(d) }
+
+func (c *clock) AfterFunc(d time.Duration, f func()) *Timer {
+ return &Timer{timer: time.AfterFunc(d, f)}
+}
+
+func (c *clock) Now() time.Time { return time.Now() }
+
+func (c *clock) Since(t time.Time) time.Duration { return time.Since(t) }
+
+func (c *clock) Until(t time.Time) time.Duration { return time.Until(t) }
+
+func (c *clock) Sleep(d time.Duration) { time.Sleep(d) }
+
+func (c *clock) Tick(d time.Duration) <-chan time.Time { return time.Tick(d) }
+
+func (c *clock) Ticker(d time.Duration) *Ticker {
+ t := time.NewTicker(d)
+ return &Ticker{C: t.C, ticker: t}
+}
+
+func (c *clock) Timer(d time.Duration) *Timer {
+ t := time.NewTimer(d)
+ return &Timer{C: t.C, timer: t}
+}
+
+func (c *clock) WithDeadline(parent context.Context, d time.Time) (context.Context, context.CancelFunc) {
+ return context.WithDeadline(parent, d)
+}
+
+func (c *clock) WithTimeout(parent context.Context, t time.Duration) (context.Context, context.CancelFunc) {
+ return context.WithTimeout(parent, t)
+}
+
+// Mock represents a mock clock that only moves forward programmically.
+// It can be preferable to a real-time clock when testing time-based functionality.
+type Mock struct {
+ // mu protects all other fields in this struct, and the data that they
+ // point to.
+ mu sync.Mutex
+
+ now time.Time // current time
+ timers clockTimers // tickers & timers
+}
+
+// NewMock returns an instance of a mock clock.
+// The current time of the mock clock on initialization is the Unix epoch.
+func NewMock() *Mock {
+ return &Mock{now: time.Unix(0, 0)}
+}
+
+// Add moves the current time of the mock clock forward by the specified duration.
+// This should only be called from a single goroutine at a time.
+func (m *Mock) Add(d time.Duration) {
+ // Calculate the final current time.
+ m.mu.Lock()
+ t := m.now.Add(d)
+ m.mu.Unlock()
+
+ // Continue to execute timers until there are no more before the new time.
+ for {
+ if !m.runNextTimer(t) {
+ break
+ }
+ }
+
+ // Ensure that we end with the new time.
+ m.mu.Lock()
+ m.now = t
+ m.mu.Unlock()
+
+ // Give a small buffer to make sure that other goroutines get handled.
+ gosched()
+}
+
+// Set sets the current time of the mock clock to a specific one.
+// This should only be called from a single goroutine at a time.
+func (m *Mock) Set(t time.Time) {
+ // Continue to execute timers until there are no more before the new time.
+ for {
+ if !m.runNextTimer(t) {
+ break
+ }
+ }
+
+ // Ensure that we end with the new time.
+ m.mu.Lock()
+ m.now = t
+ m.mu.Unlock()
+
+ // Give a small buffer to make sure that other goroutines get handled.
+ gosched()
+}
+
+// WaitForAllTimers sets the clock until all timers are expired
+func (m *Mock) WaitForAllTimers() time.Time {
+ // Continue to execute timers until there are no more
+ for {
+ m.mu.Lock()
+ if len(m.timers) == 0 {
+ m.mu.Unlock()
+ return m.Now()
+ }
+
+ sort.Sort(m.timers)
+ next := m.timers[len(m.timers)-1].Next()
+ m.mu.Unlock()
+ m.Set(next)
+ }
+}
+
+// runNextTimer executes the next timer in chronological order and moves the
+// current time to the timer's next tick time. The next time is not executed if
+// its next time is after the max time. Returns true if a timer was executed.
+func (m *Mock) runNextTimer(max time.Time) bool {
+ m.mu.Lock()
+
+ // Sort timers by time.
+ sort.Sort(m.timers)
+
+ // If we have no more timers then exit.
+ if len(m.timers) == 0 {
+ m.mu.Unlock()
+ return false
+ }
+
+ // Retrieve next timer. Exit if next tick is after new time.
+ t := m.timers[0]
+ if t.Next().After(max) {
+ m.mu.Unlock()
+ return false
+ }
+
+ // Move "now" forward and unlock clock.
+ m.now = t.Next()
+ now := m.now
+ m.mu.Unlock()
+
+ // Execute timer.
+ t.Tick(now)
+ return true
+}
+
+// After waits for the duration to elapse and then sends the current time on the returned channel.
+func (m *Mock) After(d time.Duration) <-chan time.Time {
+ return m.Timer(d).C
+}
+
+// AfterFunc waits for the duration to elapse and then executes a function in its own goroutine.
+// A Timer is returned that can be stopped.
+func (m *Mock) AfterFunc(d time.Duration, f func()) *Timer {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ ch := make(chan time.Time, 1)
+ t := &Timer{
+ c: ch,
+ fn: f,
+ mock: m,
+ next: m.now.Add(d),
+ stopped: false,
+ }
+ m.timers = append(m.timers, (*internalTimer)(t))
+ return t
+}
+
+// Now returns the current wall time on the mock clock.
+func (m *Mock) Now() time.Time {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ return m.now
+}
+
+// Since returns time since `t` using the mock clock's wall time.
+func (m *Mock) Since(t time.Time) time.Duration {
+ return m.Now().Sub(t)
+}
+
+// Until returns time until `t` using the mock clock's wall time.
+func (m *Mock) Until(t time.Time) time.Duration {
+ return t.Sub(m.Now())
+}
+
+// Sleep pauses the goroutine for the given duration on the mock clock.
+// The clock must be moved forward in a separate goroutine.
+func (m *Mock) Sleep(d time.Duration) {
+ <-m.After(d)
+}
+
+// Tick is a convenience function for Ticker().
+// It will return a ticker channel that cannot be stopped.
+func (m *Mock) Tick(d time.Duration) <-chan time.Time {
+ return m.Ticker(d).C
+}
+
+// Ticker creates a new instance of Ticker.
+func (m *Mock) Ticker(d time.Duration) *Ticker {
+ m.mu.Lock()
+ defer m.mu.Unlock()
+ ch := make(chan time.Time, 1)
+ t := &Ticker{
+ C: ch,
+ c: ch,
+ mock: m,
+ d: d,
+ next: m.now.Add(d),
+ }
+ m.timers = append(m.timers, (*internalTicker)(t))
+ return t
+}
+
+// Timer creates a new instance of Timer.
+func (m *Mock) Timer(d time.Duration) *Timer {
+ m.mu.Lock()
+ ch := make(chan time.Time, 1)
+ t := &Timer{
+ C: ch,
+ c: ch,
+ mock: m,
+ next: m.now.Add(d),
+ stopped: false,
+ }
+ m.timers = append(m.timers, (*internalTimer)(t))
+ now := m.now
+ m.mu.Unlock()
+ m.runNextTimer(now)
+ return t
+}
+
+// removeClockTimer removes a timer from m.timers. m.mu MUST be held
+// when this method is called.
+func (m *Mock) removeClockTimer(t clockTimer) {
+ for i, timer := range m.timers {
+ if timer == t {
+ copy(m.timers[i:], m.timers[i+1:])
+ m.timers[len(m.timers)-1] = nil
+ m.timers = m.timers[:len(m.timers)-1]
+ break
+ }
+ }
+ sort.Sort(m.timers)
+}
+
+// clockTimer represents an object with an associated start time.
+type clockTimer interface {
+ Next() time.Time
+ Tick(time.Time)
+}
+
+// clockTimers represents a list of sortable timers.
+type clockTimers []clockTimer
+
+func (a clockTimers) Len() int { return len(a) }
+func (a clockTimers) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
+func (a clockTimers) Less(i, j int) bool { return a[i].Next().Before(a[j].Next()) }
+
+// Timer represents a single event.
+// The current time will be sent on C, unless the timer was created by AfterFunc.
+type Timer struct {
+ C <-chan time.Time
+ c chan time.Time
+ timer *time.Timer // realtime impl, if set
+ next time.Time // next tick time
+ mock *Mock // mock clock, if set
+ fn func() // AfterFunc function, if set
+ stopped bool // True if stopped, false if running
+}
+
+// Stop turns off the ticker.
+func (t *Timer) Stop() bool {
+ if t.timer != nil {
+ return t.timer.Stop()
+ }
+
+ t.mock.mu.Lock()
+ registered := !t.stopped
+ t.mock.removeClockTimer((*internalTimer)(t))
+ t.stopped = true
+ t.mock.mu.Unlock()
+ return registered
+}
+
+// Reset changes the expiry time of the timer
+func (t *Timer) Reset(d time.Duration) bool {
+ if t.timer != nil {
+ return t.timer.Reset(d)
+ }
+
+ t.mock.mu.Lock()
+ t.next = t.mock.now.Add(d)
+ defer t.mock.mu.Unlock()
+
+ registered := !t.stopped
+ if t.stopped {
+ t.mock.timers = append(t.mock.timers, (*internalTimer)(t))
+ }
+
+ t.stopped = false
+ return registered
+}
+
+type internalTimer Timer
+
+func (t *internalTimer) Next() time.Time { return t.next }
+func (t *internalTimer) Tick(now time.Time) {
+ // a gosched() after ticking, to allow any consequences of the
+ // tick to complete
+ defer gosched()
+
+ t.mock.mu.Lock()
+ if t.fn != nil {
+ // defer function execution until the lock is released, and
+ defer func() { go t.fn() }()
+ } else {
+ t.c <- now
+ }
+ t.mock.removeClockTimer((*internalTimer)(t))
+ t.stopped = true
+ t.mock.mu.Unlock()
+}
+
+// Ticker holds a channel that receives "ticks" at regular intervals.
+type Ticker struct {
+ C <-chan time.Time
+ c chan time.Time
+ ticker *time.Ticker // realtime impl, if set
+ next time.Time // next tick time
+ mock *Mock // mock clock, if set
+ d time.Duration // time between ticks
+ stopped bool // True if stopped, false if running
+}
+
+// Stop turns off the ticker.
+func (t *Ticker) Stop() {
+ if t.ticker != nil {
+ t.ticker.Stop()
+ } else {
+ t.mock.mu.Lock()
+ t.mock.removeClockTimer((*internalTicker)(t))
+ t.stopped = true
+ t.mock.mu.Unlock()
+ }
+}
+
+// Reset resets the ticker to a new duration.
+func (t *Ticker) Reset(dur time.Duration) {
+ if t.ticker != nil {
+ t.ticker.Reset(dur)
+ return
+ }
+
+ t.mock.mu.Lock()
+ defer t.mock.mu.Unlock()
+
+ if t.stopped {
+ t.mock.timers = append(t.mock.timers, (*internalTicker)(t))
+ t.stopped = false
+ }
+
+ t.d = dur
+ t.next = t.mock.now.Add(dur)
+}
+
+type internalTicker Ticker
+
+func (t *internalTicker) Next() time.Time { return t.next }
+func (t *internalTicker) Tick(now time.Time) {
+ select {
+ case t.c <- now:
+ default:
+ }
+ t.mock.mu.Lock()
+ t.next = now.Add(t.d)
+ t.mock.mu.Unlock()
+ gosched()
+}
+
+// Sleep momentarily so that other goroutines can process.
+func gosched() { time.Sleep(1 * time.Millisecond) }
+
+var (
+ // type checking
+ _ Clock = &Mock{}
+)
diff --git a/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/context.go b/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/context.go
new file mode 100644
index 0000000..eb67594
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/benbjohnson/clock/context.go
@@ -0,0 +1,86 @@
+package clock
+
+import (
+ "context"
+ "fmt"
+ "sync"
+ "time"
+)
+
+func (m *Mock) WithTimeout(parent context.Context, timeout time.Duration) (context.Context, context.CancelFunc) {
+ return m.WithDeadline(parent, m.Now().Add(timeout))
+}
+
+func (m *Mock) WithDeadline(parent context.Context, deadline time.Time) (context.Context, context.CancelFunc) {
+ if cur, ok := parent.Deadline(); ok && cur.Before(deadline) {
+ // The current deadline is already sooner than the new one.
+ return context.WithCancel(parent)
+ }
+ ctx := &timerCtx{clock: m, parent: parent, deadline: deadline, done: make(chan struct{})}
+ propagateCancel(parent, ctx)
+ dur := m.Until(deadline)
+ if dur <= 0 {
+ ctx.cancel(context.DeadlineExceeded) // deadline has already passed
+ return ctx, func() {}
+ }
+ ctx.Lock()
+ defer ctx.Unlock()
+ if ctx.err == nil {
+ ctx.timer = m.AfterFunc(dur, func() {
+ ctx.cancel(context.DeadlineExceeded)
+ })
+ }
+ return ctx, func() { ctx.cancel(context.Canceled) }
+}
+
+// propagateCancel arranges for child to be canceled when parent is.
+func propagateCancel(parent context.Context, child *timerCtx) {
+ if parent.Done() == nil {
+ return // parent is never canceled
+ }
+ go func() {
+ select {
+ case <-parent.Done():
+ child.cancel(parent.Err())
+ case <-child.Done():
+ }
+ }()
+}
+
+type timerCtx struct {
+ sync.Mutex
+
+ clock Clock
+ parent context.Context
+ deadline time.Time
+ done chan struct{}
+
+ err error
+ timer *Timer
+}
+
+func (c *timerCtx) cancel(err error) {
+ c.Lock()
+ defer c.Unlock()
+ if c.err != nil {
+ return // already canceled
+ }
+ c.err = err
+ close(c.done)
+ if c.timer != nil {
+ c.timer.Stop()
+ c.timer = nil
+ }
+}
+
+func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { return c.deadline, true }
+
+func (c *timerCtx) Done() <-chan struct{} { return c.done }
+
+func (c *timerCtx) Err() error { return c.err }
+
+func (c *timerCtx) Value(key interface{}) interface{} { return c.parent.Value(key) }
+
+func (c *timerCtx) String() string {
+ return fmt.Sprintf("clock.WithDeadline(%s [%s])", c.deadline, c.deadline.Sub(c.clock.Now()))
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bep/debounce/.gitignore b/.gear/predownloaded-development/vendor/github.com/bep/debounce/.gitignore
new file mode 100644
index 0000000..2eb4a46
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bep/debounce/.gitignore
@@ -0,0 +1,27 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
+
+cover.out
+nohup.out
diff --git a/.gear/predownloaded-development/vendor/github.com/bep/debounce/LICENSE b/.gear/predownloaded-development/vendor/github.com/bep/debounce/LICENSE
new file mode 100644
index 0000000..3a120e9
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bep/debounce/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Bjørn Erik Pedersen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/.gear/predownloaded-development/vendor/github.com/bep/debounce/README.md b/.gear/predownloaded-development/vendor/github.com/bep/debounce/README.md
new file mode 100644
index 0000000..b26a64b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bep/debounce/README.md
@@ -0,0 +1,35 @@
+# Go Debounce
+
+[](https://github.com/bep/debounce/actions?query=workflow:Test)
+[](https://godoc.org/github.com/bep/debounce)
+[](https://goreportcard.com/report/github.com/bep/debounce)
+[](https://codecov.io/gh/bep/debounce)
+[](https://github.com/bep/debounce/releases/latest)
+
+## Example
+
+```go
+func ExampleNew() {
+ var counter uint64
+
+ f := func() {
+ atomic.AddUint64(&counter, 1)
+ }
+
+ debounced := debounce.New(100 * time.Millisecond)
+
+ for i := 0; i < 3; i++ {
+ for j := 0; j < 10; j++ {
+ debounced(f)
+ }
+
+ time.Sleep(200 * time.Millisecond)
+ }
+
+ c := int(atomic.LoadUint64(&counter))
+
+ fmt.Println("Counter is", c)
+ // Output: Counter is 3
+}
+```
+
diff --git a/.gear/predownloaded-development/vendor/github.com/bep/debounce/debounce.go b/.gear/predownloaded-development/vendor/github.com/bep/debounce/debounce.go
new file mode 100644
index 0000000..793d5ed
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bep/debounce/debounce.go
@@ -0,0 +1,43 @@
+// Copyright © 2019 Bjørn Erik Pedersen .
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+// Package debounce provides a debouncer func. The most typical use case would be
+// the user typing a text into a form; the UI needs an update, but let's wait for
+// a break.
+package debounce
+
+import (
+ "sync"
+ "time"
+)
+
+// New returns a debounced function that takes another functions as its argument.
+// This function will be called when the debounced function stops being called
+// for the given duration.
+// The debounced function can be invoked with different functions, if needed,
+// the last one will win.
+func New(after time.Duration) func(f func()) {
+ d := &debouncer{after: after}
+
+ return func(f func()) {
+ d.add(f)
+ }
+}
+
+type debouncer struct {
+ mu sync.Mutex
+ after time.Duration
+ timer *time.Timer
+}
+
+func (d *debouncer) add(f func()) {
+ d.mu.Lock()
+ defer d.mu.Unlock()
+
+ if d.timer != nil {
+ d.timer.Stop()
+ }
+ d.timer = time.AfterFunc(d.after, f)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/.gitattributes b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/.gitattributes
new file mode 100644
index 0000000..4a1c630
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/.gitattributes
@@ -0,0 +1,2 @@
+*.go text eol=lf
+internal/gen/**/* linguist-generated=true
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/.gitignore b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/.gitignore
new file mode 100644
index 0000000..987d6a1
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/.gitignore
@@ -0,0 +1,4 @@
+/.tmp/
+*.pprof
+*.svg
+cover.out
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/.golangci.yml b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/.golangci.yml
new file mode 100644
index 0000000..23f48e7
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/.golangci.yml
@@ -0,0 +1,85 @@
+linters-settings:
+ errcheck:
+ check-type-assertions: true
+ forbidigo:
+ forbid:
+ - '^fmt\.Print'
+ - '^log\.'
+ - '^print$'
+ - '^println$'
+ - '^panic$'
+ godox:
+ # TODO, OPT, etc. comments are fine to commit. Use FIXME comments for
+ # temporary hacks, and use godox to prevent committing them.
+ keywords: [FIXME]
+ varnamelen:
+ ignore-decls:
+ - T any
+ - i int
+ - wg sync.WaitGroup
+ - ok bool
+ - w io.Writer
+linters:
+ enable-all: true
+ disable:
+ - copyloopvar # enable once go 1.22 is baseline
+ - cyclop # covered by gocyclo
+ - depguard # we can manage dependencies strictly if the need arises in the future
+ - err113 # internal error causes may be dynamic
+ - execinquery # deprecated by author
+ - exhaustruct # don't _always_ need to exhaustively create struct
+ - funlen # rely on code review to limit function length
+ - gocognit # dubious "cognitive overhead" quantification
+ - gofumpt # prefer standard gofmt
+ - goimports # rely on gci instead
+ - gomnd # some unnamed constants are okay
+ - gomoddirectives # we use go modules replacements intentionally
+ - gomodguard # not compatible with go workspaces
+ - intrange # enable once go 1.22 is baseline
+ - ireturn # "accept interfaces, return structs" isn't ironclad
+ - lll # don't want hard limits for line length
+ - maintidx # covered by gocyclo
+ - mnd # some unnamed constants are okay
+ - nlreturn # generous whitespace violates house style
+ - nonamedreturns # usage of named returns should be selective
+ - testpackage # internal tests are fine
+ - wrapcheck # don't _always_ need to wrap errors
+ - wsl # over-generous whitespace violates house style
+issues:
+ exclude-use-default: true
+ exclude:
+ # we will continue to support the deprecated field until it's removed
+ - "IgnoreEmpty is deprecated"
+ - "Skipped is deprecated"
+ exclude-rules:
+ # Loosen requirements on conformance executor
+ - path: internal/cmd/
+ linters:
+ - forbidigo
+ - errorlint
+ # Loosen requirements on tests
+ - path: _test.go
+ linters:
+ - funlen
+ - varnamelen
+ - unparam
+ - gosec
+ - path: celext/lib.go
+ linters:
+ # setting up custom functions/overloads appears duplicative (false positive)
+ - dupl
+ # Types are checked internally within CEL. There are bigger issues if its
+ # type analysis is wrong
+ - forcetypeassert
+ # static unexported lookup tables
+ - path: internal/constraints/lookups.go
+ linters:
+ - gochecknoglobals
+ - path: resolver/resolver.go
+ linters:
+ # uses deprecated fields on protoimpl.ExtensionInfo but its the only way
+ - staticcheck
+ # We allow a global validator.
+ - path: validator.go
+ linters:
+ - gochecknoglobals
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/LICENSE b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/LICENSE
new file mode 100644
index 0000000..f308f8b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2023 Buf Technologies, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/Makefile b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/Makefile
new file mode 100644
index 0000000..6a492e0
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/Makefile
@@ -0,0 +1,107 @@
+# See https://tech.davis-hansson.com/p/make/
+SHELL := bash
+.DELETE_ON_ERROR:
+.SHELLFLAGS := -eu -o pipefail -c
+.DEFAULT_GOAL := all
+MAKEFLAGS += --warn-undefined-variables
+MAKEFLAGS += --no-builtin-rules
+MAKEFLAGS += --no-print-directory
+BIN := .tmp/bin
+COPYRIGHT_YEARS := 2023-2024
+LICENSE_IGNORE := -e internal/testdata/
+# Set to use a different compiler. For example, `GO=go1.18rc1 make test`.
+GO ?= go
+ARGS ?= --strict --strict_message --strict_error
+GOLANGCI_LINT_VERSION ?= v1.60.1
+# Set to use a different version of protovalidate-conformance.
+# Should be kept in sync with the version referenced in proto/buf.lock and
+# 'buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go' in go.mod.
+CONFORMANCE_VERSION ?= v0.9.0
+
+.PHONY: help
+help: ## Describe useful make targets
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "%-15s %s\n", $$1, $$2}'
+
+.PHONY: all
+all: generate test conformance lint ## Generate and run all tests and lint (default)
+
+.PHONY: clean
+clean: ## Delete intermediate build artifacts
+ @# -X only removes untracked files, -d recurses into directories, -f actually removes files/dirs
+ git clean -Xdf
+
+.PHONY: test
+test: ## Run all unit tests
+ $(GO) test -race -cover ./...
+
+.PHONY: lint
+lint: lint-proto lint-go ## Lint code and protos
+
+.PHONY: lint-go
+lint-go: $(BIN)/golangci-lint
+ $(BIN)/golangci-lint run --modules-download-mode=readonly --timeout=3m0s ./...
+
+.PHONY: lint-proto
+lint-proto: $(BIN)/buf
+ $(BIN)/buf lint
+
+.PHONY: conformance
+conformance: $(BIN)/protovalidate-conformance protovalidate-conformance-go ## Run conformance tests
+ $(BIN)/protovalidate-conformance $(ARGS) $(BIN)/protovalidate-conformance-go
+
+.PHONY: generate
+generate: generate-proto generate-license ## Regenerate code and license headers
+ $(GO) mod tidy
+
+.PHONY: generate-proto
+generate-proto: $(BIN)/buf
+ rm -rf internal/gen/*/
+ $(BIN)/buf generate buf.build/bufbuild/protovalidate-testing:$(CONFORMANCE_VERSION)
+ $(BIN)/buf generate
+
+.PHONY: generate-license
+generate-license: $(BIN)/license-header
+ @# We want to operate on a list of modified and new files, excluding
+ @# deleted and ignored files. git-ls-files can't do this alone. comm -23 takes
+ @# two files and prints the union, dropping lines common to both (-3) and
+ @# those only in the second file (-2). We make one git-ls-files call for
+ @# the modified, cached, and new (--others) files, and a second for the
+ @# deleted files.
+ comm -23 \
+ <(git ls-files --cached --modified --others --no-empty-directory --exclude-standard | sort -u | grep -v $(LICENSE_IGNORE) ) \
+ <(git ls-files --deleted | sort -u) | \
+ xargs $(BIN)/license-header \
+ --license-type apache \
+ --copyright-holder "Buf Technologies, Inc." \
+ --year-range "$(COPYRIGHT_YEARS)"
+
+.PHONY: checkgenerate
+checkgenerate: generate
+ @# Used in CI to verify that `make generate` doesn't produce a diff.
+ test -z "$$(git status --porcelain | tee /dev/stderr)"
+
+.PHONY: upgrade-go
+upgrade-go:
+ $(GO) get -u -t ./... && $(GO) mod tidy -v
+
+$(BIN):
+ @mkdir -p $(BIN)
+
+$(BIN)/buf: $(BIN) Makefile
+ GOBIN=$(abspath $(@D)) $(GO) install github.com/bufbuild/buf/cmd/buf@latest
+
+$(BIN)/license-header: $(BIN) Makefile
+ GOBIN=$(abspath $(@D)) $(GO) install \
+ github.com/bufbuild/buf/private/pkg/licenseheader/cmd/license-header@latest
+
+$(BIN)/golangci-lint: $(BIN) Makefile
+ GOBIN=$(abspath $(@D)) $(GO) install \
+ github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION)
+
+$(BIN)/protovalidate-conformance: $(BIN) Makefile
+ GOBIN=$(abspath $(BIN)) $(GO) install \
+ github.com/bufbuild/protovalidate/tools/protovalidate-conformance@$(CONFORMANCE_VERSION)
+
+.PHONY: protovalidate-conformance-go
+protovalidate-conformance-go: $(BIN)
+ GOBIN=$(abspath $(BIN)) $(GO) install ./internal/cmd/protovalidate-conformance-go
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/README.md b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/README.md
new file mode 100644
index 0000000..314c254
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/README.md
@@ -0,0 +1,244 @@
+# [][buf] protovalidate-go
+
+[](https://github.com/bufbuild/protovalidate-go/actions/workflows/ci.yaml)
+[](https://github.com/bufbuild/protovalidate-go/actions/workflows/conformance.yaml)
+[](https://goreportcard.com/report/github.com/bufbuild/protovalidate-go)
+[](https://pkg.go.dev/github.com/bufbuild/protovalidate-go)
+[][buf-mod]
+
+`protovalidate-go` is the Go language implementation
+of [`protovalidate`](https://github.com/bufbuild/protovalidate) designed
+to validate Protobuf messages at runtime based on user-defined validation constraints.
+Powered by Google's Common Expression Language ([CEL](https://github.com/google/cel-spec)), it provides a
+flexible and efficient foundation for defining and evaluating custom validation
+rules.
+The primary goal of `protovalidate` is to help developers ensure data
+consistency and integrity across the network without requiring generated code.
+
+## The `protovalidate` project
+
+Head over to the core [`protovalidate`](https://github.com/bufbuild/protovalidate/) repository for:
+
+- [The API definition](https://github.com/bufbuild/protovalidate/tree/main/proto/protovalidate/buf/validate/validate.proto): used to describe validation constraints
+- [Documentation](https://github.com/bufbuild/protovalidate/tree/main/docs): how to apply `protovalidate` effectively
+- [Migration tooling](https://github.com/bufbuild/protovalidate/tree/main/docs/migrate.md): incrementally migrate from `protoc-gen-validate`
+- [Conformance testing utilities](https://github.com/bufbuild/protovalidate/tree/main/docs/conformance.md): for acceptance testing of `protovalidate` implementations
+
+Other `protovalidate` runtime implementations:
+
+- C++: [`protovalidate-cc`][pv-cc]
+- Java: [`protovalidate-java`][pv-java]
+- Python: [`protovalidate-python`][pv-python]
+
+And others coming soon:
+
+- TypeScript: `protovalidate-ts`
+
+For `Connect` see [connectrpc/validate-go](https://github.com/connectrpc/validate-go).
+
+## Installation
+
+To install the package, use the `go get` command from within your Go module:
+
+```shell
+go get github.com/bufbuild/protovalidate-go
+```
+
+Import the package into your Go project:
+
+```go
+import "github.com/bufbuild/protovalidate-go"
+```
+
+Remember to always check for the latest version of `protovalidate-go` on the
+project's [GitHub releases page](https://github.com/bufbuild/protovalidate-go/releases)
+to ensure you're using the most up-to-date version.
+
+## Usage
+
+### Implementing validation constraints
+
+Validation constraints are defined directly within `.proto` files.
+Documentation for adding constraints can be found in the `protovalidate` project
+[README](https://github.com/bufbuild/protovalidate) and its [comprehensive docs](https://github.com/bufbuild/protovalidate/tree/main/docs).
+
+```protobuf
+syntax = "proto3";
+
+package my.package;
+
+import "google/protobuf/timestamp.proto";
+import "buf/validate/validate.proto";
+
+message Transaction {
+ uint64 id = 1 [(buf.validate.field).uint64.gt = 999];
+ google.protobuf.Timestamp purchase_date = 2;
+ google.protobuf.Timestamp delivery_date = 3;
+
+ string price = 4 [(buf.validate.field).cel = {
+ id: "transaction.price",
+ message: "price must be positive and include a valid currency symbol ($ or £)",
+ expression: "(this.startsWith('$') || this.startsWith('£')) && double(this.substring(1)) > 0"
+ }];
+
+ option (buf.validate.message).cel = {
+ id: "transaction.delivery_date",
+ message: "delivery date must be after purchase date",
+ expression: "this.delivery_date > this.purchase_date"
+ };
+}
+```
+
+#### Buf managed mode
+
+`protovalidate-go` assumes the constraint extensions are imported into
+the generated code via `buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go`.
+
+If you are using Buf [managed mode](https://buf.build/docs/generate/managed-mode/) to augment Go code generation, ensure
+that the `protovalidate` module is excluded in your [`buf.gen.yaml`](https://buf.build/docs/configuration/v1/buf-gen-yaml#except):
+
+**`buf.gen.yaml` v1**
+```yaml
+version: v1
+#
+managed:
+ enabled: true
+ go_package_prefix:
+ except:
+ - buf.build/bufbuild/protovalidate
+#
+```
+
+**`buf.gen.yaml` v2**
+```yaml
+version: v2
+#
+managed:
+ enabled: true
+ disable:
+ - file_option: go_package_prefix
+ module: buf.build/bufbuild/protovalidate
+#
+```
+
+### Example
+
+```go
+package main
+
+import (
+ "fmt"
+ "time"
+
+ pb "github.com/path/to/generated/protos"
+ "github.com/bufbuild/protovalidate-go"
+ "google.golang.org/protobuf/types/known/timestamppb"
+)
+
+func main() {
+ msg := &pb.Transaction{
+ Id: 1234,
+ Price: "$5.67",
+ PurchaseDate: timestamppb.New(time.Now()),
+ DeliveryDate: timestamppb.New(time.Now().Add(time.Hour)),
+ }
+ if err = protovalidate.Validate(msg); err != nil {
+ fmt.Println("validation failed:", err)
+ } else {
+ fmt.Println("validation succeeded")
+ }
+}
+```
+
+### Lazy mode
+
+`protovalidate-go` defaults to lazily construct validation logic for Protobuf
+message types the first time they are encountered. A validator's internal
+cache can be pre-warmed with the `WithMessages` or `WithDescriptors` options
+during initialization:
+
+```go
+validator, err := protovalidate.New(
+ protovalidate.WithMessages(
+ &pb.MyFoo{},
+ &pb.MyBar{},
+ ),
+)
+```
+
+Lazy mode uses a copy on write cache stategy to reduce the required locking.
+While [performance](#performance) is sub-microsecond, the overhead can be
+further reduced by disabling lazy mode with the `WithDisableLazy` option.
+Note that all expected messages must be provided during initialization of the
+validator:
+
+```go
+validator, err := protovalidate.New(
+ protovalidate.WithDisableLazy(true),
+ protovalidate.WithMessages(
+ &pb.MyFoo{},
+ &pb.MyBar{},
+ ),
+)
+```
+
+### Support legacy `protoc-gen-validate` constraints
+
+The `protovalidate-go` module comes with a `legacy` package which adds opt-in support
+for existing `protoc-gen-validate` constraints. Provide the`legacy.WithLegacySupport`
+option when initializing the validator:
+
+```go
+validator, err := protovalidate.New(
+ legacy.WithLegacySupport(legacy.ModeMerge),
+)
+```
+
+`protoc-gen-validate` code generation is **not** used by `protovalidate-go`. The
+`legacy` package assumes the `protoc-gen-validate` extensions are imported into
+the generated code via `github.com/envoyproxy/protoc-gen-validate/validate`.
+
+A [migration tool](https://github.com/bufbuild/protovalidate/tree/main/tools/protovalidate-migrate) is also available to incrementally upgrade legacy constraints in `.proto` files.
+
+## Performance
+
+[Benchmarks](validator_bench_test.go) are provided to test a variety of use-cases. Generally, after the
+initial cold start, validation on a message is sub-microsecond
+and only allocates in the event of a validation error.
+
+```
+[circa 14 September 2023]
+goos: darwin
+goarch: arm64
+pkg: github.com/bufbuild/protovalidate-go
+BenchmarkValidator
+BenchmarkValidator/ColdStart-10 4192 246278 ns/op 437698 B/op 5955 allocs/op
+BenchmarkValidator/Lazy/Valid-10 11816635 95.08 ns/op 0 B/op 0 allocs/op
+BenchmarkValidator/Lazy/Invalid-10 2983478 380.5 ns/op 649 B/op 15 allocs/op
+BenchmarkValidator/Lazy/FailFast-10 12268683 98.22 ns/op 168 B/op 3 allocs/op
+BenchmarkValidator/PreWarmed/Valid-10 12209587 90.36 ns/op 0 B/op 0 allocs/op
+BenchmarkValidator/PreWarmed/Invalid-10 3098940 394.1 ns/op 649 B/op 15 allocs/op
+BenchmarkValidator/PreWarmed/FailFast-10 12291523 99.27 ns/op 168 B/op 3 allocs/op
+PASS
+
+```
+
+### Ecosystem
+
+- [`protovalidate`](https://github.com/bufbuild/protovalidate) core repository
+- [Buf][buf]
+- [CEL Go][cel-go]
+- [CEL Spec][cel-spec]
+
+## Legal
+
+Offered under the [Apache 2 license][license].
+
+[license]: LICENSE
+[buf]: https://buf.build
+[buf-mod]: https://buf.build/bufbuild/protovalidate
+[cel-go]: https://github.com/google/cel-go
+[cel-spec]: https://github.com/google/cel-spec
+[pv-cc]: https://github.com/bufbuild/protovalidate-cc
+[pv-java]: https://github.com/bufbuild/protovalidate-java
+[pv-python]: https://github.com/bufbuild/protovalidate-python
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/buf.gen.yaml b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/buf.gen.yaml
new file mode 100644
index 0000000..229d9ad
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/buf.gen.yaml
@@ -0,0 +1,15 @@
+version: v2
+managed:
+ enabled: true
+ disable:
+ - file_option: go_package
+ module: buf.build/envoyproxy/protoc-gen-validate
+ - file_option: go_package
+ module: buf.build/bufbuild/protovalidate
+ override:
+ - file_option: go_package_prefix
+ value: github.com/bufbuild/protovalidate-go/internal/gen
+plugins:
+ - remote: buf.build/protocolbuffers/go:v1.35.2
+ out: internal/gen
+ opt: paths=source_relative
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/buf.lock b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/buf.lock
new file mode 100644
index 0000000..9a585dd
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/buf.lock
@@ -0,0 +1,12 @@
+# Generated by buf. DO NOT EDIT.
+version: v2
+deps:
+ - name: buf.build/bufbuild/protovalidate
+ commit: 5a7b106cbb87462d9a8c9ffecdbd2e38
+ digest: b5:0f2dc6c9453e9cc9e9f36807aaa5f94022e837d91fef4dcaeed79a35c0843cc64eba28ff077aab24da3b2cb12639ad256246f9f9a36c033b99d5754b19996b7e
+ - name: buf.build/bufbuild/protovalidate-testing
+ commit: 165ebb0f38244fc2a5b23a82cabe812f
+ digest: b5:4e3e21cabc93277d9069f7ded53c17659fefe47dd8daf9bc534387590feabe971b2d51b88b324835385650f3fa227e8a793a99ca9814cba76ee678f20ba9b4ef
+ - name: buf.build/envoyproxy/protoc-gen-validate
+ commit: daf171c6cdb54629b5f51e345a79e4dd
+ digest: b5:c745e1521879f43740230b1df673d0729f55704efefdcfc489d4a0a2d40c92a26cacfeab62813403040a8b180142d53b398c7ca784a065e43823605ee49681de
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/buf.yaml b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/buf.yaml
new file mode 100644
index 0000000..f5400c0
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/buf.yaml
@@ -0,0 +1,16 @@
+version: v2
+modules:
+ - path: proto
+deps:
+ - buf.build/bufbuild/protovalidate
+ - buf.build/bufbuild/protovalidate-testing
+ - buf.build/envoyproxy/protoc-gen-validate
+lint:
+ use:
+ - STANDARD
+ ignore_only:
+ PROTOVALIDATE:
+ - proto/tests/example/v1/validations.proto
+breaking:
+ use:
+ - FILE
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/celext/lib.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/celext/lib.go
new file mode 100644
index 0000000..3689aba
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/celext/lib.go
@@ -0,0 +1,540 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package celext
+
+import (
+ "bytes"
+ "math"
+ "net"
+ "net/mail"
+ "net/netip"
+ "net/url"
+ "strconv"
+ "strings"
+
+ "github.com/google/cel-go/cel"
+ "github.com/google/cel-go/common/overloads"
+ "github.com/google/cel-go/common/types"
+ "github.com/google/cel-go/common/types/ref"
+ "github.com/google/cel-go/common/types/traits"
+ "github.com/google/cel-go/ext"
+ "google.golang.org/protobuf/reflect/protoreflect"
+ "google.golang.org/protobuf/reflect/protoregistry"
+ "google.golang.org/protobuf/types/dynamicpb"
+)
+
+// DefaultEnv produces a cel.Env with the necessary cel.EnvOption and
+// cel.ProgramOption values preconfigured for usage throughout the
+// module. If useUTC is true, timestamp operations use the UTC timezone instead
+// of the local timezone.
+func DefaultEnv(useUTC bool) (*cel.Env, error) {
+ return cel.NewEnv(
+ // we bind in the global type registry optimistically to ensure expressions
+ // operating against Any WKTs can resolve their underlying type if it's
+ // known to the application. They will otherwise fail with a runtime error
+ // if the type is unknown.
+ cel.TypeDescs(protoregistry.GlobalFiles),
+ cel.Lib(Lib{
+ useUTC: useUTC,
+ }),
+ )
+}
+
+// RequiredCELEnvOptions returns the options required to have expressions which
+// rely on the provided descriptor.
+func RequiredCELEnvOptions(fieldDesc protoreflect.FieldDescriptor) []cel.EnvOption {
+ if fieldDesc.IsMap() {
+ return append(
+ RequiredCELEnvOptions(fieldDesc.MapKey()),
+ RequiredCELEnvOptions(fieldDesc.MapValue())...,
+ )
+ }
+ if fieldDesc.Kind() == protoreflect.MessageKind ||
+ fieldDesc.Kind() == protoreflect.GroupKind {
+ return []cel.EnvOption{
+ cel.Types(dynamicpb.NewMessage(fieldDesc.Message())),
+ }
+ }
+ return nil
+}
+
+// Lib is the collection of functions and settings required by protovalidate
+// beyond the standard definitions of the CEL Specification:
+//
+// https://github.com/google/cel-spec/blob/master/doc/langdef.md#list-of-standard-definitions
+//
+// All implementations of protovalidate MUST implement these functions and
+// should avoid exposing additional functions as they will not be portable.
+type Lib struct {
+ useUTC bool
+}
+
+//nolint:funlen
+func (l Lib) CompileOptions() []cel.EnvOption {
+ return []cel.EnvOption{
+ cel.DefaultUTCTimeZone(l.useUTC),
+ cel.CrossTypeNumericComparisons(true),
+ cel.EagerlyValidateDeclarations(true),
+ // TODO: reduce this to just the functionality we want to support
+ ext.Strings(ext.StringsValidateFormatCalls(true)),
+ cel.Variable("now", cel.TimestampType),
+ cel.Function("unique",
+ l.uniqueMemberOverload(cel.BoolType, l.uniqueScalar),
+ l.uniqueMemberOverload(cel.IntType, l.uniqueScalar),
+ l.uniqueMemberOverload(cel.UintType, l.uniqueScalar),
+ l.uniqueMemberOverload(cel.DoubleType, l.uniqueScalar),
+ l.uniqueMemberOverload(cel.StringType, l.uniqueScalar),
+ l.uniqueMemberOverload(cel.BytesType, l.uniqueBytes),
+ ),
+ cel.Function("isNan",
+ cel.MemberOverload(
+ "double_is_nan_bool",
+ []*cel.Type{cel.DoubleType},
+ cel.BoolType,
+ cel.UnaryBinding(func(value ref.Val) ref.Val {
+ num, ok := value.Value().(float64)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(value)
+ }
+ return types.Bool(math.IsNaN(num))
+ }),
+ ),
+ ),
+ cel.Function("isInf",
+ cel.MemberOverload(
+ "double_is_inf_bool",
+ []*cel.Type{cel.DoubleType},
+ cel.BoolType,
+ cel.UnaryBinding(func(value ref.Val) ref.Val {
+ num, ok := value.Value().(float64)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(value)
+ }
+ return types.Bool(math.IsInf(num, 0))
+ }),
+ ),
+ cel.MemberOverload(
+ "double_int_is_inf_bool",
+ []*cel.Type{cel.DoubleType, cel.IntType},
+ cel.BoolType,
+ cel.BinaryBinding(func(lhs ref.Val, rhs ref.Val) ref.Val {
+ num, ok := lhs.Value().(float64)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(lhs)
+ }
+ sign, ok := rhs.Value().(int64)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(rhs)
+ }
+ return types.Bool(math.IsInf(num, int(sign)))
+ }),
+ ),
+ ),
+ cel.Function("isHostname",
+ cel.MemberOverload(
+ "string_is_hostname_bool",
+ []*cel.Type{cel.StringType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ host, ok := args[0].Value().(string)
+ if !ok {
+ return types.Bool(false)
+ }
+ return types.Bool(l.validateHostname(host))
+ }),
+ ),
+ ),
+ cel.Function("isEmail",
+ cel.MemberOverload(
+ "string_is_email_bool",
+ []*cel.Type{cel.StringType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ addr, ok := args[0].Value().(string)
+ if !ok {
+ return types.Bool(false)
+ }
+ return types.Bool(l.validateEmail(addr))
+ }),
+ ),
+ ),
+ cel.Function("isIp",
+ cel.MemberOverload(
+ "string_is_ip_bool",
+ []*cel.Type{cel.StringType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ addr, ok := args[0].Value().(string)
+ if !ok {
+ return types.Bool(false)
+ }
+ return types.Bool(l.validateIP(addr, 0))
+ }),
+ ),
+ cel.MemberOverload(
+ "string_int_is_ip_bool",
+ []*cel.Type{cel.StringType, cel.IntType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ addr, aok := args[0].Value().(string)
+ vers, vok := args[1].Value().(int64)
+ if !aok || !vok {
+ return types.Bool(false)
+ }
+ return types.Bool(l.validateIP(addr, vers))
+ })),
+ ),
+ cel.Function("isIpPrefix",
+ cel.MemberOverload(
+ "string_is_ip_prefix_bool",
+ []*cel.Type{cel.StringType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ prefix, ok := args[0].Value().(string)
+ if !ok {
+ return types.Bool(false)
+ }
+ return types.Bool(l.validateIPPrefix(prefix, 0, false))
+ })),
+ cel.MemberOverload(
+ "string_int_is_ip_prefix_bool",
+ []*cel.Type{cel.StringType, cel.IntType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ prefix, pok := args[0].Value().(string)
+ vers, vok := args[1].Value().(int64)
+ if !pok || !vok {
+ return types.Bool(false)
+ }
+ return types.Bool(l.validateIPPrefix(prefix, vers, false))
+ })),
+ cel.MemberOverload(
+ "string_bool_is_ip_prefix_bool",
+ []*cel.Type{cel.StringType, cel.BoolType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ prefix, pok := args[0].Value().(string)
+ strict, sok := args[1].Value().(bool)
+ if !pok || !sok {
+ return types.Bool(false)
+ }
+ return types.Bool(l.validateIPPrefix(prefix, 0, strict))
+ })),
+ cel.MemberOverload(
+ "string_int_bool_is_ip_prefix_bool",
+ []*cel.Type{cel.StringType, cel.IntType, cel.BoolType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ prefix, pok := args[0].Value().(string)
+ vers, vok := args[1].Value().(int64)
+ strict, sok := args[2].Value().(bool)
+ if !pok || !vok || !sok {
+ return types.Bool(false)
+ }
+ return types.Bool(l.validateIPPrefix(prefix, vers, strict))
+ })),
+ ),
+ cel.Function("isUri",
+ cel.MemberOverload(
+ "string_is_uri_bool",
+ []*cel.Type{cel.StringType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ s, ok := args[0].Value().(string)
+ if !ok {
+ return types.Bool(false)
+ }
+ uri, err := url.Parse(s)
+ return types.Bool(err == nil && uri.IsAbs())
+ }),
+ ),
+ ),
+ cel.Function("isUriRef",
+ cel.MemberOverload(
+ "string_is_uri_ref_bool",
+ []*cel.Type{cel.StringType},
+ cel.BoolType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ s, ok := args[0].Value().(string)
+ if !ok {
+ return types.Bool(false)
+ }
+ _, err := url.Parse(s)
+ return types.Bool(err == nil)
+ }),
+ ),
+ ),
+ cel.Function(overloads.Contains,
+ cel.MemberOverload(
+ overloads.ContainsString, []*cel.Type{cel.StringType, cel.StringType}, cel.BoolType,
+ cel.BinaryBinding(func(lhs ref.Val, rhs ref.Val) ref.Val {
+ substr, ok := rhs.Value().(string)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(rhs)
+ }
+ return types.Bool(strings.Contains(lhs.Value().(string), substr))
+ }),
+ ),
+ cel.MemberOverload("contains_bytes", []*cel.Type{cel.BytesType, cel.BytesType}, cel.BoolType,
+ cel.BinaryBinding(func(lhs ref.Val, rhs ref.Val) ref.Val {
+ substr, ok := rhs.Value().([]byte)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(rhs)
+ }
+ return types.Bool(bytes.Contains(lhs.Value().([]byte), substr))
+ }),
+ ),
+ ),
+ cel.Function(overloads.EndsWith,
+ cel.MemberOverload(
+ overloads.EndsWithString, []*cel.Type{cel.StringType, cel.StringType}, cel.BoolType,
+ cel.BinaryBinding(func(lhs ref.Val, rhs ref.Val) ref.Val {
+ suffix, ok := rhs.Value().(string)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(rhs)
+ }
+ return types.Bool(strings.HasSuffix(lhs.Value().(string), suffix))
+ }),
+ ),
+ cel.MemberOverload("ends_with_bytes", []*cel.Type{cel.BytesType, cel.BytesType}, cel.BoolType,
+ cel.BinaryBinding(func(lhs ref.Val, rhs ref.Val) ref.Val {
+ suffix, ok := rhs.Value().([]byte)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(rhs)
+ }
+ return types.Bool(bytes.HasSuffix(lhs.Value().([]byte), suffix))
+ }),
+ ),
+ ),
+ cel.Function(overloads.StartsWith,
+ cel.MemberOverload(
+ overloads.StartsWithString, []*cel.Type{cel.StringType, cel.StringType}, cel.BoolType,
+ cel.BinaryBinding(func(lhs ref.Val, rhs ref.Val) ref.Val {
+ prefix, ok := rhs.Value().(string)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(rhs)
+ }
+ return types.Bool(strings.HasPrefix(lhs.Value().(string), prefix))
+ }),
+ ),
+ cel.MemberOverload("starts_with_bytes", []*cel.Type{cel.BytesType, cel.BytesType}, cel.BoolType,
+ cel.BinaryBinding(func(lhs ref.Val, rhs ref.Val) ref.Val {
+ prefix, ok := rhs.Value().([]byte)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(rhs)
+ }
+ return types.Bool(bytes.HasPrefix(lhs.Value().([]byte), prefix))
+ }),
+ ),
+ ),
+ cel.Function("isHostAndPort",
+ cel.MemberOverload("string_bool_is_host_and_port_bool",
+ []*cel.Type{cel.StringType, cel.BoolType}, cel.BoolType,
+ cel.BinaryBinding(func(lhs ref.Val, rhs ref.Val) ref.Val {
+ val, vok := lhs.Value().(string)
+ portReq, pok := rhs.Value().(bool)
+ if !vok || !pok {
+ return types.Bool(false)
+ }
+ return types.Bool(l.isHostAndPort(val, portReq))
+ }),
+ ),
+ ),
+ }
+}
+
+func (l Lib) ProgramOptions() []cel.ProgramOption {
+ return []cel.ProgramOption{
+ cel.EvalOptions(
+ cel.OptOptimize,
+ ),
+ }
+}
+
+func (l Lib) uniqueMemberOverload(itemType *cel.Type, overload func(lister traits.Lister) ref.Val) cel.FunctionOpt {
+ return cel.MemberOverload(
+ itemType.String()+"_unique_bool",
+ []*cel.Type{cel.ListType(itemType)},
+ cel.BoolType,
+ cel.UnaryBinding(func(value ref.Val) ref.Val {
+ list, ok := value.(traits.Lister)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(value)
+ }
+ return overload(list)
+ }),
+ )
+}
+
+func (l Lib) uniqueScalar(list traits.Lister) ref.Val {
+ size, ok := list.Size().Value().(int64)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(list.Size().Value())
+ }
+ if size <= 1 {
+ return types.Bool(true)
+ }
+ exist := make(map[ref.Val]struct{}, size)
+ for i := int64(0); i < size; i++ {
+ val := list.Get(types.Int(i))
+ if _, ok := exist[val]; ok {
+ return types.Bool(false)
+ }
+ exist[val] = struct{}{}
+ }
+ return types.Bool(true)
+}
+
+// uniqueBytes is an overload implementation of the unique function that
+// compares bytes type CEL values. This function is used instead of uniqueScalar
+// as the bytes ([]uint8) type is not hashable in Go; we cheat this by converting
+// the value to a string.
+func (l Lib) uniqueBytes(list traits.Lister) ref.Val {
+ size, ok := list.Size().Value().(int64)
+ if !ok {
+ return types.UnsupportedRefValConversionErr(list.Size().Value())
+ }
+ if size <= 1 {
+ return types.Bool(true)
+ }
+ exist := make(map[any]struct{}, size)
+ for i := int64(0); i < size; i++ {
+ val := list.Get(types.Int(i)).Value()
+ if b, ok := val.([]uint8); ok {
+ val = string(b)
+ }
+ if _, ok := exist[val]; ok {
+ return types.Bool(false)
+ }
+ exist[val] = struct{}{}
+ }
+ return types.Bool(true)
+}
+
+func (l Lib) validateEmail(addr string) bool {
+ a, err := mail.ParseAddress(addr)
+ if err != nil || strings.ContainsRune(addr, '<') || a.Address != addr {
+ return false
+ }
+
+ addr = a.Address
+ if len(addr) > 254 {
+ return false
+ }
+
+ parts := strings.SplitN(addr, "@", 2)
+ return len(parts[0]) <= 64 && l.validateHostname(parts[1])
+}
+
+func (l Lib) validateHostname(host string) bool {
+ if len(host) > 253 {
+ return false
+ }
+
+ s := strings.ToLower(strings.TrimSuffix(host, "."))
+ allDigits := false
+ // split hostname on '.' and validate each part
+ for _, part := range strings.Split(s, ".") {
+ allDigits = true
+ // if part is empty, longer than 63 chars, or starts/ends with '-', it is invalid
+ if l := len(part); l == 0 || l > 63 || part[0] == '-' || part[l-1] == '-' {
+ return false
+ }
+ // for each character in part
+ for _, ch := range part {
+ // if the character is not a-z, 0-9, or '-', it is invalid
+ if (ch < 'a' || ch > 'z') && (ch < '0' || ch > '9') && ch != '-' {
+ return false
+ }
+ allDigits = allDigits && ch >= '0' && ch <= '9'
+ }
+ }
+
+ // the last part cannot be all numbers
+ return !allDigits
+}
+
+func (l Lib) validateIP(addr string, ver int64) bool {
+ address := net.ParseIP(addr)
+ if address == nil {
+ return false
+ }
+ switch ver {
+ case 0:
+ return true
+ case 4:
+ return address.To4() != nil
+ case 6:
+ return address.To4() == nil
+ default:
+ return false
+ }
+}
+
+func (l Lib) validateIPPrefix(p string, ver int64, strict bool) bool {
+ prefix, err := netip.ParsePrefix(p)
+ if err != nil {
+ return false
+ }
+ if strict && (prefix.Addr() != prefix.Masked().Addr()) {
+ return false
+ }
+ switch ver {
+ case 0:
+ return true
+ case 4:
+ return prefix.Addr().Is4()
+ case 6:
+ return prefix.Addr().Is6()
+ default:
+ return false
+ }
+}
+
+func (l Lib) isHostAndPort(val string, portRequired bool) bool {
+ if len(val) == 0 {
+ return false
+ }
+
+ splitIdx := strings.LastIndexByte(val, ':')
+ if val[0] == '[' { // ipv6
+ end := strings.IndexByte(val, ']')
+ switch end + 1 {
+ case len(val): // no port
+ return !portRequired && l.validateIP(val[1:end], 6)
+ case splitIdx: // port
+ return l.validateIP(val[1:end], 6) &&
+ l.validatePort(val[splitIdx+1:])
+ default: // malformed
+ return false
+ }
+ }
+
+ if splitIdx < 0 {
+ return !portRequired &&
+ (l.validateHostname(val) ||
+ l.validateIP(val, 4))
+ }
+
+ host, port := val[:splitIdx], val[splitIdx+1:]
+ return (l.validateHostname(host) ||
+ l.validateIP(host, 4)) &&
+ l.validatePort(port)
+}
+
+func (l Lib) validatePort(val string) bool {
+ n, err := strconv.ParseUint(val, 10, 32)
+ return err == nil && n <= 65535
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/celext/lookups.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/celext/lookups.go
new file mode 100644
index 0000000..971c0af
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/celext/lookups.go
@@ -0,0 +1,107 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package celext
+
+import (
+ "github.com/google/cel-go/cel"
+ "github.com/google/cel-go/common/types"
+ "github.com/google/cel-go/common/types/ref"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// ProtoFieldToCELType resolves the CEL value type for the provided
+// FieldDescriptor. If generic is true, the specific subtypes of map and
+// repeated fields will be replaced with cel.DynType. If forItems is true, the
+// type for the repeated list items is returned instead of the list type itself.
+func ProtoFieldToCELType(fieldDesc protoreflect.FieldDescriptor, generic, forItems bool) *cel.Type {
+ if !forItems {
+ switch {
+ case fieldDesc.IsMap():
+ if generic {
+ return cel.MapType(cel.DynType, cel.DynType)
+ }
+ keyType := ProtoFieldToCELType(fieldDesc.MapKey(), false, true)
+ valType := ProtoFieldToCELType(fieldDesc.MapValue(), false, true)
+ return cel.MapType(keyType, valType)
+ case fieldDesc.IsList():
+ if generic {
+ return cel.ListType(cel.DynType)
+ }
+ itemType := ProtoFieldToCELType(fieldDesc, false, true)
+ return cel.ListType(itemType)
+ }
+ }
+
+ if fieldDesc.Kind() == protoreflect.MessageKind ||
+ fieldDesc.Kind() == protoreflect.GroupKind {
+ switch fqn := fieldDesc.Message().FullName(); fqn {
+ case "google.protobuf.Any":
+ return cel.AnyType
+ case "google.protobuf.Duration":
+ return cel.DurationType
+ case "google.protobuf.Timestamp":
+ return cel.TimestampType
+ default:
+ return cel.ObjectType(string(fqn))
+ }
+ }
+ return protoKindToCELType(fieldDesc.Kind())
+}
+
+func ProtoFieldToCELValue(fieldDesc protoreflect.FieldDescriptor, value protoreflect.Value, forItems bool) ref.Val {
+ switch {
+ case fieldDesc.IsList() && !forItems:
+ return types.NewProtoList(types.DefaultTypeAdapter, value.List())
+ default:
+ return types.DefaultTypeAdapter.NativeToValue(value.Interface())
+ }
+}
+
+// protoKindToCELType maps a protoreflect.Kind to a compatible cel.Type.
+func protoKindToCELType(kind protoreflect.Kind) *cel.Type {
+ switch kind {
+ case
+ protoreflect.FloatKind,
+ protoreflect.DoubleKind:
+ return cel.DoubleType
+ case
+ protoreflect.Int32Kind,
+ protoreflect.Int64Kind,
+ protoreflect.Sint32Kind,
+ protoreflect.Sint64Kind,
+ protoreflect.Sfixed32Kind,
+ protoreflect.Sfixed64Kind,
+ protoreflect.EnumKind:
+ return cel.IntType
+ case
+ protoreflect.Uint32Kind,
+ protoreflect.Uint64Kind,
+ protoreflect.Fixed32Kind,
+ protoreflect.Fixed64Kind:
+ return cel.UintType
+ case protoreflect.BoolKind:
+ return cel.BoolType
+ case protoreflect.StringKind:
+ return cel.StringType
+ case protoreflect.BytesKind:
+ return cel.BytesType
+ case
+ protoreflect.MessageKind,
+ protoreflect.GroupKind:
+ return cel.DynType
+ default:
+ return cel.DynType
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/constraints/cache.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/constraints/cache.go
new file mode 100644
index 0000000..d4777e1
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/constraints/cache.go
@@ -0,0 +1,225 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package constraints
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/celext"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "github.com/bufbuild/protovalidate-go/internal/expression"
+ "github.com/bufbuild/protovalidate-go/internal/extensions"
+ "github.com/google/cel-go/cel"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+ "google.golang.org/protobuf/reflect/protoregistry"
+)
+
+// Cache is a build-through cache to computed standard constraints.
+type Cache struct {
+ cache map[protoreflect.FieldDescriptor]expression.ASTSet
+}
+
+// NewCache constructs a new build-through cache for the standard constraints.
+func NewCache() Cache {
+ return Cache{
+ cache: map[protoreflect.FieldDescriptor]expression.ASTSet{},
+ }
+}
+
+// Build creates the standard constraints for the given field. If forItems is
+// true, the constraints for repeated list items is built instead of the
+// constraints on the list itself.
+func (c *Cache) Build(
+ env *cel.Env,
+ fieldDesc protoreflect.FieldDescriptor,
+ fieldConstraints *validate.FieldConstraints,
+ extensionTypeResolver protoregistry.ExtensionTypeResolver,
+ allowUnknownFields bool,
+ forItems bool,
+) (set expression.ProgramSet, err error) {
+ constraints, setOneof, done, err := c.resolveConstraints(
+ fieldDesc,
+ fieldConstraints,
+ forItems,
+ )
+ if done {
+ return nil, err
+ }
+
+ if err = reparseUnrecognized(extensionTypeResolver, constraints); err != nil {
+ return nil, errors.NewCompilationErrorf("error reparsing message: %w", err)
+ }
+ if !allowUnknownFields && len(constraints.GetUnknown()) > 0 {
+ return nil, errors.NewCompilationErrorf("unknown constraints in %s; see protovalidate.WithExtensionTypeResolver", constraints.Descriptor().FullName())
+ }
+
+ env, err = c.prepareEnvironment(env, fieldDesc, constraints, forItems)
+ if err != nil {
+ return nil, err
+ }
+
+ var asts expression.ASTSet
+ constraints.Range(func(desc protoreflect.FieldDescriptor, rule protoreflect.Value) bool {
+ fieldEnv, compileErr := env.Extend(
+ cel.Constant(
+ "rule",
+ celext.ProtoFieldToCELType(desc, true, false),
+ celext.ProtoFieldToCELValue(desc, rule, false),
+ ),
+ )
+ if compileErr != nil {
+ err = compileErr
+ return false
+ }
+ precomputedASTs, compileErr := c.loadOrCompileStandardConstraint(fieldEnv, setOneof, desc)
+ if compileErr != nil {
+ err = compileErr
+ return false
+ }
+ precomputedASTs.SetRuleValue(rule, desc)
+ asts = asts.Merge(precomputedASTs)
+ return true
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ rulesGlobal := cel.Globals(&expression.Variable{Name: "rules", Val: constraints.Interface()})
+ set, err = asts.ReduceResiduals(rulesGlobal)
+ return set, err
+}
+
+// resolveConstraints extracts the standard constraints for the specified field. An
+// error is returned if the wrong constraints are applied to a field (typically
+// if there is a type-mismatch). The done result is true if an error is returned
+// or if there are now standard constraints to apply to this field.
+func (c *Cache) resolveConstraints(
+ fieldDesc protoreflect.FieldDescriptor,
+ fieldConstraints *validate.FieldConstraints,
+ forItems bool,
+) (rules protoreflect.Message, fieldRule protoreflect.FieldDescriptor, done bool, err error) {
+ constraints := fieldConstraints.ProtoReflect()
+ setOneof := constraints.WhichOneof(fieldConstraintsOneofDesc)
+ if setOneof == nil {
+ return nil, nil, true, nil
+ }
+ expected, ok := c.getExpectedConstraintDescriptor(fieldDesc, forItems)
+ if ok && setOneof.FullName() != expected.FullName() {
+ return nil, nil, true, errors.NewCompilationErrorf(
+ "expected constraint %q, got %q on field %q",
+ expected.FullName(),
+ setOneof.FullName(),
+ fieldDesc.FullName(),
+ )
+ }
+ if !ok || !constraints.Has(setOneof) {
+ return nil, nil, true, nil
+ }
+ rules = constraints.Get(setOneof).Message()
+ return rules, setOneof, false, nil
+}
+
+// prepareEnvironment prepares the environment for compiling standard constraint
+// expressions.
+func (c *Cache) prepareEnvironment(
+ env *cel.Env,
+ fieldDesc protoreflect.FieldDescriptor,
+ rules protoreflect.Message,
+ forItems bool,
+) (*cel.Env, error) {
+ env, err := env.Extend(
+ cel.Types(rules.Interface()),
+ cel.Variable("this", celext.ProtoFieldToCELType(fieldDesc, true, forItems)),
+ cel.Variable("rules",
+ cel.ObjectType(string(rules.Descriptor().FullName()))),
+ )
+ if err != nil {
+ return nil, errors.NewCompilationErrorf(
+ "failed to extend base environment: %w", err)
+ }
+ return env, nil
+}
+
+// loadOrCompileStandardConstraint loads the precompiled ASTs for the
+// specified constraint field from the Cache if present or precomputes them
+// otherwise. The result may be empty if the constraint does not have associated
+// CEL expressions.
+func (c *Cache) loadOrCompileStandardConstraint(
+ env *cel.Env,
+ setOneOf protoreflect.FieldDescriptor,
+ constraintFieldDesc protoreflect.FieldDescriptor,
+) (set expression.ASTSet, err error) {
+ if cachedConstraint, ok := c.cache[constraintFieldDesc]; ok {
+ return cachedConstraint, nil
+ }
+ exprs := expression.Expressions{
+ Constraints: extensions.Resolve[*validate.PredefinedConstraints](
+ constraintFieldDesc.Options(),
+ validate.E_Predefined,
+ ).GetCel(),
+ RulePath: []*validate.FieldPathElement{
+ errors.FieldPathElement(setOneOf),
+ errors.FieldPathElement(constraintFieldDesc),
+ },
+ }
+ set, err = expression.CompileASTs(exprs, env)
+ if err != nil {
+ return set, errors.NewCompilationErrorf(
+ "failed to compile standard constraint %q: %w",
+ constraintFieldDesc.FullName(), err)
+ }
+ c.cache[constraintFieldDesc] = set
+ return set, nil
+}
+
+// getExpectedConstraintDescriptor produces the field descriptor from the
+// validate.FieldConstraints 'type' oneof that matches the provided target
+// field descriptor. If ok is false, the field does not expect any standard
+// constraints.
+func (c *Cache) getExpectedConstraintDescriptor(
+ targetFieldDesc protoreflect.FieldDescriptor,
+ forItems bool,
+) (expected protoreflect.FieldDescriptor, ok bool) {
+ switch {
+ case targetFieldDesc.IsMap():
+ return mapFieldConstraintsDesc, true
+ case targetFieldDesc.IsList() && !forItems:
+ return repeatedFieldConstraintsDesc, true
+ case targetFieldDesc.Kind() == protoreflect.MessageKind,
+ targetFieldDesc.Kind() == protoreflect.GroupKind:
+ expected, ok = expectedWKTConstraints[targetFieldDesc.Message().FullName()]
+ return expected, ok
+ default:
+ expected, ok = expectedStandardConstraints[targetFieldDesc.Kind()]
+ return expected, ok
+ }
+}
+
+func reparseUnrecognized(
+ extensionTypeResolver protoregistry.ExtensionTypeResolver,
+ reflectMessage protoreflect.Message,
+) error {
+ if unknown := reflectMessage.GetUnknown(); len(unknown) > 0 {
+ reflectMessage.SetUnknown(nil)
+ options := proto.UnmarshalOptions{
+ Resolver: extensionTypeResolver,
+ Merge: true,
+ }
+ if err := options.Unmarshal(unknown, reflectMessage.Interface()); err != nil {
+ return err
+ }
+ }
+ return nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/constraints/lookups.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/constraints/lookups.go
new file mode 100644
index 0000000..5cdf4f5
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/constraints/lookups.go
@@ -0,0 +1,92 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package constraints
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+var (
+ // fieldConstraintsDesc provides a Descriptor for validate.FieldConstraints.
+ fieldConstraintsDesc = (*validate.FieldConstraints)(nil).ProtoReflect().Descriptor()
+
+ // fieldConstraintsOneofDesc provides the OneofDescriptor for the type union
+ // in FieldConstraints.
+ fieldConstraintsOneofDesc = fieldConstraintsDesc.Oneofs().ByName("type")
+
+ // mapFieldConstraintsDesc provides the FieldDescriptor for the map standard
+ // constraints.
+ mapFieldConstraintsDesc = fieldConstraintsDesc.Fields().ByName("map")
+
+ // repeatedFieldConstraintsDesc provides the FieldDescriptor for the repeated
+ // standard constraints.
+ repeatedFieldConstraintsDesc = fieldConstraintsDesc.Fields().ByName("repeated")
+)
+
+// expectedStandardConstraints maps protocol buffer field kinds to their
+// expected field constraints.
+var expectedStandardConstraints = map[protoreflect.Kind]protoreflect.FieldDescriptor{
+ protoreflect.FloatKind: fieldConstraintsDesc.Fields().ByName("float"),
+ protoreflect.DoubleKind: fieldConstraintsDesc.Fields().ByName("double"),
+ protoreflect.Int32Kind: fieldConstraintsDesc.Fields().ByName("int32"),
+ protoreflect.Int64Kind: fieldConstraintsDesc.Fields().ByName("int64"),
+ protoreflect.Uint32Kind: fieldConstraintsDesc.Fields().ByName("uint32"),
+ protoreflect.Uint64Kind: fieldConstraintsDesc.Fields().ByName("uint64"),
+ protoreflect.Sint32Kind: fieldConstraintsDesc.Fields().ByName("sint32"),
+ protoreflect.Sint64Kind: fieldConstraintsDesc.Fields().ByName("sint64"),
+ protoreflect.Fixed32Kind: fieldConstraintsDesc.Fields().ByName("fixed32"),
+ protoreflect.Fixed64Kind: fieldConstraintsDesc.Fields().ByName("fixed64"),
+ protoreflect.Sfixed32Kind: fieldConstraintsDesc.Fields().ByName("sfixed32"),
+ protoreflect.Sfixed64Kind: fieldConstraintsDesc.Fields().ByName("sfixed64"),
+ protoreflect.BoolKind: fieldConstraintsDesc.Fields().ByName("bool"),
+ protoreflect.StringKind: fieldConstraintsDesc.Fields().ByName("string"),
+ protoreflect.BytesKind: fieldConstraintsDesc.Fields().ByName("bytes"),
+ protoreflect.EnumKind: fieldConstraintsDesc.Fields().ByName("enum"),
+}
+
+var expectedWKTConstraints = map[protoreflect.FullName]protoreflect.FieldDescriptor{
+ "google.protobuf.Any": fieldConstraintsDesc.Fields().ByName("any"),
+ "google.protobuf.Duration": fieldConstraintsDesc.Fields().ByName("duration"),
+ "google.protobuf.Timestamp": fieldConstraintsDesc.Fields().ByName("timestamp"),
+}
+
+// ExpectedWrapperConstraints returns the validate.FieldConstraints field that
+// is expected for the given wrapper well-known type's full name. If ok is
+// false, no standard constraints exist for that type.
+func ExpectedWrapperConstraints(fqn protoreflect.FullName) (desc protoreflect.FieldDescriptor, ok bool) {
+ switch fqn {
+ case "google.protobuf.BoolValue":
+ return expectedStandardConstraints[protoreflect.BoolKind], true
+ case "google.protobuf.BytesValue":
+ return expectedStandardConstraints[protoreflect.BytesKind], true
+ case "google.protobuf.DoubleValue":
+ return expectedStandardConstraints[protoreflect.DoubleKind], true
+ case "google.protobuf.FloatValue":
+ return expectedStandardConstraints[protoreflect.FloatKind], true
+ case "google.protobuf.Int32Value":
+ return expectedStandardConstraints[protoreflect.Int32Kind], true
+ case "google.protobuf.Int64Value":
+ return expectedStandardConstraints[protoreflect.Int64Kind], true
+ case "google.protobuf.StringValue":
+ return expectedStandardConstraints[protoreflect.StringKind], true
+ case "google.protobuf.UInt32Value":
+ return expectedStandardConstraints[protoreflect.Uint32Kind], true
+ case "google.protobuf.UInt64Value":
+ return expectedStandardConstraints[protoreflect.Uint64Kind], true
+ default:
+ return nil, false
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/compilation.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/compilation.go
new file mode 100644
index 0000000..e17b466
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/compilation.go
@@ -0,0 +1,42 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package errors
+
+import (
+ "fmt"
+)
+
+// A CompilationError is returned if a CEL expression cannot be compiled &
+// type-checked or if invalid standard constraints are applied.
+type CompilationError struct {
+ cause error
+}
+
+// NewCompilationError creates a new CompilationError with the provided cause.
+func NewCompilationError(cause error) *CompilationError {
+ return &CompilationError{cause: cause}
+}
+
+// NewCompilationErrorf creates a new CompilationError, constructing a causal error from
+// the provided format and args.
+func NewCompilationErrorf(format string, args ...any) *CompilationError {
+ return NewCompilationError(fmt.Errorf(format, args...))
+}
+
+func (err *CompilationError) Error() string {
+ return fmt.Sprintf("compilation error: %v", err.cause)
+}
+
+func (err *CompilationError) Unwrap() error { return err.cause }
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/runtime.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/runtime.go
new file mode 100644
index 0000000..e135253
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/runtime.go
@@ -0,0 +1,44 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package errors
+
+import (
+ "fmt"
+)
+
+// A RuntimeError is returned if a valid CEL expression evaluation is terminated.
+// The two built-in reasons are 'no_matching_overload' when a CEL function has
+// no overload for the types of the arguments or 'no_such_field' when a map or
+// message does not contain the desired field.
+type RuntimeError struct {
+ cause error
+}
+
+// NewRuntimeError creates a new RuntimeError with the provided cause.
+func NewRuntimeError(cause error) *RuntimeError {
+ return &RuntimeError{cause: cause}
+}
+
+// NewRuntimeErrorf creates a new RuntimeError, constructing a causal error from
+// the provided format and args.
+func NewRuntimeErrorf(format string, args ...any) *RuntimeError {
+ return NewRuntimeError(fmt.Errorf(format, args...))
+}
+
+func (err *RuntimeError) Error() string {
+ return fmt.Sprintf("runtime error: %v", err.cause)
+}
+
+func (err *RuntimeError) Unwrap() error { return err.cause }
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/utils.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/utils.go
new file mode 100644
index 0000000..5308e69
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/utils.go
@@ -0,0 +1,171 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package errors
+
+import (
+ "errors"
+ "slices"
+ "strconv"
+ "strings"
+
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+ "google.golang.org/protobuf/types/descriptorpb"
+)
+
+// Merge is a utility to resolve and combine errors resulting from
+// evaluation. If ok is false, execution of validation should stop (either due
+// to failFast or the result is not a ValidationError).
+//
+//nolint:errorlint
+func Merge(dst, src error, failFast bool) (ok bool, err error) {
+ if src == nil {
+ return true, dst
+ }
+
+ srcValErrs, ok := src.(*ValidationError)
+ if !ok {
+ return false, src
+ }
+
+ if dst == nil {
+ return !(failFast && len(srcValErrs.Violations) > 0), src
+ }
+
+ dstValErrs, ok := dst.(*ValidationError)
+ if !ok {
+ // what should we do here?
+ return false, dst
+ }
+
+ dstValErrs.Violations = append(dstValErrs.Violations, srcValErrs.Violations...)
+ return !(failFast && len(dstValErrs.Violations) > 0), dst
+}
+
+// FieldPathElement returns a buf.validate.FieldPathElement that corresponds to
+// a provided FieldDescriptor. If the provided FieldDescriptor is nil, nil is
+// returned.
+func FieldPathElement(field protoreflect.FieldDescriptor) *validate.FieldPathElement {
+ if field == nil {
+ return nil
+ }
+ return &validate.FieldPathElement{
+ FieldNumber: proto.Int32(int32(field.Number())),
+ FieldName: proto.String(field.TextName()),
+ FieldType: descriptorpb.FieldDescriptorProto_Type(field.Kind()).Enum(),
+ }
+}
+
+// FieldPath returns a single-element buf.validate.FieldPath corresponding to
+// the provided FieldDescriptor, or nil if the provided FieldDescriptor is nil.
+func FieldPath(field protoreflect.FieldDescriptor) *validate.FieldPath {
+ if field == nil {
+ return nil
+ }
+ return &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{
+ FieldPathElement(field),
+ },
+ }
+}
+
+// UpdatePaths modifies the field and rule paths of an error, appending an
+// element to the end of each field path (if provided) and prepending a list of
+// elements to the beginning of each rule path (if provided.)
+//
+// Note that this function is ordinarily used to append field paths in reverse
+// order, as the stack bubbles up through the evaluators. Then, at the end, the
+// path is reversed. Rule paths are generally static, so this optimization isn't
+// applied for rule paths.
+func UpdatePaths(err error, fieldSuffix *validate.FieldPathElement, rulePrefix []*validate.FieldPathElement) {
+ if fieldSuffix == nil && len(rulePrefix) == 0 {
+ return
+ }
+ var valErr *ValidationError
+ if errors.As(err, &valErr) {
+ for _, violation := range valErr.Violations {
+ if fieldSuffix != nil {
+ if violation.Proto.GetField() == nil {
+ violation.Proto.Field = &validate.FieldPath{}
+ }
+ violation.Proto.Field.Elements = append(violation.Proto.Field.Elements, fieldSuffix)
+ }
+ if len(rulePrefix) != 0 {
+ violation.Proto.Rule.Elements = append(
+ append([]*validate.FieldPathElement{}, rulePrefix...),
+ violation.Proto.GetRule().GetElements()...,
+ )
+ }
+ }
+ }
+}
+
+// FinalizePaths reverses all field paths in the error and populates the
+// deprecated string-based field path.
+func FinalizePaths(err error) {
+ var valErr *ValidationError
+ if errors.As(err, &valErr) {
+ for _, violation := range valErr.Violations {
+ if violation.Proto.GetField() != nil {
+ slices.Reverse(violation.Proto.GetField().GetElements())
+ //nolint:staticcheck // Intentional use of deprecated field
+ violation.Proto.FieldPath = proto.String(FieldPathString(violation.Proto.GetField().GetElements()))
+ }
+ }
+ }
+}
+
+// FieldPathString takes a FieldPath and encodes it to a string-based dotted
+// field path.
+func FieldPathString(path []*validate.FieldPathElement) string {
+ var result strings.Builder
+ for i, element := range path {
+ if i > 0 {
+ result.WriteByte('.')
+ }
+ result.WriteString(element.GetFieldName())
+ subscript := element.GetSubscript()
+ if subscript == nil {
+ continue
+ }
+ result.WriteByte('[')
+ switch value := subscript.(type) {
+ case *validate.FieldPathElement_Index:
+ result.WriteString(strconv.FormatUint(value.Index, 10))
+ case *validate.FieldPathElement_BoolKey:
+ result.WriteString(strconv.FormatBool(value.BoolKey))
+ case *validate.FieldPathElement_IntKey:
+ result.WriteString(strconv.FormatInt(value.IntKey, 10))
+ case *validate.FieldPathElement_UintKey:
+ result.WriteString(strconv.FormatUint(value.UintKey, 10))
+ case *validate.FieldPathElement_StringKey:
+ result.WriteString(strconv.Quote(value.StringKey))
+ }
+ result.WriteByte(']')
+ }
+ return result.String()
+}
+
+// MarkForKey marks the provided error as being for a map key, by setting the
+// `for_key` flag on each violation within the validation error.
+func MarkForKey(err error) {
+ var valErr *ValidationError
+ if errors.As(err, &valErr) {
+ for _, violation := range valErr.Violations {
+ violation.Proto.ForKey = proto.Bool(true)
+ }
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/validation.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/validation.go
new file mode 100644
index 0000000..337db60
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/errors/validation.go
@@ -0,0 +1,83 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package errors
+
+import (
+ "fmt"
+ "strings"
+
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// Violation represents a single instance where a validation rule was not met.
+// It provides information about the field that caused the violation, the
+// specific unfulfilled constraint, and a human-readable error message.
+type Violation struct {
+ // Proto contains the violation's proto.Message form.
+ Proto *validate.Violation
+
+ // FieldValue contains the value of the specific field that failed
+ // validation. If there was no value, this will contain an invalid value.
+ FieldValue protoreflect.Value
+
+ // FieldDescriptor contains the field descriptor corresponding to the
+ // field that failed validation.
+ FieldDescriptor protoreflect.FieldDescriptor
+
+ // RuleValue contains the value of the rule that specified the failed
+ // constraint. Not all constraints have a value; only standard and
+ // predefined constraints have rule values. In violations caused by other
+ // kinds of constraints, like custom contraints, this will contain an
+ // invalid value.
+ RuleValue protoreflect.Value
+
+ // RuleDescriptor contains the field descriptor corresponding to the
+ // rule that failed validation.
+ RuleDescriptor protoreflect.FieldDescriptor
+}
+
+// A ValidationError is returned if one or more constraint violations were
+// detected.
+type ValidationError struct {
+ Violations []*Violation
+}
+
+func (err *ValidationError) Error() string {
+ bldr := &strings.Builder{}
+ bldr.WriteString("validation error:")
+ for _, violation := range err.Violations {
+ bldr.WriteString("\n - ")
+ if fieldPath := FieldPathString(violation.Proto.GetField().GetElements()); fieldPath != "" {
+ bldr.WriteString(fieldPath)
+ bldr.WriteString(": ")
+ }
+ _, _ = fmt.Fprintf(bldr, "%s [%s]",
+ violation.Proto.GetMessage(),
+ violation.Proto.GetConstraintId())
+ }
+ return bldr.String()
+}
+
+// ToProto converts this error into its proto.Message form.
+func (err *ValidationError) ToProto() *validate.Violations {
+ violations := &validate.Violations{
+ Violations: make([]*validate.Violation, len(err.Violations)),
+ }
+ for i, violation := range err.Violations {
+ violations.Violations[i] = violation.Proto
+ }
+ return violations
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/any.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/any.go
new file mode 100644
index 0000000..8a46c43
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/any.go
@@ -0,0 +1,124 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+//nolint:gochecknoglobals
+var (
+ anyRuleDescriptor = (&validate.FieldConstraints{}).ProtoReflect().Descriptor().Fields().ByName("any")
+ anyInRuleDescriptor = (&validate.AnyRules{}).ProtoReflect().Descriptor().Fields().ByName("in")
+ anyInRulePath = &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{
+ errors.FieldPathElement(anyRuleDescriptor),
+ errors.FieldPathElement(anyInRuleDescriptor),
+ },
+ }
+ anyNotInDescriptor = (&validate.AnyRules{}).ProtoReflect().Descriptor().Fields().ByName("not_in")
+ anyNotInRulePath = &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{
+ errors.FieldPathElement(anyRuleDescriptor),
+ errors.FieldPathElement(anyNotInDescriptor),
+ },
+ }
+)
+
+// anyPB is a specialized evaluator for applying validate.AnyRules to an
+// anypb.Any message. This is handled outside CEL which attempts to
+// hydrate anyPB's within an expression, breaking evaluation if the type is
+// unknown at runtime.
+type anyPB struct {
+ base base
+
+ // TypeURLDescriptor is the descriptor for the TypeURL field
+ TypeURLDescriptor protoreflect.FieldDescriptor
+ // In specifies which type URLs the value may possess
+ In map[string]struct{}
+ // NotIn specifies which type URLs the value may not possess
+ NotIn map[string]struct{}
+ // InValue contains the original `in` rule value.
+ InValue protoreflect.Value
+ // NotInValue contains the original `not_in` rule value.
+ NotInValue protoreflect.Value
+}
+
+func (a anyPB) Evaluate(val protoreflect.Value, failFast bool) error {
+ typeURL := val.Message().Get(a.TypeURLDescriptor).String()
+
+ err := &errors.ValidationError{}
+ if len(a.In) > 0 {
+ if _, ok := a.In[typeURL]; !ok {
+ err.Violations = append(err.Violations, &errors.Violation{
+ Proto: &validate.Violation{
+ Field: a.base.fieldPath(),
+ Rule: a.base.rulePath(anyInRulePath),
+ ConstraintId: proto.String("any.in"),
+ Message: proto.String("type URL must be in the allow list"),
+ },
+ FieldValue: val,
+ FieldDescriptor: a.base.Descriptor,
+ RuleValue: a.InValue,
+ RuleDescriptor: anyInRuleDescriptor,
+ })
+ if failFast {
+ return err
+ }
+ }
+ }
+
+ if len(a.NotIn) > 0 {
+ if _, ok := a.NotIn[typeURL]; ok {
+ err.Violations = append(err.Violations, &errors.Violation{
+ Proto: &validate.Violation{
+ Field: a.base.fieldPath(),
+ Rule: a.base.rulePath(anyNotInRulePath),
+ ConstraintId: proto.String("any.not_in"),
+ Message: proto.String("type URL must not be in the block list"),
+ },
+ FieldValue: val,
+ FieldDescriptor: a.base.Descriptor,
+ RuleValue: a.NotInValue,
+ RuleDescriptor: anyNotInDescriptor,
+ })
+ }
+ }
+
+ if len(err.Violations) > 0 {
+ return err
+ }
+ return nil
+}
+
+func (a anyPB) Tautology() bool {
+ return len(a.In) == 0 && len(a.NotIn) == 0
+}
+
+func stringsToSet(ss []string) map[string]struct{} {
+ if len(ss) == 0 {
+ return nil
+ }
+ set := make(map[string]struct{}, len(ss))
+ for _, s := range ss {
+ set[s] = struct{}{}
+ }
+ return set
+}
+
+var _ evaluator = anyPB{}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/base.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/base.go
new file mode 100644
index 0000000..da65b95
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/base.go
@@ -0,0 +1,75 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// base is a common struct used by all field evaluators. It holds
+// some common information used across all field evaluators.
+type base struct {
+ // Descriptor is the FieldDescriptor targeted by this evaluator, nor nil if
+ // there is none.
+ Descriptor protoreflect.FieldDescriptor
+
+ // FieldPatht is the field path element that pertains to this evaluator, or
+ // nil if there is none.
+ FieldPathElement *validate.FieldPathElement
+
+ // RulePrefix is a static prefix this evaluator should add to the rule path
+ // of violations.
+ RulePrefix *validate.FieldPath
+}
+
+func newBase(valEval *value) base {
+ return base{
+ Descriptor: valEval.Descriptor,
+ FieldPathElement: errors.FieldPathElement(valEval.Descriptor),
+ RulePrefix: valEval.NestedRule,
+ }
+}
+
+func (b *base) fieldPath() *validate.FieldPath {
+ if b.FieldPathElement == nil {
+ return nil
+ }
+ return &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{
+ b.FieldPathElement,
+ },
+ }
+}
+
+func (b *base) rulePath(suffix *validate.FieldPath) *validate.FieldPath {
+ return prefixRulePath(b.RulePrefix, suffix)
+}
+
+func prefixRulePath(prefix *validate.FieldPath, suffix *validate.FieldPath) *validate.FieldPath {
+ if len(prefix.GetElements()) > 0 {
+ return &validate.FieldPath{
+ Elements: append(
+ append(
+ []*validate.FieldPathElement{},
+ prefix.GetElements()...,
+ ),
+ suffix.GetElements()...,
+ ),
+ }
+ }
+ return suffix
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/builder.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/builder.go
new file mode 100644
index 0000000..38b4ca3
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/builder.go
@@ -0,0 +1,568 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "sync"
+ "sync/atomic"
+
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/celext"
+ "github.com/bufbuild/protovalidate-go/internal/constraints"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "github.com/bufbuild/protovalidate-go/internal/expression"
+ "github.com/google/cel-go/cel"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+ "google.golang.org/protobuf/reflect/protoregistry"
+ "google.golang.org/protobuf/types/dynamicpb"
+)
+
+//nolint:gochecknoglobals
+var (
+ celRuleDescriptor = (&validate.FieldConstraints{}).ProtoReflect().Descriptor().Fields().ByName("cel")
+ celRuleField = errors.FieldPathElement(celRuleDescriptor)
+)
+
+// Builder is a build-through cache of message evaluators keyed off the provided
+// descriptor.
+type Builder struct {
+ mtx sync.Mutex // serializes cache writes.
+ cache atomic.Pointer[MessageCache] // copy-on-write cache.
+ env *cel.Env
+ constraints constraints.Cache
+ resolver StandardConstraintResolver
+ extensionTypeResolver protoregistry.ExtensionTypeResolver
+ allowUnknownFields bool
+ Load func(desc protoreflect.MessageDescriptor) MessageEvaluator
+}
+
+type StandardConstraintResolver interface {
+ ResolveMessageConstraints(desc protoreflect.MessageDescriptor) *validate.MessageConstraints
+ ResolveOneofConstraints(desc protoreflect.OneofDescriptor) *validate.OneofConstraints
+ ResolveFieldConstraints(desc protoreflect.FieldDescriptor) *validate.FieldConstraints
+}
+
+// NewBuilder initializes a new Builder.
+func NewBuilder(
+ env *cel.Env,
+ disableLazy bool,
+ res StandardConstraintResolver,
+ extensionTypeResolver protoregistry.ExtensionTypeResolver,
+ allowUnknownFields bool,
+ seedDesc ...protoreflect.MessageDescriptor,
+) *Builder {
+ bldr := &Builder{
+ env: env,
+ constraints: constraints.NewCache(),
+ resolver: res,
+ extensionTypeResolver: extensionTypeResolver,
+ allowUnknownFields: allowUnknownFields,
+ }
+
+ if disableLazy {
+ bldr.Load = bldr.load
+ } else {
+ bldr.Load = bldr.loadOrBuild
+ }
+
+ cache := make(MessageCache, len(seedDesc))
+ for _, desc := range seedDesc {
+ bldr.build(desc, cache)
+ }
+ bldr.cache.Store(&cache)
+ return bldr
+}
+
+// load returns a pre-cached MessageEvaluator for the given descriptor or, if
+// the descriptor is unknown, returns an evaluator that always resolves to a
+// errors.CompilationError.
+func (bldr *Builder) load(desc protoreflect.MessageDescriptor) MessageEvaluator {
+ if eval, ok := (*bldr.cache.Load())[desc]; ok {
+ return eval
+ }
+ return unknownMessage{desc: desc}
+}
+
+// loadOrBuild either returns a memoized MessageEvaluator for the given
+// descriptor or lazily constructs a new one. This method is thread-safe via
+// locking.
+func (bldr *Builder) loadOrBuild(desc protoreflect.MessageDescriptor) MessageEvaluator {
+ if eval, ok := (*bldr.cache.Load())[desc]; ok {
+ return eval
+ }
+ bldr.mtx.Lock()
+ defer bldr.mtx.Unlock()
+ cache := *bldr.cache.Load()
+ if eval, ok := cache[desc]; ok {
+ return eval
+ }
+ newCache := cache.Clone()
+ msgEval := bldr.build(desc, newCache)
+ bldr.cache.Store(&newCache)
+ return msgEval
+}
+
+func (bldr *Builder) build(
+ desc protoreflect.MessageDescriptor,
+ cache MessageCache,
+) *message {
+ if eval, ok := cache[desc]; ok {
+ return eval
+ }
+ msgEval := &message{}
+ cache[desc] = msgEval
+ bldr.buildMessage(desc, msgEval, cache)
+ return msgEval
+}
+
+func (bldr *Builder) buildMessage(
+ desc protoreflect.MessageDescriptor, msgEval *message,
+ cache MessageCache,
+) {
+ msgConstraints := bldr.resolver.ResolveMessageConstraints(desc)
+ if msgConstraints.GetDisabled() {
+ return
+ }
+
+ steps := []func(
+ desc protoreflect.MessageDescriptor,
+ msgConstraints *validate.MessageConstraints,
+ msg *message,
+ cache MessageCache,
+ ){
+ bldr.processMessageExpressions,
+ bldr.processOneofConstraints,
+ bldr.processFields,
+ }
+
+ for _, step := range steps {
+ if step(desc, msgConstraints, msgEval, cache); msgEval.Err != nil {
+ break
+ }
+ }
+}
+
+func (bldr *Builder) processMessageExpressions(
+ desc protoreflect.MessageDescriptor,
+ msgConstraints *validate.MessageConstraints,
+ msgEval *message,
+ _ MessageCache,
+) {
+ exprs := expression.Expressions{
+ Constraints: msgConstraints.GetCel(),
+ }
+ compiledExprs, err := expression.Compile(
+ exprs,
+ bldr.env,
+ cel.Types(dynamicpb.NewMessage(desc)),
+ cel.Variable("this", cel.ObjectType(string(desc.FullName()))),
+ )
+ if err != nil {
+ msgEval.Err = err
+ return
+ }
+
+ msgEval.Append(celPrograms{
+ ProgramSet: compiledExprs,
+ })
+}
+
+func (bldr *Builder) processOneofConstraints(
+ desc protoreflect.MessageDescriptor,
+ _ *validate.MessageConstraints,
+ msgEval *message,
+ _ MessageCache,
+) {
+ oneofs := desc.Oneofs()
+ for i := 0; i < oneofs.Len(); i++ {
+ oneofDesc := oneofs.Get(i)
+ oneofConstraints := bldr.resolver.ResolveOneofConstraints(oneofDesc)
+ oneofEval := oneof{
+ Descriptor: oneofDesc,
+ Required: oneofConstraints.GetRequired(),
+ }
+ msgEval.Append(oneofEval)
+ }
+}
+
+func (bldr *Builder) processFields(
+ desc protoreflect.MessageDescriptor,
+ _ *validate.MessageConstraints,
+ msgEval *message,
+ cache MessageCache,
+) {
+ fields := desc.Fields()
+ for i := 0; i < fields.Len(); i++ {
+ fdesc := fields.Get(i)
+ fieldConstraints := bldr.resolver.ResolveFieldConstraints(fdesc)
+ fldEval, err := bldr.buildField(fdesc, fieldConstraints, cache)
+ if err != nil {
+ msgEval.Err = err
+ return
+ }
+ msgEval.Append(fldEval)
+ }
+}
+
+func (bldr *Builder) buildField(
+ fieldDescriptor protoreflect.FieldDescriptor,
+ fieldConstraints *validate.FieldConstraints,
+ cache MessageCache,
+) (field, error) {
+ fld := field{
+ Value: value{
+ Descriptor: fieldDescriptor,
+ },
+ Required: fieldConstraints.GetRequired(),
+ IgnoreEmpty: fieldDescriptor.HasPresence() ||
+ bldr.shouldIgnoreEmpty(fieldConstraints),
+ IgnoreDefault: fieldDescriptor.HasPresence() &&
+ bldr.shouldIgnoreDefault(fieldConstraints),
+ }
+ if fld.IgnoreDefault {
+ fld.Zero = bldr.zeroValue(fieldDescriptor, false)
+ }
+ err := bldr.buildValue(fieldDescriptor, fieldConstraints, &fld.Value, cache)
+ return fld, err
+}
+
+func (bldr *Builder) buildValue(
+ fdesc protoreflect.FieldDescriptor,
+ constraints *validate.FieldConstraints,
+ valEval *value,
+ cache MessageCache,
+) (err error) {
+ steps := []func(
+ fdesc protoreflect.FieldDescriptor,
+ fieldConstraints *validate.FieldConstraints,
+ valEval *value,
+ cache MessageCache,
+ ) error{
+ bldr.processIgnoreEmpty,
+ bldr.processFieldExpressions,
+ bldr.processEmbeddedMessage,
+ bldr.processWrapperConstraints,
+ bldr.processStandardConstraints,
+ bldr.processAnyConstraints,
+ bldr.processEnumConstraints,
+ bldr.processMapConstraints,
+ bldr.processRepeatedConstraints,
+ }
+
+ for _, step := range steps {
+ if err = step(fdesc, constraints, valEval, cache); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (bldr *Builder) processIgnoreEmpty(
+ fdesc protoreflect.FieldDescriptor,
+ constraints *validate.FieldConstraints,
+ val *value,
+ _ MessageCache,
+) error {
+ // the only time we need to ignore empty on a value is if it's evaluating a
+ // field item (repeated element or map key/value).
+ val.IgnoreEmpty = val.NestedRule != nil && bldr.shouldIgnoreEmpty(constraints)
+ if val.IgnoreEmpty {
+ val.Zero = bldr.zeroValue(fdesc, val.NestedRule != nil)
+ }
+ return nil
+}
+
+func (bldr *Builder) processFieldExpressions(
+ fieldDesc protoreflect.FieldDescriptor,
+ fieldConstraints *validate.FieldConstraints,
+ eval *value,
+ _ MessageCache,
+) error {
+ exprs := expression.Expressions{
+ Constraints: fieldConstraints.GetCel(),
+ }
+
+ celTyp := celext.ProtoFieldToCELType(fieldDesc, false, eval.NestedRule != nil)
+ opts := append(
+ celext.RequiredCELEnvOptions(fieldDesc),
+ cel.Variable("this", celTyp),
+ )
+ compiledExpressions, err := expression.Compile(exprs, bldr.env, opts...)
+ if err != nil {
+ return err
+ }
+ for i := range compiledExpressions {
+ compiledExpressions[i].Path = []*validate.FieldPathElement{
+ {
+ FieldNumber: proto.Int32(celRuleField.GetFieldNumber()),
+ FieldType: celRuleField.GetFieldType().Enum(),
+ FieldName: proto.String(celRuleField.GetFieldName()),
+ Subscript: &validate.FieldPathElement_Index{
+ Index: uint64(i),
+ },
+ },
+ }
+ compiledExpressions[i].Descriptor = celRuleDescriptor
+ }
+ if len(compiledExpressions) > 0 {
+ eval.Constraints = append(eval.Constraints,
+ celPrograms{
+ base: newBase(eval),
+ ProgramSet: compiledExpressions,
+ },
+ )
+ }
+ return nil
+}
+
+func (bldr *Builder) processEmbeddedMessage(
+ fdesc protoreflect.FieldDescriptor,
+ rules *validate.FieldConstraints,
+ valEval *value,
+ cache MessageCache,
+) error {
+ if !isMessageField(fdesc) ||
+ bldr.shouldSkip(rules) ||
+ fdesc.IsMap() ||
+ (fdesc.IsList() && valEval.NestedRule == nil) {
+ return nil
+ }
+
+ embedEval := bldr.build(fdesc.Message(), cache)
+ if err := embedEval.Err; err != nil {
+ return errors.NewCompilationErrorf(
+ "failed to compile embedded type %s for %s: %w",
+ fdesc.Message().FullName(), fdesc.FullName(), err)
+ }
+ valEval.Append(&embeddedMessage{
+ base: newBase(valEval),
+ message: embedEval,
+ })
+
+ return nil
+}
+
+func (bldr *Builder) processWrapperConstraints(
+ fdesc protoreflect.FieldDescriptor,
+ rules *validate.FieldConstraints,
+ valEval *value,
+ cache MessageCache,
+) error {
+ if !isMessageField(fdesc) ||
+ bldr.shouldSkip(rules) ||
+ fdesc.IsMap() ||
+ (fdesc.IsList() && valEval.NestedRule == nil) {
+ return nil
+ }
+
+ expectedWrapperDescriptor, ok := constraints.ExpectedWrapperConstraints(fdesc.Message().FullName())
+ if !ok || !rules.ProtoReflect().Has(expectedWrapperDescriptor) {
+ return nil
+ }
+ unwrapped := value{
+ Descriptor: valEval.Descriptor,
+ NestedRule: valEval.NestedRule,
+ }
+ err := bldr.buildValue(fdesc.Message().Fields().ByName("value"), rules, &unwrapped, cache)
+ if err != nil {
+ return err
+ }
+ valEval.Append(unwrapped.Constraints)
+ return nil
+}
+
+func (bldr *Builder) processStandardConstraints(
+ fdesc protoreflect.FieldDescriptor,
+ constraints *validate.FieldConstraints,
+ valEval *value,
+ _ MessageCache,
+) error {
+ stdConstraints, err := bldr.constraints.Build(
+ bldr.env,
+ fdesc,
+ constraints,
+ bldr.extensionTypeResolver,
+ bldr.allowUnknownFields,
+ valEval.NestedRule != nil,
+ )
+ if err != nil {
+ return err
+ }
+ valEval.Append(celPrograms{
+ base: newBase(valEval),
+ ProgramSet: stdConstraints,
+ })
+ return nil
+}
+
+func (bldr *Builder) processAnyConstraints(
+ fdesc protoreflect.FieldDescriptor,
+ fieldConstraints *validate.FieldConstraints,
+ valEval *value,
+ _ MessageCache,
+) error {
+ if (fdesc.IsList() && valEval.NestedRule == nil) ||
+ !isMessageField(fdesc) ||
+ fdesc.Message().FullName() != "google.protobuf.Any" {
+ return nil
+ }
+
+ typeURLDesc := fdesc.Message().Fields().ByName("type_url")
+ anyPbDesc := (&validate.AnyRules{}).ProtoReflect().Descriptor()
+ inField := anyPbDesc.Fields().ByName("in")
+ notInField := anyPbDesc.Fields().ByName("not_in")
+ anyEval := anyPB{
+ base: newBase(valEval),
+ TypeURLDescriptor: typeURLDesc,
+ In: stringsToSet(fieldConstraints.GetAny().GetIn()),
+ NotIn: stringsToSet(fieldConstraints.GetAny().GetNotIn()),
+ InValue: fieldConstraints.GetAny().ProtoReflect().Get(inField),
+ NotInValue: fieldConstraints.GetAny().ProtoReflect().Get(notInField),
+ }
+ valEval.Append(anyEval)
+ return nil
+}
+
+func (bldr *Builder) processEnumConstraints(
+ fdesc protoreflect.FieldDescriptor,
+ fieldConstraints *validate.FieldConstraints,
+ valEval *value,
+ _ MessageCache,
+) error {
+ if fdesc.Kind() != protoreflect.EnumKind {
+ return nil
+ }
+ if fieldConstraints.GetEnum().GetDefinedOnly() {
+ valEval.Append(definedEnum{
+ base: newBase(valEval),
+ ValueDescriptors: fdesc.Enum().Values(),
+ })
+ }
+ return nil
+}
+
+func (bldr *Builder) processMapConstraints(
+ fieldDesc protoreflect.FieldDescriptor,
+ constraints *validate.FieldConstraints,
+ valEval *value,
+ cache MessageCache,
+) error {
+ if !fieldDesc.IsMap() {
+ return nil
+ }
+
+ mapEval := newKVPairs(valEval)
+
+ err := bldr.buildValue(
+ fieldDesc.MapKey(),
+ constraints.GetMap().GetKeys(),
+ &mapEval.KeyConstraints,
+ cache)
+ if err != nil {
+ return errors.NewCompilationErrorf(
+ "failed to compile key constraints for map %s: %w",
+ fieldDesc.FullName(), err)
+ }
+
+ err = bldr.buildValue(
+ fieldDesc.MapValue(),
+ constraints.GetMap().GetValues(),
+ &mapEval.ValueConstraints,
+ cache)
+ if err != nil {
+ return errors.NewCompilationErrorf(
+ "failed to compile value constraints for map %s: %w",
+ fieldDesc.FullName(), err)
+ }
+
+ valEval.Append(mapEval)
+ return nil
+}
+
+func (bldr *Builder) processRepeatedConstraints(
+ fdesc protoreflect.FieldDescriptor,
+ fieldConstraints *validate.FieldConstraints,
+ valEval *value,
+ cache MessageCache,
+) error {
+ if !fdesc.IsList() || valEval.NestedRule != nil {
+ return nil
+ }
+
+ listEval := newListItems(valEval)
+
+ err := bldr.buildValue(fdesc, fieldConstraints.GetRepeated().GetItems(), &listEval.ItemConstraints, cache)
+ if err != nil {
+ return errors.NewCompilationErrorf(
+ "failed to compile items constraints for repeated %v: %w", fdesc.FullName(), err)
+ }
+
+ valEval.Append(listEval)
+ return nil
+}
+
+func (bldr *Builder) shouldSkip(constraints *validate.FieldConstraints) bool {
+ return constraints.GetSkipped() ||
+ constraints.GetIgnore() == validate.Ignore_IGNORE_ALWAYS
+}
+
+func (bldr *Builder) shouldIgnoreEmpty(constraints *validate.FieldConstraints) bool {
+ return constraints.GetIgnoreEmpty() ||
+ constraints.GetIgnore() == validate.Ignore_IGNORE_IF_UNPOPULATED ||
+ constraints.GetIgnore() == validate.Ignore_IGNORE_IF_DEFAULT_VALUE
+}
+
+func (bldr *Builder) shouldIgnoreDefault(constraints *validate.FieldConstraints) bool {
+ return constraints.GetIgnore() == validate.Ignore_IGNORE_IF_DEFAULT_VALUE
+}
+
+func (bldr *Builder) zeroValue(fdesc protoreflect.FieldDescriptor, forItems bool) protoreflect.Value {
+ switch {
+ case forItems && fdesc.IsList():
+ msg := dynamicpb.NewMessage(fdesc.ContainingMessage())
+ return msg.Get(fdesc).List().NewElement()
+ case isMessageField(fdesc) &&
+ fdesc.Cardinality() != protoreflect.Repeated:
+ msg := dynamicpb.NewMessage(fdesc.Message())
+ return protoreflect.ValueOfMessage(msg)
+ default:
+ return fdesc.Default()
+ }
+}
+
+type MessageCache map[protoreflect.MessageDescriptor]*message
+
+func (c MessageCache) Clone() MessageCache {
+ newCache := make(MessageCache, len(c)+1)
+ c.SyncTo(newCache)
+ return newCache
+}
+func (c MessageCache) SyncTo(other MessageCache) {
+ for k, v := range c {
+ other[k] = v
+ }
+}
+
+// isMessageField returns true if the field descriptor fdesc describes a field
+// containing a submessage. Although they are represented differently on the
+// wire, group fields are treated like message fields in protoreflect and have
+// similar properties. In the 2023 edition of protobuf, message fields with the
+// delimited encoding feature will be detected as groups, but should otherwise
+// be treated the same.
+func isMessageField(fdesc protoreflect.FieldDescriptor) bool {
+ return fdesc.Kind() == protoreflect.MessageKind ||
+ fdesc.Kind() == protoreflect.GroupKind
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/cel.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/cel.go
new file mode 100644
index 0000000..d2fea76
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/cel.go
@@ -0,0 +1,58 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "errors"
+
+ pverr "github.com/bufbuild/protovalidate-go/internal/errors"
+ "github.com/bufbuild/protovalidate-go/internal/expression"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// celPrograms is an evaluator that executes an expression.ProgramSet.
+type celPrograms struct {
+ base
+ expression.ProgramSet
+}
+
+func (c celPrograms) Evaluate(val protoreflect.Value, failFast bool) error {
+ err := c.ProgramSet.Eval(val, failFast)
+ if err != nil {
+ var valErr *pverr.ValidationError
+ if errors.As(err, &valErr) {
+ for _, violation := range valErr.Violations {
+ violation.Proto.Field = c.base.fieldPath()
+ violation.Proto.Rule = c.base.rulePath(violation.Proto.GetRule())
+ violation.FieldValue = val
+ violation.FieldDescriptor = c.base.Descriptor
+ }
+ }
+ }
+ return err
+}
+
+func (c celPrograms) EvaluateMessage(msg protoreflect.Message, failFast bool) error {
+ return c.ProgramSet.Eval(protoreflect.ValueOfMessage(msg), failFast)
+}
+
+func (c celPrograms) Tautology() bool {
+ return len(c.ProgramSet) == 0
+}
+
+var (
+ _ evaluator = celPrograms{}
+ _ MessageEvaluator = celPrograms{}
+)
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/enum.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/enum.go
new file mode 100644
index 0000000..4379232
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/enum.go
@@ -0,0 +1,68 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+//nolint:gochecknoglobals
+var (
+ enumRuleDescriptor = (&validate.FieldConstraints{}).ProtoReflect().Descriptor().Fields().ByName("enum")
+ enumDefinedOnlyRuleDescriptor = (&validate.EnumRules{}).ProtoReflect().Descriptor().Fields().ByName("defined_only")
+ enumDefinedOnlyRulePath = &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{
+ errors.FieldPathElement(enumRuleDescriptor),
+ errors.FieldPathElement(enumDefinedOnlyRuleDescriptor),
+ },
+ }
+)
+
+// definedEnum is an evaluator that checks an enum value being a member of
+// the defined values exclusively. This check is handled outside CEL as enums
+// are completely type erased to integers.
+type definedEnum struct {
+ base
+
+ // ValueDescriptors captures all the defined values for this enum
+ ValueDescriptors protoreflect.EnumValueDescriptors
+}
+
+func (d definedEnum) Evaluate(val protoreflect.Value, _ bool) error {
+ if d.ValueDescriptors.ByNumber(val.Enum()) == nil {
+ return &errors.ValidationError{Violations: []*errors.Violation{{
+ Proto: &validate.Violation{
+ Field: d.base.fieldPath(),
+ Rule: d.base.rulePath(enumDefinedOnlyRulePath),
+ ConstraintId: proto.String("enum.defined_only"),
+ Message: proto.String("value must be one of the defined enum values"),
+ },
+ FieldValue: val,
+ FieldDescriptor: d.base.Descriptor,
+ RuleValue: protoreflect.ValueOfBool(true),
+ RuleDescriptor: enumDefinedOnlyRuleDescriptor,
+ }}}
+ }
+ return nil
+}
+
+func (d definedEnum) Tautology() bool {
+ return false
+}
+
+var _ evaluator = definedEnum{}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/evaluator.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/evaluator.go
new file mode 100644
index 0000000..5cee85c
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/evaluator.go
@@ -0,0 +1,103 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// evaluator defines a validation evaluator. evaluator implementations may elide
+// type checking of the passed in value, as the types have been guaranteed
+// during the build phase.
+type evaluator interface {
+ // Tautology returns true if the evaluator always succeeds.
+ Tautology() bool
+
+ // Evaluate checks that the provided val is valid. Unless failFast is true,
+ // evaluation attempts to find all violations present in val instead of
+ // returning an error on the first violation. The returned error will be one
+ // of the following expected types:
+ //
+ // - errors.ValidationError: val is invalid.
+ // - errors.RuntimeError: error evaluating val determined at runtime.
+ // - errors.CompilationError: this evaluator (or child evaluator) failed to
+ // build. This error is not recoverable.
+ //
+ Evaluate(val protoreflect.Value, failFast bool) error
+}
+
+// MessageEvaluator is essentially the same as evaluator, but specialized for
+// messages as an optimization. See evaluator for behavior.
+type MessageEvaluator interface {
+ evaluator
+
+ // EvaluateMessage checks that the provided msg is valid. See
+ // evaluator.Evaluate for behavior
+ EvaluateMessage(msg protoreflect.Message, failFast bool) error
+}
+
+// evaluators are a set of evaluator applied together to a value. Evaluation
+// merges all errors.ValidationError violations or short-circuits if failFast is
+// true or a different error is returned.
+type evaluators []evaluator
+
+func (e evaluators) Evaluate(val protoreflect.Value, failFast bool) (err error) {
+ var ok bool
+ for _, eval := range e {
+ evalErr := eval.Evaluate(val, failFast)
+ if ok, err = errors.Merge(err, evalErr, failFast); !ok {
+ return err
+ }
+ }
+ return err
+}
+
+func (e evaluators) Tautology() bool {
+ for _, eval := range e {
+ if !eval.Tautology() {
+ return false
+ }
+ }
+ return true
+}
+
+// messageEvaluators are a specialization of evaluators. See evaluators for
+// behavior details.
+type messageEvaluators []MessageEvaluator
+
+func (m messageEvaluators) Evaluate(val protoreflect.Value, failFast bool) error {
+ return m.EvaluateMessage(val.Message(), failFast)
+}
+
+func (m messageEvaluators) EvaluateMessage(msg protoreflect.Message, failFast bool) (err error) {
+ var ok bool
+ for _, eval := range m {
+ evalErr := eval.EvaluateMessage(msg, failFast)
+ if ok, err = errors.Merge(err, evalErr, failFast); !ok {
+ return err
+ }
+ }
+ return err
+}
+
+func (m messageEvaluators) Tautology() bool {
+ for _, eval := range m {
+ if !eval.Tautology() {
+ return false
+ }
+ }
+ return true
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/field.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/field.go
new file mode 100644
index 0000000..0b8388c
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/field.go
@@ -0,0 +1,87 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+//nolint:gochecknoglobals
+var (
+ requiredRuleDescriptor = (&validate.FieldConstraints{}).ProtoReflect().Descriptor().Fields().ByName("required")
+ requiredRulePath = &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{
+ errors.FieldPathElement(requiredRuleDescriptor),
+ },
+ }
+)
+
+// field performs validation on a single message field, defined by its
+// descriptor.
+type field struct {
+ // Value is the evaluator to apply to the field's value
+ Value value
+ // Required indicates that the field must have a set value.
+ Required bool
+ // IgnoreEmpty indicates if a field should skip validation on its zero value.
+ // This field is generally true for nullable fields or fields with the
+ // ignore_empty constraint explicitly set.
+ IgnoreEmpty bool
+ // IgnoreDefault indicates if a field should skip validation on its zero value,
+ // including for fields which have field presence and are set to the zero value.
+ IgnoreDefault bool
+ // Zero is the default or zero-value for this value's type
+ Zero protoreflect.Value
+}
+
+func (f field) Evaluate(val protoreflect.Value, failFast bool) error {
+ return f.EvaluateMessage(val.Message(), failFast)
+}
+
+func (f field) EvaluateMessage(msg protoreflect.Message, failFast bool) (err error) {
+ if f.Required && !msg.Has(f.Value.Descriptor) {
+ return &errors.ValidationError{Violations: []*errors.Violation{{
+ Proto: &validate.Violation{
+ Field: errors.FieldPath(f.Value.Descriptor),
+ Rule: prefixRulePath(f.Value.NestedRule, requiredRulePath),
+ ConstraintId: proto.String("required"),
+ Message: proto.String("value is required"),
+ },
+ FieldValue: protoreflect.Value{},
+ FieldDescriptor: f.Value.Descriptor,
+ RuleValue: protoreflect.ValueOfBool(true),
+ RuleDescriptor: requiredRuleDescriptor,
+ }}}
+ }
+
+ if f.IgnoreEmpty && !msg.Has(f.Value.Descriptor) {
+ return nil
+ }
+
+ val := msg.Get(f.Value.Descriptor)
+ if f.IgnoreDefault && val.Equal(f.Zero) {
+ return nil
+ }
+ return f.Value.Evaluate(val, failFast)
+}
+
+func (f field) Tautology() bool {
+ return !f.Required && f.Value.Tautology()
+}
+
+var _ MessageEvaluator = field{}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/map.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/map.go
new file mode 100644
index 0000000..6a088d6
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/map.go
@@ -0,0 +1,134 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "fmt"
+ "strconv"
+
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+ "google.golang.org/protobuf/types/descriptorpb"
+)
+
+//nolint:gochecknoglobals
+var (
+ mapRuleDescriptor = (&validate.FieldConstraints{}).ProtoReflect().Descriptor().Fields().ByName("map")
+ mapKeysRuleDescriptor = (&validate.MapRules{}).ProtoReflect().Descriptor().Fields().ByName("keys")
+ mapKeysRulePath = &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{
+ errors.FieldPathElement(mapRuleDescriptor),
+ errors.FieldPathElement(mapKeysRuleDescriptor),
+ },
+ }
+ mapValuesDescriptor = (&validate.MapRules{}).ProtoReflect().Descriptor().Fields().ByName("values")
+ mapValuesRulePath = &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{
+ errors.FieldPathElement(mapRuleDescriptor),
+ errors.FieldPathElement(mapValuesDescriptor),
+ },
+ }
+)
+
+// kvPairs performs validation on a map field's KV Pairs.
+type kvPairs struct {
+ base
+
+ // KeyConstraints are checked on the map keys
+ KeyConstraints value
+ // ValueConstraints are checked on the map values
+ ValueConstraints value
+}
+
+func newKVPairs(valEval *value) kvPairs {
+ return kvPairs{
+ base: newBase(valEval),
+ KeyConstraints: value{NestedRule: mapKeysRulePath},
+ ValueConstraints: value{NestedRule: mapValuesRulePath},
+ }
+}
+
+func (m kvPairs) Evaluate(val protoreflect.Value, failFast bool) (err error) {
+ var ok bool
+ val.Map().Range(func(key protoreflect.MapKey, value protoreflect.Value) bool {
+ evalErr := m.evalPairs(key, value, failFast)
+ if evalErr != nil {
+ element := &validate.FieldPathElement{
+ FieldNumber: proto.Int32(m.base.FieldPathElement.GetFieldNumber()),
+ FieldType: m.base.FieldPathElement.GetFieldType().Enum(),
+ FieldName: proto.String(m.base.FieldPathElement.GetFieldName()),
+ }
+ element.KeyType = descriptorpb.FieldDescriptorProto_Type(m.base.Descriptor.MapKey().Kind()).Enum()
+ element.ValueType = descriptorpb.FieldDescriptorProto_Type(m.base.Descriptor.MapValue().Kind()).Enum()
+ switch m.base.Descriptor.MapKey().Kind() {
+ case protoreflect.BoolKind:
+ element.Subscript = &validate.FieldPathElement_BoolKey{BoolKey: key.Bool()}
+ case protoreflect.Int32Kind, protoreflect.Int64Kind,
+ protoreflect.Sfixed32Kind, protoreflect.Sfixed64Kind,
+ protoreflect.Sint32Kind, protoreflect.Sint64Kind:
+ element.Subscript = &validate.FieldPathElement_IntKey{IntKey: key.Int()}
+ case protoreflect.Uint32Kind, protoreflect.Uint64Kind,
+ protoreflect.Fixed32Kind, protoreflect.Fixed64Kind:
+ element.Subscript = &validate.FieldPathElement_UintKey{UintKey: key.Uint()}
+ case protoreflect.StringKind:
+ element.Subscript = &validate.FieldPathElement_StringKey{StringKey: key.String()}
+ case protoreflect.EnumKind, protoreflect.FloatKind, protoreflect.DoubleKind,
+ protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind:
+ fallthrough
+ default:
+ err = errors.NewCompilationErrorf(
+ "unexpected map key type %s",
+ m.base.Descriptor.MapKey().Kind(),
+ )
+ return false
+ }
+ errors.UpdatePaths(evalErr, element, m.base.RulePrefix.GetElements())
+ }
+ ok, err = errors.Merge(err, evalErr, failFast)
+ return ok
+ })
+ return err
+}
+
+func (m kvPairs) evalPairs(key protoreflect.MapKey, value protoreflect.Value, failFast bool) (err error) {
+ evalErr := m.KeyConstraints.Evaluate(key.Value(), failFast)
+ errors.MarkForKey(evalErr)
+ ok, err := errors.Merge(err, evalErr, failFast)
+ if !ok {
+ return err
+ }
+
+ evalErr = m.ValueConstraints.Evaluate(value, failFast)
+ _, err = errors.Merge(err, evalErr, failFast)
+ return err
+}
+
+func (m kvPairs) Tautology() bool {
+ return m.KeyConstraints.Tautology() &&
+ m.ValueConstraints.Tautology()
+}
+
+func (m kvPairs) formatKey(key any) string {
+ switch k := key.(type) {
+ case string:
+ return strconv.Quote(k)
+ default:
+ return fmt.Sprintf("%v", key)
+ }
+}
+
+var _ evaluator = kvPairs{}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/message.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/message.go
new file mode 100644
index 0000000..dfb8330
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/message.go
@@ -0,0 +1,103 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// message performs validation on a protoreflect.Message.
+type message struct {
+ // Err stores if there was a compilation error constructing this evaluator.
+ // It is cached here so that it can be stored in the registry's lookup table.
+ Err error
+
+ // evaluators are the individual evaluators that are applied to a message.
+ evaluators messageEvaluators
+}
+
+func (m *message) Evaluate(val protoreflect.Value, failFast bool) error {
+ return m.EvaluateMessage(val.Message(), failFast)
+}
+
+func (m *message) EvaluateMessage(msg protoreflect.Message, failFast bool) error {
+ if m.Err != nil {
+ return m.Err
+ }
+ return m.evaluators.EvaluateMessage(msg, failFast)
+}
+
+func (m *message) Tautology() bool {
+ // returning false for now to avoid recursive messages causing false positives
+ // on tautology detection.
+ //
+ // TODO: use a more sophisticated method to detect recursions so we can
+ // continue to detect tautologies on message evaluators.
+ return false
+}
+
+func (m *message) Append(eval MessageEvaluator) {
+ if eval != nil && !eval.Tautology() {
+ m.evaluators = append(m.evaluators, eval)
+ }
+}
+
+// unknownMessage is a MessageEvaluator for an unknown descriptor. This is
+// returned only if lazy-building of evaluators has been disabled and an unknown
+// descriptor is encountered.
+type unknownMessage struct {
+ desc protoreflect.MessageDescriptor
+}
+
+func (u unknownMessage) Err() error {
+ return errors.NewCompilationErrorf(
+ "no evaluator available for %s",
+ u.desc.FullName())
+}
+
+func (u unknownMessage) Tautology() bool { return false }
+
+func (u unknownMessage) Evaluate(_ protoreflect.Value, _ bool) error {
+ return u.Err()
+}
+
+func (u unknownMessage) EvaluateMessage(_ protoreflect.Message, _ bool) error {
+ return u.Err()
+}
+
+// embeddedMessage is a wrapper for fields containing messages. It contains data that
+// may differ per embeddedMessage message so that it is not cached.
+type embeddedMessage struct {
+ base
+
+ message *message
+}
+
+func (m *embeddedMessage) Evaluate(val protoreflect.Value, failFast bool) error {
+ err := m.message.EvaluateMessage(val.Message(), failFast)
+ errors.UpdatePaths(err, m.base.FieldPathElement, nil)
+ return err
+}
+
+func (m *embeddedMessage) Tautology() bool {
+ return m.message.Tautology()
+}
+
+var (
+ _ MessageEvaluator = (*message)(nil)
+ _ MessageEvaluator = (*unknownMessage)(nil)
+ _ evaluator = (*embeddedMessage)(nil)
+)
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/oneof.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/oneof.go
new file mode 100644
index 0000000..355fbb2
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/oneof.go
@@ -0,0 +1,57 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// oneof performs validation on a oneof union.
+type oneof struct {
+ // Descriptor is the OneofDescriptor targeted by this evaluator
+ Descriptor protoreflect.OneofDescriptor
+ // Required indicates that a member of the oneof must be set
+ Required bool
+}
+
+func (o oneof) Evaluate(val protoreflect.Value, failFast bool) error {
+ return o.EvaluateMessage(val.Message(), failFast)
+}
+
+func (o oneof) EvaluateMessage(msg protoreflect.Message, _ bool) error {
+ if o.Required && msg.WhichOneof(o.Descriptor) == nil {
+ return &errors.ValidationError{Violations: []*errors.Violation{{
+ Proto: &validate.Violation{
+ Field: &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{{
+ FieldName: proto.String(string(o.Descriptor.Name())),
+ }},
+ },
+ ConstraintId: proto.String("required"),
+ Message: proto.String("exactly one field is required in oneof"),
+ },
+ }}}
+ }
+ return nil
+}
+
+func (o oneof) Tautology() bool {
+ return !o.Required
+}
+
+var _ MessageEvaluator = oneof{}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/repeated.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/repeated.go
new file mode 100644
index 0000000..032448e
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/repeated.go
@@ -0,0 +1,76 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+//nolint:gochecknoglobals
+var (
+ repeatedRuleDescriptor = (&validate.FieldConstraints{}).ProtoReflect().Descriptor().Fields().ByName("repeated")
+ repeatedItemsRuleDescriptor = (&validate.RepeatedRules{}).ProtoReflect().Descriptor().Fields().ByName("items")
+ repeatedItemsRulePath = &validate.FieldPath{
+ Elements: []*validate.FieldPathElement{
+ errors.FieldPathElement(repeatedRuleDescriptor),
+ errors.FieldPathElement(repeatedItemsRuleDescriptor),
+ },
+ }
+)
+
+// listItems performs validation on the elements of a repeated field.
+type listItems struct {
+ base
+
+ // ItemConstraints are checked on every item of the list
+ ItemConstraints value
+}
+
+func newListItems(valEval *value) listItems {
+ return listItems{
+ base: newBase(valEval),
+ ItemConstraints: value{NestedRule: repeatedItemsRulePath},
+ }
+}
+
+func (r listItems) Evaluate(val protoreflect.Value, failFast bool) error {
+ list := val.List()
+ var ok bool
+ var err error
+ for i := 0; i < list.Len(); i++ {
+ itemErr := r.ItemConstraints.Evaluate(list.Get(i), failFast)
+ if itemErr != nil {
+ errors.UpdatePaths(itemErr, &validate.FieldPathElement{
+ FieldNumber: proto.Int32(r.base.FieldPathElement.GetFieldNumber()),
+ FieldType: r.base.FieldPathElement.GetFieldType().Enum(),
+ FieldName: proto.String(r.base.FieldPathElement.GetFieldName()),
+ Subscript: &validate.FieldPathElement_Index{Index: uint64(i)},
+ }, r.base.RulePrefix.GetElements())
+ }
+ if ok, err = errors.Merge(err, itemErr, failFast); !ok {
+ return err
+ }
+ }
+ return err
+}
+
+func (r listItems) Tautology() bool {
+ return r.ItemConstraints.Tautology()
+}
+
+var _ evaluator = listItems{}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/value.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/value.go
new file mode 100644
index 0000000..753ba83
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/evaluator/value.go
@@ -0,0 +1,56 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package evaluator
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// value performs validation on any concrete value contained within a singular
+// field, repeated elements, or the keys/values of a map.
+type value struct {
+ // Descriptor is the FieldDescriptor targeted by this evaluator
+ Descriptor protoreflect.FieldDescriptor
+ // Constraints are the individual evaluators applied to a value
+ Constraints evaluators
+ // Zero is the default or zero-value for this value's type
+ Zero protoreflect.Value
+ // NestedRule specifies the nested rule type the value is for.
+ NestedRule *validate.FieldPath
+ // IgnoreEmpty indicates that the Constraints should not be applied if the
+ // value is unset or the default (typically zero) value. This only applies to
+ // repeated elements or map keys/values with an ignore_empty rule.
+ IgnoreEmpty bool
+}
+
+func (v *value) Evaluate(val protoreflect.Value, failFast bool) error {
+ if v.IgnoreEmpty && val.Equal(v.Zero) {
+ return nil
+ }
+ return v.Constraints.Evaluate(val, failFast)
+}
+
+func (v *value) Tautology() bool {
+ return v.Constraints.Tautology()
+}
+
+func (v *value) Append(eval evaluator) {
+ if !eval.Tautology() {
+ v.Constraints = append(v.Constraints, eval)
+ }
+}
+
+var _ evaluator = (*value)(nil)
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/ast.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/ast.go
new file mode 100644
index 0000000..7d0868a
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/ast.go
@@ -0,0 +1,148 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package expression
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "github.com/google/cel-go/cel"
+ "github.com/google/cel-go/interpreter"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// ASTSet represents a collection of compiledAST and their associated cel.Env.
+type ASTSet struct {
+ env *cel.Env
+ asts []compiledAST
+}
+
+// Merge combines a set with another, producing a new ASTSet.
+func (set ASTSet) Merge(other ASTSet) ASTSet {
+ out := ASTSet{
+ env: set.env,
+ asts: make([]compiledAST, 0, len(set.asts)+len(other.asts)),
+ }
+ if out.env == nil {
+ out.env = other.env
+ }
+ out.asts = append(out.asts, set.asts...)
+ out.asts = append(out.asts, other.asts...)
+ return out
+}
+
+// ReduceResiduals generates a ProgramSet, performing a partial evaluation of
+// the ASTSet to optimize the expression. If the expression is optimized to
+// either a true or empty string constant result, no compiledProgram is
+// generated for it. The main usage of this is to elide tautological expressions
+// from the final result.
+func (set ASTSet) ReduceResiduals(opts ...cel.ProgramOption) (ProgramSet, error) {
+ residuals := make([]compiledAST, 0, len(set.asts))
+ options := append([]cel.ProgramOption{
+ cel.EvalOptions(
+ cel.OptTrackState,
+ cel.OptExhaustiveEval,
+ cel.OptOptimize,
+ cel.OptPartialEval,
+ ),
+ }, opts...)
+
+ for _, ast := range set.asts {
+ program, err := ast.toProgram(set.env, options...)
+ if err != nil {
+ residuals = append(residuals, ast)
+ continue
+ }
+ val, details, _ := program.Program.Eval(interpreter.EmptyActivation())
+ if val != nil {
+ switch value := val.Value().(type) {
+ case bool:
+ if value {
+ continue
+ }
+ case string:
+ if value == "" {
+ continue
+ }
+ }
+ }
+ residual, err := set.env.ResidualAst(ast.AST, details)
+ if err != nil {
+ residuals = append(residuals, ast)
+ } else {
+ residuals = append(residuals, compiledAST{
+ AST: residual,
+ Source: ast.Source,
+ Path: ast.Path,
+ Value: ast.Value,
+ Descriptor: ast.Descriptor,
+ })
+ }
+ }
+
+ return ASTSet{
+ env: set.env,
+ asts: residuals,
+ }.ToProgramSet(opts...)
+}
+
+// ToProgramSet generates a ProgramSet from the specified ASTs.
+func (set ASTSet) ToProgramSet(opts ...cel.ProgramOption) (out ProgramSet, err error) {
+ if l := len(set.asts); l == 0 {
+ return nil, nil
+ }
+ out = make(ProgramSet, len(set.asts))
+ for i, ast := range set.asts {
+ out[i], err = ast.toProgram(set.env, opts...)
+ if err != nil {
+ return nil, err
+ }
+ }
+ return out, nil
+}
+
+// SetRuleValue sets the rule value for the programs in the ASTSet.
+func (set *ASTSet) SetRuleValue(
+ ruleValue protoreflect.Value,
+ ruleDescriptor protoreflect.FieldDescriptor,
+) {
+ set.asts = append([]compiledAST{}, set.asts...)
+ for i := range set.asts {
+ set.asts[i].Value = ruleValue
+ set.asts[i].Descriptor = ruleDescriptor
+ }
+}
+
+type compiledAST struct {
+ AST *cel.Ast
+ Source *validate.Constraint
+ Path []*validate.FieldPathElement
+ Value protoreflect.Value
+ Descriptor protoreflect.FieldDescriptor
+}
+
+func (ast compiledAST) toProgram(env *cel.Env, opts ...cel.ProgramOption) (out compiledProgram, err error) {
+ prog, err := env.Program(ast.AST, opts...)
+ if err != nil {
+ return out, errors.NewCompilationErrorf(
+ "failed to compile program %s: %w", ast.Source.GetId(), err)
+ }
+ return compiledProgram{
+ Program: prog,
+ Source: ast.Source,
+ Path: ast.Path,
+ Value: ast.Value,
+ Descriptor: ast.Descriptor,
+ }, nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/compile.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/compile.go
new file mode 100644
index 0000000..9880bab
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/compile.go
@@ -0,0 +1,122 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package expression
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "github.com/google/cel-go/cel"
+)
+
+// An Expressions instance is a container for the information needed to compile
+// and evaluate a list of CEL-based expressions, originating from a
+// validate.Constraint.
+type Expressions struct {
+ Constraints []*validate.Constraint
+ RulePath []*validate.FieldPathElement
+}
+
+// Compile produces a ProgramSet from the provided expressions in the given
+// environment. If the generated cel.Program require cel.ProgramOption params,
+// use CompileASTs instead with a subsequent call to ASTSet.ToProgramSet.
+func Compile(
+ expressions Expressions,
+ env *cel.Env,
+ envOpts ...cel.EnvOption,
+) (set ProgramSet, err error) {
+ if len(expressions.Constraints) == 0 {
+ return nil, nil
+ }
+
+ if len(envOpts) > 0 {
+ env, err = env.Extend(envOpts...)
+ if err != nil {
+ return nil, errors.NewCompilationErrorf(
+ "failed to extend environment: %w", err)
+ }
+ }
+
+ set = make(ProgramSet, len(expressions.Constraints))
+ for i, constraint := range expressions.Constraints {
+ set[i].Source = constraint
+ set[i].Path = expressions.RulePath
+
+ ast, err := compileAST(env, constraint, expressions.RulePath)
+ if err != nil {
+ return nil, err
+ }
+
+ set[i], err = ast.toProgram(env)
+ if err != nil {
+ return nil, err
+ }
+ }
+ return set, nil
+}
+
+// CompileASTs parses and type checks a set of expressions, producing a resulting
+// ASTSet. The value can then be converted to a ProgramSet via
+// ASTSet.ToProgramSet or ASTSet.ReduceResiduals. Use Compile instead if no
+// cel.ProgramOption args need to be provided or residuals do not need to be
+// computed.
+func CompileASTs(
+ expressions Expressions,
+ env *cel.Env,
+ envOpts ...cel.EnvOption,
+) (set ASTSet, err error) {
+ set.env = env
+ if len(expressions.Constraints) == 0 {
+ return set, nil
+ }
+
+ if len(envOpts) > 0 {
+ set.env, err = env.Extend(envOpts...)
+ if err != nil {
+ return set, errors.NewCompilationErrorf(
+ "failed to extend environment: %w", err)
+ }
+ }
+
+ set.asts = make([]compiledAST, len(expressions.Constraints))
+ for i, constraint := range expressions.Constraints {
+ set.asts[i], err = compileAST(set.env, constraint, expressions.RulePath)
+ if err != nil {
+ return set, err
+ }
+ }
+
+ return set, nil
+}
+
+func compileAST(env *cel.Env, constraint *validate.Constraint, rulePath []*validate.FieldPathElement) (out compiledAST, err error) {
+ ast, issues := env.Compile(constraint.GetExpression())
+ if err := issues.Err(); err != nil {
+ return out, errors.NewCompilationErrorf(
+ "failed to compile expression %s: %w", constraint.GetId(), err)
+ }
+
+ outType := ast.OutputType()
+ if !(outType.IsAssignableType(cel.BoolType) || outType.IsAssignableType(cel.StringType)) {
+ return out, errors.NewCompilationErrorf(
+ "expression %s outputs %s, wanted either bool or string",
+ constraint.GetId(), outType.String())
+ }
+
+ return compiledAST{
+ AST: ast,
+ Source: constraint,
+ Path: rulePath,
+ }, nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/program.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/program.go
new file mode 100644
index 0000000..55368d8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/program.go
@@ -0,0 +1,147 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package expression
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "github.com/google/cel-go/cel"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+//nolint:gochecknoglobals // amortized, eliminates allocations for all CEL programs
+var varPool = &VariablePool{New: func() any { return &Variable{} }}
+
+//nolint:gochecknoglobals // amortized, eliminates allocations for all CEL programs
+var nowPool = &NowPool{New: func() any { return &Now{} }}
+
+// ProgramSet is a list of compiledProgram expressions that are evaluated
+// together with the same input value. All expressions in a ProgramSet may refer
+// to a `this` variable.
+type ProgramSet []compiledProgram
+
+// Eval applies the contained expressions to the provided `this` val, returning
+// either *errors.ValidationError if the input is invalid or errors.RuntimeError
+// if there is a type or range error. If failFast is true, execution stops at
+// the first failed expression.
+func (s ProgramSet) Eval(val protoreflect.Value, failFast bool) error {
+ binding := s.bindThis(val.Interface())
+ defer varPool.Put(binding)
+
+ var violations []*errors.Violation
+ for _, expr := range s {
+ violation, err := expr.eval(binding)
+ if err != nil {
+ return err
+ }
+ if violation != nil {
+ violations = append(violations, violation)
+ if failFast {
+ break
+ }
+ }
+ }
+
+ if len(violations) > 0 {
+ return &errors.ValidationError{Violations: violations}
+ }
+
+ return nil
+}
+
+func (s ProgramSet) bindThis(val any) *Variable {
+ binding := varPool.Get()
+ binding.Name = "this"
+
+ switch value := val.(type) {
+ case protoreflect.Message:
+ binding.Val = value.Interface()
+ case protoreflect.Map:
+ // TODO: expensive to create this copy, but getting this into a ref.Val with
+ // traits.Mapper is not terribly feasible from this type.
+ m := make(map[any]any, value.Len())
+ value.Range(func(key protoreflect.MapKey, value protoreflect.Value) bool {
+ m[key.Interface()] = value.Interface()
+ return true
+ })
+ binding.Val = m
+ default:
+ binding.Val = value
+ }
+
+ return binding
+}
+
+// compiledProgram is a parsed and type-checked cel.Program along with the
+// source Expression.
+type compiledProgram struct {
+ Program cel.Program
+ Source *validate.Constraint
+ Path []*validate.FieldPathElement
+ Value protoreflect.Value
+ Descriptor protoreflect.FieldDescriptor
+}
+
+//nolint:nilnil // non-existence of violations is intentional
+func (expr compiledProgram) eval(bindings *Variable) (*errors.Violation, error) {
+ now := nowPool.Get()
+ defer nowPool.Put(now)
+ bindings.Next = now
+
+ value, _, err := expr.Program.Eval(bindings)
+ if err != nil {
+ return nil, errors.NewRuntimeErrorf(
+ "error evaluating %s: %w", expr.Source.GetId(), err)
+ }
+ switch val := value.Value().(type) {
+ case string:
+ if val == "" {
+ return nil, nil
+ }
+ return &errors.Violation{
+ Proto: &validate.Violation{
+ Rule: expr.rulePath(),
+ ConstraintId: proto.String(expr.Source.GetId()),
+ Message: proto.String(val),
+ },
+ RuleValue: expr.Value,
+ RuleDescriptor: expr.Descriptor,
+ }, nil
+ case bool:
+ if val {
+ return nil, nil
+ }
+ return &errors.Violation{
+ Proto: &validate.Violation{
+ Rule: expr.rulePath(),
+ ConstraintId: proto.String(expr.Source.GetId()),
+ Message: proto.String(expr.Source.GetMessage()),
+ },
+ RuleValue: expr.Value,
+ RuleDescriptor: expr.Descriptor,
+ }, nil
+ default:
+ return nil, errors.NewRuntimeErrorf(
+ "resolved to an unexpected type %T", val)
+ }
+}
+
+func (expr compiledProgram) rulePath() *validate.FieldPath {
+ if len(expr.Path) > 0 {
+ return &validate.FieldPath{Elements: expr.Path}
+ }
+ return nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/variable.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/variable.go
new file mode 100644
index 0000000..20e67d6
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/expression/variable.go
@@ -0,0 +1,89 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package expression
+
+import (
+ "sync"
+
+ "github.com/google/cel-go/interpreter"
+ "google.golang.org/protobuf/types/known/timestamppb"
+)
+
+// Variable implements interpreter.Activation, providing a lightweight named
+// variable to cel.Program executions.
+type Variable struct {
+ // Next is the parent activation
+ Next interpreter.Activation
+ // Name is the variable's name
+ Name string
+ // Val is the value for this variable
+ Val any
+}
+
+func (v *Variable) ResolveName(name string) (any, bool) {
+ switch {
+ case name == v.Name:
+ return v.Val, true
+ case v.Next != nil:
+ return v.Next.ResolveName(name)
+ default:
+ return nil, false
+ }
+}
+
+func (v *Variable) Parent() interpreter.Activation { return nil }
+
+type VariablePool sync.Pool
+
+func (p *VariablePool) Put(v *Variable) {
+ (*sync.Pool)(p).Put(v)
+}
+
+func (p *VariablePool) Get() *Variable {
+ v := (*sync.Pool)(p).Get().(*Variable) //nolint:errcheck,forcetypeassert
+ v.Next = nil
+ return v
+}
+
+// Now implements interpreter.Activation, providing a lazily produced timestamp
+// for accessing the variable `now` that's constant within an evaluation.
+type Now struct {
+ // TS is the already resolved timestamp. If unset, the field is populated with
+ // timestamppb.Now.
+ TS *timestamppb.Timestamp
+}
+
+func (n *Now) ResolveName(name string) (any, bool) {
+ if name != "now" {
+ return nil, false
+ } else if n.TS == nil {
+ n.TS = timestamppb.Now()
+ }
+ return n.TS, true
+}
+
+func (n *Now) Parent() interpreter.Activation { return nil }
+
+type NowPool sync.Pool
+
+func (p *NowPool) Put(v *Now) {
+ (*sync.Pool)(p).Put(v)
+}
+
+func (p *NowPool) Get() *Now {
+ n := (*sync.Pool)(p).Get().(*Now) //nolint:errcheck,forcetypeassert
+ n.TS = nil
+ return n
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/extensions/resolve.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/extensions/resolve.go
new file mode 100644
index 0000000..4c5fd1b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/internal/extensions/resolve.go
@@ -0,0 +1,167 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package extensions
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "google.golang.org/protobuf/encoding/protowire"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protodesc"
+ "google.golang.org/protobuf/reflect/protoreflect"
+ "google.golang.org/protobuf/reflect/protoregistry"
+ "google.golang.org/protobuf/types/descriptorpb"
+ "google.golang.org/protobuf/types/dynamicpb"
+)
+
+const (
+ legacyExtensionIndex protowire.Number = 51071 // protovalidate versions < v0.2.0
+)
+
+//nolint:gochecknoglobals // static data, only want single instance
+var resolver = newExtensionResolver()
+
+// Resolve resolves extensions without using [proto.GetExtension], in case the
+// underlying type of the extension is not the concrete type expected by the
+// library. In some cases, particularly when using a dynamic descriptor set, the
+// underlying extension value's type will be a dynamicpb.Message. In some cases,
+// the extension may not be resolved at all. This function handles reparsing the
+// fields as needed to get it into the right concrete message. Resolve does not
+// modify the input protobuf message, so it can be used concurrently.
+func Resolve[C proto.Message](
+ options proto.Message,
+ extensionType protoreflect.ExtensionType,
+) (typedMessage C) {
+ message := resolver.resolve(options, extensionType)
+ if message == nil {
+ return typedMessage
+ } else if typedMessage, ok := message.(C); ok {
+ return typedMessage
+ }
+ typedMessage, _ = typedMessage.ProtoReflect().New().Interface().(C)
+ b, _ := proto.Marshal(message)
+ _ = proto.Unmarshal(b, typedMessage)
+ return typedMessage
+}
+
+// extensionResolver implements most of the logic of resolving protovalidate
+// extensions.
+type extensionResolver struct {
+ // types is a types that just contains the protovalidate extensions.
+ types *protoregistry.Types
+
+ // legacyExtensionMap is a mapping from current protovalidate extensions to
+ // legacy protovalidate extensions, used for backwards compatibility. This
+ // map will not be modified, so it is safe to read concurrently.
+ legacyExtensionMap map[protoreflect.ExtensionType]protoreflect.ExtensionType
+}
+
+// newExtensionResolver creates a new extension resolver. This is only called at
+// init and will panic if it fails.
+func newExtensionResolver() extensionResolver {
+ resolver := extensionResolver{
+ types: &protoregistry.Types{},
+ legacyExtensionMap: make(map[protoreflect.ExtensionType]protoreflect.ExtensionType),
+ }
+ resolver.register(validate.E_Field)
+ resolver.register(validate.E_Message)
+ resolver.register(validate.E_Oneof)
+ resolver.register(validate.E_Predefined)
+ resolver.registerLegacy(validate.E_Field)
+ resolver.registerLegacy(validate.E_Message)
+ resolver.registerLegacy(validate.E_Oneof)
+ return resolver
+}
+
+// register registers an extension into the resolver's registry. This is only
+// called at init and will panic if it fails.
+func (resolver extensionResolver) register(extension protoreflect.ExtensionType) {
+ if err := resolver.types.RegisterExtension(extension); err != nil {
+ //nolint:forbidigo // this needs to be a fatal at init
+ panic(err)
+ }
+}
+
+// registerLegacy creates and registers a legacy extension.
+func (resolver extensionResolver) registerLegacy(extension protoreflect.ExtensionType) {
+ fileDescriptor, err := protodesc.NewFile(&descriptorpb.FileDescriptorProto{
+ Name: proto.String("buf/validate/validate_legacy.proto"),
+ Package: proto.String("buf.validate"),
+ Dependency: []string{
+ "buf/validate/validate.proto",
+ "google/protobuf/descriptor.proto",
+ },
+ Extension: []*descriptorpb.FieldDescriptorProto{
+ {
+ Name: proto.String(string(extension.TypeDescriptor().Name()) + "_legacy"),
+ Number: proto.Int32(int32(legacyExtensionIndex)),
+ Label: descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL.Enum(),
+ Type: descriptorpb.FieldDescriptorProto_TYPE_MESSAGE.Enum(),
+ TypeName: proto.String(string(extension.TypeDescriptor().Message().FullName())),
+ Extendee: proto.String(string(extension.TypeDescriptor().ContainingMessage().FullName())),
+ },
+ },
+ }, protoregistry.GlobalFiles)
+ if err != nil {
+ //nolint:forbidigo // this needs to be a fatal at init
+ panic(err)
+ }
+ legacyExtension := dynamicpb.NewExtensionType(fileDescriptor.Extensions().Get(0))
+ resolver.register(legacyExtension)
+ resolver.legacyExtensionMap[extension] = legacyExtension
+}
+
+// resolve handles the majority of extension resolution logic. This will return
+// a proto.Message for the given extension if the message has the tag number of
+// the provided extension (or an equivalent legacy extension). If there was no
+// such tag number present in the known or unknown fields, this method will
+// return nil. Note that the returned message may be dynamicpb.Message or
+// another type, and thus may need to still be reparsed if needed.
+func (resolver extensionResolver) resolve(
+ options proto.Message,
+ extensionType protoreflect.ExtensionType,
+) proto.Message {
+ msg := resolver.getExtensionOrLegacy(options, extensionType)
+ if msg == nil {
+ if unknown := options.ProtoReflect().GetUnknown(); len(unknown) > 0 {
+ reparsedOptions := options.ProtoReflect().Type().New().Interface()
+ if err := (proto.UnmarshalOptions{
+ Resolver: resolver.types,
+ }).Unmarshal(unknown, reparsedOptions); err == nil {
+ msg = resolver.getExtensionOrLegacy(reparsedOptions, extensionType)
+ }
+ }
+ }
+ return msg
+}
+
+// getExtensionOrLegacy gets the extension extensionType on message, or if it is
+// not found, the corresponding legacy extensionType. Unlike proto.GetExtension,
+// this method will not panic if the runtime type of the extension is unexpected
+// and returns nil if the extension is not present.
+func (resolver extensionResolver) getExtensionOrLegacy(
+ message proto.Message,
+ extensionType protoreflect.ExtensionType,
+) proto.Message {
+ reflect := message.ProtoReflect()
+ if reflect.Has(extensionType.TypeDescriptor()) {
+ extension, _ := reflect.Get(extensionType.TypeDescriptor()).Interface().(protoreflect.Message)
+ return extension.Interface()
+ }
+ legacyExtensionType, ok := resolver.legacyExtensionMap[extensionType]
+ if !ok {
+ return nil
+ }
+ return resolver.getExtensionOrLegacy(message, legacyExtensionType)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/resolver/resolver.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/resolver/resolver.go
new file mode 100644
index 0000000..2ddf53f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/resolver/resolver.go
@@ -0,0 +1,50 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package resolver
+
+import (
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/internal/extensions"
+ "google.golang.org/protobuf/reflect/protoreflect"
+)
+
+// DefaultResolver resolves protovalidate constraints options from descriptors.
+type DefaultResolver struct{}
+
+// ResolveMessageConstraints returns the MessageConstraints option set for the
+// MessageDescriptor.
+func (r DefaultResolver) ResolveMessageConstraints(desc protoreflect.MessageDescriptor) *validate.MessageConstraints {
+ return extensions.Resolve[*validate.MessageConstraints](desc.Options(), validate.E_Message)
+}
+
+// ResolveOneofConstraints returns the OneofConstraints option set for the
+// OneofDescriptor.
+func (r DefaultResolver) ResolveOneofConstraints(desc protoreflect.OneofDescriptor) *validate.OneofConstraints {
+ return extensions.Resolve[*validate.OneofConstraints](desc.Options(), validate.E_Oneof)
+}
+
+// ResolveFieldConstraints returns the FieldConstraints option set for the
+// FieldDescriptor.
+func (r DefaultResolver) ResolveFieldConstraints(desc protoreflect.FieldDescriptor) *validate.FieldConstraints {
+ return extensions.Resolve[*validate.FieldConstraints](desc.Options(), validate.E_Field)
+}
+
+// ResolvePredefinedConstraints returns the PredefinedConstraints option set for
+// the FieldDescriptor. Note that this value is only meaningful if it is set on
+// a field or extension of a field rule message. This method is provided for
+// convenience.
+func (r DefaultResolver) ResolvePredefinedConstraints(desc protoreflect.FieldDescriptor) *validate.PredefinedConstraints {
+ return extensions.Resolve[*validate.PredefinedConstraints](desc.Options(), validate.E_Predefined)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/validator.go b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/validator.go
new file mode 100644
index 0000000..69e4ee2
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/bufbuild/protovalidate-go/validator.go
@@ -0,0 +1,244 @@
+// Copyright 2023-2024 Buf Technologies, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package protovalidate
+
+import (
+ "fmt"
+ "sync"
+
+ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate"
+ "github.com/bufbuild/protovalidate-go/celext"
+ "github.com/bufbuild/protovalidate-go/internal/errors"
+ "github.com/bufbuild/protovalidate-go/internal/evaluator"
+ "github.com/bufbuild/protovalidate-go/resolver"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/reflect/protoreflect"
+ "google.golang.org/protobuf/reflect/protoregistry"
+)
+
+var getGlobalValidator = sync.OnceValues(func() (*Validator, error) { return New() })
+
+type (
+ // ValidationError is returned if one or more constraints on a message are
+ // violated. This error type is a composite of multiple Violation instances.
+ //
+ // err = validator.Validate(msg)
+ // var valErr *ValidationError
+ // if ok := errors.As(err, &valErr); ok {
+ // violations := valErrs.Violations
+ // // ...
+ // }
+ ValidationError = errors.ValidationError
+
+ // A Violation provides information about one constraint violation.
+ Violation = errors.Violation
+
+ // A CompilationError is returned if a CEL expression cannot be compiled &
+ // type-checked or if invalid standard constraints are applied to a field.
+ CompilationError = errors.CompilationError
+
+ // A RuntimeError is returned if a valid CEL expression evaluation is
+ // terminated, typically due to an unknown or mismatched type.
+ RuntimeError = errors.RuntimeError
+)
+
+// Validator performs validation on any proto.Message values. The Validator is
+// safe for concurrent use.
+type Validator struct {
+ builder *evaluator.Builder
+ failFast bool
+}
+
+// New creates a Validator with the given options. An error may occur in setting
+// up the CEL execution environment if the configuration is invalid. See the
+// individual ValidatorOption for how they impact the fallibility of New.
+func New(options ...ValidatorOption) (*Validator, error) {
+ cfg := config{
+ resolver: resolver.DefaultResolver{},
+ extensionTypeResolver: protoregistry.GlobalTypes,
+ }
+ for _, opt := range options {
+ opt(&cfg)
+ }
+
+ env, err := celext.DefaultEnv(cfg.useUTC)
+ if err != nil {
+ return nil, fmt.Errorf(
+ "failed to construct CEL environment: %w", err)
+ }
+
+ bldr := evaluator.NewBuilder(
+ env,
+ cfg.disableLazy,
+ cfg.resolver,
+ cfg.extensionTypeResolver,
+ cfg.allowUnknownFields,
+ cfg.desc...,
+ )
+
+ return &Validator{
+ failFast: cfg.failFast,
+ builder: bldr,
+ }, nil
+}
+
+// Validate checks that message satisfies its constraints. Constraints are
+// defined within the Protobuf file as options from the buf.validate package.
+// An error is returned if the constraints are violated (ValidationError), the
+// evaluation logic for the message cannot be built (CompilationError), or
+// there is a type error when attempting to evaluate a CEL expression
+// associated with the message (RuntimeError).
+func (v *Validator) Validate(msg proto.Message) error {
+ if msg == nil {
+ return nil
+ }
+ refl := msg.ProtoReflect()
+ eval := v.builder.Load(refl.Descriptor())
+ err := eval.EvaluateMessage(refl, v.failFast)
+ errors.FinalizePaths(err)
+ return err
+}
+
+// Validate uses a global instance of Validator constructed with no ValidatorOptions and
+// calls its Validate function. For the vast majority of validation cases, using this global
+// function is safe and acceptable. If you need to provide i.e. a custom
+// ExtensionTypeResolver, you'll need to construct a Validator.
+func Validate(msg proto.Message) error {
+ globalValidator, err := getGlobalValidator()
+ if err != nil {
+ return err
+ }
+ return globalValidator.Validate(msg)
+}
+
+// FieldPathString returns a dotted path string for the provided
+// validate.FieldPath.
+func FieldPathString(path *validate.FieldPath) string {
+ return errors.FieldPathString(path.GetElements())
+}
+
+type config struct {
+ failFast bool
+ useUTC bool
+ disableLazy bool
+ desc []protoreflect.MessageDescriptor
+ resolver StandardConstraintResolver
+ extensionTypeResolver protoregistry.ExtensionTypeResolver
+ allowUnknownFields bool
+}
+
+// A ValidatorOption modifies the default configuration of a Validator. See the
+// individual options for their defaults and affects on the fallibility of
+// configuring a Validator.
+type ValidatorOption func(*config)
+
+// WithUTC specifies whether timestamp operations should use UTC or the OS's
+// local timezone for timestamp related values. By default, the local timezone
+// is used.
+func WithUTC(useUTC bool) ValidatorOption {
+ return func(c *config) {
+ c.useUTC = useUTC
+ }
+}
+
+// WithFailFast specifies whether validation should fail on the first constraint
+// violation encountered or if all violations should be accumulated. By default,
+// all violations are accumulated.
+func WithFailFast(failFast bool) ValidatorOption {
+ return func(cfg *config) {
+ cfg.failFast = failFast
+ }
+}
+
+// WithMessages allows warming up the Validator with messages that are
+// expected to be validated. Messages included transitively (i.e., fields with
+// message values) are automatically handled.
+func WithMessages(messages ...proto.Message) ValidatorOption {
+ desc := make([]protoreflect.MessageDescriptor, len(messages))
+ for i, msg := range messages {
+ desc[i] = msg.ProtoReflect().Descriptor()
+ }
+ return WithDescriptors(desc...)
+}
+
+// WithDescriptors allows warming up the Validator with message
+// descriptors that are expected to be validated. Messages included transitively
+// (i.e., fields with message values) are automatically handled.
+func WithDescriptors(descriptors ...protoreflect.MessageDescriptor) ValidatorOption {
+ return func(cfg *config) {
+ cfg.desc = append(cfg.desc, descriptors...)
+ }
+}
+
+// WithDisableLazy prevents the Validator from lazily building validation logic
+// for a message it has not encountered before. Disabling lazy logic
+// additionally eliminates any internal locking as the validator becomes
+// read-only.
+//
+// Note: All expected messages must be provided by WithMessages or
+// WithDescriptors during initialization.
+func WithDisableLazy(disable bool) ValidatorOption {
+ return func(cfg *config) {
+ cfg.disableLazy = disable
+ }
+}
+
+// StandardConstraintResolver is responsible for resolving the standard
+// constraints from the provided protoreflect.Descriptor. The default resolver
+// can be intercepted and modified using WithStandardConstraintInterceptor.
+type StandardConstraintResolver interface {
+ ResolveMessageConstraints(desc protoreflect.MessageDescriptor) *validate.MessageConstraints
+ ResolveOneofConstraints(desc protoreflect.OneofDescriptor) *validate.OneofConstraints
+ ResolveFieldConstraints(desc protoreflect.FieldDescriptor) *validate.FieldConstraints
+}
+
+// StandardConstraintInterceptor can be provided to
+// WithStandardConstraintInterceptor to allow modifying a
+// StandardConstraintResolver.
+type StandardConstraintInterceptor func(res StandardConstraintResolver) StandardConstraintResolver
+
+// WithStandardConstraintInterceptor allows intercepting the
+// StandardConstraintResolver used by the Validator to modify or replace it.
+func WithStandardConstraintInterceptor(interceptor StandardConstraintInterceptor) ValidatorOption {
+ return func(c *config) {
+ c.resolver = interceptor(c.resolver)
+ }
+}
+
+// WithExtensionTypeResolver specifies a resolver to use when reparsing unknown
+// extension types. When dealing with dynamic file descriptor sets, passing this
+// option will allow extensions to be resolved using a custom resolver.
+//
+// To ignore unknown extension fields, use the [WithAllowUnknownFields] option.
+// Note that this may result in messages being treated as valid even though not
+// all constraints are being applied.
+func WithExtensionTypeResolver(extensionTypeResolver protoregistry.ExtensionTypeResolver) ValidatorOption {
+ return func(c *config) {
+ c.extensionTypeResolver = extensionTypeResolver
+ }
+}
+
+// WithAllowUnknownFields specifies if the presence of unknown field constraints
+// should cause compilation to fail with an error. When set to false, an unknown
+// field will simply be ignored, which will cause constraints to silently not be
+// applied. This condition may occur if a predefined constraint definition isn't
+// present in the extension type resolver, or when passing dynamic messages with
+// standard constraints defined in a newer version of protovalidate. The default
+// value is false, to prevent silently-incorrect validation from occurring.
+func WithAllowUnknownFields(allowUnknownFields bool) ValidatorOption {
+ return func(c *config) {
+ c.allowUnknownFields = allowUnknownFields
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/LICENSE.txt b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/LICENSE.txt
new file mode 100644
index 0000000..24b5306
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2016 Caleb Spare
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/README.md b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/README.md
new file mode 100644
index 0000000..33c8830
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/README.md
@@ -0,0 +1,74 @@
+# xxhash
+
+[](https://pkg.go.dev/github.com/cespare/xxhash/v2)
+[](https://github.com/cespare/xxhash/actions/workflows/test.yml)
+
+xxhash is a Go implementation of the 64-bit [xxHash] algorithm, XXH64. This is a
+high-quality hashing algorithm that is much faster than anything in the Go
+standard library.
+
+This package provides a straightforward API:
+
+```
+func Sum64(b []byte) uint64
+func Sum64String(s string) uint64
+type Digest struct{ ... }
+ func New() *Digest
+```
+
+The `Digest` type implements hash.Hash64. Its key methods are:
+
+```
+func (*Digest) Write([]byte) (int, error)
+func (*Digest) WriteString(string) (int, error)
+func (*Digest) Sum64() uint64
+```
+
+The package is written with optimized pure Go and also contains even faster
+assembly implementations for amd64 and arm64. If desired, the `purego` build tag
+opts into using the Go code even on those architectures.
+
+[xxHash]: http://cyan4973.github.io/xxHash/
+
+## Compatibility
+
+This package is in a module and the latest code is in version 2 of the module.
+You need a version of Go with at least "minimal module compatibility" to use
+github.com/cespare/xxhash/v2:
+
+* 1.9.7+ for Go 1.9
+* 1.10.3+ for Go 1.10
+* Go 1.11 or later
+
+I recommend using the latest release of Go.
+
+## Benchmarks
+
+Here are some quick benchmarks comparing the pure-Go and assembly
+implementations of Sum64.
+
+| input size | purego | asm |
+| ---------- | --------- | --------- |
+| 4 B | 1.3 GB/s | 1.2 GB/s |
+| 16 B | 2.9 GB/s | 3.5 GB/s |
+| 100 B | 6.9 GB/s | 8.1 GB/s |
+| 4 KB | 11.7 GB/s | 16.7 GB/s |
+| 10 MB | 12.0 GB/s | 17.3 GB/s |
+
+These numbers were generated on Ubuntu 20.04 with an Intel Xeon Platinum 8252C
+CPU using the following commands under Go 1.19.2:
+
+```
+benchstat <(go test -tags purego -benchtime 500ms -count 15 -bench 'Sum64$')
+benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$')
+```
+
+## Projects using this package
+
+- [InfluxDB](https://github.com/influxdata/influxdb)
+- [Prometheus](https://github.com/prometheus/prometheus)
+- [VictoriaMetrics](https://github.com/VictoriaMetrics/VictoriaMetrics)
+- [FreeCache](https://github.com/coocood/freecache)
+- [FastCache](https://github.com/VictoriaMetrics/fastcache)
+- [Ristretto](https://github.com/dgraph-io/ristretto)
+- [Badger](https://github.com/dgraph-io/badger)
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/testall.sh b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/testall.sh
new file mode 100644
index 0000000..94b9c44
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/testall.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -eu -o pipefail
+
+# Small convenience script for running the tests with various combinations of
+# arch/tags. This assumes we're running on amd64 and have qemu available.
+
+go test ./...
+go test -tags purego ./...
+GOARCH=arm64 go test
+GOARCH=arm64 go test -tags purego
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash.go b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash.go
new file mode 100644
index 0000000..78bddf1
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash.go
@@ -0,0 +1,243 @@
+// Package xxhash implements the 64-bit variant of xxHash (XXH64) as described
+// at http://cyan4973.github.io/xxHash/.
+package xxhash
+
+import (
+ "encoding/binary"
+ "errors"
+ "math/bits"
+)
+
+const (
+ prime1 uint64 = 11400714785074694791
+ prime2 uint64 = 14029467366897019727
+ prime3 uint64 = 1609587929392839161
+ prime4 uint64 = 9650029242287828579
+ prime5 uint64 = 2870177450012600261
+)
+
+// Store the primes in an array as well.
+//
+// The consts are used when possible in Go code to avoid MOVs but we need a
+// contiguous array for the assembly code.
+var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5}
+
+// Digest implements hash.Hash64.
+//
+// Note that a zero-valued Digest is not ready to receive writes.
+// Call Reset or create a Digest using New before calling other methods.
+type Digest struct {
+ v1 uint64
+ v2 uint64
+ v3 uint64
+ v4 uint64
+ total uint64
+ mem [32]byte
+ n int // how much of mem is used
+}
+
+// New creates a new Digest with a zero seed.
+func New() *Digest {
+ return NewWithSeed(0)
+}
+
+// NewWithSeed creates a new Digest with the given seed.
+func NewWithSeed(seed uint64) *Digest {
+ var d Digest
+ d.ResetWithSeed(seed)
+ return &d
+}
+
+// Reset clears the Digest's state so that it can be reused.
+// It uses a seed value of zero.
+func (d *Digest) Reset() {
+ d.ResetWithSeed(0)
+}
+
+// ResetWithSeed clears the Digest's state so that it can be reused.
+// It uses the given seed to initialize the state.
+func (d *Digest) ResetWithSeed(seed uint64) {
+ d.v1 = seed + prime1 + prime2
+ d.v2 = seed + prime2
+ d.v3 = seed
+ d.v4 = seed - prime1
+ d.total = 0
+ d.n = 0
+}
+
+// Size always returns 8 bytes.
+func (d *Digest) Size() int { return 8 }
+
+// BlockSize always returns 32 bytes.
+func (d *Digest) BlockSize() int { return 32 }
+
+// Write adds more data to d. It always returns len(b), nil.
+func (d *Digest) Write(b []byte) (n int, err error) {
+ n = len(b)
+ d.total += uint64(n)
+
+ memleft := d.mem[d.n&(len(d.mem)-1):]
+
+ if d.n+n < 32 {
+ // This new data doesn't even fill the current block.
+ copy(memleft, b)
+ d.n += n
+ return
+ }
+
+ if d.n > 0 {
+ // Finish off the partial block.
+ c := copy(memleft, b)
+ d.v1 = round(d.v1, u64(d.mem[0:8]))
+ d.v2 = round(d.v2, u64(d.mem[8:16]))
+ d.v3 = round(d.v3, u64(d.mem[16:24]))
+ d.v4 = round(d.v4, u64(d.mem[24:32]))
+ b = b[c:]
+ d.n = 0
+ }
+
+ if len(b) >= 32 {
+ // One or more full blocks left.
+ nw := writeBlocks(d, b)
+ b = b[nw:]
+ }
+
+ // Store any remaining partial block.
+ copy(d.mem[:], b)
+ d.n = len(b)
+
+ return
+}
+
+// Sum appends the current hash to b and returns the resulting slice.
+func (d *Digest) Sum(b []byte) []byte {
+ s := d.Sum64()
+ return append(
+ b,
+ byte(s>>56),
+ byte(s>>48),
+ byte(s>>40),
+ byte(s>>32),
+ byte(s>>24),
+ byte(s>>16),
+ byte(s>>8),
+ byte(s),
+ )
+}
+
+// Sum64 returns the current hash.
+func (d *Digest) Sum64() uint64 {
+ var h uint64
+
+ if d.total >= 32 {
+ v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4
+ h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4)
+ h = mergeRound(h, v1)
+ h = mergeRound(h, v2)
+ h = mergeRound(h, v3)
+ h = mergeRound(h, v4)
+ } else {
+ h = d.v3 + prime5
+ }
+
+ h += d.total
+
+ b := d.mem[:d.n&(len(d.mem)-1)]
+ for ; len(b) >= 8; b = b[8:] {
+ k1 := round(0, u64(b[:8]))
+ h ^= k1
+ h = rol27(h)*prime1 + prime4
+ }
+ if len(b) >= 4 {
+ h ^= uint64(u32(b[:4])) * prime1
+ h = rol23(h)*prime2 + prime3
+ b = b[4:]
+ }
+ for ; len(b) > 0; b = b[1:] {
+ h ^= uint64(b[0]) * prime5
+ h = rol11(h) * prime1
+ }
+
+ h ^= h >> 33
+ h *= prime2
+ h ^= h >> 29
+ h *= prime3
+ h ^= h >> 32
+
+ return h
+}
+
+const (
+ magic = "xxh\x06"
+ marshaledSize = len(magic) + 8*5 + 32
+)
+
+// MarshalBinary implements the encoding.BinaryMarshaler interface.
+func (d *Digest) MarshalBinary() ([]byte, error) {
+ b := make([]byte, 0, marshaledSize)
+ b = append(b, magic...)
+ b = appendUint64(b, d.v1)
+ b = appendUint64(b, d.v2)
+ b = appendUint64(b, d.v3)
+ b = appendUint64(b, d.v4)
+ b = appendUint64(b, d.total)
+ b = append(b, d.mem[:d.n]...)
+ b = b[:len(b)+len(d.mem)-d.n]
+ return b, nil
+}
+
+// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface.
+func (d *Digest) UnmarshalBinary(b []byte) error {
+ if len(b) < len(magic) || string(b[:len(magic)]) != magic {
+ return errors.New("xxhash: invalid hash state identifier")
+ }
+ if len(b) != marshaledSize {
+ return errors.New("xxhash: invalid hash state size")
+ }
+ b = b[len(magic):]
+ b, d.v1 = consumeUint64(b)
+ b, d.v2 = consumeUint64(b)
+ b, d.v3 = consumeUint64(b)
+ b, d.v4 = consumeUint64(b)
+ b, d.total = consumeUint64(b)
+ copy(d.mem[:], b)
+ d.n = int(d.total % uint64(len(d.mem)))
+ return nil
+}
+
+func appendUint64(b []byte, x uint64) []byte {
+ var a [8]byte
+ binary.LittleEndian.PutUint64(a[:], x)
+ return append(b, a[:]...)
+}
+
+func consumeUint64(b []byte) ([]byte, uint64) {
+ x := u64(b)
+ return b[8:], x
+}
+
+func u64(b []byte) uint64 { return binary.LittleEndian.Uint64(b) }
+func u32(b []byte) uint32 { return binary.LittleEndian.Uint32(b) }
+
+func round(acc, input uint64) uint64 {
+ acc += input * prime2
+ acc = rol31(acc)
+ acc *= prime1
+ return acc
+}
+
+func mergeRound(acc, val uint64) uint64 {
+ val = round(0, val)
+ acc ^= val
+ acc = acc*prime1 + prime4
+ return acc
+}
+
+func rol1(x uint64) uint64 { return bits.RotateLeft64(x, 1) }
+func rol7(x uint64) uint64 { return bits.RotateLeft64(x, 7) }
+func rol11(x uint64) uint64 { return bits.RotateLeft64(x, 11) }
+func rol12(x uint64) uint64 { return bits.RotateLeft64(x, 12) }
+func rol18(x uint64) uint64 { return bits.RotateLeft64(x, 18) }
+func rol23(x uint64) uint64 { return bits.RotateLeft64(x, 23) }
+func rol27(x uint64) uint64 { return bits.RotateLeft64(x, 27) }
+func rol31(x uint64) uint64 { return bits.RotateLeft64(x, 31) }
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
new file mode 100644
index 0000000..3e8b132
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
@@ -0,0 +1,209 @@
+//go:build !appengine && gc && !purego
+// +build !appengine
+// +build gc
+// +build !purego
+
+#include "textflag.h"
+
+// Registers:
+#define h AX
+#define d AX
+#define p SI // pointer to advance through b
+#define n DX
+#define end BX // loop end
+#define v1 R8
+#define v2 R9
+#define v3 R10
+#define v4 R11
+#define x R12
+#define prime1 R13
+#define prime2 R14
+#define prime4 DI
+
+#define round(acc, x) \
+ IMULQ prime2, x \
+ ADDQ x, acc \
+ ROLQ $31, acc \
+ IMULQ prime1, acc
+
+// round0 performs the operation x = round(0, x).
+#define round0(x) \
+ IMULQ prime2, x \
+ ROLQ $31, x \
+ IMULQ prime1, x
+
+// mergeRound applies a merge round on the two registers acc and x.
+// It assumes that prime1, prime2, and prime4 have been loaded.
+#define mergeRound(acc, x) \
+ round0(x) \
+ XORQ x, acc \
+ IMULQ prime1, acc \
+ ADDQ prime4, acc
+
+// blockLoop processes as many 32-byte blocks as possible,
+// updating v1, v2, v3, and v4. It assumes that there is at least one block
+// to process.
+#define blockLoop() \
+loop: \
+ MOVQ +0(p), x \
+ round(v1, x) \
+ MOVQ +8(p), x \
+ round(v2, x) \
+ MOVQ +16(p), x \
+ round(v3, x) \
+ MOVQ +24(p), x \
+ round(v4, x) \
+ ADDQ $32, p \
+ CMPQ p, end \
+ JLE loop
+
+// func Sum64(b []byte) uint64
+TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32
+ // Load fixed primes.
+ MOVQ ·primes+0(SB), prime1
+ MOVQ ·primes+8(SB), prime2
+ MOVQ ·primes+24(SB), prime4
+
+ // Load slice.
+ MOVQ b_base+0(FP), p
+ MOVQ b_len+8(FP), n
+ LEAQ (p)(n*1), end
+
+ // The first loop limit will be len(b)-32.
+ SUBQ $32, end
+
+ // Check whether we have at least one block.
+ CMPQ n, $32
+ JLT noBlocks
+
+ // Set up initial state (v1, v2, v3, v4).
+ MOVQ prime1, v1
+ ADDQ prime2, v1
+ MOVQ prime2, v2
+ XORQ v3, v3
+ XORQ v4, v4
+ SUBQ prime1, v4
+
+ blockLoop()
+
+ MOVQ v1, h
+ ROLQ $1, h
+ MOVQ v2, x
+ ROLQ $7, x
+ ADDQ x, h
+ MOVQ v3, x
+ ROLQ $12, x
+ ADDQ x, h
+ MOVQ v4, x
+ ROLQ $18, x
+ ADDQ x, h
+
+ mergeRound(h, v1)
+ mergeRound(h, v2)
+ mergeRound(h, v3)
+ mergeRound(h, v4)
+
+ JMP afterBlocks
+
+noBlocks:
+ MOVQ ·primes+32(SB), h
+
+afterBlocks:
+ ADDQ n, h
+
+ ADDQ $24, end
+ CMPQ p, end
+ JG try4
+
+loop8:
+ MOVQ (p), x
+ ADDQ $8, p
+ round0(x)
+ XORQ x, h
+ ROLQ $27, h
+ IMULQ prime1, h
+ ADDQ prime4, h
+
+ CMPQ p, end
+ JLE loop8
+
+try4:
+ ADDQ $4, end
+ CMPQ p, end
+ JG try1
+
+ MOVL (p), x
+ ADDQ $4, p
+ IMULQ prime1, x
+ XORQ x, h
+
+ ROLQ $23, h
+ IMULQ prime2, h
+ ADDQ ·primes+16(SB), h
+
+try1:
+ ADDQ $4, end
+ CMPQ p, end
+ JGE finalize
+
+loop1:
+ MOVBQZX (p), x
+ ADDQ $1, p
+ IMULQ ·primes+32(SB), x
+ XORQ x, h
+ ROLQ $11, h
+ IMULQ prime1, h
+
+ CMPQ p, end
+ JL loop1
+
+finalize:
+ MOVQ h, x
+ SHRQ $33, x
+ XORQ x, h
+ IMULQ prime2, h
+ MOVQ h, x
+ SHRQ $29, x
+ XORQ x, h
+ IMULQ ·primes+16(SB), h
+ MOVQ h, x
+ SHRQ $32, x
+ XORQ x, h
+
+ MOVQ h, ret+24(FP)
+ RET
+
+// func writeBlocks(d *Digest, b []byte) int
+TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40
+ // Load fixed primes needed for round.
+ MOVQ ·primes+0(SB), prime1
+ MOVQ ·primes+8(SB), prime2
+
+ // Load slice.
+ MOVQ b_base+8(FP), p
+ MOVQ b_len+16(FP), n
+ LEAQ (p)(n*1), end
+ SUBQ $32, end
+
+ // Load vN from d.
+ MOVQ s+0(FP), d
+ MOVQ 0(d), v1
+ MOVQ 8(d), v2
+ MOVQ 16(d), v3
+ MOVQ 24(d), v4
+
+ // We don't need to check the loop condition here; this function is
+ // always called with at least one block of data to process.
+ blockLoop()
+
+ // Copy vN back to d.
+ MOVQ v1, 0(d)
+ MOVQ v2, 8(d)
+ MOVQ v3, 16(d)
+ MOVQ v4, 24(d)
+
+ // The number of bytes written is p minus the old base pointer.
+ SUBQ b_base+8(FP), p
+ MOVQ p, ret+32(FP)
+
+ RET
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s
new file mode 100644
index 0000000..7e3145a
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s
@@ -0,0 +1,183 @@
+//go:build !appengine && gc && !purego
+// +build !appengine
+// +build gc
+// +build !purego
+
+#include "textflag.h"
+
+// Registers:
+#define digest R1
+#define h R2 // return value
+#define p R3 // input pointer
+#define n R4 // input length
+#define nblocks R5 // n / 32
+#define prime1 R7
+#define prime2 R8
+#define prime3 R9
+#define prime4 R10
+#define prime5 R11
+#define v1 R12
+#define v2 R13
+#define v3 R14
+#define v4 R15
+#define x1 R20
+#define x2 R21
+#define x3 R22
+#define x4 R23
+
+#define round(acc, x) \
+ MADD prime2, acc, x, acc \
+ ROR $64-31, acc \
+ MUL prime1, acc
+
+// round0 performs the operation x = round(0, x).
+#define round0(x) \
+ MUL prime2, x \
+ ROR $64-31, x \
+ MUL prime1, x
+
+#define mergeRound(acc, x) \
+ round0(x) \
+ EOR x, acc \
+ MADD acc, prime4, prime1, acc
+
+// blockLoop processes as many 32-byte blocks as possible,
+// updating v1, v2, v3, and v4. It assumes that n >= 32.
+#define blockLoop() \
+ LSR $5, n, nblocks \
+ PCALIGN $16 \
+ loop: \
+ LDP.P 16(p), (x1, x2) \
+ LDP.P 16(p), (x3, x4) \
+ round(v1, x1) \
+ round(v2, x2) \
+ round(v3, x3) \
+ round(v4, x4) \
+ SUB $1, nblocks \
+ CBNZ nblocks, loop
+
+// func Sum64(b []byte) uint64
+TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32
+ LDP b_base+0(FP), (p, n)
+
+ LDP ·primes+0(SB), (prime1, prime2)
+ LDP ·primes+16(SB), (prime3, prime4)
+ MOVD ·primes+32(SB), prime5
+
+ CMP $32, n
+ CSEL LT, prime5, ZR, h // if n < 32 { h = prime5 } else { h = 0 }
+ BLT afterLoop
+
+ ADD prime1, prime2, v1
+ MOVD prime2, v2
+ MOVD $0, v3
+ NEG prime1, v4
+
+ blockLoop()
+
+ ROR $64-1, v1, x1
+ ROR $64-7, v2, x2
+ ADD x1, x2
+ ROR $64-12, v3, x3
+ ROR $64-18, v4, x4
+ ADD x3, x4
+ ADD x2, x4, h
+
+ mergeRound(h, v1)
+ mergeRound(h, v2)
+ mergeRound(h, v3)
+ mergeRound(h, v4)
+
+afterLoop:
+ ADD n, h
+
+ TBZ $4, n, try8
+ LDP.P 16(p), (x1, x2)
+
+ round0(x1)
+
+ // NOTE: here and below, sequencing the EOR after the ROR (using a
+ // rotated register) is worth a small but measurable speedup for small
+ // inputs.
+ ROR $64-27, h
+ EOR x1 @> 64-27, h, h
+ MADD h, prime4, prime1, h
+
+ round0(x2)
+ ROR $64-27, h
+ EOR x2 @> 64-27, h, h
+ MADD h, prime4, prime1, h
+
+try8:
+ TBZ $3, n, try4
+ MOVD.P 8(p), x1
+
+ round0(x1)
+ ROR $64-27, h
+ EOR x1 @> 64-27, h, h
+ MADD h, prime4, prime1, h
+
+try4:
+ TBZ $2, n, try2
+ MOVWU.P 4(p), x2
+
+ MUL prime1, x2
+ ROR $64-23, h
+ EOR x2 @> 64-23, h, h
+ MADD h, prime3, prime2, h
+
+try2:
+ TBZ $1, n, try1
+ MOVHU.P 2(p), x3
+ AND $255, x3, x1
+ LSR $8, x3, x2
+
+ MUL prime5, x1
+ ROR $64-11, h
+ EOR x1 @> 64-11, h, h
+ MUL prime1, h
+
+ MUL prime5, x2
+ ROR $64-11, h
+ EOR x2 @> 64-11, h, h
+ MUL prime1, h
+
+try1:
+ TBZ $0, n, finalize
+ MOVBU (p), x4
+
+ MUL prime5, x4
+ ROR $64-11, h
+ EOR x4 @> 64-11, h, h
+ MUL prime1, h
+
+finalize:
+ EOR h >> 33, h
+ MUL prime2, h
+ EOR h >> 29, h
+ MUL prime3, h
+ EOR h >> 32, h
+
+ MOVD h, ret+24(FP)
+ RET
+
+// func writeBlocks(d *Digest, b []byte) int
+TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40
+ LDP ·primes+0(SB), (prime1, prime2)
+
+ // Load state. Assume v[1-4] are stored contiguously.
+ MOVD d+0(FP), digest
+ LDP 0(digest), (v1, v2)
+ LDP 16(digest), (v3, v4)
+
+ LDP b_base+8(FP), (p, n)
+
+ blockLoop()
+
+ // Store updated state.
+ STP (v1, v2), 0(digest)
+ STP (v3, v4), 16(digest)
+
+ BIC $31, n
+ MOVD n, ret+32(FP)
+ RET
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
new file mode 100644
index 0000000..78f95f2
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
@@ -0,0 +1,15 @@
+//go:build (amd64 || arm64) && !appengine && gc && !purego
+// +build amd64 arm64
+// +build !appengine
+// +build gc
+// +build !purego
+
+package xxhash
+
+// Sum64 computes the 64-bit xxHash digest of b with a zero seed.
+//
+//go:noescape
+func Sum64(b []byte) uint64
+
+//go:noescape
+func writeBlocks(d *Digest, b []byte) int
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_other.go b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
new file mode 100644
index 0000000..118e49e
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
@@ -0,0 +1,76 @@
+//go:build (!amd64 && !arm64) || appengine || !gc || purego
+// +build !amd64,!arm64 appengine !gc purego
+
+package xxhash
+
+// Sum64 computes the 64-bit xxHash digest of b with a zero seed.
+func Sum64(b []byte) uint64 {
+ // A simpler version would be
+ // d := New()
+ // d.Write(b)
+ // return d.Sum64()
+ // but this is faster, particularly for small inputs.
+
+ n := len(b)
+ var h uint64
+
+ if n >= 32 {
+ v1 := primes[0] + prime2
+ v2 := prime2
+ v3 := uint64(0)
+ v4 := -primes[0]
+ for len(b) >= 32 {
+ v1 = round(v1, u64(b[0:8:len(b)]))
+ v2 = round(v2, u64(b[8:16:len(b)]))
+ v3 = round(v3, u64(b[16:24:len(b)]))
+ v4 = round(v4, u64(b[24:32:len(b)]))
+ b = b[32:len(b):len(b)]
+ }
+ h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4)
+ h = mergeRound(h, v1)
+ h = mergeRound(h, v2)
+ h = mergeRound(h, v3)
+ h = mergeRound(h, v4)
+ } else {
+ h = prime5
+ }
+
+ h += uint64(n)
+
+ for ; len(b) >= 8; b = b[8:] {
+ k1 := round(0, u64(b[:8]))
+ h ^= k1
+ h = rol27(h)*prime1 + prime4
+ }
+ if len(b) >= 4 {
+ h ^= uint64(u32(b[:4])) * prime1
+ h = rol23(h)*prime2 + prime3
+ b = b[4:]
+ }
+ for ; len(b) > 0; b = b[1:] {
+ h ^= uint64(b[0]) * prime5
+ h = rol11(h) * prime1
+ }
+
+ h ^= h >> 33
+ h *= prime2
+ h ^= h >> 29
+ h *= prime3
+ h ^= h >> 32
+
+ return h
+}
+
+func writeBlocks(d *Digest, b []byte) int {
+ v1, v2, v3, v4 := d.v1, d.v2, d.v3, d.v4
+ n := len(b)
+ for len(b) >= 32 {
+ v1 = round(v1, u64(b[0:8:len(b)]))
+ v2 = round(v2, u64(b[8:16:len(b)]))
+ v3 = round(v3, u64(b[16:24:len(b)]))
+ v4 = round(v4, u64(b[24:32:len(b)]))
+ b = b[32:len(b):len(b)]
+ }
+ d.v1, d.v2, d.v3, d.v4 = v1, v2, v3, v4
+ return n - len(b)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
new file mode 100644
index 0000000..05f5e7d
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
@@ -0,0 +1,16 @@
+//go:build appengine
+// +build appengine
+
+// This file contains the safe implementations of otherwise unsafe-using code.
+
+package xxhash
+
+// Sum64String computes the 64-bit xxHash digest of s with a zero seed.
+func Sum64String(s string) uint64 {
+ return Sum64([]byte(s))
+}
+
+// WriteString adds more data to d. It always returns len(s), nil.
+func (d *Digest) WriteString(s string) (n int, err error) {
+ return d.Write([]byte(s))
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
new file mode 100644
index 0000000..cf9d42a
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
@@ -0,0 +1,58 @@
+//go:build !appengine
+// +build !appengine
+
+// This file encapsulates usage of unsafe.
+// xxhash_safe.go contains the safe implementations.
+
+package xxhash
+
+import (
+ "unsafe"
+)
+
+// In the future it's possible that compiler optimizations will make these
+// XxxString functions unnecessary by realizing that calls such as
+// Sum64([]byte(s)) don't need to copy s. See https://go.dev/issue/2205.
+// If that happens, even if we keep these functions they can be replaced with
+// the trivial safe code.
+
+// NOTE: The usual way of doing an unsafe string-to-[]byte conversion is:
+//
+// var b []byte
+// bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
+// bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data
+// bh.Len = len(s)
+// bh.Cap = len(s)
+//
+// Unfortunately, as of Go 1.15.3 the inliner's cost model assigns a high enough
+// weight to this sequence of expressions that any function that uses it will
+// not be inlined. Instead, the functions below use a different unsafe
+// conversion designed to minimize the inliner weight and allow both to be
+// inlined. There is also a test (TestInlining) which verifies that these are
+// inlined.
+//
+// See https://github.com/golang/go/issues/42739 for discussion.
+
+// Sum64String computes the 64-bit xxHash digest of s with a zero seed.
+// It may be faster than Sum64([]byte(s)) by avoiding a copy.
+func Sum64String(s string) uint64 {
+ b := *(*[]byte)(unsafe.Pointer(&sliceHeader{s, len(s)}))
+ return Sum64(b)
+}
+
+// WriteString adds more data to d. It always returns len(s), nil.
+// It may be faster than Write([]byte(s)) by avoiding a copy.
+func (d *Digest) WriteString(s string) (n int, err error) {
+ d.Write(*(*[]byte)(unsafe.Pointer(&sliceHeader{s, len(s)})))
+ // d.Write always returns len(s), nil.
+ // Ignoring the return output and returning these fixed values buys a
+ // savings of 6 in the inliner's cost model.
+ return len(s), nil
+}
+
+// sliceHeader is similar to reflect.SliceHeader, but it assumes that the layout
+// of the first two words is the same as the layout of a string.
+type sliceHeader struct {
+ s string
+ cap int
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/.gitignore b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/.gitignore
new file mode 100644
index 0000000..62c8935
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/.gitignore
@@ -0,0 +1 @@
+.idea/
\ No newline at end of file
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/LICENSE b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/LICENSE
new file mode 100644
index 0000000..46dff75
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Denys Smirnov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/README.md b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/README.md
new file mode 100644
index 0000000..2bae4b2
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/README.md
@@ -0,0 +1,3 @@
+# iters
+
+This is a generic iterators library shared by some of my projects. Experimental. Things may (and will) break.
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/encode.go b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/encode.go
new file mode 100644
index 0000000..a728d18
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/encode.go
@@ -0,0 +1,59 @@
+package iters
+
+import (
+ "io"
+)
+
+type Encoder interface {
+ Encode(v any) error
+}
+
+type Decoder interface {
+ Decode(v any) error
+}
+
+// Encode an iterator.
+func Encode[T any](enc Encoder, it Iter[T]) error {
+ defer it.Close()
+ for {
+ cur, err := it.Next()
+ if err == io.EOF {
+ return nil
+ } else if err != nil {
+ return err
+ }
+ if err = enc.Encode(cur); err != nil {
+ return err
+ }
+ }
+}
+
+// Decode an iterator.
+//
+// It will use type T as a destination type, thus it must not be an interface.
+func Decode[T any](dec Decoder) Iter[T] {
+ return &decoder[T]{dec: dec}
+}
+
+type decoder[T any] struct {
+ dec Decoder
+}
+
+func (it *decoder[T]) Next() (T, error) {
+ var zero T
+ if it.dec == nil {
+ return zero, io.EOF
+ }
+ var cur T
+ err := it.dec.Decode(&cur)
+ if err == io.EOF {
+ return zero, io.EOF // do it explicitly
+ } else if err != nil {
+ return zero, err
+ }
+ return cur, nil
+}
+
+func (it *decoder[T]) Close() {
+ it.dec = nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/filter.go b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/filter.go
new file mode 100644
index 0000000..c9516e2
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/filter.go
@@ -0,0 +1,100 @@
+package iters
+
+import "context"
+
+// Filter iterator results with a function. If function returns false, result is skipped.
+func Filter[T any](it Iter[T], filter func(v T) bool) Iter[T] {
+ if filter == nil {
+ return it
+ }
+ return &filterIter[T]{it: it, filter: filter}
+}
+
+type filterIter[T any] struct {
+ it Iter[T]
+ filter func(v T) bool
+}
+
+func (it *filterIter[T]) Next() (T, error) {
+ var zero T
+ for {
+ v, err := it.it.Next()
+ if err != nil {
+ return zero, err
+ }
+ if it.filter(v) {
+ return v, nil
+ }
+ }
+}
+
+func (it *filterIter[T]) Close() {
+ it.it.Close()
+}
+
+// FilterCtx filters iterator results with a function. If function returns false, result is skipped.
+func FilterCtx[T any](it IterCtx[T], filter func(v T) bool) IterCtx[T] {
+ if filter == nil {
+ return it
+ }
+ return &filterIterCtx[T]{it: it, filter: filter}
+}
+
+type filterIterCtx[T any] struct {
+ it IterCtx[T]
+ filter func(v T) bool
+}
+
+func (it *filterIterCtx[T]) NextCtx(ctx context.Context) (T, error) {
+ var zero T
+ for {
+ v, err := it.it.NextCtx(ctx)
+ if err != nil {
+ return zero, err
+ }
+ if it.filter(v) {
+ return v, nil
+ }
+ }
+}
+
+func (it *filterIterCtx[T]) Close() {
+ it.it.Close()
+}
+
+// FilterPage filters page iterator results with a function. If function returns false, result is skipped.
+func FilterPage[T any](it PageIter[T], filter func(v T) bool) PageIter[T] {
+ if filter == nil {
+ return it
+ }
+ return &filterPageIter[T]{it: it, filter: filter}
+}
+
+type filterPageIter[T any] struct {
+ it PageIter[T]
+ filter func(v T) bool
+}
+
+func (it *filterPageIter[T]) NextPage(ctx context.Context) ([]T, error) {
+ for {
+ page, err := it.it.NextPage(ctx)
+ var out []T
+ if len(page) != 0 {
+ out = make([]T, 0, len(page))
+ }
+ for _, v := range page {
+ if it.filter(v) {
+ out = append(out, v)
+ }
+ }
+ if err != nil {
+ return out, err
+ } else if len(out) != 0 {
+ return out, nil
+ }
+ }
+}
+
+func (it *filterPageIter[T]) Close() {
+ it.it.Close()
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/iter.go b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/iter.go
new file mode 100644
index 0000000..2058e9e
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/iter.go
@@ -0,0 +1,47 @@
+package iters
+
+import "context"
+
+// Iter is a generic interface for the iterator.
+//
+// Example:
+//
+// defer it.Close()
+// for {
+// v, err := it.Next()
+// if err == io.EOF {
+// break
+// } else if err != nil {
+// panic(err)
+// }
+// fmt.Println(v)
+// }
+type Iter[T any] interface {
+ // Next returns the next item.
+ // It returns io.EOF if there are no more items left.
+ Next() (T, error)
+ // Close the iterator.
+ Close()
+}
+
+// IterCtx is a generic interface for the iterator with a context.
+//
+// Example:
+//
+// defer it.Close()
+// for {
+// v, err := it.NextCtx(ctx)
+// if err == io.EOF {
+// break
+// } else if err != nil {
+// panic(err)
+// }
+// fmt.Println(v)
+// }
+type IterCtx[T any] interface {
+ // NextCtx returns the next item.
+ // It returns io.EOF if there are no more items left.
+ NextCtx(ctx context.Context) (T, error)
+ // Close the iterator.
+ Close()
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/join.go b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/join.go
new file mode 100644
index 0000000..1b6180a
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/join.go
@@ -0,0 +1,110 @@
+package iters
+
+import (
+ "context"
+ "io"
+)
+
+// Join iterators by listing elements sequentially from each iterator in order.
+// If any of the iterators fail, an error is returned.
+func Join[T any](sub ...Iter[T]) Iter[T] {
+ return &joinIter[T]{sub: sub}
+}
+
+type joinIter[T any] struct {
+ sub []Iter[T]
+}
+
+func (it *joinIter[T]) Next() (T, error) {
+ var zero T
+ for {
+ if len(it.sub) == 0 {
+ return zero, io.EOF
+ }
+ v, err := it.sub[0].Next()
+ if err == nil {
+ return v, nil
+ }
+ it.sub[0].Close()
+ if err != io.EOF {
+ return zero, err
+ }
+ it.sub = it.sub[1:]
+ }
+}
+
+func (it *joinIter[T]) Close() {
+ for _, iter := range it.sub {
+ iter.Close()
+ }
+ it.sub = nil
+}
+
+// JoinCtx iterators by listing elements sequentially from each iterator in order.
+// If any of the iterators fail, an error is returned.
+func JoinCtx[T any](sub ...IterCtx[T]) IterCtx[T] {
+ return &joinIterCtx[T]{sub: sub}
+}
+
+type joinIterCtx[T any] struct {
+ sub []IterCtx[T]
+}
+
+func (it *joinIterCtx[T]) NextCtx(ctx context.Context) (T, error) {
+ var zero T
+ for {
+ if len(it.sub) == 0 {
+ return zero, io.EOF
+ }
+ v, err := it.sub[0].NextCtx(ctx)
+ if err == nil {
+ return v, nil
+ }
+ it.sub[0].Close()
+ if err != io.EOF {
+ return zero, err
+ }
+ it.sub = it.sub[1:]
+ }
+}
+
+func (it *joinIterCtx[T]) Close() {
+ for _, iter := range it.sub {
+ iter.Close()
+ }
+ it.sub = nil
+}
+
+// JoinPages joins iterators by listing pages sequentially from each iterator in order.
+// If any of the iterators fail, an error is returned.
+func JoinPages[T any](sub ...PageIter[T]) PageIter[T] {
+ return &joinPageIter[T]{sub: sub}
+}
+
+type joinPageIter[T any] struct {
+ sub []PageIter[T]
+}
+
+func (it *joinPageIter[T]) NextPage(ctx context.Context) ([]T, error) {
+ for {
+ if len(it.sub) == 0 {
+ return nil, io.EOF
+ }
+ v, err := it.sub[0].NextPage(ctx)
+ if err == nil {
+ return v, nil
+ }
+ it.sub[0].Close()
+ if err != io.EOF {
+ return nil, err
+ }
+ it.sub = it.sub[1:]
+ }
+}
+
+func (it *joinPageIter[T]) Close() {
+ for _, iter := range it.sub {
+ iter.Close()
+ }
+ it.sub = nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/map.go b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/map.go
new file mode 100644
index 0000000..a82a194
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/map.go
@@ -0,0 +1,82 @@
+package iters
+
+import "context"
+
+// Map iterator items to a different type.
+func Map[T1 any, T2 any](it Iter[T1], conv func(v T1) (T2, error)) Iter[T2] {
+ return &mapIter[T1, T2]{it: it, conv: conv}
+}
+
+type mapIter[T1 any, T2 any] struct {
+ it Iter[T1]
+ conv func(v T1) (T2, error)
+}
+
+func (it *mapIter[T1, T2]) Next() (T2, error) {
+ var zero T2
+ v, err := it.it.Next()
+ if err != nil {
+ return zero, err
+ }
+ return it.conv(v)
+}
+
+func (it *mapIter[T1, T2]) Close() {
+ it.it.Close()
+}
+
+// MapCtx maps iterator items to a different type.
+func MapCtx[T1 any, T2 any](it IterCtx[T1], conv func(ctx context.Context, v T1) (T2, error)) IterCtx[T2] {
+ return &mapIterCtx[T1, T2]{it: it, conv: conv}
+}
+
+type mapIterCtx[T1 any, T2 any] struct {
+ it IterCtx[T1]
+ conv func(ctx context.Context, v T1) (T2, error)
+}
+
+func (it *mapIterCtx[T1, T2]) NextCtx(ctx context.Context) (T2, error) {
+ var zero T2
+ v, err := it.it.NextCtx(ctx)
+ if err != nil {
+ return zero, err
+ }
+ return it.conv(ctx, v)
+}
+
+func (it *mapIterCtx[T1, T2]) Close() {
+ it.it.Close()
+}
+
+// MapPage maps page iterator items to a different type.
+func MapPage[T1 any, T2 any](it PageIter[T1], conv func(ctx context.Context, v T1) (T2, error)) PageIter[T2] {
+ return &mapPageIter[T1, T2]{it: it, conv: conv}
+}
+
+type mapPageIter[T1 any, T2 any] struct {
+ it PageIter[T1]
+ conv func(ctx context.Context, v T1) (T2, error)
+}
+
+func (it *mapPageIter[T1, T2]) NextPage(ctx context.Context) ([]T2, error) {
+ page, err := it.it.NextPage(ctx)
+ if err != nil {
+ return nil, err
+ }
+ var out []T2
+ if len(page) != 0 {
+ out = make([]T2, 0, len(page))
+ }
+ for _, v := range page {
+ v2, err := it.conv(ctx, v)
+ if err != nil {
+ return out, err
+ }
+ out = append(out, v2)
+ }
+ return out, nil
+}
+
+func (it *mapPageIter[T1, T2]) Close() {
+ it.it.Close()
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/multi.go b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/multi.go
new file mode 100644
index 0000000..b5c773c
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/multi.go
@@ -0,0 +1,155 @@
+package iters
+
+import (
+ "context"
+ "io"
+)
+
+// MultiIter creates a new iterator that alternates between results from sub iterators.
+//
+// If strict is set to true, the iterator will fail on the first non io.EOF error.
+// If it's false, the iterator will return the last error when all iterators are done (or fail).
+func MultiIter[T any](strict bool, sub ...Iter[T]) Iter[T] {
+ return &multiIter[T]{sub: sub, ind: 0, strict: strict}
+}
+
+type multiIter[T any] struct {
+ sub []Iter[T]
+ ind int
+ last error
+ strict bool
+}
+
+func (it *multiIter[T]) Next() (T, error) {
+ var zero T
+ for {
+ if len(it.sub) == 0 {
+ if it.last != nil {
+ return zero, it.last
+ }
+ return zero, io.EOF
+ }
+ cur, err := it.sub[it.ind].Next()
+ if err == nil {
+ it.ind = (it.ind + 1) % len(it.sub)
+ return cur, nil
+ }
+ it.sub[it.ind].Close()
+ it.sub = append(it.sub[:it.ind], it.sub[it.ind+1:]...)
+ if len(it.sub) != 0 {
+ it.ind %= len(it.sub)
+ }
+ if err != io.EOF {
+ if it.strict {
+ return zero, err
+ }
+ it.last = err
+ }
+ }
+}
+
+func (it *multiIter[T]) Close() {
+ for _, iter := range it.sub {
+ iter.Close()
+ }
+ it.sub = nil
+}
+
+// MultiIterCtx creates a new iterator that alternates between results from sub iterators.
+//
+// If strict is set to true, the iterator will fail on the first non io.EOF error.
+// If it's false, the iterator will return the last error when all iterators are done (or fail).
+func MultiIterCtx[T any](strict bool, sub ...IterCtx[T]) IterCtx[T] {
+ return &multiIterCtx[T]{sub: sub, ind: 0, strict: strict}
+}
+
+type multiIterCtx[T any] struct {
+ sub []IterCtx[T]
+ ind int
+ last error
+ strict bool
+}
+
+func (it *multiIterCtx[T]) NextCtx(ctx context.Context) (T, error) {
+ var zero T
+ for {
+ if len(it.sub) == 0 {
+ if it.last != nil {
+ return zero, it.last
+ }
+ return zero, io.EOF
+ }
+ cur, err := it.sub[it.ind].NextCtx(ctx)
+ if err == nil {
+ it.ind = (it.ind + 1) % len(it.sub)
+ return cur, nil
+ }
+ it.sub[it.ind].Close()
+ it.sub = append(it.sub[:it.ind], it.sub[it.ind+1:]...)
+ if len(it.sub) != 0 {
+ it.ind %= len(it.sub)
+ }
+ if err != io.EOF {
+ if it.strict {
+ return zero, err
+ }
+ it.last = err
+ }
+ }
+}
+
+func (it *multiIterCtx[T]) Close() {
+ for _, iter := range it.sub {
+ iter.Close()
+ }
+ it.sub = nil
+}
+
+// MultiPageIter creates a new iterator that alternates between pages from sub iterators.
+//
+// If strict is set to true, the iterator will fail on the first non io.EOF error.
+// If it's false, the iterator will return the last error when all iterators are done (or fail).
+func MultiPageIter[T any](strict bool, sub ...PageIter[T]) PageIter[T] {
+ return &multiPageIter[T]{sub: sub, ind: 0, strict: strict}
+}
+
+type multiPageIter[T any] struct {
+ sub []PageIter[T]
+ ind int
+ last error
+ strict bool
+}
+
+func (it *multiPageIter[T]) NextPage(ctx context.Context) ([]T, error) {
+ for {
+ if len(it.sub) == 0 {
+ if it.last != nil {
+ return nil, it.last
+ }
+ return nil, io.EOF
+ }
+ page, err := it.sub[it.ind].NextPage(ctx)
+ if err == nil {
+ it.ind = (it.ind + 1) % len(it.sub)
+ return page, nil
+ }
+ it.sub[it.ind].Close()
+ it.sub = append(it.sub[:it.ind], it.sub[it.ind+1:]...)
+ if len(it.sub) != 0 {
+ it.ind %= len(it.sub)
+ }
+ if err != io.EOF {
+ if it.strict {
+ return nil, err
+ }
+ it.last = err
+ }
+ }
+}
+
+func (it *multiPageIter[T]) Close() {
+ for _, iter := range it.sub {
+ iter.Close()
+ }
+ it.sub = nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/page.go b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/page.go
new file mode 100644
index 0000000..c5b6421
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/page.go
@@ -0,0 +1,188 @@
+package iters
+
+import "context"
+
+// PageIter is an iterator that iterates over pages of items.
+type PageIter[T any] interface {
+ // NextPage returns the next page of items.
+ // It returns io.EOF if there are no more items left.
+ NextPage(ctx context.Context) ([]T, error)
+ // Close the iterator.
+ Close()
+}
+
+// PagedIter combines Iter and PageIter.
+type PagedIter[T any] interface {
+ Iter[T]
+ IterCtx[T]
+ PageIter[T]
+}
+
+// PagesAsIter takes a PageIter and converts it to an Iter.
+func PagesAsIter[T any](ctx context.Context, it PageIter[T]) Iter[T] {
+ if it, ok := it.(Iter[T]); ok {
+ return it
+ }
+ return &pageEachIter[T]{ctx: ctx, it: it}
+}
+
+type pageEachIter[T any] struct {
+ ctx context.Context
+ it PageIter[T]
+ buf []T
+}
+
+func (it *pageEachIter[T]) next() error {
+ for len(it.buf) == 0 {
+ buf, err := it.it.NextPage(it.ctx)
+ if err != nil {
+ return err
+ }
+ it.buf = buf
+ }
+ return nil
+}
+
+func (it *pageEachIter[T]) Next() (T, error) {
+ if err := it.next(); err != nil {
+ var zero T
+ return zero, err
+ }
+ cur := it.buf[0]
+ it.buf = it.buf[1:]
+ return cur, nil
+}
+
+func (it *pageEachIter[T]) NextPage(ctx context.Context) ([]T, error) {
+ if err := it.next(); err != nil {
+ return nil, err
+ }
+ page := it.buf
+ it.buf = nil
+ return page, nil
+}
+
+func (it *pageEachIter[T]) Close() {
+ it.it.Close()
+}
+
+// IterWithPage takes an Iter and converts it to an PageIter with a specific page size.
+func IterWithPage[T any](it Iter[T], page int) PageIter[T] {
+ if page <= 0 {
+ panic("page size must be set")
+ }
+ return &pageIter[T]{it: it, buf: make([]T, 0, page)}
+}
+
+type pageIter[T any] struct {
+ it Iter[T]
+ buf []T
+ err error
+}
+
+func (it *pageIter[T]) NextPage(ctx context.Context) ([]T, error) {
+ it.buf = it.buf[:0]
+ if it.err != nil {
+ return nil, it.err
+ }
+ for len(it.buf) < cap(it.buf) {
+ cur, err := it.it.Next()
+ if err != nil {
+ if len(it.buf) != 0 {
+ it.err = err
+ break
+ }
+ return nil, err
+ }
+ it.buf = append(it.buf, cur)
+ }
+ return it.buf, nil
+}
+
+func (it *pageIter[T]) Close() {
+ it.it.Close()
+}
+
+// PagesAsIterCtx takes a PageIter and converts it to an IterCtx.
+func PagesAsIterCtx[T any](it PageIter[T]) IterCtx[T] {
+ if it, ok := it.(IterCtx[T]); ok {
+ return it
+ }
+ return &pageEachIterCtx[T]{it: it}
+}
+
+type pageEachIterCtx[T any] struct {
+ it PageIter[T]
+ buf []T
+}
+
+func (it *pageEachIterCtx[T]) next(ctx context.Context) error {
+ for len(it.buf) == 0 {
+ buf, err := it.it.NextPage(ctx)
+ if err != nil {
+ return err
+ }
+ it.buf = buf
+ }
+ return nil
+}
+
+func (it *pageEachIterCtx[T]) NextCtx(ctx context.Context) (T, error) {
+ if err := it.next(ctx); err != nil {
+ var zero T
+ return zero, err
+ }
+ cur := it.buf[0]
+ it.buf = it.buf[1:]
+ return cur, nil
+}
+
+func (it *pageEachIterCtx[T]) NextPage(ctx context.Context) ([]T, error) {
+ if err := it.next(ctx); err != nil {
+ return nil, err
+ }
+ page := it.buf
+ it.buf = nil
+ return page, nil
+}
+
+func (it *pageEachIterCtx[T]) Close() {
+ it.it.Close()
+}
+
+// IterWithPageCtx takes an IterCtx and converts it to an PageIter with a specific page size.
+func IterWithPageCtx[T any](it IterCtx[T], page int) PageIter[T] {
+ if page <= 0 {
+ panic("page size must be set")
+ }
+ return &pageIterCtx[T]{it: it, buf: make([]T, 0, page)}
+}
+
+type pageIterCtx[T any] struct {
+ it IterCtx[T]
+ buf []T
+ err error
+}
+
+func (it *pageIterCtx[T]) NextPage(ctx context.Context) ([]T, error) {
+ it.buf = it.buf[:0]
+ if it.err != nil {
+ return nil, it.err
+ }
+ for len(it.buf) < cap(it.buf) {
+ cur, err := it.it.NextCtx(ctx)
+ if err != nil {
+ if len(it.buf) != 0 {
+ it.err = err
+ break
+ }
+ return nil, err
+ }
+ it.buf = append(it.buf, cur)
+ }
+ return it.buf, nil
+}
+
+func (it *pageIterCtx[T]) Close() {
+ it.it.Close()
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/dennwc/iters/slice.go b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/slice.go
new file mode 100644
index 0000000..a45c93c
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dennwc/iters/slice.go
@@ -0,0 +1,133 @@
+package iters
+
+import (
+ "context"
+ "io"
+)
+
+// All returns all Iter results as a slice.
+func All[T any](it Iter[T]) ([]T, error) {
+ if s, ok := it.(*sliceIter[T]); ok {
+ return s.buf, nil
+ }
+ if pi, ok := it.(PageIter[T]); ok {
+ return AllPages(context.Background(), pi)
+ }
+ defer it.Close()
+ var out []T
+ for {
+ v, err := it.Next()
+ if err == io.EOF {
+ return out, nil
+ } else if err != nil {
+ return out, err
+ }
+ out = append(out, v)
+ }
+}
+
+// AllCtx returns all IterCtx results as a slice.
+func AllCtx[T any](ctx context.Context, it IterCtx[T]) ([]T, error) {
+ if s, ok := it.(*sliceIter[T]); ok {
+ return s.buf, nil
+ }
+ if pi, ok := it.(PageIter[T]); ok {
+ return AllPages(ctx, pi)
+ }
+ defer it.Close()
+ var out []T
+ for {
+ v, err := it.NextCtx(ctx)
+ if err == io.EOF {
+ return out, nil
+ } else if err != nil {
+ return out, err
+ }
+ out = append(out, v)
+ }
+}
+
+// AllPages returns all PageIter results as a slice.
+func AllPages[T any](ctx context.Context, it PageIter[T]) ([]T, error) {
+ if s, ok := it.(*sliceIter[T]); ok {
+ return s.buf, nil
+ }
+ defer it.Close()
+ var out []T
+ for {
+ v, err := it.NextPage(ctx)
+ if err == io.EOF {
+ return out, nil
+ } else if err != nil {
+ return out, err
+ }
+ out = append(out, v...)
+ }
+}
+
+// Slice converts a slice to a PagedIter.
+//
+// When used as a PageIter, it returns all items as a single page.
+// See PageSlice or IterWithPage for controlling the page size.
+func Slice[T any](s []T) PagedIter[T] {
+ return &sliceIter[T]{buf: s}
+}
+
+type sliceIter[T any] struct {
+ buf []T
+}
+
+func (it *sliceIter[T]) NextPage(ctx context.Context) ([]T, error) {
+ if len(it.buf) == 0 {
+ return nil, io.EOF
+ }
+ buf := it.buf
+ it.buf = nil
+ return buf, nil
+}
+
+func (it *sliceIter[T]) Next() (T, error) {
+ if len(it.buf) == 0 {
+ var zero T
+ return zero, io.EOF
+ }
+ cur := it.buf[0]
+ it.buf = it.buf[1:]
+ return cur, nil
+}
+
+func (it *sliceIter[T]) NextCtx(ctx context.Context) (T, error) {
+ if len(it.buf) == 0 {
+ var zero T
+ return zero, io.EOF
+ }
+ cur := it.buf[0]
+ it.buf = it.buf[1:]
+ return cur, nil
+}
+
+func (it *sliceIter[T]) Close() {
+ it.buf = nil
+}
+
+// PageSlice converts a slice of pages into a PageIter.
+func PageSlice[T any](s [][]T) PageIter[T] {
+ return &pageSliceIter[T]{pages: s}
+}
+
+type pageSliceIter[T any] struct {
+ pages [][]T
+}
+
+func (it *pageSliceIter[T]) NextPage(ctx context.Context) ([]T, error) {
+ if len(it.pages) == 0 {
+ return nil, io.EOF
+ }
+ page := it.pages[0]
+ it.pages = it.pages[1:]
+ return page, nil
+}
+
+func (it *pageSliceIter[T]) Close() {
+ it.pages = nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/dgryski/go-rendezvous/LICENSE b/.gear/predownloaded-development/vendor/github.com/dgryski/go-rendezvous/LICENSE
new file mode 100644
index 0000000..22080f7
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dgryski/go-rendezvous/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017-2020 Damian Gryski
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/.gear/predownloaded-development/vendor/github.com/dgryski/go-rendezvous/rdv.go b/.gear/predownloaded-development/vendor/github.com/dgryski/go-rendezvous/rdv.go
new file mode 100644
index 0000000..7a6f820
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/dgryski/go-rendezvous/rdv.go
@@ -0,0 +1,79 @@
+package rendezvous
+
+type Rendezvous struct {
+ nodes map[string]int
+ nstr []string
+ nhash []uint64
+ hash Hasher
+}
+
+type Hasher func(s string) uint64
+
+func New(nodes []string, hash Hasher) *Rendezvous {
+ r := &Rendezvous{
+ nodes: make(map[string]int, len(nodes)),
+ nstr: make([]string, len(nodes)),
+ nhash: make([]uint64, len(nodes)),
+ hash: hash,
+ }
+
+ for i, n := range nodes {
+ r.nodes[n] = i
+ r.nstr[i] = n
+ r.nhash[i] = hash(n)
+ }
+
+ return r
+}
+
+func (r *Rendezvous) Lookup(k string) string {
+ // short-circuit if we're empty
+ if len(r.nodes) == 0 {
+ return ""
+ }
+
+ khash := r.hash(k)
+
+ var midx int
+ var mhash = xorshiftMult64(khash ^ r.nhash[0])
+
+ for i, nhash := range r.nhash[1:] {
+ if h := xorshiftMult64(khash ^ nhash); h > mhash {
+ midx = i + 1
+ mhash = h
+ }
+ }
+
+ return r.nstr[midx]
+}
+
+func (r *Rendezvous) Add(node string) {
+ r.nodes[node] = len(r.nstr)
+ r.nstr = append(r.nstr, node)
+ r.nhash = append(r.nhash, r.hash(node))
+}
+
+func (r *Rendezvous) Remove(node string) {
+ // find index of node to remove
+ nidx := r.nodes[node]
+
+ // remove from the slices
+ l := len(r.nstr)
+ r.nstr[nidx] = r.nstr[l]
+ r.nstr = r.nstr[:l]
+
+ r.nhash[nidx] = r.nhash[l]
+ r.nhash = r.nhash[:l]
+
+ // update the map
+ delete(r.nodes, node)
+ moved := r.nstr[nidx]
+ r.nodes[moved] = nidx
+}
+
+func xorshiftMult64(x uint64) uint64 {
+ x ^= x >> 12 // a
+ x ^= x << 25 // b
+ x ^= x >> 27 // c
+ return x * 2685821657736338717
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/LICENSE b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/LICENSE
new file mode 100644
index 0000000..cc8be3a
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 David Colburn
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/README.md b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/README.md
new file mode 100644
index 0000000..0eebac0
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/README.md
@@ -0,0 +1,117 @@
+# Core
+
+Things I wish were built in.
+
+## Fuse
+
+A thread-safe one-way switch, used for permanent state changes. The zero value is valid simlar to standard synchronization primitives.
+
+```go
+type Server struct {
+ msgs chan *Message
+ shutdown core.Fuse
+}
+
+func NewServer() *Server {
+ return &Server{}
+}
+
+func (s *Server) Run() {
+ for {
+ select {
+ case msg := <-s.msgs:
+ s.Process(msg)
+ case <-s.shutdown.Watch():
+ return
+ }
+ }
+}
+
+func (s *Server) DoSomething() {
+ if s.shutdown.IsBroken() {
+ return errors.New("server closed")
+ }
+ ...
+}
+
+func (s *Server) Shutdown() {
+ s.shutdown.Break()
+}
+```
+
+## Throttle
+
+Golang function throttler.
+Similar to debounce, but the first call will execute immediately.
+Subsequent calls will always have a minimum duration between executions.
+
+```go
+func main() {
+ throttle := core.NewThrottle(time.Millisecond * 250)
+
+ for i := 0; i < 10; i++ {
+ if i == 0 {
+ throttle(func() { fmt.Println("hello") })
+ } else {
+ throttle(func() { fmt.Println("world") })
+ }
+ time.Sleep(time.Millisecond * 10)
+ }
+}
+```
+
+Output:
+
+```
+hello (immediately)
+world (after 250 ms)
+```
+
+## QueueWorker
+
+Execute functions in order of submission.
+
+```go
+func main() {
+ w := core.NewQueueWorker(QueueWorkerParams{QueueSize: 10})
+ w.Submit(func() {
+ time.Sleep(time.Second)
+ fmt.Printf("hello ")
+ })
+ w.Submit(func() {
+ fmt.Println("world!")
+ })
+}
+```
+
+Output:
+
+```
+hello world!
+```
+
+## QueuePool
+
+A pool for QueueWorker management, organized by keys. Different worker keys will run in parallel.
+
+```go
+func main() {
+ p := core.NewQueuePool(QueueWorkerParams{QueueSize: 10})
+ p.Submit("worker1", func() {
+ time.Sleep(time.Second)
+ fmt.Printf(" world")
+ })
+ p.Submit("worker2", func() {
+ fmt.Printf("hello")
+ })
+ p.Submit("worker1", func() {
+ fmt.Println("!")
+ })
+}
+```
+
+Output:
+
+```
+hello world!
+```
diff --git a/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/fuse.go b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/fuse.go
new file mode 100644
index 0000000..dd2dcff
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/fuse.go
@@ -0,0 +1,88 @@
+package core
+
+import (
+ "sync"
+ "sync/atomic"
+)
+
+const (
+ fuseNotInitialized = iota
+ fuseReady
+ fuseBroken
+)
+
+// Fuse is a thread-safe one-way switch, used for permanent state changes.
+// Implementation partially borrowed from sync.Once
+type Fuse struct {
+ state uint32
+ m sync.Mutex
+ c chan struct{}
+}
+
+// IsBroken returns true if the fuse has been broken
+func (f *Fuse) IsBroken() bool {
+ switch atomic.LoadUint32(&f.state) {
+ case fuseNotInitialized:
+ return false
+ case fuseBroken:
+ return true
+ default:
+ select {
+ case <-f.c:
+ atomic.StoreUint32(&f.state, fuseBroken)
+ return true
+ default:
+ return false
+ }
+ }
+}
+
+func (f *Fuse) init() {
+ if atomic.LoadUint32(&f.state) != fuseNotInitialized {
+ return
+ }
+ f.m.Lock()
+ defer f.m.Unlock()
+ if atomic.LoadUint32(&f.state) != fuseNotInitialized {
+ return
+ }
+ f.c = make(chan struct{})
+ atomic.StoreUint32(&f.state, fuseReady)
+}
+
+// Watch returns a channel which will close once the fuse is broken
+func (f *Fuse) Watch() <-chan struct{} {
+ f.init()
+ return f.c
+}
+
+// Break breaks the fuse. It returns true if it was broken by this call.
+func (f *Fuse) Break() bool {
+ broken := false
+ f.Once(func() {
+ broken = true
+ })
+ return broken
+}
+
+// Once runs the callback and breaks the fuse
+func (f *Fuse) Once(do func()) {
+ if atomic.LoadUint32(&f.state) == fuseBroken {
+ return
+ }
+ f.m.Lock()
+ defer f.m.Unlock()
+ switch atomic.LoadUint32(&f.state) {
+ case fuseBroken:
+ return
+ case fuseNotInitialized:
+ f.c = make(chan struct{})
+ fallthrough
+ default:
+ defer atomic.StoreUint32(&f.state, fuseBroken)
+ if do != nil {
+ do()
+ }
+ close(f.c)
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/pool.go b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/pool.go
new file mode 100644
index 0000000..17f2862
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/pool.go
@@ -0,0 +1,212 @@
+package core
+
+import (
+ "hash/fnv"
+ "sync"
+
+ "github.com/gammazero/deque"
+)
+
+const (
+ DefaultQueueSize = 100
+ DefaultCapacity = 10
+)
+
+type QueuePool interface {
+ Submit(key string, job func()) bool
+ Drain()
+ Kill()
+}
+
+type QueueWorker interface {
+ Submit(job func()) bool
+ Drain()
+ Kill()
+}
+
+type QueueWorkerParams struct {
+ QueueSize int
+ DropWhenFull bool
+}
+
+type queuePool struct {
+ sync.Mutex
+
+ capacity int
+ workers []QueueWorker
+ params QueueWorkerParams
+ drain Fuse
+ kill Fuse
+}
+
+func NewQueuePool(maxWorkers int, params QueueWorkerParams) QueuePool {
+ if maxWorkers <= 0 {
+ maxWorkers = DefaultCapacity
+ }
+ if params.QueueSize == 0 {
+ params.QueueSize = DefaultQueueSize
+ }
+
+ return &queuePool{
+ capacity: maxWorkers,
+ workers: make([]QueueWorker, maxWorkers),
+ params: params,
+ }
+}
+
+func (p *queuePool) hash(key string) int {
+ h := fnv.New32a()
+ _, _ = h.Write([]byte(key))
+ return int(h.Sum32()) % p.capacity
+}
+
+func (p *queuePool) Submit(key string, job func()) bool {
+ p.Lock()
+ if p.kill.IsBroken() {
+ p.Unlock()
+ return false
+ }
+
+ idx := p.hash(key)
+ w := p.workers[idx]
+ if w == nil {
+ w = NewQueueWorker(p.params)
+ p.workers[idx] = w
+ }
+ p.Unlock()
+
+ return w.Submit(job)
+}
+
+func (p *queuePool) Drain() {
+ p.drain.Once(func() {
+ p.Lock()
+
+ var wg sync.WaitGroup
+ for _, w := range p.workers {
+ if w != nil {
+ wg.Add(1)
+ w := w
+ go func() {
+ w.Drain()
+ wg.Done()
+ }()
+ }
+ }
+ wg.Wait()
+
+ p.Unlock()
+ })
+}
+
+func (p *queuePool) Kill() {
+ p.kill.Once(func() {
+ p.Lock()
+ for _, w := range p.workers {
+ if w != nil {
+ w.Kill()
+ }
+ }
+ p.Unlock()
+ })
+}
+
+type worker struct {
+ sync.Mutex
+ QueueWorkerParams
+
+ active bool
+ next chan func()
+ deque deque.Deque[func()]
+ draining Fuse
+ done Fuse
+ kill Fuse
+}
+
+func NewQueueWorker(params QueueWorkerParams) QueueWorker {
+ if params.QueueSize == 0 {
+ params.QueueSize = DefaultQueueSize
+ }
+
+ w := &worker{
+ QueueWorkerParams: params,
+ next: make(chan func(), 1),
+ }
+ w.deque.SetBaseCap(params.QueueSize)
+ go w.run()
+ return w
+}
+
+func (w *worker) run() {
+ kill := w.kill.Watch()
+ draining := w.draining.Watch()
+ for {
+ select {
+ case <-kill:
+ return
+ case <-draining:
+ w.drain()
+ return
+ case job := <-w.next:
+ if job != nil {
+ job()
+ }
+
+ w.Lock()
+ if w.deque.Len() > 0 {
+ w.next <- w.deque.PopFront()
+ } else {
+ w.active = false
+ }
+ w.Unlock()
+ }
+ }
+}
+
+func (w *worker) Submit(job func()) bool {
+ submitted := true
+ w.Lock()
+ if w.active {
+ if w.DropWhenFull && w.deque.Len() == w.QueueSize {
+ submitted = false
+ } else {
+ w.deque.PushBack(job)
+ }
+ } else {
+ w.active = true
+ w.next <- job
+ }
+ w.Unlock()
+ return submitted
+}
+
+func (w *worker) Drain() {
+ w.draining.Break()
+ select {
+ case <-w.done.Watch():
+ case <-w.kill.Watch():
+ }
+}
+
+func (w *worker) drain() {
+ w.Lock()
+
+ select {
+ case job := <-w.next:
+ if job != nil {
+ job()
+ }
+ default:
+ }
+ count := w.deque.Len()
+ for i := 0; i < count; i++ {
+ w.deque.PopFront()()
+ }
+
+ w.done.Break()
+ w.Unlock()
+}
+
+func (w *worker) Kill() {
+ w.kill.Break()
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/throttle.go b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/throttle.go
new file mode 100644
index 0000000..8433f77
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/frostbyte73/core/throttle.go
@@ -0,0 +1,63 @@
+package core
+
+import (
+ "sync"
+ "time"
+)
+
+// Throttle is a function throttler that takes a function as its argument.
+// If ready, it will execute immediately, and it will always wait the specified duration
+// between executions. If multiple functions are added within the same execution window,
+// only the last function added will be executed.
+type Throttle func(f func())
+
+func NewThrottle(period time.Duration) Throttle {
+ t := &throttle{
+ period: period,
+ ready: true,
+ }
+
+ return func(f func()) {
+ t.add(f)
+ }
+}
+
+type throttle struct {
+ m sync.Mutex
+ period time.Duration
+ ready bool
+ timer *time.Timer
+ next func()
+}
+
+func (t *throttle) add(f func()) {
+ t.m.Lock()
+ ready := t.ready
+ if ready {
+ t.ready = false
+ t.timer = time.AfterFunc(t.period, t.execute)
+ } else {
+ t.next = f
+ }
+ t.m.Unlock()
+
+ if ready {
+ f()
+ }
+}
+
+func (t *throttle) execute() {
+ t.m.Lock()
+ f := t.next
+ if f != nil {
+ t.next = nil
+ t.timer = time.AfterFunc(t.period, t.execute)
+ } else {
+ t.ready = true
+ }
+ t.m.Unlock()
+
+ if f != nil {
+ f()
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/.cirrus.yml b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/.cirrus.yml
new file mode 100644
index 0000000..f4e7dbf
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/.cirrus.yml
@@ -0,0 +1,14 @@
+freebsd_task:
+ name: 'FreeBSD'
+ freebsd_instance:
+ image_family: freebsd-14-1
+ install_script:
+ - pkg update -f
+ - pkg install -y go
+ test_script:
+ # run tests as user "cirrus" instead of root
+ - pw useradd cirrus -m
+ - chown -R cirrus:cirrus .
+ - FSNOTIFY_BUFFER=4096 sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./...
+ - sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./...
+ - FSNOTIFY_DEBUG=1 sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race -v ./...
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/.gitignore b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/.gitignore
new file mode 100644
index 0000000..daea9dd
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/.gitignore
@@ -0,0 +1,10 @@
+# go test -c output
+*.test
+*.test.exe
+
+# Output of go build ./cmd/fsnotify
+/fsnotify
+/fsnotify.exe
+
+/test/kqueue
+/test/a.out
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/.mailmap b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/.mailmap
new file mode 100644
index 0000000..a04f290
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/.mailmap
@@ -0,0 +1,2 @@
+Chris Howey
+Nathan Youngman <4566+nathany@users.noreply.github.com>
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
new file mode 100644
index 0000000..fa85478
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
@@ -0,0 +1,569 @@
+# Changelog
+
+1.8.0 2023-10-31
+----------------
+
+### Additions
+
+- all: add `FSNOTIFY_DEBUG` to print debug logs to stderr ([#619])
+
+### Changes and fixes
+
+- windows: fix behaviour of `WatchList()` to be consistent with other platforms ([#610])
+
+- kqueue: ignore events with Ident=0 ([#590])
+
+- kqueue: set O_CLOEXEC to prevent passing file descriptors to children ([#617])
+
+- kqueue: emit events as "/path/dir/file" instead of "path/link/file" when watching a symlink ([#625])
+
+- inotify: don't send event for IN_DELETE_SELF when also watching the parent ([#620])
+
+- inotify: fix panic when calling Remove() in a goroutine ([#650])
+
+- fen: allow watching subdirectories of watched directories ([#621])
+
+[#590]: https://github.com/fsnotify/fsnotify/pull/590
+[#610]: https://github.com/fsnotify/fsnotify/pull/610
+[#617]: https://github.com/fsnotify/fsnotify/pull/617
+[#619]: https://github.com/fsnotify/fsnotify/pull/619
+[#620]: https://github.com/fsnotify/fsnotify/pull/620
+[#621]: https://github.com/fsnotify/fsnotify/pull/621
+[#625]: https://github.com/fsnotify/fsnotify/pull/625
+[#650]: https://github.com/fsnotify/fsnotify/pull/650
+
+1.7.0 - 2023-10-22
+------------------
+This version of fsnotify needs Go 1.17.
+
+### Additions
+
+- illumos: add FEN backend to support illumos and Solaris. ([#371])
+
+- all: add `NewBufferedWatcher()` to use a buffered channel, which can be useful
+ in cases where you can't control the kernel buffer and receive a large number
+ of events in bursts. ([#550], [#572])
+
+- all: add `AddWith()`, which is identical to `Add()` but allows passing
+ options. ([#521])
+
+- windows: allow setting the ReadDirectoryChangesW() buffer size with
+ `fsnotify.WithBufferSize()`; the default of 64K is the highest value that
+ works on all platforms and is enough for most purposes, but in some cases a
+ highest buffer is needed. ([#521])
+
+### Changes and fixes
+
+- inotify: remove watcher if a watched path is renamed ([#518])
+
+ After a rename the reported name wasn't updated, or even an empty string.
+ Inotify doesn't provide any good facilities to update it, so just remove the
+ watcher. This is already how it worked on kqueue and FEN.
+
+ On Windows this does work, and remains working.
+
+- windows: don't listen for file attribute changes ([#520])
+
+ File attribute changes are sent as `FILE_ACTION_MODIFIED` by the Windows API,
+ with no way to see if they're a file write or attribute change, so would show
+ up as a fsnotify.Write event. This is never useful, and could result in many
+ spurious Write events.
+
+- windows: return `ErrEventOverflow` if the buffer is full ([#525])
+
+ Before it would merely return "short read", making it hard to detect this
+ error.
+
+- kqueue: make sure events for all files are delivered properly when removing a
+ watched directory ([#526])
+
+ Previously they would get sent with `""` (empty string) or `"."` as the path
+ name.
+
+- kqueue: don't emit spurious Create events for symbolic links ([#524])
+
+ The link would get resolved but kqueue would "forget" it already saw the link
+ itself, resulting on a Create for every Write event for the directory.
+
+- all: return `ErrClosed` on `Add()` when the watcher is closed ([#516])
+
+- other: add `Watcher.Errors` and `Watcher.Events` to the no-op `Watcher` in
+ `backend_other.go`, making it easier to use on unsupported platforms such as
+ WASM, AIX, etc. ([#528])
+
+- other: use the `backend_other.go` no-op if the `appengine` build tag is set;
+ Google AppEngine forbids usage of the unsafe package so the inotify backend
+ won't compile there.
+
+[#371]: https://github.com/fsnotify/fsnotify/pull/371
+[#516]: https://github.com/fsnotify/fsnotify/pull/516
+[#518]: https://github.com/fsnotify/fsnotify/pull/518
+[#520]: https://github.com/fsnotify/fsnotify/pull/520
+[#521]: https://github.com/fsnotify/fsnotify/pull/521
+[#524]: https://github.com/fsnotify/fsnotify/pull/524
+[#525]: https://github.com/fsnotify/fsnotify/pull/525
+[#526]: https://github.com/fsnotify/fsnotify/pull/526
+[#528]: https://github.com/fsnotify/fsnotify/pull/528
+[#537]: https://github.com/fsnotify/fsnotify/pull/537
+[#550]: https://github.com/fsnotify/fsnotify/pull/550
+[#572]: https://github.com/fsnotify/fsnotify/pull/572
+
+1.6.0 - 2022-10-13
+------------------
+This version of fsnotify needs Go 1.16 (this was already the case since 1.5.1,
+but not documented). It also increases the minimum Linux version to 2.6.32.
+
+### Additions
+
+- all: add `Event.Has()` and `Op.Has()` ([#477])
+
+ This makes checking events a lot easier; for example:
+
+ if event.Op&Write == Write && !(event.Op&Remove == Remove) {
+ }
+
+ Becomes:
+
+ if event.Has(Write) && !event.Has(Remove) {
+ }
+
+- all: add cmd/fsnotify ([#463])
+
+ A command-line utility for testing and some examples.
+
+### Changes and fixes
+
+- inotify: don't ignore events for files that don't exist ([#260], [#470])
+
+ Previously the inotify watcher would call `os.Lstat()` to check if a file
+ still exists before emitting events.
+
+ This was inconsistent with other platforms and resulted in inconsistent event
+ reporting (e.g. when a file is quickly removed and re-created), and generally
+ a source of confusion. It was added in 2013 to fix a memory leak that no
+ longer exists.
+
+- all: return `ErrNonExistentWatch` when `Remove()` is called on a path that's
+ not watched ([#460])
+
+- inotify: replace epoll() with non-blocking inotify ([#434])
+
+ Non-blocking inotify was not generally available at the time this library was
+ written in 2014, but now it is. As a result, the minimum Linux version is
+ bumped from 2.6.27 to 2.6.32. This hugely simplifies the code and is faster.
+
+- kqueue: don't check for events every 100ms ([#480])
+
+ The watcher would wake up every 100ms, even when there was nothing to do. Now
+ it waits until there is something to do.
+
+- macos: retry opening files on EINTR ([#475])
+
+- kqueue: skip unreadable files ([#479])
+
+ kqueue requires a file descriptor for every file in a directory; this would
+ fail if a file was unreadable by the current user. Now these files are simply
+ skipped.
+
+- windows: fix renaming a watched directory if the parent is also watched ([#370])
+
+- windows: increase buffer size from 4K to 64K ([#485])
+
+- windows: close file handle on Remove() ([#288])
+
+- kqueue: put pathname in the error if watching a file fails ([#471])
+
+- inotify, windows: calling Close() more than once could race ([#465])
+
+- kqueue: improve Close() performance ([#233])
+
+- all: various documentation additions and clarifications.
+
+[#233]: https://github.com/fsnotify/fsnotify/pull/233
+[#260]: https://github.com/fsnotify/fsnotify/pull/260
+[#288]: https://github.com/fsnotify/fsnotify/pull/288
+[#370]: https://github.com/fsnotify/fsnotify/pull/370
+[#434]: https://github.com/fsnotify/fsnotify/pull/434
+[#460]: https://github.com/fsnotify/fsnotify/pull/460
+[#463]: https://github.com/fsnotify/fsnotify/pull/463
+[#465]: https://github.com/fsnotify/fsnotify/pull/465
+[#470]: https://github.com/fsnotify/fsnotify/pull/470
+[#471]: https://github.com/fsnotify/fsnotify/pull/471
+[#475]: https://github.com/fsnotify/fsnotify/pull/475
+[#477]: https://github.com/fsnotify/fsnotify/pull/477
+[#479]: https://github.com/fsnotify/fsnotify/pull/479
+[#480]: https://github.com/fsnotify/fsnotify/pull/480
+[#485]: https://github.com/fsnotify/fsnotify/pull/485
+
+## [1.5.4] - 2022-04-25
+
+* Windows: add missing defer to `Watcher.WatchList` [#447](https://github.com/fsnotify/fsnotify/pull/447)
+* go.mod: use latest x/sys [#444](https://github.com/fsnotify/fsnotify/pull/444)
+* Fix compilation for OpenBSD [#443](https://github.com/fsnotify/fsnotify/pull/443)
+
+## [1.5.3] - 2022-04-22
+
+* This version is retracted. An incorrect branch is published accidentally [#445](https://github.com/fsnotify/fsnotify/issues/445)
+
+## [1.5.2] - 2022-04-21
+
+* Add a feature to return the directories and files that are being monitored [#374](https://github.com/fsnotify/fsnotify/pull/374)
+* Fix potential crash on windows if `raw.FileNameLength` exceeds `syscall.MAX_PATH` [#361](https://github.com/fsnotify/fsnotify/pull/361)
+* Allow build on unsupported GOOS [#424](https://github.com/fsnotify/fsnotify/pull/424)
+* Don't set `poller.fd` twice in `newFdPoller` [#406](https://github.com/fsnotify/fsnotify/pull/406)
+* fix go vet warnings: call to `(*T).Fatalf` from a non-test goroutine [#416](https://github.com/fsnotify/fsnotify/pull/416)
+
+## [1.5.1] - 2021-08-24
+
+* Revert Add AddRaw to not follow symlinks [#394](https://github.com/fsnotify/fsnotify/pull/394)
+
+## [1.5.0] - 2021-08-20
+
+* Go: Increase minimum required version to Go 1.12 [#381](https://github.com/fsnotify/fsnotify/pull/381)
+* Feature: Add AddRaw method which does not follow symlinks when adding a watch [#289](https://github.com/fsnotify/fsnotify/pull/298)
+* Windows: Follow symlinks by default like on all other systems [#289](https://github.com/fsnotify/fsnotify/pull/289)
+* CI: Use GitHub Actions for CI and cover go 1.12-1.17
+ [#378](https://github.com/fsnotify/fsnotify/pull/378)
+ [#381](https://github.com/fsnotify/fsnotify/pull/381)
+ [#385](https://github.com/fsnotify/fsnotify/pull/385)
+* Go 1.14+: Fix unsafe pointer conversion [#325](https://github.com/fsnotify/fsnotify/pull/325)
+
+## [1.4.9] - 2020-03-11
+
+* Move example usage to the readme #329. This may resolve #328.
+
+## [1.4.8] - 2020-03-10
+
+* CI: test more go versions (@nathany 1d13583d846ea9d66dcabbfefbfb9d8e6fb05216)
+* Tests: Queued inotify events could have been read by the test before max_queued_events was hit (@matthias-stone #265)
+* Tests: t.Fatalf -> t.Errorf in go routines (@gdey #266)
+* CI: Less verbosity (@nathany #267)
+* Tests: Darwin: Exchangedata is deprecated on 10.13 (@nathany #267)
+* Tests: Check if channels are closed in the example (@alexeykazakov #244)
+* CI: Only run golint on latest version of go and fix issues (@cpuguy83 #284)
+* CI: Add windows to travis matrix (@cpuguy83 #284)
+* Docs: Remover appveyor badge (@nathany 11844c0959f6fff69ba325d097fce35bd85a8e93)
+* Linux: create epoll and pipe fds with close-on-exec (@JohannesEbke #219)
+* Linux: open files with close-on-exec (@linxiulei #273)
+* Docs: Plan to support fanotify (@nathany ab058b44498e8b7566a799372a39d150d9ea0119 )
+* Project: Add go.mod (@nathany #309)
+* Project: Revise editor config (@nathany #309)
+* Project: Update copyright for 2019 (@nathany #309)
+* CI: Drop go1.8 from CI matrix (@nathany #309)
+* Docs: Updating the FAQ section for supportability with NFS & FUSE filesystems (@Pratik32 4bf2d1fec78374803a39307bfb8d340688f4f28e )
+
+## [1.4.7] - 2018-01-09
+
+* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine)
+* Tests: Fix missing verb on format string (thanks @rchiossi)
+* Linux: Fix deadlock in Remove (thanks @aarondl)
+* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne)
+* Docs: Moved FAQ into the README (thanks @vahe)
+* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich)
+* Docs: replace references to OS X with macOS
+
+## [1.4.2] - 2016-10-10
+
+* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack)
+
+## [1.4.1] - 2016-10-04
+
+* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack)
+
+## [1.4.0] - 2016-10-01
+
+* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie)
+
+## [1.3.1] - 2016-06-28
+
+* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc)
+
+## [1.3.0] - 2016-04-19
+
+* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135)
+
+## [1.2.10] - 2016-03-02
+
+* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj)
+
+## [1.2.9] - 2016-01-13
+
+kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep)
+
+## [1.2.8] - 2015-12-17
+
+* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test)
+* inotify: fix race in test
+* enable race detection for continuous integration (Linux, Mac, Windows)
+
+## [1.2.5] - 2015-10-17
+
+* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki)
+* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken)
+* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie)
+* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion)
+
+## [1.2.1] - 2015-10-14
+
+* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx)
+
+## [1.2.0] - 2015-02-08
+
+* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD)
+* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD)
+* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59)
+
+## [1.1.1] - 2015-02-05
+
+* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD)
+
+## [1.1.0] - 2014-12-12
+
+* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43)
+ * add low-level functions
+ * only need to store flags on directories
+ * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13)
+ * done can be an unbuffered channel
+ * remove calls to os.NewSyscallError
+* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher)
+* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48)
+* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
+
+## [1.0.4] - 2014-09-07
+
+* kqueue: add dragonfly to the build tags.
+* Rename source code files, rearrange code so exported APIs are at the top.
+* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang)
+
+## [1.0.3] - 2014-08-19
+
+* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36)
+
+## [1.0.2] - 2014-08-17
+
+* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
+* [Fix] Make ./path and path equivalent. (thanks @zhsso)
+
+## [1.0.0] - 2014-08-15
+
+* [API] Remove AddWatch on Windows, use Add.
+* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30)
+* Minor updates based on feedback from golint.
+
+## dev / 2014-07-09
+
+* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify).
+* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno)
+
+## dev / 2014-07-04
+
+* kqueue: fix incorrect mutex used in Close()
+* Update example to demonstrate usage of Op.
+
+## dev / 2014-06-28
+
+* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4)
+* Fix for String() method on Event (thanks Alex Brainman)
+* Don't build on Plan 9 or Solaris (thanks @4ad)
+
+## dev / 2014-06-21
+
+* Events channel of type Event rather than *Event.
+* [internal] use syscall constants directly for inotify and kqueue.
+* [internal] kqueue: rename events to kevents and fileEvent to event.
+
+## dev / 2014-06-19
+
+* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally).
+* [internal] remove cookie from Event struct (unused).
+* [internal] Event struct has the same definition across every OS.
+* [internal] remove internal watch and removeWatch methods.
+
+## dev / 2014-06-12
+
+* [API] Renamed Watch() to Add() and RemoveWatch() to Remove().
+* [API] Pluralized channel names: Events and Errors.
+* [API] Renamed FileEvent struct to Event.
+* [API] Op constants replace methods like IsCreate().
+
+## dev / 2014-06-12
+
+* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
+
+## dev / 2014-05-23
+
+* [API] Remove current implementation of WatchFlags.
+ * current implementation doesn't take advantage of OS for efficiency
+ * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes
+ * no tests for the current implementation
+ * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195)
+
+## [0.9.3] - 2014-12-31
+
+* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
+
+## [0.9.2] - 2014-08-17
+
+* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
+
+## [0.9.1] - 2014-06-12
+
+* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
+
+## [0.9.0] - 2014-01-17
+
+* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany)
+* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare)
+* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library.
+
+## [0.8.12] - 2013-11-13
+
+* [API] Remove FD_SET and friends from Linux adapter
+
+## [0.8.11] - 2013-11-02
+
+* [Doc] Add Changelog [#72][] (thanks @nathany)
+* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond)
+
+## [0.8.10] - 2013-10-19
+
+* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott)
+* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer)
+* [Doc] specify OS-specific limits in README (thanks @debrando)
+
+## [0.8.9] - 2013-09-08
+
+* [Doc] Contributing (thanks @nathany)
+* [Doc] update package path in example code [#63][] (thanks @paulhammond)
+* [Doc] GoCI badge in README (Linux only) [#60][]
+* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany)
+
+## [0.8.8] - 2013-06-17
+
+* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie)
+
+## [0.8.7] - 2013-06-03
+
+* [API] Make syscall flags internal
+* [Fix] inotify: ignore event changes
+* [Fix] race in symlink test [#45][] (reported by @srid)
+* [Fix] tests on Windows
+* lower case error messages
+
+## [0.8.6] - 2013-05-23
+
+* kqueue: Use EVT_ONLY flag on Darwin
+* [Doc] Update README with full example
+
+## [0.8.5] - 2013-05-09
+
+* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg)
+
+## [0.8.4] - 2013-04-07
+
+* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz)
+
+## [0.8.3] - 2013-03-13
+
+* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin)
+* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin)
+
+## [0.8.2] - 2013-02-07
+
+* [Doc] add Authors
+* [Fix] fix data races for map access [#29][] (thanks @fsouza)
+
+## [0.8.1] - 2013-01-09
+
+* [Fix] Windows path separators
+* [Doc] BSD License
+
+## [0.8.0] - 2012-11-09
+
+* kqueue: directory watching improvements (thanks @vmirage)
+* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto)
+* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr)
+
+## [0.7.4] - 2012-10-09
+
+* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji)
+* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig)
+* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig)
+* [Fix] kqueue: modify after recreation of file
+
+## [0.7.3] - 2012-09-27
+
+* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage)
+* [Fix] kqueue: no longer get duplicate CREATE events
+
+## [0.7.2] - 2012-09-01
+
+* kqueue: events for created directories
+
+## [0.7.1] - 2012-07-14
+
+* [Fix] for renaming files
+
+## [0.7.0] - 2012-07-02
+
+* [Feature] FSNotify flags
+* [Fix] inotify: Added file name back to event path
+
+## [0.6.0] - 2012-06-06
+
+* kqueue: watch files after directory created (thanks @tmc)
+
+## [0.5.1] - 2012-05-22
+
+* [Fix] inotify: remove all watches before Close()
+
+## [0.5.0] - 2012-05-03
+
+* [API] kqueue: return errors during watch instead of sending over channel
+* kqueue: match symlink behavior on Linux
+* inotify: add `DELETE_SELF` (requested by @taralx)
+* [Fix] kqueue: handle EINTR (reported by @robfig)
+* [Doc] Godoc example [#1][] (thanks @davecheney)
+
+## [0.4.0] - 2012-03-30
+
+* Go 1 released: build with go tool
+* [Feature] Windows support using winfsnotify
+* Windows does not have attribute change notifications
+* Roll attribute notifications into IsModify
+
+## [0.3.0] - 2012-02-19
+
+* kqueue: add files when watch directory
+
+## [0.2.0] - 2011-12-30
+
+* update to latest Go weekly code
+
+## [0.1.0] - 2011-10-19
+
+* kqueue: add watch on file creation to match inotify
+* kqueue: create file event
+* inotify: ignore `IN_IGNORED` events
+* event String()
+* linux: common FileEvent functions
+* initial commit
+
+[#79]: https://github.com/howeyc/fsnotify/pull/79
+[#77]: https://github.com/howeyc/fsnotify/pull/77
+[#72]: https://github.com/howeyc/fsnotify/issues/72
+[#71]: https://github.com/howeyc/fsnotify/issues/71
+[#70]: https://github.com/howeyc/fsnotify/issues/70
+[#63]: https://github.com/howeyc/fsnotify/issues/63
+[#62]: https://github.com/howeyc/fsnotify/issues/62
+[#60]: https://github.com/howeyc/fsnotify/issues/60
+[#59]: https://github.com/howeyc/fsnotify/issues/59
+[#49]: https://github.com/howeyc/fsnotify/issues/49
+[#45]: https://github.com/howeyc/fsnotify/issues/45
+[#40]: https://github.com/howeyc/fsnotify/issues/40
+[#36]: https://github.com/howeyc/fsnotify/issues/36
+[#33]: https://github.com/howeyc/fsnotify/issues/33
+[#29]: https://github.com/howeyc/fsnotify/issues/29
+[#25]: https://github.com/howeyc/fsnotify/issues/25
+[#24]: https://github.com/howeyc/fsnotify/issues/24
+[#21]: https://github.com/howeyc/fsnotify/issues/21
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
new file mode 100644
index 0000000..e4ac2a2
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
@@ -0,0 +1,144 @@
+Thank you for your interest in contributing to fsnotify! We try to review and
+merge PRs in a reasonable timeframe, but please be aware that:
+
+- To avoid "wasted" work, please discuss changes on the issue tracker first. You
+ can just send PRs, but they may end up being rejected for one reason or the
+ other.
+
+- fsnotify is a cross-platform library, and changes must work reasonably well on
+ all supported platforms.
+
+- Changes will need to be compatible; old code should still compile, and the
+ runtime behaviour can't change in ways that are likely to lead to problems for
+ users.
+
+Testing
+-------
+Just `go test ./...` runs all the tests; the CI runs this on all supported
+platforms. Testing different platforms locally can be done with something like
+[goon] or [Vagrant], but this isn't super-easy to set up at the moment.
+
+Use the `-short` flag to make the "stress test" run faster.
+
+Writing new tests
+-----------------
+Scripts in the testdata directory allow creating test cases in a "shell-like"
+syntax. The basic format is:
+
+ script
+
+ Output:
+ desired output
+
+For example:
+
+ # Create a new empty file with some data.
+ watch /
+ echo data >/file
+
+ Output:
+ create /file
+ write /file
+
+Just create a new file to add a new test; select which tests to run with
+`-run TestScript/[path]`.
+
+script
+------
+The script is a "shell-like" script:
+
+ cmd arg arg
+
+Comments are supported with `#`:
+
+ # Comment
+ cmd arg arg # Comment
+
+All operations are done in a temp directory; a path like "/foo" is rewritten to
+"/tmp/TestFoo/foo".
+
+Arguments can be quoted with `"` or `'`; there are no escapes and they're
+functionally identical right now, but this may change in the future, so best to
+assume shell-like rules.
+
+ touch "/file with spaces"
+
+End-of-line escapes with `\` are not supported.
+
+### Supported commands
+
+ watch path [ops] # Watch the path, reporting events for it. Nothing is
+ # watched by default. Optionally a list of ops can be
+ # given, as with AddWith(path, WithOps(...)).
+ unwatch path # Stop watching the path.
+ watchlist n # Assert watchlist length.
+
+ stop # Stop running the script; for debugging.
+ debug [yes/no] # Enable/disable FSNOTIFY_DEBUG (tests are run in
+ parallel by default, so -parallel=1 is probably a good
+ idea).
+
+ touch path
+ mkdir [-p] dir
+ ln -s target link # Only ln -s supported.
+ mkfifo path
+ mknod dev path
+ mv src dst
+ rm [-r] path
+ chmod mode path # Octal only
+ sleep time-in-ms
+
+ cat path # Read path (does nothing with the data; just reads it).
+ echo str >>path # Append "str" to "path".
+ echo str >path # Truncate "path" and write "str".
+
+ require reason # Skip the test if "reason" is true; "skip" and
+ skip reason # "require" behave identical; it supports both for
+ # readability. Possible reasons are:
+ #
+ # always Always skip this test.
+ # symlink Symlinks are supported (requires admin
+ # permissions on Windows).
+ # mkfifo Platform doesn't support FIFO named sockets.
+ # mknod Platform doesn't support device nodes.
+
+
+output
+------
+After `Output:` the desired output is given; this is indented by convention, but
+that's not required.
+
+The format of that is:
+
+ # Comment
+ event path # Comment
+
+ system:
+ event path
+ system2:
+ event path
+
+Every event is one line, and any whitespace between the event and path are
+ignored. The path can optionally be surrounded in ". Anything after a "#" is
+ignored.
+
+Platform-specific tests can be added after GOOS; for example:
+
+ watch /
+ touch /file
+
+ Output:
+ # Tested if nothing else matches
+ create /file
+
+ # Windows-specific test.
+ windows:
+ write /file
+
+You can specify multiple platforms with a comma (e.g. "windows, linux:").
+"kqueue" is a shortcut for all kqueue systems (BSD, macOS).
+
+
+[goon]: https://github.com/arp242/goon
+[Vagrant]: https://www.vagrantup.com/
+[integration_test.go]: /integration_test.go
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/LICENSE b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/LICENSE
new file mode 100644
index 0000000..fb03ade
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/LICENSE
@@ -0,0 +1,25 @@
+Copyright © 2012 The Go Authors. All rights reserved.
+Copyright © fsnotify Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice, this
+ list of conditions and the following disclaimer in the documentation and/or
+ other materials provided with the distribution.
+* Neither the name of Google Inc. nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/README.md b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/README.md
new file mode 100644
index 0000000..e480733
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/README.md
@@ -0,0 +1,184 @@
+fsnotify is a Go library to provide cross-platform filesystem notifications on
+Windows, Linux, macOS, BSD, and illumos.
+
+Go 1.17 or newer is required; the full documentation is at
+https://pkg.go.dev/github.com/fsnotify/fsnotify
+
+---
+
+Platform support:
+
+| Backend | OS | Status |
+| :-------------------- | :--------- | :------------------------------------------------------------------------ |
+| inotify | Linux | Supported |
+| kqueue | BSD, macOS | Supported |
+| ReadDirectoryChangesW | Windows | Supported |
+| FEN | illumos | Supported |
+| fanotify | Linux 5.9+ | [Not yet](https://github.com/fsnotify/fsnotify/issues/114) |
+| AHAFS | AIX | [aix branch]; experimental due to lack of maintainer and test environment |
+| FSEvents | macOS | [Needs support in x/sys/unix][fsevents] |
+| USN Journals | Windows | [Needs support in x/sys/windows][usn] |
+| Polling | *All* | [Not yet](https://github.com/fsnotify/fsnotify/issues/9) |
+
+Linux and illumos should include Android and Solaris, but these are currently
+untested.
+
+[fsevents]: https://github.com/fsnotify/fsnotify/issues/11#issuecomment-1279133120
+[usn]: https://github.com/fsnotify/fsnotify/issues/53#issuecomment-1279829847
+[aix branch]: https://github.com/fsnotify/fsnotify/issues/353#issuecomment-1284590129
+
+Usage
+-----
+A basic example:
+
+```go
+package main
+
+import (
+ "log"
+
+ "github.com/fsnotify/fsnotify"
+)
+
+func main() {
+ // Create new watcher.
+ watcher, err := fsnotify.NewWatcher()
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer watcher.Close()
+
+ // Start listening for events.
+ go func() {
+ for {
+ select {
+ case event, ok := <-watcher.Events:
+ if !ok {
+ return
+ }
+ log.Println("event:", event)
+ if event.Has(fsnotify.Write) {
+ log.Println("modified file:", event.Name)
+ }
+ case err, ok := <-watcher.Errors:
+ if !ok {
+ return
+ }
+ log.Println("error:", err)
+ }
+ }
+ }()
+
+ // Add a path.
+ err = watcher.Add("/tmp")
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Block main goroutine forever.
+ <-make(chan struct{})
+}
+```
+
+Some more examples can be found in [cmd/fsnotify](cmd/fsnotify), which can be
+run with:
+
+ % go run ./cmd/fsnotify
+
+Further detailed documentation can be found in godoc:
+https://pkg.go.dev/github.com/fsnotify/fsnotify
+
+FAQ
+---
+### Will a file still be watched when it's moved to another directory?
+No, not unless you are watching the location it was moved to.
+
+### Are subdirectories watched?
+No, you must add watches for any directory you want to watch (a recursive
+watcher is on the roadmap: [#18]).
+
+[#18]: https://github.com/fsnotify/fsnotify/issues/18
+
+### Do I have to watch the Error and Event channels in a goroutine?
+Yes. You can read both channels in the same goroutine using `select` (you don't
+need a separate goroutine for both channels; see the example).
+
+### Why don't notifications work with NFS, SMB, FUSE, /proc, or /sys?
+fsnotify requires support from underlying OS to work. The current NFS and SMB
+protocols does not provide network level support for file notifications, and
+neither do the /proc and /sys virtual filesystems.
+
+This could be fixed with a polling watcher ([#9]), but it's not yet implemented.
+
+[#9]: https://github.com/fsnotify/fsnotify/issues/9
+
+### Why do I get many Chmod events?
+Some programs may generate a lot of attribute changes; for example Spotlight on
+macOS, anti-virus programs, backup applications, and some others are known to do
+this. As a rule, it's typically best to ignore Chmod events. They're often not
+useful, and tend to cause problems.
+
+Spotlight indexing on macOS can result in multiple events (see [#15]). A
+temporary workaround is to add your folder(s) to the *Spotlight Privacy
+settings* until we have a native FSEvents implementation (see [#11]).
+
+[#11]: https://github.com/fsnotify/fsnotify/issues/11
+[#15]: https://github.com/fsnotify/fsnotify/issues/15
+
+### Watching a file doesn't work well
+Watching individual files (rather than directories) is generally not recommended
+as many programs (especially editors) update files atomically: it will write to
+a temporary file which is then moved to to destination, overwriting the original
+(or some variant thereof). The watcher on the original file is now lost, as that
+no longer exists.
+
+The upshot of this is that a power failure or crash won't leave a half-written
+file.
+
+Watch the parent directory and use `Event.Name` to filter out files you're not
+interested in. There is an example of this in `cmd/fsnotify/file.go`.
+
+Platform-specific notes
+-----------------------
+### Linux
+When a file is removed a REMOVE event won't be emitted until all file
+descriptors are closed; it will emit a CHMOD instead:
+
+ fp := os.Open("file")
+ os.Remove("file") // CHMOD
+ fp.Close() // REMOVE
+
+This is the event that inotify sends, so not much can be changed about this.
+
+The `fs.inotify.max_user_watches` sysctl variable specifies the upper limit for
+the number of watches per user, and `fs.inotify.max_user_instances` specifies
+the maximum number of inotify instances per user. Every Watcher you create is an
+"instance", and every path you add is a "watch".
+
+These are also exposed in `/proc` as `/proc/sys/fs/inotify/max_user_watches` and
+`/proc/sys/fs/inotify/max_user_instances`
+
+To increase them you can use `sysctl` or write the value to proc file:
+
+ # The default values on Linux 5.18
+ sysctl fs.inotify.max_user_watches=124983
+ sysctl fs.inotify.max_user_instances=128
+
+To make the changes persist on reboot edit `/etc/sysctl.conf` or
+`/usr/lib/sysctl.d/50-default.conf` (details differ per Linux distro; check your
+distro's documentation):
+
+ fs.inotify.max_user_watches=124983
+ fs.inotify.max_user_instances=128
+
+Reaching the limit will result in a "no space left on device" or "too many open
+files" error.
+
+### kqueue (macOS, all BSD systems)
+kqueue requires opening a file descriptor for every file that's being watched;
+so if you're watching a directory with five files then that's six file
+descriptors. You will run in to your system's "max open files" limit faster on
+these platforms.
+
+The sysctl variables `kern.maxfiles` and `kern.maxfilesperproc` can be used to
+control the maximum number of open files.
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_fen.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_fen.go
new file mode 100644
index 0000000..c349c32
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_fen.go
@@ -0,0 +1,484 @@
+//go:build solaris
+
+// FEN backend for illumos (supported) and Solaris (untested, but should work).
+//
+// See port_create(3c) etc. for docs. https://www.illumos.org/man/3C/port_create
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "sync"
+ "time"
+
+ "github.com/fsnotify/fsnotify/internal"
+ "golang.org/x/sys/unix"
+)
+
+type fen struct {
+ Events chan Event
+ Errors chan error
+
+ mu sync.Mutex
+ port *unix.EventPort
+ done chan struct{} // Channel for sending a "quit message" to the reader goroutine
+ dirs map[string]Op // Explicitly watched directories
+ watches map[string]Op // Explicitly watched non-directories
+}
+
+func newBackend(ev chan Event, errs chan error) (backend, error) {
+ return newBufferedBackend(0, ev, errs)
+}
+
+func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
+ w := &fen{
+ Events: ev,
+ Errors: errs,
+ dirs: make(map[string]Op),
+ watches: make(map[string]Op),
+ done: make(chan struct{}),
+ }
+
+ var err error
+ w.port, err = unix.NewEventPort()
+ if err != nil {
+ return nil, fmt.Errorf("fsnotify.NewWatcher: %w", err)
+ }
+
+ go w.readEvents()
+ return w, nil
+}
+
+// sendEvent attempts to send an event to the user, returning true if the event
+// was put in the channel successfully and false if the watcher has been closed.
+func (w *fen) sendEvent(name string, op Op) (sent bool) {
+ select {
+ case <-w.done:
+ return false
+ case w.Events <- Event{Name: name, Op: op}:
+ return true
+ }
+}
+
+// sendError attempts to send an error to the user, returning true if the error
+// was put in the channel successfully and false if the watcher has been closed.
+func (w *fen) sendError(err error) (sent bool) {
+ if err == nil {
+ return true
+ }
+ select {
+ case <-w.done:
+ return false
+ case w.Errors <- err:
+ return true
+ }
+}
+
+func (w *fen) isClosed() bool {
+ select {
+ case <-w.done:
+ return true
+ default:
+ return false
+ }
+}
+
+func (w *fen) Close() error {
+ // Take the lock used by associateFile to prevent lingering events from
+ // being processed after the close
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ if w.isClosed() {
+ return nil
+ }
+ close(w.done)
+ return w.port.Close()
+}
+
+func (w *fen) Add(name string) error { return w.AddWith(name) }
+
+func (w *fen) AddWith(name string, opts ...addOpt) error {
+ if w.isClosed() {
+ return ErrClosed
+ }
+ if debug {
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s AddWith(%q)\n",
+ time.Now().Format("15:04:05.000000000"), name)
+ }
+
+ with := getOptions(opts...)
+ if !w.xSupports(with.op) {
+ return fmt.Errorf("%w: %s", xErrUnsupported, with.op)
+ }
+
+ // Currently we resolve symlinks that were explicitly requested to be
+ // watched. Otherwise we would use LStat here.
+ stat, err := os.Stat(name)
+ if err != nil {
+ return err
+ }
+
+ // Associate all files in the directory.
+ if stat.IsDir() {
+ err := w.handleDirectory(name, stat, true, w.associateFile)
+ if err != nil {
+ return err
+ }
+
+ w.mu.Lock()
+ w.dirs[name] = with.op
+ w.mu.Unlock()
+ return nil
+ }
+
+ err = w.associateFile(name, stat, true)
+ if err != nil {
+ return err
+ }
+
+ w.mu.Lock()
+ w.watches[name] = with.op
+ w.mu.Unlock()
+ return nil
+}
+
+func (w *fen) Remove(name string) error {
+ if w.isClosed() {
+ return nil
+ }
+ if !w.port.PathIsWatched(name) {
+ return fmt.Errorf("%w: %s", ErrNonExistentWatch, name)
+ }
+ if debug {
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s Remove(%q)\n",
+ time.Now().Format("15:04:05.000000000"), name)
+ }
+
+ // The user has expressed an intent. Immediately remove this name from
+ // whichever watch list it might be in. If it's not in there the delete
+ // doesn't cause harm.
+ w.mu.Lock()
+ delete(w.watches, name)
+ delete(w.dirs, name)
+ w.mu.Unlock()
+
+ stat, err := os.Stat(name)
+ if err != nil {
+ return err
+ }
+
+ // Remove associations for every file in the directory.
+ if stat.IsDir() {
+ err := w.handleDirectory(name, stat, false, w.dissociateFile)
+ if err != nil {
+ return err
+ }
+ return nil
+ }
+
+ err = w.port.DissociatePath(name)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// readEvents contains the main loop that runs in a goroutine watching for events.
+func (w *fen) readEvents() {
+ // If this function returns, the watcher has been closed and we can close
+ // these channels
+ defer func() {
+ close(w.Errors)
+ close(w.Events)
+ }()
+
+ pevents := make([]unix.PortEvent, 8)
+ for {
+ count, err := w.port.Get(pevents, 1, nil)
+ if err != nil && err != unix.ETIME {
+ // Interrupted system call (count should be 0) ignore and continue
+ if errors.Is(err, unix.EINTR) && count == 0 {
+ continue
+ }
+ // Get failed because we called w.Close()
+ if errors.Is(err, unix.EBADF) && w.isClosed() {
+ return
+ }
+ // There was an error not caused by calling w.Close()
+ if !w.sendError(err) {
+ return
+ }
+ }
+
+ p := pevents[:count]
+ for _, pevent := range p {
+ if pevent.Source != unix.PORT_SOURCE_FILE {
+ // Event from unexpected source received; should never happen.
+ if !w.sendError(errors.New("Event from unexpected source received")) {
+ return
+ }
+ continue
+ }
+
+ if debug {
+ internal.Debug(pevent.Path, pevent.Events)
+ }
+
+ err = w.handleEvent(&pevent)
+ if !w.sendError(err) {
+ return
+ }
+ }
+ }
+}
+
+func (w *fen) handleDirectory(path string, stat os.FileInfo, follow bool, handler func(string, os.FileInfo, bool) error) error {
+ files, err := os.ReadDir(path)
+ if err != nil {
+ return err
+ }
+
+ // Handle all children of the directory.
+ for _, entry := range files {
+ finfo, err := entry.Info()
+ if err != nil {
+ return err
+ }
+ err = handler(filepath.Join(path, finfo.Name()), finfo, false)
+ if err != nil {
+ return err
+ }
+ }
+
+ // And finally handle the directory itself.
+ return handler(path, stat, follow)
+}
+
+// handleEvent might need to emit more than one fsnotify event if the events
+// bitmap matches more than one event type (e.g. the file was both modified and
+// had the attributes changed between when the association was created and the
+// when event was returned)
+func (w *fen) handleEvent(event *unix.PortEvent) error {
+ var (
+ events = event.Events
+ path = event.Path
+ fmode = event.Cookie.(os.FileMode)
+ reRegister = true
+ )
+
+ w.mu.Lock()
+ _, watchedDir := w.dirs[path]
+ _, watchedPath := w.watches[path]
+ w.mu.Unlock()
+ isWatched := watchedDir || watchedPath
+
+ if events&unix.FILE_DELETE != 0 {
+ if !w.sendEvent(path, Remove) {
+ return nil
+ }
+ reRegister = false
+ }
+ if events&unix.FILE_RENAME_FROM != 0 {
+ if !w.sendEvent(path, Rename) {
+ return nil
+ }
+ // Don't keep watching the new file name
+ reRegister = false
+ }
+ if events&unix.FILE_RENAME_TO != 0 {
+ // We don't report a Rename event for this case, because Rename events
+ // are interpreted as referring to the _old_ name of the file, and in
+ // this case the event would refer to the new name of the file. This
+ // type of rename event is not supported by fsnotify.
+
+ // inotify reports a Remove event in this case, so we simulate this
+ // here.
+ if !w.sendEvent(path, Remove) {
+ return nil
+ }
+ // Don't keep watching the file that was removed
+ reRegister = false
+ }
+
+ // The file is gone, nothing left to do.
+ if !reRegister {
+ if watchedDir {
+ w.mu.Lock()
+ delete(w.dirs, path)
+ w.mu.Unlock()
+ }
+ if watchedPath {
+ w.mu.Lock()
+ delete(w.watches, path)
+ w.mu.Unlock()
+ }
+ return nil
+ }
+
+ // If we didn't get a deletion the file still exists and we're going to have
+ // to watch it again. Let's Stat it now so that we can compare permissions
+ // and have what we need to continue watching the file
+
+ stat, err := os.Lstat(path)
+ if err != nil {
+ // This is unexpected, but we should still emit an event. This happens
+ // most often on "rm -r" of a subdirectory inside a watched directory We
+ // get a modify event of something happening inside, but by the time we
+ // get here, the sudirectory is already gone. Clearly we were watching
+ // this path but now it is gone. Let's tell the user that it was
+ // removed.
+ if !w.sendEvent(path, Remove) {
+ return nil
+ }
+ // Suppress extra write events on removed directories; they are not
+ // informative and can be confusing.
+ return nil
+ }
+
+ // resolve symlinks that were explicitly watched as we would have at Add()
+ // time. this helps suppress spurious Chmod events on watched symlinks
+ if isWatched {
+ stat, err = os.Stat(path)
+ if err != nil {
+ // The symlink still exists, but the target is gone. Report the
+ // Remove similar to above.
+ if !w.sendEvent(path, Remove) {
+ return nil
+ }
+ // Don't return the error
+ }
+ }
+
+ if events&unix.FILE_MODIFIED != 0 {
+ if fmode.IsDir() && watchedDir {
+ if err := w.updateDirectory(path); err != nil {
+ return err
+ }
+ } else {
+ if !w.sendEvent(path, Write) {
+ return nil
+ }
+ }
+ }
+ if events&unix.FILE_ATTRIB != 0 && stat != nil {
+ // Only send Chmod if perms changed
+ if stat.Mode().Perm() != fmode.Perm() {
+ if !w.sendEvent(path, Chmod) {
+ return nil
+ }
+ }
+ }
+
+ if stat != nil {
+ // If we get here, it means we've hit an event above that requires us to
+ // continue watching the file or directory
+ return w.associateFile(path, stat, isWatched)
+ }
+ return nil
+}
+
+func (w *fen) updateDirectory(path string) error {
+ // The directory was modified, so we must find unwatched entities and watch
+ // them. If something was removed from the directory, nothing will happen,
+ // as everything else should still be watched.
+ files, err := os.ReadDir(path)
+ if err != nil {
+ return err
+ }
+
+ for _, entry := range files {
+ path := filepath.Join(path, entry.Name())
+ if w.port.PathIsWatched(path) {
+ continue
+ }
+
+ finfo, err := entry.Info()
+ if err != nil {
+ return err
+ }
+ err = w.associateFile(path, finfo, false)
+ if !w.sendError(err) {
+ return nil
+ }
+ if !w.sendEvent(path, Create) {
+ return nil
+ }
+ }
+ return nil
+}
+
+func (w *fen) associateFile(path string, stat os.FileInfo, follow bool) error {
+ if w.isClosed() {
+ return ErrClosed
+ }
+ // This is primarily protecting the call to AssociatePath but it is
+ // important and intentional that the call to PathIsWatched is also
+ // protected by this mutex. Without this mutex, AssociatePath has been seen
+ // to error out that the path is already associated.
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ if w.port.PathIsWatched(path) {
+ // Remove the old association in favor of this one If we get ENOENT,
+ // then while the x/sys/unix wrapper still thought that this path was
+ // associated, the underlying event port did not. This call will have
+ // cleared up that discrepancy. The most likely cause is that the event
+ // has fired but we haven't processed it yet.
+ err := w.port.DissociatePath(path)
+ if err != nil && !errors.Is(err, unix.ENOENT) {
+ return err
+ }
+ }
+
+ var events int
+ if !follow {
+ // Watch symlinks themselves rather than their targets unless this entry
+ // is explicitly watched.
+ events |= unix.FILE_NOFOLLOW
+ }
+ if true { // TODO: implement withOps()
+ events |= unix.FILE_MODIFIED
+ }
+ if true {
+ events |= unix.FILE_ATTRIB
+ }
+ return w.port.AssociatePath(path, stat, events, stat.Mode())
+}
+
+func (w *fen) dissociateFile(path string, stat os.FileInfo, unused bool) error {
+ if !w.port.PathIsWatched(path) {
+ return nil
+ }
+ return w.port.DissociatePath(path)
+}
+
+func (w *fen) WatchList() []string {
+ if w.isClosed() {
+ return nil
+ }
+
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ entries := make([]string, 0, len(w.watches)+len(w.dirs))
+ for pathname := range w.dirs {
+ entries = append(entries, pathname)
+ }
+ for pathname := range w.watches {
+ entries = append(entries, pathname)
+ }
+
+ return entries
+}
+
+func (w *fen) xSupports(op Op) bool {
+ if op.Has(xUnportableOpen) || op.Has(xUnportableRead) ||
+ op.Has(xUnportableCloseWrite) || op.Has(xUnportableCloseRead) {
+ return false
+ }
+ return true
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_inotify.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
new file mode 100644
index 0000000..36c3116
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
@@ -0,0 +1,658 @@
+//go:build linux && !appengine
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "io"
+ "io/fs"
+ "os"
+ "path/filepath"
+ "strings"
+ "sync"
+ "time"
+ "unsafe"
+
+ "github.com/fsnotify/fsnotify/internal"
+ "golang.org/x/sys/unix"
+)
+
+type inotify struct {
+ Events chan Event
+ Errors chan error
+
+ // Store fd here as os.File.Read() will no longer return on close after
+ // calling Fd(). See: https://github.com/golang/go/issues/26439
+ fd int
+ inotifyFile *os.File
+ watches *watches
+ done chan struct{} // Channel for sending a "quit message" to the reader goroutine
+ doneMu sync.Mutex
+ doneResp chan struct{} // Channel to respond to Close
+
+ // Store rename cookies in an array, with the index wrapping to 0. Almost
+ // all of the time what we get is a MOVED_FROM to set the cookie and the
+ // next event inotify sends will be MOVED_TO to read it. However, this is
+ // not guaranteed – as described in inotify(7) – and we may get other events
+ // between the two MOVED_* events (including other MOVED_* ones).
+ //
+ // A second issue is that moving a file outside the watched directory will
+ // trigger a MOVED_FROM to set the cookie, but we never see the MOVED_TO to
+ // read and delete it. So just storing it in a map would slowly leak memory.
+ //
+ // Doing it like this gives us a simple fast LRU-cache that won't allocate.
+ // Ten items should be more than enough for our purpose, and a loop over
+ // such a short array is faster than a map access anyway (not that it hugely
+ // matters since we're talking about hundreds of ns at the most, but still).
+ cookies [10]koekje
+ cookieIndex uint8
+ cookiesMu sync.Mutex
+}
+
+type (
+ watches struct {
+ mu sync.RWMutex
+ wd map[uint32]*watch // wd → watch
+ path map[string]uint32 // pathname → wd
+ }
+ watch struct {
+ wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
+ flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
+ path string // Watch path.
+ recurse bool // Recursion with ./...?
+ }
+ koekje struct {
+ cookie uint32
+ path string
+ }
+)
+
+func newWatches() *watches {
+ return &watches{
+ wd: make(map[uint32]*watch),
+ path: make(map[string]uint32),
+ }
+}
+
+func (w *watches) len() int {
+ w.mu.RLock()
+ defer w.mu.RUnlock()
+ return len(w.wd)
+}
+
+func (w *watches) add(ww *watch) {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ w.wd[ww.wd] = ww
+ w.path[ww.path] = ww.wd
+}
+
+func (w *watches) remove(wd uint32) {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ watch := w.wd[wd] // Could have had Remove() called. See #616.
+ if watch == nil {
+ return
+ }
+ delete(w.path, watch.path)
+ delete(w.wd, wd)
+}
+
+func (w *watches) removePath(path string) ([]uint32, error) {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ path, recurse := recursivePath(path)
+ wd, ok := w.path[path]
+ if !ok {
+ return nil, fmt.Errorf("%w: %s", ErrNonExistentWatch, path)
+ }
+
+ watch := w.wd[wd]
+ if recurse && !watch.recurse {
+ return nil, fmt.Errorf("can't use /... with non-recursive watch %q", path)
+ }
+
+ delete(w.path, path)
+ delete(w.wd, wd)
+ if !watch.recurse {
+ return []uint32{wd}, nil
+ }
+
+ wds := make([]uint32, 0, 8)
+ wds = append(wds, wd)
+ for p, rwd := range w.path {
+ if filepath.HasPrefix(p, path) {
+ delete(w.path, p)
+ delete(w.wd, rwd)
+ wds = append(wds, rwd)
+ }
+ }
+ return wds, nil
+}
+
+func (w *watches) byPath(path string) *watch {
+ w.mu.RLock()
+ defer w.mu.RUnlock()
+ return w.wd[w.path[path]]
+}
+
+func (w *watches) byWd(wd uint32) *watch {
+ w.mu.RLock()
+ defer w.mu.RUnlock()
+ return w.wd[wd]
+}
+
+func (w *watches) updatePath(path string, f func(*watch) (*watch, error)) error {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ var existing *watch
+ wd, ok := w.path[path]
+ if ok {
+ existing = w.wd[wd]
+ }
+
+ upd, err := f(existing)
+ if err != nil {
+ return err
+ }
+ if upd != nil {
+ w.wd[upd.wd] = upd
+ w.path[upd.path] = upd.wd
+
+ if upd.wd != wd {
+ delete(w.wd, wd)
+ }
+ }
+
+ return nil
+}
+
+func newBackend(ev chan Event, errs chan error) (backend, error) {
+ return newBufferedBackend(0, ev, errs)
+}
+
+func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
+ // Need to set nonblocking mode for SetDeadline to work, otherwise blocking
+ // I/O operations won't terminate on close.
+ fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC | unix.IN_NONBLOCK)
+ if fd == -1 {
+ return nil, errno
+ }
+
+ w := &inotify{
+ Events: ev,
+ Errors: errs,
+ fd: fd,
+ inotifyFile: os.NewFile(uintptr(fd), ""),
+ watches: newWatches(),
+ done: make(chan struct{}),
+ doneResp: make(chan struct{}),
+ }
+
+ go w.readEvents()
+ return w, nil
+}
+
+// Returns true if the event was sent, or false if watcher is closed.
+func (w *inotify) sendEvent(e Event) bool {
+ select {
+ case <-w.done:
+ return false
+ case w.Events <- e:
+ return true
+ }
+}
+
+// Returns true if the error was sent, or false if watcher is closed.
+func (w *inotify) sendError(err error) bool {
+ if err == nil {
+ return true
+ }
+ select {
+ case <-w.done:
+ return false
+ case w.Errors <- err:
+ return true
+ }
+}
+
+func (w *inotify) isClosed() bool {
+ select {
+ case <-w.done:
+ return true
+ default:
+ return false
+ }
+}
+
+func (w *inotify) Close() error {
+ w.doneMu.Lock()
+ if w.isClosed() {
+ w.doneMu.Unlock()
+ return nil
+ }
+ close(w.done)
+ w.doneMu.Unlock()
+
+ // Causes any blocking reads to return with an error, provided the file
+ // still supports deadline operations.
+ err := w.inotifyFile.Close()
+ if err != nil {
+ return err
+ }
+
+ // Wait for goroutine to close
+ <-w.doneResp
+
+ return nil
+}
+
+func (w *inotify) Add(name string) error { return w.AddWith(name) }
+
+func (w *inotify) AddWith(path string, opts ...addOpt) error {
+ if w.isClosed() {
+ return ErrClosed
+ }
+ if debug {
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s AddWith(%q)\n",
+ time.Now().Format("15:04:05.000000000"), path)
+ }
+
+ with := getOptions(opts...)
+ if !w.xSupports(with.op) {
+ return fmt.Errorf("%w: %s", xErrUnsupported, with.op)
+ }
+
+ path, recurse := recursivePath(path)
+ if recurse {
+ return filepath.WalkDir(path, func(root string, d fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if !d.IsDir() {
+ if root == path {
+ return fmt.Errorf("fsnotify: not a directory: %q", path)
+ }
+ return nil
+ }
+
+ // Send a Create event when adding new directory from a recursive
+ // watch; this is for "mkdir -p one/two/three". Usually all those
+ // directories will be created before we can set up watchers on the
+ // subdirectories, so only "one" would be sent as a Create event and
+ // not "one/two" and "one/two/three" (inotifywait -r has the same
+ // problem).
+ if with.sendCreate && root != path {
+ w.sendEvent(Event{Name: root, Op: Create})
+ }
+
+ return w.add(root, with, true)
+ })
+ }
+
+ return w.add(path, with, false)
+}
+
+func (w *inotify) add(path string, with withOpts, recurse bool) error {
+ var flags uint32
+ if with.noFollow {
+ flags |= unix.IN_DONT_FOLLOW
+ }
+ if with.op.Has(Create) {
+ flags |= unix.IN_CREATE
+ }
+ if with.op.Has(Write) {
+ flags |= unix.IN_MODIFY
+ }
+ if with.op.Has(Remove) {
+ flags |= unix.IN_DELETE | unix.IN_DELETE_SELF
+ }
+ if with.op.Has(Rename) {
+ flags |= unix.IN_MOVED_TO | unix.IN_MOVED_FROM | unix.IN_MOVE_SELF
+ }
+ if with.op.Has(Chmod) {
+ flags |= unix.IN_ATTRIB
+ }
+ if with.op.Has(xUnportableOpen) {
+ flags |= unix.IN_OPEN
+ }
+ if with.op.Has(xUnportableRead) {
+ flags |= unix.IN_ACCESS
+ }
+ if with.op.Has(xUnportableCloseWrite) {
+ flags |= unix.IN_CLOSE_WRITE
+ }
+ if with.op.Has(xUnportableCloseRead) {
+ flags |= unix.IN_CLOSE_NOWRITE
+ }
+ return w.register(path, flags, recurse)
+}
+
+func (w *inotify) register(path string, flags uint32, recurse bool) error {
+ return w.watches.updatePath(path, func(existing *watch) (*watch, error) {
+ if existing != nil {
+ flags |= existing.flags | unix.IN_MASK_ADD
+ }
+
+ wd, err := unix.InotifyAddWatch(w.fd, path, flags)
+ if wd == -1 {
+ return nil, err
+ }
+
+ if existing == nil {
+ return &watch{
+ wd: uint32(wd),
+ path: path,
+ flags: flags,
+ recurse: recurse,
+ }, nil
+ }
+
+ existing.wd = uint32(wd)
+ existing.flags = flags
+ return existing, nil
+ })
+}
+
+func (w *inotify) Remove(name string) error {
+ if w.isClosed() {
+ return nil
+ }
+ if debug {
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s Remove(%q)\n",
+ time.Now().Format("15:04:05.000000000"), name)
+ }
+ return w.remove(filepath.Clean(name))
+}
+
+func (w *inotify) remove(name string) error {
+ wds, err := w.watches.removePath(name)
+ if err != nil {
+ return err
+ }
+
+ for _, wd := range wds {
+ _, err := unix.InotifyRmWatch(w.fd, wd)
+ if err != nil {
+ // TODO: Perhaps it's not helpful to return an error here in every
+ // case; the only two possible errors are:
+ //
+ // EBADF, which happens when w.fd is not a valid file descriptor of
+ // any kind.
+ //
+ // EINVAL, which is when fd is not an inotify descriptor or wd is
+ // not a valid watch descriptor. Watch descriptors are invalidated
+ // when they are removed explicitly or implicitly; explicitly by
+ // inotify_rm_watch, implicitly when the file they are watching is
+ // deleted.
+ return err
+ }
+ }
+ return nil
+}
+
+func (w *inotify) WatchList() []string {
+ if w.isClosed() {
+ return nil
+ }
+
+ entries := make([]string, 0, w.watches.len())
+ w.watches.mu.RLock()
+ for pathname := range w.watches.path {
+ entries = append(entries, pathname)
+ }
+ w.watches.mu.RUnlock()
+
+ return entries
+}
+
+// readEvents reads from the inotify file descriptor, converts the
+// received events into Event objects and sends them via the Events channel
+func (w *inotify) readEvents() {
+ defer func() {
+ close(w.doneResp)
+ close(w.Errors)
+ close(w.Events)
+ }()
+
+ var (
+ buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events
+ errno error // Syscall errno
+ )
+ for {
+ // See if we have been closed.
+ if w.isClosed() {
+ return
+ }
+
+ n, err := w.inotifyFile.Read(buf[:])
+ switch {
+ case errors.Unwrap(err) == os.ErrClosed:
+ return
+ case err != nil:
+ if !w.sendError(err) {
+ return
+ }
+ continue
+ }
+
+ if n < unix.SizeofInotifyEvent {
+ var err error
+ if n == 0 {
+ err = io.EOF // If EOF is received. This should really never happen.
+ } else if n < 0 {
+ err = errno // If an error occurred while reading.
+ } else {
+ err = errors.New("notify: short read in readEvents()") // Read was too short.
+ }
+ if !w.sendError(err) {
+ return
+ }
+ continue
+ }
+
+ // We don't know how many events we just read into the buffer
+ // While the offset points to at least one whole event...
+ var offset uint32
+ for offset <= uint32(n-unix.SizeofInotifyEvent) {
+ var (
+ // Point "raw" to the event in the buffer
+ raw = (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset]))
+ mask = uint32(raw.Mask)
+ nameLen = uint32(raw.Len)
+ // Move to the next event in the buffer
+ next = func() { offset += unix.SizeofInotifyEvent + nameLen }
+ )
+
+ if mask&unix.IN_Q_OVERFLOW != 0 {
+ if !w.sendError(ErrEventOverflow) {
+ return
+ }
+ }
+
+ /// If the event happened to the watched directory or the watched
+ /// file, the kernel doesn't append the filename to the event, but
+ /// we would like to always fill the the "Name" field with a valid
+ /// filename. We retrieve the path of the watch from the "paths"
+ /// map.
+ watch := w.watches.byWd(uint32(raw.Wd))
+ /// Can be nil if Remove() was called in another goroutine for this
+ /// path inbetween reading the events from the kernel and reading
+ /// the internal state. Not much we can do about it, so just skip.
+ /// See #616.
+ if watch == nil {
+ next()
+ continue
+ }
+
+ name := watch.path
+ if nameLen > 0 {
+ /// Point "bytes" at the first byte of the filename
+ bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen]
+ /// The filename is padded with NULL bytes. TrimRight() gets rid of those.
+ name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
+ }
+
+ if debug {
+ internal.Debug(name, raw.Mask, raw.Cookie)
+ }
+
+ if mask&unix.IN_IGNORED != 0 { //&& event.Op != 0
+ next()
+ continue
+ }
+
+ // inotify will automatically remove the watch on deletes; just need
+ // to clean our state here.
+ if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF {
+ w.watches.remove(watch.wd)
+ }
+
+ // We can't really update the state when a watched path is moved;
+ // only IN_MOVE_SELF is sent and not IN_MOVED_{FROM,TO}. So remove
+ // the watch.
+ if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF {
+ if watch.recurse {
+ next() // Do nothing
+ continue
+ }
+
+ err := w.remove(watch.path)
+ if err != nil && !errors.Is(err, ErrNonExistentWatch) {
+ if !w.sendError(err) {
+ return
+ }
+ }
+ }
+
+ /// Skip if we're watching both this path and the parent; the parent
+ /// will already send a delete so no need to do it twice.
+ if mask&unix.IN_DELETE_SELF != 0 {
+ if _, ok := w.watches.path[filepath.Dir(watch.path)]; ok {
+ next()
+ continue
+ }
+ }
+
+ ev := w.newEvent(name, mask, raw.Cookie)
+ // Need to update watch path for recurse.
+ if watch.recurse {
+ isDir := mask&unix.IN_ISDIR == unix.IN_ISDIR
+ /// New directory created: set up watch on it.
+ if isDir && ev.Has(Create) {
+ err := w.register(ev.Name, watch.flags, true)
+ if !w.sendError(err) {
+ return
+ }
+
+ // This was a directory rename, so we need to update all
+ // the children.
+ //
+ // TODO: this is of course pretty slow; we should use a
+ // better data structure for storing all of this, e.g. store
+ // children in the watch. I have some code for this in my
+ // kqueue refactor we can use in the future. For now I'm
+ // okay with this as it's not publicly available.
+ // Correctness first, performance second.
+ if ev.renamedFrom != "" {
+ w.watches.mu.Lock()
+ for k, ww := range w.watches.wd {
+ if k == watch.wd || ww.path == ev.Name {
+ continue
+ }
+ if strings.HasPrefix(ww.path, ev.renamedFrom) {
+ ww.path = strings.Replace(ww.path, ev.renamedFrom, ev.Name, 1)
+ w.watches.wd[k] = ww
+ }
+ }
+ w.watches.mu.Unlock()
+ }
+ }
+ }
+
+ /// Send the events that are not ignored on the events channel
+ if !w.sendEvent(ev) {
+ return
+ }
+ next()
+ }
+ }
+}
+
+func (w *inotify) isRecursive(path string) bool {
+ ww := w.watches.byPath(path)
+ if ww == nil { // path could be a file, so also check the Dir.
+ ww = w.watches.byPath(filepath.Dir(path))
+ }
+ return ww != nil && ww.recurse
+}
+
+func (w *inotify) newEvent(name string, mask, cookie uint32) Event {
+ e := Event{Name: name}
+ if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO {
+ e.Op |= Create
+ }
+ if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE {
+ e.Op |= Remove
+ }
+ if mask&unix.IN_MODIFY == unix.IN_MODIFY {
+ e.Op |= Write
+ }
+ if mask&unix.IN_OPEN == unix.IN_OPEN {
+ e.Op |= xUnportableOpen
+ }
+ if mask&unix.IN_ACCESS == unix.IN_ACCESS {
+ e.Op |= xUnportableRead
+ }
+ if mask&unix.IN_CLOSE_WRITE == unix.IN_CLOSE_WRITE {
+ e.Op |= xUnportableCloseWrite
+ }
+ if mask&unix.IN_CLOSE_NOWRITE == unix.IN_CLOSE_NOWRITE {
+ e.Op |= xUnportableCloseRead
+ }
+ if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM {
+ e.Op |= Rename
+ }
+ if mask&unix.IN_ATTRIB == unix.IN_ATTRIB {
+ e.Op |= Chmod
+ }
+
+ if cookie != 0 {
+ if mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM {
+ w.cookiesMu.Lock()
+ w.cookies[w.cookieIndex] = koekje{cookie: cookie, path: e.Name}
+ w.cookieIndex++
+ if w.cookieIndex > 9 {
+ w.cookieIndex = 0
+ }
+ w.cookiesMu.Unlock()
+ } else if mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO {
+ w.cookiesMu.Lock()
+ var prev string
+ for _, c := range w.cookies {
+ if c.cookie == cookie {
+ prev = c.path
+ break
+ }
+ }
+ w.cookiesMu.Unlock()
+ e.renamedFrom = prev
+ }
+ }
+ return e
+}
+
+func (w *inotify) xSupports(op Op) bool {
+ return true // Supports everything.
+}
+
+func (w *inotify) state() {
+ w.watches.mu.Lock()
+ defer w.watches.mu.Unlock()
+ for wd, ww := range w.watches.wd {
+ fmt.Fprintf(os.Stderr, "%4d: recurse=%t %q\n", wd, ww.recurse, ww.path)
+ }
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
new file mode 100644
index 0000000..d8de5ab
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
@@ -0,0 +1,733 @@
+//go:build freebsd || openbsd || netbsd || dragonfly || darwin
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "runtime"
+ "sync"
+ "time"
+
+ "github.com/fsnotify/fsnotify/internal"
+ "golang.org/x/sys/unix"
+)
+
+type kqueue struct {
+ Events chan Event
+ Errors chan error
+
+ kq int // File descriptor (as returned by the kqueue() syscall).
+ closepipe [2]int // Pipe used for closing kq.
+ watches *watches
+ done chan struct{}
+ doneMu sync.Mutex
+}
+
+type (
+ watches struct {
+ mu sync.RWMutex
+ wd map[int]watch // wd → watch
+ path map[string]int // pathname → wd
+ byDir map[string]map[int]struct{} // dirname(path) → wd
+ seen map[string]struct{} // Keep track of if we know this file exists.
+ byUser map[string]struct{} // Watches added with Watcher.Add()
+ }
+ watch struct {
+ wd int
+ name string
+ linkName string // In case of links; name is the target, and this is the link.
+ isDir bool
+ dirFlags uint32
+ }
+)
+
+func newWatches() *watches {
+ return &watches{
+ wd: make(map[int]watch),
+ path: make(map[string]int),
+ byDir: make(map[string]map[int]struct{}),
+ seen: make(map[string]struct{}),
+ byUser: make(map[string]struct{}),
+ }
+}
+
+func (w *watches) listPaths(userOnly bool) []string {
+ w.mu.RLock()
+ defer w.mu.RUnlock()
+
+ if userOnly {
+ l := make([]string, 0, len(w.byUser))
+ for p := range w.byUser {
+ l = append(l, p)
+ }
+ return l
+ }
+
+ l := make([]string, 0, len(w.path))
+ for p := range w.path {
+ l = append(l, p)
+ }
+ return l
+}
+
+func (w *watches) watchesInDir(path string) []string {
+ w.mu.RLock()
+ defer w.mu.RUnlock()
+
+ l := make([]string, 0, 4)
+ for fd := range w.byDir[path] {
+ info := w.wd[fd]
+ if _, ok := w.byUser[info.name]; !ok {
+ l = append(l, info.name)
+ }
+ }
+ return l
+}
+
+// Mark path as added by the user.
+func (w *watches) addUserWatch(path string) {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ w.byUser[path] = struct{}{}
+}
+
+func (w *watches) addLink(path string, fd int) {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ w.path[path] = fd
+ w.seen[path] = struct{}{}
+}
+
+func (w *watches) add(path, linkPath string, fd int, isDir bool) {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ w.path[path] = fd
+ w.wd[fd] = watch{wd: fd, name: path, linkName: linkPath, isDir: isDir}
+
+ parent := filepath.Dir(path)
+ byDir, ok := w.byDir[parent]
+ if !ok {
+ byDir = make(map[int]struct{}, 1)
+ w.byDir[parent] = byDir
+ }
+ byDir[fd] = struct{}{}
+}
+
+func (w *watches) byWd(fd int) (watch, bool) {
+ w.mu.RLock()
+ defer w.mu.RUnlock()
+ info, ok := w.wd[fd]
+ return info, ok
+}
+
+func (w *watches) byPath(path string) (watch, bool) {
+ w.mu.RLock()
+ defer w.mu.RUnlock()
+ info, ok := w.wd[w.path[path]]
+ return info, ok
+}
+
+func (w *watches) updateDirFlags(path string, flags uint32) {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ fd := w.path[path]
+ info := w.wd[fd]
+ info.dirFlags = flags
+ w.wd[fd] = info
+}
+
+func (w *watches) remove(fd int, path string) bool {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ isDir := w.wd[fd].isDir
+ delete(w.path, path)
+ delete(w.byUser, path)
+
+ parent := filepath.Dir(path)
+ delete(w.byDir[parent], fd)
+
+ if len(w.byDir[parent]) == 0 {
+ delete(w.byDir, parent)
+ }
+
+ delete(w.wd, fd)
+ delete(w.seen, path)
+ return isDir
+}
+
+func (w *watches) markSeen(path string, exists bool) {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ if exists {
+ w.seen[path] = struct{}{}
+ } else {
+ delete(w.seen, path)
+ }
+}
+
+func (w *watches) seenBefore(path string) bool {
+ w.mu.RLock()
+ defer w.mu.RUnlock()
+ _, ok := w.seen[path]
+ return ok
+}
+
+func newBackend(ev chan Event, errs chan error) (backend, error) {
+ return newBufferedBackend(0, ev, errs)
+}
+
+func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
+ kq, closepipe, err := newKqueue()
+ if err != nil {
+ return nil, err
+ }
+
+ w := &kqueue{
+ Events: ev,
+ Errors: errs,
+ kq: kq,
+ closepipe: closepipe,
+ done: make(chan struct{}),
+ watches: newWatches(),
+ }
+
+ go w.readEvents()
+ return w, nil
+}
+
+// newKqueue creates a new kernel event queue and returns a descriptor.
+//
+// This registers a new event on closepipe, which will trigger an event when
+// it's closed. This way we can use kevent() without timeout/polling; without
+// the closepipe, it would block forever and we wouldn't be able to stop it at
+// all.
+func newKqueue() (kq int, closepipe [2]int, err error) {
+ kq, err = unix.Kqueue()
+ if kq == -1 {
+ return kq, closepipe, err
+ }
+
+ // Register the close pipe.
+ err = unix.Pipe(closepipe[:])
+ if err != nil {
+ unix.Close(kq)
+ return kq, closepipe, err
+ }
+ unix.CloseOnExec(closepipe[0])
+ unix.CloseOnExec(closepipe[1])
+
+ // Register changes to listen on the closepipe.
+ changes := make([]unix.Kevent_t, 1)
+ // SetKevent converts int to the platform-specific types.
+ unix.SetKevent(&changes[0], closepipe[0], unix.EVFILT_READ,
+ unix.EV_ADD|unix.EV_ENABLE|unix.EV_ONESHOT)
+
+ ok, err := unix.Kevent(kq, changes, nil, nil)
+ if ok == -1 {
+ unix.Close(kq)
+ unix.Close(closepipe[0])
+ unix.Close(closepipe[1])
+ return kq, closepipe, err
+ }
+ return kq, closepipe, nil
+}
+
+// Returns true if the event was sent, or false if watcher is closed.
+func (w *kqueue) sendEvent(e Event) bool {
+ select {
+ case <-w.done:
+ return false
+ case w.Events <- e:
+ return true
+ }
+}
+
+// Returns true if the error was sent, or false if watcher is closed.
+func (w *kqueue) sendError(err error) bool {
+ if err == nil {
+ return true
+ }
+ select {
+ case <-w.done:
+ return false
+ case w.Errors <- err:
+ return true
+ }
+}
+
+func (w *kqueue) isClosed() bool {
+ select {
+ case <-w.done:
+ return true
+ default:
+ return false
+ }
+}
+
+func (w *kqueue) Close() error {
+ w.doneMu.Lock()
+ if w.isClosed() {
+ w.doneMu.Unlock()
+ return nil
+ }
+ close(w.done)
+ w.doneMu.Unlock()
+
+ pathsToRemove := w.watches.listPaths(false)
+ for _, name := range pathsToRemove {
+ w.Remove(name)
+ }
+
+ // Send "quit" message to the reader goroutine.
+ unix.Close(w.closepipe[1])
+ return nil
+}
+
+func (w *kqueue) Add(name string) error { return w.AddWith(name) }
+
+func (w *kqueue) AddWith(name string, opts ...addOpt) error {
+ if debug {
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s AddWith(%q)\n",
+ time.Now().Format("15:04:05.000000000"), name)
+ }
+
+ with := getOptions(opts...)
+ if !w.xSupports(with.op) {
+ return fmt.Errorf("%w: %s", xErrUnsupported, with.op)
+ }
+
+ _, err := w.addWatch(name, noteAllEvents)
+ if err != nil {
+ return err
+ }
+ w.watches.addUserWatch(name)
+ return nil
+}
+
+func (w *kqueue) Remove(name string) error {
+ if debug {
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s Remove(%q)\n",
+ time.Now().Format("15:04:05.000000000"), name)
+ }
+ return w.remove(name, true)
+}
+
+func (w *kqueue) remove(name string, unwatchFiles bool) error {
+ if w.isClosed() {
+ return nil
+ }
+
+ name = filepath.Clean(name)
+ info, ok := w.watches.byPath(name)
+ if !ok {
+ return fmt.Errorf("%w: %s", ErrNonExistentWatch, name)
+ }
+
+ err := w.register([]int{info.wd}, unix.EV_DELETE, 0)
+ if err != nil {
+ return err
+ }
+
+ unix.Close(info.wd)
+
+ isDir := w.watches.remove(info.wd, name)
+
+ // Find all watched paths that are in this directory that are not external.
+ if unwatchFiles && isDir {
+ pathsToRemove := w.watches.watchesInDir(name)
+ for _, name := range pathsToRemove {
+ // Since these are internal, not much sense in propagating error to
+ // the user, as that will just confuse them with an error about a
+ // path they did not explicitly watch themselves.
+ w.Remove(name)
+ }
+ }
+ return nil
+}
+
+func (w *kqueue) WatchList() []string {
+ if w.isClosed() {
+ return nil
+ }
+ return w.watches.listPaths(true)
+}
+
+// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE)
+const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME
+
+// addWatch adds name to the watched file set; the flags are interpreted as
+// described in kevent(2).
+//
+// Returns the real path to the file which was added, with symlinks resolved.
+func (w *kqueue) addWatch(name string, flags uint32) (string, error) {
+ if w.isClosed() {
+ return "", ErrClosed
+ }
+
+ name = filepath.Clean(name)
+
+ info, alreadyWatching := w.watches.byPath(name)
+ if !alreadyWatching {
+ fi, err := os.Lstat(name)
+ if err != nil {
+ return "", err
+ }
+
+ // Don't watch sockets or named pipes.
+ if (fi.Mode()&os.ModeSocket == os.ModeSocket) || (fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe) {
+ return "", nil
+ }
+
+ // Follow symlinks.
+ if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
+ link, err := os.Readlink(name)
+ if err != nil {
+ // Return nil because Linux can add unresolvable symlinks to the
+ // watch list without problems, so maintain consistency with
+ // that. There will be no file events for broken symlinks.
+ // TODO: more specific check; returns os.PathError; ENOENT?
+ return "", nil
+ }
+
+ _, alreadyWatching = w.watches.byPath(link)
+ if alreadyWatching {
+ // Add to watches so we don't get spurious Create events later
+ // on when we diff the directories.
+ w.watches.addLink(name, 0)
+ return link, nil
+ }
+
+ info.linkName = name
+ name = link
+ fi, err = os.Lstat(name)
+ if err != nil {
+ return "", nil
+ }
+ }
+
+ // Retry on EINTR; open() can return EINTR in practice on macOS.
+ // See #354, and Go issues 11180 and 39237.
+ for {
+ info.wd, err = unix.Open(name, openMode, 0)
+ if err == nil {
+ break
+ }
+ if errors.Is(err, unix.EINTR) {
+ continue
+ }
+
+ return "", err
+ }
+
+ info.isDir = fi.IsDir()
+ }
+
+ err := w.register([]int{info.wd}, unix.EV_ADD|unix.EV_CLEAR|unix.EV_ENABLE, flags)
+ if err != nil {
+ unix.Close(info.wd)
+ return "", err
+ }
+
+ if !alreadyWatching {
+ w.watches.add(name, info.linkName, info.wd, info.isDir)
+ }
+
+ // Watch the directory if it has not been watched before, or if it was
+ // watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles)
+ if info.isDir {
+ watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE &&
+ (!alreadyWatching || (info.dirFlags&unix.NOTE_WRITE) != unix.NOTE_WRITE)
+ w.watches.updateDirFlags(name, flags)
+
+ if watchDir {
+ if err := w.watchDirectoryFiles(name); err != nil {
+ return "", err
+ }
+ }
+ }
+ return name, nil
+}
+
+// readEvents reads from kqueue and converts the received kevents into
+// Event values that it sends down the Events channel.
+func (w *kqueue) readEvents() {
+ defer func() {
+ close(w.Events)
+ close(w.Errors)
+ _ = unix.Close(w.kq)
+ unix.Close(w.closepipe[0])
+ }()
+
+ eventBuffer := make([]unix.Kevent_t, 10)
+ for {
+ kevents, err := w.read(eventBuffer)
+ // EINTR is okay, the syscall was interrupted before timeout expired.
+ if err != nil && err != unix.EINTR {
+ if !w.sendError(fmt.Errorf("fsnotify.readEvents: %w", err)) {
+ return
+ }
+ }
+
+ for _, kevent := range kevents {
+ var (
+ wd = int(kevent.Ident)
+ mask = uint32(kevent.Fflags)
+ )
+
+ // Shut down the loop when the pipe is closed, but only after all
+ // other events have been processed.
+ if wd == w.closepipe[0] {
+ return
+ }
+
+ path, ok := w.watches.byWd(wd)
+ if debug {
+ internal.Debug(path.name, &kevent)
+ }
+
+ // On macOS it seems that sometimes an event with Ident=0 is
+ // delivered, and no other flags/information beyond that, even
+ // though we never saw such a file descriptor. For example in
+ // TestWatchSymlink/277 (usually at the end, but sometimes sooner):
+ //
+ // fmt.Printf("READ: %2d %#v\n", kevent.Ident, kevent)
+ // unix.Kevent_t{Ident:0x2a, Filter:-4, Flags:0x25, Fflags:0x2, Data:0, Udata:(*uint8)(nil)}
+ // unix.Kevent_t{Ident:0x0, Filter:-4, Flags:0x25, Fflags:0x2, Data:0, Udata:(*uint8)(nil)}
+ //
+ // The first is a normal event, the second with Ident 0. No error
+ // flag, no data, no ... nothing.
+ //
+ // I read a bit through bsd/kern_event.c from the xnu source, but I
+ // don't really see an obvious location where this is triggered –
+ // this doesn't seem intentional, but idk...
+ //
+ // Technically fd 0 is a valid descriptor, so only skip it if
+ // there's no path, and if we're on macOS.
+ if !ok && kevent.Ident == 0 && runtime.GOOS == "darwin" {
+ continue
+ }
+
+ event := w.newEvent(path.name, path.linkName, mask)
+
+ if event.Has(Rename) || event.Has(Remove) {
+ w.remove(event.Name, false)
+ w.watches.markSeen(event.Name, false)
+ }
+
+ if path.isDir && event.Has(Write) && !event.Has(Remove) {
+ w.dirChange(event.Name)
+ } else if !w.sendEvent(event) {
+ return
+ }
+
+ if event.Has(Remove) {
+ // Look for a file that may have overwritten this; for example,
+ // mv f1 f2 will delete f2, then create f2.
+ if path.isDir {
+ fileDir := filepath.Clean(event.Name)
+ _, found := w.watches.byPath(fileDir)
+ if found {
+ // TODO: this branch is never triggered in any test.
+ // Added in d6220df (2012).
+ // isDir check added in 8611c35 (2016): https://github.com/fsnotify/fsnotify/pull/111
+ //
+ // I don't really get how this can be triggered either.
+ // And it wasn't triggered in the patch that added it,
+ // either.
+ //
+ // Original also had a comment:
+ // make sure the directory exists before we watch for
+ // changes. When we do a recursive watch and perform
+ // rm -rf, the parent directory might have gone
+ // missing, ignore the missing directory and let the
+ // upcoming delete event remove the watch from the
+ // parent directory.
+ err := w.dirChange(fileDir)
+ if !w.sendError(err) {
+ return
+ }
+ }
+ } else {
+ path := filepath.Clean(event.Name)
+ if fi, err := os.Lstat(path); err == nil {
+ err := w.sendCreateIfNew(path, fi)
+ if !w.sendError(err) {
+ return
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+// newEvent returns an platform-independent Event based on kqueue Fflags.
+func (w *kqueue) newEvent(name, linkName string, mask uint32) Event {
+ e := Event{Name: name}
+ if linkName != "" {
+ // If the user watched "/path/link" then emit events as "/path/link"
+ // rather than "/path/target".
+ e.Name = linkName
+ }
+
+ if mask&unix.NOTE_DELETE == unix.NOTE_DELETE {
+ e.Op |= Remove
+ }
+ if mask&unix.NOTE_WRITE == unix.NOTE_WRITE {
+ e.Op |= Write
+ }
+ if mask&unix.NOTE_RENAME == unix.NOTE_RENAME {
+ e.Op |= Rename
+ }
+ if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB {
+ e.Op |= Chmod
+ }
+ // No point sending a write and delete event at the same time: if it's gone,
+ // then it's gone.
+ if e.Op.Has(Write) && e.Op.Has(Remove) {
+ e.Op &^= Write
+ }
+ return e
+}
+
+// watchDirectoryFiles to mimic inotify when adding a watch on a directory
+func (w *kqueue) watchDirectoryFiles(dirPath string) error {
+ files, err := os.ReadDir(dirPath)
+ if err != nil {
+ return err
+ }
+
+ for _, f := range files {
+ path := filepath.Join(dirPath, f.Name())
+
+ fi, err := f.Info()
+ if err != nil {
+ return fmt.Errorf("%q: %w", path, err)
+ }
+
+ cleanPath, err := w.internalWatch(path, fi)
+ if err != nil {
+ // No permission to read the file; that's not a problem: just skip.
+ // But do add it to w.fileExists to prevent it from being picked up
+ // as a "new" file later (it still shows up in the directory
+ // listing).
+ switch {
+ case errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM):
+ cleanPath = filepath.Clean(path)
+ default:
+ return fmt.Errorf("%q: %w", path, err)
+ }
+ }
+
+ w.watches.markSeen(cleanPath, true)
+ }
+
+ return nil
+}
+
+// Search the directory for new files and send an event for them.
+//
+// This functionality is to have the BSD watcher match the inotify, which sends
+// a create event for files created in a watched directory.
+func (w *kqueue) dirChange(dir string) error {
+ files, err := os.ReadDir(dir)
+ if err != nil {
+ // Directory no longer exists: we can ignore this safely. kqueue will
+ // still give us the correct events.
+ if errors.Is(err, os.ErrNotExist) {
+ return nil
+ }
+ return fmt.Errorf("fsnotify.dirChange: %w", err)
+ }
+
+ for _, f := range files {
+ fi, err := f.Info()
+ if err != nil {
+ return fmt.Errorf("fsnotify.dirChange: %w", err)
+ }
+
+ err = w.sendCreateIfNew(filepath.Join(dir, fi.Name()), fi)
+ if err != nil {
+ // Don't need to send an error if this file isn't readable.
+ if errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM) {
+ return nil
+ }
+ return fmt.Errorf("fsnotify.dirChange: %w", err)
+ }
+ }
+ return nil
+}
+
+// Send a create event if the file isn't already being tracked, and start
+// watching this file.
+func (w *kqueue) sendCreateIfNew(path string, fi os.FileInfo) error {
+ if !w.watches.seenBefore(path) {
+ if !w.sendEvent(Event{Name: path, Op: Create}) {
+ return nil
+ }
+ }
+
+ // Like watchDirectoryFiles, but without doing another ReadDir.
+ path, err := w.internalWatch(path, fi)
+ if err != nil {
+ return err
+ }
+ w.watches.markSeen(path, true)
+ return nil
+}
+
+func (w *kqueue) internalWatch(name string, fi os.FileInfo) (string, error) {
+ if fi.IsDir() {
+ // mimic Linux providing delete events for subdirectories, but preserve
+ // the flags used if currently watching subdirectory
+ info, _ := w.watches.byPath(name)
+ return w.addWatch(name, info.dirFlags|unix.NOTE_DELETE|unix.NOTE_RENAME)
+ }
+
+ // watch file to mimic Linux inotify
+ return w.addWatch(name, noteAllEvents)
+}
+
+// Register events with the queue.
+func (w *kqueue) register(fds []int, flags int, fflags uint32) error {
+ changes := make([]unix.Kevent_t, len(fds))
+ for i, fd := range fds {
+ // SetKevent converts int to the platform-specific types.
+ unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags)
+ changes[i].Fflags = fflags
+ }
+
+ // Register the events.
+ success, err := unix.Kevent(w.kq, changes, nil, nil)
+ if success == -1 {
+ return err
+ }
+ return nil
+}
+
+// read retrieves pending events, or waits until an event occurs.
+func (w *kqueue) read(events []unix.Kevent_t) ([]unix.Kevent_t, error) {
+ n, err := unix.Kevent(w.kq, nil, events, nil)
+ if err != nil {
+ return nil, err
+ }
+ return events[0:n], nil
+}
+
+func (w *kqueue) xSupports(op Op) bool {
+ if runtime.GOOS == "freebsd" {
+ //return true // Supports everything.
+ }
+ if op.Has(xUnportableOpen) || op.Has(xUnportableRead) ||
+ op.Has(xUnportableCloseWrite) || op.Has(xUnportableCloseRead) {
+ return false
+ }
+ return true
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_other.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_other.go
new file mode 100644
index 0000000..5eb5dbc
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_other.go
@@ -0,0 +1,23 @@
+//go:build appengine || (!darwin && !dragonfly && !freebsd && !openbsd && !linux && !netbsd && !solaris && !windows)
+
+package fsnotify
+
+import "errors"
+
+type other struct {
+ Events chan Event
+ Errors chan error
+}
+
+func newBackend(ev chan Event, errs chan error) (backend, error) {
+ return nil, errors.New("fsnotify not supported on the current platform")
+}
+func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
+ return newBackend(ev, errs)
+}
+func (w *other) Close() error { return nil }
+func (w *other) WatchList() []string { return nil }
+func (w *other) Add(name string) error { return nil }
+func (w *other) AddWith(name string, opts ...addOpt) error { return nil }
+func (w *other) Remove(name string) error { return nil }
+func (w *other) xSupports(op Op) bool { return false }
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_windows.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_windows.go
new file mode 100644
index 0000000..c54a630
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/backend_windows.go
@@ -0,0 +1,682 @@
+//go:build windows
+
+// Windows backend based on ReadDirectoryChangesW()
+//
+// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesw
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "reflect"
+ "runtime"
+ "strings"
+ "sync"
+ "time"
+ "unsafe"
+
+ "github.com/fsnotify/fsnotify/internal"
+ "golang.org/x/sys/windows"
+)
+
+type readDirChangesW struct {
+ Events chan Event
+ Errors chan error
+
+ port windows.Handle // Handle to completion port
+ input chan *input // Inputs to the reader are sent on this channel
+ quit chan chan<- error
+
+ mu sync.Mutex // Protects access to watches, closed
+ watches watchMap // Map of watches (key: i-number)
+ closed bool // Set to true when Close() is first called
+}
+
+func newBackend(ev chan Event, errs chan error) (backend, error) {
+ return newBufferedBackend(50, ev, errs)
+}
+
+func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
+ port, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0)
+ if err != nil {
+ return nil, os.NewSyscallError("CreateIoCompletionPort", err)
+ }
+ w := &readDirChangesW{
+ Events: ev,
+ Errors: errs,
+ port: port,
+ watches: make(watchMap),
+ input: make(chan *input, 1),
+ quit: make(chan chan<- error, 1),
+ }
+ go w.readEvents()
+ return w, nil
+}
+
+func (w *readDirChangesW) isClosed() bool {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ return w.closed
+}
+
+func (w *readDirChangesW) sendEvent(name, renamedFrom string, mask uint64) bool {
+ if mask == 0 {
+ return false
+ }
+
+ event := w.newEvent(name, uint32(mask))
+ event.renamedFrom = renamedFrom
+ select {
+ case ch := <-w.quit:
+ w.quit <- ch
+ case w.Events <- event:
+ }
+ return true
+}
+
+// Returns true if the error was sent, or false if watcher is closed.
+func (w *readDirChangesW) sendError(err error) bool {
+ if err == nil {
+ return true
+ }
+ select {
+ case w.Errors <- err:
+ return true
+ case <-w.quit:
+ return false
+ }
+}
+
+func (w *readDirChangesW) Close() error {
+ if w.isClosed() {
+ return nil
+ }
+
+ w.mu.Lock()
+ w.closed = true
+ w.mu.Unlock()
+
+ // Send "quit" message to the reader goroutine
+ ch := make(chan error)
+ w.quit <- ch
+ if err := w.wakeupReader(); err != nil {
+ return err
+ }
+ return <-ch
+}
+
+func (w *readDirChangesW) Add(name string) error { return w.AddWith(name) }
+
+func (w *readDirChangesW) AddWith(name string, opts ...addOpt) error {
+ if w.isClosed() {
+ return ErrClosed
+ }
+ if debug {
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s AddWith(%q)\n",
+ time.Now().Format("15:04:05.000000000"), filepath.ToSlash(name))
+ }
+
+ with := getOptions(opts...)
+ if !w.xSupports(with.op) {
+ return fmt.Errorf("%w: %s", xErrUnsupported, with.op)
+ }
+ if with.bufsize < 4096 {
+ return fmt.Errorf("fsnotify.WithBufferSize: buffer size cannot be smaller than 4096 bytes")
+ }
+
+ in := &input{
+ op: opAddWatch,
+ path: filepath.Clean(name),
+ flags: sysFSALLEVENTS,
+ reply: make(chan error),
+ bufsize: with.bufsize,
+ }
+ w.input <- in
+ if err := w.wakeupReader(); err != nil {
+ return err
+ }
+ return <-in.reply
+}
+
+func (w *readDirChangesW) Remove(name string) error {
+ if w.isClosed() {
+ return nil
+ }
+ if debug {
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s Remove(%q)\n",
+ time.Now().Format("15:04:05.000000000"), filepath.ToSlash(name))
+ }
+
+ in := &input{
+ op: opRemoveWatch,
+ path: filepath.Clean(name),
+ reply: make(chan error),
+ }
+ w.input <- in
+ if err := w.wakeupReader(); err != nil {
+ return err
+ }
+ return <-in.reply
+}
+
+func (w *readDirChangesW) WatchList() []string {
+ if w.isClosed() {
+ return nil
+ }
+
+ w.mu.Lock()
+ defer w.mu.Unlock()
+
+ entries := make([]string, 0, len(w.watches))
+ for _, entry := range w.watches {
+ for _, watchEntry := range entry {
+ for name := range watchEntry.names {
+ entries = append(entries, filepath.Join(watchEntry.path, name))
+ }
+ // the directory itself is being watched
+ if watchEntry.mask != 0 {
+ entries = append(entries, watchEntry.path)
+ }
+ }
+ }
+
+ return entries
+}
+
+// These options are from the old golang.org/x/exp/winfsnotify, where you could
+// add various options to the watch. This has long since been removed.
+//
+// The "sys" in the name is misleading as they're not part of any "system".
+//
+// This should all be removed at some point, and just use windows.FILE_NOTIFY_*
+const (
+ sysFSALLEVENTS = 0xfff
+ sysFSCREATE = 0x100
+ sysFSDELETE = 0x200
+ sysFSDELETESELF = 0x400
+ sysFSMODIFY = 0x2
+ sysFSMOVE = 0xc0
+ sysFSMOVEDFROM = 0x40
+ sysFSMOVEDTO = 0x80
+ sysFSMOVESELF = 0x800
+ sysFSIGNORED = 0x8000
+)
+
+func (w *readDirChangesW) newEvent(name string, mask uint32) Event {
+ e := Event{Name: name}
+ if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO {
+ e.Op |= Create
+ }
+ if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF {
+ e.Op |= Remove
+ }
+ if mask&sysFSMODIFY == sysFSMODIFY {
+ e.Op |= Write
+ }
+ if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM {
+ e.Op |= Rename
+ }
+ return e
+}
+
+const (
+ opAddWatch = iota
+ opRemoveWatch
+)
+
+const (
+ provisional uint64 = 1 << (32 + iota)
+)
+
+type input struct {
+ op int
+ path string
+ flags uint32
+ bufsize int
+ reply chan error
+}
+
+type inode struct {
+ handle windows.Handle
+ volume uint32
+ index uint64
+}
+
+type watch struct {
+ ov windows.Overlapped
+ ino *inode // i-number
+ recurse bool // Recursive watch?
+ path string // Directory path
+ mask uint64 // Directory itself is being watched with these notify flags
+ names map[string]uint64 // Map of names being watched and their notify flags
+ rename string // Remembers the old name while renaming a file
+ buf []byte // buffer, allocated later
+}
+
+type (
+ indexMap map[uint64]*watch
+ watchMap map[uint32]indexMap
+)
+
+func (w *readDirChangesW) wakeupReader() error {
+ err := windows.PostQueuedCompletionStatus(w.port, 0, 0, nil)
+ if err != nil {
+ return os.NewSyscallError("PostQueuedCompletionStatus", err)
+ }
+ return nil
+}
+
+func (w *readDirChangesW) getDir(pathname string) (dir string, err error) {
+ attr, err := windows.GetFileAttributes(windows.StringToUTF16Ptr(pathname))
+ if err != nil {
+ return "", os.NewSyscallError("GetFileAttributes", err)
+ }
+ if attr&windows.FILE_ATTRIBUTE_DIRECTORY != 0 {
+ dir = pathname
+ } else {
+ dir, _ = filepath.Split(pathname)
+ dir = filepath.Clean(dir)
+ }
+ return
+}
+
+func (w *readDirChangesW) getIno(path string) (ino *inode, err error) {
+ h, err := windows.CreateFile(windows.StringToUTF16Ptr(path),
+ windows.FILE_LIST_DIRECTORY,
+ windows.FILE_SHARE_READ|windows.FILE_SHARE_WRITE|windows.FILE_SHARE_DELETE,
+ nil, windows.OPEN_EXISTING,
+ windows.FILE_FLAG_BACKUP_SEMANTICS|windows.FILE_FLAG_OVERLAPPED, 0)
+ if err != nil {
+ return nil, os.NewSyscallError("CreateFile", err)
+ }
+
+ var fi windows.ByHandleFileInformation
+ err = windows.GetFileInformationByHandle(h, &fi)
+ if err != nil {
+ windows.CloseHandle(h)
+ return nil, os.NewSyscallError("GetFileInformationByHandle", err)
+ }
+ ino = &inode{
+ handle: h,
+ volume: fi.VolumeSerialNumber,
+ index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow),
+ }
+ return ino, nil
+}
+
+// Must run within the I/O thread.
+func (m watchMap) get(ino *inode) *watch {
+ if i := m[ino.volume]; i != nil {
+ return i[ino.index]
+ }
+ return nil
+}
+
+// Must run within the I/O thread.
+func (m watchMap) set(ino *inode, watch *watch) {
+ i := m[ino.volume]
+ if i == nil {
+ i = make(indexMap)
+ m[ino.volume] = i
+ }
+ i[ino.index] = watch
+}
+
+// Must run within the I/O thread.
+func (w *readDirChangesW) addWatch(pathname string, flags uint64, bufsize int) error {
+ pathname, recurse := recursivePath(pathname)
+
+ dir, err := w.getDir(pathname)
+ if err != nil {
+ return err
+ }
+
+ ino, err := w.getIno(dir)
+ if err != nil {
+ return err
+ }
+ w.mu.Lock()
+ watchEntry := w.watches.get(ino)
+ w.mu.Unlock()
+ if watchEntry == nil {
+ _, err := windows.CreateIoCompletionPort(ino.handle, w.port, 0, 0)
+ if err != nil {
+ windows.CloseHandle(ino.handle)
+ return os.NewSyscallError("CreateIoCompletionPort", err)
+ }
+ watchEntry = &watch{
+ ino: ino,
+ path: dir,
+ names: make(map[string]uint64),
+ recurse: recurse,
+ buf: make([]byte, bufsize),
+ }
+ w.mu.Lock()
+ w.watches.set(ino, watchEntry)
+ w.mu.Unlock()
+ flags |= provisional
+ } else {
+ windows.CloseHandle(ino.handle)
+ }
+ if pathname == dir {
+ watchEntry.mask |= flags
+ } else {
+ watchEntry.names[filepath.Base(pathname)] |= flags
+ }
+
+ err = w.startRead(watchEntry)
+ if err != nil {
+ return err
+ }
+
+ if pathname == dir {
+ watchEntry.mask &= ^provisional
+ } else {
+ watchEntry.names[filepath.Base(pathname)] &= ^provisional
+ }
+ return nil
+}
+
+// Must run within the I/O thread.
+func (w *readDirChangesW) remWatch(pathname string) error {
+ pathname, recurse := recursivePath(pathname)
+
+ dir, err := w.getDir(pathname)
+ if err != nil {
+ return err
+ }
+ ino, err := w.getIno(dir)
+ if err != nil {
+ return err
+ }
+
+ w.mu.Lock()
+ watch := w.watches.get(ino)
+ w.mu.Unlock()
+
+ if recurse && !watch.recurse {
+ return fmt.Errorf("can't use \\... with non-recursive watch %q", pathname)
+ }
+
+ err = windows.CloseHandle(ino.handle)
+ if err != nil {
+ w.sendError(os.NewSyscallError("CloseHandle", err))
+ }
+ if watch == nil {
+ return fmt.Errorf("%w: %s", ErrNonExistentWatch, pathname)
+ }
+ if pathname == dir {
+ w.sendEvent(watch.path, "", watch.mask&sysFSIGNORED)
+ watch.mask = 0
+ } else {
+ name := filepath.Base(pathname)
+ w.sendEvent(filepath.Join(watch.path, name), "", watch.names[name]&sysFSIGNORED)
+ delete(watch.names, name)
+ }
+
+ return w.startRead(watch)
+}
+
+// Must run within the I/O thread.
+func (w *readDirChangesW) deleteWatch(watch *watch) {
+ for name, mask := range watch.names {
+ if mask&provisional == 0 {
+ w.sendEvent(filepath.Join(watch.path, name), "", mask&sysFSIGNORED)
+ }
+ delete(watch.names, name)
+ }
+ if watch.mask != 0 {
+ if watch.mask&provisional == 0 {
+ w.sendEvent(watch.path, "", watch.mask&sysFSIGNORED)
+ }
+ watch.mask = 0
+ }
+}
+
+// Must run within the I/O thread.
+func (w *readDirChangesW) startRead(watch *watch) error {
+ err := windows.CancelIo(watch.ino.handle)
+ if err != nil {
+ w.sendError(os.NewSyscallError("CancelIo", err))
+ w.deleteWatch(watch)
+ }
+ mask := w.toWindowsFlags(watch.mask)
+ for _, m := range watch.names {
+ mask |= w.toWindowsFlags(m)
+ }
+ if mask == 0 {
+ err := windows.CloseHandle(watch.ino.handle)
+ if err != nil {
+ w.sendError(os.NewSyscallError("CloseHandle", err))
+ }
+ w.mu.Lock()
+ delete(w.watches[watch.ino.volume], watch.ino.index)
+ w.mu.Unlock()
+ return nil
+ }
+
+ // We need to pass the array, rather than the slice.
+ hdr := (*reflect.SliceHeader)(unsafe.Pointer(&watch.buf))
+ rdErr := windows.ReadDirectoryChanges(watch.ino.handle,
+ (*byte)(unsafe.Pointer(hdr.Data)), uint32(hdr.Len),
+ watch.recurse, mask, nil, &watch.ov, 0)
+ if rdErr != nil {
+ err := os.NewSyscallError("ReadDirectoryChanges", rdErr)
+ if rdErr == windows.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 {
+ // Watched directory was probably removed
+ w.sendEvent(watch.path, "", watch.mask&sysFSDELETESELF)
+ err = nil
+ }
+ w.deleteWatch(watch)
+ w.startRead(watch)
+ return err
+ }
+ return nil
+}
+
+// readEvents reads from the I/O completion port, converts the
+// received events into Event objects and sends them via the Events channel.
+// Entry point to the I/O thread.
+func (w *readDirChangesW) readEvents() {
+ var (
+ n uint32
+ key uintptr
+ ov *windows.Overlapped
+ )
+ runtime.LockOSThread()
+
+ for {
+ // This error is handled after the watch == nil check below.
+ qErr := windows.GetQueuedCompletionStatus(w.port, &n, &key, &ov, windows.INFINITE)
+
+ watch := (*watch)(unsafe.Pointer(ov))
+ if watch == nil {
+ select {
+ case ch := <-w.quit:
+ w.mu.Lock()
+ var indexes []indexMap
+ for _, index := range w.watches {
+ indexes = append(indexes, index)
+ }
+ w.mu.Unlock()
+ for _, index := range indexes {
+ for _, watch := range index {
+ w.deleteWatch(watch)
+ w.startRead(watch)
+ }
+ }
+
+ err := windows.CloseHandle(w.port)
+ if err != nil {
+ err = os.NewSyscallError("CloseHandle", err)
+ }
+ close(w.Events)
+ close(w.Errors)
+ ch <- err
+ return
+ case in := <-w.input:
+ switch in.op {
+ case opAddWatch:
+ in.reply <- w.addWatch(in.path, uint64(in.flags), in.bufsize)
+ case opRemoveWatch:
+ in.reply <- w.remWatch(in.path)
+ }
+ default:
+ }
+ continue
+ }
+
+ switch qErr {
+ case nil:
+ // No error
+ case windows.ERROR_MORE_DATA:
+ if watch == nil {
+ w.sendError(errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer"))
+ } else {
+ // The i/o succeeded but the buffer is full.
+ // In theory we should be building up a full packet.
+ // In practice we can get away with just carrying on.
+ n = uint32(unsafe.Sizeof(watch.buf))
+ }
+ case windows.ERROR_ACCESS_DENIED:
+ // Watched directory was probably removed
+ w.sendEvent(watch.path, "", watch.mask&sysFSDELETESELF)
+ w.deleteWatch(watch)
+ w.startRead(watch)
+ continue
+ case windows.ERROR_OPERATION_ABORTED:
+ // CancelIo was called on this handle
+ continue
+ default:
+ w.sendError(os.NewSyscallError("GetQueuedCompletionPort", qErr))
+ continue
+ }
+
+ var offset uint32
+ for {
+ if n == 0 {
+ w.sendError(ErrEventOverflow)
+ break
+ }
+
+ // Point "raw" to the event in the buffer
+ raw := (*windows.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset]))
+
+ // Create a buf that is the size of the path name
+ size := int(raw.FileNameLength / 2)
+ var buf []uint16
+ // TODO: Use unsafe.Slice in Go 1.17; https://stackoverflow.com/questions/51187973
+ sh := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
+ sh.Data = uintptr(unsafe.Pointer(&raw.FileName))
+ sh.Len = size
+ sh.Cap = size
+ name := windows.UTF16ToString(buf)
+ fullname := filepath.Join(watch.path, name)
+
+ if debug {
+ internal.Debug(fullname, raw.Action)
+ }
+
+ var mask uint64
+ switch raw.Action {
+ case windows.FILE_ACTION_REMOVED:
+ mask = sysFSDELETESELF
+ case windows.FILE_ACTION_MODIFIED:
+ mask = sysFSMODIFY
+ case windows.FILE_ACTION_RENAMED_OLD_NAME:
+ watch.rename = name
+ case windows.FILE_ACTION_RENAMED_NEW_NAME:
+ // Update saved path of all sub-watches.
+ old := filepath.Join(watch.path, watch.rename)
+ w.mu.Lock()
+ for _, watchMap := range w.watches {
+ for _, ww := range watchMap {
+ if strings.HasPrefix(ww.path, old) {
+ ww.path = filepath.Join(fullname, strings.TrimPrefix(ww.path, old))
+ }
+ }
+ }
+ w.mu.Unlock()
+
+ if watch.names[watch.rename] != 0 {
+ watch.names[name] |= watch.names[watch.rename]
+ delete(watch.names, watch.rename)
+ mask = sysFSMOVESELF
+ }
+ }
+
+ if raw.Action != windows.FILE_ACTION_RENAMED_NEW_NAME {
+ w.sendEvent(fullname, "", watch.names[name]&mask)
+ }
+ if raw.Action == windows.FILE_ACTION_REMOVED {
+ w.sendEvent(fullname, "", watch.names[name]&sysFSIGNORED)
+ delete(watch.names, name)
+ }
+
+ if watch.rename != "" && raw.Action == windows.FILE_ACTION_RENAMED_NEW_NAME {
+ w.sendEvent(fullname, filepath.Join(watch.path, watch.rename), watch.mask&w.toFSnotifyFlags(raw.Action))
+ } else {
+ w.sendEvent(fullname, "", watch.mask&w.toFSnotifyFlags(raw.Action))
+ }
+
+ if raw.Action == windows.FILE_ACTION_RENAMED_NEW_NAME {
+ w.sendEvent(filepath.Join(watch.path, watch.rename), "", watch.names[name]&mask)
+ }
+
+ // Move to the next event in the buffer
+ if raw.NextEntryOffset == 0 {
+ break
+ }
+ offset += raw.NextEntryOffset
+
+ // Error!
+ if offset >= n {
+ //lint:ignore ST1005 Windows should be capitalized
+ w.sendError(errors.New("Windows system assumed buffer larger than it is, events have likely been missed"))
+ break
+ }
+ }
+
+ if err := w.startRead(watch); err != nil {
+ w.sendError(err)
+ }
+ }
+}
+
+func (w *readDirChangesW) toWindowsFlags(mask uint64) uint32 {
+ var m uint32
+ if mask&sysFSMODIFY != 0 {
+ m |= windows.FILE_NOTIFY_CHANGE_LAST_WRITE
+ }
+ if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 {
+ m |= windows.FILE_NOTIFY_CHANGE_FILE_NAME | windows.FILE_NOTIFY_CHANGE_DIR_NAME
+ }
+ return m
+}
+
+func (w *readDirChangesW) toFSnotifyFlags(action uint32) uint64 {
+ switch action {
+ case windows.FILE_ACTION_ADDED:
+ return sysFSCREATE
+ case windows.FILE_ACTION_REMOVED:
+ return sysFSDELETE
+ case windows.FILE_ACTION_MODIFIED:
+ return sysFSMODIFY
+ case windows.FILE_ACTION_RENAMED_OLD_NAME:
+ return sysFSMOVEDFROM
+ case windows.FILE_ACTION_RENAMED_NEW_NAME:
+ return sysFSMOVEDTO
+ }
+ return 0
+}
+
+func (w *readDirChangesW) xSupports(op Op) bool {
+ if op.Has(xUnportableOpen) || op.Has(xUnportableRead) ||
+ op.Has(xUnportableCloseWrite) || op.Has(xUnportableCloseRead) {
+ return false
+ }
+ return true
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/fsnotify.go
new file mode 100644
index 0000000..0760efe
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/fsnotify.go
@@ -0,0 +1,494 @@
+// Package fsnotify provides a cross-platform interface for file system
+// notifications.
+//
+// Currently supported systems:
+//
+// - Linux via inotify
+// - BSD, macOS via kqueue
+// - Windows via ReadDirectoryChangesW
+// - illumos via FEN
+//
+// # FSNOTIFY_DEBUG
+//
+// Set the FSNOTIFY_DEBUG environment variable to "1" to print debug messages to
+// stderr. This can be useful to track down some problems, especially in cases
+// where fsnotify is used as an indirect dependency.
+//
+// Every event will be printed as soon as there's something useful to print,
+// with as little processing from fsnotify.
+//
+// Example output:
+//
+// FSNOTIFY_DEBUG: 11:34:23.633087586 256:IN_CREATE → "/tmp/file-1"
+// FSNOTIFY_DEBUG: 11:34:23.633202319 4:IN_ATTRIB → "/tmp/file-1"
+// FSNOTIFY_DEBUG: 11:34:28.989728764 512:IN_DELETE → "/tmp/file-1"
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// Watcher watches a set of paths, delivering events on a channel.
+//
+// A watcher should not be copied (e.g. pass it by pointer, rather than by
+// value).
+//
+// # Linux notes
+//
+// When a file is removed a Remove event won't be emitted until all file
+// descriptors are closed, and deletes will always emit a Chmod. For example:
+//
+// fp := os.Open("file")
+// os.Remove("file") // Triggers Chmod
+// fp.Close() // Triggers Remove
+//
+// This is the event that inotify sends, so not much can be changed about this.
+//
+// The fs.inotify.max_user_watches sysctl variable specifies the upper limit
+// for the number of watches per user, and fs.inotify.max_user_instances
+// specifies the maximum number of inotify instances per user. Every Watcher you
+// create is an "instance", and every path you add is a "watch".
+//
+// These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and
+// /proc/sys/fs/inotify/max_user_instances
+//
+// To increase them you can use sysctl or write the value to the /proc file:
+//
+// # Default values on Linux 5.18
+// sysctl fs.inotify.max_user_watches=124983
+// sysctl fs.inotify.max_user_instances=128
+//
+// To make the changes persist on reboot edit /etc/sysctl.conf or
+// /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check
+// your distro's documentation):
+//
+// fs.inotify.max_user_watches=124983
+// fs.inotify.max_user_instances=128
+//
+// Reaching the limit will result in a "no space left on device" or "too many open
+// files" error.
+//
+// # kqueue notes (macOS, BSD)
+//
+// kqueue requires opening a file descriptor for every file that's being watched;
+// so if you're watching a directory with five files then that's six file
+// descriptors. You will run in to your system's "max open files" limit faster on
+// these platforms.
+//
+// The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to
+// control the maximum number of open files, as well as /etc/login.conf on BSD
+// systems.
+//
+// # Windows notes
+//
+// Paths can be added as "C:\\path\\to\\dir", but forward slashes
+// ("C:/path/to/dir") will also work.
+//
+// When a watched directory is removed it will always send an event for the
+// directory itself, but may not send events for all files in that directory.
+// Sometimes it will send events for all files, sometimes it will send no
+// events, and often only for some files.
+//
+// The default ReadDirectoryChangesW() buffer size is 64K, which is the largest
+// value that is guaranteed to work with SMB filesystems. If you have many
+// events in quick succession this may not be enough, and you will have to use
+// [WithBufferSize] to increase the value.
+type Watcher struct {
+ b backend
+
+ // Events sends the filesystem change events.
+ //
+ // fsnotify can send the following events; a "path" here can refer to a
+ // file, directory, symbolic link, or special file like a FIFO.
+ //
+ // fsnotify.Create A new path was created; this may be followed by one
+ // or more Write events if data also gets written to a
+ // file.
+ //
+ // fsnotify.Remove A path was removed.
+ //
+ // fsnotify.Rename A path was renamed. A rename is always sent with the
+ // old path as Event.Name, and a Create event will be
+ // sent with the new name. Renames are only sent for
+ // paths that are currently watched; e.g. moving an
+ // unmonitored file into a monitored directory will
+ // show up as just a Create. Similarly, renaming a file
+ // to outside a monitored directory will show up as
+ // only a Rename.
+ //
+ // fsnotify.Write A file or named pipe was written to. A Truncate will
+ // also trigger a Write. A single "write action"
+ // initiated by the user may show up as one or multiple
+ // writes, depending on when the system syncs things to
+ // disk. For example when compiling a large Go program
+ // you may get hundreds of Write events, and you may
+ // want to wait until you've stopped receiving them
+ // (see the dedup example in cmd/fsnotify).
+ //
+ // Some systems may send Write event for directories
+ // when the directory content changes.
+ //
+ // fsnotify.Chmod Attributes were changed. On Linux this is also sent
+ // when a file is removed (or more accurately, when a
+ // link to an inode is removed). On kqueue it's sent
+ // when a file is truncated. On Windows it's never
+ // sent.
+ Events chan Event
+
+ // Errors sends any errors.
+ Errors chan error
+}
+
+// Event represents a file system notification.
+type Event struct {
+ // Path to the file or directory.
+ //
+ // Paths are relative to the input; for example with Add("dir") the Name
+ // will be set to "dir/file" if you create that file, but if you use
+ // Add("/path/to/dir") it will be "/path/to/dir/file".
+ Name string
+
+ // File operation that triggered the event.
+ //
+ // This is a bitmask and some systems may send multiple operations at once.
+ // Use the Event.Has() method instead of comparing with ==.
+ Op Op
+
+ // Create events will have this set to the old path if it's a rename. This
+ // only works when both the source and destination are watched. It's not
+ // reliable when watching individual files, only directories.
+ //
+ // For example "mv /tmp/file /tmp/rename" will emit:
+ //
+ // Event{Op: Rename, Name: "/tmp/file"}
+ // Event{Op: Create, Name: "/tmp/rename", RenamedFrom: "/tmp/file"}
+ renamedFrom string
+}
+
+// Op describes a set of file operations.
+type Op uint32
+
+// The operations fsnotify can trigger; see the documentation on [Watcher] for a
+// full description, and check them with [Event.Has].
+const (
+ // A new pathname was created.
+ Create Op = 1 << iota
+
+ // The pathname was written to; this does *not* mean the write has finished,
+ // and a write can be followed by more writes.
+ Write
+
+ // The path was removed; any watches on it will be removed. Some "remove"
+ // operations may trigger a Rename if the file is actually moved (for
+ // example "remove to trash" is often a rename).
+ Remove
+
+ // The path was renamed to something else; any watches on it will be
+ // removed.
+ Rename
+
+ // File attributes were changed.
+ //
+ // It's generally not recommended to take action on this event, as it may
+ // get triggered very frequently by some software. For example, Spotlight
+ // indexing on macOS, anti-virus software, backup software, etc.
+ Chmod
+
+ // File descriptor was opened.
+ //
+ // Only works on Linux and FreeBSD.
+ xUnportableOpen
+
+ // File was read from.
+ //
+ // Only works on Linux and FreeBSD.
+ xUnportableRead
+
+ // File opened for writing was closed.
+ //
+ // Only works on Linux and FreeBSD.
+ //
+ // The advantage of using this over Write is that it's more reliable than
+ // waiting for Write events to stop. It's also faster (if you're not
+ // listening to Write events): copying a file of a few GB can easily
+ // generate tens of thousands of Write events in a short span of time.
+ xUnportableCloseWrite
+
+ // File opened for reading was closed.
+ //
+ // Only works on Linux and FreeBSD.
+ xUnportableCloseRead
+)
+
+var (
+ // ErrNonExistentWatch is used when Remove() is called on a path that's not
+ // added.
+ ErrNonExistentWatch = errors.New("fsnotify: can't remove non-existent watch")
+
+ // ErrClosed is used when trying to operate on a closed Watcher.
+ ErrClosed = errors.New("fsnotify: watcher already closed")
+
+ // ErrEventOverflow is reported from the Errors channel when there are too
+ // many events:
+ //
+ // - inotify: inotify returns IN_Q_OVERFLOW – because there are too
+ // many queued events (the fs.inotify.max_queued_events
+ // sysctl can be used to increase this).
+ // - windows: The buffer size is too small; WithBufferSize() can be used to increase it.
+ // - kqueue, fen: Not used.
+ ErrEventOverflow = errors.New("fsnotify: queue or buffer overflow")
+
+ // ErrUnsupported is returned by AddWith() when WithOps() specified an
+ // Unportable event that's not supported on this platform.
+ xErrUnsupported = errors.New("fsnotify: not supported with this backend")
+)
+
+// NewWatcher creates a new Watcher.
+func NewWatcher() (*Watcher, error) {
+ ev, errs := make(chan Event), make(chan error)
+ b, err := newBackend(ev, errs)
+ if err != nil {
+ return nil, err
+ }
+ return &Watcher{b: b, Events: ev, Errors: errs}, nil
+}
+
+// NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events
+// channel.
+//
+// The main use case for this is situations with a very large number of events
+// where the kernel buffer size can't be increased (e.g. due to lack of
+// permissions). An unbuffered Watcher will perform better for almost all use
+// cases, and whenever possible you will be better off increasing the kernel
+// buffers instead of adding a large userspace buffer.
+func NewBufferedWatcher(sz uint) (*Watcher, error) {
+ ev, errs := make(chan Event), make(chan error)
+ b, err := newBufferedBackend(sz, ev, errs)
+ if err != nil {
+ return nil, err
+ }
+ return &Watcher{b: b, Events: ev, Errors: errs}, nil
+}
+
+// Add starts monitoring the path for changes.
+//
+// A path can only be watched once; watching it more than once is a no-op and will
+// not return an error. Paths that do not yet exist on the filesystem cannot be
+// watched.
+//
+// A watch will be automatically removed if the watched path is deleted or
+// renamed. The exception is the Windows backend, which doesn't remove the
+// watcher on renames.
+//
+// Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special
+// filesystems (/proc, /sys, etc.) generally don't work.
+//
+// Returns [ErrClosed] if [Watcher.Close] was called.
+//
+// See [Watcher.AddWith] for a version that allows adding options.
+//
+// # Watching directories
+//
+// All files in a directory are monitored, including new files that are created
+// after the watcher is started. Subdirectories are not watched (i.e. it's
+// non-recursive).
+//
+// # Watching files
+//
+// Watching individual files (rather than directories) is generally not
+// recommended as many programs (especially editors) update files atomically: it
+// will write to a temporary file which is then moved to destination,
+// overwriting the original (or some variant thereof). The watcher on the
+// original file is now lost, as that no longer exists.
+//
+// The upshot of this is that a power failure or crash won't leave a
+// half-written file.
+//
+// Watch the parent directory and use Event.Name to filter out files you're not
+// interested in. There is an example of this in cmd/fsnotify/file.go.
+func (w *Watcher) Add(path string) error { return w.b.Add(path) }
+
+// AddWith is like [Watcher.Add], but allows adding options. When using Add()
+// the defaults described below are used.
+//
+// Possible options are:
+//
+// - [WithBufferSize] sets the buffer size for the Windows backend; no-op on
+// other platforms. The default is 64K (65536 bytes).
+func (w *Watcher) AddWith(path string, opts ...addOpt) error { return w.b.AddWith(path, opts...) }
+
+// Remove stops monitoring the path for changes.
+//
+// Directories are always removed non-recursively. For example, if you added
+// /tmp/dir and /tmp/dir/subdir then you will need to remove both.
+//
+// Removing a path that has not yet been added returns [ErrNonExistentWatch].
+//
+// Returns nil if [Watcher.Close] was called.
+func (w *Watcher) Remove(path string) error { return w.b.Remove(path) }
+
+// Close removes all watches and closes the Events channel.
+func (w *Watcher) Close() error { return w.b.Close() }
+
+// WatchList returns all paths explicitly added with [Watcher.Add] (and are not
+// yet removed).
+//
+// Returns nil if [Watcher.Close] was called.
+func (w *Watcher) WatchList() []string { return w.b.WatchList() }
+
+// Supports reports if all the listed operations are supported by this platform.
+//
+// Create, Write, Remove, Rename, and Chmod are always supported. It can only
+// return false for an Op starting with Unportable.
+func (w *Watcher) xSupports(op Op) bool { return w.b.xSupports(op) }
+
+func (o Op) String() string {
+ var b strings.Builder
+ if o.Has(Create) {
+ b.WriteString("|CREATE")
+ }
+ if o.Has(Remove) {
+ b.WriteString("|REMOVE")
+ }
+ if o.Has(Write) {
+ b.WriteString("|WRITE")
+ }
+ if o.Has(xUnportableOpen) {
+ b.WriteString("|OPEN")
+ }
+ if o.Has(xUnportableRead) {
+ b.WriteString("|READ")
+ }
+ if o.Has(xUnportableCloseWrite) {
+ b.WriteString("|CLOSE_WRITE")
+ }
+ if o.Has(xUnportableCloseRead) {
+ b.WriteString("|CLOSE_READ")
+ }
+ if o.Has(Rename) {
+ b.WriteString("|RENAME")
+ }
+ if o.Has(Chmod) {
+ b.WriteString("|CHMOD")
+ }
+ if b.Len() == 0 {
+ return "[no events]"
+ }
+ return b.String()[1:]
+}
+
+// Has reports if this operation has the given operation.
+func (o Op) Has(h Op) bool { return o&h != 0 }
+
+// Has reports if this event has the given operation.
+func (e Event) Has(op Op) bool { return e.Op.Has(op) }
+
+// String returns a string representation of the event with their path.
+func (e Event) String() string {
+ if e.renamedFrom != "" {
+ return fmt.Sprintf("%-13s %q ← %q", e.Op.String(), e.Name, e.renamedFrom)
+ }
+ return fmt.Sprintf("%-13s %q", e.Op.String(), e.Name)
+}
+
+type (
+ backend interface {
+ Add(string) error
+ AddWith(string, ...addOpt) error
+ Remove(string) error
+ WatchList() []string
+ Close() error
+ xSupports(Op) bool
+ }
+ addOpt func(opt *withOpts)
+ withOpts struct {
+ bufsize int
+ op Op
+ noFollow bool
+ sendCreate bool
+ }
+)
+
+var debug = func() bool {
+ // Check for exactly "1" (rather than mere existence) so we can add
+ // options/flags in the future. I don't know if we ever want that, but it's
+ // nice to leave the option open.
+ return os.Getenv("FSNOTIFY_DEBUG") == "1"
+}()
+
+var defaultOpts = withOpts{
+ bufsize: 65536, // 64K
+ op: Create | Write | Remove | Rename | Chmod,
+}
+
+func getOptions(opts ...addOpt) withOpts {
+ with := defaultOpts
+ for _, o := range opts {
+ if o != nil {
+ o(&with)
+ }
+ }
+ return with
+}
+
+// WithBufferSize sets the [ReadDirectoryChangesW] buffer size.
+//
+// This only has effect on Windows systems, and is a no-op for other backends.
+//
+// The default value is 64K (65536 bytes) which is the highest value that works
+// on all filesystems and should be enough for most applications, but if you
+// have a large burst of events it may not be enough. You can increase it if
+// you're hitting "queue or buffer overflow" errors ([ErrEventOverflow]).
+//
+// [ReadDirectoryChangesW]: https://learn.microsoft.com/en-gb/windows/win32/api/winbase/nf-winbase-readdirectorychangesw
+func WithBufferSize(bytes int) addOpt {
+ return func(opt *withOpts) { opt.bufsize = bytes }
+}
+
+// WithOps sets which operations to listen for. The default is [Create],
+// [Write], [Remove], [Rename], and [Chmod].
+//
+// Excluding operations you're not interested in can save quite a bit of CPU
+// time; in some use cases there may be hundreds of thousands of useless Write
+// or Chmod operations per second.
+//
+// This can also be used to add unportable operations not supported by all
+// platforms; unportable operations all start with "Unportable":
+// [UnportableOpen], [UnportableRead], [UnportableCloseWrite], and
+// [UnportableCloseRead].
+//
+// AddWith returns an error when using an unportable operation that's not
+// supported. Use [Watcher.Support] to check for support.
+func withOps(op Op) addOpt {
+ return func(opt *withOpts) { opt.op = op }
+}
+
+// WithNoFollow disables following symlinks, so the symlinks themselves are
+// watched.
+func withNoFollow() addOpt {
+ return func(opt *withOpts) { opt.noFollow = true }
+}
+
+// "Internal" option for recursive watches on inotify.
+func withCreate() addOpt {
+ return func(opt *withOpts) { opt.sendCreate = true }
+}
+
+var enableRecurse = false
+
+// Check if this path is recursive (ends with "/..." or "\..."), and return the
+// path with the /... stripped.
+func recursivePath(path string) (string, bool) {
+ path = filepath.Clean(path)
+ if !enableRecurse { // Only enabled in tests for now.
+ return path, false
+ }
+ if filepath.Base(path) == "..." {
+ return filepath.Dir(path), true
+ }
+ return path, false
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/darwin.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/darwin.go
new file mode 100644
index 0000000..b0eab10
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/darwin.go
@@ -0,0 +1,39 @@
+//go:build darwin
+
+package internal
+
+import (
+ "syscall"
+
+ "golang.org/x/sys/unix"
+)
+
+var (
+ SyscallEACCES = syscall.EACCES
+ UnixEACCES = unix.EACCES
+)
+
+var maxfiles uint64
+
+// Go 1.19 will do this automatically: https://go-review.googlesource.com/c/go/+/393354/
+func SetRlimit() {
+ var l syscall.Rlimit
+ err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &l)
+ if err == nil && l.Cur != l.Max {
+ l.Cur = l.Max
+ syscall.Setrlimit(syscall.RLIMIT_NOFILE, &l)
+ }
+ maxfiles = l.Cur
+
+ if n, err := syscall.SysctlUint32("kern.maxfiles"); err == nil && uint64(n) < maxfiles {
+ maxfiles = uint64(n)
+ }
+
+ if n, err := syscall.SysctlUint32("kern.maxfilesperproc"); err == nil && uint64(n) < maxfiles {
+ maxfiles = uint64(n)
+ }
+}
+
+func Maxfiles() uint64 { return maxfiles }
+func Mkfifo(path string, mode uint32) error { return unix.Mkfifo(path, mode) }
+func Mknod(path string, mode uint32, dev int) error { return unix.Mknod(path, mode, dev) }
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go
new file mode 100644
index 0000000..928319f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_darwin.go
@@ -0,0 +1,57 @@
+package internal
+
+import "golang.org/x/sys/unix"
+
+var names = []struct {
+ n string
+ m uint32
+}{
+ {"NOTE_ABSOLUTE", unix.NOTE_ABSOLUTE},
+ {"NOTE_ATTRIB", unix.NOTE_ATTRIB},
+ {"NOTE_BACKGROUND", unix.NOTE_BACKGROUND},
+ {"NOTE_CHILD", unix.NOTE_CHILD},
+ {"NOTE_CRITICAL", unix.NOTE_CRITICAL},
+ {"NOTE_DELETE", unix.NOTE_DELETE},
+ {"NOTE_EXEC", unix.NOTE_EXEC},
+ {"NOTE_EXIT", unix.NOTE_EXIT},
+ {"NOTE_EXITSTATUS", unix.NOTE_EXITSTATUS},
+ {"NOTE_EXIT_CSERROR", unix.NOTE_EXIT_CSERROR},
+ {"NOTE_EXIT_DECRYPTFAIL", unix.NOTE_EXIT_DECRYPTFAIL},
+ {"NOTE_EXIT_DETAIL", unix.NOTE_EXIT_DETAIL},
+ {"NOTE_EXIT_DETAIL_MASK", unix.NOTE_EXIT_DETAIL_MASK},
+ {"NOTE_EXIT_MEMORY", unix.NOTE_EXIT_MEMORY},
+ {"NOTE_EXIT_REPARENTED", unix.NOTE_EXIT_REPARENTED},
+ {"NOTE_EXTEND", unix.NOTE_EXTEND},
+ {"NOTE_FFAND", unix.NOTE_FFAND},
+ {"NOTE_FFCOPY", unix.NOTE_FFCOPY},
+ {"NOTE_FFCTRLMASK", unix.NOTE_FFCTRLMASK},
+ {"NOTE_FFLAGSMASK", unix.NOTE_FFLAGSMASK},
+ {"NOTE_FFNOP", unix.NOTE_FFNOP},
+ {"NOTE_FFOR", unix.NOTE_FFOR},
+ {"NOTE_FORK", unix.NOTE_FORK},
+ {"NOTE_FUNLOCK", unix.NOTE_FUNLOCK},
+ {"NOTE_LEEWAY", unix.NOTE_LEEWAY},
+ {"NOTE_LINK", unix.NOTE_LINK},
+ {"NOTE_LOWAT", unix.NOTE_LOWAT},
+ {"NOTE_MACHTIME", unix.NOTE_MACHTIME},
+ {"NOTE_MACH_CONTINUOUS_TIME", unix.NOTE_MACH_CONTINUOUS_TIME},
+ {"NOTE_NONE", unix.NOTE_NONE},
+ {"NOTE_NSECONDS", unix.NOTE_NSECONDS},
+ {"NOTE_OOB", unix.NOTE_OOB},
+ //{"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK}, -0x100000 (?!)
+ {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
+ {"NOTE_REAP", unix.NOTE_REAP},
+ {"NOTE_RENAME", unix.NOTE_RENAME},
+ {"NOTE_REVOKE", unix.NOTE_REVOKE},
+ {"NOTE_SECONDS", unix.NOTE_SECONDS},
+ {"NOTE_SIGNAL", unix.NOTE_SIGNAL},
+ {"NOTE_TRACK", unix.NOTE_TRACK},
+ {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
+ {"NOTE_TRIGGER", unix.NOTE_TRIGGER},
+ {"NOTE_USECONDS", unix.NOTE_USECONDS},
+ {"NOTE_VM_ERROR", unix.NOTE_VM_ERROR},
+ {"NOTE_VM_PRESSURE", unix.NOTE_VM_PRESSURE},
+ {"NOTE_VM_PRESSURE_SUDDEN_TERMINATE", unix.NOTE_VM_PRESSURE_SUDDEN_TERMINATE},
+ {"NOTE_VM_PRESSURE_TERMINATE", unix.NOTE_VM_PRESSURE_TERMINATE},
+ {"NOTE_WRITE", unix.NOTE_WRITE},
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go
new file mode 100644
index 0000000..3186b0c
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_dragonfly.go
@@ -0,0 +1,33 @@
+package internal
+
+import "golang.org/x/sys/unix"
+
+var names = []struct {
+ n string
+ m uint32
+}{
+ {"NOTE_ATTRIB", unix.NOTE_ATTRIB},
+ {"NOTE_CHILD", unix.NOTE_CHILD},
+ {"NOTE_DELETE", unix.NOTE_DELETE},
+ {"NOTE_EXEC", unix.NOTE_EXEC},
+ {"NOTE_EXIT", unix.NOTE_EXIT},
+ {"NOTE_EXTEND", unix.NOTE_EXTEND},
+ {"NOTE_FFAND", unix.NOTE_FFAND},
+ {"NOTE_FFCOPY", unix.NOTE_FFCOPY},
+ {"NOTE_FFCTRLMASK", unix.NOTE_FFCTRLMASK},
+ {"NOTE_FFLAGSMASK", unix.NOTE_FFLAGSMASK},
+ {"NOTE_FFNOP", unix.NOTE_FFNOP},
+ {"NOTE_FFOR", unix.NOTE_FFOR},
+ {"NOTE_FORK", unix.NOTE_FORK},
+ {"NOTE_LINK", unix.NOTE_LINK},
+ {"NOTE_LOWAT", unix.NOTE_LOWAT},
+ {"NOTE_OOB", unix.NOTE_OOB},
+ {"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK},
+ {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
+ {"NOTE_RENAME", unix.NOTE_RENAME},
+ {"NOTE_REVOKE", unix.NOTE_REVOKE},
+ {"NOTE_TRACK", unix.NOTE_TRACK},
+ {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
+ {"NOTE_TRIGGER", unix.NOTE_TRIGGER},
+ {"NOTE_WRITE", unix.NOTE_WRITE},
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go
new file mode 100644
index 0000000..f69fdb9
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_freebsd.go
@@ -0,0 +1,42 @@
+package internal
+
+import "golang.org/x/sys/unix"
+
+var names = []struct {
+ n string
+ m uint32
+}{
+ {"NOTE_ABSTIME", unix.NOTE_ABSTIME},
+ {"NOTE_ATTRIB", unix.NOTE_ATTRIB},
+ {"NOTE_CHILD", unix.NOTE_CHILD},
+ {"NOTE_CLOSE", unix.NOTE_CLOSE},
+ {"NOTE_CLOSE_WRITE", unix.NOTE_CLOSE_WRITE},
+ {"NOTE_DELETE", unix.NOTE_DELETE},
+ {"NOTE_EXEC", unix.NOTE_EXEC},
+ {"NOTE_EXIT", unix.NOTE_EXIT},
+ {"NOTE_EXTEND", unix.NOTE_EXTEND},
+ {"NOTE_FFAND", unix.NOTE_FFAND},
+ {"NOTE_FFCOPY", unix.NOTE_FFCOPY},
+ {"NOTE_FFCTRLMASK", unix.NOTE_FFCTRLMASK},
+ {"NOTE_FFLAGSMASK", unix.NOTE_FFLAGSMASK},
+ {"NOTE_FFNOP", unix.NOTE_FFNOP},
+ {"NOTE_FFOR", unix.NOTE_FFOR},
+ {"NOTE_FILE_POLL", unix.NOTE_FILE_POLL},
+ {"NOTE_FORK", unix.NOTE_FORK},
+ {"NOTE_LINK", unix.NOTE_LINK},
+ {"NOTE_LOWAT", unix.NOTE_LOWAT},
+ {"NOTE_MSECONDS", unix.NOTE_MSECONDS},
+ {"NOTE_NSECONDS", unix.NOTE_NSECONDS},
+ {"NOTE_OPEN", unix.NOTE_OPEN},
+ {"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK},
+ {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
+ {"NOTE_READ", unix.NOTE_READ},
+ {"NOTE_RENAME", unix.NOTE_RENAME},
+ {"NOTE_REVOKE", unix.NOTE_REVOKE},
+ {"NOTE_SECONDS", unix.NOTE_SECONDS},
+ {"NOTE_TRACK", unix.NOTE_TRACK},
+ {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
+ {"NOTE_TRIGGER", unix.NOTE_TRIGGER},
+ {"NOTE_USECONDS", unix.NOTE_USECONDS},
+ {"NOTE_WRITE", unix.NOTE_WRITE},
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go
new file mode 100644
index 0000000..607e683
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_kqueue.go
@@ -0,0 +1,32 @@
+//go:build freebsd || openbsd || netbsd || dragonfly || darwin
+
+package internal
+
+import (
+ "fmt"
+ "os"
+ "strings"
+ "time"
+
+ "golang.org/x/sys/unix"
+)
+
+func Debug(name string, kevent *unix.Kevent_t) {
+ mask := uint32(kevent.Fflags)
+
+ var (
+ l []string
+ unknown = mask
+ )
+ for _, n := range names {
+ if mask&n.m == n.m {
+ l = append(l, n.n)
+ unknown ^= n.m
+ }
+ }
+ if unknown > 0 {
+ l = append(l, fmt.Sprintf("0x%x", unknown))
+ }
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s %10d:%-60s → %q\n",
+ time.Now().Format("15:04:05.000000000"), mask, strings.Join(l, " | "), name)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_linux.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_linux.go
new file mode 100644
index 0000000..35c734b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_linux.go
@@ -0,0 +1,56 @@
+package internal
+
+import (
+ "fmt"
+ "os"
+ "strings"
+ "time"
+
+ "golang.org/x/sys/unix"
+)
+
+func Debug(name string, mask, cookie uint32) {
+ names := []struct {
+ n string
+ m uint32
+ }{
+ {"IN_ACCESS", unix.IN_ACCESS},
+ {"IN_ATTRIB", unix.IN_ATTRIB},
+ {"IN_CLOSE", unix.IN_CLOSE},
+ {"IN_CLOSE_NOWRITE", unix.IN_CLOSE_NOWRITE},
+ {"IN_CLOSE_WRITE", unix.IN_CLOSE_WRITE},
+ {"IN_CREATE", unix.IN_CREATE},
+ {"IN_DELETE", unix.IN_DELETE},
+ {"IN_DELETE_SELF", unix.IN_DELETE_SELF},
+ {"IN_IGNORED", unix.IN_IGNORED},
+ {"IN_ISDIR", unix.IN_ISDIR},
+ {"IN_MODIFY", unix.IN_MODIFY},
+ {"IN_MOVE", unix.IN_MOVE},
+ {"IN_MOVED_FROM", unix.IN_MOVED_FROM},
+ {"IN_MOVED_TO", unix.IN_MOVED_TO},
+ {"IN_MOVE_SELF", unix.IN_MOVE_SELF},
+ {"IN_OPEN", unix.IN_OPEN},
+ {"IN_Q_OVERFLOW", unix.IN_Q_OVERFLOW},
+ {"IN_UNMOUNT", unix.IN_UNMOUNT},
+ }
+
+ var (
+ l []string
+ unknown = mask
+ )
+ for _, n := range names {
+ if mask&n.m == n.m {
+ l = append(l, n.n)
+ unknown ^= n.m
+ }
+ }
+ if unknown > 0 {
+ l = append(l, fmt.Sprintf("0x%x", unknown))
+ }
+ var c string
+ if cookie > 0 {
+ c = fmt.Sprintf("(cookie: %d) ", cookie)
+ }
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s %-30s → %s%q\n",
+ time.Now().Format("15:04:05.000000000"), strings.Join(l, "|"), c, name)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go
new file mode 100644
index 0000000..e5b3b6f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_netbsd.go
@@ -0,0 +1,25 @@
+package internal
+
+import "golang.org/x/sys/unix"
+
+var names = []struct {
+ n string
+ m uint32
+}{
+ {"NOTE_ATTRIB", unix.NOTE_ATTRIB},
+ {"NOTE_CHILD", unix.NOTE_CHILD},
+ {"NOTE_DELETE", unix.NOTE_DELETE},
+ {"NOTE_EXEC", unix.NOTE_EXEC},
+ {"NOTE_EXIT", unix.NOTE_EXIT},
+ {"NOTE_EXTEND", unix.NOTE_EXTEND},
+ {"NOTE_FORK", unix.NOTE_FORK},
+ {"NOTE_LINK", unix.NOTE_LINK},
+ {"NOTE_LOWAT", unix.NOTE_LOWAT},
+ {"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK},
+ {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
+ {"NOTE_RENAME", unix.NOTE_RENAME},
+ {"NOTE_REVOKE", unix.NOTE_REVOKE},
+ {"NOTE_TRACK", unix.NOTE_TRACK},
+ {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
+ {"NOTE_WRITE", unix.NOTE_WRITE},
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go
new file mode 100644
index 0000000..1dd455b
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_openbsd.go
@@ -0,0 +1,28 @@
+package internal
+
+import "golang.org/x/sys/unix"
+
+var names = []struct {
+ n string
+ m uint32
+}{
+ {"NOTE_ATTRIB", unix.NOTE_ATTRIB},
+ // {"NOTE_CHANGE", unix.NOTE_CHANGE}, // Not on 386?
+ {"NOTE_CHILD", unix.NOTE_CHILD},
+ {"NOTE_DELETE", unix.NOTE_DELETE},
+ {"NOTE_EOF", unix.NOTE_EOF},
+ {"NOTE_EXEC", unix.NOTE_EXEC},
+ {"NOTE_EXIT", unix.NOTE_EXIT},
+ {"NOTE_EXTEND", unix.NOTE_EXTEND},
+ {"NOTE_FORK", unix.NOTE_FORK},
+ {"NOTE_LINK", unix.NOTE_LINK},
+ {"NOTE_LOWAT", unix.NOTE_LOWAT},
+ {"NOTE_PCTRLMASK", unix.NOTE_PCTRLMASK},
+ {"NOTE_PDATAMASK", unix.NOTE_PDATAMASK},
+ {"NOTE_RENAME", unix.NOTE_RENAME},
+ {"NOTE_REVOKE", unix.NOTE_REVOKE},
+ {"NOTE_TRACK", unix.NOTE_TRACK},
+ {"NOTE_TRACKERR", unix.NOTE_TRACKERR},
+ {"NOTE_TRUNCATE", unix.NOTE_TRUNCATE},
+ {"NOTE_WRITE", unix.NOTE_WRITE},
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_solaris.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_solaris.go
new file mode 100644
index 0000000..f1b2e73
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_solaris.go
@@ -0,0 +1,45 @@
+package internal
+
+import (
+ "fmt"
+ "os"
+ "strings"
+ "time"
+
+ "golang.org/x/sys/unix"
+)
+
+func Debug(name string, mask int32) {
+ names := []struct {
+ n string
+ m int32
+ }{
+ {"FILE_ACCESS", unix.FILE_ACCESS},
+ {"FILE_MODIFIED", unix.FILE_MODIFIED},
+ {"FILE_ATTRIB", unix.FILE_ATTRIB},
+ {"FILE_TRUNC", unix.FILE_TRUNC},
+ {"FILE_NOFOLLOW", unix.FILE_NOFOLLOW},
+ {"FILE_DELETE", unix.FILE_DELETE},
+ {"FILE_RENAME_TO", unix.FILE_RENAME_TO},
+ {"FILE_RENAME_FROM", unix.FILE_RENAME_FROM},
+ {"UNMOUNTED", unix.UNMOUNTED},
+ {"MOUNTEDOVER", unix.MOUNTEDOVER},
+ {"FILE_EXCEPTION", unix.FILE_EXCEPTION},
+ }
+
+ var (
+ l []string
+ unknown = mask
+ )
+ for _, n := range names {
+ if mask&n.m == n.m {
+ l = append(l, n.n)
+ unknown ^= n.m
+ }
+ }
+ if unknown > 0 {
+ l = append(l, fmt.Sprintf("0x%x", unknown))
+ }
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s %10d:%-30s → %q\n",
+ time.Now().Format("15:04:05.000000000"), mask, strings.Join(l, " | "), name)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_windows.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_windows.go
new file mode 100644
index 0000000..52bf4ce
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/debug_windows.go
@@ -0,0 +1,40 @@
+package internal
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "golang.org/x/sys/windows"
+)
+
+func Debug(name string, mask uint32) {
+ names := []struct {
+ n string
+ m uint32
+ }{
+ {"FILE_ACTION_ADDED", windows.FILE_ACTION_ADDED},
+ {"FILE_ACTION_REMOVED", windows.FILE_ACTION_REMOVED},
+ {"FILE_ACTION_MODIFIED", windows.FILE_ACTION_MODIFIED},
+ {"FILE_ACTION_RENAMED_OLD_NAME", windows.FILE_ACTION_RENAMED_OLD_NAME},
+ {"FILE_ACTION_RENAMED_NEW_NAME", windows.FILE_ACTION_RENAMED_NEW_NAME},
+ }
+
+ var (
+ l []string
+ unknown = mask
+ )
+ for _, n := range names {
+ if mask&n.m == n.m {
+ l = append(l, n.n)
+ unknown ^= n.m
+ }
+ }
+ if unknown > 0 {
+ l = append(l, fmt.Sprintf("0x%x", unknown))
+ }
+ fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s %-65s → %q\n",
+ time.Now().Format("15:04:05.000000000"), strings.Join(l, " | "), filepath.ToSlash(name))
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go
new file mode 100644
index 0000000..547df1d
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go
@@ -0,0 +1,31 @@
+//go:build freebsd
+
+package internal
+
+import (
+ "syscall"
+
+ "golang.org/x/sys/unix"
+)
+
+var (
+ SyscallEACCES = syscall.EACCES
+ UnixEACCES = unix.EACCES
+)
+
+var maxfiles uint64
+
+func SetRlimit() {
+ // Go 1.19 will do this automatically: https://go-review.googlesource.com/c/go/+/393354/
+ var l syscall.Rlimit
+ err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &l)
+ if err == nil && l.Cur != l.Max {
+ l.Cur = l.Max
+ syscall.Setrlimit(syscall.RLIMIT_NOFILE, &l)
+ }
+ maxfiles = uint64(l.Cur)
+}
+
+func Maxfiles() uint64 { return maxfiles }
+func Mkfifo(path string, mode uint32) error { return unix.Mkfifo(path, mode) }
+func Mknod(path string, mode uint32, dev int) error { return unix.Mknod(path, mode, uint64(dev)) }
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/internal.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/internal.go
new file mode 100644
index 0000000..7daa45e
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/internal.go
@@ -0,0 +1,2 @@
+// Package internal contains some helpers.
+package internal
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/unix.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/unix.go
new file mode 100644
index 0000000..30976ce
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/unix.go
@@ -0,0 +1,31 @@
+//go:build !windows && !darwin && !freebsd
+
+package internal
+
+import (
+ "syscall"
+
+ "golang.org/x/sys/unix"
+)
+
+var (
+ SyscallEACCES = syscall.EACCES
+ UnixEACCES = unix.EACCES
+)
+
+var maxfiles uint64
+
+func SetRlimit() {
+ // Go 1.19 will do this automatically: https://go-review.googlesource.com/c/go/+/393354/
+ var l syscall.Rlimit
+ err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &l)
+ if err == nil && l.Cur != l.Max {
+ l.Cur = l.Max
+ syscall.Setrlimit(syscall.RLIMIT_NOFILE, &l)
+ }
+ maxfiles = uint64(l.Cur)
+}
+
+func Maxfiles() uint64 { return maxfiles }
+func Mkfifo(path string, mode uint32) error { return unix.Mkfifo(path, mode) }
+func Mknod(path string, mode uint32, dev int) error { return unix.Mknod(path, mode, dev) }
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/unix2.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/unix2.go
new file mode 100644
index 0000000..37dfedd
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/unix2.go
@@ -0,0 +1,7 @@
+//go:build !windows
+
+package internal
+
+func HasPrivilegesForSymlink() bool {
+ return true
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/windows.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/windows.go
new file mode 100644
index 0000000..a72c649
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/internal/windows.go
@@ -0,0 +1,41 @@
+//go:build windows
+
+package internal
+
+import (
+ "errors"
+
+ "golang.org/x/sys/windows"
+)
+
+// Just a dummy.
+var (
+ SyscallEACCES = errors.New("dummy")
+ UnixEACCES = errors.New("dummy")
+)
+
+func SetRlimit() {}
+func Maxfiles() uint64 { return 1<<64 - 1 }
+func Mkfifo(path string, mode uint32) error { return errors.New("no FIFOs on Windows") }
+func Mknod(path string, mode uint32, dev int) error { return errors.New("no device nodes on Windows") }
+
+func HasPrivilegesForSymlink() bool {
+ var sid *windows.SID
+ err := windows.AllocateAndInitializeSid(
+ &windows.SECURITY_NT_AUTHORITY,
+ 2,
+ windows.SECURITY_BUILTIN_DOMAIN_RID,
+ windows.DOMAIN_ALIAS_RID_ADMINS,
+ 0, 0, 0, 0, 0, 0,
+ &sid)
+ if err != nil {
+ return false
+ }
+ defer windows.FreeSid(sid)
+ token := windows.Token(0)
+ member, err := token.IsMember(sid)
+ if err != nil {
+ return false
+ }
+ return member || token.IsElevated()
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/system_bsd.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/system_bsd.go
new file mode 100644
index 0000000..f65e8fe
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/system_bsd.go
@@ -0,0 +1,7 @@
+//go:build freebsd || openbsd || netbsd || dragonfly
+
+package fsnotify
+
+import "golang.org/x/sys/unix"
+
+const openMode = unix.O_NONBLOCK | unix.O_RDONLY | unix.O_CLOEXEC
diff --git a/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/system_darwin.go b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/system_darwin.go
new file mode 100644
index 0000000..a29fc7a
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/fsnotify/fsnotify/system_darwin.go
@@ -0,0 +1,8 @@
+//go:build darwin
+
+package fsnotify
+
+import "golang.org/x/sys/unix"
+
+// note: this constant is not defined on BSD
+const openMode = unix.O_EVTONLY | unix.O_CLOEXEC
diff --git a/.gear/predownloaded-development/vendor/github.com/gammazero/deque/.gitignore b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/.gitignore
new file mode 100644
index 0000000..b33406f
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/.gitignore
@@ -0,0 +1,26 @@
+*~
+
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
diff --git a/.gear/predownloaded-development/vendor/github.com/gammazero/deque/LICENSE b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/LICENSE
new file mode 100644
index 0000000..0566f26
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Andrew J. Gillis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/.gear/predownloaded-development/vendor/github.com/gammazero/deque/README.md b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/README.md
new file mode 100644
index 0000000..ee2dbb8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/README.md
@@ -0,0 +1,80 @@
+# deque
+
+[](https://pkg.go.dev/github.com/gammazero/deque)
+[](https://github.com/gammazero/deque/actions/workflows/go.yml)
+[](https://goreportcard.com/report/github.com/gammazero/deque)
+[](https://codecov.io/gh/gammazero/deque)
+[](LICENSE)
+
+Fast ring-buffer deque ([double-ended queue](https://en.wikipedia.org/wiki/Double-ended_queue)) implementation.
+
+For a pictorial description, see the [Deque diagram](https://github.com/gammazero/deque/wiki)
+
+## Installation
+
+```
+$ go get github.com/gammazero/deque
+```
+
+## Deque data structure
+
+Deque generalizes a queue and a stack, to efficiently add and remove items at either end with O(1) performance. [Queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) (FIFO) operations are supported using `PushBack` and `PopFront`. [Stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) (LIFO) operations are supported using `PushBack` and `PopBack`.
+
+## Ring-buffer Performance
+
+This deque implementation is optimized for CPU and GC performance. The circular buffer automatically re-sizes by powers of two, growing when additional capacity is needed and shrinking when only a quarter of the capacity is used, and uses bitwise arithmetic for all calculations. Since growth is by powers of two, adding elements will only cause O(log n) allocations. A base capacity can be set, with `SetBaseCap`, so that there is no resizing at or below that specified amount. The Deque can also be grown, using `Grow`, to ensure sufficient storage for n additional items, to prevent resizing when adding a number of itmes.
+
+The ring-buffer implementation improves memory and time performance with fewer GC pauses, compared to implementations based on slices or linked lists. By wrapping around the buffer, previously used space is reused, making allocation unnecessary until all buffer capacity is used. The ring buffer implementation performs best when resizes are infrequest, as is the case when items moving in and out of the Deque are balanced or when the base capacity is large enough to rarely require a resize.
+
+For maximum speed, this deque implementation leaves concurrency safety up to the application to provide, however the application chooses, if needed at all.
+
+## Reading Empty Deque
+
+Since it is OK for the deque to contain a `nil` value, it is necessary to either panic or return a second boolean value to indicate the deque is empty, when reading or removing an element. This deque panics when reading from an empty deque. This is a run-time check to help catch programming errors, which may be missed if a second return value is ignored. Simply check `Deque.Len()` before reading from the deque.
+
+## Generics
+
+Deque uses generics to create a Deque that contains items of the type specified. To create a Deque that holds a specific type, provide a type argument with the `Deque` variable declaration. For example:
+```go
+ stringDeque := new(deque.Deque[string])
+ var intDeque deque.Deque[int]
+```
+
+## Example
+
+```go
+package main
+
+import (
+ "fmt"
+ "github.com/gammazero/deque"
+)
+
+func main() {
+ var q deque.Deque[string]
+ q.PushBack("foo")
+ q.PushBack("bar")
+ q.PushBack("baz")
+
+ fmt.Println(q.Len()) // Prints: 3
+ fmt.Println(q.Front()) // Prints: foo
+ fmt.Println(q.Back()) // Prints: baz
+
+ q.PopFront() // remove "foo"
+ q.PopBack() // remove "baz"
+
+ q.PushFront("hello")
+ q.PushBack("world")
+
+ // Consume deque and print elements.
+ for q.Len() != 0 {
+ fmt.Println(q.PopFront())
+ }
+}
+```
+
+## Uses
+
+Deque can be used as both a:
+- [Queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) using `PushBack` and `PopFront`
+- [Stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) using `PushBack` and `PopBack`
diff --git a/.gear/predownloaded-development/vendor/github.com/gammazero/deque/deque.go b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/deque.go
new file mode 100644
index 0000000..ff10996
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/deque.go
@@ -0,0 +1,434 @@
+package deque
+
+import "fmt"
+
+// minCapacity is the smallest capacity that deque may have. Must be power of 2
+// for bitwise modulus: x % n == x & (n - 1).
+const minCapacity = 16
+
+// Deque represents a single instance of the deque data structure. A Deque
+// instance contains items of the type specified by the type argument.
+//
+// For example, to create a Deque that contains strings do one of the
+// following:
+//
+// var stringDeque deque.Deque[string]
+// stringDeque := new(deque.Deque[string])
+// stringDeque := &deque.Deque[string]{}
+//
+// To create a Deque that will never resize to have space for less than 64
+// items, specify a base capacity:
+//
+// var d deque.Deque[int]
+// d.SetBaseCap(64)
+//
+// To ensure the Deque can store 1000 items without needing to resize while
+// items are added:
+//
+// d.Grow(1000)
+//
+// Any values supplied to SetBaseCap and Grow are rounded up to the nearest
+// power of 2, since the Deque grows by powers of 2.
+type Deque[T any] struct {
+ buf []T
+ head int
+ tail int
+ count int
+ minCap int
+}
+
+// Cap returns the current capacity of the Deque. If q is nil, q.Cap() is zero.
+func (q *Deque[T]) Cap() int {
+ if q == nil {
+ return 0
+ }
+ return len(q.buf)
+}
+
+// Len returns the number of elements currently stored in the queue. If q is
+// nil, q.Len() returns zero.
+func (q *Deque[T]) Len() int {
+ if q == nil {
+ return 0
+ }
+ return q.count
+}
+
+// PushBack appends an element to the back of the queue. Implements FIFO when
+// elements are removed with PopFront, and LIFO when elements are removed with
+// PopBack.
+func (q *Deque[T]) PushBack(elem T) {
+ q.growIfFull()
+
+ q.buf[q.tail] = elem
+ // Calculate new tail position.
+ q.tail = q.next(q.tail)
+ q.count++
+}
+
+// PushFront prepends an element to the front of the queue.
+func (q *Deque[T]) PushFront(elem T) {
+ q.growIfFull()
+
+ // Calculate new head position.
+ q.head = q.prev(q.head)
+ q.buf[q.head] = elem
+ q.count++
+}
+
+// PopFront removes and returns the element from the front of the queue.
+// Implements FIFO when used with PushBack. If the queue is empty, the call
+// panics.
+func (q *Deque[T]) PopFront() T {
+ if q.count <= 0 {
+ panic("deque: PopFront() called on empty queue")
+ }
+ ret := q.buf[q.head]
+ var zero T
+ q.buf[q.head] = zero
+ // Calculate new head position.
+ q.head = q.next(q.head)
+ q.count--
+
+ q.shrinkIfExcess()
+ return ret
+}
+
+// PopBack removes and returns the element from the back of the queue.
+// Implements LIFO when used with PushBack. If the queue is empty, the call
+// panics.
+func (q *Deque[T]) PopBack() T {
+ if q.count <= 0 {
+ panic("deque: PopBack() called on empty queue")
+ }
+
+ // Calculate new tail position
+ q.tail = q.prev(q.tail)
+
+ // Remove value at tail.
+ ret := q.buf[q.tail]
+ var zero T
+ q.buf[q.tail] = zero
+ q.count--
+
+ q.shrinkIfExcess()
+ return ret
+}
+
+// Front returns the element at the front of the queue. This is the element
+// that would be returned by PopFront. This call panics if the queue is empty.
+func (q *Deque[T]) Front() T {
+ if q.count <= 0 {
+ panic("deque: Front() called when empty")
+ }
+ return q.buf[q.head]
+}
+
+// Back returns the element at the back of the queue. This is the element that
+// would be returned by PopBack. This call panics if the queue is empty.
+func (q *Deque[T]) Back() T {
+ if q.count <= 0 {
+ panic("deque: Back() called when empty")
+ }
+ return q.buf[q.prev(q.tail)]
+}
+
+// At returns the element at index i in the queue without removing the element
+// from the queue. This method accepts only non-negative index values. At(0)
+// refers to the first element and is the same as Front(). At(Len()-1) refers
+// to the last element and is the same as Back(). If the index is invalid, the
+// call panics.
+//
+// The purpose of At is to allow Deque to serve as a more general purpose
+// circular buffer, where items are only added to and removed from the ends of
+// the deque, but may be read from any place within the deque. Consider the
+// case of a fixed-size circular log buffer: A new entry is pushed onto one end
+// and when full the oldest is popped from the other end. All the log entries
+// in the buffer must be readable without altering the buffer contents.
+func (q *Deque[T]) At(i int) T {
+ q.checkRange(i)
+ // bitwise modulus
+ return q.buf[(q.head+i)&(len(q.buf)-1)]
+}
+
+// Set assigns the item to index i in the queue. Set indexes the deque the same
+// as At but perform the opposite operation. If the index is invalid, the call
+// panics.
+func (q *Deque[T]) Set(i int, item T) {
+ q.checkRange(i)
+ // bitwise modulus
+ q.buf[(q.head+i)&(len(q.buf)-1)] = item
+}
+
+// Clear removes all elements from the queue, but retains the current capacity.
+// This is useful when repeatedly reusing the queue at high frequency to avoid
+// GC during reuse. The queue will not be resized smaller as long as items are
+// only added. Only when items are removed is the queue subject to getting
+// resized smaller.
+func (q *Deque[T]) Clear() {
+ var zero T
+ modBits := len(q.buf) - 1
+ h := q.head
+ for i := 0; i < q.Len(); i++ {
+ q.buf[(h+i)&modBits] = zero
+ }
+ q.head = 0
+ q.tail = 0
+ q.count = 0
+}
+
+// Grow grows deque's capacity, if necessary, to guarantee space for another n
+// items. After Grow(n), at least n items can be written to the deque without
+// another allocation. If n is negative, Grow panics.
+func (q *Deque[T]) Grow(n int) {
+ if n < 0 {
+ panic("deque.Grow: negative count")
+ }
+ c := q.Cap()
+ l := q.Len()
+ // If already big enough.
+ if n <= c-l {
+ return
+ }
+
+ if c == 0 {
+ c = minCapacity
+ }
+
+ newLen := l + n
+ for c < newLen {
+ c <<= 1
+ }
+ if l == 0 {
+ q.buf = make([]T, c)
+ q.head = 0
+ q.tail = 0
+ } else {
+ q.resize(c)
+ }
+}
+
+// Rotate rotates the deque n steps front-to-back. If n is negative, rotates
+// back-to-front. Having Deque provide Rotate avoids resizing that could happen
+// if implementing rotation using only Pop and Push methods. If q.Len() is one
+// or less, or q is nil, then Rotate does nothing.
+func (q *Deque[T]) Rotate(n int) {
+ if q.Len() <= 1 {
+ return
+ }
+ // Rotating a multiple of q.count is same as no rotation.
+ n %= q.count
+ if n == 0 {
+ return
+ }
+
+ modBits := len(q.buf) - 1
+ // If no empty space in buffer, only move head and tail indexes.
+ if q.head == q.tail {
+ // Calculate new head and tail using bitwise modulus.
+ q.head = (q.head + n) & modBits
+ q.tail = q.head
+ return
+ }
+
+ var zero T
+
+ if n < 0 {
+ // Rotate back to front.
+ for ; n < 0; n++ {
+ // Calculate new head and tail using bitwise modulus.
+ q.head = (q.head - 1) & modBits
+ q.tail = (q.tail - 1) & modBits
+ // Put tail value at head and remove value at tail.
+ q.buf[q.head] = q.buf[q.tail]
+ q.buf[q.tail] = zero
+ }
+ return
+ }
+
+ // Rotate front to back.
+ for ; n > 0; n-- {
+ // Put head value at tail and remove value at head.
+ q.buf[q.tail] = q.buf[q.head]
+ q.buf[q.head] = zero
+ // Calculate new head and tail using bitwise modulus.
+ q.head = (q.head + 1) & modBits
+ q.tail = (q.tail + 1) & modBits
+ }
+}
+
+// Index returns the index into the Deque of the first item satisfying f(item),
+// or -1 if none do. If q is nil, then -1 is always returned. Search is linear
+// starting with index 0.
+func (q *Deque[T]) Index(f func(T) bool) int {
+ if q.Len() > 0 {
+ modBits := len(q.buf) - 1
+ for i := 0; i < q.count; i++ {
+ if f(q.buf[(q.head+i)&modBits]) {
+ return i
+ }
+ }
+ }
+ return -1
+}
+
+// RIndex is the same as Index, but searches from Back to Front. The index
+// returned is from Front to Back, where index 0 is the index of the item
+// returned by Front().
+func (q *Deque[T]) RIndex(f func(T) bool) int {
+ if q.Len() > 0 {
+ modBits := len(q.buf) - 1
+ for i := q.count - 1; i >= 0; i-- {
+ if f(q.buf[(q.head+i)&modBits]) {
+ return i
+ }
+ }
+ }
+ return -1
+}
+
+// Insert is used to insert an element into the middle of the queue, before the
+// element at the specified index. Insert(0,e) is the same as PushFront(e) and
+// Insert(Len(),e) is the same as PushBack(e). Out of range indexes result in
+// pushing the item onto the front of back of the deque.
+//
+// Important: Deque is optimized for O(1) operations at the ends of the queue,
+// not for operations in the the middle. Complexity of this function is
+// constant plus linear in the lesser of the distances between the index and
+// either of the ends of the queue.
+func (q *Deque[T]) Insert(at int, item T) {
+ if at <= 0 {
+ q.PushFront(item)
+ return
+ }
+ if at >= q.Len() {
+ q.PushBack(item)
+ return
+ }
+ if at*2 < q.count {
+ q.PushFront(item)
+ front := q.head
+ for i := 0; i < at; i++ {
+ next := q.next(front)
+ q.buf[front], q.buf[next] = q.buf[next], q.buf[front]
+ front = next
+ }
+ return
+ }
+ swaps := q.count - at
+ q.PushBack(item)
+ back := q.prev(q.tail)
+ for i := 0; i < swaps; i++ {
+ prev := q.prev(back)
+ q.buf[back], q.buf[prev] = q.buf[prev], q.buf[back]
+ back = prev
+ }
+}
+
+// Remove removes and returns an element from the middle of the queue, at the
+// specified index. Remove(0) is the same as PopFront() and Remove(Len()-1) is
+// the same as PopBack(). Accepts only non-negative index values, and panics if
+// index is out of range.
+//
+// Important: Deque is optimized for O(1) operations at the ends of the queue,
+// not for operations in the the middle. Complexity of this function is
+// constant plus linear in the lesser of the distances between the index and
+// either of the ends of the queue.
+func (q *Deque[T]) Remove(at int) T {
+ q.checkRange(at)
+ rm := (q.head + at) & (len(q.buf) - 1)
+ if at*2 < q.count {
+ for i := 0; i < at; i++ {
+ prev := q.prev(rm)
+ q.buf[prev], q.buf[rm] = q.buf[rm], q.buf[prev]
+ rm = prev
+ }
+ return q.PopFront()
+ }
+ swaps := q.count - at - 1
+ for i := 0; i < swaps; i++ {
+ next := q.next(rm)
+ q.buf[rm], q.buf[next] = q.buf[next], q.buf[rm]
+ rm = next
+ }
+ return q.PopBack()
+}
+
+// SetBaseCap sets a base capacity so that at least the specified number of
+// items can always be stored without resizing.
+func (q *Deque[T]) SetBaseCap(baseCap int) {
+ minCap := minCapacity
+ for minCap < baseCap {
+ minCap <<= 1
+ }
+ q.minCap = minCap
+}
+
+// Swap exchanges the two values at idxA and idxB. It panics if either index is
+// out of range.
+func (q *Deque[T]) Swap(idxA, idxB int) {
+ q.checkRange(idxA)
+ q.checkRange(idxB)
+ if idxA == idxB {
+ return
+ }
+
+ realA := (q.head + idxA) & (len(q.buf) - 1)
+ realB := (q.head + idxB) & (len(q.buf) - 1)
+ q.buf[realA], q.buf[realB] = q.buf[realB], q.buf[realA]
+}
+
+func (q *Deque[T]) checkRange(i int) {
+ if i < 0 || i >= q.count {
+ panic(fmt.Sprintf("deque: index out of range %d with length %d", i, q.Len()))
+ }
+}
+
+// prev returns the previous buffer position wrapping around buffer.
+func (q *Deque[T]) prev(i int) int {
+ return (i - 1) & (len(q.buf) - 1) // bitwise modulus
+}
+
+// next returns the next buffer position wrapping around buffer.
+func (q *Deque[T]) next(i int) int {
+ return (i + 1) & (len(q.buf) - 1) // bitwise modulus
+}
+
+// growIfFull resizes up if the buffer is full.
+func (q *Deque[T]) growIfFull() {
+ if q.count != len(q.buf) {
+ return
+ }
+ if len(q.buf) == 0 {
+ if q.minCap == 0 {
+ q.minCap = minCapacity
+ }
+ q.buf = make([]T, q.minCap)
+ return
+ }
+ q.resize(q.count << 1)
+}
+
+// shrinkIfExcess resize down if the buffer 1/4 full.
+func (q *Deque[T]) shrinkIfExcess() {
+ if len(q.buf) > q.minCap && (q.count<<2) == len(q.buf) {
+ q.resize(q.count << 1)
+ }
+}
+
+// resize resizes the deque to fit exactly twice its current contents. This is
+// used to grow the queue when it is full, and also to shrink it when it is
+// only a quarter full.
+func (q *Deque[T]) resize(newSize int) {
+ newBuf := make([]T, newSize)
+ if q.tail > q.head {
+ copy(newBuf, q.buf[q.head:q.tail])
+ } else {
+ n := copy(newBuf, q.buf[q.head:])
+ copy(newBuf[n:], q.buf[:q.tail])
+ }
+
+ q.head = 0
+ q.tail = q.count
+ q.buf = newBuf
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/gammazero/deque/doc.go b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/doc.go
new file mode 100644
index 0000000..dfff00a
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/gammazero/deque/doc.go
@@ -0,0 +1,38 @@
+/*
+Package deque provides a fast ring-buffer deque (double-ended queue)
+implementation.
+
+Deque generalizes a queue and a stack, to efficiently add and remove items at
+either end with O(1) performance. Queue (FIFO) operations are supported using
+PushBack and PopFront. Stack (LIFO) operations are supported using PushBack and
+PopBack.
+
+# Ring-buffer Performance
+
+The ring-buffer automatically resizes by powers of two, growing when additional
+capacity is needed and shrinking when only a quarter of the capacity is used,
+and uses bitwise arithmetic for all calculations.
+
+The ring-buffer implementation significantly improves memory and time
+performance with fewer GC pauses, compared to implementations based on slices
+and linked lists.
+
+For maximum speed, this deque implementation leaves concurrency safety up to
+the application to provide, however the application chooses, if needed at all.
+
+# Reading Empty Deque
+
+Since it is OK for the deque to contain the zero-value of an item, it is
+necessary to either panic or return a second boolean value to indicate the
+deque is empty, when reading or removing an element. This deque panics when
+reading from an empty deque. This is a run-time check to help catch programming
+errors, which may be missed if a second return value is ignored. Simply check
+Deque.Len() before reading from the deque.
+
+# Generics
+
+Deque uses generics to create a Deque that contains items of the type
+specified. To create a Deque that holds a specific type, provide a type
+argument with the Deque variable declaration.
+*/
+package deque
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/.gitignore b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/.gitignore
new file mode 100644
index 0000000..eb29eba
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/.gitignore
@@ -0,0 +1,2 @@
+jose-util/jose-util
+jose-util.t.err
\ No newline at end of file
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/.golangci.yml b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/.golangci.yml
new file mode 100644
index 0000000..2a577a8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/.golangci.yml
@@ -0,0 +1,53 @@
+# https://github.com/golangci/golangci-lint
+
+run:
+ skip-files:
+ - doc_test.go
+ modules-download-mode: readonly
+
+linters:
+ enable-all: true
+ disable:
+ - gochecknoglobals
+ - goconst
+ - lll
+ - maligned
+ - nakedret
+ - scopelint
+ - unparam
+ - funlen # added in 1.18 (requires go-jose changes before it can be enabled)
+
+linters-settings:
+ gocyclo:
+ min-complexity: 35
+
+issues:
+ exclude-rules:
+ - text: "don't use ALL_CAPS in Go names"
+ linters:
+ - golint
+ - text: "hardcoded credentials"
+ linters:
+ - gosec
+ - text: "weak cryptographic primitive"
+ linters:
+ - gosec
+ - path: json/
+ linters:
+ - dupl
+ - errcheck
+ - gocritic
+ - gocyclo
+ - golint
+ - govet
+ - ineffassign
+ - staticcheck
+ - structcheck
+ - stylecheck
+ - unused
+ - path: _test\.go
+ linters:
+ - scopelint
+ - path: jwk.go
+ linters:
+ - gocyclo
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/.travis.yml b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/.travis.yml
new file mode 100644
index 0000000..48de631
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/.travis.yml
@@ -0,0 +1,33 @@
+language: go
+
+matrix:
+ fast_finish: true
+ allow_failures:
+ - go: tip
+
+go:
+ - "1.13.x"
+ - "1.14.x"
+ - tip
+
+before_script:
+ - export PATH=$HOME/.local/bin:$PATH
+
+before_install:
+ - go get -u github.com/mattn/goveralls github.com/wadey/gocovmerge
+ - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.18.0
+ - pip install cram --user
+
+script:
+ - go test -v -covermode=count -coverprofile=profile.cov .
+ - go test -v -covermode=count -coverprofile=cryptosigner/profile.cov ./cryptosigner
+ - go test -v -covermode=count -coverprofile=cipher/profile.cov ./cipher
+ - go test -v -covermode=count -coverprofile=jwt/profile.cov ./jwt
+ - go test -v ./json # no coverage for forked encoding/json package
+ - golangci-lint run
+ - cd jose-util && go build && PATH=$PWD:$PATH cram -v jose-util.t # cram tests jose-util
+ - cd ..
+
+after_success:
+ - gocovmerge *.cov */*.cov > merged.coverprofile
+ - goveralls -coverprofile merged.coverprofile -service=travis-ci
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/CHANGELOG.md b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/CHANGELOG.md
new file mode 100644
index 0000000..ce2a54e
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/CHANGELOG.md
@@ -0,0 +1,78 @@
+# v4.0.1
+
+## Fixed
+
+ - An attacker could send a JWE containing compressed data that used large
+ amounts of memory and CPU when decompressed by `Decrypt` or `DecryptMulti`.
+ Those functions now return an error if the decompressed data would exceed
+ 250kB or 10x the compressed size (whichever is larger). Thanks to
+ Enze Wang@Alioth and Jianjun Chen@Zhongguancun Lab (@zer0yu and @chenjj)
+ for reporting.
+
+# v4.0.0
+
+This release makes some breaking changes in order to more thoroughly
+address the vulnerabilities discussed in [Three New Attacks Against JSON Web
+Tokens][1], "Sign/encrypt confusion", "Billion hash attack", and "Polyglot
+token".
+
+## Changed
+
+ - Limit JWT encryption types (exclude password or public key types) (#78)
+ - Enforce minimum length for HMAC keys (#85)
+ - jwt: match any audience in a list, rather than requiring all audiences (#81)
+ - jwt: accept only Compact Serialization (#75)
+ - jws: Add expected algorithms for signatures (#74)
+ - Require specifying expected algorithms for ParseEncrypted,
+ ParseSigned, ParseDetached, jwt.ParseEncrypted, jwt.ParseSigned,
+ jwt.ParseSignedAndEncrypted (#69, #74)
+ - Usually there is a small, known set of appropriate algorithms for a program
+ to use and it's a mistake to allow unexpected algorithms. For instance the
+ "billion hash attack" relies in part on programs accepting the PBES2
+ encryption algorithm and doing the necessary work even if they weren't
+ specifically configured to allow PBES2.
+ - Revert "Strip padding off base64 strings" (#82)
+ - The specs require base64url encoding without padding.
+ - Minimum supported Go version is now 1.21
+
+## Added
+
+ - ParseSignedCompact, ParseSignedJSON, ParseEncryptedCompact, ParseEncryptedJSON.
+ - These allow parsing a specific serialization, as opposed to ParseSigned and
+ ParseEncrypted, which try to automatically detect which serialization was
+ provided. It's common to require a specific serialization for a specific
+ protocol - for instance JWT requires Compact serialization.
+
+[1]: https://i.blackhat.com/BH-US-23/Presentations/US-23-Tervoort-Three-New-Attacks-Against-JSON-Web-Tokens.pdf
+
+# v3.0.3
+
+## Fixed
+
+ - Limit decompression output size to prevent a DoS. Backport from v4.0.1.
+
+# v3.0.2
+
+## Fixed
+
+ - DecryptMulti: handle decompression error (#19)
+
+## Changed
+
+ - jwe/CompactSerialize: improve performance (#67)
+ - Increase the default number of PBKDF2 iterations to 600k (#48)
+ - Return the proper algorithm for ECDSA keys (#45)
+
+## Added
+
+ - Add Thumbprint support for opaque signers (#38)
+
+# v3.0.1
+
+## Fixed
+
+ - Security issue: an attacker specifying a large "p2c" value can cause
+ JSONWebEncryption.Decrypt and JSONWebEncryption.DecryptMulti to consume large
+ amounts of CPU, causing a DoS. Thanks to Matt Schwager (@mschwager) for the
+ disclosure and to Tom Tervoort for originally publishing the category of attack.
+ https://i.blackhat.com/BH-US-23/Presentations/US-23-Tervoort-Three-New-Attacks-Against-JSON-Web-Tokens.pdf
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/CONTRIBUTING.md b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/CONTRIBUTING.md
new file mode 100644
index 0000000..b63e1f8
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/CONTRIBUTING.md
@@ -0,0 +1,15 @@
+# Contributing
+
+If you would like to contribute code to go-jose you can do so through GitHub by
+forking the repository and sending a pull request.
+
+When submitting code, please make every effort to follow existing conventions
+and style in order to keep the code as readable as possible. Please also make
+sure all tests pass by running `go test`, and format your code with `go fmt`.
+We also recommend using `golint` and `errcheck`.
+
+Before your code can be accepted into the project you must also sign the
+Individual Contributor License Agreement. We use [cla-assistant.io][1] and you
+will be prompted to sign once a pull request is opened.
+
+[1]: https://cla-assistant.io/
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/LICENSE b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/README.md b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/README.md
new file mode 100644
index 0000000..282cd9e
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/README.md
@@ -0,0 +1,108 @@
+# Go JOSE
+
+### Versions
+
+[Version 4](https://github.com/go-jose/go-jose)
+([branch](https://github.com/go-jose/go-jose/),
+[doc](https://pkg.go.dev/github.com/go-jose/go-jose/v4), [releases](https://github.com/go-jose/go-jose/releases)) is the current stable version:
+
+ import "github.com/go-jose/go-jose/v4"
+
+The old [square/go-jose](https://github.com/square/go-jose) repo contains the prior v1 and v2 versions, which
+are deprecated.
+
+### Summary
+
+Package jose aims to provide an implementation of the Javascript Object Signing
+and Encryption set of standards. This includes support for JSON Web Encryption,
+JSON Web Signature, and JSON Web Token standards.
+
+**Disclaimer**: This library contains encryption software that is subject to
+the U.S. Export Administration Regulations. You may not export, re-export,
+transfer or download this code or any part of it in violation of any United
+States law, directive or regulation. In particular this software may not be
+exported or re-exported in any form or on any media to Iran, North Sudan,
+Syria, Cuba, or North Korea, or to denied persons or entities mentioned on any
+US maintained blocked list.
+
+## Overview
+
+The implementation follows the
+[JSON Web Encryption](https://dx.doi.org/10.17487/RFC7516) (RFC 7516),
+[JSON Web Signature](https://dx.doi.org/10.17487/RFC7515) (RFC 7515), and
+[JSON Web Token](https://dx.doi.org/10.17487/RFC7519) (RFC 7519) specifications.
+Tables of supported algorithms are shown below. The library supports both
+the compact and JWS/JWE JSON Serialization formats, and has optional support for
+multiple recipients. It also comes with a small command-line utility
+([`jose-util`](https://pkg.go.dev/github.com/go-jose/go-jose/jose-util))
+for dealing with JOSE messages in a shell.
+
+**Note**: We use a forked version of the `encoding/json` package from the Go
+standard library which uses case-sensitive matching for member names (instead
+of [case-insensitive matching](https://www.ietf.org/mail-archive/web/json/current/msg03763.html)).
+This is to avoid differences in interpretation of messages between go-jose and
+libraries in other languages.
+
+### Supported algorithms
+
+See below for a table of supported algorithms. Algorithm identifiers match
+the names in the [JSON Web Algorithms](https://dx.doi.org/10.17487/RFC7518)
+standard where possible. The Godoc reference has a list of constants.
+
+ Key encryption | Algorithm identifier(s)
+ :------------------------- | :------------------------------
+ RSA-PKCS#1v1.5 | RSA1_5
+ RSA-OAEP | RSA-OAEP, RSA-OAEP-256
+ AES key wrap | A128KW, A192KW, A256KW
+ AES-GCM key wrap | A128GCMKW, A192GCMKW, A256GCMKW
+ ECDH-ES + AES key wrap | ECDH-ES+A128KW, ECDH-ES+A192KW, ECDH-ES+A256KW
+ ECDH-ES (direct) | ECDH-ES1
+ Direct encryption | dir1
+
+1. Not supported in multi-recipient mode
+
+ Signing / MAC | Algorithm identifier(s)
+ :------------------------- | :------------------------------
+ RSASSA-PKCS#1v1.5 | RS256, RS384, RS512
+ RSASSA-PSS | PS256, PS384, PS512
+ HMAC | HS256, HS384, HS512
+ ECDSA | ES256, ES384, ES512
+ Ed25519 | EdDSA2
+
+2. Only available in version 2 of the package
+
+ Content encryption | Algorithm identifier(s)
+ :------------------------- | :------------------------------
+ AES-CBC+HMAC | A128CBC-HS256, A192CBC-HS384, A256CBC-HS512
+ AES-GCM | A128GCM, A192GCM, A256GCM
+
+ Compression | Algorithm identifiers(s)
+ :------------------------- | -------------------------------
+ DEFLATE (RFC 1951) | DEF
+
+### Supported key types
+
+See below for a table of supported key types. These are understood by the
+library, and can be passed to corresponding functions such as `NewEncrypter` or
+`NewSigner`. Each of these keys can also be wrapped in a JWK if desired, which
+allows attaching a key id.
+
+ Algorithm(s) | Corresponding types
+ :------------------------- | -------------------------------
+ RSA | *[rsa.PublicKey](https://pkg.go.dev/crypto/rsa/#PublicKey), *[rsa.PrivateKey](https://pkg.go.dev/crypto/rsa/#PrivateKey)
+ ECDH, ECDSA | *[ecdsa.PublicKey](https://pkg.go.dev/crypto/ecdsa/#PublicKey), *[ecdsa.PrivateKey](https://pkg.go.dev/crypto/ecdsa/#PrivateKey)
+ EdDSA1 | [ed25519.PublicKey](https://pkg.go.dev/crypto/ed25519#PublicKey), [ed25519.PrivateKey](https://pkg.go.dev/crypto/ed25519#PrivateKey)
+ AES, HMAC | []byte
+
+1. Only available in version 2 or later of the package
+
+## Examples
+
+[](https://pkg.go.dev/github.com/go-jose/go-jose/v3)
+[](https://pkg.go.dev/github.com/go-jose/go-jose/v3/jwt)
+
+Examples can be found in the Godoc
+reference for this package. The
+[`jose-util`](https://github.com/go-jose/go-jose/tree/v3/jose-util)
+subdirectory also contains a small command-line utility which might be useful
+as an example as well.
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/SECURITY.md b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/SECURITY.md
new file mode 100644
index 0000000..2f18a75
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/SECURITY.md
@@ -0,0 +1,13 @@
+# Security Policy
+This document explains how to contact the Let's Encrypt security team to report security vulnerabilities.
+
+## Supported Versions
+| Version | Supported |
+| ------- | ----------|
+| >= v3 | ✓ |
+| v2 | ✗ |
+| v1 | ✗ |
+
+## Reporting a vulnerability
+
+Please see [https://letsencrypt.org/contact/#security](https://letsencrypt.org/contact/#security) for the email address to report a vulnerability. Ensure that the subject line for your report contains the word `vulnerability` and is descriptive. Your email should be acknowledged within 24 hours. If you do not receive a response within 24 hours, please follow-up again with another email.
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/asymmetric.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/asymmetric.go
new file mode 100644
index 0000000..d4d4961
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/asymmetric.go
@@ -0,0 +1,595 @@
+/*-
+ * Copyright 2014 Square Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package jose
+
+import (
+ "crypto"
+ "crypto/aes"
+ "crypto/ecdsa"
+ "crypto/ed25519"
+ "crypto/rand"
+ "crypto/rsa"
+ "crypto/sha1"
+ "crypto/sha256"
+ "errors"
+ "fmt"
+ "math/big"
+
+ josecipher "github.com/go-jose/go-jose/v3/cipher"
+ "github.com/go-jose/go-jose/v3/json"
+)
+
+// A generic RSA-based encrypter/verifier
+type rsaEncrypterVerifier struct {
+ publicKey *rsa.PublicKey
+}
+
+// A generic RSA-based decrypter/signer
+type rsaDecrypterSigner struct {
+ privateKey *rsa.PrivateKey
+}
+
+// A generic EC-based encrypter/verifier
+type ecEncrypterVerifier struct {
+ publicKey *ecdsa.PublicKey
+}
+
+type edEncrypterVerifier struct {
+ publicKey ed25519.PublicKey
+}
+
+// A key generator for ECDH-ES
+type ecKeyGenerator struct {
+ size int
+ algID string
+ publicKey *ecdsa.PublicKey
+}
+
+// A generic EC-based decrypter/signer
+type ecDecrypterSigner struct {
+ privateKey *ecdsa.PrivateKey
+}
+
+type edDecrypterSigner struct {
+ privateKey ed25519.PrivateKey
+}
+
+// newRSARecipient creates recipientKeyInfo based on the given key.
+func newRSARecipient(keyAlg KeyAlgorithm, publicKey *rsa.PublicKey) (recipientKeyInfo, error) {
+ // Verify that key management algorithm is supported by this encrypter
+ switch keyAlg {
+ case RSA1_5, RSA_OAEP, RSA_OAEP_256:
+ default:
+ return recipientKeyInfo{}, ErrUnsupportedAlgorithm
+ }
+
+ if publicKey == nil {
+ return recipientKeyInfo{}, errors.New("invalid public key")
+ }
+
+ return recipientKeyInfo{
+ keyAlg: keyAlg,
+ keyEncrypter: &rsaEncrypterVerifier{
+ publicKey: publicKey,
+ },
+ }, nil
+}
+
+// newRSASigner creates a recipientSigInfo based on the given key.
+func newRSASigner(sigAlg SignatureAlgorithm, privateKey *rsa.PrivateKey) (recipientSigInfo, error) {
+ // Verify that key management algorithm is supported by this encrypter
+ switch sigAlg {
+ case RS256, RS384, RS512, PS256, PS384, PS512:
+ default:
+ return recipientSigInfo{}, ErrUnsupportedAlgorithm
+ }
+
+ if privateKey == nil {
+ return recipientSigInfo{}, errors.New("invalid private key")
+ }
+
+ return recipientSigInfo{
+ sigAlg: sigAlg,
+ publicKey: staticPublicKey(&JSONWebKey{
+ Key: privateKey.Public(),
+ }),
+ signer: &rsaDecrypterSigner{
+ privateKey: privateKey,
+ },
+ }, nil
+}
+
+func newEd25519Signer(sigAlg SignatureAlgorithm, privateKey ed25519.PrivateKey) (recipientSigInfo, error) {
+ if sigAlg != EdDSA {
+ return recipientSigInfo{}, ErrUnsupportedAlgorithm
+ }
+
+ if privateKey == nil {
+ return recipientSigInfo{}, errors.New("invalid private key")
+ }
+ return recipientSigInfo{
+ sigAlg: sigAlg,
+ publicKey: staticPublicKey(&JSONWebKey{
+ Key: privateKey.Public(),
+ }),
+ signer: &edDecrypterSigner{
+ privateKey: privateKey,
+ },
+ }, nil
+}
+
+// newECDHRecipient creates recipientKeyInfo based on the given key.
+func newECDHRecipient(keyAlg KeyAlgorithm, publicKey *ecdsa.PublicKey) (recipientKeyInfo, error) {
+ // Verify that key management algorithm is supported by this encrypter
+ switch keyAlg {
+ case ECDH_ES, ECDH_ES_A128KW, ECDH_ES_A192KW, ECDH_ES_A256KW:
+ default:
+ return recipientKeyInfo{}, ErrUnsupportedAlgorithm
+ }
+
+ if publicKey == nil || !publicKey.Curve.IsOnCurve(publicKey.X, publicKey.Y) {
+ return recipientKeyInfo{}, errors.New("invalid public key")
+ }
+
+ return recipientKeyInfo{
+ keyAlg: keyAlg,
+ keyEncrypter: &ecEncrypterVerifier{
+ publicKey: publicKey,
+ },
+ }, nil
+}
+
+// newECDSASigner creates a recipientSigInfo based on the given key.
+func newECDSASigner(sigAlg SignatureAlgorithm, privateKey *ecdsa.PrivateKey) (recipientSigInfo, error) {
+ // Verify that key management algorithm is supported by this encrypter
+ switch sigAlg {
+ case ES256, ES384, ES512:
+ default:
+ return recipientSigInfo{}, ErrUnsupportedAlgorithm
+ }
+
+ if privateKey == nil {
+ return recipientSigInfo{}, errors.New("invalid private key")
+ }
+
+ return recipientSigInfo{
+ sigAlg: sigAlg,
+ publicKey: staticPublicKey(&JSONWebKey{
+ Key: privateKey.Public(),
+ }),
+ signer: &ecDecrypterSigner{
+ privateKey: privateKey,
+ },
+ }, nil
+}
+
+// Encrypt the given payload and update the object.
+func (ctx rsaEncrypterVerifier) encryptKey(cek []byte, alg KeyAlgorithm) (recipientInfo, error) {
+ encryptedKey, err := ctx.encrypt(cek, alg)
+ if err != nil {
+ return recipientInfo{}, err
+ }
+
+ return recipientInfo{
+ encryptedKey: encryptedKey,
+ header: &rawHeader{},
+ }, nil
+}
+
+// Encrypt the given payload. Based on the key encryption algorithm,
+// this will either use RSA-PKCS1v1.5 or RSA-OAEP (with SHA-1 or SHA-256).
+func (ctx rsaEncrypterVerifier) encrypt(cek []byte, alg KeyAlgorithm) ([]byte, error) {
+ switch alg {
+ case RSA1_5:
+ return rsa.EncryptPKCS1v15(RandReader, ctx.publicKey, cek)
+ case RSA_OAEP:
+ return rsa.EncryptOAEP(sha1.New(), RandReader, ctx.publicKey, cek, []byte{})
+ case RSA_OAEP_256:
+ return rsa.EncryptOAEP(sha256.New(), RandReader, ctx.publicKey, cek, []byte{})
+ }
+
+ return nil, ErrUnsupportedAlgorithm
+}
+
+// Decrypt the given payload and return the content encryption key.
+func (ctx rsaDecrypterSigner) decryptKey(headers rawHeader, recipient *recipientInfo, generator keyGenerator) ([]byte, error) {
+ return ctx.decrypt(recipient.encryptedKey, headers.getAlgorithm(), generator)
+}
+
+// Decrypt the given payload. Based on the key encryption algorithm,
+// this will either use RSA-PKCS1v1.5 or RSA-OAEP (with SHA-1 or SHA-256).
+func (ctx rsaDecrypterSigner) decrypt(jek []byte, alg KeyAlgorithm, generator keyGenerator) ([]byte, error) {
+ // Note: The random reader on decrypt operations is only used for blinding,
+ // so stubbing is meanlingless (hence the direct use of rand.Reader).
+ switch alg {
+ case RSA1_5:
+ defer func() {
+ // DecryptPKCS1v15SessionKey sometimes panics on an invalid payload
+ // because of an index out of bounds error, which we want to ignore.
+ // This has been fixed in Go 1.3.1 (released 2014/08/13), the recover()
+ // only exists for preventing crashes with unpatched versions.
+ // See: https://groups.google.com/forum/#!topic/golang-dev/7ihX6Y6kx9k
+ // See: https://code.google.com/p/go/source/detail?r=58ee390ff31602edb66af41ed10901ec95904d33
+ _ = recover()
+ }()
+
+ // Perform some input validation.
+ keyBytes := ctx.privateKey.PublicKey.N.BitLen() / 8
+ if keyBytes != len(jek) {
+ // Input size is incorrect, the encrypted payload should always match
+ // the size of the public modulus (e.g. using a 2048 bit key will
+ // produce 256 bytes of output). Reject this since it's invalid input.
+ return nil, ErrCryptoFailure
+ }
+
+ cek, _, err := generator.genKey()
+ if err != nil {
+ return nil, ErrCryptoFailure
+ }
+
+ // When decrypting an RSA-PKCS1v1.5 payload, we must take precautions to
+ // prevent chosen-ciphertext attacks as described in RFC 3218, "Preventing
+ // the Million Message Attack on Cryptographic Message Syntax". We are
+ // therefore deliberately ignoring errors here.
+ _ = rsa.DecryptPKCS1v15SessionKey(rand.Reader, ctx.privateKey, jek, cek)
+
+ return cek, nil
+ case RSA_OAEP:
+ // Use rand.Reader for RSA blinding
+ return rsa.DecryptOAEP(sha1.New(), rand.Reader, ctx.privateKey, jek, []byte{})
+ case RSA_OAEP_256:
+ // Use rand.Reader for RSA blinding
+ return rsa.DecryptOAEP(sha256.New(), rand.Reader, ctx.privateKey, jek, []byte{})
+ }
+
+ return nil, ErrUnsupportedAlgorithm
+}
+
+// Sign the given payload
+func (ctx rsaDecrypterSigner) signPayload(payload []byte, alg SignatureAlgorithm) (Signature, error) {
+ var hash crypto.Hash
+
+ switch alg {
+ case RS256, PS256:
+ hash = crypto.SHA256
+ case RS384, PS384:
+ hash = crypto.SHA384
+ case RS512, PS512:
+ hash = crypto.SHA512
+ default:
+ return Signature{}, ErrUnsupportedAlgorithm
+ }
+
+ hasher := hash.New()
+
+ // According to documentation, Write() on hash never fails
+ _, _ = hasher.Write(payload)
+ hashed := hasher.Sum(nil)
+
+ var out []byte
+ var err error
+
+ switch alg {
+ case RS256, RS384, RS512:
+ // TODO(https://github.com/go-jose/go-jose/issues/40): As of go1.20, the
+ // random parameter is legacy and ignored, and it can be nil.
+ // https://cs.opensource.google/go/go/+/refs/tags/go1.20:src/crypto/rsa/pkcs1v15.go;l=263;bpv=0;bpt=1
+ out, err = rsa.SignPKCS1v15(RandReader, ctx.privateKey, hash, hashed)
+ case PS256, PS384, PS512:
+ out, err = rsa.SignPSS(RandReader, ctx.privateKey, hash, hashed, &rsa.PSSOptions{
+ SaltLength: rsa.PSSSaltLengthEqualsHash,
+ })
+ }
+
+ if err != nil {
+ return Signature{}, err
+ }
+
+ return Signature{
+ Signature: out,
+ protected: &rawHeader{},
+ }, nil
+}
+
+// Verify the given payload
+func (ctx rsaEncrypterVerifier) verifyPayload(payload []byte, signature []byte, alg SignatureAlgorithm) error {
+ var hash crypto.Hash
+
+ switch alg {
+ case RS256, PS256:
+ hash = crypto.SHA256
+ case RS384, PS384:
+ hash = crypto.SHA384
+ case RS512, PS512:
+ hash = crypto.SHA512
+ default:
+ return ErrUnsupportedAlgorithm
+ }
+
+ hasher := hash.New()
+
+ // According to documentation, Write() on hash never fails
+ _, _ = hasher.Write(payload)
+ hashed := hasher.Sum(nil)
+
+ switch alg {
+ case RS256, RS384, RS512:
+ return rsa.VerifyPKCS1v15(ctx.publicKey, hash, hashed, signature)
+ case PS256, PS384, PS512:
+ return rsa.VerifyPSS(ctx.publicKey, hash, hashed, signature, nil)
+ }
+
+ return ErrUnsupportedAlgorithm
+}
+
+// Encrypt the given payload and update the object.
+func (ctx ecEncrypterVerifier) encryptKey(cek []byte, alg KeyAlgorithm) (recipientInfo, error) {
+ switch alg {
+ case ECDH_ES:
+ // ECDH-ES mode doesn't wrap a key, the shared secret is used directly as the key.
+ return recipientInfo{
+ header: &rawHeader{},
+ }, nil
+ case ECDH_ES_A128KW, ECDH_ES_A192KW, ECDH_ES_A256KW:
+ default:
+ return recipientInfo{}, ErrUnsupportedAlgorithm
+ }
+
+ generator := ecKeyGenerator{
+ algID: string(alg),
+ publicKey: ctx.publicKey,
+ }
+
+ switch alg {
+ case ECDH_ES_A128KW:
+ generator.size = 16
+ case ECDH_ES_A192KW:
+ generator.size = 24
+ case ECDH_ES_A256KW:
+ generator.size = 32
+ }
+
+ kek, header, err := generator.genKey()
+ if err != nil {
+ return recipientInfo{}, err
+ }
+
+ block, err := aes.NewCipher(kek)
+ if err != nil {
+ return recipientInfo{}, err
+ }
+
+ jek, err := josecipher.KeyWrap(block, cek)
+ if err != nil {
+ return recipientInfo{}, err
+ }
+
+ return recipientInfo{
+ encryptedKey: jek,
+ header: &header,
+ }, nil
+}
+
+// Get key size for EC key generator
+func (ctx ecKeyGenerator) keySize() int {
+ return ctx.size
+}
+
+// Get a content encryption key for ECDH-ES
+func (ctx ecKeyGenerator) genKey() ([]byte, rawHeader, error) {
+ priv, err := ecdsa.GenerateKey(ctx.publicKey.Curve, RandReader)
+ if err != nil {
+ return nil, rawHeader{}, err
+ }
+
+ out := josecipher.DeriveECDHES(ctx.algID, []byte{}, []byte{}, priv, ctx.publicKey, ctx.size)
+
+ b, err := json.Marshal(&JSONWebKey{
+ Key: &priv.PublicKey,
+ })
+ if err != nil {
+ return nil, nil, err
+ }
+
+ headers := rawHeader{
+ headerEPK: makeRawMessage(b),
+ }
+
+ return out, headers, nil
+}
+
+// Decrypt the given payload and return the content encryption key.
+func (ctx ecDecrypterSigner) decryptKey(headers rawHeader, recipient *recipientInfo, generator keyGenerator) ([]byte, error) {
+ epk, err := headers.getEPK()
+ if err != nil {
+ return nil, errors.New("go-jose/go-jose: invalid epk header")
+ }
+ if epk == nil {
+ return nil, errors.New("go-jose/go-jose: missing epk header")
+ }
+
+ publicKey, ok := epk.Key.(*ecdsa.PublicKey)
+ if publicKey == nil || !ok {
+ return nil, errors.New("go-jose/go-jose: invalid epk header")
+ }
+
+ if !ctx.privateKey.Curve.IsOnCurve(publicKey.X, publicKey.Y) {
+ return nil, errors.New("go-jose/go-jose: invalid public key in epk header")
+ }
+
+ apuData, err := headers.getAPU()
+ if err != nil {
+ return nil, errors.New("go-jose/go-jose: invalid apu header")
+ }
+ apvData, err := headers.getAPV()
+ if err != nil {
+ return nil, errors.New("go-jose/go-jose: invalid apv header")
+ }
+
+ deriveKey := func(algID string, size int) []byte {
+ return josecipher.DeriveECDHES(algID, apuData.bytes(), apvData.bytes(), ctx.privateKey, publicKey, size)
+ }
+
+ var keySize int
+
+ algorithm := headers.getAlgorithm()
+ switch algorithm {
+ case ECDH_ES:
+ // ECDH-ES uses direct key agreement, no key unwrapping necessary.
+ return deriveKey(string(headers.getEncryption()), generator.keySize()), nil
+ case ECDH_ES_A128KW:
+ keySize = 16
+ case ECDH_ES_A192KW:
+ keySize = 24
+ case ECDH_ES_A256KW:
+ keySize = 32
+ default:
+ return nil, ErrUnsupportedAlgorithm
+ }
+
+ key := deriveKey(string(algorithm), keySize)
+ block, err := aes.NewCipher(key)
+ if err != nil {
+ return nil, err
+ }
+
+ return josecipher.KeyUnwrap(block, recipient.encryptedKey)
+}
+
+func (ctx edDecrypterSigner) signPayload(payload []byte, alg SignatureAlgorithm) (Signature, error) {
+ if alg != EdDSA {
+ return Signature{}, ErrUnsupportedAlgorithm
+ }
+
+ sig, err := ctx.privateKey.Sign(RandReader, payload, crypto.Hash(0))
+ if err != nil {
+ return Signature{}, err
+ }
+
+ return Signature{
+ Signature: sig,
+ protected: &rawHeader{},
+ }, nil
+}
+
+func (ctx edEncrypterVerifier) verifyPayload(payload []byte, signature []byte, alg SignatureAlgorithm) error {
+ if alg != EdDSA {
+ return ErrUnsupportedAlgorithm
+ }
+ ok := ed25519.Verify(ctx.publicKey, payload, signature)
+ if !ok {
+ return errors.New("go-jose/go-jose: ed25519 signature failed to verify")
+ }
+ return nil
+}
+
+// Sign the given payload
+func (ctx ecDecrypterSigner) signPayload(payload []byte, alg SignatureAlgorithm) (Signature, error) {
+ var expectedBitSize int
+ var hash crypto.Hash
+
+ switch alg {
+ case ES256:
+ expectedBitSize = 256
+ hash = crypto.SHA256
+ case ES384:
+ expectedBitSize = 384
+ hash = crypto.SHA384
+ case ES512:
+ expectedBitSize = 521
+ hash = crypto.SHA512
+ }
+
+ curveBits := ctx.privateKey.Curve.Params().BitSize
+ if expectedBitSize != curveBits {
+ return Signature{}, fmt.Errorf("go-jose/go-jose: expected %d bit key, got %d bits instead", expectedBitSize, curveBits)
+ }
+
+ hasher := hash.New()
+
+ // According to documentation, Write() on hash never fails
+ _, _ = hasher.Write(payload)
+ hashed := hasher.Sum(nil)
+
+ r, s, err := ecdsa.Sign(RandReader, ctx.privateKey, hashed)
+ if err != nil {
+ return Signature{}, err
+ }
+
+ keyBytes := curveBits / 8
+ if curveBits%8 > 0 {
+ keyBytes++
+ }
+
+ // We serialize the outputs (r and s) into big-endian byte arrays and pad
+ // them with zeros on the left to make sure the sizes work out. Both arrays
+ // must be keyBytes long, and the output must be 2*keyBytes long.
+ rBytes := r.Bytes()
+ rBytesPadded := make([]byte, keyBytes)
+ copy(rBytesPadded[keyBytes-len(rBytes):], rBytes)
+
+ sBytes := s.Bytes()
+ sBytesPadded := make([]byte, keyBytes)
+ copy(sBytesPadded[keyBytes-len(sBytes):], sBytes)
+
+ out := append(rBytesPadded, sBytesPadded...)
+
+ return Signature{
+ Signature: out,
+ protected: &rawHeader{},
+ }, nil
+}
+
+// Verify the given payload
+func (ctx ecEncrypterVerifier) verifyPayload(payload []byte, signature []byte, alg SignatureAlgorithm) error {
+ var keySize int
+ var hash crypto.Hash
+
+ switch alg {
+ case ES256:
+ keySize = 32
+ hash = crypto.SHA256
+ case ES384:
+ keySize = 48
+ hash = crypto.SHA384
+ case ES512:
+ keySize = 66
+ hash = crypto.SHA512
+ default:
+ return ErrUnsupportedAlgorithm
+ }
+
+ if len(signature) != 2*keySize {
+ return fmt.Errorf("go-jose/go-jose: invalid signature size, have %d bytes, wanted %d", len(signature), 2*keySize)
+ }
+
+ hasher := hash.New()
+
+ // According to documentation, Write() on hash never fails
+ _, _ = hasher.Write(payload)
+ hashed := hasher.Sum(nil)
+
+ r := big.NewInt(0).SetBytes(signature[:keySize])
+ s := big.NewInt(0).SetBytes(signature[keySize:])
+
+ match := ecdsa.Verify(ctx.publicKey, hashed, r, s)
+ if !match {
+ return errors.New("go-jose/go-jose: ecdsa signature failed to verify")
+ }
+
+ return nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/cbc_hmac.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/cbc_hmac.go
new file mode 100644
index 0000000..af029ce
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/cbc_hmac.go
@@ -0,0 +1,196 @@
+/*-
+ * Copyright 2014 Square Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package josecipher
+
+import (
+ "bytes"
+ "crypto/cipher"
+ "crypto/hmac"
+ "crypto/sha256"
+ "crypto/sha512"
+ "crypto/subtle"
+ "encoding/binary"
+ "errors"
+ "hash"
+)
+
+const (
+ nonceBytes = 16
+)
+
+// NewCBCHMAC instantiates a new AEAD based on CBC+HMAC.
+func NewCBCHMAC(key []byte, newBlockCipher func([]byte) (cipher.Block, error)) (cipher.AEAD, error) {
+ keySize := len(key) / 2
+ integrityKey := key[:keySize]
+ encryptionKey := key[keySize:]
+
+ blockCipher, err := newBlockCipher(encryptionKey)
+ if err != nil {
+ return nil, err
+ }
+
+ var hash func() hash.Hash
+ switch keySize {
+ case 16:
+ hash = sha256.New
+ case 24:
+ hash = sha512.New384
+ case 32:
+ hash = sha512.New
+ }
+
+ return &cbcAEAD{
+ hash: hash,
+ blockCipher: blockCipher,
+ authtagBytes: keySize,
+ integrityKey: integrityKey,
+ }, nil
+}
+
+// An AEAD based on CBC+HMAC
+type cbcAEAD struct {
+ hash func() hash.Hash
+ authtagBytes int
+ integrityKey []byte
+ blockCipher cipher.Block
+}
+
+func (ctx *cbcAEAD) NonceSize() int {
+ return nonceBytes
+}
+
+func (ctx *cbcAEAD) Overhead() int {
+ // Maximum overhead is block size (for padding) plus auth tag length, where
+ // the length of the auth tag is equivalent to the key size.
+ return ctx.blockCipher.BlockSize() + ctx.authtagBytes
+}
+
+// Seal encrypts and authenticates the plaintext.
+func (ctx *cbcAEAD) Seal(dst, nonce, plaintext, data []byte) []byte {
+ // Output buffer -- must take care not to mangle plaintext input.
+ ciphertext := make([]byte, uint64(len(plaintext))+uint64(ctx.Overhead()))[:len(plaintext)]
+ copy(ciphertext, plaintext)
+ ciphertext = padBuffer(ciphertext, ctx.blockCipher.BlockSize())
+
+ cbc := cipher.NewCBCEncrypter(ctx.blockCipher, nonce)
+
+ cbc.CryptBlocks(ciphertext, ciphertext)
+ authtag := ctx.computeAuthTag(data, nonce, ciphertext)
+
+ ret, out := resize(dst, uint64(len(dst))+uint64(len(ciphertext))+uint64(len(authtag)))
+ copy(out, ciphertext)
+ copy(out[len(ciphertext):], authtag)
+
+ return ret
+}
+
+// Open decrypts and authenticates the ciphertext.
+func (ctx *cbcAEAD) Open(dst, nonce, ciphertext, data []byte) ([]byte, error) {
+ if len(ciphertext) < ctx.authtagBytes {
+ return nil, errors.New("go-jose/go-jose: invalid ciphertext (too short)")
+ }
+
+ offset := len(ciphertext) - ctx.authtagBytes
+ expectedTag := ctx.computeAuthTag(data, nonce, ciphertext[:offset])
+ match := subtle.ConstantTimeCompare(expectedTag, ciphertext[offset:])
+ if match != 1 {
+ return nil, errors.New("go-jose/go-jose: invalid ciphertext (auth tag mismatch)")
+ }
+
+ cbc := cipher.NewCBCDecrypter(ctx.blockCipher, nonce)
+
+ // Make copy of ciphertext buffer, don't want to modify in place
+ buffer := append([]byte{}, ciphertext[:offset]...)
+
+ if len(buffer)%ctx.blockCipher.BlockSize() > 0 {
+ return nil, errors.New("go-jose/go-jose: invalid ciphertext (invalid length)")
+ }
+
+ cbc.CryptBlocks(buffer, buffer)
+
+ // Remove padding
+ plaintext, err := unpadBuffer(buffer, ctx.blockCipher.BlockSize())
+ if err != nil {
+ return nil, err
+ }
+
+ ret, out := resize(dst, uint64(len(dst))+uint64(len(plaintext)))
+ copy(out, plaintext)
+
+ return ret, nil
+}
+
+// Compute an authentication tag
+func (ctx *cbcAEAD) computeAuthTag(aad, nonce, ciphertext []byte) []byte {
+ buffer := make([]byte, uint64(len(aad))+uint64(len(nonce))+uint64(len(ciphertext))+8)
+ n := 0
+ n += copy(buffer, aad)
+ n += copy(buffer[n:], nonce)
+ n += copy(buffer[n:], ciphertext)
+ binary.BigEndian.PutUint64(buffer[n:], uint64(len(aad))*8)
+
+ // According to documentation, Write() on hash.Hash never fails.
+ hmac := hmac.New(ctx.hash, ctx.integrityKey)
+ _, _ = hmac.Write(buffer)
+
+ return hmac.Sum(nil)[:ctx.authtagBytes]
+}
+
+// resize ensures that the given slice has a capacity of at least n bytes.
+// If the capacity of the slice is less than n, a new slice is allocated
+// and the existing data will be copied.
+func resize(in []byte, n uint64) (head, tail []byte) {
+ if uint64(cap(in)) >= n {
+ head = in[:n]
+ } else {
+ head = make([]byte, n)
+ copy(head, in)
+ }
+
+ tail = head[len(in):]
+ return
+}
+
+// Apply padding
+func padBuffer(buffer []byte, blockSize int) []byte {
+ missing := blockSize - (len(buffer) % blockSize)
+ ret, out := resize(buffer, uint64(len(buffer))+uint64(missing))
+ padding := bytes.Repeat([]byte{byte(missing)}, missing)
+ copy(out, padding)
+ return ret
+}
+
+// Remove padding
+func unpadBuffer(buffer []byte, blockSize int) ([]byte, error) {
+ if len(buffer)%blockSize != 0 {
+ return nil, errors.New("go-jose/go-jose: invalid padding")
+ }
+
+ last := buffer[len(buffer)-1]
+ count := int(last)
+
+ if count == 0 || count > blockSize || count > len(buffer) {
+ return nil, errors.New("go-jose/go-jose: invalid padding")
+ }
+
+ padding := bytes.Repeat([]byte{last}, count)
+ if !bytes.HasSuffix(buffer, padding) {
+ return nil, errors.New("go-jose/go-jose: invalid padding")
+ }
+
+ return buffer[:len(buffer)-count], nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/concat_kdf.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/concat_kdf.go
new file mode 100644
index 0000000..f62c3bd
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/concat_kdf.go
@@ -0,0 +1,75 @@
+/*-
+ * Copyright 2014 Square Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package josecipher
+
+import (
+ "crypto"
+ "encoding/binary"
+ "hash"
+ "io"
+)
+
+type concatKDF struct {
+ z, info []byte
+ i uint32
+ cache []byte
+ hasher hash.Hash
+}
+
+// NewConcatKDF builds a KDF reader based on the given inputs.
+func NewConcatKDF(hash crypto.Hash, z, algID, ptyUInfo, ptyVInfo, supPubInfo, supPrivInfo []byte) io.Reader {
+ buffer := make([]byte, uint64(len(algID))+uint64(len(ptyUInfo))+uint64(len(ptyVInfo))+uint64(len(supPubInfo))+uint64(len(supPrivInfo)))
+ n := 0
+ n += copy(buffer, algID)
+ n += copy(buffer[n:], ptyUInfo)
+ n += copy(buffer[n:], ptyVInfo)
+ n += copy(buffer[n:], supPubInfo)
+ copy(buffer[n:], supPrivInfo)
+
+ hasher := hash.New()
+
+ return &concatKDF{
+ z: z,
+ info: buffer,
+ hasher: hasher,
+ cache: []byte{},
+ i: 1,
+ }
+}
+
+func (ctx *concatKDF) Read(out []byte) (int, error) {
+ copied := copy(out, ctx.cache)
+ ctx.cache = ctx.cache[copied:]
+
+ for copied < len(out) {
+ ctx.hasher.Reset()
+
+ // Write on a hash.Hash never fails
+ _ = binary.Write(ctx.hasher, binary.BigEndian, ctx.i)
+ _, _ = ctx.hasher.Write(ctx.z)
+ _, _ = ctx.hasher.Write(ctx.info)
+
+ hash := ctx.hasher.Sum(nil)
+ chunkCopied := copy(out[copied:], hash)
+ copied += chunkCopied
+ ctx.cache = hash[chunkCopied:]
+
+ ctx.i++
+ }
+
+ return copied, nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/ecdh_es.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/ecdh_es.go
new file mode 100644
index 0000000..093c646
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/ecdh_es.go
@@ -0,0 +1,86 @@
+/*-
+ * Copyright 2014 Square Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package josecipher
+
+import (
+ "bytes"
+ "crypto"
+ "crypto/ecdsa"
+ "crypto/elliptic"
+ "encoding/binary"
+)
+
+// DeriveECDHES derives a shared encryption key using ECDH/ConcatKDF as described in JWE/JWA.
+// It is an error to call this function with a private/public key that are not on the same
+// curve. Callers must ensure that the keys are valid before calling this function. Output
+// size may be at most 1<<16 bytes (64 KiB).
+func DeriveECDHES(alg string, apuData, apvData []byte, priv *ecdsa.PrivateKey, pub *ecdsa.PublicKey, size int) []byte {
+ if size > 1<<16 {
+ panic("ECDH-ES output size too large, must be less than or equal to 1<<16")
+ }
+
+ // algId, partyUInfo, partyVInfo inputs must be prefixed with the length
+ algID := lengthPrefixed([]byte(alg))
+ ptyUInfo := lengthPrefixed(apuData)
+ ptyVInfo := lengthPrefixed(apvData)
+
+ // suppPubInfo is the encoded length of the output size in bits
+ supPubInfo := make([]byte, 4)
+ binary.BigEndian.PutUint32(supPubInfo, uint32(size)*8)
+
+ if !priv.PublicKey.Curve.IsOnCurve(pub.X, pub.Y) {
+ panic("public key not on same curve as private key")
+ }
+
+ z, _ := priv.Curve.ScalarMult(pub.X, pub.Y, priv.D.Bytes())
+ zBytes := z.Bytes()
+
+ // Note that calling z.Bytes() on a big.Int may strip leading zero bytes from
+ // the returned byte array. This can lead to a problem where zBytes will be
+ // shorter than expected which breaks the key derivation. Therefore we must pad
+ // to the full length of the expected coordinate here before calling the KDF.
+ octSize := dSize(priv.Curve)
+ if len(zBytes) != octSize {
+ zBytes = append(bytes.Repeat([]byte{0}, octSize-len(zBytes)), zBytes...)
+ }
+
+ reader := NewConcatKDF(crypto.SHA256, zBytes, algID, ptyUInfo, ptyVInfo, supPubInfo, []byte{})
+ key := make([]byte, size)
+
+ // Read on the KDF will never fail
+ _, _ = reader.Read(key)
+
+ return key
+}
+
+// dSize returns the size in octets for a coordinate on a elliptic curve.
+func dSize(curve elliptic.Curve) int {
+ order := curve.Params().P
+ bitLen := order.BitLen()
+ size := bitLen / 8
+ if bitLen%8 != 0 {
+ size++
+ }
+ return size
+}
+
+func lengthPrefixed(data []byte) []byte {
+ out := make([]byte, len(data)+4)
+ binary.BigEndian.PutUint32(out, uint32(len(data)))
+ copy(out[4:], data)
+ return out
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/key_wrap.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/key_wrap.go
new file mode 100644
index 0000000..b9effbc
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/cipher/key_wrap.go
@@ -0,0 +1,109 @@
+/*-
+ * Copyright 2014 Square Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package josecipher
+
+import (
+ "crypto/cipher"
+ "crypto/subtle"
+ "encoding/binary"
+ "errors"
+)
+
+var defaultIV = []byte{0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6}
+
+// KeyWrap implements NIST key wrapping; it wraps a content encryption key (cek) with the given block cipher.
+func KeyWrap(block cipher.Block, cek []byte) ([]byte, error) {
+ if len(cek)%8 != 0 {
+ return nil, errors.New("go-jose/go-jose: key wrap input must be 8 byte blocks")
+ }
+
+ n := len(cek) / 8
+ r := make([][]byte, n)
+
+ for i := range r {
+ r[i] = make([]byte, 8)
+ copy(r[i], cek[i*8:])
+ }
+
+ buffer := make([]byte, 16)
+ tBytes := make([]byte, 8)
+ copy(buffer, defaultIV)
+
+ for t := 0; t < 6*n; t++ {
+ copy(buffer[8:], r[t%n])
+
+ block.Encrypt(buffer, buffer)
+
+ binary.BigEndian.PutUint64(tBytes, uint64(t+1))
+
+ for i := 0; i < 8; i++ {
+ buffer[i] ^= tBytes[i]
+ }
+ copy(r[t%n], buffer[8:])
+ }
+
+ out := make([]byte, (n+1)*8)
+ copy(out, buffer[:8])
+ for i := range r {
+ copy(out[(i+1)*8:], r[i])
+ }
+
+ return out, nil
+}
+
+// KeyUnwrap implements NIST key unwrapping; it unwraps a content encryption key (cek) with the given block cipher.
+func KeyUnwrap(block cipher.Block, ciphertext []byte) ([]byte, error) {
+ if len(ciphertext)%8 != 0 {
+ return nil, errors.New("go-jose/go-jose: key wrap input must be 8 byte blocks")
+ }
+
+ n := (len(ciphertext) / 8) - 1
+ r := make([][]byte, n)
+
+ for i := range r {
+ r[i] = make([]byte, 8)
+ copy(r[i], ciphertext[(i+1)*8:])
+ }
+
+ buffer := make([]byte, 16)
+ tBytes := make([]byte, 8)
+ copy(buffer[:8], ciphertext[:8])
+
+ for t := 6*n - 1; t >= 0; t-- {
+ binary.BigEndian.PutUint64(tBytes, uint64(t+1))
+
+ for i := 0; i < 8; i++ {
+ buffer[i] ^= tBytes[i]
+ }
+ copy(buffer[8:], r[t%n])
+
+ block.Decrypt(buffer, buffer)
+
+ copy(r[t%n], buffer[8:])
+ }
+
+ if subtle.ConstantTimeCompare(buffer[:8], defaultIV) == 0 {
+ return nil, errors.New("go-jose/go-jose: failed to unwrap key")
+ }
+
+ out := make([]byte, n*8)
+ for i := range r {
+ copy(out[i*8:], r[i])
+ }
+
+ return out, nil
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/crypter.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/crypter.go
new file mode 100644
index 0000000..8870e89
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/crypter.go
@@ -0,0 +1,593 @@
+/*-
+ * Copyright 2014 Square Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package jose
+
+import (
+ "crypto/ecdsa"
+ "crypto/rsa"
+ "errors"
+ "fmt"
+
+ "github.com/go-jose/go-jose/v3/json"
+)
+
+// Encrypter represents an encrypter which produces an encrypted JWE object.
+type Encrypter interface {
+ Encrypt(plaintext []byte) (*JSONWebEncryption, error)
+ EncryptWithAuthData(plaintext []byte, aad []byte) (*JSONWebEncryption, error)
+ Options() EncrypterOptions
+}
+
+// A generic content cipher
+type contentCipher interface {
+ keySize() int
+ encrypt(cek []byte, aad, plaintext []byte) (*aeadParts, error)
+ decrypt(cek []byte, aad []byte, parts *aeadParts) ([]byte, error)
+}
+
+// A key generator (for generating/getting a CEK)
+type keyGenerator interface {
+ keySize() int
+ genKey() ([]byte, rawHeader, error)
+}
+
+// A generic key encrypter
+type keyEncrypter interface {
+ encryptKey(cek []byte, alg KeyAlgorithm) (recipientInfo, error) // Encrypt a key
+}
+
+// A generic key decrypter
+type keyDecrypter interface {
+ decryptKey(headers rawHeader, recipient *recipientInfo, generator keyGenerator) ([]byte, error) // Decrypt a key
+}
+
+// A generic encrypter based on the given key encrypter and content cipher.
+type genericEncrypter struct {
+ contentAlg ContentEncryption
+ compressionAlg CompressionAlgorithm
+ cipher contentCipher
+ recipients []recipientKeyInfo
+ keyGenerator keyGenerator
+ extraHeaders map[HeaderKey]interface{}
+}
+
+type recipientKeyInfo struct {
+ keyID string
+ keyAlg KeyAlgorithm
+ keyEncrypter keyEncrypter
+}
+
+// EncrypterOptions represents options that can be set on new encrypters.
+type EncrypterOptions struct {
+ Compression CompressionAlgorithm
+
+ // Optional map of name/value pairs to be inserted into the protected
+ // header of a JWS object. Some specifications which make use of
+ // JWS require additional values here.
+ //
+ // Values will be serialized by [json.Marshal] and must be valid inputs to
+ // that function.
+ //
+ // [json.Marshal]: https://pkg.go.dev/encoding/json#Marshal
+ ExtraHeaders map[HeaderKey]interface{}
+}
+
+// WithHeader adds an arbitrary value to the ExtraHeaders map, initializing it
+// if necessary, and returns the updated EncrypterOptions.
+//
+// The v parameter will be serialized by [json.Marshal] and must be a valid
+// input to that function.
+//
+// [json.Marshal]: https://pkg.go.dev/encoding/json#Marshal
+func (eo *EncrypterOptions) WithHeader(k HeaderKey, v interface{}) *EncrypterOptions {
+ if eo.ExtraHeaders == nil {
+ eo.ExtraHeaders = map[HeaderKey]interface{}{}
+ }
+ eo.ExtraHeaders[k] = v
+ return eo
+}
+
+// WithContentType adds a content type ("cty") header and returns the updated
+// EncrypterOptions.
+func (eo *EncrypterOptions) WithContentType(contentType ContentType) *EncrypterOptions {
+ return eo.WithHeader(HeaderContentType, contentType)
+}
+
+// WithType adds a type ("typ") header and returns the updated EncrypterOptions.
+func (eo *EncrypterOptions) WithType(typ ContentType) *EncrypterOptions {
+ return eo.WithHeader(HeaderType, typ)
+}
+
+// Recipient represents an algorithm/key to encrypt messages to.
+//
+// PBES2Count and PBES2Salt correspond with the "p2c" and "p2s" headers used
+// on the password-based encryption algorithms PBES2-HS256+A128KW,
+// PBES2-HS384+A192KW, and PBES2-HS512+A256KW. If they are not provided a safe
+// default of 100000 will be used for the count and a 128-bit random salt will
+// be generated.
+type Recipient struct {
+ Algorithm KeyAlgorithm
+ // Key must have one of these types:
+ // - ed25519.PublicKey
+ // - *ecdsa.PublicKey
+ // - *rsa.PublicKey
+ // - *JSONWebKey
+ // - JSONWebKey
+ // - []byte (a symmetric key)
+ // - Any type that satisfies the OpaqueKeyEncrypter interface
+ //
+ // The type of Key must match the value of Algorithm.
+ Key interface{}
+ KeyID string
+ PBES2Count int
+ PBES2Salt []byte
+}
+
+// NewEncrypter creates an appropriate encrypter based on the key type
+func NewEncrypter(enc ContentEncryption, rcpt Recipient, opts *EncrypterOptions) (Encrypter, error) {
+ encrypter := &genericEncrypter{
+ contentAlg: enc,
+ recipients: []recipientKeyInfo{},
+ cipher: getContentCipher(enc),
+ }
+ if opts != nil {
+ encrypter.compressionAlg = opts.Compression
+ encrypter.extraHeaders = opts.ExtraHeaders
+ }
+
+ if encrypter.cipher == nil {
+ return nil, ErrUnsupportedAlgorithm
+ }
+
+ var keyID string
+ var rawKey interface{}
+ switch encryptionKey := rcpt.Key.(type) {
+ case JSONWebKey:
+ keyID, rawKey = encryptionKey.KeyID, encryptionKey.Key
+ case *JSONWebKey:
+ keyID, rawKey = encryptionKey.KeyID, encryptionKey.Key
+ case OpaqueKeyEncrypter:
+ keyID, rawKey = encryptionKey.KeyID(), encryptionKey
+ default:
+ rawKey = encryptionKey
+ }
+
+ switch rcpt.Algorithm {
+ case DIRECT:
+ // Direct encryption mode must be treated differently
+ keyBytes, ok := rawKey.([]byte)
+ if !ok {
+ return nil, ErrUnsupportedKeyType
+ }
+ if encrypter.cipher.keySize() != len(keyBytes) {
+ return nil, ErrInvalidKeySize
+ }
+ encrypter.keyGenerator = staticKeyGenerator{
+ key: keyBytes,
+ }
+ recipientInfo, _ := newSymmetricRecipient(rcpt.Algorithm, keyBytes)
+ recipientInfo.keyID = keyID
+ if rcpt.KeyID != "" {
+ recipientInfo.keyID = rcpt.KeyID
+ }
+ encrypter.recipients = []recipientKeyInfo{recipientInfo}
+ return encrypter, nil
+ case ECDH_ES:
+ // ECDH-ES (w/o key wrapping) is similar to DIRECT mode
+ keyDSA, ok := rawKey.(*ecdsa.PublicKey)
+ if !ok {
+ return nil, ErrUnsupportedKeyType
+ }
+ encrypter.keyGenerator = ecKeyGenerator{
+ size: encrypter.cipher.keySize(),
+ algID: string(enc),
+ publicKey: keyDSA,
+ }
+ recipientInfo, _ := newECDHRecipient(rcpt.Algorithm, keyDSA)
+ recipientInfo.keyID = keyID
+ if rcpt.KeyID != "" {
+ recipientInfo.keyID = rcpt.KeyID
+ }
+ encrypter.recipients = []recipientKeyInfo{recipientInfo}
+ return encrypter, nil
+ default:
+ // Can just add a standard recipient
+ encrypter.keyGenerator = randomKeyGenerator{
+ size: encrypter.cipher.keySize(),
+ }
+ err := encrypter.addRecipient(rcpt)
+ return encrypter, err
+ }
+}
+
+// NewMultiEncrypter creates a multi-encrypter based on the given parameters
+func NewMultiEncrypter(enc ContentEncryption, rcpts []Recipient, opts *EncrypterOptions) (Encrypter, error) {
+ cipher := getContentCipher(enc)
+
+ if cipher == nil {
+ return nil, ErrUnsupportedAlgorithm
+ }
+ if len(rcpts) == 0 {
+ return nil, fmt.Errorf("go-jose/go-jose: recipients is nil or empty")
+ }
+
+ encrypter := &genericEncrypter{
+ contentAlg: enc,
+ recipients: []recipientKeyInfo{},
+ cipher: cipher,
+ keyGenerator: randomKeyGenerator{
+ size: cipher.keySize(),
+ },
+ }
+
+ if opts != nil {
+ encrypter.compressionAlg = opts.Compression
+ encrypter.extraHeaders = opts.ExtraHeaders
+ }
+
+ for _, recipient := range rcpts {
+ err := encrypter.addRecipient(recipient)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return encrypter, nil
+}
+
+func (ctx *genericEncrypter) addRecipient(recipient Recipient) (err error) {
+ var recipientInfo recipientKeyInfo
+
+ switch recipient.Algorithm {
+ case DIRECT, ECDH_ES:
+ return fmt.Errorf("go-jose/go-jose: key algorithm '%s' not supported in multi-recipient mode", recipient.Algorithm)
+ }
+
+ recipientInfo, err = makeJWERecipient(recipient.Algorithm, recipient.Key)
+ if recipient.KeyID != "" {
+ recipientInfo.keyID = recipient.KeyID
+ }
+
+ switch recipient.Algorithm {
+ case PBES2_HS256_A128KW, PBES2_HS384_A192KW, PBES2_HS512_A256KW:
+ if sr, ok := recipientInfo.keyEncrypter.(*symmetricKeyCipher); ok {
+ sr.p2c = recipient.PBES2Count
+ sr.p2s = recipient.PBES2Salt
+ }
+ }
+
+ if err == nil {
+ ctx.recipients = append(ctx.recipients, recipientInfo)
+ }
+ return err
+}
+
+func makeJWERecipient(alg KeyAlgorithm, encryptionKey interface{}) (recipientKeyInfo, error) {
+ switch encryptionKey := encryptionKey.(type) {
+ case *rsa.PublicKey:
+ return newRSARecipient(alg, encryptionKey)
+ case *ecdsa.PublicKey:
+ return newECDHRecipient(alg, encryptionKey)
+ case []byte:
+ return newSymmetricRecipient(alg, encryptionKey)
+ case string:
+ return newSymmetricRecipient(alg, []byte(encryptionKey))
+ case *JSONWebKey:
+ recipient, err := makeJWERecipient(alg, encryptionKey.Key)
+ recipient.keyID = encryptionKey.KeyID
+ return recipient, err
+ case OpaqueKeyEncrypter:
+ return newOpaqueKeyEncrypter(alg, encryptionKey)
+ }
+ return recipientKeyInfo{}, ErrUnsupportedKeyType
+}
+
+// newDecrypter creates an appropriate decrypter based on the key type
+func newDecrypter(decryptionKey interface{}) (keyDecrypter, error) {
+ switch decryptionKey := decryptionKey.(type) {
+ case *rsa.PrivateKey:
+ return &rsaDecrypterSigner{
+ privateKey: decryptionKey,
+ }, nil
+ case *ecdsa.PrivateKey:
+ return &ecDecrypterSigner{
+ privateKey: decryptionKey,
+ }, nil
+ case []byte:
+ return &symmetricKeyCipher{
+ key: decryptionKey,
+ }, nil
+ case string:
+ return &symmetricKeyCipher{
+ key: []byte(decryptionKey),
+ }, nil
+ case JSONWebKey:
+ return newDecrypter(decryptionKey.Key)
+ case *JSONWebKey:
+ return newDecrypter(decryptionKey.Key)
+ case OpaqueKeyDecrypter:
+ return &opaqueKeyDecrypter{decrypter: decryptionKey}, nil
+ default:
+ return nil, ErrUnsupportedKeyType
+ }
+}
+
+// Implementation of encrypt method producing a JWE object.
+func (ctx *genericEncrypter) Encrypt(plaintext []byte) (*JSONWebEncryption, error) {
+ return ctx.EncryptWithAuthData(plaintext, nil)
+}
+
+// Implementation of encrypt method producing a JWE object.
+func (ctx *genericEncrypter) EncryptWithAuthData(plaintext, aad []byte) (*JSONWebEncryption, error) {
+ obj := &JSONWebEncryption{}
+ obj.aad = aad
+
+ obj.protected = &rawHeader{}
+ err := obj.protected.set(headerEncryption, ctx.contentAlg)
+ if err != nil {
+ return nil, err
+ }
+
+ obj.recipients = make([]recipientInfo, len(ctx.recipients))
+
+ if len(ctx.recipients) == 0 {
+ return nil, fmt.Errorf("go-jose/go-jose: no recipients to encrypt to")
+ }
+
+ cek, headers, err := ctx.keyGenerator.genKey()
+ if err != nil {
+ return nil, err
+ }
+
+ obj.protected.merge(&headers)
+
+ for i, info := range ctx.recipients {
+ recipient, err := info.keyEncrypter.encryptKey(cek, info.keyAlg)
+ if err != nil {
+ return nil, err
+ }
+
+ err = recipient.header.set(headerAlgorithm, info.keyAlg)
+ if err != nil {
+ return nil, err
+ }
+
+ if info.keyID != "" {
+ err = recipient.header.set(headerKeyID, info.keyID)
+ if err != nil {
+ return nil, err
+ }
+ }
+ obj.recipients[i] = recipient
+ }
+
+ if len(ctx.recipients) == 1 {
+ // Move per-recipient headers into main protected header if there's
+ // only a single recipient.
+ obj.protected.merge(obj.recipients[0].header)
+ obj.recipients[0].header = nil
+ }
+
+ if ctx.compressionAlg != NONE {
+ plaintext, err = compress(ctx.compressionAlg, plaintext)
+ if err != nil {
+ return nil, err
+ }
+
+ err = obj.protected.set(headerCompression, ctx.compressionAlg)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ for k, v := range ctx.extraHeaders {
+ b, err := json.Marshal(v)
+ if err != nil {
+ return nil, err
+ }
+ (*obj.protected)[k] = makeRawMessage(b)
+ }
+
+ authData := obj.computeAuthData()
+ parts, err := ctx.cipher.encrypt(cek, authData, plaintext)
+ if err != nil {
+ return nil, err
+ }
+
+ obj.iv = parts.iv
+ obj.ciphertext = parts.ciphertext
+ obj.tag = parts.tag
+
+ return obj, nil
+}
+
+func (ctx *genericEncrypter) Options() EncrypterOptions {
+ return EncrypterOptions{
+ Compression: ctx.compressionAlg,
+ ExtraHeaders: ctx.extraHeaders,
+ }
+}
+
+// Decrypt and validate the object and return the plaintext. This
+// function does not support multi-recipient. If you desire multi-recipient
+// decryption use DecryptMulti instead.
+//
+// The decryptionKey argument must contain a private or symmetric key
+// and must have one of these types:
+// - *ecdsa.PrivateKey
+// - *rsa.PrivateKey
+// - *JSONWebKey
+// - JSONWebKey
+// - *JSONWebKeySet
+// - JSONWebKeySet
+// - []byte (a symmetric key)
+// - string (a symmetric key)
+// - Any type that satisfies the OpaqueKeyDecrypter interface.
+//
+// Note that ed25519 is only available for signatures, not encryption, so is
+// not an option here.
+//
+// Automatically decompresses plaintext, but returns an error if the decompressed
+// data would be >250kB or >10x the size of the compressed data, whichever is larger.
+func (obj JSONWebEncryption) Decrypt(decryptionKey interface{}) ([]byte, error) {
+ headers := obj.mergedHeaders(nil)
+
+ if len(obj.recipients) > 1 {
+ return nil, errors.New("go-jose/go-jose: too many recipients in payload; expecting only one")
+ }
+
+ critical, err := headers.getCritical()
+ if err != nil {
+ return nil, fmt.Errorf("go-jose/go-jose: invalid crit header")
+ }
+
+ if len(critical) > 0 {
+ return nil, fmt.Errorf("go-jose/go-jose: unsupported crit header")
+ }
+
+ key := tryJWKS(decryptionKey, obj.Header)
+ decrypter, err := newDecrypter(key)
+ if err != nil {
+ return nil, err
+ }
+
+ cipher := getContentCipher(headers.getEncryption())
+ if cipher == nil {
+ return nil, fmt.Errorf("go-jose/go-jose: unsupported enc value '%s'", string(headers.getEncryption()))
+ }
+
+ generator := randomKeyGenerator{
+ size: cipher.keySize(),
+ }
+
+ parts := &aeadParts{
+ iv: obj.iv,
+ ciphertext: obj.ciphertext,
+ tag: obj.tag,
+ }
+
+ authData := obj.computeAuthData()
+
+ var plaintext []byte
+ recipient := obj.recipients[0]
+ recipientHeaders := obj.mergedHeaders(&recipient)
+
+ cek, err := decrypter.decryptKey(recipientHeaders, &recipient, generator)
+ if err == nil {
+ // Found a valid CEK -- let's try to decrypt.
+ plaintext, err = cipher.decrypt(cek, authData, parts)
+ }
+
+ if plaintext == nil {
+ return nil, ErrCryptoFailure
+ }
+
+ // The "zip" header parameter may only be present in the protected header.
+ if comp := obj.protected.getCompression(); comp != "" {
+ plaintext, err = decompress(comp, plaintext)
+ if err != nil {
+ return nil, fmt.Errorf("go-jose/go-jose: failed to decompress plaintext: %v", err)
+ }
+ }
+
+ return plaintext, nil
+}
+
+// DecryptMulti decrypts and validates the object and returns the plaintexts,
+// with support for multiple recipients. It returns the index of the recipient
+// for which the decryption was successful, the merged headers for that recipient,
+// and the plaintext.
+//
+// The decryptionKey argument must have one of the types allowed for the
+// decryptionKey argument of Decrypt().
+//
+// Automatically decompresses plaintext, but returns an error if the decompressed
+// data would be >250kB or >3x the size of the compressed data, whichever is larger.
+func (obj JSONWebEncryption) DecryptMulti(decryptionKey interface{}) (int, Header, []byte, error) {
+ globalHeaders := obj.mergedHeaders(nil)
+
+ critical, err := globalHeaders.getCritical()
+ if err != nil {
+ return -1, Header{}, nil, fmt.Errorf("go-jose/go-jose: invalid crit header")
+ }
+
+ if len(critical) > 0 {
+ return -1, Header{}, nil, fmt.Errorf("go-jose/go-jose: unsupported crit header")
+ }
+
+ key := tryJWKS(decryptionKey, obj.Header)
+ decrypter, err := newDecrypter(key)
+ if err != nil {
+ return -1, Header{}, nil, err
+ }
+
+ encryption := globalHeaders.getEncryption()
+ cipher := getContentCipher(encryption)
+ if cipher == nil {
+ return -1, Header{}, nil, fmt.Errorf("go-jose/go-jose: unsupported enc value '%s'", string(encryption))
+ }
+
+ generator := randomKeyGenerator{
+ size: cipher.keySize(),
+ }
+
+ parts := &aeadParts{
+ iv: obj.iv,
+ ciphertext: obj.ciphertext,
+ tag: obj.tag,
+ }
+
+ authData := obj.computeAuthData()
+
+ index := -1
+ var plaintext []byte
+ var headers rawHeader
+
+ for i, recipient := range obj.recipients {
+ recipientHeaders := obj.mergedHeaders(&recipient)
+
+ cek, err := decrypter.decryptKey(recipientHeaders, &recipient, generator)
+ if err == nil {
+ // Found a valid CEK -- let's try to decrypt.
+ plaintext, err = cipher.decrypt(cek, authData, parts)
+ if err == nil {
+ index = i
+ headers = recipientHeaders
+ break
+ }
+ }
+ }
+
+ if plaintext == nil {
+ return -1, Header{}, nil, ErrCryptoFailure
+ }
+
+ // The "zip" header parameter may only be present in the protected header.
+ if comp := obj.protected.getCompression(); comp != "" {
+ plaintext, err = decompress(comp, plaintext)
+ if err != nil {
+ return -1, Header{}, nil, fmt.Errorf("go-jose/go-jose: failed to decompress plaintext: %v", err)
+ }
+ }
+
+ sanitized, err := headers.sanitized()
+ if err != nil {
+ return -1, Header{}, nil, fmt.Errorf("go-jose/go-jose: failed to sanitize header: %v", err)
+ }
+
+ return index, sanitized, plaintext, err
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/doc.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/doc.go
new file mode 100644
index 0000000..0ad40ca
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/doc.go
@@ -0,0 +1,25 @@
+/*-
+ * Copyright 2014 Square Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+Package jose aims to provide an implementation of the Javascript Object Signing
+and Encryption set of standards. It implements encryption and signing based on
+the JSON Web Encryption and JSON Web Signature standards, with optional JSON Web
+Token support available in a sub-package. The library supports both the compact
+and JWS/JWE JSON Serialization formats, and has optional support for multiple
+recipients.
+*/
+package jose
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/encoding.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/encoding.go
new file mode 100644
index 0000000..9f07cfd
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/encoding.go
@@ -0,0 +1,237 @@
+/*-
+ * Copyright 2014 Square Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package jose
+
+import (
+ "bytes"
+ "compress/flate"
+ "encoding/base64"
+ "encoding/binary"
+ "fmt"
+ "io"
+ "math/big"
+ "strings"
+ "unicode"
+
+ "github.com/go-jose/go-jose/v3/json"
+)
+
+// Helper function to serialize known-good objects.
+// Precondition: value is not a nil pointer.
+func mustSerializeJSON(value interface{}) []byte {
+ out, err := json.Marshal(value)
+ if err != nil {
+ panic(err)
+ }
+ // We never want to serialize the top-level value "null," since it's not a
+ // valid JOSE message. But if a caller passes in a nil pointer to this method,
+ // MarshalJSON will happily serialize it as the top-level value "null". If
+ // that value is then embedded in another operation, for instance by being
+ // base64-encoded and fed as input to a signing algorithm
+ // (https://github.com/go-jose/go-jose/issues/22), the result will be
+ // incorrect. Because this method is intended for known-good objects, and a nil
+ // pointer is not a known-good object, we are free to panic in this case.
+ // Note: It's not possible to directly check whether the data pointed at by an
+ // interface is a nil pointer, so we do this hacky workaround.
+ // https://groups.google.com/forum/#!topic/golang-nuts/wnH302gBa4I
+ if string(out) == "null" {
+ panic("Tried to serialize a nil pointer.")
+ }
+ return out
+}
+
+// Strip all newlines and whitespace
+func stripWhitespace(data string) string {
+ buf := strings.Builder{}
+ buf.Grow(len(data))
+ for _, r := range data {
+ if !unicode.IsSpace(r) {
+ buf.WriteRune(r)
+ }
+ }
+ return buf.String()
+}
+
+// Perform compression based on algorithm
+func compress(algorithm CompressionAlgorithm, input []byte) ([]byte, error) {
+ switch algorithm {
+ case DEFLATE:
+ return deflate(input)
+ default:
+ return nil, ErrUnsupportedAlgorithm
+ }
+}
+
+// Perform decompression based on algorithm
+func decompress(algorithm CompressionAlgorithm, input []byte) ([]byte, error) {
+ switch algorithm {
+ case DEFLATE:
+ return inflate(input)
+ default:
+ return nil, ErrUnsupportedAlgorithm
+ }
+}
+
+// deflate compresses the input.
+func deflate(input []byte) ([]byte, error) {
+ output := new(bytes.Buffer)
+
+ // Writing to byte buffer, err is always nil
+ writer, _ := flate.NewWriter(output, 1)
+ _, _ = io.Copy(writer, bytes.NewBuffer(input))
+
+ err := writer.Close()
+ return output.Bytes(), err
+}
+
+// inflate decompresses the input.
+//
+// Errors if the decompressed data would be >250kB or >10x the size of the
+// compressed data, whichever is larger.
+func inflate(input []byte) ([]byte, error) {
+ output := new(bytes.Buffer)
+ reader := flate.NewReader(bytes.NewBuffer(input))
+
+ maxCompressedSize := 10 * int64(len(input))
+ if maxCompressedSize < 250000 {
+ maxCompressedSize = 250000
+ }
+
+ limit := maxCompressedSize + 1
+ n, err := io.CopyN(output, reader, limit)
+ if err != nil && err != io.EOF {
+ return nil, err
+ }
+ if n == limit {
+ return nil, fmt.Errorf("uncompressed data would be too large (>%d bytes)", maxCompressedSize)
+ }
+
+ err = reader.Close()
+ return output.Bytes(), err
+}
+
+// byteBuffer represents a slice of bytes that can be serialized to url-safe base64.
+type byteBuffer struct {
+ data []byte
+}
+
+func newBuffer(data []byte) *byteBuffer {
+ if data == nil {
+ return nil
+ }
+ return &byteBuffer{
+ data: data,
+ }
+}
+
+func newFixedSizeBuffer(data []byte, length int) *byteBuffer {
+ if len(data) > length {
+ panic("go-jose/go-jose: invalid call to newFixedSizeBuffer (len(data) > length)")
+ }
+ pad := make([]byte, length-len(data))
+ return newBuffer(append(pad, data...))
+}
+
+func newBufferFromInt(num uint64) *byteBuffer {
+ data := make([]byte, 8)
+ binary.BigEndian.PutUint64(data, num)
+ return newBuffer(bytes.TrimLeft(data, "\x00"))
+}
+
+func (b *byteBuffer) MarshalJSON() ([]byte, error) {
+ return json.Marshal(b.base64())
+}
+
+func (b *byteBuffer) UnmarshalJSON(data []byte) error {
+ var encoded string
+ err := json.Unmarshal(data, &encoded)
+ if err != nil {
+ return err
+ }
+
+ if encoded == "" {
+ return nil
+ }
+
+ decoded, err := base64URLDecode(encoded)
+ if err != nil {
+ return err
+ }
+
+ *b = *newBuffer(decoded)
+
+ return nil
+}
+
+func (b *byteBuffer) base64() string {
+ return base64.RawURLEncoding.EncodeToString(b.data)
+}
+
+func (b *byteBuffer) bytes() []byte {
+ // Handling nil here allows us to transparently handle nil slices when serializing.
+ if b == nil {
+ return nil
+ }
+ return b.data
+}
+
+func (b byteBuffer) bigInt() *big.Int {
+ return new(big.Int).SetBytes(b.data)
+}
+
+func (b byteBuffer) toInt() int {
+ return int(b.bigInt().Int64())
+}
+
+// base64URLDecode is implemented as defined in https://www.rfc-editor.org/rfc/rfc7515.html#appendix-C
+func base64URLDecode(value string) ([]byte, error) {
+ value = strings.TrimRight(value, "=")
+ return base64.RawURLEncoding.DecodeString(value)
+}
+
+func base64EncodeLen(sl []byte) int {
+ return base64.RawURLEncoding.EncodedLen(len(sl))
+}
+
+func base64JoinWithDots(inputs ...[]byte) string {
+ if len(inputs) == 0 {
+ return ""
+ }
+
+ // Count of dots.
+ totalCount := len(inputs) - 1
+
+ for _, input := range inputs {
+ totalCount += base64EncodeLen(input)
+ }
+
+ out := make([]byte, totalCount)
+ startEncode := 0
+ for i, input := range inputs {
+ base64.RawURLEncoding.Encode(out[startEncode:], input)
+
+ if i == len(inputs)-1 {
+ continue
+ }
+
+ startEncode += base64EncodeLen(input)
+ out[startEncode] = '.'
+ startEncode++
+ }
+
+ return string(out)
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/LICENSE b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/LICENSE
new file mode 100644
index 0000000..7448756
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2012 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/README.md b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/README.md
new file mode 100644
index 0000000..86de5e5
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/README.md
@@ -0,0 +1,13 @@
+# Safe JSON
+
+This repository contains a fork of the `encoding/json` package from Go 1.6.
+
+The following changes were made:
+
+* Object deserialization uses case-sensitive member name matching instead of
+ [case-insensitive matching](https://www.ietf.org/mail-archive/web/json/current/msg03763.html).
+ This is to avoid differences in the interpretation of JOSE messages between
+ go-jose and libraries written in other languages.
+* When deserializing a JSON object, we check for duplicate keys and reject the
+ input whenever we detect a duplicate. Rather than trying to work with malformed
+ data, we prefer to reject it right away.
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/decode.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/decode.go
new file mode 100644
index 0000000..50634dd
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/decode.go
@@ -0,0 +1,1216 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Represents JSON data structure using native Go types: booleans, floats,
+// strings, arrays, and maps.
+
+package json
+
+import (
+ "bytes"
+ "encoding"
+ "encoding/base64"
+ "errors"
+ "fmt"
+ "math"
+ "reflect"
+ "runtime"
+ "strconv"
+ "unicode"
+ "unicode/utf16"
+ "unicode/utf8"
+)
+
+// Unmarshal parses the JSON-encoded data and stores the result
+// in the value pointed to by v.
+//
+// Unmarshal uses the inverse of the encodings that
+// Marshal uses, allocating maps, slices, and pointers as necessary,
+// with the following additional rules:
+//
+// To unmarshal JSON into a pointer, Unmarshal first handles the case of
+// the JSON being the JSON literal null. In that case, Unmarshal sets
+// the pointer to nil. Otherwise, Unmarshal unmarshals the JSON into
+// the value pointed at by the pointer. If the pointer is nil, Unmarshal
+// allocates a new value for it to point to.
+//
+// To unmarshal JSON into a struct, Unmarshal matches incoming object
+// keys to the keys used by Marshal (either the struct field name or its tag),
+// preferring an exact match but also accepting a case-insensitive match.
+// Unmarshal will only set exported fields of the struct.
+//
+// To unmarshal JSON into an interface value,
+// Unmarshal stores one of these in the interface value:
+//
+// bool, for JSON booleans
+// float64, for JSON numbers
+// string, for JSON strings
+// []interface{}, for JSON arrays
+// map[string]interface{}, for JSON objects
+// nil for JSON null
+//
+// To unmarshal a JSON array into a slice, Unmarshal resets the slice length
+// to zero and then appends each element to the slice.
+// As a special case, to unmarshal an empty JSON array into a slice,
+// Unmarshal replaces the slice with a new empty slice.
+//
+// To unmarshal a JSON array into a Go array, Unmarshal decodes
+// JSON array elements into corresponding Go array elements.
+// If the Go array is smaller than the JSON array,
+// the additional JSON array elements are discarded.
+// If the JSON array is smaller than the Go array,
+// the additional Go array elements are set to zero values.
+//
+// To unmarshal a JSON object into a string-keyed map, Unmarshal first
+// establishes a map to use, If the map is nil, Unmarshal allocates a new map.
+// Otherwise Unmarshal reuses the existing map, keeping existing entries.
+// Unmarshal then stores key-value pairs from the JSON object into the map.
+//
+// If a JSON value is not appropriate for a given target type,
+// or if a JSON number overflows the target type, Unmarshal
+// skips that field and completes the unmarshaling as best it can.
+// If no more serious errors are encountered, Unmarshal returns
+// an UnmarshalTypeError describing the earliest such error.
+//
+// The JSON null value unmarshals into an interface, map, pointer, or slice
+// by setting that Go value to nil. Because null is often used in JSON to mean
+// “not present,” unmarshaling a JSON null into any other Go type has no effect
+// on the value and produces no error.
+//
+// When unmarshaling quoted strings, invalid UTF-8 or
+// invalid UTF-16 surrogate pairs are not treated as an error.
+// Instead, they are replaced by the Unicode replacement
+// character U+FFFD.
+func Unmarshal(data []byte, v interface{}) error {
+ // Check for well-formedness.
+ // Avoids filling out half a data structure
+ // before discovering a JSON syntax error.
+ var d decodeState
+ err := checkValid(data, &d.scan)
+ if err != nil {
+ return err
+ }
+
+ d.init(data)
+ return d.unmarshal(v)
+}
+
+// Unmarshaler is the interface implemented by objects
+// that can unmarshal a JSON description of themselves.
+// The input can be assumed to be a valid encoding of
+// a JSON value. UnmarshalJSON must copy the JSON data
+// if it wishes to retain the data after returning.
+type Unmarshaler interface {
+ UnmarshalJSON([]byte) error
+}
+
+// An UnmarshalTypeError describes a JSON value that was
+// not appropriate for a value of a specific Go type.
+type UnmarshalTypeError struct {
+ Value string // description of JSON value - "bool", "array", "number -5"
+ Type reflect.Type // type of Go value it could not be assigned to
+ Offset int64 // error occurred after reading Offset bytes
+}
+
+func (e *UnmarshalTypeError) Error() string {
+ return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String()
+}
+
+// An UnmarshalFieldError describes a JSON object key that
+// led to an unexported (and therefore unwritable) struct field.
+// (No longer used; kept for compatibility.)
+type UnmarshalFieldError struct {
+ Key string
+ Type reflect.Type
+ Field reflect.StructField
+}
+
+func (e *UnmarshalFieldError) Error() string {
+ return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String()
+}
+
+// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal.
+// (The argument to Unmarshal must be a non-nil pointer.)
+type InvalidUnmarshalError struct {
+ Type reflect.Type
+}
+
+func (e *InvalidUnmarshalError) Error() string {
+ if e.Type == nil {
+ return "json: Unmarshal(nil)"
+ }
+
+ if e.Type.Kind() != reflect.Ptr {
+ return "json: Unmarshal(non-pointer " + e.Type.String() + ")"
+ }
+ return "json: Unmarshal(nil " + e.Type.String() + ")"
+}
+
+func (d *decodeState) unmarshal(v interface{}) (err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ if _, ok := r.(runtime.Error); ok {
+ panic(r)
+ }
+ err = r.(error)
+ }
+ }()
+
+ rv := reflect.ValueOf(v)
+ if rv.Kind() != reflect.Ptr || rv.IsNil() {
+ return &InvalidUnmarshalError{reflect.TypeOf(v)}
+ }
+
+ d.scan.reset()
+ // We decode rv not rv.Elem because the Unmarshaler interface
+ // test must be applied at the top level of the value.
+ d.value(rv)
+ return d.savedError
+}
+
+// A Number represents a JSON number literal.
+type Number string
+
+// String returns the literal text of the number.
+func (n Number) String() string { return string(n) }
+
+// Float64 returns the number as a float64.
+func (n Number) Float64() (float64, error) {
+ return strconv.ParseFloat(string(n), 64)
+}
+
+// Int64 returns the number as an int64.
+func (n Number) Int64() (int64, error) {
+ return strconv.ParseInt(string(n), 10, 64)
+}
+
+// isValidNumber reports whether s is a valid JSON number literal.
+func isValidNumber(s string) bool {
+ // This function implements the JSON numbers grammar.
+ // See https://tools.ietf.org/html/rfc7159#section-6
+ // and http://json.org/number.gif
+
+ if s == "" {
+ return false
+ }
+
+ // Optional -
+ if s[0] == '-' {
+ s = s[1:]
+ if s == "" {
+ return false
+ }
+ }
+
+ // Digits
+ switch {
+ default:
+ return false
+
+ case s[0] == '0':
+ s = s[1:]
+
+ case '1' <= s[0] && s[0] <= '9':
+ s = s[1:]
+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
+ s = s[1:]
+ }
+ }
+
+ // . followed by 1 or more digits.
+ if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' {
+ s = s[2:]
+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
+ s = s[1:]
+ }
+ }
+
+ // e or E followed by an optional - or + and
+ // 1 or more digits.
+ if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') {
+ s = s[1:]
+ if s[0] == '+' || s[0] == '-' {
+ s = s[1:]
+ if s == "" {
+ return false
+ }
+ }
+ for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
+ s = s[1:]
+ }
+ }
+
+ // Make sure we are at the end.
+ return s == ""
+}
+
+type NumberUnmarshalType int
+
+const (
+ // unmarshal a JSON number into an interface{} as a float64
+ UnmarshalFloat NumberUnmarshalType = iota
+ // unmarshal a JSON number into an interface{} as a `json.Number`
+ UnmarshalJSONNumber
+ // unmarshal a JSON number into an interface{} as a int64
+ // if value is an integer otherwise float64
+ UnmarshalIntOrFloat
+)
+
+// decodeState represents the state while decoding a JSON value.
+type decodeState struct {
+ data []byte
+ off int // read offset in data
+ scan scanner
+ nextscan scanner // for calls to nextValue
+ savedError error
+ numberType NumberUnmarshalType
+}
+
+// errPhase is used for errors that should not happen unless
+// there is a bug in the JSON decoder or something is editing
+// the data slice while the decoder executes.
+var errPhase = errors.New("JSON decoder out of sync - data changing underfoot?")
+
+func (d *decodeState) init(data []byte) *decodeState {
+ d.data = data
+ d.off = 0
+ d.savedError = nil
+ return d
+}
+
+// error aborts the decoding by panicking with err.
+func (d *decodeState) error(err error) {
+ panic(err)
+}
+
+// saveError saves the first err it is called with,
+// for reporting at the end of the unmarshal.
+func (d *decodeState) saveError(err error) {
+ if d.savedError == nil {
+ d.savedError = err
+ }
+}
+
+// next cuts off and returns the next full JSON value in d.data[d.off:].
+// The next value is known to be an object or array, not a literal.
+func (d *decodeState) next() []byte {
+ c := d.data[d.off]
+ item, rest, err := nextValue(d.data[d.off:], &d.nextscan)
+ if err != nil {
+ d.error(err)
+ }
+ d.off = len(d.data) - len(rest)
+
+ // Our scanner has seen the opening brace/bracket
+ // and thinks we're still in the middle of the object.
+ // invent a closing brace/bracket to get it out.
+ if c == '{' {
+ d.scan.step(&d.scan, '}')
+ } else {
+ d.scan.step(&d.scan, ']')
+ }
+
+ return item
+}
+
+// scanWhile processes bytes in d.data[d.off:] until it
+// receives a scan code not equal to op.
+// It updates d.off and returns the new scan code.
+func (d *decodeState) scanWhile(op int) int {
+ var newOp int
+ for {
+ if d.off >= len(d.data) {
+ newOp = d.scan.eof()
+ d.off = len(d.data) + 1 // mark processed EOF with len+1
+ } else {
+ c := d.data[d.off]
+ d.off++
+ newOp = d.scan.step(&d.scan, c)
+ }
+ if newOp != op {
+ break
+ }
+ }
+ return newOp
+}
+
+// value decodes a JSON value from d.data[d.off:] into the value.
+// it updates d.off to point past the decoded value.
+func (d *decodeState) value(v reflect.Value) {
+ if !v.IsValid() {
+ _, rest, err := nextValue(d.data[d.off:], &d.nextscan)
+ if err != nil {
+ d.error(err)
+ }
+ d.off = len(d.data) - len(rest)
+
+ // d.scan thinks we're still at the beginning of the item.
+ // Feed in an empty string - the shortest, simplest value -
+ // so that it knows we got to the end of the value.
+ if d.scan.redo {
+ // rewind.
+ d.scan.redo = false
+ d.scan.step = stateBeginValue
+ }
+ d.scan.step(&d.scan, '"')
+ d.scan.step(&d.scan, '"')
+
+ n := len(d.scan.parseState)
+ if n > 0 && d.scan.parseState[n-1] == parseObjectKey {
+ // d.scan thinks we just read an object key; finish the object
+ d.scan.step(&d.scan, ':')
+ d.scan.step(&d.scan, '"')
+ d.scan.step(&d.scan, '"')
+ d.scan.step(&d.scan, '}')
+ }
+
+ return
+ }
+
+ switch op := d.scanWhile(scanSkipSpace); op {
+ default:
+ d.error(errPhase)
+
+ case scanBeginArray:
+ d.array(v)
+
+ case scanBeginObject:
+ d.object(v)
+
+ case scanBeginLiteral:
+ d.literal(v)
+ }
+}
+
+type unquotedValue struct{}
+
+// valueQuoted is like value but decodes a
+// quoted string literal or literal null into an interface value.
+// If it finds anything other than a quoted string literal or null,
+// valueQuoted returns unquotedValue{}.
+func (d *decodeState) valueQuoted() interface{} {
+ switch op := d.scanWhile(scanSkipSpace); op {
+ default:
+ d.error(errPhase)
+
+ case scanBeginArray:
+ d.array(reflect.Value{})
+
+ case scanBeginObject:
+ d.object(reflect.Value{})
+
+ case scanBeginLiteral:
+ switch v := d.literalInterface().(type) {
+ case nil, string:
+ return v
+ }
+ }
+ return unquotedValue{}
+}
+
+// indirect walks down v allocating pointers as needed,
+// until it gets to a non-pointer.
+// if it encounters an Unmarshaler, indirect stops and returns that.
+// if decodingNull is true, indirect stops at the last pointer so it can be set to nil.
+func (d *decodeState) indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnmarshaler, reflect.Value) {
+ // If v is a named type and is addressable,
+ // start with its address, so that if the type has pointer methods,
+ // we find them.
+ if v.Kind() != reflect.Ptr && v.Type().Name() != "" && v.CanAddr() {
+ v = v.Addr()
+ }
+ for {
+ // Load value from interface, but only if the result will be
+ // usefully addressable.
+ if v.Kind() == reflect.Interface && !v.IsNil() {
+ e := v.Elem()
+ if e.Kind() == reflect.Ptr && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Ptr) {
+ v = e
+ continue
+ }
+ }
+
+ if v.Kind() != reflect.Ptr {
+ break
+ }
+
+ if v.Elem().Kind() != reflect.Ptr && decodingNull && v.CanSet() {
+ break
+ }
+ if v.IsNil() {
+ v.Set(reflect.New(v.Type().Elem()))
+ }
+ if v.Type().NumMethod() > 0 {
+ if u, ok := v.Interface().(Unmarshaler); ok {
+ return u, nil, reflect.Value{}
+ }
+ if u, ok := v.Interface().(encoding.TextUnmarshaler); ok {
+ return nil, u, reflect.Value{}
+ }
+ }
+ v = v.Elem()
+ }
+ return nil, nil, v
+}
+
+// array consumes an array from d.data[d.off-1:], decoding into the value v.
+// the first byte of the array ('[') has been read already.
+func (d *decodeState) array(v reflect.Value) {
+ // Check for unmarshaler.
+ u, ut, pv := d.indirect(v, false)
+ if u != nil {
+ d.off--
+ err := u.UnmarshalJSON(d.next())
+ if err != nil {
+ d.error(err)
+ }
+ return
+ }
+ if ut != nil {
+ d.saveError(&UnmarshalTypeError{"array", v.Type(), int64(d.off)})
+ d.off--
+ d.next()
+ return
+ }
+
+ v = pv
+
+ // Check type of target.
+ switch v.Kind() {
+ case reflect.Interface:
+ if v.NumMethod() == 0 {
+ // Decoding into nil interface? Switch to non-reflect code.
+ v.Set(reflect.ValueOf(d.arrayInterface()))
+ return
+ }
+ // Otherwise it's invalid.
+ fallthrough
+ default:
+ d.saveError(&UnmarshalTypeError{"array", v.Type(), int64(d.off)})
+ d.off--
+ d.next()
+ return
+ case reflect.Array:
+ case reflect.Slice:
+ break
+ }
+
+ i := 0
+ for {
+ // Look ahead for ] - can only happen on first iteration.
+ op := d.scanWhile(scanSkipSpace)
+ if op == scanEndArray {
+ break
+ }
+
+ // Back up so d.value can have the byte we just read.
+ d.off--
+ d.scan.undo(op)
+
+ // Get element of array, growing if necessary.
+ if v.Kind() == reflect.Slice {
+ // Grow slice if necessary
+ if i >= v.Cap() {
+ newcap := v.Cap() + v.Cap()/2
+ if newcap < 4 {
+ newcap = 4
+ }
+ newv := reflect.MakeSlice(v.Type(), v.Len(), newcap)
+ reflect.Copy(newv, v)
+ v.Set(newv)
+ }
+ if i >= v.Len() {
+ v.SetLen(i + 1)
+ }
+ }
+
+ if i < v.Len() {
+ // Decode into element.
+ d.value(v.Index(i))
+ } else {
+ // Ran out of fixed array: skip.
+ d.value(reflect.Value{})
+ }
+ i++
+
+ // Next token must be , or ].
+ op = d.scanWhile(scanSkipSpace)
+ if op == scanEndArray {
+ break
+ }
+ if op != scanArrayValue {
+ d.error(errPhase)
+ }
+ }
+
+ if i < v.Len() {
+ if v.Kind() == reflect.Array {
+ // Array. Zero the rest.
+ z := reflect.Zero(v.Type().Elem())
+ for ; i < v.Len(); i++ {
+ v.Index(i).Set(z)
+ }
+ } else {
+ v.SetLen(i)
+ }
+ }
+ if i == 0 && v.Kind() == reflect.Slice {
+ v.Set(reflect.MakeSlice(v.Type(), 0, 0))
+ }
+}
+
+var nullLiteral = []byte("null")
+
+// object consumes an object from d.data[d.off-1:], decoding into the value v.
+// the first byte ('{') of the object has been read already.
+func (d *decodeState) object(v reflect.Value) {
+ // Check for unmarshaler.
+ u, ut, pv := d.indirect(v, false)
+ if u != nil {
+ d.off--
+ err := u.UnmarshalJSON(d.next())
+ if err != nil {
+ d.error(err)
+ }
+ return
+ }
+ if ut != nil {
+ d.saveError(&UnmarshalTypeError{"object", v.Type(), int64(d.off)})
+ d.off--
+ d.next() // skip over { } in input
+ return
+ }
+ v = pv
+
+ // Decoding into nil interface? Switch to non-reflect code.
+ if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
+ v.Set(reflect.ValueOf(d.objectInterface()))
+ return
+ }
+
+ // Check type of target: struct or map[string]T
+ switch v.Kind() {
+ case reflect.Map:
+ // map must have string kind
+ t := v.Type()
+ if t.Key().Kind() != reflect.String {
+ d.saveError(&UnmarshalTypeError{"object", v.Type(), int64(d.off)})
+ d.off--
+ d.next() // skip over { } in input
+ return
+ }
+ if v.IsNil() {
+ v.Set(reflect.MakeMap(t))
+ }
+ case reflect.Struct:
+
+ default:
+ d.saveError(&UnmarshalTypeError{"object", v.Type(), int64(d.off)})
+ d.off--
+ d.next() // skip over { } in input
+ return
+ }
+
+ var mapElem reflect.Value
+ keys := map[string]bool{}
+
+ for {
+ // Read opening " of string key or closing }.
+ op := d.scanWhile(scanSkipSpace)
+ if op == scanEndObject {
+ // closing } - can only happen on first iteration.
+ break
+ }
+ if op != scanBeginLiteral {
+ d.error(errPhase)
+ }
+
+ // Read key.
+ start := d.off - 1
+ op = d.scanWhile(scanContinue)
+ item := d.data[start : d.off-1]
+ key, ok := unquote(item)
+ if !ok {
+ d.error(errPhase)
+ }
+
+ // Check for duplicate keys.
+ _, ok = keys[key]
+ if !ok {
+ keys[key] = true
+ } else {
+ d.error(fmt.Errorf("json: duplicate key '%s' in object", key))
+ }
+
+ // Figure out field corresponding to key.
+ var subv reflect.Value
+ destring := false // whether the value is wrapped in a string to be decoded first
+
+ if v.Kind() == reflect.Map {
+ elemType := v.Type().Elem()
+ if !mapElem.IsValid() {
+ mapElem = reflect.New(elemType).Elem()
+ } else {
+ mapElem.Set(reflect.Zero(elemType))
+ }
+ subv = mapElem
+ } else {
+ var f *field
+ fields := cachedTypeFields(v.Type())
+ for i := range fields {
+ ff := &fields[i]
+ if bytes.Equal(ff.nameBytes, []byte(key)) {
+ f = ff
+ break
+ }
+ }
+ if f != nil {
+ subv = v
+ destring = f.quoted
+ for _, i := range f.index {
+ if subv.Kind() == reflect.Ptr {
+ if subv.IsNil() {
+ subv.Set(reflect.New(subv.Type().Elem()))
+ }
+ subv = subv.Elem()
+ }
+ subv = subv.Field(i)
+ }
+ }
+ }
+
+ // Read : before value.
+ if op == scanSkipSpace {
+ op = d.scanWhile(scanSkipSpace)
+ }
+ if op != scanObjectKey {
+ d.error(errPhase)
+ }
+
+ // Read value.
+ if destring {
+ switch qv := d.valueQuoted().(type) {
+ case nil:
+ d.literalStore(nullLiteral, subv, false)
+ case string:
+ d.literalStore([]byte(qv), subv, true)
+ default:
+ d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal unquoted value into %v", subv.Type()))
+ }
+ } else {
+ d.value(subv)
+ }
+
+ // Write value back to map;
+ // if using struct, subv points into struct already.
+ if v.Kind() == reflect.Map {
+ kv := reflect.ValueOf(key).Convert(v.Type().Key())
+ v.SetMapIndex(kv, subv)
+ }
+
+ // Next token must be , or }.
+ op = d.scanWhile(scanSkipSpace)
+ if op == scanEndObject {
+ break
+ }
+ if op != scanObjectValue {
+ d.error(errPhase)
+ }
+ }
+}
+
+// literal consumes a literal from d.data[d.off-1:], decoding into the value v.
+// The first byte of the literal has been read already
+// (that's how the caller knows it's a literal).
+func (d *decodeState) literal(v reflect.Value) {
+ // All bytes inside literal return scanContinue op code.
+ start := d.off - 1
+ op := d.scanWhile(scanContinue)
+
+ // Scan read one byte too far; back up.
+ d.off--
+ d.scan.undo(op)
+
+ d.literalStore(d.data[start:d.off], v, false)
+}
+
+// convertNumber converts the number literal s to a float64, int64 or a Number
+// depending on d.numberDecodeType.
+func (d *decodeState) convertNumber(s string) (interface{}, error) {
+ switch d.numberType {
+
+ case UnmarshalJSONNumber:
+ return Number(s), nil
+ case UnmarshalIntOrFloat:
+ v, err := strconv.ParseInt(s, 10, 64)
+ if err == nil {
+ return v, nil
+ }
+
+ // tries to parse integer number in scientific notation
+ f, err := strconv.ParseFloat(s, 64)
+ if err != nil {
+ return nil, &UnmarshalTypeError{"number " + s, reflect.TypeOf(0.0), int64(d.off)}
+ }
+
+ // if it has no decimal value use int64
+ if fi, fd := math.Modf(f); fd == 0.0 {
+ return int64(fi), nil
+ }
+ return f, nil
+ default:
+ f, err := strconv.ParseFloat(s, 64)
+ if err != nil {
+ return nil, &UnmarshalTypeError{"number " + s, reflect.TypeOf(0.0), int64(d.off)}
+ }
+ return f, nil
+ }
+
+}
+
+var numberType = reflect.TypeOf(Number(""))
+
+// literalStore decodes a literal stored in item into v.
+//
+// fromQuoted indicates whether this literal came from unwrapping a
+// string from the ",string" struct tag option. this is used only to
+// produce more helpful error messages.
+func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool) {
+ // Check for unmarshaler.
+ if len(item) == 0 {
+ //Empty string given
+ d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
+ return
+ }
+ wantptr := item[0] == 'n' // null
+ u, ut, pv := d.indirect(v, wantptr)
+ if u != nil {
+ err := u.UnmarshalJSON(item)
+ if err != nil {
+ d.error(err)
+ }
+ return
+ }
+ if ut != nil {
+ if item[0] != '"' {
+ if fromQuoted {
+ d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
+ } else {
+ d.saveError(&UnmarshalTypeError{"string", v.Type(), int64(d.off)})
+ }
+ return
+ }
+ s, ok := unquoteBytes(item)
+ if !ok {
+ if fromQuoted {
+ d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
+ } else {
+ d.error(errPhase)
+ }
+ }
+ err := ut.UnmarshalText(s)
+ if err != nil {
+ d.error(err)
+ }
+ return
+ }
+
+ v = pv
+
+ switch c := item[0]; c {
+ case 'n': // null
+ switch v.Kind() {
+ case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice:
+ v.Set(reflect.Zero(v.Type()))
+ // otherwise, ignore null for primitives/string
+ }
+ case 't', 'f': // true, false
+ value := c == 't'
+ switch v.Kind() {
+ default:
+ if fromQuoted {
+ d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
+ } else {
+ d.saveError(&UnmarshalTypeError{"bool", v.Type(), int64(d.off)})
+ }
+ case reflect.Bool:
+ v.SetBool(value)
+ case reflect.Interface:
+ if v.NumMethod() == 0 {
+ v.Set(reflect.ValueOf(value))
+ } else {
+ d.saveError(&UnmarshalTypeError{"bool", v.Type(), int64(d.off)})
+ }
+ }
+
+ case '"': // string
+ s, ok := unquoteBytes(item)
+ if !ok {
+ if fromQuoted {
+ d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
+ } else {
+ d.error(errPhase)
+ }
+ }
+ switch v.Kind() {
+ default:
+ d.saveError(&UnmarshalTypeError{"string", v.Type(), int64(d.off)})
+ case reflect.Slice:
+ if v.Type().Elem().Kind() != reflect.Uint8 {
+ d.saveError(&UnmarshalTypeError{"string", v.Type(), int64(d.off)})
+ break
+ }
+ b := make([]byte, base64.StdEncoding.DecodedLen(len(s)))
+ n, err := base64.StdEncoding.Decode(b, s)
+ if err != nil {
+ d.saveError(err)
+ break
+ }
+ v.SetBytes(b[:n])
+ case reflect.String:
+ v.SetString(string(s))
+ case reflect.Interface:
+ if v.NumMethod() == 0 {
+ v.Set(reflect.ValueOf(string(s)))
+ } else {
+ d.saveError(&UnmarshalTypeError{"string", v.Type(), int64(d.off)})
+ }
+ }
+
+ default: // number
+ if c != '-' && (c < '0' || c > '9') {
+ if fromQuoted {
+ d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
+ } else {
+ d.error(errPhase)
+ }
+ }
+ s := string(item)
+ switch v.Kind() {
+ default:
+ if v.Kind() == reflect.String && v.Type() == numberType {
+ v.SetString(s)
+ if !isValidNumber(s) {
+ d.error(fmt.Errorf("json: invalid number literal, trying to unmarshal %q into Number", item))
+ }
+ break
+ }
+ if fromQuoted {
+ d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
+ } else {
+ d.error(&UnmarshalTypeError{"number", v.Type(), int64(d.off)})
+ }
+ case reflect.Interface:
+ n, err := d.convertNumber(s)
+ if err != nil {
+ d.saveError(err)
+ break
+ }
+ if v.NumMethod() != 0 {
+ d.saveError(&UnmarshalTypeError{"number", v.Type(), int64(d.off)})
+ break
+ }
+ v.Set(reflect.ValueOf(n))
+
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ n, err := strconv.ParseInt(s, 10, 64)
+ if err != nil || v.OverflowInt(n) {
+ d.saveError(&UnmarshalTypeError{"number " + s, v.Type(), int64(d.off)})
+ break
+ }
+ v.SetInt(n)
+
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ n, err := strconv.ParseUint(s, 10, 64)
+ if err != nil || v.OverflowUint(n) {
+ d.saveError(&UnmarshalTypeError{"number " + s, v.Type(), int64(d.off)})
+ break
+ }
+ v.SetUint(n)
+
+ case reflect.Float32, reflect.Float64:
+ n, err := strconv.ParseFloat(s, v.Type().Bits())
+ if err != nil || v.OverflowFloat(n) {
+ d.saveError(&UnmarshalTypeError{"number " + s, v.Type(), int64(d.off)})
+ break
+ }
+ v.SetFloat(n)
+ }
+ }
+}
+
+// The xxxInterface routines build up a value to be stored
+// in an empty interface. They are not strictly necessary,
+// but they avoid the weight of reflection in this common case.
+
+// valueInterface is like value but returns interface{}
+func (d *decodeState) valueInterface() interface{} {
+ switch d.scanWhile(scanSkipSpace) {
+ default:
+ d.error(errPhase)
+ panic("unreachable")
+ case scanBeginArray:
+ return d.arrayInterface()
+ case scanBeginObject:
+ return d.objectInterface()
+ case scanBeginLiteral:
+ return d.literalInterface()
+ }
+}
+
+// arrayInterface is like array but returns []interface{}.
+func (d *decodeState) arrayInterface() []interface{} {
+ var v = make([]interface{}, 0)
+ for {
+ // Look ahead for ] - can only happen on first iteration.
+ op := d.scanWhile(scanSkipSpace)
+ if op == scanEndArray {
+ break
+ }
+
+ // Back up so d.value can have the byte we just read.
+ d.off--
+ d.scan.undo(op)
+
+ v = append(v, d.valueInterface())
+
+ // Next token must be , or ].
+ op = d.scanWhile(scanSkipSpace)
+ if op == scanEndArray {
+ break
+ }
+ if op != scanArrayValue {
+ d.error(errPhase)
+ }
+ }
+ return v
+}
+
+// objectInterface is like object but returns map[string]interface{}.
+func (d *decodeState) objectInterface() map[string]interface{} {
+ m := make(map[string]interface{})
+ keys := map[string]bool{}
+
+ for {
+ // Read opening " of string key or closing }.
+ op := d.scanWhile(scanSkipSpace)
+ if op == scanEndObject {
+ // closing } - can only happen on first iteration.
+ break
+ }
+ if op != scanBeginLiteral {
+ d.error(errPhase)
+ }
+
+ // Read string key.
+ start := d.off - 1
+ op = d.scanWhile(scanContinue)
+ item := d.data[start : d.off-1]
+ key, ok := unquote(item)
+ if !ok {
+ d.error(errPhase)
+ }
+
+ // Check for duplicate keys.
+ _, ok = keys[key]
+ if !ok {
+ keys[key] = true
+ } else {
+ d.error(fmt.Errorf("json: duplicate key '%s' in object", key))
+ }
+
+ // Read : before value.
+ if op == scanSkipSpace {
+ op = d.scanWhile(scanSkipSpace)
+ }
+ if op != scanObjectKey {
+ d.error(errPhase)
+ }
+
+ // Read value.
+ m[key] = d.valueInterface()
+
+ // Next token must be , or }.
+ op = d.scanWhile(scanSkipSpace)
+ if op == scanEndObject {
+ break
+ }
+ if op != scanObjectValue {
+ d.error(errPhase)
+ }
+ }
+ return m
+}
+
+// literalInterface is like literal but returns an interface value.
+func (d *decodeState) literalInterface() interface{} {
+ // All bytes inside literal return scanContinue op code.
+ start := d.off - 1
+ op := d.scanWhile(scanContinue)
+
+ // Scan read one byte too far; back up.
+ d.off--
+ d.scan.undo(op)
+ item := d.data[start:d.off]
+
+ switch c := item[0]; c {
+ case 'n': // null
+ return nil
+
+ case 't', 'f': // true, false
+ return c == 't'
+
+ case '"': // string
+ s, ok := unquote(item)
+ if !ok {
+ d.error(errPhase)
+ }
+ return s
+
+ default: // number
+ if c != '-' && (c < '0' || c > '9') {
+ d.error(errPhase)
+ }
+ n, err := d.convertNumber(string(item))
+ if err != nil {
+ d.saveError(err)
+ }
+ return n
+ }
+}
+
+// getu4 decodes \uXXXX from the beginning of s, returning the hex value,
+// or it returns -1.
+func getu4(s []byte) rune {
+ if len(s) < 6 || s[0] != '\\' || s[1] != 'u' {
+ return -1
+ }
+ r, err := strconv.ParseUint(string(s[2:6]), 16, 64)
+ if err != nil {
+ return -1
+ }
+ return rune(r)
+}
+
+// unquote converts a quoted JSON string literal s into an actual string t.
+// The rules are different than for Go, so cannot use strconv.Unquote.
+func unquote(s []byte) (t string, ok bool) {
+ s, ok = unquoteBytes(s)
+ t = string(s)
+ return
+}
+
+func unquoteBytes(s []byte) (t []byte, ok bool) {
+ if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' {
+ return
+ }
+ s = s[1 : len(s)-1]
+
+ // Check for unusual characters. If there are none,
+ // then no unquoting is needed, so return a slice of the
+ // original bytes.
+ r := 0
+ for r < len(s) {
+ c := s[r]
+ if c == '\\' || c == '"' || c < ' ' {
+ break
+ }
+ if c < utf8.RuneSelf {
+ r++
+ continue
+ }
+ rr, size := utf8.DecodeRune(s[r:])
+ if rr == utf8.RuneError && size == 1 {
+ break
+ }
+ r += size
+ }
+ if r == len(s) {
+ return s, true
+ }
+
+ b := make([]byte, len(s)+2*utf8.UTFMax)
+ w := copy(b, s[0:r])
+ for r < len(s) {
+ // Out of room? Can only happen if s is full of
+ // malformed UTF-8 and we're replacing each
+ // byte with RuneError.
+ if w >= len(b)-2*utf8.UTFMax {
+ nb := make([]byte, (len(b)+utf8.UTFMax)*2)
+ copy(nb, b[0:w])
+ b = nb
+ }
+ switch c := s[r]; {
+ case c == '\\':
+ r++
+ if r >= len(s) {
+ return
+ }
+ switch s[r] {
+ default:
+ return
+ case '"', '\\', '/', '\'':
+ b[w] = s[r]
+ r++
+ w++
+ case 'b':
+ b[w] = '\b'
+ r++
+ w++
+ case 'f':
+ b[w] = '\f'
+ r++
+ w++
+ case 'n':
+ b[w] = '\n'
+ r++
+ w++
+ case 'r':
+ b[w] = '\r'
+ r++
+ w++
+ case 't':
+ b[w] = '\t'
+ r++
+ w++
+ case 'u':
+ r--
+ rr := getu4(s[r:])
+ if rr < 0 {
+ return
+ }
+ r += 6
+ if utf16.IsSurrogate(rr) {
+ rr1 := getu4(s[r:])
+ if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar {
+ // A valid pair; consume.
+ r += 6
+ w += utf8.EncodeRune(b[w:], dec)
+ break
+ }
+ // Invalid surrogate; fall back to replacement rune.
+ rr = unicode.ReplacementChar
+ }
+ w += utf8.EncodeRune(b[w:], rr)
+ }
+
+ // Quote, control characters are invalid.
+ case c == '"', c < ' ':
+ return
+
+ // ASCII
+ case c < utf8.RuneSelf:
+ b[w] = c
+ r++
+ w++
+
+ // Coerce to well-formed UTF-8.
+ default:
+ rr, size := utf8.DecodeRune(s[r:])
+ r += size
+ w += utf8.EncodeRune(b[w:], rr)
+ }
+ }
+ return b[0:w], true
+}
diff --git a/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/encode.go b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/encode.go
new file mode 100644
index 0000000..98de68c
--- /dev/null
+++ b/.gear/predownloaded-development/vendor/github.com/go-jose/go-jose/v3/json/encode.go
@@ -0,0 +1,1197 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package json implements encoding and decoding of JSON objects as defined in
+// RFC 4627. The mapping between JSON objects and Go values is described
+// in the documentation for the Marshal and Unmarshal functions.
+//
+// See "JSON and Go" for an introduction to this package:
+// https://golang.org/doc/articles/json_and_go.html
+package json
+
+import (
+ "bytes"
+ "encoding"
+ "encoding/base64"
+ "fmt"
+ "math"
+ "reflect"
+ "runtime"
+ "sort"
+ "strconv"
+ "strings"
+ "sync"
+ "unicode"
+ "unicode/utf8"
+)
+
+// Marshal returns the JSON encoding of v.
+//
+// Marshal traverses the value v recursively.
+// If an encountered value implements the Marshaler interface
+// and is not a nil pointer, Marshal calls its MarshalJSON method
+// to produce JSON. If no MarshalJSON method is present but the
+// value implements encoding.TextMarshaler instead, Marshal calls
+// its MarshalText method.
+// The nil pointer exception is not strictly necessary
+// but mimics a similar, necessary exception in the behavior of
+// UnmarshalJSON.
+//
+// Otherwise, Marshal uses the following type-dependent default encodings:
+//
+// Boolean values encode as JSON booleans.
+//
+// Floating point, integer, and Number values encode as JSON numbers.
+//
+// String values encode as JSON strings coerced to valid UTF-8,
+// replacing invalid bytes with the Unicode replacement rune.
+// The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e"
+// to keep some browsers from misinterpreting JSON output as HTML.
+// Ampersand "&" is also escaped to "\u0026" for the same reason.
+//
+// Array and slice values encode as JSON arrays, except that
+// []byte encodes as a base64-encoded string, and a nil slice
+// encodes as the null JSON object.
+//
+// Struct values encode as JSON objects. Each exported struct field
+// becomes a member of the object unless
+// - the field's tag is "-", or
+// - the field is empty and its tag specifies the "omitempty" option.
+//
+// The empty values are false, 0, any
+// nil pointer or interface value, and any array, slice, map, or string of
+// length zero. The object's default key string is the struct field name
+// but can be specified in the struct field's tag value. The "json" key in
+// the struct field's tag value is the key name, followed by an optional comma
+// and options. Examples:
+//
+// // Field is ignored by this package.
+// Field int `json:"-"`
+//
+// // Field appears in JSON as key "myName".
+// Field int `json:"myName"`
+//
+// // Field appears in JSON as key "myName" and
+// // the field is omitted from the object if its value is empty,
+// // as defined above.
+// Field int `json:"myName,omitempty"`
+//
+// // Field appears in JSON as key "Field" (the default), but
+// // the field is skipped if empty.
+// // Note the leading comma.
+// Field int `json:",omitempty"`
+//
+// The "string" option signals that a field is stored as JSON inside a
+// JSON-encoded string. It applies only to fields of string, floating point,
+// integer, or boolean types. This extra level of encoding is sometimes used
+// when communicating with JavaScript programs:
+//
+// Int64String int64 `json:",string"`
+//
+// The key name will be used if it's a non-empty string consisting of
+// only Unicode letters, digits, dollar signs, percent signs, hyphens,
+// underscores and slashes.
+//
+// Anonymous struct fields are usually marshaled as if their inner exported fields
+// were fields in the outer struct, subject to the usual Go visibility rules amended
+// as described in the next paragraph.
+// An anonymous struct field with a name given in its JSON tag is treated as
+// having that name, rather than being anonymous.
+// An anonymous struct field of interface type is treated the same as having
+// that type as its name, rather than being anonymous.
+//
+// The Go visibility rules for struct fields are amended for JSON when
+// deciding which field to marshal or unmarshal. If there are
+// multiple fields at the same level, and that level is the least
+// nested (and would therefore be the nesting level selected by the
+// usual Go rules), the following extra rules apply:
+//
+// 1) Of those fields, if any are JSON-tagged, only tagged fields are considered,
+// even if there are multiple untagged fields that would otherwise conflict.
+// 2) If there is exactly one field (tagged or not according to the first rule), that is selected.
+// 3) Otherwise there are multiple fields, and all are ignored; no error occurs.
+//
+// Handling of anonymous struct fields is new in Go 1.1.
+// Prior to Go 1.1, anonymous struct fields were ignored. To force ignoring of
+// an anonymous struct field in both current and earlier versions, give the field
+// a JSON tag of "-".
+//
+// Map values encode as JSON objects.
+// The map's key type must be string; the map keys are used as JSON object
+// keys, subject to the UTF-8 coercion described for string values above.
+//
+// Pointer values encode as the value pointed to.
+// A nil pointer encodes as the null JSON object.
+//
+// Interface values encode as the value contained in the interface.
+// A nil interface value encodes as the null JSON object.
+//
+// Channel, complex, and function values cannot be encoded in JSON.
+// Attempting to encode such a value causes Marshal to return
+// an UnsupportedTypeError.
+//
+// JSON cannot represent cyclic data structures and Marshal does not
+// handle them. Passing cyclic structures to Marshal will result in
+// an infinite recursion.
+func Marshal(v interface{}) ([]byte, error) {
+ e := &encodeState{}
+ err := e.marshal(v)
+ if err != nil {
+ return nil, err
+ }
+ return e.Bytes(), nil
+}
+
+// MarshalIndent is like Marshal but applies Indent to format the output.
+func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
+ b, err := Marshal(v)
+ if err != nil {
+ return nil, err
+ }
+ var buf bytes.Buffer
+ err = Indent(&buf, b, prefix, indent)
+ if err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+}
+
+// HTMLEscape appends to dst the JSON-encoded src with <, >, &, U+2028 and U+2029
+// characters inside string literals changed to \u003c, \u003e, \u0026, \u2028, \u2029
+// so that the JSON will be safe to embed inside HTML